Renames & seg 3 & 5 texture fixes (#19)

* Remove tools/torch

* Auto compile torch and extract

* Re-implement soh's implementation of lus implementation of an array

* Fix static actors in mr

* Update

* Updated torch

* Updated lus

* uncomment

* Fix collision

* Renames

* More renaming

* Collision Renames

* Update collision.c

* Collision Documentation (#640)

* Collision related renames

* Update

* update lus

* Bug fixes

* remove tabs

* fixes

* fixes

* Fix kart textures

* Networking

* net

* Add networking

* Update

* Cleanup

* Fix balloon rendering

* Fix lakitu and red shell

* fixes

* Implement new random system

---------

Co-authored-by: MegaMech <7255464+MegaMech@users.noreply.github.com>
This commit is contained in:
MegaMech 2024-07-26 11:29:35 -06:00 committed by GitHub
parent dd5844ab81
commit 532ad5a4c0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
86 changed files with 5221 additions and 24442 deletions

1
.gitignore vendored
View File

@ -35,6 +35,7 @@
*.su
*.idb
*.pdb
*.log
# Text editor remnants
*.swp

View File

@ -59,7 +59,7 @@ endif()
# Set game compilation version
set(VERSION us)
set(USE_NETWORKING OFF)
set(USE_NETWORKING ON)
set(SKIP_XCODE_VERSION_CHECK ON)
set(GFX_DEBUG_DISASSEMBLER ON)
@ -93,6 +93,7 @@ include_directories(
${CMAKE_CURRENT_SOURCE_DIR}/src/buffers
${CMAKE_CURRENT_SOURCE_DIR}/src/audio
${CMAKE_CURRENT_SOURCE_DIR}/src/debug
${CMAKE_CURRENT_SOURCE_DIR}/src/networking
)
# Collect source files to build the executable
@ -130,6 +131,8 @@ file(GLOB_RECURSE ALL_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
"assets/code/*.c"
"courses/*.c"
"courses/*.h"
"src/networking/*.c"
"src/networking/*.h"
)
list(APPEND ALL_FILES ${ALL_FILES_ROOT})
@ -321,14 +324,15 @@ else()
)
endif()
if(USE_NETWORKING)
if(MSVC)
vcpkg_install_packages(sdl2-net)
endif()
find_package(SDL2_net REQUIRED)
include_directories(${SDL2_NET_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} PRIVATE SDL2_net::SDL2_net)
target_compile_definitions(${PROJECT_NAME} PRIVATE USE_NETWORKING)
if(MSVC)
vcpkg_install_packages(sdl2-net)
endif()
find_package(SDL2_net REQUIRED)
include_directories(${SDL2_NET_INCLUDE_DIRS})
#target_link_libraries(${PROJECT_NAME} PRIVATE SDL2_net::SDL2_net)
#target_compile_definitions(${PROJECT_NAME} PRIVATE USE_NETWORKING)
endif()
target_link_libraries(${PROJECT_NAME} PRIVATE "${ADDITIONAL_LIBRARY_DEPENDENCIES}")
@ -336,13 +340,13 @@ target_link_libraries(${PROJECT_NAME} PRIVATE "${ADDITIONAL_LIBRARY_DEPENDENCIES
if(CMAKE_SYSTEM_NAME MATCHES "NintendoSwitch")
nx_generate_nacp(Lylat.nacp
NAME "${PROJECT_NAME}"
AUTHOR "${PROJECT_TEAM}"
VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}"
NAME "${PROJECT_NAME}"
AUTHOR "${PROJECT_TEAM}"
VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}"
)
nx_create_nro(${PROJECT_NAME}
NACP Lylat.nacp
NACP Lylat.nacp
)
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.nro DESTINATION . COMPONENT ${PROJECT_NAME})
@ -351,6 +355,9 @@ endif()
################################################################################
# Compile and link options
################################################################################
option(GBI_UCODE "Use F3DEX_GBI" F3DEX_GBI)
if(MSVC)
if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64")
target_compile_options(${PROJECT_NAME} PRIVATE
@ -542,9 +549,9 @@ endif()
include(ExternalProject)
ExternalProject_Add(torch
PREFIX torch
SOURCE_DIR ${CMAKE_SOURCE_DIR}/torch
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/torch
PREFIX torch
SOURCE_DIR ${CMAKE_SOURCE_DIR}/torch
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/torch
)
ExternalProject_Get_Property(torch install_dir)
@ -560,4 +567,4 @@ add_custom_target(
COMMAND ${TORCH_EXECUTABLE} pack assets ship.otr
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/spaghetti.otr" "${CMAKE_BINARY_DIR}/spaghetti.otr"
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/ship.otr" "${CMAKE_BINARY_DIR}/ship.otr"
)
)

View File

@ -38,8 +38,8 @@ glabel func_8000929C
/* 009F04 80009304 E7AC004C */ swc1 $f12, 0x4c($sp)
/* 009F08 80009308 0C003349 */ jal func_8000CD24
/* 009F0C 8000930C AFB80018 */ sw $t8, 0x18($sp)
/* 009F10 80009310 3C058016 */ lui $a1, %hi(D_80162FCE) # $a1, 0x8016
/* 009F14 80009314 24A52FCE */ addiu $a1, %lo(D_80162FCE) # addiu $a1, $a1, 0x2fce
/* 009F10 80009310 3C058016 */ lui $a1, %hi(sSomeNearestWaypoint) # $a1, 0x8016
/* 009F14 80009314 24A52FCE */ addiu $a1, %lo(sSomeNearestWaypoint) # addiu $a1, $a1, 0x2fce
/* 009F18 80009318 A4A20000 */ sh $v0, ($a1)
/* 009F1C 8000931C 84A70000 */ lh $a3, ($a1)
/* 009F20 80009320 8FA80030 */ lw $t0, 0x30($sp)
@ -57,8 +57,8 @@ glabel func_8000929C
/* 009F50 80009350 AFA40050 */ sw $a0, 0x50($sp)
/* 009F54 80009354 0C0023CE */ jal func_80008F38
/* 009F58 80009358 E7AC004C */ swc1 $f12, 0x4c($sp)
/* 009F5C 8000935C 3C078016 */ lui $a3, %hi(D_80162FCE) # $a3, 0x8016
/* 009F60 80009360 84E72FCE */ lh $a3, %lo(D_80162FCE)($a3)
/* 009F5C 8000935C 3C078016 */ lui $a3, %hi(sSomeNearestWaypoint) # $a3, 0x8016
/* 009F60 80009360 84E72FCE */ lh $a3, %lo(sSomeNearestWaypoint)($a3)
/* 009F64 80009364 8FA40050 */ lw $a0, 0x50($sp)
/* 009F68 80009368 C7AC004C */ lwc1 $f12, 0x4c($sp)
.L8000936C:
@ -321,7 +321,7 @@ glabel func_8000929C
/* 00A328 80009728 8FAA0054 */ lw $t2, 0x54($sp)
.L8000972C:
/* 00A32C 8000972C 3C068016 */ lui $a2, %hi(D_80163448) # 0x8016
/* 00A330 80009730 3C038016 */ lui $v1, %hi(D_80162FCE) # 0x8016
/* 00A330 80009730 3C038016 */ lui $v1, %hi(sSomeNearestWaypoint) # 0x8016
/* 00A334 80009734 95420000 */ lhu $v0, ($t2)
/* 00A338 80009738 304B4000 */ andi $t3, $v0, 0x4000
/* 00A33C 8000973C 11600020 */ beqz $t3, .L800097C0
@ -335,7 +335,7 @@ glabel func_8000929C
/* 00A35C 8000975C 8FA40050 */ lw $a0, 0x50($sp)
/* 00A360 80009760 3C068016 */ lui $a2, %hi(D_80163448) # $a2, 0x8016
/* 00A364 80009764 15A00013 */ bnez $t5, .L800097B4
/* 00A368 80009768 3C038016 */ lui $v1, %hi(D_80162FCE) # $v1, 0x8016
/* 00A368 80009768 3C038016 */ lui $v1, %hi(sSomeNearestWaypoint) # $v1, 0x8016
/* 00A36C 8000976C 3C0E8019 */ lui $t6, %hi(gPlayerCount) # $t6, 0x8019
/* 00A370 80009770 81CEEDF3 */ lb $t6, %lo(gPlayerCount)($t6)
/* 00A374 80009774 24010002 */ li $at, 2
@ -358,10 +358,10 @@ glabel func_8000929C
.L800097B4:
/* 00A3B4 800097B4 8CC63448 */ lw $a2, %lo(D_80163448)($a2)
/* 00A3B8 800097B8 10000003 */ b .L800097C8
/* 00A3BC 800097BC 84632FCE */ lh $v1, %lo(D_80162FCE)($v1)
/* 00A3BC 800097BC 84632FCE */ lh $v1, %lo(sSomeNearestWaypoint)($v1)
.L800097C0:
/* 00A3C0 800097C0 8CC63448 */ lw $a2, %lo(D_80163448)($a2) # 0x3448($a2)
/* 00A3C4 800097C4 84632FCE */ lh $v1, %lo(D_80162FCE)($v1)
/* 00A3C4 800097C4 84632FCE */ lh $v1, %lo(sSomeNearestWaypoint)($v1)
.L800097C8:
/* 00A3C8 800097C8 0C002E57 */ jal func_8000B95C
/* 00A3CC 800097CC 3065FFFF */ andi $a1, $v1, 0xffff

View File

@ -514,8 +514,8 @@ glabel func_80009B60
/* 00AE78 8000A278 1000002C */ b .L8000A32C
/* 00AE7C 8000A27C E4700004 */ swc1 $f16, 4($v1)
.L8000A280:
/* 00AE80 8000A280 3C0F8016 */ lui $t7, %hi(D_80162FCE) # $t7, 0x8016
/* 00AE84 8000A284 85EF2FCE */ lh $t7, %lo(D_80162FCE)($t7)
/* 00AE80 8000A280 3C0F8016 */ lui $t7, %hi(sSomeNearestWaypoint) # $t7, 0x8016
/* 00AE84 8000A284 85EF2FCE */ lh $t7, %lo(sSomeNearestWaypoint)($t7)
/* 00AE88 8000A288 3C0B8016 */ lui $t3, %hi(D_801645E0) # $t3, 0x8016
/* 00AE8C 8000A28C 8D6B45E0 */ lw $t3, %lo(D_801645E0)($t3)
/* 00AE90 8000A290 000F7040 */ sll $t6, $t7, 1
@ -560,7 +560,7 @@ glabel func_80009B60
/* 00AF28 8000A328 E5040000 */ swc1 $f4, ($t0)
.L8000A32C:
/* 00AF2C 8000A32C 8FA400D0 */ lw $a0, 0xd0($sp)
/* 00AF30 8000A330 0C004C77 */ jal func_800131DC
/* 00AF30 8000A330 0C004C77 */ jal check_ai_crossing_distance
/* 00AF34 8000A334 AFA8003C */ sw $t0, 0x3c($sp)
/* 00AF38 8000A338 0C0034EE */ jal func_8000D3B8
/* 00AF3C 8000A33C 8FA400D0 */ lw $a0, 0xd0($sp)
@ -726,8 +726,8 @@ glabel func_80009B60
/* 00B18C 8000A58C 0002C823 */ negu $t9, $v0
/* 00B190 8000A590 01981821 */ addu $v1, $t4, $t8
/* 00B194 8000A594 A4790000 */ sh $t9, ($v1)
/* 00B198 8000A598 3C0F8016 */ lui $t7, %hi(D_80162FCE) # $t7, 0x8016
/* 00B19C 8000A59C 85EF2FCE */ lh $t7, %lo(D_80162FCE)($t7)
/* 00B198 8000A598 3C0F8016 */ lui $t7, %hi(sSomeNearestWaypoint) # $t7, 0x8016
/* 00B19C 8000A59C 85EF2FCE */ lh $t7, %lo(sSomeNearestWaypoint)($t7)
/* 00B1A0 8000A5A0 3C0D8016 */ lui $t5, %hi(D_80164430) # $t5, 0x8016
/* 00B1A4 8000A5A4 95AD4430 */ lhu $t5, %lo(D_80164430)($t5)
/* 00B1A8 8000A5A8 25EA0002 */ addiu $t2, $t7, 2
@ -893,18 +893,18 @@ glabel func_80009B60
/* 00B3E8 8000A7E8 10000252 */ b .L8000B134
/* 00B3EC 8000A7EC 8FBF0014 */ lw $ra, 0x14($sp)
.L8000A7F0:
/* 00B3F0 8000A7F0 3C058016 */ lui $a1, %hi(D_80162FCE) # $a1, 0x8016
/* 00B3F0 8000A7F0 3C058016 */ lui $a1, %hi(sSomeNearestWaypoint) # $a1, 0x8016
/* 00B3F4 8000A7F4 254D0014 */ addiu $t5, $t2, 0x14
/* 00B3F8 8000A7F8 AFAD001C */ sw $t5, 0x1c($sp)
/* 00B3FC 8000A7FC 0C002DF9 */ jal func_8000B7E4
/* 00B400 8000A800 94A52FCE */ lhu $a1, %lo(D_80162FCE)($a1)
/* 00B400 8000A800 94A52FCE */ lhu $a1, %lo(sSomeNearestWaypoint)($a1)
/* 00B404 8000A804 8FAF0038 */ lw $t7, 0x38($sp)
/* 00B408 8000A808 3C0B8016 */ lui $t3, %hi(D_801630B8) # $t3, 0x8016
/* 00B40C 8000A80C 256B30B8 */ addiu $t3, %lo(D_801630B8) # addiu $t3, $t3, 0x30b8
/* 00B410 8000A810 01EB1821 */ addu $v1, $t7, $t3
/* 00B414 8000A814 AC620000 */ sw $v0, ($v1)
/* 00B418 8000A818 3C058016 */ lui $a1, %hi(D_80162FCE) # $a1, 0x8016
/* 00B41C 8000A81C 94A52FCE */ lhu $a1, %lo(D_80162FCE)($a1)
/* 00B418 8000A818 3C058016 */ lui $a1, %hi(sSomeNearestWaypoint) # $a1, 0x8016
/* 00B41C 8000A81C 94A52FCE */ lhu $a1, %lo(sSomeNearestWaypoint)($a1)
/* 00B420 8000A820 AFA30028 */ sw $v1, 0x28($sp)
/* 00B424 8000A824 0C00350E */ jal func_8000D438
/* 00B428 8000A828 8FA400D0 */ lw $a0, 0xd0($sp)
@ -1520,7 +1520,7 @@ glabel func_80009B60
/* 00BD08 8000B108 3C018016 */ lui $at, %hi(D_80163210)
/* 00BD0C 8000B10C 002F0821 */ addu $at, $at, $t7
/* 00BD10 8000B110 8FA400D0 */ lw $a0, 0xd0($sp)
/* 00BD14 8000B114 0C004C77 */ jal func_800131DC
/* 00BD14 8000B114 0C004C77 */ jal check_ai_crossing_distance
/* 00BD18 8000B118 E4303210 */ swc1 $f16, %lo(D_80163210)($at)
/* 00BD1C 8000B11C 3C058016 */ lui $a1, %hi(D_8016320C) # $a1, 0x8016
/* 00BD20 8000B120 8CA5320C */ lw $a1, %lo(D_8016320C)($a1)

View File

@ -330,7 +330,7 @@ glabel L8001AFD8
/* 01BC94 8001B094 46283280 */ add.d $f10, $f6, $f8
/* 01BC98 8001B098 8D86001C */ lw $a2, 0x1c($t4)
/* 01BC9C 8001B09C AFA70028 */ sw $a3, 0x28($sp)
/* 01BCA0 8001B0A0 0C0AB870 */ jal func_802AE1C0
/* 01BCA0 8001B0A0 0C0AB870 */ jal spawn_actor_on_surface
/* 01BCA4 8001B0A4 462053A0 */ cvt.s.d $f14, $f10
/* 01BCA8 8001B0A8 8FA70028 */ lw $a3, 0x28($sp)
/* 01BCAC 8001B0AC 3C013F80 */ li $at, 0x3F800000 # 1.000000
@ -582,7 +582,7 @@ glabel L8001B3B4
/* 01C054 8001B454 E4E00028 */ swc1 $f0, 0x28($a3)
/* 01C058 8001B458 E4E0002C */ swc1 $f0, 0x2c($a3)
/* 01C05C 8001B45C AFA70028 */ sw $a3, 0x28($sp)
/* 01C060 8001B460 0C0AB870 */ jal func_802AE1C0
/* 01C060 8001B460 0C0AB870 */ jal spawn_actor_on_surface
/* 01C064 8001B464 462033A0 */ cvt.s.d $f14, $f6
/* 01C068 8001B468 8FA70028 */ lw $a3, 0x28($sp)
/* 01C06C 8001B46C 3C013F80 */ li $at, 0x3F800000 # 1.000000
@ -1122,7 +1122,7 @@ glabel L8001BB30
/* 01C7F4 8001BBF4 46249180 */ add.d $f6, $f18, $f4
/* 01C7F8 8001BBF8 8CE60020 */ lw $a2, 0x20($a3)
/* 01C7FC 8001BBFC AFA70028 */ sw $a3, 0x28($sp)
/* 01C800 8001BC00 0C0AB870 */ jal func_802AE1C0
/* 01C800 8001BC00 0C0AB870 */ jal spawn_actor_on_surface
/* 01C804 8001BC04 462033A0 */ cvt.s.d $f14, $f6
/* 01C808 8001BC08 8FA70028 */ lw $a3, 0x28($sp)
/* 01C80C 8001BC0C C4E8000C */ lwc1 $f8, 0xc($a3)

View File

@ -10,7 +10,6 @@
#include "courses/toads_turnpike/course_data.h"
#include "courses/kalimari_desert/course_data.h"
#include "courses/koopa_troopa_beach/course_data.h"
#include "courses/luigi_raceway/course_data.h"
#include "courses/moo_moo_farm/course_data.h"
#include "courses/banshee_boardwalk/course_data.h"
#include "courses/dks_jungle_parkway/course_data.h"

File diff suppressed because it is too large Load Diff

View File

@ -1,174 +0,0 @@
#ifndef LUIGI_RACEWAY_COURSE_DATA_H
#define LUIGI_RACEWAY_COURSE_DATA_H
#include <libultraship.h>
#include <libultra/gbi.h>
#include <actor_types.h>
#include <waypoints.h>
#include <course.h>
extern Gfx d_course_luigi_raceway_dl_0[];
extern Gfx d_course_luigi_raceway_dl_1A8[];
extern Gfx d_course_luigi_raceway_dl_328[];
extern Gfx d_course_luigi_raceway_dl_480[];
extern Gfx d_course_luigi_raceway_dl_6E0[];
extern Gfx d_course_luigi_raceway_dl_868[];
extern Gfx d_course_luigi_raceway_dl_9F8[];
extern Gfx d_course_luigi_raceway_dl_B48[];
extern Gfx d_course_luigi_raceway_dl_D80[];
extern Gfx d_course_luigi_raceway_dl_EE8[];
extern Gfx d_course_luigi_raceway_dl_1058[];
extern Gfx d_course_luigi_raceway_dl_1198[];
extern Gfx d_course_luigi_raceway_dl_1398[];
extern Gfx d_course_luigi_raceway_dl_1538[];
extern Gfx d_course_luigi_raceway_dl_16D8[];
extern Gfx d_course_luigi_raceway_dl_1888[];
extern Gfx d_course_luigi_raceway_dl_1B00[];
extern Gfx d_course_luigi_raceway_dl_1C78[];
extern Gfx d_course_luigi_raceway_dl_1E30[];
extern Gfx d_course_luigi_raceway_dl_1FD0[];
extern Gfx d_course_luigi_raceway_dl_2240[];
extern Gfx d_course_luigi_raceway_dl_2348[];
extern Gfx d_course_luigi_raceway_dl_2518[];
extern Gfx d_course_luigi_raceway_dl_2658[];
extern Gfx d_course_luigi_raceway_dl_2860[];
extern Gfx d_course_luigi_raceway_dl_2978[];
extern Gfx d_course_luigi_raceway_dl_2BC0[];
extern Gfx d_course_luigi_raceway_dl_2D00[];
extern Gfx d_course_luigi_raceway_dl_2F08[];
extern Gfx d_course_luigi_raceway_dl_2FF8[];
extern Gfx d_course_luigi_raceway_dl_32C0[];
extern Gfx d_course_luigi_raceway_dl_3408[];
extern Gfx d_course_luigi_raceway_dl_3610[];
extern Gfx d_course_luigi_raceway_dl_36A8[];
extern Gfx d_course_luigi_raceway_dl_3928[];
extern Gfx d_course_luigi_raceway_dl_3AB0[];
extern Gfx d_course_luigi_raceway_dl_3C18[];
extern Gfx d_course_luigi_raceway_dl_3CA0[];
extern Gfx d_course_luigi_raceway_dl_3EB0[];
extern Gfx d_course_luigi_raceway_dl_4058[];
extern Gfx d_course_luigi_raceway_dl_4198[];
extern Gfx d_course_luigi_raceway_dl_4240[];
extern Gfx d_course_luigi_raceway_dl_4440[];
extern Gfx d_course_luigi_raceway_dl_4638[];
extern Gfx d_course_luigi_raceway_dl_4720[];
extern Gfx d_course_luigi_raceway_dl_4828[];
extern Gfx d_course_luigi_raceway_dl_4A18[];
extern Gfx d_course_luigi_raceway_dl_4C60[];
extern Gfx d_course_luigi_raceway_dl_4CF8[];
extern Gfx d_course_luigi_raceway_dl_4E38[];
extern Gfx d_course_luigi_raceway_dl_4FD8[];
extern Gfx d_course_luigi_raceway_dl_5220[];
extern Gfx d_course_luigi_raceway_dl_52D0[];
extern Gfx d_course_luigi_raceway_dl_5420[];
extern Gfx d_course_luigi_raceway_dl_5558[];
extern Gfx d_course_luigi_raceway_dl_5728[];
extern Gfx d_course_luigi_raceway_dl_57F8[];
extern Gfx d_course_luigi_raceway_dl_5940[];
extern Gfx d_course_luigi_raceway_dl_5A60[];
extern Gfx d_course_luigi_raceway_dl_5BA0[];
extern Gfx d_course_luigi_raceway_dl_5CB8[];
extern Gfx d_course_luigi_raceway_dl_5E10[];
extern Gfx d_course_luigi_raceway_dl_5F08[];
extern Gfx d_course_luigi_raceway_dl_6018[];
extern Gfx d_course_luigi_raceway_dl_6150[];
extern Gfx d_course_luigi_raceway_dl_6288[];
extern Gfx d_course_luigi_raceway_dl_6350[];
extern Gfx d_course_luigi_raceway_dl_6400[];
extern Gfx d_course_luigi_raceway_dl_6558[];
extern Gfx d_course_luigi_raceway_dl_65B0[];
extern Gfx d_course_luigi_raceway_dl_6608[];
extern Gfx d_course_luigi_raceway_dl_6658[];
extern Gfx d_course_luigi_raceway_dl_66B8[];
extern Gfx d_course_luigi_raceway_dl_6708[];
extern Gfx d_course_luigi_raceway_dl_67A0[];
extern Gfx d_course_luigi_raceway_dl_6810[];
extern Gfx d_course_luigi_raceway_dl_68C0[];
extern Gfx d_course_luigi_raceway_dl_6930[];
extern Gfx d_course_luigi_raceway_dl_6A00[];
extern Gfx d_course_luigi_raceway_dl_6A90[];
extern Gfx d_course_luigi_raceway_dl_6B58[];
extern Gfx d_course_luigi_raceway_dl_6C40[];
extern Gfx d_course_luigi_raceway_dl_6DA0[];
extern Gfx d_course_luigi_raceway_dl_6EB0[];
extern Gfx d_course_luigi_raceway_dl_6FF0[];
extern Gfx d_course_luigi_raceway_dl_7110[];
extern Gfx d_course_luigi_raceway_dl_7248[];
extern Gfx d_course_luigi_raceway_dl_7388[];
extern Gfx d_course_luigi_raceway_dl_74B0[];
extern Gfx d_course_luigi_raceway_dl_75F0[];
extern Gfx d_course_luigi_raceway_dl_7750[];
extern Gfx d_course_luigi_raceway_dl_7928[];
extern Gfx d_course_luigi_raceway_dl_7A18[];
extern Gfx d_course_luigi_raceway_dl_7BB0[];
extern Gfx d_course_luigi_raceway_dl_7CD0[];
extern Gfx d_course_luigi_raceway_dl_7EE8[];
extern Gfx d_course_luigi_raceway_dl_7FA0[];
extern Gfx d_course_luigi_raceway_dl_8158[];
extern Gfx d_course_luigi_raceway_dl_8260[];
extern Gfx d_course_luigi_raceway_dl_8450[];
extern Gfx d_course_luigi_raceway_dl_8508[];
extern Gfx d_course_luigi_raceway_dl_86F8[];
extern Gfx d_course_luigi_raceway_dl_8790[];
extern Gfx d_course_luigi_raceway_dl_8958[];
extern Gfx d_course_luigi_raceway_dl_8A70[];
extern Gfx d_course_luigi_raceway_dl_8CC8[];
extern Gfx d_course_luigi_raceway_dl_8D68[];
extern Gfx d_course_luigi_raceway_dl_8F00[];
extern Gfx d_course_luigi_raceway_dl_9058[];
extern Gfx d_course_luigi_raceway_dl_9310[];
extern Gfx d_course_luigi_raceway_dl_9408[];
extern Gfx d_course_luigi_raceway_dl_95A0[];
extern Gfx d_course_luigi_raceway_dl_97B0[];
extern Gfx d_course_luigi_raceway_dl_99C0[];
extern Gfx d_course_luigi_raceway_dl_9AD0[];
extern Gfx d_course_luigi_raceway_dl_9C50[];
extern Gfx d_course_luigi_raceway_dl_9E58[];
extern Gfx d_course_luigi_raceway_dl_A028[];
extern Gfx d_course_luigi_raceway_dl_A178[];
extern Gfx d_course_luigi_raceway_dl_A320[];
extern TrackWaypoint d_course_luigi_raceway_unknown_waypoints[];
extern TrackWaypoint d_course_luigi_raceway_track_waypoints[];
extern Vtx d_course_luigi_raceway_basket_model_lod2[];
extern Vtx d_course_luigi_raceway_unknown_model1[];
extern Vtx d_course_luigi_raceway_unknown_model2[];
extern Vtx d_course_luigi_raceway_unknown_model3[];
extern Vtx d_course_luigi_raceway_unknown_model4[];
extern Vtx d_course_luigi_raceway_unknown_model5[];
extern Lights1 d_course_luigi_raceway_light1;
extern Vtx d_course_luigi_raceway_basket_model_lod1[];
extern Vtx d_course_luigi_raceway_unknown_model6[];
extern Vtx d_course_luigi_raceway_unknown_model7[];
extern Vtx d_course_luigi_raceway_unknown_model8[];
extern u8 d_course_luigi_raceway_sign_left[];
extern u8 d_course_luigi_raceway_sign_right[];
extern u8 d_course_luigi_raceway_balloon_basket[];
extern u8 d_course_luigi_raceway_balloon_rope[];
extern Gfx d_course_luigi_raceway_dl_F588[];
extern Gfx d_course_luigi_raceway_dl_F630[];
extern Gfx d_course_luigi_raceway_dl_F640[];
extern Gfx d_course_luigi_raceway_dl_F650[];
extern Gfx d_course_luigi_raceway_dl_F660[];
extern Gfx d_course_luigi_raceway_dl_F718[];
extern Gfx d_course_luigi_raceway_dl_F728[];
extern Gfx d_course_luigi_raceway_dl_F938[];
extern Gfx d_course_luigi_raceway_dl_F948[];
extern Gfx d_course_luigi_raceway_dl_F960[];
extern Gfx d_course_luigi_raceway_dl_F970[];
extern Gfx d_course_luigi_raceway_dl_FA00[];
extern Gfx d_course_luigi_raceway_dl_FA10[];
extern Gfx d_course_luigi_raceway_dl_FA20[];
extern Gfx d_course_luigi_raceway_dl_FA30[];
extern Gfx d_course_luigi_raceway_dl_FB10[];
extern Gfx d_course_luigi_raceway_dl_FB20[];
extern Gfx d_course_luigi_raceway_dl_FBB8[];
extern Gfx d_course_luigi_raceway_dl_FBC8[];
extern Gfx d_course_luigi_raceway_dl_FBE0[];
extern Vtx d_course_luigi_raceway_tree_model[];
extern Gfx d_course_luigi_raceway_dl_FC70[];
extern Gfx d_course_luigi_raceway_dl_FD40[];
extern struct ActorSpawnData d_course_luigi_raceway_item_box_spawns[];
extern struct ActorSpawnData d_course_luigi_raceway_tree_spawn[];
extern TrackSections d_course_luigi_raceway_addr[];
#endif

File diff suppressed because it is too large Load Diff

View File

@ -1,363 +1,4 @@
#include <libultra/gbi.h>
#include "macros.h"
extern Gfx d_course_luigi_raceway_packed_dl_0[];
extern Gfx d_course_luigi_raceway_packed_dl_68[];
extern Gfx d_course_luigi_raceway_packed_dl_78[];
extern Gfx d_course_luigi_raceway_packed_dl_E0[];
extern Gfx d_course_luigi_raceway_packed_dl_F0[];
extern Gfx d_course_luigi_raceway_packed_dl_108[];
extern Gfx d_course_luigi_raceway_packed_dl_118[];
extern Gfx d_course_luigi_raceway_packed_dl_190[];
extern Gfx d_course_luigi_raceway_packed_dl_208[];
extern Gfx d_course_luigi_raceway_packed_dl_280[];
extern Gfx d_course_luigi_raceway_packed_dl_2F8[];
extern Gfx d_course_luigi_raceway_packed_dl_370[];
extern Gfx d_course_luigi_raceway_packed_dl_3E8[];
extern Gfx d_course_luigi_raceway_packed_dl_450[];
extern Gfx d_course_luigi_raceway_packed_dl_4B8[];
extern Gfx d_course_luigi_raceway_packed_dl_528[];
extern Gfx d_course_luigi_raceway_packed_dl_5A0[];
extern Gfx d_course_luigi_raceway_packed_dl_610[];
extern Gfx d_course_luigi_raceway_packed_dl_688[];
extern Gfx d_course_luigi_raceway_packed_dl_700[];
extern Gfx d_course_luigi_raceway_packed_dl_778[];
extern Gfx d_course_luigi_raceway_packed_dl_7F0[];
extern Gfx d_course_luigi_raceway_packed_dl_858[];
extern Gfx d_course_luigi_raceway_packed_dl_8D0[];
extern Gfx d_course_luigi_raceway_packed_dl_938[];
extern Gfx d_course_luigi_raceway_packed_dl_9A8[];
extern Gfx d_course_luigi_raceway_packed_dl_A20[];
extern Gfx d_course_luigi_raceway_packed_dl_A98[];
extern Gfx d_course_luigi_raceway_packed_dl_B48[];
extern Gfx d_course_luigi_raceway_packed_dl_BD0[];
extern Gfx d_course_luigi_raceway_packed_dl_C58[];
extern Gfx d_course_luigi_raceway_packed_dl_CE0[];
extern Gfx d_course_luigi_raceway_packed_dl_D68[];
extern Gfx d_course_luigi_raceway_packed_dl_DF0[];
extern Gfx d_course_luigi_raceway_packed_dl_E78[];
extern Gfx d_course_luigi_raceway_packed_dl_F00[];
extern Gfx d_course_luigi_raceway_packed_dl_F88[];
extern Gfx d_course_luigi_raceway_packed_dl_1000[];
extern Gfx d_course_luigi_raceway_packed_dl_1088[];
extern Gfx d_course_luigi_raceway_packed_dl_1110[];
extern Gfx d_course_luigi_raceway_packed_dl_11B8[];
extern Gfx d_course_luigi_raceway_packed_dl_1260[];
extern Gfx d_course_luigi_raceway_packed_dl_1308[];
extern Gfx d_course_luigi_raceway_packed_dl_13B0[];
extern Gfx d_course_luigi_raceway_packed_dl_1438[];
extern Gfx d_course_luigi_raceway_packed_dl_14E0[];
extern Gfx d_course_luigi_raceway_packed_dl_1558[];
extern Gfx d_course_luigi_raceway_packed_dl_15E0[];
extern Gfx d_course_luigi_raceway_packed_dl_1688[];
extern Gfx d_course_luigi_raceway_packed_dl_1730[];
extern Gfx d_course_luigi_raceway_packed_dl_17E0[];
extern Gfx d_course_luigi_raceway_packed_dl_1848[];
extern Gfx d_course_luigi_raceway_packed_dl_18B8[];
extern Gfx d_course_luigi_raceway_packed_dl_1920[];
extern Gfx d_course_luigi_raceway_packed_dl_1988[];
extern Gfx d_course_luigi_raceway_packed_dl_1A28[];
extern Gfx d_course_luigi_raceway_packed_dl_1AC8[];
extern Gfx d_course_luigi_raceway_packed_dl_1B28[];
extern Gfx d_course_luigi_raceway_packed_dl_1BD8[];
extern Gfx d_course_luigi_raceway_packed_dl_1C90[];
extern Gfx d_course_luigi_raceway_packed_dl_1D00[];
extern Gfx d_course_luigi_raceway_packed_dl_1D68[];
extern Gfx d_course_luigi_raceway_packed_dl_1E10[];
extern Gfx d_course_luigi_raceway_packed_dl_1E70[];
extern Gfx d_course_luigi_raceway_packed_dl_1F18[];
extern Gfx d_course_luigi_raceway_packed_dl_1F90[];
extern Gfx d_course_luigi_raceway_packed_dl_1FF0[];
extern Gfx d_course_luigi_raceway_packed_dl_2050[];
extern Gfx d_course_luigi_raceway_packed_dl_20C0[];
extern Gfx d_course_luigi_raceway_packed_dl_2130[];
extern Gfx d_course_luigi_raceway_packed_dl_21A8[];
extern Gfx d_course_luigi_raceway_packed_dl_2210[];
extern Gfx d_course_luigi_raceway_packed_dl_2280[];
extern Gfx d_course_luigi_raceway_packed_dl_22F8[];
extern Gfx d_course_luigi_raceway_packed_dl_2368[];
extern Gfx d_course_luigi_raceway_packed_dl_23E0[];
extern Gfx d_course_luigi_raceway_packed_dl_2458[];
extern Gfx d_course_luigi_raceway_packed_dl_24E0[];
extern Gfx d_course_luigi_raceway_packed_dl_2560[];
extern Gfx d_course_luigi_raceway_packed_dl_25E8[];
extern Gfx d_course_luigi_raceway_packed_dl_2658[];
extern Gfx d_course_luigi_raceway_packed_dl_26B8[];
extern Gfx d_course_luigi_raceway_packed_dl_2720[];
extern Gfx d_course_luigi_raceway_packed_dl_2798[];
extern Gfx d_course_luigi_raceway_packed_dl_2810[];
extern Gfx d_course_luigi_raceway_packed_dl_2888[];
extern Gfx d_course_luigi_raceway_packed_dl_2900[];
extern Gfx d_course_luigi_raceway_packed_dl_2978[];
extern Gfx d_course_luigi_raceway_packed_dl_29F0[];
extern Gfx d_course_luigi_raceway_packed_dl_2A68[];
extern Gfx d_course_luigi_raceway_packed_dl_2AE0[];
extern Gfx d_course_luigi_raceway_packed_dl_2B58[];
extern Gfx d_course_luigi_raceway_packed_dl_2BC8[];
extern Gfx d_course_luigi_raceway_packed_dl_2C40[];
extern Gfx d_course_luigi_raceway_packed_dl_2CB8[];
extern Gfx d_course_luigi_raceway_packed_dl_2D30[];
extern Gfx d_course_luigi_raceway_packed_dl_2DA8[];
extern Gfx d_course_luigi_raceway_packed_dl_2E20[];
extern Gfx d_course_luigi_raceway_packed_dl_2E90[];
extern Gfx d_course_luigi_raceway_packed_dl_2EF8[];
extern Gfx d_course_luigi_raceway_packed_dl_2F60[];
extern Gfx d_course_luigi_raceway_packed_dl_3080[];
extern Gfx d_course_luigi_raceway_packed_dl_30F8[];
extern Gfx d_course_luigi_raceway_packed_dl_3170[];
extern Gfx d_course_luigi_raceway_packed_dl_31E8[];
extern Gfx d_course_luigi_raceway_packed_dl_3260[];
extern Gfx d_course_luigi_raceway_packed_dl_32D8[];
extern Gfx d_course_luigi_raceway_packed_dl_3350[];
extern Gfx d_course_luigi_raceway_packed_dl_33C8[];
extern Gfx d_course_luigi_raceway_packed_dl_3448[];
extern Gfx d_course_luigi_raceway_packed_dl_34C8[];
extern Gfx d_course_luigi_raceway_packed_dl_3548[];
extern Gfx d_course_luigi_raceway_packed_dl_35D0[];
extern Gfx d_course_luigi_raceway_packed_dl_3678[];
extern Gfx d_course_luigi_raceway_packed_dl_36F8[];
extern Gfx d_course_luigi_raceway_packed_dl_3768[];
extern Gfx d_course_luigi_raceway_packed_dl_37E0[];
extern Gfx d_course_luigi_raceway_packed_dl_3858[];
extern Gfx d_course_luigi_raceway_packed_dl_38D0[];
extern Gfx d_course_luigi_raceway_packed_dl_3948[];
extern Gfx d_course_luigi_raceway_packed_dl_39C8[];
extern Gfx d_course_luigi_raceway_packed_dl_3A58[];
extern Gfx d_course_luigi_raceway_packed_dl_3AD0[];
extern Gfx d_course_luigi_raceway_packed_dl_3B38[];
extern Gfx d_course_luigi_raceway_packed_dl_3BD0[];
extern Gfx d_course_luigi_raceway_packed_dl_3C40[];
extern Gfx d_course_luigi_raceway_packed_dl_3CF0[];
extern Gfx d_course_luigi_raceway_packed_dl_3D60[];
extern Gfx d_course_luigi_raceway_packed_dl_3DD8[];
extern Gfx d_course_luigi_raceway_packed_dl_3EB8[];
extern Gfx d_course_luigi_raceway_packed_dl_3FC0[];
extern Gfx d_course_luigi_raceway_packed_dl_4148[];
extern Gfx d_course_luigi_raceway_packed_dl_4330[];
extern Gfx d_course_luigi_raceway_packed_dl_4518[];
extern Gfx d_course_luigi_raceway_packed_dl_4540[];
extern Gfx d_course_luigi_raceway_packed_dl_45B8[];
extern Gfx d_course_luigi_raceway_packed_dl_46A0[];
extern Gfx d_course_luigi_raceway_packed_dl_4860[];
extern Gfx d_course_luigi_raceway_packed_dl_4880[];
extern Gfx d_course_luigi_raceway_packed_dl_4960[];
extern Gfx d_course_luigi_raceway_packed_dl_49B8[];
extern Gfx d_course_luigi_raceway_packed_dl_4A28[];
extern Gfx d_course_luigi_raceway_packed_dl_4B10[];
extern Gfx d_course_luigi_raceway_packed_dl_4C28[];
extern Gfx d_course_luigi_raceway_packed_dl_4EE8[];
extern Gfx d_course_luigi_raceway_packed_dl_4F20[];
extern Gfx d_course_luigi_raceway_packed_dl_5038[];
extern Gfx d_course_luigi_raceway_packed_dl_51D8[];
extern Gfx d_course_luigi_raceway_packed_dl_53E0[];
extern Gfx d_course_luigi_raceway_packed_dl_55E8[];
extern Gfx d_course_luigi_raceway_packed_dl_5788[];
extern Gfx d_course_luigi_raceway_packed_dl_58A0[];
extern Gfx d_course_luigi_raceway_packed_dl_59B8[];
extern Gfx d_course_luigi_raceway_packed_dl_5AB8[];
extern Gfx d_course_luigi_raceway_packed_dl_5BB8[];
extern Gfx d_course_luigi_raceway_packed_dl_5CD0[];
extern Gfx d_course_luigi_raceway_packed_dl_5ED8[];
extern Gfx d_course_luigi_raceway_packed_dl_60E0[];
extern Gfx d_course_luigi_raceway_packed_dl_6300[];
extern Gfx d_course_luigi_raceway_packed_dl_6418[];
extern Gfx d_course_luigi_raceway_packed_dl_6558[];
extern Gfx d_course_luigi_raceway_packed_dl_65D8[];
extern Gfx d_course_luigi_raceway_packed_dl_6680[];
extern Gfx d_course_luigi_raceway_packed_dl_6728[];
extern Gfx d_course_luigi_raceway_packed_dl_67D0[];
extern Gfx d_course_luigi_raceway_packed_dl_6878[];
extern Gfx d_course_luigi_raceway_packed_dl_6920[];
extern Gfx d_course_luigi_raceway_packed_dl_69C0[];
extern Gfx d_course_luigi_raceway_packed_dl_6A58[];
extern Gfx d_course_luigi_raceway_packed_dl_6B00[];
extern Gfx d_course_luigi_raceway_packed_dl_6BF0[];
extern Gfx d_course_luigi_raceway_packed_dl_6CA8[];
extern Gfx d_course_luigi_raceway_packed_dl_6D60[];
extern Gfx d_course_luigi_raceway_packed_dl_6E18[];
extern Gfx d_course_luigi_raceway_packed_dl_6EF0[];
extern Gfx d_course_luigi_raceway_packed_dl_6FA8[];
extern Gfx d_course_luigi_raceway_packed_dl_7050[];
extern Gfx d_course_luigi_raceway_packed_dl_70F8[];
extern Gfx d_course_luigi_raceway_packed_dl_71A0[];
extern Gfx d_course_luigi_raceway_packed_dl_7248[];
extern Gfx d_course_luigi_raceway_packed_dl_72F0[];
extern Gfx d_course_luigi_raceway_packed_dl_7398[];
extern Gfx d_course_luigi_raceway_packed_dl_7440[];
extern Gfx d_course_luigi_raceway_packed_dl_74F0[];
extern Gfx d_course_luigi_raceway_packed_dl_75A8[];
extern Gfx d_course_luigi_raceway_packed_dl_7650[];
extern Gfx d_course_luigi_raceway_packed_dl_76F8[];
extern Gfx d_course_luigi_raceway_packed_dl_77B0[];
extern Gfx d_course_luigi_raceway_packed_dl_7878[];
extern Gfx d_course_luigi_raceway_packed_dl_7940[];
extern Gfx d_course_luigi_raceway_packed_dl_79E8[];
extern Gfx d_course_luigi_raceway_packed_dl_7A88[];
extern Gfx d_course_luigi_raceway_packed_dl_7B80[];
extern Gfx d_course_luigi_raceway_packed_dl_7BF8[];
extern Gfx d_course_luigi_raceway_packed_dl_7C80[];
extern Gfx d_course_luigi_raceway_packed_dl_7CF0[];
extern Gfx d_course_luigi_raceway_packed_dl_7D60[];
extern Gfx d_course_luigi_raceway_packed_dl_7DD8[];
extern Gfx d_course_luigi_raceway_packed_dl_7E50[];
extern Gfx d_course_luigi_raceway_packed_dl_7EB8[];
extern Gfx d_course_luigi_raceway_packed_dl_7EF8[];
extern Gfx d_course_luigi_raceway_packed_dl_7F68[];
extern Gfx d_course_luigi_raceway_packed_dl_7FE0[];
extern Gfx d_course_luigi_raceway_packed_dl_8048[];
extern Gfx d_course_luigi_raceway_packed_dl_80B0[];
extern Gfx d_course_luigi_raceway_packed_dl_8128[];
extern Gfx d_course_luigi_raceway_packed_dl_8190[];
extern Gfx d_course_luigi_raceway_packed_dl_8200[];
extern Gfx d_course_luigi_raceway_packed_dl_8240[];
extern Gfx d_course_luigi_raceway_packed_dl_8320[];
extern Gfx d_course_luigi_raceway_packed_dl_83C8[];
extern Gfx d_course_luigi_raceway_packed_dl_83E0[];
extern Gfx d_course_luigi_raceway_packed_dl_8448[];
extern Gfx d_course_luigi_raceway_packed_dl_84B0[];
extern Gfx d_course_luigi_raceway_packed_dl_84C8[];
extern Gfx d_course_luigi_raceway_packed_dl_8528[];
extern Gfx d_course_luigi_raceway_packed_dl_85F8[];
extern Gfx d_course_luigi_raceway_packed_dl_8768[];
extern Gfx d_course_luigi_raceway_packed_dl_8788[];
extern Gfx d_course_luigi_raceway_packed_dl_87F0[];
extern Gfx d_course_luigi_raceway_packed_dl_8858[];
extern Gfx d_course_luigi_raceway_packed_dl_88C0[];
extern Gfx d_course_luigi_raceway_packed_dl_8928[];
extern Gfx d_course_luigi_raceway_packed_dl_8990[];
extern Gfx d_course_luigi_raceway_packed_dl_89F8[];
extern Gfx d_course_luigi_raceway_packed_dl_8A58[];
extern Gfx d_course_luigi_raceway_packed_dl_8AB8[];
extern Gfx d_course_luigi_raceway_packed_dl_8B18[];
extern Gfx d_course_luigi_raceway_packed_dl_8B80[];
extern Gfx d_course_luigi_raceway_packed_dl_8BE8[];
extern Gfx d_course_luigi_raceway_packed_dl_8C50[];
extern Gfx d_course_luigi_raceway_packed_dl_8CB8[];
extern Gfx d_course_luigi_raceway_packed_dl_8D20[];
extern Gfx d_course_luigi_raceway_packed_dl_8D88[];
extern Gfx d_course_luigi_raceway_packed_dl_8DE8[];
extern Gfx d_course_luigi_raceway_packed_dl_8E50[];
extern Gfx d_course_luigi_raceway_packed_dl_8EB0[];
extern Gfx d_course_luigi_raceway_packed_dl_8F18[];
extern Gfx d_course_luigi_raceway_packed_dl_8F80[];
extern Gfx d_course_luigi_raceway_packed_dl_8FE8[];
extern Gfx d_course_luigi_raceway_packed_dl_9098[];
extern Gfx d_course_luigi_raceway_packed_dl_9120[];
extern Gfx d_course_luigi_raceway_packed_dl_91A8[];
extern Gfx d_course_luigi_raceway_packed_dl_9230[];
extern Gfx d_course_luigi_raceway_packed_dl_92B8[];
extern Gfx d_course_luigi_raceway_packed_dl_9340[];
extern Gfx d_course_luigi_raceway_packed_dl_93C8[];
extern Gfx d_course_luigi_raceway_packed_dl_9440[];
extern Gfx d_course_luigi_raceway_packed_dl_94B8[];
extern Gfx d_course_luigi_raceway_packed_dl_9530[];
extern Gfx d_course_luigi_raceway_packed_dl_95B8[];
extern Gfx d_course_luigi_raceway_packed_dl_9640[];
extern Gfx d_course_luigi_raceway_packed_dl_96C8[];
extern Gfx d_course_luigi_raceway_packed_dl_9750[];
extern Gfx d_course_luigi_raceway_packed_dl_97D8[];
extern Gfx d_course_luigi_raceway_packed_dl_9860[];
extern Gfx d_course_luigi_raceway_packed_dl_98D8[];
extern Gfx d_course_luigi_raceway_packed_dl_9960[];
extern Gfx d_course_luigi_raceway_packed_dl_99D8[];
extern Gfx d_course_luigi_raceway_packed_dl_9A60[];
extern Gfx d_course_luigi_raceway_packed_dl_9AE8[];
extern Gfx d_course_luigi_raceway_packed_dl_9B70[];
extern Gfx d_course_luigi_raceway_packed_dl_9C20[];
extern Gfx d_course_luigi_raceway_packed_dl_9EC0[];
extern Gfx d_course_luigi_raceway_packed_dl_9ED0[];
extern Gfx d_course_luigi_raceway_packed_dl_9F70[];
extern Gfx d_course_luigi_raceway_packed_dl_A010[];
extern Gfx d_course_luigi_raceway_packed_dl_A028[];
extern Gfx d_course_luigi_raceway_packed_dl_A088[];
extern Gfx d_course_luigi_raceway_packed_dl_A0F0[];
extern Gfx d_course_luigi_raceway_packed_dl_A150[];
extern Gfx d_course_luigi_raceway_packed_dl_A1B0[];
extern Gfx d_course_luigi_raceway_packed_dl_A210[];
extern Gfx d_course_luigi_raceway_packed_dl_A270[];
extern Gfx d_course_luigi_raceway_packed_dl_A2A8[];
extern Gfx d_course_luigi_raceway_packed_dl_A308[];
extern Gfx d_course_luigi_raceway_packed_dl_A368[];
extern Gfx d_course_luigi_raceway_packed_dl_A3C8[];
extern Gfx d_course_luigi_raceway_packed_dl_A430[];
extern Gfx d_course_luigi_raceway_packed_dl_A490[];
extern Gfx d_course_luigi_raceway_packed_dl_A4F8[];
extern Gfx d_course_luigi_raceway_packed_dl_A558[];
extern Gfx d_course_luigi_raceway_packed_dl_A5C0[];
extern Gfx d_course_luigi_raceway_packed_dl_A620[];
extern Gfx d_course_luigi_raceway_packed_dl_A688[];
extern Gfx d_course_luigi_raceway_packed_dl_A6E8[];
extern Gfx d_course_luigi_raceway_packed_dl_A748[];
extern Gfx d_course_luigi_raceway_packed_dl_A7A8[];
extern Gfx d_course_luigi_raceway_packed_dl_A810[];
extern Gfx d_course_luigi_raceway_packed_dl_A870[];
extern Gfx d_course_luigi_raceway_packed_dl_A8D0[];
extern Gfx d_course_luigi_raceway_packed_dl_A930[];
extern Gfx d_course_luigi_raceway_packed_dl_A998[];
extern Gfx d_course_luigi_raceway_packed_dl_AA00[];
extern Gfx d_course_luigi_raceway_packed_dl_AA68[];
extern Gfx d_course_luigi_raceway_packed_dl_AAD0[];
extern Gfx d_course_luigi_raceway_packed_dl_AB38[];
extern Gfx d_course_luigi_raceway_packed_dl_ABA0[];
extern Gfx d_course_luigi_raceway_packed_dl_AC08[];
extern Gfx d_course_luigi_raceway_packed_dl_AC70[];
extern Gfx d_course_luigi_raceway_packed_dl_ACD8[];
extern Gfx d_course_luigi_raceway_packed_dl_AD40[];
extern Gfx d_course_luigi_raceway_packed_dl_ADA8[];
extern Gfx d_course_luigi_raceway_packed_dl_AE10[];
extern Gfx d_course_luigi_raceway_packed_dl_AE78[];
extern Gfx d_course_luigi_raceway_packed_dl_AEE0[];
extern Gfx d_course_luigi_raceway_packed_dl_AF48[];
extern Gfx d_course_luigi_raceway_packed_dl_AFB0[];
extern Gfx d_course_luigi_raceway_packed_dl_B010[];
extern Gfx d_course_luigi_raceway_packed_dl_B078[];
extern Gfx d_course_luigi_raceway_packed_dl_B198[];
extern Gfx d_course_luigi_raceway_packed_dl_B200[];
extern Gfx d_course_luigi_raceway_packed_dl_B268[];
extern Gfx d_course_luigi_raceway_packed_dl_B2D0[];
extern Gfx d_course_luigi_raceway_packed_dl_B338[];
extern Gfx d_course_luigi_raceway_packed_dl_B3A0[];
extern Gfx d_course_luigi_raceway_packed_dl_B408[];
extern Gfx d_course_luigi_raceway_packed_dl_B470[];
extern Gfx d_course_luigi_raceway_packed_dl_B4D0[];
extern Gfx d_course_luigi_raceway_packed_dl_B530[];
extern Gfx d_course_luigi_raceway_packed_dl_B590[];
extern Gfx d_course_luigi_raceway_packed_dl_B600[];
extern Gfx d_course_luigi_raceway_packed_dl_B678[];
extern Gfx d_course_luigi_raceway_packed_dl_B6D8[];
extern Gfx d_course_luigi_raceway_packed_dl_B740[];
extern Gfx d_course_luigi_raceway_packed_dl_B7A8[];
extern Gfx d_course_luigi_raceway_packed_dl_B810[];
extern Gfx d_course_luigi_raceway_packed_dl_B878[];
extern Gfx d_course_luigi_raceway_packed_dl_B8E0[];
extern Gfx d_course_luigi_raceway_packed_dl_B948[];
extern Gfx d_course_luigi_raceway_packed_dl_B9B8[];
extern Gfx d_course_luigi_raceway_packed_dl_BA20[];
extern Gfx d_course_luigi_raceway_packed_dl_BA80[];
extern Gfx d_course_luigi_raceway_packed_dl_BAF0[];
extern Gfx d_course_luigi_raceway_packed_dl_BB50[];
extern Gfx d_course_luigi_raceway_packed_dl_BBC0[];
extern Gfx d_course_luigi_raceway_packed_dl_BC20[];
extern Gfx d_course_luigi_raceway_packed_dl_BC88[];
extern Gfx d_course_luigi_raceway_packed_dl_BD68[];
extern Gfx d_course_luigi_raceway_packed_dl_BDC8[];
extern Gfx d_course_luigi_raceway_packed_dl_BE28[];
extern Gfx d_course_luigi_raceway_packed_dl_BE88[];
extern Gfx d_course_luigi_raceway_packed_dl_BF20[];
extern Gfx d_course_luigi_raceway_packed_dl_BFB8[];
extern Gfx d_course_luigi_raceway_packed_dl_C050[];
extern Gfx d_course_luigi_raceway_packed_dl_C0F0[];
extern Gfx d_course_luigi_raceway_packed_dl_C1A0[];
extern Gfx d_course_luigi_raceway_packed_dl_C200[];
extern Gfx d_course_luigi_raceway_packed_dl_C260[];
extern Gfx d_course_luigi_raceway_packed_dl_C300[];
extern Gfx d_course_luigi_raceway_packed_dl_C3A8[];
extern Gfx d_course_luigi_raceway_packed_dl_C410[];
extern Gfx d_course_luigi_raceway_packed_dl_C4C0[];
extern Gfx d_course_luigi_raceway_packed_dl_C540[];
extern Gfx d_course_luigi_raceway_packed_dl_C5C0[];
extern Gfx d_course_luigi_raceway_packed_dl_C640[];
extern Gfx d_course_luigi_raceway_packed_dl_C668[];
extern Gfx d_course_luigi_raceway_packed_dl_C730[2];
#define d_course_luigi_raceway_packed_end GET_PACKED_END(d_course_luigi_raceway_packed_dl_C730)

View File

@ -1,6 +1,6 @@
#include <libultra/types.h>
#include "course_offsets.h"
#include "course_data.h"
#include <assets/luigi_raceway_data.h>
const course_texture luigi_raceway_textures[] = {
{gTextureSignShellShot0, 0x038C, 0x1000, 0x0},

File diff suppressed because it is too large Load Diff

View File

@ -96,11 +96,11 @@ index 0000000..5569838
+#define SENSITIVITY_X 0.0003f
+#define SENSITIVITY_Y 0.0003f
+
+u32 isFlycam = FALSE;
+u32 isFlycam = false;
+u32 fRankIndex = 0;
+u32 fTargetPlayer = FALSE;
+u32 fTargetPlayer = false;
+u32 fMode; // flycam mode should probably be an enum
+u32 fModeInit = FALSE;
+u32 fModeInit = false;
+
+typedef struct {
+ Vec3f pos;
@ -217,7 +217,7 @@ index 0000000..5569838
+ fState.rot[0] = camera->rot[0];
+ fState.rot[1] = camera->rot[1];
+ fState.rot[2] = camera->rot[2];
+ fModeInit = TRUE;
+ fModeInit = true;
+}
+
+void flycam_load_state(Camera *camera) {
@ -365,7 +365,7 @@ index 0000000..5569838
+ f32 pitchChange = controller->rawStickY * SENSITIVITY_Y;
+ Vec3f forwardVector;
+
+ func_802ADDC8(&camera->unk_54, 50, camera->pos[0], camera->pos[1], camera->pos[2]);
+ check_bounding_collision(&camera->collision, 50, camera->pos[0], camera->pos[1], camera->pos[2]);
+
+ camera->rot[1] += (short)(yawChange * 65535.0f / (2 * M_PI)); // Convert radians to 0-65535 range
+
@ -430,7 +430,7 @@ diff --git a/src/racing/render_courses.c b/src/racing/render_courses.c
index c2a84aa..338e2bd 100644
--- a/src/racing/render_courses.c
+++ b/src/racing/render_courses.c
@@ -180,6 +180,11 @@ void load_surface_map(uintptr_t addr, struct UnkStruct_800DC5EC *arg1) {
@@ -180,6 +180,11 @@ void render_course_segments(uintptr_t addr, struct UnkStruct_800DC5EC *arg1) {
arg1->pathCounter = temp_v1;
temp_v1 = ((temp_v1 - 1) * 4) + var_a3;

View File

@ -139,11 +139,11 @@ typedef struct {
/* 0x00 */ u16 unk30;
/* 0x02 */ u16 unk32;
/* 0x04 */ u16 unk34;
/* 0x06 */ u16 unk36;
/* 0x08 */ u16 unk38;
/* 0x06 */ u16 meshIndexYX;
/* 0x08 */ u16 meshIndexZY;
// This may be an index to the tilemap?
/* 0x0A */ u16 unk3A;
/* 0x0C */ Vec3f unk3C;
/* 0x0A */ u16 meshIndexZX;
/* 0x0C */ Vec3f surfaceDistance; // Appears to be distance from actor to surface for zx, yx, and zy planes.
/* 0x18 */ Vec3f unk48;
/* 0x24 */ Vec3f unk54;
/* 0x30 */ Vec3f orientationVector;
@ -185,7 +185,6 @@ typedef struct {
s16 ob[3]; /* x, y, z */
s16 tc[2]; /* texture coord */
s8 ca[4]; /* color & alpha */
} CourseVtx;
/*
@ -203,53 +202,41 @@ typedef struct {
//bit 4: 1 = out of bounds
//bit 3: 1 = player tumbles upon contact (may fall right through)
/* 0x02 */ u16 surfaceType;
/* 0x04 */ s16 vtx31;
s16 vtx32;
s16 vtx33; //X, Y, Z of poly's third vertex
s16 vtx21;
s16 vtx22;
/* 0x0A */ s16 vtx23; //X, Y, Z of poly's second vertex
/* 0x10 */ Vtx *vtxPoly1; //pointer to the 3 vertices of this poly
Vtx *vtxPoly2;
Vtx *vtxPoly3;
//unsure why this exists along with a copy of two of the vertices.
//both are involved in hit detection.
/* 0x1C */ f32 height;
//normally 0; read at 0x802AB1A4. this value is added to the height Lakitu
//drops you at. changing it seems to make the surface intangible.
/* 0x20 */ f32 gravity;
//normally 1. The height Lakitu drops you off at is divided by this value
//(before adding the value at 0x1C), although if set to zero, he just tries
//to drop you at about the height of the finish line banner. Changing it
//has various unusual effects, making the polygon intangible or
//significantly reducing the gravity above it, probably depending on its Y
//position.
/* 0x24 */ f32 rotation; //normally about -0.001. no idea what this actually is.
/* 0x28 */ f32 height2; //changes Y position of all vertices (but not graphics or
//Lakitu drop position). Normally set to (track_height * -1) + about 6.
} mk64_surface_map_ram; // size = 0x2C
// For AABB bounding-box style collision. Box collision is cheaper than checking each vtx.
/* 0x04 */ s16 minX; // Minimum x coordinate
s16 minY; // Minimum y coordinate
s16 minZ; // Minimum z coordinate
s16 maxX; // Maximum x coordinate
s16 maxY; // Maximum y coordinate
/* 0x0A */ s16 maxZ; // Maximum z coordinate
// Three vertices to make a triangle
/* 0x10 */ Vtx *vtx1;
Vtx *vtx2;
Vtx *vtx3;
// Face normal. Should really be Vec3f normal
/* 0x1C */ f32 normalX;
/* 0x20 */ f32 normalY;
/* 0x24 */ f32 normalZ;
/* 0x28 */ f32 distance;
} CollisionTriangle; // size = 0x2C
typedef struct {
/* 0x00 */ Vec3f cornerPos;
// Type of surface the corner is above
/* 0x0C */ u8 surfaceType;
// Close to being a copy of the top byte of the surface_map "flag" member
/* 0x00 */ Vec3f pos;
/* 0x0C */ u8 surfaceType; // Surface type that the tyre is touching.
/* 0x0D */ u8 surfaceFlags;
// Don't know if "tile" is right the right term
// gSurfaceMap is a pointer to an array of "tile" structs. This is an index to that array
/* 0x0E */ u16 surfaceMapIndex;
// cornerPos places the corner "in the air" as it were, this member indicates the Y position of the corner's "on the ground" sibling
// On flat ground this value should be cornerY - gKartBoundingBoxTable[characterId]
/* 0x10 */ f32 cornerGroundY;
/* 0x0E */ u16 collisionMeshIndex; // Index into gCollisionMesh
// Height of tyre attached to ground. When flying it floats with the kart.
/* 0x10 */ f32 baseHeight;
// Something lighting related. 1 when in a shaded region, 2 when in a tree's shadow
// 3 when getting crushed by a whomp, but curiously only the front left tyre will ever have this value
/* 0x14 */ s32 unk_14;
} KartBoundingBoxCorner; // size = 0x18
} KartTyre; // size = 0x18
#define FRONT_LEFT_TYRE 0
#define FRONT_RIGHT_TYRE 1
#define BACK_LEFT_TYRE 2
#define BACK_RIGHT_TYRE 3
#define FRONT_LEFT 0
#define FRONT_RIGHT 1
#define BACK_LEFT 2
#define BACK_RIGHT 3
struct UnkPlayerInner {
/* 0xDB4 */ s16 unk0;
@ -343,10 +330,10 @@ typedef struct {
/* 0x0108 */ f32 unk_108;
/* 0x010C */ s16 unk_10C;
/* 0x010E */ char unk_10E[0x2];
/* 0x0110 */ Collision unk_110;
/* 0x0110 */ Collision collision;
/* 0x0150 */ Mat3 unk_150;
/* 0x0174 */ Mat3 orientationMatrix;
/* 0x0198 */ KartBoundingBoxCorner boundingBoxCorners[4];
/* 0x0198 */ KartTyre tyres[4];
/* 0x01F8 */ f32 unk_1F8;
/* 0x01FC */ f32 unk_1FC;
/* 0x0200 */ u32 unk_200; // May be s32. but less casting required if u32
@ -386,17 +373,10 @@ typedef struct {
/* 0x0DAC */ f32 unk_DAC;
/* 0x0DB0 */ f32 unk_DB0;
/* 0x0DB4 */ struct UnkPlayerInner unk_DB4;
/* 0x0DB6 */ // s16 unk_DB6;
/* 0x0DB8 */ // f32 unk_DB8;
/* 0x0DBC */ //f32 unk_DBC;
/* 0x0DC0 */ // f32 unk_DC0;
/* 0x0DC4 */ // f32 unk_DC4;
/* 0x0DC8 */ // f32 unk_DC8;
/* 0x0DCC */ // s16 unk_DCC;
/* 0x0DCE */ // s16 unk_DCE;
/* 0x0DD0 */ // s16 unk_DD0;
/* 0x0DD2 */ // s16 unk_DD2;
/* 0x0DD4 */ // s16 unk_DD4;
u32 nControlFlags; // Is racer human, ai, or networked controlled?
s32 nCharacter; // Networked character choice
s32 nStartingRank;
u32 nHasAuthority;
} Player; // size = 0xDD8
typedef struct

View File

@ -312,7 +312,8 @@ enum ITEMS {
/* 0x0C */ ITEM_MUSHROOM,
/* 0x0D */ ITEM_DOUBLE_MUSHROOM,
/* 0x0E */ ITEM_TRIPLE_MUSHROOM,
/* 0x0F */ ITEM_SUPER_MUSHROOM
/* 0x0F */ ITEM_SUPER_MUSHROOM,
/* 0x0G */ ITEM_MAX,
};
enum KART_AI_BEHAVIOURS {
@ -384,3 +385,16 @@ enum KART_AI_BEHAVIOURS {
#define COLOR_BLACK GPACK_RGB888(0, 0, 0)
#endif // DEFINES_H
/**
*
* Collision mesh flags
*
*/
#define GRID_SIZE 32
#define FACING_Y_AXIS 0x4000
#define FACING_X_AXIS 0x8000
#define FACING_Z_AXIS 0x2000

View File

@ -83,6 +83,14 @@
// aligns an address to the next 16 bytes
#define ALIGN16(val) (((val) + 0xF) & ~0xF)
// Envelopes are always stored as big endian, to match sequence files which are
// byte blobs and can embed envelopes. Hence this byteswapping macro.
#if IS_BIG_ENDIAN
#define BSWAP16(x) (x)
#else
#define BSWAP16(x) (((x) & 0xff) << 8 | (((x) >> 8) & 0xff))
#endif
/**
* (u8*) dl : Cast array down to u8's
* + sizeof(dl) : go to the end of the array

View File

@ -16,7 +16,7 @@ typedef struct
/* 0x28 */ Vec3f offset;
/* 0x34 */ f32 unk_034;
/* 0x38 */ Vec3f velocity; // acceleration
/* 0x44 */ f32 unk_044;
/* 0x44 */ f32 surfaceHeight;
/* 0x48 */ s32 unk_048;
/* 0x4C */ s32 unk_04C;
/* 0x50 */ s32 unk_050;
@ -79,9 +79,9 @@ typedef struct
/* 0xDD */ u8 unk_0DD;
/* 0xDE */ s8 unk_0DE;
/* 0xDF */ u8 unk_0DF;
} Objects; // size = 0xE0
} Object; // size = 0xE0
extern Objects gObjectList[];
extern Object gObjectList[];
typedef struct
{

View File

@ -10,6 +10,11 @@
#define NUM_TRAINS 2
#define LOCOMOTIVE_ONLY 0
#define NUM_CROSSINGS 2
// This allows karts to jump the train despite the crossing being activated.
// but still stop for the train once it's close
#define FRAMES_SINCE_CROSSING_ACTIVATED 240
// It seems like there's room for 2 Ferries, but only 1 is ever active
#define NUM_ACTIVE_PADDLE_BOATS 1
#define NUM_PADDLE_BOATS 2
@ -24,6 +29,12 @@
#define NUM_TIME_TRIAL_TANKER_TRUCKS (NUM_RACE_TANKER_TRUCKS + 1)
#define NUM_TIME_TRIAL_CARS (NUM_RACE_CARS + 1)
#define TRAIN_SMOKE_RENDER_DISTANCE 2000.0f
#define TRAIN_CROSSING_AI_DISTANCE 1000.0f
#define BOAT_SMOKE_RENDER_DISTANCE 2000.0f
#define RENDER_VEHICLE 1
typedef struct {
/* 0x00 */ s16 isActive; // Only used for Tender and Passenger Cars, unused for Locomotives
/* 0x02 */ s16 compilerPadding;

View File

@ -38,7 +38,7 @@ extern s16 *D_801645A0[];
* a given player is on, the specific value may change
**/
// Shadows values from gNearestWaypointByPlayerId
extern s16 D_80162FCE;
extern s16 sSomeNearestWaypoint;
// Shadows values from gPathIndexByPlayerId
extern s32 D_80163448;
// Shadows values from D_80164560

@ -1 +1 @@
Subproject commit fccf181b449f82f3e6ae5cdc666319847f78e0a1
Subproject commit a5203ea0ea36a0fe059818044f8daa730b119c4d

View File

@ -47,7 +47,7 @@ void update_actor_banana(struct BananaActor *banana) {
banana->pos[1] = player->pos[1] - temp_f14 - 2.0f;
banana->pos[2] = player->pos[2] - temp_f16;
}
func_802ADDC8(&banana->unk30, banana->boundingBoxSize + 1.0f, banana->pos[0], banana->pos[1], banana->pos[2]);
check_bounding_collision(&banana->unk30, banana->boundingBoxSize + 1.0f, banana->pos[0], banana->pos[1], banana->pos[2]);
func_802B4E30((struct Actor *) banana);
if ((player->type & PLAYER_HUMAN) != 0) {
if (gDemoMode) {
@ -99,15 +99,15 @@ void update_actor_banana(struct BananaActor *banana) {
if ((banana->pos[2] < (f32) gCourseMinZ) || ((f32) gCourseMaxZ < banana->pos[2]) || (banana->pos[0] < (f32) gCourseMinX) || ((f32) gCourseMaxX < banana->pos[0]) || (banana->pos[1] < (f32) gCourseMinY)) {
destroy_destructable_actor((struct Actor *) banana);
} else {
func_802ADDC8(&banana->unk30, banana->boundingBoxSize + 1.0f, banana->pos[0], banana->pos[1], banana->pos[2]);
check_bounding_collision(&banana->unk30, banana->boundingBoxSize + 1.0f, banana->pos[0], banana->pos[1], banana->pos[2]);
banana->unk30.unk34 = 1;
if ((banana->unk30.unk34 != 0) && (banana->unk30.unk3C[2] < 0.0f)) {
if ((banana->unk30.unk34 != 0) && (banana->unk30.surfaceDistance[2] < 0.0f)) {
someOtherVelocity[0] = -banana->unk30.orientationVector[0];
someOtherVelocity[1] = -banana->unk30.orientationVector[1];
someOtherVelocity[2] = -banana->unk30.orientationVector[2];
banana->pos[0] += someOtherVelocity[0] * banana->unk30.unk3C[2];
banana->pos[1] += someOtherVelocity[1] * banana->unk30.unk3C[2];
banana->pos[2] += someOtherVelocity[2] * banana->unk30.unk3C[2];
banana->pos[0] += someOtherVelocity[0] * banana->unk30.surfaceDistance[2];
banana->pos[1] += someOtherVelocity[1] * banana->unk30.surfaceDistance[2];
banana->pos[2] += someOtherVelocity[2] * banana->unk30.surfaceDistance[2];
banana->flags &= ~0x1000;
banana->state = 4;
}
@ -137,7 +137,7 @@ void update_actor_banana(struct BananaActor *banana) {
banana->pos[1] = unkY - temp_f14 - 2.0f;
banana->pos[2] = unkZ - temp_f16;
}
func_802ADDC8(&banana->unk30, banana->boundingBoxSize + 1.0f, banana->pos[0], banana->pos[1], banana->pos[2]);
check_bounding_collision(&banana->unk30, banana->boundingBoxSize + 1.0f, banana->pos[0], banana->pos[1], banana->pos[2]);
func_802B4E30((struct Actor *) banana);
break;
case BANANA_BUNCH_BANANA:
@ -159,7 +159,7 @@ void update_actor_banana(struct BananaActor *banana) {
banana->pos[2] = elderBanana->pos[2] - temp_f16;
}
var_f8 = banana->pos[2];
func_802ADDC8(&banana->unk30, banana->boundingBoxSize + 1.0f, banana->pos[0], banana->pos[1], banana->pos[2]);
check_bounding_collision(&banana->unk30, banana->boundingBoxSize + 1.0f, banana->pos[0], banana->pos[1], banana->pos[2]);
func_802B4E30((struct Actor *) banana);
break;
case DESTROYED_BANANA:

View File

@ -85,7 +85,7 @@ void func_802B3B44(struct ShellActor *shell) {
shell->pos[0] += temp_f12_3;
shell->pos[1] += temp_f14_2;
shell->pos[2] += temp_f16_2;
func_802AD950(&shell->unk30, 4.0f, shell->pos[0], shell->pos[1], shell->pos[2], origPos[0], origPos[1], origPos[2]);
actor_terrain_collision(&shell->unk30, 4.0f, shell->pos[0], shell->pos[1], shell->pos[2], origPos[0], origPos[1], origPos[2]);
func_802B4E30((struct Actor *) shell);
}
} else {
@ -142,7 +142,7 @@ void func_802B3E7C(struct ShellActor *shell, Player *player) {
if (player->effects & BOO_EFFECT) {
destroy_destructable_actor((struct Actor *) shell);
} else {
func_802AD950(&shell->unk30, 4.0f, shell->pos[0], shell->pos[1], shell->pos[2], newPosition[0], newPosition[1], newPosition[2]);
actor_terrain_collision(&shell->unk30, 4.0f, shell->pos[0], shell->pos[1], shell->pos[2], newPosition[0], newPosition[1], newPosition[2]);
func_802B4E30((struct Actor *) shell);
func_802B4104(shell);
}
@ -177,11 +177,11 @@ s16 func_802B3FD0(Player *owner, struct ShellActor *shell) {
}
void func_802B4104(struct ShellActor *shell) {
if ((shell->unk30.unk3C[0] < 0.0f) && ((shell->unk30.unk48[1] < 0.25f) || (shell->unk30.unk48[1] > -0.25f))) {
if ((shell->unk30.surfaceDistance[0] < 0.0f) && ((shell->unk30.unk48[1] < 0.25f) || (shell->unk30.unk48[1] > -0.25f))) {
destroy_destructable_actor((struct Actor *) shell);
func_800C98B8(shell->pos, shell->velocity, SOUND_ARG_LOAD(0x19, 0x00, 0x80, 0x54));
shell->flags |= 0x80;
} else if ((shell->unk30.unk3C[1] < 0.0f) && ((shell->unk30.unk54[1] < 0.25f) || (shell->unk30.unk54[1] < -0.25f))) {
} else if ((shell->unk30.surfaceDistance[1] < 0.0f) && ((shell->unk30.unk54[1] < 0.25f) || (shell->unk30.unk54[1] < -0.25f))) {
destroy_destructable_actor((struct Actor *) shell);
func_800C98B8(shell->pos, shell->velocity, SOUND_ARG_LOAD(0x19, 0x00, 0x80, 0x54));
shell->flags |= 0x80;
@ -196,7 +196,7 @@ void func_802B4104(struct ShellActor *shell) {
void update_actor_red_blue_shell(struct ShellActor *shell) {
UNUSED f32 pad9;
Player *player;
f32 temp_f0;
f32 height;
UNUSED f32 temp_f14;
f32 temp_f2;
s16 temp_v0;
@ -235,7 +235,7 @@ void update_actor_red_blue_shell(struct ShellActor *shell) {
switch (shell->state) {
case HELD_SHELL:
player = &gPlayers[shell->playerId];
copy_collision(&player->unk_110, &shell->unk30);
copy_collision(&player->collision, &shell->unk30);
somePosVel[0] = 0.0f;
somePosVel[1] = player->boundingBoxSize;
somePosVel[2] = -(player->boundingBoxSize + shell->boundingBoxSize + 2.0f);
@ -243,11 +243,11 @@ void update_actor_red_blue_shell(struct ShellActor *shell) {
shell->pos[0] = player->pos[0] + somePosVel[0];
pad7 = player->pos[1] - somePosVel[1];
shell->pos[2] = player->pos[2] + somePosVel[2];
temp_f0 = func_802ABE30(shell->pos[0], pad7, shell->pos[2], player->unk_110.unk3A);
temp_f2 = pad7 - temp_f0;
height = calculate_surface_height(shell->pos[0], pad7, shell->pos[2], player->collision.meshIndexZX);
temp_f2 = pad7 - height;
if ((temp_f2 < 5.0f) && (temp_f2 > -5.0f)) {
shell->pos[1] = shell->boundingBoxSize + temp_f0;
shell->pos[1] = shell->boundingBoxSize + height;
} else {
shell->pos[1] = pad7;
}
@ -303,13 +303,13 @@ void update_actor_red_blue_shell(struct ShellActor *shell) {
}
if (shell->state == MOVING_SHELL) {
shell->someTimer = 0x001E;
temp_f0 = 8.0f;
height = 8.0f;
if (player->unk_094 > 8.0f) {
temp_f0 = player->unk_094 * 1.2f;
height = player->unk_094 * 1.2f;
}
somePosVel[0] = 0.0f;
somePosVel[1] = 0.0f;
somePosVel[2] = temp_f0;
somePosVel[2] = height;
func_802B64C4(somePosVel, (s16) (player->rotation[1] + player->unk_0C0));
shell->velocity[0] = somePosVel[0];
shell->velocity[1] = somePosVel[1];
@ -385,7 +385,7 @@ void update_actor_red_blue_shell(struct ShellActor *shell) {
shell->pos[0] += shell->velocity[0];
shell->pos[1] += shell->velocity[1];
shell->pos[2] += shell->velocity[2];
func_802AD950(&shell->unk30, 4.0f, shell->pos[0], shell->pos[1], shell->pos[2], origPos[0], origPos[1], origPos[2]);
actor_terrain_collision(&shell->unk30, 4.0f, shell->pos[0], shell->pos[1], shell->pos[2], origPos[0], origPos[1], origPos[2]);
func_802B4E30((struct Actor *) shell);
func_802B4104(shell);
break;
@ -405,11 +405,11 @@ void update_actor_red_blue_shell(struct ShellActor *shell) {
case GREEN_SHELL_HIT_A_RACER:
func_802B3B44(shell);
player = &gPlayers[shell->targetPlayer];
temp_f0 = player->pos[0];
temp_f0 -= shell->pos[0];
height = player->pos[0];
height -= shell->pos[0];
temp_f2 = player->pos[2];
temp_f2 -= shell->pos[2];
if (((temp_f0 * temp_f0) + (temp_f2 * temp_f2)) < 40000.0f) {
if (((height * height) + (temp_f2 * temp_f2)) < 40000.0f) {
shell->state = RED_SHELL_LOCK_ON;
}
break;
@ -430,7 +430,7 @@ void update_actor_red_blue_shell(struct ShellActor *shell) {
shell->pos[0] = player->pos[0] + somePosVel[0];
shell->pos[1] = player->pos[1] + somePosVel[1];
shell->pos[2] = player->pos[2] + somePosVel[2];
func_802AD950(&shell->unk30, 4.0f, shell->pos[0], shell->pos[1], shell->pos[2], origPos[0], origPos[1], origPos[2]);
actor_terrain_collision(&shell->unk30, 4.0f, shell->pos[0], shell->pos[1], shell->pos[2], origPos[0], origPos[1], origPos[2]);
func_802B4E30((struct Actor *) shell);
}
break;
@ -450,11 +450,11 @@ void update_actor_red_blue_shell(struct ShellActor *shell) {
func_802B3B44(shell);
shell->targetPlayer = gPlayerPositionLUT[0];
player = &gPlayers[gPlayerPositionLUT[0]];
temp_f0 = player->pos[0];
temp_f0 -= shell->pos[0];
height = player->pos[0];
height -= shell->pos[0];
temp_f2 = player->pos[2];
temp_f2 -= shell->pos[2];
if (((temp_f0 * temp_f0) + (temp_f2 * temp_f2)) < 40000.0f) {
if (((height * height) + (temp_f2 * temp_f2)) < 40000.0f) {
shell->state = BLUE_SHELL_TARGET_ELIMINATED;
}
break;

View File

@ -36,7 +36,7 @@ void update_actor_fake_item_box(struct FakeItemBox *fake_item_box) {
fake_item_box->pos[0] = temp_v0_4->pos[0] - temp_f14;
fake_item_box->pos[1] = (temp_v0_4->pos[1] - temp_f16) - 1.0f;
fake_item_box->pos[2] = temp_v0_4->pos[2] - temp_f18;
func_802ADDC8(&fake_item_box->unk30, fake_item_box->boundingBoxSize, fake_item_box->pos[0], fake_item_box->pos[1], fake_item_box->pos[2]);
check_bounding_collision(&fake_item_box->unk30, fake_item_box->boundingBoxSize, fake_item_box->pos[0], fake_item_box->pos[1], fake_item_box->pos[2]);
func_802B4E30((struct Actor *)fake_item_box);
temp_v1_3 = &gControllers[temp_v1];
if ((temp_v0_4->type & 0x4000) != 0) {

View File

@ -13,25 +13,25 @@ void render_actor_falling_rock(Camera *camera, struct FallingRock *rock) {
Vec3s sp98;
Vec3f sp8C;
Mat4 sp4C;
f32 temp_f0;
f32 height;
UNUSED s32 pad[4];
if (rock->respawnTimer != 0) { return; }
temp_f0 = is_within_render_distance(camera->pos, rock->pos, camera->rot[1], 400.0f, gCameraZoom[camera - camera1], 4000000.0f);
height = is_within_render_distance(camera->pos, rock->pos, camera->rot[1], 400.0f, gCameraZoom[camera - camera1], 4000000.0f);
if (temp_f0 < 0.0f) { return; }
if (height < 0.0f) { return; }
if (temp_f0 < 250000.0f) {
if (height < 250000.0f) {
if (rock->unk30.unk34 == 1) {
sp8C[0] = rock->pos[0];
sp8C[2] = rock->pos[2];
temp_f0 = func_802ABE30(sp8C[0], rock->pos[1], sp8C[2], rock->unk30.unk3A);
height = calculate_surface_height(sp8C[0], rock->pos[1], sp8C[2], rock->unk30.meshIndexZX);
sp98[0] = 0;
sp98[1] = 0;
sp98[2] = 0;
sp8C[1] = temp_f0 + 2.0f;
sp8C[1] = height + 2.0f;
mtxf_pos_rotation_xyz(sp4C, sp8C, sp98);
if (render_set_position(sp4C, 0) == 0) {
return;

View File

@ -73,20 +73,20 @@ void update_actor_falling_rocks(struct FallingRock *rock) {
rock->pos[1] += rock->velocity[1];
rock->pos[2] += rock->velocity[2];
pad1 = rock->velocity[1];
func_802ADDC8(&rock->unk30, 10.0f, rock->pos[0], rock->pos[1], rock->pos[2]);
pad0 = rock->unk30.unk3C[2];
check_bounding_collision(&rock->unk30, 10.0f, rock->pos[0], rock->pos[1], rock->pos[2]);
pad0 = rock->unk30.surfaceDistance[2];
if (pad0 < 0.0f) {
unkVec[0] = -rock->unk30.orientationVector[0];
unkVec[1] = -rock->unk30.orientationVector[1];
unkVec[2] = -rock->unk30.orientationVector[2];
rock->pos[0] += unkVec[0] * rock->unk30.unk3C[2];
rock->pos[1] += unkVec[1] * rock->unk30.unk3C[2];
rock->pos[2] += unkVec[2] * rock->unk30.unk3C[2];
func_802AC114(unkVec, pad0, rock->velocity, 2.0f);
rock->pos[0] += unkVec[0] * rock->unk30.surfaceDistance[2];
rock->pos[1] += unkVec[1] * rock->unk30.surfaceDistance[2];
rock->pos[2] += unkVec[2] * rock->unk30.surfaceDistance[2];
adjust_pos_orthogonally(unkVec, pad0, rock->velocity, 2.0f);
rock->velocity[1] = -1.2f * pad1;
func_800C98B8(rock->pos, rock->velocity, SOUND_ARG_LOAD(0x19, 0x00, 0x80, 0x0F));
}
pad0 = rock->unk30.unk3C[0];
pad0 = rock->unk30.surfaceDistance[0];
if (pad0 < 0.0f) {
unkVec[1] = -rock->unk30.unk48[1];
if (unkVec[1] == 0.0f) {
@ -96,15 +96,15 @@ void update_actor_falling_rocks(struct FallingRock *rock) {
else {
unkVec[0] = -rock->unk30.unk48[0];
unkVec[2] = -rock->unk30.unk48[2];
rock->pos[0] += unkVec[0] * rock->unk30.unk3C[0];
rock->pos[1] += unkVec[1] * rock->unk30.unk3C[0];
rock->pos[2] += unkVec[2] * rock->unk30.unk3C[0];
func_802AC114(unkVec, pad0, rock->velocity, 2.0f);
rock->pos[0] += unkVec[0] * rock->unk30.surfaceDistance[0];
rock->pos[1] += unkVec[1] * rock->unk30.surfaceDistance[0];
rock->pos[2] += unkVec[2] * rock->unk30.surfaceDistance[0];
adjust_pos_orthogonally(unkVec, pad0, rock->velocity, 2.0f);
rock->velocity[1] = -1.2f * pad1;
func_800C98B8(rock->pos, rock->velocity, SOUND_ARG_LOAD(0x19, 0x00, 0x80, 0x0F));
}
}
pad0 = rock->unk30.unk3C[1];
pad0 = rock->unk30.surfaceDistance[1];
if (pad0 < 0.0f) {
unkVec[1] = -rock->unk30.unk54[1];
if (unkVec[1] == 0.0f) {
@ -113,11 +113,11 @@ void update_actor_falling_rocks(struct FallingRock *rock) {
else {
unkVec[0] = -rock->unk30.unk54[0];
unkVec[2] = -rock->unk30.unk54[2];
rock->pos[0] += unkVec[0] * rock->unk30.unk3C[1];
rock->pos[1] += unkVec[1] * rock->unk30.unk3C[1];
rock->pos[2] += unkVec[2] * rock->unk30.unk3C[1];
rock->pos[0] += unkVec[0] * rock->unk30.surfaceDistance[1];
rock->pos[1] += unkVec[1] * rock->unk30.surfaceDistance[1];
rock->pos[2] += unkVec[2] * rock->unk30.surfaceDistance[1];
pad1 = rock->velocity[1];
func_802AC114(unkVec, pad0, rock->velocity, 2.0f);
adjust_pos_orthogonally(unkVec, pad0, rock->velocity, 2.0f);
rock->velocity[1] = -1.2f * pad1;
func_800C98B8(rock->pos, rock->velocity, SOUND_ARG_LOAD(0x19, 0x00, 0x80, 0x0F));
}

View File

@ -18,27 +18,27 @@ void update_actor_green_shell(struct ShellActor *shell) {
f32 var_f2;
struct Controller *controller;
TripleShellParent *parent;
UNUSED f32 pad0;
UNUSED f32 pad1;
f32 height;
f32 z;
UNUSED f32 pad2;
UNUSED f32 pad3;
UNUSED f32 pad4;
UNUSED f32 pad5;
UNUSED f32 pad6;
f32 y;
UNUSED f32 pad7;
UNUSED f32 pad8;
pad0 = shell->pos[0];
pad6 = shell->pos[1];
pad1 = shell->pos[2];
if ((pad1 < gCourseMinZ) || (gCourseMaxZ < pad1) || (pad0 < gCourseMinX) || (gCourseMaxX < pad0) || (pad6 < gCourseMinY)) {
height = shell->pos[0];
y = shell->pos[1];
z = shell->pos[2];
if ((z < gCourseMinZ) || (gCourseMaxZ < z) || (height < gCourseMinX) || (gCourseMaxX < height) || (y < gCourseMinY)) {
destroy_destructable_actor((struct Actor *) shell);
}
shell->rotVelocity += 0x71C;
switch (shell->state) {
case HELD_SHELL:
player = &gPlayers[shell->playerId];
copy_collision(&player->unk_110, &shell->unk30);
copy_collision(&player->collision, &shell->unk30);
somePosVel[0] = 0.0f;
somePosVel[1] = player->boundingBoxSize;
somePosVel[2] = -(player->boundingBoxSize + shell->boundingBoxSize + 2.0f);
@ -46,10 +46,10 @@ void update_actor_green_shell(struct ShellActor *shell) {
shell->pos[0] = player->pos[0] + somePosVel[0];
pad2 = player->pos[1] - somePosVel[1];
shell->pos[2] = player->pos[2] + somePosVel[2];
pad0 = func_802ABE30(shell->pos[0], pad2, shell->pos[2], player->unk_110.unk3A);
pad1 = pad2 - pad0;
if ((pad1 < 5.0f) && (pad1 > -5.0f)) {
shell->pos[1] = shell->boundingBoxSize + pad0;
height = calculate_surface_height(shell->pos[0], pad2, shell->pos[2], player->collision.meshIndexZX);
z = pad2 - height;
if ((z < 5.0f) && (z > -5.0f)) {
shell->pos[1] = shell->boundingBoxSize + height;
} else {
shell->pos[1] = pad2;
}
@ -145,9 +145,9 @@ void update_actor_green_shell(struct ShellActor *shell) {
shell->pos[0] += shell->velocity[0];
shell->pos[1] += shell->velocity[1];
shell->pos[2] += shell->velocity[2];
func_802AD950(&shell->unk30, 4.0f, shell->pos[0], shell->pos[1], shell->pos[2], somePos2[0], somePos2[1], somePos2[2]);
actor_terrain_collision(&shell->unk30, 4.0f, shell->pos[0], shell->pos[1], shell->pos[2], somePos2[0], somePos2[1], somePos2[2]);
func_802B4E30((struct Actor *) shell);
if ((shell->unk30.unk3C[0] < 0.0f) || (shell->unk30.unk3C[1] < 0.0f)) {
if ((shell->unk30.surfaceDistance[0] < 0.0f) || (shell->unk30.surfaceDistance[1] < 0.0f)) {
shell_collision(&shell->unk30, shell->velocity);
func_800C98B8(shell->pos, shell->velocity, SOUND_ARG_LOAD(0x19, 0x00, 0x80, 0x54));
shell->flags |= 0x80;
@ -170,7 +170,7 @@ void update_actor_green_shell(struct ShellActor *shell) {
shell->pos[0] = player->pos[0] + somePosVel[0];
shell->pos[1] = player->pos[1] + somePosVel[1];
shell->pos[2] = player->pos[2] + somePosVel[2];
func_802AD950(&shell->unk30, 4.0f, shell->pos[0], shell->pos[1], shell->pos[2], somePos2[0], somePos2[1], somePos2[2]);
actor_terrain_collision(&shell->unk30, 4.0f, shell->pos[0], shell->pos[1], shell->pos[2], somePos2[0], somePos2[1], somePos2[2]);
func_802B4E30((struct Actor *) shell);
}
break;

View File

@ -18,13 +18,13 @@ void update_actor_kiwano_fruit(struct KiwanoFruit *fruit) {
s32 nearestWaypoint;
player = &gPlayers[fruit->targetPlayer];
if (((player->type & PLAYER_KART_AI) != 0) || (player->unk_110.unk34 == 0)) {
if (((player->type & PLAYER_KART_AI) != 0) || (player->collision.unk34 == 0)) {
fruit->state = 0;
return;
}
switch (fruit->state) { /* irregular */
case 0:
if ((get_surface_type(player->unk_110.unk3A) & 0xFF) != GRASS) {
if ((get_surface_type(player->collision.meshIndexZX) & 0xFF) != GRASS) {
return;
}
fruit->state = 1;

View File

@ -26,14 +26,6 @@
#define ADSR_GOTO -2
#define ADSR_RESTART -3
// Envelopes are always stored as big endian, to match sequence files which are
// byte blobs and can embed envelopes. Hence this byteswapping macro.
#if IS_BIG_ENDIAN
#define BSWAP16(x) (x)
#else
#define BSWAP16(x) (((x) & 0xff) << 8 | (((x) >> 8) & 0xff))
#endif
void sequence_channel_process_sound(struct SequenceChannel *seqChannel, s32 recalculateVolume);
void sequence_player_process_sound(struct SequencePlayer *seqPlayer);
f32 get_portamento_freq_scale(struct Portamento *p);

View File

@ -230,11 +230,11 @@ char external_unused_string_eu_03[] = "SE FADE OUT TIME %d\n";
#endif
#ifdef VERSION_EU
#define AUDIO_LEFT_TYRE FRONT_LEFT_TYRE
#define AUDIO_RIGHT_TYRE FRONT_RIGHT_TYRE
#define AUDIO_LEFT_TYRE FRONT_LEFT
#define AUDIO_RIGHT_TYRE FRONT_RIGHT
#else
#define AUDIO_LEFT_TYRE BACK_LEFT_TYRE
#define AUDIO_RIGHT_TYRE BACK_RIGHT_TYRE
#define AUDIO_LEFT_TYRE BACK_LEFT
#define AUDIO_RIGHT_TYRE BACK_RIGHT
#endif
// Requires void in the argument list to match properly.
@ -674,8 +674,8 @@ void func_800C2474(void) {
D_800E9E74[var_v0] = 0;
D_800E9E84[var_v0] = 0;
D_800E9E94[var_v0] = 0;
gPlayers[var_v0].boundingBoxCorners[AUDIO_LEFT_TYRE ].surfaceType = 0;
gPlayers[var_v0].boundingBoxCorners[AUDIO_RIGHT_TYRE].surfaceType = 0;
gPlayers[var_v0].tyres[AUDIO_LEFT_TYRE ].surfaceType = 0;
gPlayers[var_v0].tyres[AUDIO_RIGHT_TYRE].surfaceType = 0;
gPlayers[var_v0].effects = 0;
gPlayers[var_v0].unk_20C = 0.0f;
gPlayers[var_v0].unk_0C0 = 0;
@ -1933,15 +1933,15 @@ void func_800C5E38(u8 playerId) {
}
void func_800C6108(u8 playerId) {
Player *temp_v1;
Player *player;
temp_v1 = &gPlayers[playerId];
D_800E9E64[playerId] = (temp_v1->unk_098 / D_800E9DC4[playerId]) + D_800E9DD4[playerId];
if ((temp_v1->unk_098 < 1800.0f) && ((temp_v1->unk_044 & 0x20) != 0x20)) {
D_800E9E64[playerId] = (temp_v1->unk_098 / D_800E9F7C[playerId].unk_34) + D_800E9F7C[playerId].unk_28;
player = &gPlayers[playerId];
D_800E9E64[playerId] = (player->unk_098 / D_800E9DC4[playerId]) + D_800E9DD4[playerId];
if ((player->unk_098 < 1800.0f) && ((player->unk_044 & 0x20) != 0x20)) {
D_800E9E64[playerId] = (player->unk_098 / D_800E9F7C[playerId].unk_34) + D_800E9F7C[playerId].unk_28;
if(D_800E9EC4){} // ?
}
if (temp_v1->unk_094 > 4.75f) {
if (player->unk_094 > 4.75f) {
if (D_800E9EB4[playerId] < (D_800E9F7C[playerId].unk_18 + 0.4f)) {
D_800E9DE4[playerId] += 0.005f;
}
@ -1949,11 +1949,11 @@ void func_800C6108(u8 playerId) {
D_800E9DE4[playerId] = 0.0f;
}
if (gPlayers[playerId].unk_0C0 > 0) {
D_800E9E54[playerId] = (f32) temp_v1->unk_0C0;
D_800E9E54[playerId] = (f32) player->unk_0C0;
} else {
D_800E9E54[playerId] = (f32) -temp_v1->unk_0C0;
D_800E9E54[playerId] = (f32) -player->unk_0C0;
}
if ((temp_v1->effects & 0x10) == 0x10) {
if ((player->effects & 0x10) == 0x10) {
D_800E9EB4[playerId] = D_800E9E64[playerId] + D_800E9DE4[playerId];
} else {
D_800E9EB4[playerId] = D_800E9E64[playerId] + D_800E9DE4[playerId] - (D_800E9E54[playerId] / 12000.0f);
@ -2196,7 +2196,7 @@ void func_800C70A8(u8 playerId) {
D_800E9E74[playerId] = 0;
if ((D_800E9E54[playerId] > 3500.0f) || ((gPlayers[playerId].effects & 0x10) == 0x10)) {
D_800E9E74[playerId] = 1;
switch (gPlayers[playerId].boundingBoxCorners[AUDIO_LEFT_TYRE].surfaceType) {
switch (gPlayers[playerId].tyres[AUDIO_LEFT_TYRE].surfaceType) {
case DIRT: /* switch 1 */
D_800E9E74[playerId] = 0x0000000D;
break;
@ -2228,7 +2228,7 @@ void func_800C70A8(u8 playerId) {
}
if ((gPlayers[playerId].effects & 0x10) == 0x10) {
D_800E9E74[playerId] = 2;
switch (gPlayers[playerId].boundingBoxCorners[AUDIO_LEFT_TYRE].surfaceType) { /* switch 2 */
switch (gPlayers[playerId].tyres[AUDIO_LEFT_TYRE].surfaceType) { /* switch 2 */
case DIRT: /* switch 2 */
D_800E9E74[playerId] = 0x0000000D;
break;
@ -2258,7 +2258,7 @@ void func_800C70A8(u8 playerId) {
break;
}
}
switch (gPlayers[playerId].boundingBoxCorners[AUDIO_LEFT_TYRE].surfaceType) { /* switch 3 */
switch (gPlayers[playerId].tyres[AUDIO_LEFT_TYRE].surfaceType) { /* switch 3 */
case GRASS: /* switch 3 */
if (D_800E9E74[playerId] == 6) {
D_800E9E74[playerId] = 4;
@ -2318,7 +2318,7 @@ void func_800C70A8(u8 playerId) {
D_800E9E74[playerId] = 0x0000001B;
break;
}
switch (gPlayers[playerId].boundingBoxCorners[AUDIO_RIGHT_TYRE].surfaceType) { /* switch 4 */
switch (gPlayers[playerId].tyres[AUDIO_RIGHT_TYRE].surfaceType) { /* switch 4 */
case GRASS: /* switch 4 */
if (D_800E9E74[playerId] == 5) {
D_800E9E74[playerId] = 4;

View File

@ -641,23 +641,23 @@ void func_8001E0C4(Camera *camera, Player *player, s8 arg2) {
adjust_angle(&camera->unk_2C, player->rotation[1], var_a2);
func_8001CA78(player, camera, sp60, &sp74, &sp70, &sp6C, camera->unk_2C, arg2);
camera->someBitFlags &= ~0x0004;
temp_t7 = func_802ADDC8(&camera->unk_54, test, sp74, sp70, sp6C);
if (camera->unk_54.unk3C[2] < 0.0f) {
sp74 += -camera->unk_54.orientationVector[0] * camera->unk_54.unk3C[2] * 1;
sp70 += -camera->unk_54.orientationVector[1] * camera->unk_54.unk3C[2] * 0.5;
sp6C += -camera->unk_54.orientationVector[2] * camera->unk_54.unk3C[2] * 1;
temp_t7 = check_bounding_collision(&camera->collision, test, sp74, sp70, sp6C);
if (camera->collision.surfaceDistance[2] < 0.0f) {
sp74 += -camera->collision.orientationVector[0] * camera->collision.surfaceDistance[2] * 1;
sp70 += -camera->collision.orientationVector[1] * camera->collision.surfaceDistance[2] * 0.5;
sp6C += -camera->collision.orientationVector[2] * camera->collision.surfaceDistance[2] * 1;
}
if (camera->unk_54.unk3C[0] < 0.0f) {
if (camera->collision.surfaceDistance[0] < 0.0f) {
camera->someBitFlags = camera->someBitFlags | 4 | 2;
sp74 += -camera->unk_54.unk48[0] * camera->unk_54.unk3C[0] * 1.5;
sp70 += -camera->unk_54.unk48[1] * camera->unk_54.unk3C[0] * 1;
sp6C += -camera->unk_54.unk48[2] * camera->unk_54.unk3C[0] * 1.5;
sp74 += -camera->collision.unk48[0] * camera->collision.surfaceDistance[0] * 1.5;
sp70 += -camera->collision.unk48[1] * camera->collision.surfaceDistance[0] * 1;
sp6C += -camera->collision.unk48[2] * camera->collision.surfaceDistance[0] * 1.5;
}
if (camera->unk_54.unk3C[1] < 0.0f) {
if (camera->collision.surfaceDistance[1] < 0.0f) {
camera->someBitFlags = camera->someBitFlags | 4 | 2;
sp74 += -camera->unk_54.unk54[0] * camera->unk_54.unk3C[1] * 1.5;
sp70 += -camera->unk_54.unk54[1] * camera->unk_54.unk3C[1] * 1;
sp6C += -camera->unk_54.unk54[2] * camera->unk_54.unk3C[1] * 1.5;
sp74 += -camera->collision.unk54[0] * camera->collision.surfaceDistance[1] * 1.5;
sp70 += -camera->collision.unk54[1] * camera->collision.surfaceDistance[1] * 1;
sp6C += -camera->collision.unk54[2] * camera->collision.surfaceDistance[1] * 1.5;
}
if ((temp_t7 == 0) && ((camera->someBitFlags & 2) != 2)) {
camera->unk_AC = camera->unk_2C;
@ -740,7 +740,7 @@ void func_8001E45C(Camera *camera, Player *player, s8 arg2) {
if (((player->effects & 0x80) == 0x80) || ((player->effects & 0x40) == 0x40) ||
((player->effects & 0x4000) == 0x4000) || ((player->effects & 0x80000) == 0x80000) ||
((player->effects & 0x800000) == 0x800000) || (((player->effects & 0x20) == 0x20) && (player->unk_078 != 0)) ||
(player->unk_110.unk3C[0] <= 0.0f) || (player->unk_110.unk3C[1] <= 0.0f) || ((player->effects & 0x20000) == 0x20000)) {
(player->collision.surfaceDistance[0] <= 0.0f) || (player->collision.surfaceDistance[1] <= 0.0f) || ((player->effects & 0x20000) == 0x20000)) {
func_8001CCEC(player, camera, sp64, &sp84, &sp80, &sp7C, &sp58, (s32) camera->unk_2C, (s32) arg2);
} else {
adjust_angle(&camera->unk_2C, (s16) (player->rotation[1] + camera->unk_B0), var_a3);
@ -748,7 +748,7 @@ void func_8001E45C(Camera *camera, Player *player, s8 arg2) {
}
temp = 3;
camera->someBitFlags &= 0xFFFB;
func_802ADDC8(&camera->unk_54, temp, sp84, sp80, sp7C);
check_bounding_collision(&camera->collision, temp, sp84, sp80, sp7C);
camera->pos[0] = sp84;
camera->pos[1] = sp80;
@ -783,7 +783,7 @@ void func_8001E8E8(Camera *camera, Player *player, s8 arg2) {
camera->unk_B0 = 0;
camera->unk_2C = player->rotation[1];
func_8001D53C(player, camera, sp5C, &sp7C, &sp78, &sp74, (s16) (s32) player->rotation[1], (s16) (s32) arg2);
func_802ADDC8(&camera->unk_54, 5.0f, sp7C, sp78, sp74);
check_bounding_collision(&camera->collision, 5.0f, sp7C, sp78, sp74);
camera->lookAt[0] = sp5C[0];
camera->lookAt[1] = sp5C[1];
camera->lookAt[2] = sp5C[2];
@ -862,7 +862,7 @@ void func_8001EA0C(Camera *camera, Player *player, s8 arg2) {
if (((player->effects & 0x80) == 0x80) || ((player->effects & 0x40) == 0x40) ||
((player->effects & 0x4000) == 0x4000) || ((player->effects & 0x80000) == 0x80000) ||
((player->effects & 0x800000) == 0x800000) || (((player->effects & 0x20) == 0x20) && (player->unk_078 != 0)) ||
(player->unk_110.unk3C[0] <= 0.0f) || (player->unk_110.unk3C[1] <= 0.0f) || ((player->effects & 0x20000) == 0x20000)) {
(player->collision.surfaceDistance[0] <= 0.0f) || (player->collision.surfaceDistance[1] <= 0.0f) || ((player->effects & 0x20000) == 0x20000)) {
func_8001D944(player, camera, sp64, &sp84, &sp80, &sp7C, &sp58, (s32) camera->unk_2C, (s32) arg2);
} else {
adjust_angle(&camera->unk_2C, (s16) (player->rotation[1] + camera->unk_B0), var_a3);
@ -870,7 +870,7 @@ void func_8001EA0C(Camera *camera, Player *player, s8 arg2) {
}
temp = 3;
camera->someBitFlags &= 0xFFFB;
func_802ADDC8(&camera->unk_54, temp, sp84, sp80, sp7C);
check_bounding_collision(&camera->collision, temp, sp84, sp80, sp7C);
camera->pos[0] = sp84;
camera->pos[1] = sp80;

View File

@ -40,7 +40,7 @@ typedef struct {
/* 0x48 */ s32 unk_48;
/* 0x4C */ s32 unk_4C;
/* 0x50 */ s32 unk_50;
/* 0x54 */ Collision unk_54;
/* 0x54 */ Collision collision;
// When you hit a wall (or another driver) the camera's pos and lookAt bounce up and down. This is the velocity(?) of that bouncing
/* 0x94 */ UnkCameraInner unk_94;
// Timer for wall-hit bounce. Counts up instead of down

View File

@ -72,10 +72,10 @@ s16 gCreditsCourseId = COURSE_LUIGI_RACEWAY;
s16 gPlaceItemBoxes = 1;
// Technically a pointer to an array, but declaring it so creates regalloc issues.
mk64_surface_map_ram *gSurfaceMap;
u16 *D_8015F584;
u16 D_8015F588; // Number of entries in gSurfaceMap
u16 D_8015F58A;
CollisionTriangle *gCollisionMesh;
u16 *gCollisionIndices;
u16 gCollisionMeshCount;
u16 gNumCollisionTriangles;
u32 D_8015F58C;
Vec3f D_8015F590;
@ -311,7 +311,7 @@ void func_80003040(void) {
case COURSE_MARIO_RACEWAY:
struct ActorSpawnData *a_d_course_mario_raceway_tree_spawns = (struct ActorSpawnData *) LOAD_ASSET(d_course_mario_raceway_tree_spawns);
dma_textures(gTextureTrees1, 0x35B, 0x800);
//spawn_foliage(a_d_course_mario_raceway_tree_spawns);
spawn_foliage(a_d_course_mario_raceway_tree_spawns);
break;
case COURSE_BOWSER_CASTLE:
// d_course_bowsers_castle_packed_dl_1350

View File

@ -67,10 +67,10 @@ extern s32 gIsMirrorMode; // D_800DC604
extern s16 gCreditsCourseId;
extern s16 gPlaceItemBoxes;
extern mk64_surface_map_ram *gSurfaceMap;
extern u16 *D_8015F584;
extern u16 D_8015F588;
extern u16 D_8015F58A;
extern CollisionTriangle *gCollisionMesh;
extern u16 *gCollisionIndices;
extern u16 gCollisionMeshCount;
extern u16 gNumCollisionTriangles;
extern u32 D_8015F58C;
extern Vec3f D_8015F590;

View File

@ -54,7 +54,7 @@ Vec3f D_80162FA0;
Vec3f D_80162FB0;
Vec3f D_80162FC0;
s16 D_80162FCC;
s16 D_80162FCE;
s16 sSomeNearestWaypoint;
s16 D_80162FD0;
f32 gCourseCompletionPercentByRank[NUM_PLAYERS];
/*
@ -132,7 +132,7 @@ s16 D_8016348C;
s16 D_80163490[12];
s16 D_801634A8[12];
s16 D_801634C0[12];
s16 D_801634D8[10];
s16 bStopAICrossing[10];
s16 D_801634EC;
s32 D_801634F0;
s32 D_801634F4;
@ -140,8 +140,8 @@ Test D_801634F8[10];
PathNoY *D_80163598;
s32 D_8016359C;
TrainStuff gTrainList[NUM_TRAINS];
u16 isCrossingTriggeredByIndex[2];
u16 D_801637BC[2];
u16 isCrossingTriggeredByIndex[NUM_CROSSINGS];
u16 sCrossingActiveTimer[NUM_CROSSINGS];
PaddleBoatStuff gPaddleBoats[NUM_PADDLE_BOATS];
VehicleStuff gBoxTruckList[NUM_RACE_BOX_TRUCKS];
VehicleStuff gSchoolBusList[NUM_RACE_SCHOOL_BUSES];
@ -601,61 +601,69 @@ void func_80006114(Vec3f arg0, Vec3f arg1, s16 arg2) {
arg0[2] = arg1[2] + temp2;
}
s32 func_800061DC(Vec3f arg0, f32 arg1, s32 arg2) {
Camera *var_a0_2;
Player *var_a0;
f32 temp_f0;
f32 temp_f2;
f32 temp_f12;
f32 temp_f14;
s32 var_a1;
s32 var_v1;
s8 var_v0;
s32 set_vehicle_render_distance_flags(Vec3f vehiclePos, f32 renderDistance, s32 flags) {
Camera *camera;
Player *player;
f32 x;
f32 z;
f32 playerX;
f32 playerZ;
s32 i;
s32 flag;
s8 numScreens;
temp_f0 = arg0[0];
temp_f2 = arg0[2];
x = vehiclePos[0];
z = vehiclePos[2];
switch (gActiveScreenMode) {
case SCREEN_MODE_1P:
var_v0 = 1;
numScreens = 1;
break;
case SCREEN_MODE_2P_SPLITSCREEN_HORIZONTAL:
case SCREEN_MODE_2P_SPLITSCREEN_VERTICAL:
var_v0 = 2;
numScreens = 2;
break;
case SCREEN_MODE_3P_4P_SPLITSCREEN:
var_v0 = gPlayerCount;
numScreens = gPlayerCount;
break;
default:
var_v0 = 1;
numScreens = 1;
break;
}
var_v1 = arg2;
flag = flags;
if (!gDemoMode) {
var_a0 = gPlayerOne;
for(var_a1 = 0; var_a1 < gPlayerCount; var_a1++, var_a0++) {
if (((var_a0->type & 0x4000) != 0) && ((var_a0->type & 0x1000) == 0)) {
temp_f12 = var_a0->pos[0];
temp_f14 = var_a0->pos[2];
if (((temp_f12 - arg1) < temp_f0) && (temp_f0 < (temp_f12 + arg1)) && ((temp_f14 - arg1) < temp_f2) && (temp_f2 < (temp_f14 + arg1))) {
var_v1 |= (1 << var_a1);
player = gPlayerOne;
// Checks distance from each player.
for(i = 0; i < gPlayerCount; i++, player++) {
if (((player->type & PLAYER_HUMAN) != 0) && ((player->type & PLAYER_KART_AI) == 0)) {
playerX = player->pos[0];
playerZ = player->pos[2];
// Is player within render distance
if (((playerX - renderDistance) < x) &&
((playerX + renderDistance) > x) &&
((playerZ - renderDistance) < z) &&
((playerZ + renderDistance) > z)) {
// Sets the render flag to on for each player.
flag |= (RENDER_VEHICLE << i);
} else {
var_v1 &= ~(1 << var_a1);
// Sets the render flag to off for each player.
flag &= ~(RENDER_VEHICLE << i);
}
}
}
} else {
var_a0_2 = camera1;
for(var_a1 = 0; var_a1 < var_v0; var_a1++, var_a0_2++) {
temp_f12 = var_a0_2->pos[0];
temp_f14 = var_a0_2->pos[2];
if (((temp_f12 - arg1) < temp_f0) && (temp_f0 < (temp_f12 + arg1)) && ((temp_f14 - arg1) < temp_f2) && (temp_f2 < (temp_f14 + arg1))) {
var_v1 |= (1 << var_a1);
} else { // Demo cinematic uses the camera to check render distance
camera = camera1;
for(i = 0; i < numScreens; i++, camera++) {
playerX = camera->pos[0];
playerZ = camera->pos[2];
if (((playerX - renderDistance) < x) && (x < (playerX + renderDistance)) && ((playerZ - renderDistance) < z) && (z < (playerZ + renderDistance))) {
flag |= (RENDER_VEHICLE << i);
} else {
var_v1 &= ~(1 << var_a1);
flag &= ~(RENDER_VEHICLE << i);
}
}
}
return var_v1;
return flag;
}
void func_800065D0(s32 playerId, Player *player) {
@ -995,7 +1003,7 @@ void func_80007D04(s32 playerId, Player* player) {
D_801634C0[playerId] = 2;
} else {
player->effects &= ~0x200000;
func_80031F48(player, 1.0f);
decelerate_ai_player(player, 1.0f);
D_801634C0[playerId] = -1;
}
}
@ -1012,35 +1020,35 @@ void func_80007FA4(s32 arg0, Player *player, f32 arg2) {
if (arg0 == 3) {
if ((temp_f12 < 25.0f) && (D_80163410[arg0] < 5)) {
D_80163410[arg0] = 4;
(arg2 < ((2.0 * 18.0) / 216.0)) ? func_80038BE4(player, 1) : func_80031F48(player, 1.0f);
(arg2 < ((2.0 * 18.0) / 216.0)) ? func_80038BE4(player, 1) : decelerate_ai_player(player, 1.0f);
} else if ((temp_f12 < 3600.0f) && (D_80163410[arg0] < 4)) {
D_80163410[arg0] = 3;
(arg2 < ((5.0 * 18.0) / 216.0)) ? func_80038BE4(player, 1) : func_80031F48(player, 5.0f);
(arg2 < ((5.0 * 18.0) / 216.0)) ? func_80038BE4(player, 1) : decelerate_ai_player(player, 5.0f);
} else {
(arg2 < ((20.0 * 18.0) / 216.0)) ? func_80038BE4(player, 10) : func_80031F48(player, 1.0f);
(arg2 < ((20.0 * 18.0) / 216.0)) ? func_80038BE4(player, 10) : decelerate_ai_player(player, 1.0f);
}
} else {
if ((temp_f12 < 25.0f) && (D_80163410[arg0] < 5)) {
D_80163410[arg0] = 4;
test = 2;
(arg2 < ((test * 18.0) / 216.0)) ? func_80038BE4(player, 1) : func_80031F48(player, 1.0f);
(arg2 < ((test * 18.0) / 216.0)) ? func_80038BE4(player, 1) : decelerate_ai_player(player, 1.0f);
} else if ((temp_f12 < 4900.0f) && (D_80163410[arg0] < 4)) {
D_80163410[arg0] = 3;
test = 5;
(arg2 < ((test * 18.0) / 216.0)) ? func_80038BE4(player, 1) : func_80031F48(player, 15.0f);
(arg2 < ((test * 18.0) / 216.0)) ? func_80038BE4(player, 1) : decelerate_ai_player(player, 15.0f);
} else if ((temp_f12 < 22500.0f) && (D_80163410[arg0] < 3)) {
D_80163410[arg0] = 2;
test = 20;
(arg2 < ((test * 18.0) / 216.0)) ? func_80038BE4(player, 5) : func_80031F48(player, 1.0f);
(arg2 < ((test * 18.0) / 216.0)) ? func_80038BE4(player, 5) : decelerate_ai_player(player, 1.0f);
} else if ((temp_f12 < 90000.0f) && (D_80163410[arg0] < 2)) {
D_80163410[arg0] = 1;
test = 30;
(arg2 < ((test * 18.0) / 216.0)) ? func_80038BE4(player, 6) : func_80031F48(player, 1.0f);
(arg2 < ((test * 18.0) / 216.0)) ? func_80038BE4(player, 6) : decelerate_ai_player(player, 1.0f);
} else if (D_80163410[arg0] == 0) {
test = 35;
(arg2 < (((test^0) * 18.0) / 216.0)) ? func_80038BE4(player, 2) : func_80031F48(player, 1.0f);
(arg2 < (((test^0) * 18.0) / 216.0)) ? func_80038BE4(player, 2) : decelerate_ai_player(player, 1.0f);
} else {
func_80031F48(player, 1.0f);
decelerate_ai_player(player, 1.0f);
}
}
}
@ -1061,8 +1069,8 @@ void func_80008424(s32 playerId, f32 arg1, Player *player) {
!(player->soundEffects & 4)) {
if (gCurrentCourseId == COURSE_AWARD_CEREMONY) {
func_80007FA4(playerId, player, var_f2);
} else if ((D_801634D8[playerId] == 1) && !(player->effects & (STAR_EFFECT | BOO_EFFECT))) {
func_80031F48(player, 10.0f);
} else if ((bStopAICrossing[playerId] == 1) && !(player->effects & (STAR_EFFECT | BOO_EFFECT))) {
decelerate_ai_player(player, 10.0f);
if (player->currentSpeed == 0.0) {
player->velocity[0] = 0.0f;
player->velocity[2] = 0.0f;
@ -1089,7 +1097,7 @@ void func_80008424(s32 playerId, f32 arg1, Player *player) {
player_speed(player);
} else {
player->effects &= ~0x00200000;
func_80031F48(player, 1.0f);
decelerate_ai_player(player, 1.0f);
}
} else if ((D_801631E0[playerId] == 1) && (D_80163330[playerId] != 1)) {
if (func_800088D8(playerId, gLapCountByPlayerId[playerId], D_80164408[playerId]) == 1) {
@ -1097,7 +1105,7 @@ void func_80008424(s32 playerId, f32 arg1, Player *player) {
player_speed(player);
} else {
player->effects &= ~0x00200000;
func_80031F48(player, 1.0f);
decelerate_ai_player(player, 1.0f);
}
} else {
var_a1 = 1;
@ -1132,14 +1140,14 @@ void func_80008424(s32 playerId, f32 arg1, Player *player) {
player_speed(player);
} else {
player->effects &= ~0x00200000;
func_80031F48(player, 1.0f);
decelerate_ai_player(player, 1.0f);
}
} else {
player->effects &= ~0x00200000;
if (arg1 > 1.0f) {
func_80031F48(player, 2.0f);
decelerate_ai_player(player, 2.0f);
} else {
func_80031F48(player, 5.0f);
decelerate_ai_player(player, 5.0f);
}
}
}
@ -1312,10 +1320,10 @@ s32 func_80008E58(s32 payerId, s32 pathIndex) {
posY = player->pos[1];
posZ = player->pos[2];
stackPadding = pathIndex;
trackSegment = func_802ABD40(player->unk_110.unk3A);
trackSegment = get_section_id(player->collision.meshIndexZX);
D_80163318[payerId] = trackSegment;
D_80162FCE = func_8000C0BC(posX, posY, posZ, trackSegment, &pathIndex);
gNearestWaypointByPlayerId[payerId] = D_80162FCE;
sSomeNearestWaypoint = func_8000C0BC(posX, posY, posZ, trackSegment, &pathIndex);
gNearestWaypointByPlayerId[payerId] = sSomeNearestWaypoint;
if(pathIndex) {};
gPathIndexByPlayerId[payerId] = pathIndex;
func_80008DC0(pathIndex);
@ -1326,7 +1334,7 @@ s32 func_80008E58(s32 payerId, s32 pathIndex) {
void func_80008F38(s32 playerId) {
f32 temp_f0;
D_80164450[playerId] = (gLapCountByPlayerId[playerId] * gWaypointCountByPathIndex[0]) + D_80162FCE;
D_80164450[playerId] = (gLapCountByPlayerId[playerId] * gWaypointCountByPathIndex[0]) + sSomeNearestWaypoint;
temp_f0 = (f32) gNearestWaypointByPlayerId[playerId] / (f32) gWaypointCountByPathIndex[gPathIndexByPlayerId[playerId]];
gLapCompletionPercentByPlayerId[playerId] = temp_f0;
gCourseCompletionPercentByPlayerId[playerId] = temp_f0;
@ -1337,26 +1345,26 @@ void func_80009000(s32 playerId) {
s16 temp_v0;
temp_v0 = D_801644F8[playerId];
if (D_80162FCE >= 0x6D) {
if (sSomeNearestWaypoint >= 0x6D) {
D_801644F8[playerId] = 1;
switch (D_80163448) {
case 0:
if (D_80162FCE >= 0x20F) {
if (sSomeNearestWaypoint >= 0x20F) {
D_801644F8[playerId] = 0;
}
break;
case 1:
if (D_80162FCE >= 0x206) {
if (sSomeNearestWaypoint >= 0x206) {
D_801644F8[playerId] = 0;
}
break;
case 2:
if (D_80162FCE >= 0x211) {
if (sSomeNearestWaypoint >= 0x211) {
D_801644F8[playerId] = 0;
}
break;
case 3:
if (D_80162FCE >= 0x283) {
if (sSomeNearestWaypoint >= 0x283) {
D_801644F8[playerId] = 0;
}
break;
@ -1381,15 +1389,15 @@ void func_800090F0(s32 playerId, Player *player) {
posZ = player->pos[2];
if (D_80163490[playerId] == 1) {
D_80163448 = func_80008E58(playerId, random_int(4U));
D_80162FCE = func_8000CD24(posX, posY, posZ, 0, player, playerId, D_80163448);
gNearestWaypointByPlayerId[playerId] = D_80162FCE;
sSomeNearestWaypoint = func_8000CD24(posX, posY, posZ, 0, player, playerId, D_80163448);
gNearestWaypointByPlayerId[playerId] = sSomeNearestWaypoint;
func_80008F38(playerId);
D_80163490[playerId] = 0;
}
if (D_801634A8[playerId] == 1) {
D_80163448 = func_80008E58(playerId, 0);
D_80162FCE = func_8000CD24(posX, posY, posZ, 0, player, playerId, D_80163448);
gNearestWaypointByPlayerId[playerId] = D_80162FCE;
sSomeNearestWaypoint = func_8000CD24(posX, posY, posZ, 0, player, playerId, D_80163448);
gNearestWaypointByPlayerId[playerId] = sSomeNearestWaypoint;
func_80008F38(playerId);
D_801634A8[playerId] = 0;
}
@ -1401,8 +1409,7 @@ void func_800090F0(s32 playerId, Player *player) {
f32 func_80009258(UNUSED s32 playerId, f32 arg1, f32 arg2) {
f32 temp_f2 = D_8016344C - arg2;
f32 temp_f12 = arg1 - D_8016344C;
return gCourseTimer - ( (0.01666666f * temp_f2) / (temp_f2 + temp_f12) );
return gCourseTimer - ( (COURSE_TIMER_ITER * temp_f2) / (temp_f2 + temp_f12) );
}
#ifdef NON_MATCHING
@ -1423,18 +1430,18 @@ void func_8000929C(s32 playerId, Player *player) {
tempPos2 = player->pos[2];
D_801630E2 = 0;
D_80163240[playerId] = 0;
D_80162FCE = func_8000CD24(tempPos0, tempPos1, tempPos2, gNearestWaypointByPlayerId[playerId], player, playerId, D_80163448);
D_801630E0 = D_80162FCE;
if (gNearestWaypointByPlayerId[playerId] != D_80162FCE) {
gNearestWaypointByPlayerId[playerId] = D_80162FCE;
sSomeNearestWaypoint = func_8000CD24(tempPos0, tempPos1, tempPos2, gNearestWaypointByPlayerId[playerId], player, playerId, D_80163448);
D_801630E0 = sSomeNearestWaypoint;
if (gNearestWaypointByPlayerId[playerId] != sSomeNearestWaypoint) {
gNearestWaypointByPlayerId[playerId] = sSomeNearestWaypoint;
D_801630E2 = 1;
func_80008F38(playerId);
}
if (gCurrentCourseId == 0x0014) {
func_8000B95C(playerId, D_80162FCE, D_80163448);
func_8000B95C(playerId, sSomeNearestWaypoint, D_80163448);
return;
}
if ((D_80162FCE < 0x14) || ((gWaypointCountByPathIndex[D_80163448] - 0x14) < D_80162FCE) || (gCurrentCourseId == 0x000B)) {
if ((sSomeNearestWaypoint < 0x14) || ((gWaypointCountByPathIndex[D_80163448] - 0x14) < sSomeNearestWaypoint) || (gCurrentCourseId == 0x000B)) {
var_v1 = 0;
var_t0 = 0;
if (gCurrentCourseId == 0x000B) {
@ -1468,10 +1475,10 @@ void func_8000929C(s32 playerId, Player *player) {
someTemp0 = D_80163450[playerId];
if ((var_v1 != 0) && (tempPos2 <= D_8016344C)) {
if (D_8016344C < someTemp0) {
gLapCountByPlayerId[playerId]++;
gLapCountByPlayerId[playerId]++;
if ((gModeSelection == 0) && (gLapCountByPlayerId[playerId] == 5)) {
if (D_80164408[playerId] == 7) {
for (var_v0 = 0; var_v0 < 8; var_v0++) { gLapCountByPlayerId[var_v0]--; }
for (var_v0 = 0; var_v0 < 8; var_v0++) { gLapCountByPlayerId[var_v0]--; }
}
}
D_80163240[playerId] = 1;
@ -1489,11 +1496,11 @@ void func_8000929C(s32 playerId, Player *player) {
}
}
D_80163450[playerId] = tempPos2;
if ((gCurrentCourseId == 4) && (D_801630E2 == 1)) {
func_80009000(playerId);
if (((player->type & 0x4000) == 0) || (player->type & 0x1000)) {
func_800090F0(playerId, player);
}
if ((gCurrentCourseId == COURSE_YOSHI_VALLEY) && (D_801630E2 == 1)) {
func_80009000(playerId);
if (((player->type & 0x4000) == 0) || (player->type & 0x1000)) {
func_800090F0(playerId, player);
}
}
if ((player->type & 0x4000) && !(player->type & 0x1000)) {
func_800065D0(playerId, player);
@ -1507,7 +1514,7 @@ void func_8000929C(s32 playerId, Player *player) {
} else {
//????
}
func_8000B95C(playerId, D_80162FCE, D_80163448);
func_8000B95C(playerId, sSomeNearestWaypoint, D_80163448);
}
#else
GLOBAL_ASM("asm/non_matchings/code_80005FD0/func_8000929C.s")
@ -1558,9 +1565,9 @@ void func_800098FC(s32 arg0, Player *player) {
}
if (D_801633B0[arg0] >= 0xB) {
if ((player->soundEffects & 0x400000) || (player->soundEffects & 0x01000000) || (player->soundEffects & 2) || (player->soundEffects & 4) || (player->effects & HIT_EFFECT)) {
func_800C92CC(arg0, 0x2900800BU);
D_801633B0[arg0] = 0;
}
func_800C92CC(arg0, 0x2900800BU);
D_801633B0[arg0] = 0;
}
}
}
@ -1761,12 +1768,12 @@ void func_80009B60(s32 playerId) {
} else if (D_80162FD0 == (s16) 1U) {
D_80163210[playerId] = D_0D0096B8[gCurrentCourseId][gCCSelection];
D_801634F8[playerId].unk4 = -0.5f;
} else if (D_801645E0[D_80162FCE] > 0) {
} else if (D_801645E0[sSomeNearestWaypoint] > 0) {
D_80163210[playerId] = D_0D009418[gCurrentCourseId][gCCSelection];
} else {
D_80163210[playerId] = D_0D009568[gCurrentCourseId][gCCSelection];
}
func_800131DC(playerId);
check_ai_crossing_distance(playerId);
func_8000D3B8(playerId);
func_8000D438(playerId, D_801630E0);
temp_f0 = D_80162FA0[0] - player->pos[0];
@ -1795,7 +1802,7 @@ void func_80009B60(s32 playerId) {
}
if (D_801630E8[playerId] != 0) {
D_80163300[playerId] = -get_angle_between_two_vectors(&player->copy_rotation_x, player->pos);
var_a0_2 = (D_801631DC[(D_80162FCE + 2) % D_80164430] * 0x168) / 65535;
var_a0_2 = (D_801631DC[(sSomeNearestWaypoint + 2) % D_80164430] * 0x168) / 65535;
var_a1 = (D_80163300[playerId] * 0x168) / 65535;
if (var_a0_2 < -0xB4) {
var_a0_2 += 0x168;
@ -1844,8 +1851,8 @@ void func_80009B60(s32 playerId) {
func_80008424(playerId, D_80163210[playerId], player);
return;
}
D_801630B8[playerId] = func_8000B7E4(playerId, D_80162FCE);
func_8000D438(playerId, D_80162FCE);
D_801630B8[playerId] = func_8000B7E4(playerId, sSomeNearestWaypoint);
func_8000D438(playerId, sSomeNearestWaypoint);
if (gCurrentCourseId != 0x0014) {
if (D_80164450[playerId] < 0xB) {
stackPadding1A = D_801630E0;
@ -1969,7 +1976,7 @@ void func_80009B60(s32 playerId) {
D_8016320C = D_80163028[playerId];
player->effects &= ~0x00200000;
D_80163210[playerId] = D_8016320C;
func_800131DC(playerId);
check_ai_crossing_distance(playerId);
func_80008424(playerId, D_8016320C, player);
}
}
@ -2479,7 +2486,7 @@ s16 func_8000CC88(f32 posX, f32 posY, f32 posZ, Player *player, s32 playerId, s3
u16 trackSegment;
s16 ret;
trackSegment = func_802ABD40(player->unk_110.unk3A);
trackSegment = get_section_id(player->collision.meshIndexZX);
if ((trackSegment <= 0) || (trackSegment >= 0x33)) {
trackSegment = D_80163318[playerId];
}
@ -2497,7 +2504,7 @@ s16 func_8000CD24(f32 posX, f32 posY, f32 posZ, s16 waypointIndex, Player *playe
TrackWaypoint *temp_v1;
if ((player->type & 0x4000) && !(player->type & 0x1000)) {
sp5E = func_8000C884(posX, posY, posZ, waypointIndex, pathIndex, (u16) func_802ABD40(player->unk_110.unk3A));
sp5E = func_8000C884(posX, posY, posZ, waypointIndex, pathIndex, (u16) get_section_id(player->collision.meshIndexZX));
if (sp5E == -1) {
sp5E = func_8000CC88(posX, posY, posZ, player, playerId, &pathIndex);
}
@ -2512,8 +2519,8 @@ s16 func_8000CD24(f32 posX, f32 posY, f32 posZ, s16 waypointIndex, Player *playe
return waypointIndex;
}
if (playerId == ((s32) D_80163488 % 8)) {
func_802ADDC8(&player->unk_110, 10.0f, posX, posY, posZ);
D_80163318[playerId] = func_802ABD40(player->unk_110.unk3A);
check_bounding_collision(&player->collision, 10.0f, posX, posY, posZ);
D_80163318[playerId] = get_section_id(player->collision.meshIndexZX);
sp5E = func_8000C884(posX, posY, posZ, waypointIndex, pathIndex, D_80163318[playerId]);
if (sp5E == -1) {
sp5E = func_8000C9DC(posX, posY, posZ, waypointIndex, pathIndex);
@ -2536,8 +2543,8 @@ s16 func_8000CD24(f32 posX, f32 posY, f32 posZ, s16 waypointIndex, Player *playe
player->pos[0] = posX;
player->pos[1] = posY;
player->pos[2] = posZ;
func_802ADDC8(&player->unk_110, 10.0f, posX, posY, posZ);
D_80163318[playerId] = func_802ABD40(player->unk_110.unk3A);
check_bounding_collision(&player->collision, 10.0f, posX, posY, posZ);
D_80163318[playerId] = get_section_id(player->collision.meshIndexZX);
}
}
} else {
@ -2547,7 +2554,7 @@ s16 func_8000CD24(f32 posX, f32 posY, f32 posZ, s16 waypointIndex, Player *playe
}
}
func_8000CBA4(posX, posY, posZ, &sp5E, pathIndex);
}
}
func_8000CBF8(posX, posY, posZ, &sp5E, pathIndex);
return sp5E;
}
@ -2589,8 +2596,8 @@ s16 func_8000D24C(f32 posX, f32 posY, f32 posZ, s32 *pathIndex) {
UNUSED s32 pad;
Collision sp24;
func_802ADDC8(&sp24, 10.0f, posX, posY, posZ);
return func_8000C0BC(posX, posY, posZ, func_802ABD40(sp24.unk3A), pathIndex);
check_bounding_collision(&sp24, 10.0f, posX, posY, posZ);
return func_8000C0BC(posX, posY, posZ, get_section_id(sp24.meshIndexZX), pathIndex);
}
s16 func_8000D2B4(f32 posX, f32 posY, f32 posZ, s16 waypointIndex, s32 pathIndex) {
@ -2907,7 +2914,7 @@ void set_bomb_kart_spawn_positions(void) {
case COURSE_YOSHI_VALLEY:
startingXPos = temp_s1->startingXPos;
startingZPos = temp_s1->startingZPos;
startingYPos = func_802AE1C0(startingXPos, 2000.0f, startingZPos);
startingYPos = spawn_actor_on_surface(startingXPos, 2000.0f, startingZPos);
break;
case COURSE_AWARD_CEREMONY:
temp_v0 = &D_80164550[3][temp_s1->waypointIndex];
@ -2945,7 +2952,7 @@ void set_bomb_kart_spawn_positions(void) {
gBombKarts[var_s3].unk_4A = 0;
gBombKarts[var_s3].unk_4C = 1;
gBombKarts[var_s3].yPos = startingYPos;
func_802ADDC8(&D_80164038[var_s3], 2.0f, startingXPos, startingYPos, startingZPos);
check_bounding_collision(&D_80164038[var_s3], 2.0f, startingXPos, startingYPos, startingZPos);
}
}
@ -3144,11 +3151,11 @@ void func_8000DF8C(s32 bombKartId) {
var_f24 += temp_f16 / 5.0f;
}
temp_a0_4 = &D_80164038[bombKartId];
var_f20 = func_802ABE30(var_f22, 2000.0f, var_f24, temp_a0_4->unk3A) + 3.5f;
var_f20 = calculate_surface_height(var_f22, 2000.0f, var_f24, temp_a0_4->meshIndexZX) + 3.5f;
if (var_f20 < (-1000.0)) {
var_f20 = bombKart->bombPos[1];
}
func_802ADDC8(temp_a0_4, 10.0f, var_f22, var_f20, var_f24);
check_bounding_collision(temp_a0_4, 10.0f, var_f22, var_f20, var_f24);
}
break;
case 4:
@ -3282,7 +3289,7 @@ void func_8000EEDC(void) {
s32 i;
for (i = 0; i < NUM_PLAYERS; i++) {
phi = &gUnexpiredActorsList[i];
phi = &gUnexpiredActorsList[i];
phi->unkC = 0;
phi->actorIndex = 1000; // out of bounds
}
@ -3536,12 +3543,19 @@ void func_8000F628(void) {
D_80163150[i] = -1;
D_80164538[i] = -1;
D_801634C0[i] = 0;
D_801634D8[i] = 0;
bStopAICrossing[i] = 0;
D_801630B8[i] = 1;
}
D_801637BC[0] = 0;
D_801637BC[1] = 0;
#ifdef AVOID_UB
for (i = 0; i < NUM_CROSSINGS; i++) {
sCrossingActiveTimer[i] = 0;
}
#else
sCrossingActiveTimer[0] = 0;
sCrossingActiveTimer[1] = 0;
#endif
if (gDemoMode == DEMO_MODE_INACTIVE) {
if (gModeSelection == GRAND_PRIX) {
@ -3883,14 +3897,14 @@ void func_80010E6C(s32 pathIndex) {
}
f32 func_80010F40(f32 arg0, f32 arg1, f32 arg2, UNUSED s32 arg3, UNUSED s32 arg4) {
arg1 = func_802AE1C0(arg0, 2000.0f, arg2);
func_802ADDC8(&D_80162E70, 1.0f, arg0, arg1, arg2);
arg1 = spawn_actor_on_surface(arg0, 2000.0f, arg2);
check_bounding_collision(&D_80162E70, 1.0f, arg0, arg1, arg2);
return arg1;
}
f32 func_80010FA0(f32 arg0, f32 arg1, f32 arg2, UNUSED s32 arg3, UNUSED s32 arg4) {
arg1 = func_802AE1C0(arg0, (f32) ((f64) arg1 + 30.0), arg2);
func_802ADDC8(&D_80162E70, 10.0f, arg0, arg1, arg2);
arg1 = spawn_actor_on_surface(arg0, (f32) ((f64) arg1 + 30.0), arg2);
check_bounding_collision(&D_80162E70, 10.0f, arg0, arg1, arg2);
return arg1;
}
@ -3969,7 +3983,7 @@ s32 func_80011014(TrackWaypoint *pathDest, TrackWaypoint *path, s32 numPathPoint
pathDest->posZ = (s16) temp_f22;
pathDest->trackSegment = func_802ABD40(D_80162E70.unk3A);
pathDest->trackSegment = get_section_id(D_80162E70.meshIndexZX);
if (var_f20_2 < -500.0) {
var_f20_2 = var_f28;
@ -4261,7 +4275,7 @@ void kart_ai_behaviour(s32 playerIndex) {
void func_80011EC0(s32 arg0, Player *player, s32 arg2, UNUSED u16 arg3) {
if ((((player->unk_094 / 18.0f) * 216.0f) >= 45.0f) && (D_801630E8[arg0] == 0)) {
switch (D_801631D8[D_80162FCE]) {
switch (D_801631D8[sSomeNearestWaypoint]) {
case 0:
case 2:
if ((arg2 >= -9) && (D_80162FF8[arg0] == 0)) {
@ -4305,7 +4319,7 @@ void func_800120C8(void) {
temp = D_80163598;
D_8016359C = func_8001168C(temp, waypoint, i - 1);
D_80162EB0 = func_802AE1C0(temp[0].x, 2000.0f, temp[0].z);
D_80162EB0 = spawn_actor_on_surface(temp[0].x, 2000.0f, temp[0].z);
}
void func_80012190(void) {
@ -4568,7 +4582,8 @@ void update_vehicle_trains(void) {
func_800C98B8(gTrainList[i].locomotive.position, gTrainList[i].locomotive.velocity, SOUND_ARG_LOAD(0x19, 0x01, 0x80, 0x0D));
}
gTrainList[i].someFlags = func_800061DC(gTrainList[i].locomotive.position, 2000.0f, gTrainList[i].someFlags);
gTrainList[i].someFlags = set_vehicle_render_distance_flags(gTrainList[i].locomotive.position, TRAIN_SMOKE_RENDER_DISTANCE, gTrainList[i].someFlags);
// Renders locomotive smoke on all screens if any player is within range.
if ((((s16) D_80162FCC % 5) == 0) && (gTrainList[i].someFlags != 0)) {
sp90[0] = gTrainList[i].locomotive.position[0];
sp90[1] = (f32) ((f64) gTrainList[i].locomotive.position[1] + 65.0);
@ -4655,7 +4670,7 @@ void func_80012DC0(s32 playerId, Player *player) {
/**
* Appears to check if the train is close to the crossing.
* Implements D_801637BC as a counter
* Implements sCrossingActiveTimer as a counter
*/
void func_80013054(void) {
f32 temp_f16;
@ -4682,31 +4697,31 @@ void func_80013054(void) {
}
}
for (i = 0; i < NUM_TRAINS; i++) {
for (i = 0; i < NUM_CROSSINGS; i++) {
if (isCrossingTriggeredByIndex[i] == 1) {
D_801637BC[i] += 1;
sCrossingActiveTimer[i] += 1;
} else {
D_801637BC[i] = 0;
sCrossingActiveTimer[i] = 0;
}
}
}
void func_800131DC(s32 playerId) {
D_801634D8[playerId] = 0;
void check_ai_crossing_distance(s32 playerId) {
bStopAICrossing[playerId] = 0;
if (gCurrentCourseId == COURSE_KALAMARI_DESERT) {
if ((!(D_801631E0[playerId] != 0))
|| (func_800061DC(gPlayers[playerId].pos, 1000.0f, 0))) {
|| (set_vehicle_render_distance_flags(gPlayers[playerId].pos, TRAIN_CROSSING_AI_DISTANCE, 0))) {
if ((isCrossingTriggeredByIndex[1] == 1)
&& ((D_801637BC[1]) > 240)) {
if ((D_80162FCE > 176) && (D_80162FCE < 182)) {
D_801634D8[playerId] = 1;
&& ((sCrossingActiveTimer[1]) > FRAMES_SINCE_CROSSING_ACTIVATED)) {
if ((sSomeNearestWaypoint > 176) && (sSomeNearestWaypoint < 182)) {
bStopAICrossing[playerId] = 1;
}
}
if ((isCrossingTriggeredByIndex[0] == 1) && (( D_801637BC[0]) > 240)) {
if ((D_80162FCE >= 306) && (D_80162FCE < 0x136)) {
D_801634D8[playerId] = 1;
if ((isCrossingTriggeredByIndex[0] == 1) && (( sCrossingActiveTimer[0]) > FRAMES_SINCE_CROSSING_ACTIVATED)) {
if ((sSomeNearestWaypoint >= 306) && (sSomeNearestWaypoint < 310)) {
bStopAICrossing[playerId] = 1;
}
}
}
@ -4766,7 +4781,7 @@ void update_vehicle_paddle_boats(void) {
temp_f28 = paddleBoat->position[1];
temp_f30 = paddleBoat->position[2];
func_8000DBAC(paddleBoat->position, (s16*)&paddleBoat->waypointIndex, paddleBoat->someMultiplier);
paddleBoat->someFlags = func_800061DC(paddleBoat->position, 2000.0f, paddleBoat->someFlags);
paddleBoat->someFlags = set_vehicle_render_distance_flags(paddleBoat->position, BOAT_SMOKE_RENDER_DISTANCE, paddleBoat->someFlags);
if ((((s16) D_801630FC % 10) == 0) && (paddleBoat->someFlags != 0)) {
sp78[0] = (f32) ((f64) paddleBoat->position[0] - 30.0);
sp78[1] = (f32) ((f64) paddleBoat->position[1] + 180.0);
@ -4881,39 +4896,39 @@ void func_800139E4(f32 arg0, f32 arg1, s32 arg2, s32 arg3, VehicleStuff *vehicle
u16 waypointOffset;
s32 numWaypoints = gWaypointCountByPathIndex[0];
for (i = 0; i < arg2; i++) {
waypointOffset = (((i * numWaypoints) / arg2) + arg3) % numWaypoints;
veh = &vehicle[i];
temp_v0 = &waypointList[waypointOffset];
veh->position[0] = (f32) temp_v0->posX;
veh->position[1] = (f32) temp_v0->posY;
veh->position[2] = (f32) temp_v0->posZ;
veh->actorIndex = -1;
veh->waypointIndex = waypointOffset;
veh->unused = 0;
veh->velocity[0] = 0.0f;
veh->velocity[1] = 0.0f;
veh->velocity[2] = 0.0f;
veh->someFlags = 0;
veh->someFlagsTheSequel = 0;
if (gModeSelection == TIME_TRIALS) {
veh->someType = (i % 3);
} else {
veh->someType = random_int(3);
}
veh->someMultiplierTheSequel = (f32) ((f64) (f32) (veh->someType - 1) * 0.6);
if (((gCCSelection > CC_50) || (gModeSelection == TIME_TRIALS)) && (veh->someType == 2)) {
veh->someMultiplier = arg0;
} else {
veh->someMultiplier = arg1;
}
veh->rotation[0] = 0;
veh->rotation[2] = 0;
if (D_8016347A == 0) {
veh->rotation[1] = func_8000D6D0(veh->position, (s16*)&veh->waypointIndex, veh->someMultiplier, veh->someMultiplierTheSequel, 0, 3);
} else {
veh->rotation[1] = func_8000D940(veh->position, (s16*)&veh->waypointIndex, veh->someMultiplier, veh->someMultiplierTheSequel, 0);
}
waypointOffset = (((i * numWaypoints) / arg2) + arg3) % numWaypoints;
veh = &vehicle[i];
temp_v0 = &waypointList[waypointOffset];
veh->position[0] = (f32) temp_v0->posX;
veh->position[1] = (f32) temp_v0->posY;
veh->position[2] = (f32) temp_v0->posZ;
veh->actorIndex = -1;
veh->waypointIndex = waypointOffset;
veh->unused = 0;
veh->velocity[0] = 0.0f;
veh->velocity[1] = 0.0f;
veh->velocity[2] = 0.0f;
veh->someFlags = 0;
veh->someFlagsTheSequel = 0;
if (gModeSelection == TIME_TRIALS) {
veh->someType = (i % 3);
} else {
veh->someType = random_int(3);
}
veh->someMultiplierTheSequel = (f32) ((f64) (f32) (veh->someType - 1) * 0.6);
if (((gCCSelection > CC_50) || (gModeSelection == TIME_TRIALS)) && (veh->someType == 2)) {
veh->someMultiplier = arg0;
} else {
veh->someMultiplier = arg1;
}
veh->rotation[0] = 0;
veh->rotation[2] = 0;
if (D_8016347A == 0) {
veh->rotation[1] = func_8000D6D0(veh->position, (s16*)&veh->waypointIndex, veh->someMultiplier, veh->someMultiplierTheSequel, 0, 3);
} else {
veh->rotation[1] = func_8000D940(veh->position, (s16*)&veh->waypointIndex, veh->someMultiplier, veh->someMultiplierTheSequel, 0);
}
}
D_801631C8 = 10;
}
@ -5052,12 +5067,12 @@ void func_80013F7C(s32 playerId, Player *player, VehicleStuff *vehicle, f32 arg3
(temp_f22 > -20.0)) && (temp_f22 < 20.0) && (((temp_f14) > -300.0)) && ((temp_f14) < 300.0)) {
if ((D_801631C8 > 0) && (vehicle->someFlags == 0)) {
D_801631C8 -= 1;
vehicle->someFlags |= (1 << playerId);
vehicle->someFlags |= (RENDER_VEHICLE << playerId);
func_800C9D80(vehicle->position, vehicle->velocity, soundBits);
}
} else {
if (vehicle->someFlags != 0) {
vehicle->someFlags &= ~(1 << playerId);
vehicle->someFlags &= ~(RENDER_VEHICLE << playerId);
if (vehicle->someFlags == 0) {
D_801631C8 += 1;
func_800C9EF4(vehicle->position, soundBits);
@ -5201,7 +5216,7 @@ void func_800146B8(s32 playerId, s32 arg1, VehicleStuff *vehicle) {
for (var_s2 = 0; var_s2 < arg1; var_s2++, vehicle++) {
temp_a1 = vehicle->waypointIndex;
for (var_v0 = 0; var_v0 < 0x18; var_v0 += 3) {
if (((D_80162FCE + var_v0) % waypointCount) == temp_a1) {
if (((sSomeNearestWaypoint + var_v0) % waypointCount) == temp_a1) {
D_801634F8[playerId].unk4 = func_800145A8(vehicle->someType, D_80163068[playerId], temp_a1);
return;
}
@ -5322,7 +5337,7 @@ void func_80014D30(s32 cameraId, s32 pathIndex) {
cameraWaypoint = gNearestWaypointByCameraId[cameraId];
temp_v0 = &D_80164550[pathIndex][cameraWaypoint];
func_802ADDC8(&cameras[cameraId].unk_54, 10.0f, (f32) temp_v0->posX, (f32) temp_v0->posY + 30.0f, (f32) temp_v0->posZ);
check_bounding_collision(&cameras[cameraId].collision, 10.0f, (f32) temp_v0->posX, (f32) temp_v0->posY + 30.0f, (f32) temp_v0->posZ);
}
void func_80014DE4(s32 arg0) {
@ -5509,7 +5524,7 @@ void func_80015390(Camera *camera, UNUSED Player *player, UNUSED s32 arg2) {
adjust_angle(&camera->unk_2C, temp_s1->rotation[1], var_a2);
}
func_8001D794(temp_s1, camera, sp64, &sp84, &sp80, &sp7C, camera->unk_2C);
func_802ADDC8(&camera->unk_54, 10.0f, sp84, sp80, sp7C);
check_bounding_collision(&camera->collision, 10.0f, sp84, sp80, sp7C);
camera->lookAt[0] = sp64[0];
camera->lookAt[1] = sp64[1];
camera->lookAt[2] = sp64[2];
@ -5543,7 +5558,7 @@ void func_80015544(s32 playerId, f32 arg1, s32 cameraId, s32 pathIndex) {
temp_f2 = (f32) D_80164550[pathIndex][gNearestWaypointByCameraId[cameraId]].posY;
temp_f12 = func_802AE1C0(D_80162FA0[0], (f32) (temp_f2 + 30.0), D_80162FA0[2]);
temp_f12 = spawn_actor_on_surface(D_80162FA0[0], (f32) (temp_f2 + 30.0), D_80162FA0[2]);
if ((temp_f12 < (temp_f2 - 20.0)) || (temp_f12 >= 3000.0)) {
D_80164618[cameraId] = (f32) (temp_f2 + 10.0);
} else {
@ -5694,7 +5709,7 @@ void func_80015C94(Camera *camera, UNUSED Player *unusedPlayer, UNUSED s32 arg2,
}
camera->pos[0] = midX;
camera->pos[2] = midZ;
temp_f2_2 = func_802AE1C0(midX, (midY + 30.0), midZ);
temp_f2_2 = spawn_actor_on_surface(midX, (midY + 30.0), midZ);
if ((temp_f2_2 < (midY - 20.0)) || (temp_f2_2 >= 3000.0)) {
camera->pos[1] = midY + 10.0;
} else {
@ -5820,7 +5835,7 @@ void func_80016494(Camera *camera, UNUSED Player *unusedPlayer, UNUSED s32 arg2,
}
camera->pos[0] = midX;
camera->pos[2] = midZ;
temp_f2_5 = func_802AE1C0(midX, midY + 30.0, midZ);
temp_f2_5 = spawn_actor_on_surface(midX, midY + 30.0, midZ);
if ((temp_f2_5 < (midY - 20.0)) || (temp_f2_5 >= 3000.0)) {
camera->pos[1] = midY + 10.0;
} else {
@ -6340,7 +6355,7 @@ void func_800188F4(Camera *camera, UNUSED Player *unusePlayer, UNUSED s32 arg2,
}
camera->pos[0] = midX;
camera->pos[2] = midZ;
temp_f2_4 = func_802AE1C0(midX, midY + 30.0, midZ);
temp_f2_4 = spawn_actor_on_surface(midX, midY + 30.0, midZ);
if ((temp_f2_4 < (midY - 20.0)) || (temp_f2_4 >= 3000.0)) {
camera->pos[1] = midY + 10.0;
} else {
@ -6377,7 +6392,7 @@ void func_80019118(s32 playerId, f32 arg1, s32 cameraId, UNUSED s16 pathIndex) {
D_80164638[cameraId] = D_80162FA0[2];
temp_f2 = (f32) D_80164550[0][gNearestWaypointByCameraId[cameraId]].posY;
temp_f12 = func_802AE1C0(D_80162FA0[0], (f32) (temp_f2 + 30.0), D_80162FA0[2]);
temp_f12 = spawn_actor_on_surface(D_80162FA0[0], (f32) (temp_f2 + 30.0), D_80162FA0[2]);
if ((temp_f12 < (temp_f2 - 20.0)) || (temp_f12 >= 3000.0)) {
D_80164618[cameraId] = (f32) (temp_f2 + 10.0);
@ -7080,7 +7095,7 @@ void kart_ai_use_item_strategy(s32 playerId) {
banana->velocity[1] = 0.0f;
banana->velocity[2] = 0.0f;
if (D_801631E0[playerId] == ((u16) 1)) {
banana->pos[1] = func_802AE1C0(player->pos[0], (f32) (((f64) player->pos[1]) + 30.0), player->pos[2]) + (banana->boundingBoxSize + 1.0f);
banana->pos[1] = spawn_actor_on_surface(player->pos[0], (f32) (((f64) player->pos[1]) + 30.0), player->pos[2]) + (banana->boundingBoxSize + 1.0f);
}
}
player->soundEffects &= ~0x00040000;
@ -7136,7 +7151,7 @@ void kart_ai_use_item_strategy(s32 playerId) {
banana->velocity[0] = 0.0f;
banana->velocity[1] = 0.0f;
banana->velocity[2] = 0.0f;
banana->pos[1] = func_802AE1C0(banana->pos[0], (f32) (((f64) banana->pos[1]) + 30.0), banana->pos[2]) + (banana->boundingBoxSize + 1.0f);
banana->pos[1] = spawn_actor_on_surface(banana->pos[0], (f32) (((f64) banana->pos[1]) + 30.0), banana->pos[2]) + (banana->boundingBoxSize + 1.0f);
}
player->soundEffects &= ~0x00040000;
temp_s0->unk_00 = 0;
@ -7344,7 +7359,7 @@ void kart_ai_use_item_strategy(s32 playerId) {
} else {
func_802A1064(fakeItemBox);
if (D_801631E0[playerId] == 1) {
fakeItemBox->pos[1] = func_802AE1C0(fakeItemBox->pos[0], fakeItemBox->pos[1] + 30.0, fakeItemBox->pos[2]) + fakeItemBox->boundingBoxSize;
fakeItemBox->pos[1] = spawn_actor_on_surface(fakeItemBox->pos[0], fakeItemBox->pos[1] + 30.0, fakeItemBox->pos[2]) + fakeItemBox->boundingBoxSize;
}
}
temp_s0->unk_00 = 0;
@ -7480,7 +7495,7 @@ void func_8001BE78(void) {
}
temp_s0 = &D_80164550[i][gNearestWaypointByPlayerId[i]];
temp_s1->pos[0] = (f32) temp_s0->posX;
temp_s1->pos[1] = func_802AE1C0((f32) temp_s0->posX, 2000.0f, (f32) temp_s0->posZ) + temp_s1->boundingBoxSize;
temp_s1->pos[1] = spawn_actor_on_surface((f32) temp_s0->posX, 2000.0f, (f32) temp_s0->posZ) + temp_s1->boundingBoxSize;
temp_s1->pos[2] = (f32) temp_s0->posZ;
temp_s1->rotation[1] = (s16) *D_80164590[i];
func_8003680C(temp_s1, 0);

View File

@ -63,7 +63,7 @@ s16 func_80005FD0(Vec3f, Vec3f);
s32 func_80006018(f32, f32, f32, f32, f32, f32, f32, f32);
void func_80006114(Vec3f, Vec3f, s16);
s32 func_800061DC(Vec3f, f32, s32);
s32 set_vehicle_render_distance_flags(Vec3f, f32, s32);
void func_800065D0(s32, Player*);
void set_places(void);
@ -163,7 +163,7 @@ void update_vehicle_trains(void);
void func_80012DC0(s32, Player*);
void func_80013054(void);
void func_800131DC(s32);
void check_ai_crossing_distance(s32);
void func_800132F4(void);
void update_vehicle_paddle_boats(void);
void func_80013854(Player*);
@ -352,7 +352,7 @@ extern s16 D_8016348C;
extern s16 D_80163490[];
extern s16 D_801634A8[];
extern s16 D_801634C0[];
extern s16 D_801634D8[];
extern s16 bStopAICrossing[];
extern s16 D_801634EC;
extern s32 D_801634F0;
extern s32 D_801634F4;
@ -360,7 +360,7 @@ extern Test D_801634F8[];
extern PathNoY *D_80163598;
extern s32 D_8016359C;
extern u16 isCrossingTriggeredByIndex[];
extern u16 D_801637BC[];
extern u16 sCrossingActiveTimer[];
extern s32 D_80163DD8[];
extern struct unexpiredActors gUnexpiredActorsList[];
extern D_801642D8_entry D_801642D8[];

View File

@ -18,14 +18,14 @@ UNUSED void func_8003DC50(Player *player, Vec3f arg1) {
// Praise Fake Match!!
if(player){};
if (player->unk_230 <= player->unk_23C) {
if (player->unk_110.unk48[1] >= 0.1736) {
if (player->collision.unk48[1] >= 0.1736) {
arg1[0] = (player->unk_206 / 182) * 0x78;
arg1[2] = -(player->slopeAccel / 182) * 0x78;
} else {
arg1[0] = thing1;
arg1[2] = thing2;
}
} else if (player->unk_110.unk48[1] >= 0.1736) {
} else if (player->collision.unk48[1] >= 0.1736) {
arg1[0] = (player->unk_206 / 182) * 0x78;
arg1[2] = -(player->slopeAccel / 182) * 0x78;
} else {
@ -42,14 +42,14 @@ UNUSED void func_8003DE4C(Player *player, Vec3f arg1) {
// Praise Fake Match!!
if(player){};
if (player->unk_230 <= player->unk_23C) {
if (player->unk_110.unk54[1] >= 0.1736) {
if (player->collision.unk54[1] >= 0.1736) {
arg1[0] = (player->unk_206 / 182) * 0x78;
arg1[2] = -(player->slopeAccel / 182) * 0x78;
} else {
arg1[0] = thing1;
arg1[2] = thing2;
}
} else if (player->unk_110.unk54[1] >= 0.1736) {
} else if (player->collision.unk54[1] >= 0.1736) {
arg1[0] = (player->unk_206 / 182) * 0x78;
arg1[2] = -(player->slopeAccel / 182) * 0x78;
} else {
@ -61,14 +61,14 @@ UNUSED void func_8003DE4C(Player *player, Vec3f arg1) {
}
// Stick to ground?
void func_8003E048(Player *player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32 *arg4, f32 *arg5, f32 *arg6, f32 *arg7) {
*arg5 += arg1[0] * player->unk_110.unk3C[2] * 1;
*arg6 += arg1[1] * player->unk_110.unk3C[2] * 0.1;
*arg7 += arg1[2] * player->unk_110.unk3C[2] * 1;
*arg5 += arg1[0] * player->collision.surfaceDistance[2] * 1;
*arg6 += arg1[1] * player->collision.surfaceDistance[2] * 0.1;
*arg7 += arg1[2] * player->collision.surfaceDistance[2] * 1;
func_8002A5F4(arg1, *arg4, arg2, 1, 2);
if (player->unk_110.orientationVector[1] <= 0.8829f) {
if (player->collision.orientationVector[1] <= 0.8829f) {
arg3[0] = ((player->unk_206 / 182) * 0xB4);
arg3[2] = (-(player->slopeAccel / 182) * 0xB4);
func_80031F48(player, 4.0f);
decelerate_ai_player(player, 4.0f);
player->unk_DAC = 0.5f;
if ((player->effects & BOOST_EFFECT) != 0) {
remove_boost_effect(player);
@ -87,15 +87,15 @@ void func_8003E048(Player *player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32 *arg4
}
void func_8003E37C(Player *player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32 *arg4, f32 *arg5, f32 *arg6, f32 *arg7) {
*arg5 += arg1[0] * player->unk_110.unk3C[2] * 1;
*arg6 += arg1[1] * player->unk_110.unk3C[2] * 0.2;
*arg7 += arg1[2] * player->unk_110.unk3C[2] * 1;
*arg5 += arg1[0] * player->collision.surfaceDistance[2] * 1;
*arg6 += arg1[1] * player->collision.surfaceDistance[2] * 0.2;
*arg7 += arg1[2] * player->collision.surfaceDistance[2] * 1;
func_8002A5F4(arg1, *arg4, arg2, 0.5f, 2);
if ((player->unk_110.orientationVector[1] <= 0.7318f) || (player->surfaceType == CLIFF)) {
if ((player->collision.orientationVector[1] <= 0.7318f) || (player->surfaceType == CLIFF)) {
arg3[0] = ((player->unk_206 / 182) * 0xB4);
arg3[2] = (-(player->slopeAccel / 182) * 0xB4);
if (((player->unk_094 / 18.0f) * 216.0f) >= 8.0f) {
func_80031F48(player, 5.0f);
decelerate_ai_player(player, 5.0f);
}
player->unk_DAC = 0.5f;
if ((player->effects & BOOST_EFFECT) != 0) {
@ -115,14 +115,14 @@ void func_8003E37C(Player *player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32 *arg4
}
void func_8003E6EC(Player *player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32 *arg4, f32 *arg5, f32 *arg6, f32 *arg7) {
*arg5 += arg1[0] * player->unk_110.unk3C[2] * 1;
*arg6 += arg1[1] * player->unk_110.unk3C[2] * 0.1;
*arg7 += arg1[2] * player->unk_110.unk3C[2] * 1;
*arg5 += arg1[0] * player->collision.surfaceDistance[2] * 1;
*arg6 += arg1[1] * player->collision.surfaceDistance[2] * 0.1;
*arg7 += arg1[2] * player->collision.surfaceDistance[2] * 1;
func_8002A5F4(arg1, *arg4, arg2, 0.5f, 2);
if (player->unk_110.orientationVector[1] <= 0.8829f) {
if (player->collision.orientationVector[1] <= 0.8829f) {
arg3[0] = ((player->unk_206 / 182) * 0xB4);
arg3[2] = (-(player->slopeAccel / 182) * 0xB4);
func_80031F48(player, 4.0f);
decelerate_ai_player(player, 4.0f);
func_8003DC40(player);
} else if ((((player->unk_094 / 18.0f) * 216.0f) > 20.0f) || ((player->effects & 0x10000) == 0x10000)) {
arg3[0] = ((player->unk_206 / 182) * 0x32);
@ -136,18 +136,18 @@ void func_8003E6EC(Player *player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32 *arg4
}
void func_8003E9EC(Player *player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32 *arg4, f32 *arg5, f32 *arg6, f32 *arg7) {
*arg5 += arg1[0] * player->unk_110.unk3C[2] * 1;
*arg6 += arg1[1] * player->unk_110.unk3C[2] * 0.1;
*arg7 += arg1[2] * player->unk_110.unk3C[2] * 1;
*arg5 += arg1[0] * player->collision.surfaceDistance[2] * 1;
*arg6 += arg1[1] * player->collision.surfaceDistance[2] * 0.1;
*arg7 += arg1[2] * player->collision.surfaceDistance[2] * 1;
func_8002A5F4(arg1, *arg4, arg2, 1.2f, 2);
if (player->unk_110.orientationVector[1] <= 0.8357f) {
if (player->collision.orientationVector[1] <= 0.8357f) {
arg3[0] = ((player->unk_206 / 182) * 0x78);
arg3[2] = (-(player->slopeAccel / 182) * 0xB4);
func_80031F48(player, 4.0f);
decelerate_ai_player(player, 4.0f);
func_8003DC40(player);
} else {
if ((((player->unk_094 / 18.0f) * 216.0f) > 20.0f) || ((player->effects & 0x10000) == 0x10000)) {
if ((player->boundingBoxCorners[2].surfaceType == ASPHALT) || (player->boundingBoxCorners[3].surfaceType == ASPHALT) || (player->boundingBoxCorners[1].surfaceType == ASPHALT) || (player->boundingBoxCorners[0].surfaceType == ASPHALT)) {
if ((player->tyres[BACK_LEFT].surfaceType == ASPHALT) || (player->tyres[BACK_RIGHT].surfaceType == ASPHALT) || (player->tyres[FRONT_RIGHT].surfaceType == ASPHALT) || (player->tyres[FRONT_LEFT].surfaceType == ASPHALT)) {
arg3[0] = ((player->unk_206 / 182) * 5);
} else {
arg3[0] = ((player->unk_206 / 182) * 0x28);
@ -167,14 +167,14 @@ void func_8003E9EC(Player *player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32 *arg4
}
void func_8003EE2C(Player *player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32 *arg4, f32 *arg5, f32 *arg6, f32 *arg7) {
*arg5 += arg1[0] * player->unk_110.unk3C[2] * 1;
*arg6 += arg1[1] * player->unk_110.unk3C[2] * 0.1;
*arg7 += arg1[2] * player->unk_110.unk3C[2] * 1;
*arg5 += arg1[0] * player->collision.surfaceDistance[2] * 1;
*arg6 += arg1[1] * player->collision.surfaceDistance[2] * 0.1;
*arg7 += arg1[2] * player->collision.surfaceDistance[2] * 1;
func_8002A5F4(arg1, *arg4, arg2, 0.5f, 2);
if (player->unk_110.orientationVector[1] <= 0.8357f) {
if (player->collision.orientationVector[1] <= 0.8357f) {
arg3[0] = ((player->unk_206 / 182) * 0x78);
arg3[2] = (-(player->slopeAccel / 182) * 0xB4);
func_80031F48(player, 4.0f);
decelerate_ai_player(player, 4.0f);
func_8003DC40(player);
} else if ((((player->unk_094 / 18.0f) * 216.0f) > 20.0f) || ((player->effects & 0x10000) == 0x10000)) {
arg3[0] = ((player->unk_206 / 182) * 0x32);
@ -188,17 +188,17 @@ void func_8003EE2C(Player *player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32 *arg4
}
void func_8003F138(Player *player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32 *arg4, f32 *arg5, f32 *arg6, f32 *arg7) {
*arg5 += arg1[0] * player->unk_110.unk3C[2] * 1;
*arg6 += arg1[1] * player->unk_110.unk3C[2] * 0.1;
*arg7 += arg1[2] * player->unk_110.unk3C[2] * 1;
*arg5 += arg1[0] * player->collision.surfaceDistance[2] * 1;
*arg6 += arg1[1] * player->collision.surfaceDistance[2] * 0.1;
*arg7 += arg1[2] * player->collision.surfaceDistance[2] * 1;
func_8002A5F4(arg1, *arg4, arg2, 0.5f, 2);
if (player->surfaceType == GRASS) {
player->unk_044 &= ~1;
}
if (player->unk_110.orientationVector[1] <= 0.8357f) {
if (player->collision.orientationVector[1] <= 0.8357f) {
arg3[0] = ((player->unk_206 / 182) * 0xC8);
arg3[2] = (-(player->slopeAccel / 182) * 0xC8);
func_80031F48(player, 4.0f);
decelerate_ai_player(player, 4.0f);
player->unk_DAC = 0.5f;
arg3[0] = 0;
} else if ((((player->unk_094 / 18.0f) * 216.0f) > 20.0f) || ((player->effects & 0x10000) == 0x10000)) {
@ -215,13 +215,13 @@ void func_8003F138(Player *player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32 *arg4
}
void func_8003F46C(Player *player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32 *arg4, f32 *arg5, f32 *arg6, f32 *arg7) {
arg1[0] = -player->unk_110.orientationVector[0];
arg1[1] = -player->unk_110.orientationVector[1];
arg1[2] = -player->unk_110.orientationVector[2];
if ((player->unk_110.orientationVector[1] < 0.0f) && ((player->unk_0CA & 2) == 0)) {
*arg5 += arg1[0] * player->unk_110.unk3C[2] * 1;
*arg6 += arg1[1] * player->unk_110.unk3C[2] * 1;
*arg7 += arg1[2] * player->unk_110.unk3C[2] * 1;
arg1[0] = -player->collision.orientationVector[0];
arg1[1] = -player->collision.orientationVector[1];
arg1[2] = -player->collision.orientationVector[2];
if ((player->collision.orientationVector[1] < 0.0f) && ((player->unk_0CA & 2) == 0)) {
*arg5 += arg1[0] * player->collision.surfaceDistance[2] * 1;
*arg6 += arg1[1] * player->collision.surfaceDistance[2] * 1;
*arg7 += arg1[2] * player->collision.surfaceDistance[2] * 1;
func_8002A5F4(arg1, *arg4, arg2, 1.2f, 0.0f);
player->kartHopJerk = 0.0f;
player->kartHopAcceleration = 0.0f;
@ -263,43 +263,43 @@ void func_8003F734(Player *player, Vec3f arg1, Vec3f arg2, f32 *arg3, f32 *arg4,
f32 temp_f14;
f32 temp_f0_2;
arg1[0] = -player->unk_110.unk48[0];
arg1[1] = -player->unk_110.unk48[1];
arg1[2] = -player->unk_110.unk48[2];
if (player->unk_110.unk48[1] == 0) {
*arg4 += arg1[0] * player->unk_110.unk3C[0] * 1;
*arg5 += arg1[1] * player->unk_110.unk3C[0] * 0.1;
*arg6 += arg1[2] * player->unk_110.unk3C[0] * 1;
arg1[0] = -player->collision.unk48[0];
arg1[1] = -player->collision.unk48[1];
arg1[2] = -player->collision.unk48[2];
if (player->collision.unk48[1] == 0) {
*arg4 += arg1[0] * player->collision.surfaceDistance[0] * 1;
*arg5 += arg1[1] * player->collision.surfaceDistance[0] * 0.1;
*arg6 += arg1[2] * player->collision.surfaceDistance[0] * 1;
if ((player->slopeAccel < 0) && (((player->unk_094 / 18.0f) * 216.0f) < 10.0f)) {
func_8002A5F4(arg1, *arg3, arg2, 2.5f, 0);
} else {
func_8002A5F4(arg1, *arg3, arg2, 0.5f, 0);
}
} else if (player->unk_110.unk48[1] <= 0.5) {
*arg4 += arg1[0] * player->unk_110.unk3C[0] * 1;
*arg5 += arg1[1] * player->unk_110.unk3C[0] * 0.1;
*arg6 += arg1[2] * player->unk_110.unk3C[0] * 1;
} else if (player->collision.unk48[1] <= 0.5) {
*arg4 += arg1[0] * player->collision.surfaceDistance[0] * 1;
*arg5 += arg1[1] * player->collision.surfaceDistance[0] * 0.1;
*arg6 += arg1[2] * player->collision.surfaceDistance[0] * 1;
func_8002A5F4(arg1, *arg3, arg2, 1, 0);
if ((!(player->effects & 0x10000)) && ((player->effects & 8) == 0)) {
arg2[1] *= -1e-05;
}
} else {
*arg4 += arg1[0] * player->unk_110.unk3C[0] * 1;
temp_f0_2 = player->unk_110.unk3C[0] * arg1[1];
*arg4 += arg1[0] * player->collision.surfaceDistance[0] * 1;
temp_f0_2 = player->collision.surfaceDistance[0] * arg1[1];
if (temp_f0_2 < 0) {
*arg5 += temp_f0_2 * 0.1;
} else {
*arg5 += temp_f0_2 * 0;
}
*arg6 += arg1[2] * player->unk_110.unk3C[0] * 1;
*arg6 += arg1[2] * player->collision.surfaceDistance[0] * 1;
func_8002A5F4(arg1, *arg3, arg2, 1.2f, 0);
if ((!(player->effects & 0x10000)) && ((player->effects & 8) == 0)) {
arg2[1] *= -1e-05;
}
}
player->effects &= ~0x10;
temp_f12 = player->unk_110.unk3C[0] * arg1[0];
temp_f14 = player->unk_110.unk3C[0] * arg1[2];
temp_f12 = player->collision.surfaceDistance[0] * arg1[0];
temp_f14 = player->collision.surfaceDistance[0] * arg1[2];
if (((temp_f12 >= 0) && (temp_f14 >= 0)) || ((temp_f12 < 0) && (temp_f14 >= 0))) {
temp_f0_2 = player->boundingBoxSize / 2;
player->unk_218 = *arg4 - temp_f12 - temp_f0_2;
@ -317,43 +317,43 @@ void func_8003FBAC(Player *player, Vec3f arg1, Vec3f arg2, f32 *arg3, f32 *arg4,
f32 temp_f12;
f32 temp_f14;
arg1[0] = -player->unk_110.unk54[0];
arg1[1] = -player->unk_110.unk54[1];
arg1[2] = -player->unk_110.unk54[2];
if (player->unk_110.unk54[1] == 0) {
*arg4 += arg1[0] * player->unk_110.unk3C[1] * 1;
*arg5 += arg1[1] * player->unk_110.unk3C[1] * 0.1;
*arg6 += arg1[2] * player->unk_110.unk3C[1] * 1;
arg1[0] = -player->collision.unk54[0];
arg1[1] = -player->collision.unk54[1];
arg1[2] = -player->collision.unk54[2];
if (player->collision.unk54[1] == 0) {
*arg4 += arg1[0] * player->collision.surfaceDistance[1] * 1;
*arg5 += arg1[1] * player->collision.surfaceDistance[1] * 0.1;
*arg6 += arg1[2] * player->collision.surfaceDistance[1] * 1;
if ((player->slopeAccel < 0) && (((player->unk_094 / 18.0f) * 216.0f) < 10.0f)) {
func_8002A5F4(arg1, *arg3, arg2, 1.5f, 0);
} else {
func_8002A5F4(arg1, *arg3, arg2, 0.5f, 0);
}
} else if (player->unk_110.unk54[1] <= 0.5) {
*arg4 += arg1[0] * player->unk_110.unk3C[1] * 1;
*arg5 += arg1[1] * player->unk_110.unk3C[1] * 0.1;
*arg6 += arg1[2] * player->unk_110.unk3C[1] * 1;
} else if (player->collision.unk54[1] <= 0.5) {
*arg4 += arg1[0] * player->collision.surfaceDistance[1] * 1;
*arg5 += arg1[1] * player->collision.surfaceDistance[1] * 0.1;
*arg6 += arg1[2] * player->collision.surfaceDistance[1] * 1;
func_8002A5F4(arg1, *arg3, arg2, 1, 0);
if ((!(player->effects & 0x10000)) && ((player->effects & 8) == 0)) {
arg2[1] *= -1e-05;
}
} else {
*arg4 += arg1[0] * player->unk_110.unk3C[1] * 1;
temp_f0_2 = player->unk_110.unk3C[1] * arg1[1];
*arg4 += arg1[0] * player->collision.surfaceDistance[1] * 1;
temp_f0_2 = player->collision.surfaceDistance[1] * arg1[1];
if (temp_f0_2 < 0) {
*arg5 += temp_f0_2 * 0.1;
} else {
*arg5 += temp_f0_2 * 0;
}
*arg6 += arg1[2] * player->unk_110.unk3C[1] * 1;
*arg6 += arg1[2] * player->collision.surfaceDistance[1] * 1;
func_8002A5F4(arg1, *arg3, arg2, 1.2f, 0);
if ((!(player->effects & 0x10000)) && ((player->effects & 8) == 0)) {
arg2[1] *= -1e-05;
}
}
player->effects &= ~0x10;
temp_f12 = player->unk_110.unk3C[1] * arg1[0];
temp_f14 = player->unk_110.unk3C[1] * arg1[2];
temp_f12 = player->collision.surfaceDistance[1] * arg1[0];
temp_f14 = player->collision.surfaceDistance[1] * arg1[2];
if (((temp_f12 >= 0) && (temp_f14 >= 0)) || ((temp_f12 >= 0) && (temp_f14 < 0))) {
temp_f0_2 = player->boundingBoxSize / 2;
player->unk_218 = *arg4 - temp_f12 - temp_f0_2;

View File

@ -226,7 +226,7 @@ UNUSED s32 D_80165910[96];
s8 D_80165A90;
UNUSED s32 D_80165AA0[95];
UNUSED s32 D_80165C14;
Objects gObjectList[OBJECT_LIST_SIZE];
Object gObjectList[OBJECT_LIST_SIZE];
UNUSED s32 D_80183D58;
s32 objectListSize;
Mtx D_80183D60;
@ -2849,9 +2849,9 @@ void func_8005D898(Player* player, s16 arg1, UNUSED s32 arg2, UNUSED s8 arg3, UN
s32 temp_lo;
if (player->unk_0C0 >= 0) {
func_8005D794(player, &player->unk_258[10 + arg1], player->boundingBoxCorners[2].cornerPos[0], player->boundingBoxCorners[2].cornerGroundY + 2.0f, player->boundingBoxCorners[2].cornerPos[2], player->boundingBoxCorners[2].surfaceType, 1);
func_8005D794(player, &player->unk_258[10 + arg1], player->tyres[BACK_LEFT].pos[0], player->tyres[BACK_LEFT].baseHeight + 2.0f, player->tyres[BACK_LEFT].pos[2], player->tyres[BACK_LEFT].surfaceType, 1);
} else {
func_8005D794(player, &player->unk_258[10 + arg1], player->boundingBoxCorners[3].cornerPos[0], player->boundingBoxCorners[3].cornerGroundY + 2.0f, player->boundingBoxCorners[3].cornerPos[2], player->boundingBoxCorners[3].surfaceType, 0);
func_8005D794(player, &player->unk_258[10 + arg1], player->tyres[BACK_RIGHT].pos[0], player->tyres[BACK_RIGHT].baseHeight + 2.0f, player->tyres[BACK_RIGHT].pos[2], player->tyres[BACK_RIGHT].surfaceType, 0);
}
temp_lo = player->unk_0C0 / 182;
@ -2911,18 +2911,18 @@ void func_8005DAF4(Player *player, s16 arg1, s32 arg2, UNUSED s8 arg3, UNUSED s8
surfaceType = 0x000000FF;
temp_v0 = random_int(test);
if ((temp_v0 == 0) || (temp_v0 == 4)) {
var_f2 = player->boundingBoxCorners[2].cornerPos[0];
var_f12 = player->boundingBoxCorners[2].cornerGroundY + 2.0f;
var_f14 = player->boundingBoxCorners[2].cornerPos[2];
var_f2 = player->tyres[BACK_LEFT].pos[0];
var_f12 = player->tyres[BACK_LEFT].baseHeight + 2.0f;
var_f14 = player->tyres[BACK_LEFT].pos[2];
var_t3 = 1;
surfaceType = player->boundingBoxCorners[2].surfaceType;
surfaceType = player->tyres[BACK_LEFT].surfaceType;
}
if ((temp_v0 == 2) || (temp_v0 == 6)) {
var_f2 = player->boundingBoxCorners[3].cornerPos[0];
var_f12 = player->boundingBoxCorners[3].cornerGroundY + 2.0f;
var_f14 = player->boundingBoxCorners[3].cornerPos[2];
var_f2 = player->tyres[BACK_RIGHT].pos[0];
var_f12 = player->tyres[BACK_RIGHT].baseHeight + 2.0f;
var_f14 = player->tyres[BACK_RIGHT].pos[2];
var_t3 = 0;
surfaceType = player->boundingBoxCorners[3].surfaceType;
surfaceType = player->tyres[BACK_RIGHT].surfaceType;
}
switch (surfaceType) {
case DIRT:
@ -3105,19 +3105,19 @@ void func_8005EA94(Player *player, s16 arg1, s32 arg2, s8 arg3, UNUSED s8 arg4)
var_t0 = 0x000000FF;
temp_v0 = random_int(test);
if ((temp_v0 == 0) || (temp_v0 == 8)) {
if ((D_801652A0[arg3] - player->boundingBoxCorners[2].cornerGroundY) >= 3.5) {
var_f2 = player->boundingBoxCorners[2].cornerPos[0];
var_f12 = player->boundingBoxCorners[2].cornerGroundY + 2.0f;
var_f14 = player->boundingBoxCorners[2].cornerPos[2];
if ((D_801652A0[arg3] - player->tyres[BACK_LEFT].baseHeight) >= 3.5) {
var_f2 = player->tyres[BACK_LEFT].pos[0];
var_f12 = player->tyres[BACK_LEFT].baseHeight + 2.0f;
var_f14 = player->tyres[BACK_LEFT].pos[2];
var_t1 = 1;
var_t0 = 0;
}
}
if ((temp_v0 == 2) || (temp_v0 == 6)) {
if ((D_801652A0[arg3] - player->boundingBoxCorners[3].cornerGroundY) >= 3.5) {
var_f2 = player->boundingBoxCorners[3].cornerPos[0];
var_f12 = player->boundingBoxCorners[3].cornerGroundY + 2.0f;
var_f14 = player->boundingBoxCorners[3].cornerPos[2];
if ((D_801652A0[arg3] - player->tyres[BACK_RIGHT].baseHeight) >= 3.5) {
var_f2 = player->tyres[BACK_RIGHT].pos[0];
var_f12 = player->tyres[BACK_RIGHT].baseHeight + 2.0f;
var_f14 = player->tyres[BACK_RIGHT].pos[2];
var_t1 = 0;
var_t0 = 0;
}
@ -3150,18 +3150,18 @@ void func_8005ED48(Player *player, s16 arg1, s32 arg2, UNUSED s8 arg3, UNUSED s8
surfaceType = 0x000000FF;
temp_v0 = random_int(test);
if ((temp_v0 == 2) || (temp_v0 == 4)) {
var_f0 = player->boundingBoxCorners[2].cornerPos[0];
var_f2 = player->boundingBoxCorners[2].cornerGroundY + 2.0f;
var_f12 = player->boundingBoxCorners[2].cornerPos[2];
var_f0 = player->tyres[BACK_LEFT].pos[0];
var_f2 = player->tyres[BACK_LEFT].baseHeight + 2.0f;
var_f12 = player->tyres[BACK_LEFT].pos[2];
var_t3 = 1;
surfaceType = player->boundingBoxCorners[2].surfaceType;
surfaceType = player->tyres[BACK_LEFT].surfaceType;
}
if ((temp_v0 == 0) || (temp_v0 == 6)) {
var_f0 = player->boundingBoxCorners[3].cornerPos[0];
var_f2 = player->boundingBoxCorners[3].cornerGroundY + 2.0f;
var_f12 = player->boundingBoxCorners[3].cornerPos[2];
var_f0 = player->tyres[BACK_RIGHT].pos[0];
var_f2 = player->tyres[BACK_RIGHT].baseHeight + 2.0f;
var_f12 = player->tyres[BACK_RIGHT].pos[2];
var_t3 = 0;
surfaceType = player->boundingBoxCorners[3].surfaceType;
surfaceType = player->tyres[BACK_RIGHT].surfaceType;
}
switch (surfaceType) {
case DIRT:
@ -3333,12 +3333,12 @@ void func_8005F90C(Player *player, s16 arg1, s32 arg2, UNUSED s8 arg3, UNUSED s8
var_f2 = player->pos[1] - player->boundingBoxSize;
var_f12 = player->pos[2];
var_t1 = 1;
surfaceType = player->boundingBoxCorners[2].surfaceType;
surfaceType = player->tyres[BACK_LEFT].surfaceType;
} else {
var_f0 = player->pos[0];
var_f2 = player->pos[1] - player->boundingBoxSize;
var_f12 = player->pos[2];
surfaceType = player->boundingBoxCorners[3].surfaceType;
surfaceType = player->tyres[BACK_RIGHT].surfaceType;
}
switch (surfaceType) {
case DIRT:
@ -4280,11 +4280,11 @@ void func_80063268(Player* player, s16 arg1, UNUSED s8 arg2, UNUSED s8 arg3) {
void func_80063408(Player* player, s16 arg1, UNUSED s8 arg2, UNUSED s8 arg3) {
if (player->unk_258[10 + arg1].unk_010 == 1) {
player->unk_258[10 + arg1].unk_000[2] = player->boundingBoxCorners[2].cornerPos[2] + (player->unk_258[10 + arg1].unk_01E * -7) * coss(player->unk_258[10 + arg1].unk_020);
player->unk_258[10 + arg1].unk_000[0] = player->boundingBoxCorners[2].cornerPos[0] + (player->unk_258[10 + arg1].unk_01E * -7) * sins(player->unk_258[10 + arg1].unk_020);
player->unk_258[10 + arg1].unk_000[2] = player->tyres[BACK_LEFT].pos[2] + (player->unk_258[10 + arg1].unk_01E * -7) * coss(player->unk_258[10 + arg1].unk_020);
player->unk_258[10 + arg1].unk_000[0] = player->tyres[BACK_LEFT].pos[0] + (player->unk_258[10 + arg1].unk_01E * -7) * sins(player->unk_258[10 + arg1].unk_020);
} else {
player->unk_258[10 + arg1].unk_000[2] = player->boundingBoxCorners[3].cornerPos[2] + (player->unk_258[10 + arg1].unk_01E * -7) * coss(player->unk_258[10 + arg1].unk_020);
player->unk_258[10 + arg1].unk_000[0] = player->boundingBoxCorners[3].cornerPos[0] + (player->unk_258[10 + arg1].unk_01E * -7) * sins(player->unk_258[10 + arg1].unk_020);
player->unk_258[10 + arg1].unk_000[2] = player->tyres[BACK_RIGHT].pos[2] + (player->unk_258[10 + arg1].unk_01E * -7) * coss(player->unk_258[10 + arg1].unk_020);
player->unk_258[10 + arg1].unk_000[0] = player->tyres[BACK_RIGHT].pos[0] + (player->unk_258[10 + arg1].unk_01E * -7) * sins(player->unk_258[10 + arg1].unk_020);
}
++player->unk_258[10 + arg1].unk_01E;
@ -4319,19 +4319,19 @@ void func_800635D4(Player* player, s16 arg1, UNUSED s8 arg2, UNUSED s8 arg3) {
if (player->unk_258[10 + arg1].unk_010 == 1) {
if ((player->effects & LIGHTNING_EFFECT)) {
func_80062B18(&sp44, &sp40, &sp3C, -2.0f, 0.0f, (-player->unk_258[10 + arg1].unk_01E * (player->unk_094 / 18.0f) * 216.0f) / 16, -player->unk_258[10 + arg1].unk_020, 2 * -player->unk_206);
player->unk_258[10 + arg1].unk_000[0] = player->boundingBoxCorners[2].cornerPos[0] + sp44;
player->unk_258[10 + arg1].unk_000[2] = player->boundingBoxCorners[2].cornerPos[2] + sp3C;
player->unk_258[10 + arg1].unk_000[0] = player->tyres[BACK_LEFT].pos[0] + sp44;
player->unk_258[10 + arg1].unk_000[2] = player->tyres[BACK_LEFT].pos[2] + sp3C;
} else {
player->unk_258[10 + arg1].unk_000[2] = player->boundingBoxCorners[2].cornerPos[2] + ((-player->unk_258[10 + arg1].unk_01E * (player->unk_094 / 18.0f) * 216.0f) / 16) * coss(player->unk_258[10 + arg1].unk_020);
player->unk_258[10 + arg1].unk_000[0] = player->boundingBoxCorners[2].cornerPos[0] + ((-player->unk_258[10 + arg1].unk_01E * (player->unk_094 / 18.0f) * 216.0f) / 16) * sins(player->unk_258[10 + arg1].unk_020);
player->unk_258[10 + arg1].unk_000[2] = player->tyres[BACK_LEFT].pos[2] + ((-player->unk_258[10 + arg1].unk_01E * (player->unk_094 / 18.0f) * 216.0f) / 16) * coss(player->unk_258[10 + arg1].unk_020);
player->unk_258[10 + arg1].unk_000[0] = player->tyres[BACK_LEFT].pos[0] + ((-player->unk_258[10 + arg1].unk_01E * (player->unk_094 / 18.0f) * 216.0f) / 16) * sins(player->unk_258[10 + arg1].unk_020);
}
} else if ((player->effects & LIGHTNING_EFFECT)) {
func_80062B18(&sp44, &sp40, &sp3C, 2.0f, 0.0f, (-player->unk_258[10 + arg1].unk_01E * (player->unk_094 / 18.0f) * 216.0f) / 16, - player->unk_258[10 + arg1].unk_020, 2 * -player->unk_206);
player->unk_258[10 + arg1].unk_000[0] = player->boundingBoxCorners[3].cornerPos[0] + sp44;
player->unk_258[10 + arg1].unk_000[2] = player->boundingBoxCorners[3].cornerPos[2] + sp3C;
player->unk_258[10 + arg1].unk_000[0] = player->tyres[BACK_RIGHT].pos[0] + sp44;
player->unk_258[10 + arg1].unk_000[2] = player->tyres[BACK_RIGHT].pos[2] + sp3C;
} else {
player->unk_258[10 + arg1].unk_000[2] = player->boundingBoxCorners[3].cornerPos[2] + ((-player->unk_258[10 + arg1].unk_01E * (player->unk_094 / 18.0f) * 216.0f) / 16) * coss(player->unk_258[10 + arg1].unk_020);
player->unk_258[10 + arg1].unk_000[0] = player->boundingBoxCorners[3].cornerPos[0] + ((-player->unk_258[10 + arg1].unk_01E * (player->unk_094 / 18.0f) * 216.0f) / 16) * sins(player->unk_258[10 + arg1].unk_020);
player->unk_258[10 + arg1].unk_000[2] = player->tyres[BACK_RIGHT].pos[2] + ((-player->unk_258[10 + arg1].unk_01E * (player->unk_094 / 18.0f) * 216.0f) / 16) * coss(player->unk_258[10 + arg1].unk_020);
player->unk_258[10 + arg1].unk_000[0] = player->tyres[BACK_RIGHT].pos[0] + ((-player->unk_258[10 + arg1].unk_01E * (player->unk_094 / 18.0f) * 216.0f) / 16) * sins(player->unk_258[10 + arg1].unk_020);
}
++player->unk_258[10 + arg1].unk_01E;
@ -4367,11 +4367,11 @@ void func_800635D4(Player* player, s16 arg1, UNUSED s8 arg2, UNUSED s8 arg3) {
void func_800639DC(Player* player, s16 arg1, UNUSED s8 arg2, UNUSED s8 arg3) {
if (player->unk_258[10 + arg1].unk_010 == 1) {
player->unk_258[10 + arg1].unk_000[2] = player->boundingBoxCorners[2].cornerPos[2] + (-1.8f * player->unk_258[10 + arg1].unk_01E) * coss(player->unk_258[10 + arg1].unk_020);
player->unk_258[10 + arg1].unk_000[0] = player->boundingBoxCorners[2].cornerPos[0] + (-1.8f * player->unk_258[10 + arg1].unk_01E) * sins(player->unk_258[10 + arg1].unk_020);
player->unk_258[10 + arg1].unk_000[2] = player->tyres[BACK_LEFT].pos[2] + (-1.8f * player->unk_258[10 + arg1].unk_01E) * coss(player->unk_258[10 + arg1].unk_020);
player->unk_258[10 + arg1].unk_000[0] = player->tyres[BACK_LEFT].pos[0] + (-1.8f * player->unk_258[10 + arg1].unk_01E) * sins(player->unk_258[10 + arg1].unk_020);
} else {
player->unk_258[10 + arg1].unk_000[2] = player->boundingBoxCorners[3].cornerPos[2] + (-1.8f * player->unk_258[10 + arg1].unk_01E) * coss(player->unk_258[10 + arg1].unk_020);
player->unk_258[10 + arg1].unk_000[0] = player->boundingBoxCorners[3].cornerPos[0] + (-1.8f * player->unk_258[10 + arg1].unk_01E) * sins(player->unk_258[10 + arg1].unk_020);
player->unk_258[10 + arg1].unk_000[2] = player->tyres[BACK_RIGHT].pos[2] + (-1.8f * player->unk_258[10 + arg1].unk_01E) * coss(player->unk_258[10 + arg1].unk_020);
player->unk_258[10 + arg1].unk_000[0] = player->tyres[BACK_RIGHT].pos[0] + (-1.8f * player->unk_258[10 + arg1].unk_01E) * sins(player->unk_258[10 + arg1].unk_020);
}
++player->unk_258[10 + arg1].unk_01E;
player->unk_258[10 + arg1].unk_000[1] += 0.3;
@ -4402,11 +4402,11 @@ void func_800639DC(Player* player, s16 arg1, UNUSED s8 arg2, UNUSED s8 arg3) {
void func_80063BD4(Player* player, s16 arg1, UNUSED s8 arg2, UNUSED s8 arg3) {
if (player->unk_258[10 + arg1].unk_010 == 1) {
player->unk_258[10 + arg1].unk_000[2] = player->boundingBoxCorners[2].cornerPos[2] + (-2 * player->unk_258[10 + arg1].unk_01E * coss(player->unk_258[10 + arg1].unk_020));
player->unk_258[10 + arg1].unk_000[0] = player->boundingBoxCorners[2].cornerPos[0] + (-2 * player->unk_258[10 + arg1].unk_01E * sins(player->unk_258[10 + arg1].unk_020));
player->unk_258[10 + arg1].unk_000[2] = player->tyres[BACK_LEFT].pos[2] + (-2 * player->unk_258[10 + arg1].unk_01E * coss(player->unk_258[10 + arg1].unk_020));
player->unk_258[10 + arg1].unk_000[0] = player->tyres[BACK_LEFT].pos[0] + (-2 * player->unk_258[10 + arg1].unk_01E * sins(player->unk_258[10 + arg1].unk_020));
} else {
player->unk_258[10 + arg1].unk_000[2] = player->boundingBoxCorners[3].cornerPos[2] + (-2 * player->unk_258[10 + arg1].unk_01E * coss(player->unk_258[10 + arg1].unk_020));
player->unk_258[10 + arg1].unk_000[0] = player->boundingBoxCorners[3].cornerPos[0] + (-2 * player->unk_258[10 + arg1].unk_01E * sins(player->unk_258[10 + arg1].unk_020));
player->unk_258[10 + arg1].unk_000[2] = player->tyres[BACK_RIGHT].pos[2] + (-2 * player->unk_258[10 + arg1].unk_01E * coss(player->unk_258[10 + arg1].unk_020));
player->unk_258[10 + arg1].unk_000[0] = player->tyres[BACK_RIGHT].pos[0] + (-2 * player->unk_258[10 + arg1].unk_01E * sins(player->unk_258[10 + arg1].unk_020));
}
++player->unk_258[10 + arg1].unk_01E;
@ -4423,11 +4423,11 @@ void func_80063BD4(Player* player, s16 arg1, UNUSED s8 arg2, UNUSED s8 arg3) {
void func_80063D58(Player* player, s16 arg1, UNUSED s8 arg2, UNUSED s8 arg3) {
if (player->unk_258[10 + arg1].unk_010 == 1) {
player->unk_258[10 + arg1].unk_000[2] = player->boundingBoxCorners[2].cornerPos[2] + ((-player->unk_258[10 + arg1].unk_01E * (player->unk_094 / 18.0f) * 216.0f) / 20.0f) * coss(player->unk_258[10 + arg1].unk_020);
player->unk_258[10 + arg1].unk_000[0] = player->boundingBoxCorners[2].cornerPos[0] + ((-player->unk_258[10 + arg1].unk_01E * (player->unk_094 / 18.0f) * 216.0f) / 20.0f) * sins(player->unk_258[10 + arg1].unk_020);
player->unk_258[10 + arg1].unk_000[2] = player->tyres[BACK_LEFT].pos[2] + ((-player->unk_258[10 + arg1].unk_01E * (player->unk_094 / 18.0f) * 216.0f) / 20.0f) * coss(player->unk_258[10 + arg1].unk_020);
player->unk_258[10 + arg1].unk_000[0] = player->tyres[BACK_LEFT].pos[0] + ((-player->unk_258[10 + arg1].unk_01E * (player->unk_094 / 18.0f) * 216.0f) / 20.0f) * sins(player->unk_258[10 + arg1].unk_020);
} else {
player->unk_258[10 + arg1].unk_000[2] = player->boundingBoxCorners[3].cornerPos[2] + ((-player->unk_258[10 + arg1].unk_01E * (player->unk_094 / 18.0f) * 216.0f) / 20.0f) * coss(player->unk_258[10 + arg1].unk_020);
player->unk_258[10 + arg1].unk_000[0] = player->boundingBoxCorners[3].cornerPos[0] + ((-player->unk_258[10 + arg1].unk_01E * (player->unk_094 / 18.0f) * 216.0f) / 20.0f) * sins(player->unk_258[10 + arg1].unk_020);
player->unk_258[10 + arg1].unk_000[2] = player->tyres[BACK_RIGHT].pos[2] + ((-player->unk_258[10 + arg1].unk_01E * (player->unk_094 / 18.0f) * 216.0f) / 20.0f) * coss(player->unk_258[10 + arg1].unk_020);
player->unk_258[10 + arg1].unk_000[0] = player->tyres[BACK_RIGHT].pos[0] + ((-player->unk_258[10 + arg1].unk_01E * (player->unk_094 / 18.0f) * 216.0f) / 20.0f) * sins(player->unk_258[10 + arg1].unk_020);
}
++player->unk_258[10 + arg1].unk_01E;
@ -5101,22 +5101,49 @@ void func_80066998(Player *player, UNUSED s8 arg1, s16 arg2, s8 arg3) {
}
}
Vtx D_800E8900a[][4] = {
{
{{{ 2, 4, 0}, 0, { 0, 0}, { 0, 255, 255, 112}}},
{{{ 2, 0, 0}, 0, { 0, 4032}, { 0, 255, 255, 112}}},
{{{ 0, 0, 0}, 0, { 1984, 4032}, {255, 255, 0, 112}}},
{{{ 0, 4, 0}, 0, { 1984, 0}, { 0, 255, 255, 112}}},
},
{
{{{ 0, 4, 0}, 0, { 0, 0}, { 0, 255, 255, 112}}},
{{{ 0, 0, 0}, 0, { 0, 4032}, {255, 255, 0, 112}}},
{{{ -2, 0, 0}, 0, { 1984, 4032}, { 0, 255, 255, 112}}},
{{{ -2, 4, 0}, 0, { 1984, 0}, { 0, 255, 255, 112}}},
},
{
{{{ 2, 4, 0}, 0, { 1984, 0}, { 0, 255, 255, 112}}},
{{{ 2, 0, 0}, 0, { 1984, 4032}, { 0, 255, 255, 112}}},
{{{ 0, 0, 0}, 0, { 0, 4032}, {255, 255, 0, 112}}},
{{{ 0, 4, 0}, 0, { 0, 0}, { 0, 255, 255, 112}}},
},
{
{{{ 0, 4, 0}, 0, { 1984, 0}, { 0, 255, 255, 112}}},
{{{ 0, 0, 0}, 0, { 1984, 4032}, {255, 255, 0, 112}}},
{{{ -2, 0, 0}, 0, { 0, 4032}, { 0, 255, 255, 112}}},
{{{ -2, 4, 0}, 0, { 0, 0}, { 0, 255, 255, 112}}},
},
};
void func_80066BAC(Player *player, UNUSED s8 arg1, s16 arg2, s8 arg3) {
Vec3f spDC;
Vec3s spD4;
UNUSED s32 stackPadding;
//Vtx **A_800E8900 = (Vtx **) LOAD_ASSET(D_800E8900);
if ((player->unk_258[arg2].unk_01C == 1) && (player->unk_258[arg2].unk_038 != 0x00FF)) {
Vtx **A_800E8900 = *(Vtx **) LOAD_ASSET(D_800E8900);
if (player->unk_110.unk3C[2] >= 300.0f) {
if (player->collision.surfaceDistance[2] >= 300.0f) {
spDC[1] = player->pos[1] + 5.0f;
} else {
spDC[1] = player->pos[1] - 3.0f;
}
spDC[2] = player->pos[2] + (coss(player->unk_048[arg3]) * -10.0f);
spDC[0] = player->pos[0] + (sins(player->unk_048[arg3]) * -10.0f);
if (player->unk_110.unk3C[2] >= 300.0f) {
if (player->collision.surfaceDistance[2] >= 300.0f) {
spD4[0] = cameras[arg3].rot[0] - 0x4000;
} else {
spD4[0] = 0;
@ -5129,20 +5156,20 @@ void func_80066BAC(Player *player, UNUSED s8 arg1, s16 arg2, s8 arg3) {
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA);
gDPSetRenderMode(gDisplayListHead++, G_RM_ZB_CLD_SURF, G_RM_ZB_CLD_SURF2);
gDPLoadTextureBlock(gDisplayListHead++, D_8018D4C4, G_IM_FMT_IA, G_IM_SIZ_8b, 32, 64, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
gSPVertex(gDisplayListHead++, &A_800E8900[0][player->unk_258[arg2].unk_038], 4, 0);
gSPVertex(gDisplayListHead++, &D_800E8900a[0][player->unk_258[arg2].unk_038], 4, 0);
gSPDisplayList(gDisplayListHead++, common_square_plain_render);
gDPLoadTextureBlock(gDisplayListHead++, D_8018D4C8, G_IM_FMT_IA, G_IM_SIZ_8b, 32, 64, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
gSPVertex(gDisplayListHead++, &A_800E8900[1][player->unk_258[arg2].unk_038], 4, 0);
gSPVertex(gDisplayListHead++, &D_800E8900a[1][player->unk_258[arg2].unk_038], 4, 0);
gSPDisplayList(gDisplayListHead++, D_0D008DA0);
} else {
gSPDisplayList(gDisplayListHead++, D_0D008DB8);
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA);
gDPSetRenderMode(gDisplayListHead++, G_RM_ZB_CLD_SURF, G_RM_ZB_CLD_SURF2);
gDPLoadTextureBlock(gDisplayListHead++, D_8018D4C8, G_IM_FMT_IA, G_IM_SIZ_8b, 32, 64, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
gSPVertex(gDisplayListHead++, &A_800E8900[0][player->unk_258[arg2].unk_038], 4, 0);
gSPVertex(gDisplayListHead++, &D_800E8900a[0][player->unk_258[arg2].unk_038], 4, 0);
gSPDisplayList(gDisplayListHead++, common_square_plain_render);
gDPLoadTextureBlock(gDisplayListHead++, D_8018D4C4, G_IM_FMT_IA, G_IM_SIZ_8b, 32, 64, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
gSPVertex(gDisplayListHead++, &A_800E8900[1][player->unk_258[arg2].unk_038], 4, 0);
gSPVertex(gDisplayListHead++, &D_800E8900a[1][player->unk_258[arg2].unk_038], 4, 0);
gSPDisplayList(gDisplayListHead++, D_0D008DA0);
}
gMatrixEffectCount += 1;
@ -6034,7 +6061,7 @@ void func_8006C6AC(Player *player, s16 arg1, s8 arg2, s8 arg3) {
} else if (!(player->effects & 8) && !(player->effects & 2)) {
if (((player->effects & 0x10) == 0x10) && ((player->type & PLAYER_HUMAN) == PLAYER_HUMAN)) {
func_8005DA30(player, arg1, sp28, arg2_copy, arg3);
} else if (((f64) (D_801652A0[arg2_copy] - player->boundingBoxCorners[3].cornerGroundY) >= 3.5) || ((f64) (D_801652A0[arg2_copy] - player->boundingBoxCorners[2].cornerGroundY) >= 3.5)) {
} else if (((f64) (D_801652A0[arg2_copy] - player->tyres[BACK_RIGHT].baseHeight) >= 3.5) || ((f64) (D_801652A0[arg2_copy] - player->tyres[BACK_LEFT].baseHeight) >= 3.5)) {
func_8005EA94(player, arg1, sp28, arg2_copy, arg3);
} else if (((player->effects & 0x80) == 0x80) || ((player->effects & 0x40) == 0x40)) {
func_8005F90C(player, arg1, sp28, arg2_copy, arg3);

View File

@ -380,7 +380,7 @@ extern s16 D_80165900;
extern s8 D_80165908;
extern s8 D_80165A90;
// extern Objects gObjectList[]; -> objects.h
// extern Object gObjectList[]; -> objects.h
extern s32 objectListSize;
extern Mtx D_80183D60;
@ -542,7 +542,7 @@ extern u8 D_8018D228;
extern s32 D_8018D22C;
// extern s8 D_8018D230; -> objects.h
extern s32 D_8018D240;
extern uintptr_t D_8018D240;
extern u8 *D_8018D248[];
extern f32 D_8018D2A0;
extern s32 D_8018D2A4;

View File

@ -106,7 +106,7 @@ s32 D_8018D22C;
//! Something related to the display of the clouds/stars?
s8 D_8018D230;
UNUSED s32 D_8018D238[2];
s32 D_8018D240;
uintptr_t D_8018D240;
u8 *D_8018D248[22];
f32 D_8018D2A0;
s32 D_8018D2A4;

View File

@ -105,7 +105,7 @@ void func_8006EB10(void) {
}
void clear_object_list() {
bzero(gObjectList, OBJECT_LIST_SIZE * sizeof(Objects));
bzero(gObjectList, OBJECT_LIST_SIZE * sizeof(Object));
objectListSize = -1;
}
@ -141,7 +141,7 @@ void init_item_window(s32 objectIndex) {
}
void func_8006EEE8(s32 courseId) {
D_8018D240 = (s32)dma_textures(gCourseOutlineTextures[courseId], D_800E5520[courseId], D_800E5520[courseId]);
D_8018D240 = (uintptr_t)dma_textures(gCourseOutlineTextures[courseId], D_800E5520[courseId], D_800E5520[courseId]);
// This is incredibly dumb. D_800E5548 ought to be something more like
// `u16 D_800E5548[][2]` but that doesn't match for some insane reason
D_8018D2B0 = D_800E5548[courseId * 2];
@ -824,7 +824,7 @@ void init_course_object(void) {
objectId = indexObjectList2[i];
init_object(objectId, 0);
gObjectList[objectId].pos[0] = gObjectList[objectId].origin_pos[0] = gHedgehogSpawns[i].pos[0] * xOrientation;
gObjectList[objectId].pos[1] = gObjectList[objectId].unk_044 = gHedgehogSpawns[i].pos[1] + 6.0;
gObjectList[objectId].pos[1] = gObjectList[objectId].surfaceHeight = gHedgehogSpawns[i].pos[1] + 6.0;
gObjectList[objectId].pos[2] = gObjectList[objectId].origin_pos[2] = gHedgehogSpawns[i].pos[2];
gObjectList[objectId].unk_0D5 = gHedgehogSpawns[i].unk_06;
gObjectList[objectId].unk_09C = gHedgehogPatrolPoints[i][0] * xOrientation;
@ -1020,7 +1020,7 @@ void init_hud_one_player(void) {
D_8018CFEC = playerHUD[PLAYER_ONE].speedometerX + 0x18;
D_8018CFF4 = playerHUD[PLAYER_ONE].speedometerY + 6;
D_8016579E = 0xDD00;
playerHUD[PLAYER_ONE].rankX = 0x0034;
playerHUD[PLAYER_ONE].rankX = 52;
playerHUD[PLAYER_ONE].rankY = 0x00C8;
playerHUD[PLAYER_ONE].slideRankX = 0;
playerHUD[PLAYER_ONE].slideRankY = 0;

View File

@ -425,33 +425,33 @@ void func_80088150(s32 arg0) {
void func_80088178(s32 objectIndex, s32 arg1) {
s16 temp_a1;
Objects *temp_v1;
Object *object;
temp_v1 = &gObjectList[objectIndex];
object = &gObjectList[objectIndex];
temp_a1 = atan2s(D_80165760[1] - D_80165760[0], D_80165780[1] - D_80165780[0]);
temp_a1 -= temp_v1->direction_angle[1];
temp_a1 -= object->direction_angle[1];
if (temp_a1 > 0) {
temp_v1->direction_angle[1] += (arg1 << 8);
object->direction_angle[1] += (arg1 << 8);
} else if (temp_a1 < 0) {
temp_v1->direction_angle[1] -= (arg1 << 8);
object->direction_angle[1] -= (arg1 << 8);
}
}
// if the code is too ugly for you, then go fix it without tampering with the register allocations
void func_80088228(s32 objectIndex) {
Objects *temp_v0;
temp_v0 = &gObjectList[objectIndex];
temp_v0->unk_084[9] = 0;
temp_v0->controlPoints = temp_v0->spline->controlPoints;
Object *object;
object = &gObjectList[objectIndex];
object->unk_084[9] = 0;
object->controlPoints = object->spline->controlPoints;
/*
This is INCREDIBLY stupid. This should really be
temp_v0->unk_084[8] = temp_v0->spline->numControlPoints;
but for some unholy reason that doesn't match
*/
temp_v0->unk_084[8] = *((s16*)temp_v0->controlPoints - 1);
temp_v0->offset[0] = temp_v0->controlPoints[0].pos[0];
temp_v0->offset[1] = temp_v0->controlPoints[0].pos[1];
temp_v0->offset[2] = temp_v0->controlPoints[0].pos[2];
object->unk_084[8] = *((s16*)object->controlPoints - 1);
object->offset[0] = object->controlPoints[0].pos[0];
object->offset[1] = object->controlPoints[0].pos[1];
object->offset[2] = object->controlPoints[0].pos[2];
func_80086FD4(objectIndex);
}
@ -473,16 +473,16 @@ s32 func_800882B0(s32 objectIndex, s32 arg1) {
}
void func_80088364(s32 objectIndex) {
Objects *temp_v0;
Object *object;
func_800880E4(objectIndex);
func_80088178(objectIndex, 1);
func_800876A0(objectIndex);
if (func_800882B0(objectIndex, 0x0000000A) != 0) {
temp_v0 = &gObjectList[objectIndex];
temp_v0->unk_084[9] = (u16) temp_v0->unk_084[9] + 1;
if (((u16)temp_v0->unk_084[9] + 3) == (u16) temp_v0->unk_084[8]) {
temp_v0->unk_0AE += 1;
object = &gObjectList[objectIndex];
object->unk_084[9] = (u16) object->unk_084[9] + 1;
if (((u16)object->unk_084[9] + 3) == (u16) object->unk_084[8]) {
object->unk_0AE += 1;
} else {
func_80088150(objectIndex);
}
@ -511,12 +511,12 @@ s32 func_8008847C(s32 objectIndex) {
sp2C = 0;
set_object_flag_status_false(objectIndex, 0x00800000);
if (is_obj_flag_status_active(objectIndex, 0x00000400) != 0) {
func_802ADDC8(&D_8018C3B0, 10.0f, gObjectList[objectIndex].pos[0], 20.0f, gObjectList[objectIndex].pos[2]);
check_bounding_collision(&D_8018C3B0, 10.0f, gObjectList[objectIndex].pos[0], 20.0f, gObjectList[objectIndex].pos[2]);
if (D_8018C3B0.unk34 == 1) {
sp2C = 1;
set_object_flag_status_true(objectIndex, 0x00800000);
}
gObjectList[objectIndex].unk_044 = func_802ABE30(gObjectList[objectIndex].pos[0], 0.0f, gObjectList[objectIndex].pos[2], D_8018C3B0.unk3A);
gObjectList[objectIndex].surfaceHeight = calculate_surface_height(gObjectList[objectIndex].pos[0], 0.0f, gObjectList[objectIndex].pos[2], D_8018C3B0.meshIndexZX);
}
return sp2C;
}
@ -527,12 +527,12 @@ s32 func_80088538(s32 objectIndex) {
sp2C = 0;
set_object_flag_status_false(objectIndex, 0x00800000);
if (is_obj_flag_status_active(objectIndex, 0x00000400) != 0) {
func_802ADDC8(&D_8018C3B0, 10.0f, gObjectList[objectIndex].pos[0], 20.0f, gObjectList[objectIndex].pos[2]);
check_bounding_collision(&D_8018C3B0, 10.0f, gObjectList[objectIndex].pos[0], 20.0f, gObjectList[objectIndex].pos[2]);
if (D_8018C3B0.unk34 == 1) {
sp2C = 1;
set_object_flag_status_true(objectIndex, 0x00800000);
}
gObjectList[objectIndex].unk_044 = func_802ABE30(gObjectList[objectIndex].pos[0], 0.0f, gObjectList[objectIndex].pos[2], D_8018C3B0.unk3A);
gObjectList[objectIndex].surfaceHeight = calculate_surface_height(gObjectList[objectIndex].pos[0], 0.0f, gObjectList[objectIndex].pos[2], D_8018C3B0.meshIndexZX);
gObjectList[objectIndex].unk_0B8[0] = atan2s(D_8018C3B0.orientationVector[2], D_8018C3B0.orientationVector[1]) + 0x4000;
gObjectList[objectIndex].unk_0B8[2] = atan2s(D_8018C3B0.orientationVector[0], D_8018C3B0.orientationVector[1]);
}
@ -545,12 +545,12 @@ s32 func_8008861C(s32 objectIndex) {
sp2C = 0;
set_object_flag_status_false(objectIndex, 0x00800000);
if (is_obj_flag_status_active(objectIndex, 0x00000400) != 0) {
func_802ADDC8(&D_8018C3B0, 10.0f, gObjectList[objectIndex].pos[0], 20.0f, gObjectList[objectIndex].pos[2]);
check_bounding_collision(&D_8018C3B0, 10.0f, gObjectList[objectIndex].pos[0], 20.0f, gObjectList[objectIndex].pos[2]);
if (D_8018C3B0.unk34 == 1) {
sp2C = 1;
set_object_flag_status_true(objectIndex, 0x00800000);
}
gObjectList[objectIndex].unk_044 = func_802ABE30(gObjectList[objectIndex].pos[0], 0.0f, gObjectList[objectIndex].pos[2], D_8018C3B0.unk3A);
gObjectList[objectIndex].surfaceHeight = calculate_surface_height(gObjectList[objectIndex].pos[0], 0.0f, gObjectList[objectIndex].pos[2], D_8018C3B0.meshIndexZX);
gObjectList[objectIndex].unk_01C[0] = D_8018C3B0.orientationVector[0];
gObjectList[objectIndex].unk_01C[1] = D_8018C3B0.orientationVector[1];
gObjectList[objectIndex].unk_01C[2] = D_8018C3B0.orientationVector[2];
@ -559,10 +559,10 @@ s32 func_8008861C(s32 objectIndex) {
}
void func_800886F4(s32 objectIndex) {
func_802ADDC8(&D_8018C3B0, 10.0f, gObjectList[objectIndex].pos[0], 20.0f, gObjectList[objectIndex].pos[2]);
check_bounding_collision(&D_8018C3B0, 10.0f, gObjectList[objectIndex].pos[0], 20.0f, gObjectList[objectIndex].pos[2]);
if (D_8018C3B0.unk34 == 1) {
set_object_flag_status_true(objectIndex, 0x00800000);
gObjectList[objectIndex].unk_044 = func_802ABE30(gObjectList[objectIndex].pos[0], 0.0f, gObjectList[objectIndex].pos[2], D_8018C3B0.unk3A);
gObjectList[objectIndex].surfaceHeight = calculate_surface_height(gObjectList[objectIndex].pos[0], 0.0f, gObjectList[objectIndex].pos[2], D_8018C3B0.meshIndexZX);
gObjectList[objectIndex].unk_0B8[0] = atan2s(D_8018C3B0.orientationVector[2], D_8018C3B0.orientationVector[1]) + 0x4000;
gObjectList[objectIndex].unk_0B8[2] = atan2s(D_8018C3B0.orientationVector[0], D_8018C3B0.orientationVector[1]);
return;
@ -571,10 +571,10 @@ void func_800886F4(s32 objectIndex) {
}
void func_800887C0(s32 objectIndex) {
func_802ADDC8(&D_8018C3B0, 10.0f, gObjectList[objectIndex].pos[0], 20.0f, gObjectList[objectIndex].pos[2]);
check_bounding_collision(&D_8018C3B0, 10.0f, gObjectList[objectIndex].pos[0], 20.0f, gObjectList[objectIndex].pos[2]);
if (D_8018C3B0.unk34 == 1) {
set_object_flag_status_true(objectIndex, 0x00800000);
gObjectList[objectIndex].unk_044 = func_802ABE30(gObjectList[objectIndex].pos[0], 0.0f, gObjectList[objectIndex].pos[2], D_8018C3B0.unk3A);
gObjectList[objectIndex].surfaceHeight = calculate_surface_height(gObjectList[objectIndex].pos[0], 0.0f, gObjectList[objectIndex].pos[2], D_8018C3B0.meshIndexZX);
gObjectList[objectIndex].velocity[0] = D_8018C3B0.orientationVector[0];
gObjectList[objectIndex].velocity[1] = D_8018C3B0.orientationVector[1];
gObjectList[objectIndex].velocity[2] = D_8018C3B0.orientationVector[2];
@ -1005,26 +1005,26 @@ f32 func_8008933C(Player *player, s32 objectIndex, f32 arg2, f32 arg3) {
f32 var_f2;
f32 something;
s32 playerId;
Objects *temp_v0;
Object *object;
struct_D_8018CE10 *temp_v1;
playerId = player - gPlayerOne;
temp_v1 = &D_8018CE10[playerId];
var_f2 = 0.0f;
if (temp_v1->unk_18[6] == 0) {
temp_v0 = &gObjectList[objectIndex];
object = &gObjectList[objectIndex];
player->unk_046 |= 2;
player->effects |= 0x8000;
temp_v1->unk_18[6] = 4;
something = (player->pos[0] - temp_v0->pos[0]) * temp_v0->velocity[0];
something = (player->pos[0] - object->pos[0]) * object->velocity[0];
if (something >= 0.0f) {
temp_v1->unk_04[0] = (-player->velocity[0] * arg2) + (temp_v0->velocity[0] * arg3);
temp_v1->unk_04[0] = (-player->velocity[0] * arg2) + (object->velocity[0] * arg3);
} else {
temp_v1->unk_04[0] = -player->velocity[0] * arg2;
}
something = (player->pos[2] - temp_v0->pos[2]) * temp_v0->velocity[2];
something = (player->pos[2] - object->pos[2]) * object->velocity[2];
if (something >= 0.0f) {
temp_v1->unk_04[2] = (-player->velocity[2] * arg2) + (temp_v0->velocity[2] * arg3);
temp_v1->unk_04[2] = (-player->velocity[2] * arg2) + (object->velocity[2] * arg3);
} else {
temp_v1->unk_04[2] = -player->velocity[2] * arg2;
}
@ -1415,11 +1415,11 @@ UNUSED void func_8008A850(s32 arg0) {
}
UNUSED s32 func_8008A870(Player *player) {
return func_802ABD40(player->unk_110.unk3A);
return get_section_id(player->collision.meshIndexZX);
}
s32 func_8008A890(Camera *camera) {
return func_802ABD40(camera->unk_54.unk3A);
return get_section_id(camera->collision.meshIndexZX);
}
s32 func_8008A8B0(s16 arg0, s16 arg1) {
@ -1447,48 +1447,48 @@ void func_8008A920(s32 objectIndex) {
void func_8008A9B8(s32 objectIndex) {
UNUSED s32 temp_t9;
Objects *temp_v0;
Object *object;
temp_v0 = &gObjectList[objectIndex];
temp_v0->controlPoints++;
temp_v0->unk_09A = (s16) (10000 / (s16) (temp_v0->controlPoints[0].velocity));
temp_v0->timer = 0;
object = &gObjectList[objectIndex];
object->controlPoints++;
object->unk_09A = (s16) (10000 / (s16) (object->controlPoints[0].velocity));
object->timer = 0;
func_8008A920(objectIndex);
}
void func_8008AA3C(s32 objectIndex) {
Objects *temp_v0;
temp_v0 = &gObjectList[objectIndex];
temp_v0->controlPoints = temp_v0->spline->controlPoints;
temp_v0->unk_084[9] = 0;
temp_v0->timer = 0;
Object *object;
object = &gObjectList[objectIndex];
object->controlPoints = object->spline->controlPoints;
object->unk_084[9] = 0;
object->timer = 0;
/*
This is INCREDIBLY stupid. This should really be
temp_v0->unk_084[8] = temp_v0->spline->numControlPoints;
but for some unholy reason that doesn't match
*/
temp_v0->unk_084[8] = *((s16*)temp_v0->controlPoints - 1);
temp_v0->offset[0] = temp_v0->controlPoints[0].pos[0];
temp_v0->offset[1] = temp_v0->controlPoints[0].pos[1];
temp_v0->offset[2] = temp_v0->controlPoints[0].pos[2];
temp_v0->unk_09A = (s16) (10000 / temp_v0->controlPoints[0].velocity);
object->unk_084[8] = *((s16*)object->controlPoints - 1);
object->offset[0] = object->controlPoints[0].pos[0];
object->offset[1] = object->controlPoints[0].pos[1];
object->offset[2] = object->controlPoints[0].pos[2];
object->unk_09A = (s16) (10000 / object->controlPoints[0].velocity);
func_8008A920(objectIndex);
func_80086FD4(objectIndex);
}
void func_8008AB10(s32 objectIndex) {
UNUSED s16 temp_t3;
Objects *temp_v0;
Object *object;
temp_v0 = &gObjectList[objectIndex];
temp_v0->offset[0] += temp_v0->velocity[0];
temp_v0->offset[1] += temp_v0->velocity[1];
temp_v0->offset[2] += temp_v0->velocity[2];
temp_v0->timer += (u16)temp_v0->unk_09A;
if (temp_v0->timer >= 0x2710) {
temp_v0->unk_084[9] = (u16)temp_v0->unk_084[9] + 1;
if (((u16)temp_v0->unk_084[9] + 1) == (u16) temp_v0->unk_084[8]) {
temp_v0->unk_0AE += 1;
object = &gObjectList[objectIndex];
object->offset[0] += object->velocity[0];
object->offset[1] += object->velocity[1];
object->offset[2] += object->velocity[2];
object->timer += (u16)object->unk_09A;
if (object->timer >= 0x2710) {
object->unk_084[9] = (u16)object->unk_084[9] + 1;
if (((u16)object->unk_084[9] + 1) == (u16) object->unk_084[8]) {
object->unk_0AE += 1;
} else {
func_8008A9B8(objectIndex);
}
@ -1577,12 +1577,12 @@ UNUSED void func_8008AE94(void) {
// D_80183DC8 is where the spline's derivative polynomial calculations are stored
void func_8008AE9C(s32 objectIndex) {
Objects *temp_v0;
Object *object;
temp_v0 = &gObjectList[objectIndex];
temp_v0->velocity[0] = (D_80183DC8[0] * D_80165760[0]) + (D_80183DC8[1] * D_80165760[1]) + (D_80183DC8[2] * D_80165760[2]) + (D_80183DC8[3] * D_80165760[3]);
temp_v0->velocity[1] = (D_80183DC8[0] * D_80165770[0]) + (D_80183DC8[1] * D_80165770[1]) + (D_80183DC8[2] * D_80165770[2]) + (D_80183DC8[3] * D_80165770[3]);
temp_v0->velocity[2] = (D_80183DC8[0] * D_80165780[0]) + (D_80183DC8[1] * D_80165780[1]) + (D_80183DC8[2] * D_80165780[2]) + (D_80183DC8[3] * D_80165780[3]);
object = &gObjectList[objectIndex];
object->velocity[0] = (D_80183DC8[0] * D_80165760[0]) + (D_80183DC8[1] * D_80165760[1]) + (D_80183DC8[2] * D_80165760[2]) + (D_80183DC8[3] * D_80165760[3]);
object->velocity[1] = (D_80183DC8[0] * D_80165770[0]) + (D_80183DC8[1] * D_80165770[1]) + (D_80183DC8[2] * D_80165770[2]) + (D_80183DC8[3] * D_80165770[3]);
object->velocity[2] = (D_80183DC8[0] * D_80165780[0]) + (D_80183DC8[1] * D_80165780[1]) + (D_80183DC8[2] * D_80165780[2]) + (D_80183DC8[3] * D_80165780[3]);
}
void func_8008AFE0(s32 objectIndex, f32 arg1) {
@ -1608,12 +1608,12 @@ UNUSED void func_8008B030(void) {
// D_80183DA8 is where the spline's polynomial calculations are stored
void func_8008B038(s32 objectIndex) {
Objects *temp_v0;
Object *object;
temp_v0 = &gObjectList[objectIndex];
temp_v0->offset[0] = (D_80183DA8[0] * D_80165760[0]) + (D_80183DA8[1] * D_80165760[1]) + (D_80183DA8[2] * D_80165760[2]) + (D_80183DA8[3] * D_80165760[3]);
temp_v0->offset[1] = (D_80183DA8[0] * D_80165770[0]) + (D_80183DA8[1] * D_80165770[1]) + (D_80183DA8[2] * D_80165770[2]) + (D_80183DA8[3] * D_80165770[3]);
temp_v0->offset[2] = (D_80183DA8[0] * D_80165780[0]) + (D_80183DA8[1] * D_80165780[1]) + (D_80183DA8[2] * D_80165780[2]) + (D_80183DA8[3] * D_80165780[3]);
object = &gObjectList[objectIndex];
object->offset[0] = (D_80183DA8[0] * D_80165760[0]) + (D_80183DA8[1] * D_80165760[1]) + (D_80183DA8[2] * D_80165760[2]) + (D_80183DA8[3] * D_80165760[3]);
object->offset[1] = (D_80183DA8[0] * D_80165770[0]) + (D_80183DA8[1] * D_80165770[1]) + (D_80183DA8[2] * D_80165770[2]) + (D_80183DA8[3] * D_80165770[3]);
object->offset[2] = (D_80183DA8[0] * D_80165780[0]) + (D_80183DA8[1] * D_80165780[1]) + (D_80183DA8[2] * D_80165780[2]) + (D_80183DA8[3] * D_80165780[3]);
}
void func_8008B17C(s32 objectIndex, f32 arg1) {
@ -1683,20 +1683,20 @@ void func_8008B284(s32 objectIndex) {
}
void func_8008B3E4(s32 objectIndex) {
Objects *temp_v0;
Object *object;
UNUSED SplineData *spline;
if (is_obj_index_flag_status_inactive(objectIndex, 8) != 0) {
temp_v0 = &gObjectList[objectIndex];
temp_v0->unk_084[9] = 0;
temp_v0->timer = 0;
temp_v0->controlPoints = temp_v0->spline->controlPoints;
object = &gObjectList[objectIndex];
object->unk_084[9] = 0;
object->timer = 0;
object->controlPoints = object->spline->controlPoints;
/*
This is INCREDIBLY stupid. This should really be
temp_v0->unk_084[8] = temp_v0->spline->numControlPoints;
but for some unholy reason that doesn't match
*/
temp_v0->unk_084[8] = *(((s16*)temp_v0->controlPoints) - 1);
object->unk_084[8] = *(((s16*)object->controlPoints) - 1);
set_object_flag_status_true(objectIndex, 8);
}
@ -1741,15 +1741,15 @@ void func_8008B478(s32 objectIndex, s32 arg1) {
void func_8008B620(s32 objectIndex) {
UNUSED s16 temp_t0;
Objects *temp_v0;
Object *object;
func_8008B478(objectIndex, 0);
temp_v0 = &gObjectList[objectIndex];
if (temp_v0->timer >= 0x2710) {
object = &gObjectList[objectIndex];
if (object->timer >= 0x2710) {
// Have to do it this way due to the u16 cast
temp_v0->unk_084[9] = (u16) temp_v0->unk_084[9] + 1;
if (((u16) temp_v0->unk_084[9] + 3) == (u16) temp_v0->unk_084[8]) {
temp_v0->unk_0AE += 1;
object->unk_084[9] = (u16) object->unk_084[9] + 1;
if (((u16) object->unk_084[9] + 3) == (u16) object->unk_084[8]) {
object->unk_0AE += 1;
} else {
func_8008B44C(objectIndex);
}
@ -1757,14 +1757,14 @@ void func_8008B620(s32 objectIndex) {
}
void func_8008B6A4(s32 objectIndex) {
Objects *temp_v0;
Object *object;
func_8008B478(objectIndex, 1);
temp_v0 = &gObjectList[objectIndex];
if (temp_v0->timer >= 0x2710) {
object = &gObjectList[objectIndex];
if (object->timer >= 0x2710) {
// Have to do it this way due to the u16 cast
temp_v0->unk_084[9] = (u16) temp_v0->unk_084[9] + 1;
if ((u16)temp_v0->unk_084[9] == (u16)temp_v0->unk_084[8]) {
object->unk_084[9] = (u16) object->unk_084[9] + 1;
if ((u16)object->unk_084[9] == (u16)object->unk_084[8]) {
set_object_flag_status_false(objectIndex, 8);
} else {
func_8008B44C(objectIndex);
@ -1834,19 +1834,19 @@ void set_obj_velocity(s32 objectIndex, f32 arg1, f32 arg2, f32 arg3) {
}
void func_8008B928(s32 objectIndex, s16 arg1, s16 arg2, s16 arg3, SplineData *spline) {
Objects *temp_s0;
Object *object;
temp_s0 = &gObjectList[objectIndex];
temp_s0->origin_pos[0] = (f32) arg1;
temp_s0->origin_pos[1] = (f32) arg2;
temp_s0->spline = spline;
temp_s0->origin_pos[2] = (f32) arg3;
temp_s0->velocity[0] = (f32) (spline->controlPoints[1].pos[0] - spline->controlPoints[0].pos[0]);
temp_s0->velocity[1] = (f32) (spline->controlPoints[1].pos[1] - spline->controlPoints[0].pos[1]);
temp_s0->velocity[2] = (f32) (spline->controlPoints[1].pos[2] - spline->controlPoints[0].pos[2]);
temp_s0->direction_angle[1] = get_y_direction_angle(objectIndex);
temp_s0->velocity[2] = func_800416D8(temp_s0->velocity[2], temp_s0->velocity[0], -temp_s0->direction_angle[1]);
temp_s0->direction_angle[0] = get_x_direction_angle(objectIndex);
object = &gObjectList[objectIndex];
object->origin_pos[0] = (f32) arg1;
object->origin_pos[1] = (f32) arg2;
object->spline = spline;
object->origin_pos[2] = (f32) arg3;
object->velocity[0] = (f32) (spline->controlPoints[1].pos[0] - spline->controlPoints[0].pos[0]);
object->velocity[1] = (f32) (spline->controlPoints[1].pos[1] - spline->controlPoints[0].pos[1]);
object->velocity[2] = (f32) (spline->controlPoints[1].pos[2] - spline->controlPoints[0].pos[2]);
object->direction_angle[1] = get_y_direction_angle(objectIndex);
object->velocity[2] = func_800416D8(object->velocity[2], object->velocity[0], -object->direction_angle[1]);
object->direction_angle[0] = get_x_direction_angle(objectIndex);
}
UNUSED void object_origin_pos_randomize_around_x(s32 objectIndex, s16 x, u16 arg2) {
@ -1924,15 +1924,15 @@ void object_calculate_new_pos_offset(s32 objectIndex) {
}
void func_8008BF64(s32 objectIndex) {
Objects *temp_v0;
Object *object;
temp_v0 = &gObjectList[objectIndex];
D_80183E40[0] = temp_v0->pos[0];
D_80183E40[1] = temp_v0->pos[1];
D_80183E40[2] = temp_v0->pos[2];
D_80183E80[0] = temp_v0->direction_angle[0];
D_80183E80[1] = temp_v0->direction_angle[1];
D_80183E80[2] = temp_v0->direction_angle[2];
object = &gObjectList[objectIndex];
D_80183E40[0] = object->pos[0];
D_80183E40[1] = object->pos[1];
D_80183E40[2] = object->pos[2];
D_80183E80[0] = object->direction_angle[0];
D_80183E80[1] = object->direction_angle[1];
D_80183E80[2] = object->direction_angle[2];
}
void func_8008BFC0(s32 objectIndex) {
@ -1941,17 +1941,17 @@ void func_8008BFC0(s32 objectIndex) {
}
void func_8008BFFC(s32 objectIndex) {
Objects *temp_v1;
Object *object;
temp_v1 = &gObjectList[objectIndex];
switch (temp_v1->unk_0DE) {
object = &gObjectList[objectIndex];
switch (object->unk_0DE) {
case 1:
if (temp_v1->unk_0AE == 1) {
if (object->unk_0AE == 1) {
func_8008B620(objectIndex);
}
break;
case 2:
switch (temp_v1->unk_0AE) {
switch (object->unk_0AE) {
case 0:
break;
case 1:
@ -1960,7 +1960,7 @@ void func_8008BFFC(s32 objectIndex) {
}
break;
case 3:
switch (temp_v1->unk_0AE) {
switch (object->unk_0AE) {
case 0:
break;
case 1:
@ -1969,7 +1969,7 @@ void func_8008BFFC(s32 objectIndex) {
}
break;
case 4:
switch (temp_v1->unk_0AE) { /* switch 1; irregular */
switch (object->unk_0AE) { /* switch 1; irregular */
case 0: /* switch 1 */
break;
case 1: /* switch 1 */
@ -1981,7 +1981,7 @@ void func_8008BFFC(s32 objectIndex) {
}
break;
case 5:
switch (temp_v1->unk_0AE) { /* switch 2; irregular */
switch (object->unk_0AE) { /* switch 2; irregular */
case 0: /* switch 2 */
break;
case 1: /* switch 2 */
@ -1993,7 +1993,7 @@ void func_8008BFFC(s32 objectIndex) {
}
break;
case 6:
switch (temp_v1->unk_0AE) {
switch (object->unk_0AE) {
case 0:
break;
case 1:
@ -2002,7 +2002,7 @@ void func_8008BFFC(s32 objectIndex) {
}
break;
case 7:
switch (temp_v1->unk_0AE) { /* switch 3; irregular */
switch (object->unk_0AE) { /* switch 3; irregular */
case 0: /* switch 3 */
break;
case 1: /* switch 3 */

View File

@ -47,9 +47,10 @@ UNUSED void func_800914E0(void) {
camera->pos[1] = (f32) (tempData->pos[1] + 7);
camera->pos[2] = (f32) (tempData->pos[2] - 20);
camera->lookAt[0] = gPlayerOneCopy->pos[0];
camera->lookAt[1] = gPlayerOneCopy->pos[1];
camera->lookAt[2] = gPlayerOneCopy->pos[2];
func_802ADDC8(&camera->unk_54, 20.0f, camera->pos[0], camera->pos[1], camera->pos[2]);
check_bounding_collision(&camera->collision, 20.0f, camera->pos[0], camera->pos[1], camera->pos[2]);
sp38 = camera->lookAt[0] - camera->pos[0];
sp34 = camera->lookAt[1] - camera->pos[1];
sp30 = camera->lookAt[2] - camera->pos[2];

View File

@ -7,4 +7,4 @@ void func_80091440(s8);
void func_800914A0(void);
void func_800914E0(void);
#endif // CODE_80091440_H
#endif // CODE_80091440_H

View File

@ -2319,7 +2319,7 @@ void func_80093C98(s32 arg0) {
guOrtho(&gGfxPool->mtxEffect[gMatrixEffectCount], 0.0f, 319.0f, 239.0f, 0.0f, -100.0f, 100.0f, 1.0f);
gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxEffect[gMatrixEffectCount++]), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
gSPDisplayList(gDisplayListHead++, D_02007F18);
gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, 320, 240);
gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
func_800A8250();
if (arg0 == 0) {
func_800A54EC();
@ -2365,7 +2365,7 @@ void func_80093F10(void) {
guOrtho(&gGfxPool->mtxEffect[gMatrixEffectCount], 0.0f, 319.0f, 239.0f, 0.0f, -100.0f, 100.0f, 1.0f);
gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxEffect[gMatrixEffectCount++]), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
gSPDisplayList(gDisplayListHead++, D_02007F18);
gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, 320, 240);
gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
func_80092290(4, D_8018E850, D_8018E858);
func_80092290(5, (s32 *) &D_8018E850[1], (s32 *) &D_8018E858[1]);
func_8009C918();
@ -2381,7 +2381,7 @@ void func_80093F10(void) {
void func_800940EC(s32 arg0) {
gSPViewport(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(D_802B8880));
gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, 320, 240);
gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
guOrtho(&gGfxPool->mtxEffect[gMatrixEffectCount], 0.0f, 319.0f, 239.0f, 0.0f, -100.0f, 100.0f, 1.0f);
gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxEffect[gMatrixEffectCount++]), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
gSPDisplayList(gDisplayListHead++, D_02007F18);
@ -2476,7 +2476,7 @@ void func_80094A64(struct GfxPool *pool) {
gMatrixHudCount = 0;
gMatrixEffectCount = 0;
gSPViewport(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(D_802B8880));
gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, 320, 240);
gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
guOrtho(&pool->mtxScreen, 0.0f, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1, 0.0f, -100.0f, 100.0f, 1.0f);
gSPMatrix(gDisplayListHead++, &pool->mtxScreen, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
gSPDisplayList(gDisplayListHead++, D_02007650);
@ -3452,11 +3452,11 @@ Gfx *draw_box_fill(Gfx *displayListHead, s32 ulx, s32 uly, s32 lrx, s32 lry, s32
if ((lrx < 0) || (lry < 0)) {
return displayListHead;
}
if (lrx >= 0x140) {
lrx = 0x13F;
if (lrx >= SCREEN_WIDTH) {
lrx = SCREEN_WIDTH - 1;
}
if (lry >= 0xF0) {
lry = 0xEF;
if (lry >= SCREEN_HEIGHT) {
lry = SCREEN_HEIGHT - 1;
}
gSPDisplayList(displayListHead++, D_02008030);
gDPSetFillColor(displayListHead++, (GPACK_RGBA5551(red, green, (u32)blue, alpha) << 0x10 | GPACK_RGBA5551(red, green, (u32)blue, alpha)));
@ -3465,6 +3465,44 @@ Gfx *draw_box_fill(Gfx *displayListHead, s32 ulx, s32 uly, s32 lrx, s32 lry, s32
return displayListHead;
}
// draw a box filled with a solid color
Gfx *draw_box_fill_wide(Gfx *displayListHead, s32 ulx, s32 uly, s32 lrx, s32 lry, s32 red, s32 green, s32 blue, s32 alpha) {
red &= 0xFF;
green &= 0xFF;
blue &= 0xFF;
alpha &= 0xFF;
if (lrx < ulx) {
swap_values(&ulx, &lrx);
}
if (lry < uly) {
swap_values(&uly, &lry);
}
if ((ulx >= 0x140) || (uly >= 0xF0)) {
return displayListHead;
}
if (ulx < 0) {
ulx = 0;
}
if (uly < 0) {
uly = 0;
}
if ((lrx < 0) || (lry < 0)) {
return displayListHead;
}
if (lrx >= SCREEN_WIDTH) {
lrx = SCREEN_WIDTH - 1;
}
if (lry >= SCREEN_HEIGHT) {
lry = SCREEN_HEIGHT - 1;
}
gSPDisplayList(displayListHead++, D_02008030);
gDPSetFillColor(displayListHead++, (GPACK_RGBA5551(red, green, (u32)blue, alpha) << 0x10 | GPACK_RGBA5551(red, green, (u32)blue, alpha)));
gDPFillWideRectangle(displayListHead++, OTRGetDimensionFromLeftEdge(ulx), uly, OTRGetDimensionFromRightEdge(lrx), lry);
//gDPFillRectangle(displayListHead++, ulx, uly, lrx, lry);
gSPDisplayList(displayListHead++, D_02008058);
return displayListHead;
}
// draw a box with a solid outline
Gfx *draw_box(Gfx *displayListHead, s32 ulx, s32 uly, s32 lrx, s32 lry, u32 red, u32 green, u32 blue, u32 alpha) {
red &= 0xFF;
@ -3497,11 +3535,17 @@ Gfx *draw_box(Gfx *displayListHead, s32 ulx, s32 uly, s32 lrx, s32 lry, u32 red,
}
gSPDisplayList(displayListHead++, D_02008008);
gDPSetPrimColor(displayListHead++, 0, 0, red, green, blue, alpha);
//gDPFillWideRectangle(displayListHead++, OTRGetRectDimensionFromLeftEdge(0), uly, OTRGetRectDimensionFromRightEdge(SCREEN_WIDTH), lry);
gDPFillRectangle(displayListHead++, ulx, uly, lrx, lry);
gDPPipeSync(displayListHead++);
return displayListHead;
}
//! @todo Need to call this somewhere on func_800A2D1C
Gfx *draw_box_fill_wide_wrap(Gfx *displayListHead, s32 ulx, s32 uly, s32 lrx, s32 lry) {
return draw_box_fill_wide(displayListHead, ulx, uly, lrx, lry, 0, 0, 0, 0xFF);
}
Gfx *func_80098FC8(Gfx *displayListHead, s32 ulx, s32 uly, s32 lrx, s32 lry) {
return draw_box_fill(displayListHead, ulx, uly, lrx, lry, 0, 0, 0, 0xFF);
}
@ -3558,6 +3602,7 @@ void func_80099184(MkTexture *arg0) {
MkTexture *texture = arg0;
UNUSED struct_8018E118_entry *thing;
while (texture->textureData != NULL) {
u8 *textureData = (u8 *) LOAD_ASSET(texture->textureData);
var_a1 = 0;
for (var_v0 = 0; var_v0 < gNumD_8018E118Entries; var_v0++) {
// wtf is going on here?
@ -3579,14 +3624,17 @@ void func_80099184(MkTexture *arg0) {
//dma_copy_base_729a30(texture->textureData, var_a1_2, D_8018D9B4);
//mio0decode(D_8018D9B4, (u8*)&D_8018D9B0[gD_8018E118TotalSize]);
// * 2 here is just a guess
memcpy(&D_8018D9B0[gD_8018E118TotalSize], texture->textureData, texture->height * texture->width * 2);
size_t size = ResourceGetTexSizeByName(texture->textureData);
memcpy(&D_8018D9B0[gD_8018E118TotalSize], textureData, size);
} else {
//dma_copy_base_729a30(texture->textureData, texture->height * texture->width * 2, &D_8018D9B0[gD_8018E118TotalSize]);
// * 2 here is just a guess
memcpy(&D_8018D9B0[gD_8018E118TotalSize], texture->textureData, texture->height * texture->width * 2);
size_t size = ResourceGetTexSizeByName(texture->textureData);
memcpy(&D_8018D9B0[gD_8018E118TotalSize], textureData, size);
}
thing = &D_8018E118[gNumD_8018E118Entries];
printf("test: %s\n",texture->textureData);
thing->textureData = texture->textureData;
thing = &D_8018E118[gNumD_8018E118Entries];
thing->offset = gD_8018E118TotalSize;
@ -3595,7 +3643,7 @@ void func_80099184(MkTexture *arg0) {
gNumD_8018E118Entries += 1;
gD_8018E118TotalSize = ((gD_8018E118TotalSize / 8) * 8) + 8;
}
//texture++;
texture++;
break;
}
}
@ -6496,7 +6544,7 @@ s32 func_800A095C(char *someString, s32 len, s32 column, s32 row) {
// Same functionality, but doesn't match byte for byte :/
void func_800A09E0(struct_8018D9E0_entry *arg0) {
s32 table_row, x = 0x20, y;
gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, 319, 194);
gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH - 1, 194);
for(table_row = 0; table_row < 9; table_row++) {
if ((D_800E86D0[0] != 0) || ((table_row != 0) && (table_row != 8))) {
y = (table_row * 0xA) + arg0->row;
@ -6558,7 +6606,7 @@ void func_800A0B80(struct_8018D9E0_entry *arg0) {
} while (var_s0 != 0);
}
}
gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, 319, 239);
gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1);
}
void func_800A0DFC(void) {
@ -7145,8 +7193,8 @@ GLOBAL_ASM("asm/non_matchings/code_80091750/func_800A1FB0.s")
void func_800A2D1C(struct_8018D9E0_entry *arg0) {
switch (D_80164A28) {
case 1:
gDisplayListHead = func_80098FC8(gDisplayListHead, 0, 0, 0x13F, 0x28);
gDisplayListHead = func_80098FC8(gDisplayListHead, 0, 0xC7, 0x13F, 0xEF);
gDisplayListHead = func_80098FC8(gDisplayListHead, 0, 0, SCREEN_WIDTH - 1, 40);
gDisplayListHead = func_80098FC8(gDisplayListHead, 0, 0xC7, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1);
arg0->unk1C = 0x28;
break;
case 2:

View File

@ -2,6 +2,7 @@
#include "courses/all_course_data.h"
#include <assets/ceremony_data.h>
#include <assets/mario_raceway_data.h>
#include <assets/luigi_raceway_data.h>
// @warning Array contains an extra zero element at the end.
KartAIBehaviour *gKartAIBehaviourLUT[] = {

View File

@ -258,7 +258,7 @@ void func_8008C528(Player *player, s8 arg1) {
void func_8008C62C(Player *player, s8 arg1) {
func_80031F48(player, 5.0f);
decelerate_ai_player(player, 5.0f);
player->unk_0A8 += (s16)0xA0;
player->unk_042 += (s16)0x71C;
if (player->unk_0A8 >= 0x2000) {
@ -356,15 +356,15 @@ void func_8008C9EC(Player *player, s8 arg1) {
player->unk_206 = 0;
player->slopeAccel = 0;
if ((player->unk_046 & 0x40) == 0x40) {
func_80031F48(player, 100.0f);
decelerate_ai_player(player, 100.0f);
} else {
if ((player->type & PLAYER_HUMAN) == PLAYER_HUMAN) {
func_80031F48(player, 1.0f);
decelerate_ai_player(player, 1.0f);
} else {
func_80031F48(player, 4.0f);
decelerate_ai_player(player, 4.0f);
}
if (!(player->type & PLAYER_HUMAN)) {
func_80031F48(player, 30.0f);
decelerate_ai_player(player, 30.0f);
}
}
if ((player->effects & 0x80) == 0x80) {
@ -756,7 +756,7 @@ void apply_hit_effect(Player* player, s8 arg1) {
player->unk_0C0 = 0;
player->unk_08C = 0.0f;
player->currentSpeed = 0.0f;
if ((player->unk_110.unk3C[2] >= 600.0f) || ((player->effects & 0x1000) != 0)) { D_8018D990[arg1] = 3; } // placed block on same line to match
if ((player->collision.surfaceDistance[2] >= 600.0f) || ((player->effects & 0x1000) != 0)) { D_8018D990[arg1] = 3; } // placed block on same line to match
switch (D_8018D990[arg1]) {
case 0:
@ -822,7 +822,7 @@ void apply_hit_effect(Player* player, s8 arg1) {
player->unk_238 = 0;
}
if (player->unk_110.unk3C[2] >= 600.0f) {
if (player->collision.surfaceDistance[2] >= 600.0f) {
D_8018D990[arg1] = 3;
}
@ -920,7 +920,7 @@ void apply_lightning_effect(Player *player, s8 arg1) {
D_80165190[3][arg1] = 1;
}
}
func_80031F48(player, 1.0f);
decelerate_ai_player(player, 1.0f);
} else {
player->unk_0B0 += 1;
player->unk_08C = (f32) ((f64) player->unk_08C * 0.6);

View File

@ -150,10 +150,10 @@ void load_credits(void) {
D_8015F59C = 0;
D_8015F5A0 = 0;
D_8015F58C = 0;
D_8015F588 = 0;
gCollisionMeshCount = 0;
D_800DC5BC = 0;
D_800DC5C8 = 0;
gSurfaceMap = (mk64_surface_map_ram *) gNextFreeMemoryAddress;
gCollisionMesh = (CollisionTriangle *) gNextFreeMemoryAddress;
camera->pos[0] = 1400.0f;
camera->pos[1] = 300.0f;
camera->pos[2] = 1400.0f;

View File

@ -131,21 +131,21 @@ void load_ceremony_cutscene(void) {
D_8015F59C = 0;
D_8015F5A0 = 0;
D_8015F58C = 0;
D_8015F588 = (u16)0;
gCollisionMeshCount = (u16)0;
D_800DC5BC = (u16)0;
D_800DC5C8 = (u16)0;
gSurfaceMap = (mk64_surface_map_ram *) gNextFreeMemoryAddress;
gCollisionMesh = (CollisionTriangle *) gNextFreeMemoryAddress;
//! @bug these segmented addresses need to be symbols for mobility
set_vertex_data_with_default_section_id(d_course_royal_raceway_packed_dl_67E8, -1);
set_vertex_data_with_default_section_id(d_course_royal_raceway_packed_dl_AEF8, -1);
set_vertex_data_with_default_section_id(d_course_royal_raceway_packed_dl_A970, 8);
set_vertex_data_with_default_section_id(d_course_royal_raceway_packed_dl_AC30, 8);
set_vertex_data_with_default_section_id(d_course_royal_raceway_packed_dl_CE0, 0x10);
set_vertex_data_with_default_section_id(d_course_royal_raceway_packed_dl_E88, 0x10);
set_vertex_data_with_default_section_id(d_course_royal_raceway_packed_dl_A618, -1);
set_vertex_data_with_default_section_id(d_course_royal_raceway_packed_dl_A618, -1);
set_vertex_data_with_default_section_id(d_course_royal_raceway_packed_dl_23F8, 1);
set_vertex_data_with_default_section_id(d_course_royal_raceway_packed_dl_2478, 1);
generate_collision_mesh_with_default_section_id(d_course_royal_raceway_packed_dl_67E8, -1);
generate_collision_mesh_with_default_section_id(d_course_royal_raceway_packed_dl_AEF8, -1);
generate_collision_mesh_with_default_section_id(d_course_royal_raceway_packed_dl_A970, 8);
generate_collision_mesh_with_default_section_id(d_course_royal_raceway_packed_dl_AC30, 8);
generate_collision_mesh_with_default_section_id(d_course_royal_raceway_packed_dl_CE0, 0x10);
generate_collision_mesh_with_default_section_id(d_course_royal_raceway_packed_dl_E88, 0x10);
generate_collision_mesh_with_default_section_id(d_course_royal_raceway_packed_dl_A618, -1);
generate_collision_mesh_with_default_section_id(d_course_royal_raceway_packed_dl_A618, -1);
generate_collision_mesh_with_default_section_id(d_course_royal_raceway_packed_dl_23F8, 1);
generate_collision_mesh_with_default_section_id(d_course_royal_raceway_packed_dl_2478, 1);
func_80295C6C();
debug_switch_character_ceremony_cutscene();
func_802818BC();

View File

@ -1717,18 +1717,18 @@ void load_kart_texture(Player *player, s8 playerId, s8 screenId, s8 screenId2, s
// &gDmaIoMesg,
// OS_MESG_PRI_NORMAL, OS_READ,
// (uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(
// gKartTextureTable1[player->characterId][player->animGroupSelector[arg2]][player->animFrameSelector[arg2]]
// gKartTextureTable1[player->characterId][player->animGroupSelector[screenId]][player->animFrameSelector[screenId]]
// )],
// &D_802DFB80[arg4][arg3][playerId],
// D_800DDEB0[player->characterId],
// &gDmaMesgQueue
// );
printf("T1 kart %s\n", texture);
//printf("T1 kart %s\n", texture);
//return gKartTextureTable1[player->characterId][player->animGroupSelector[screenId]][player->animFrameSelector[screenId]];
size = ResourceGetTexSizeByName(texture);
asset = (u8 *) LOAD_ASSET(texture);
memcpy(&D_802BFB80.arraySize8[zero][screenId2][playerId], asset, size);
memcpy(&D_802DFB80[zero][screenId2][playerId], asset, 0x1000);
//osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
} else {
@ -1748,9 +1748,9 @@ void load_kart_texture(Player *player, s8 playerId, s8 screenId, s8 screenId2, s
texture = gKartTextureTable0[player->characterId][player->animGroupSelector[screenId]][player->animFrameSelector[screenId]];
size = ResourceGetTexSizeByName(texture);
printf("T0 kart %s\n",texture);
//printf("T0 kart %s\n",texture);
asset = (u8 *) LOAD_ASSET(texture);
memcpy(&D_802BFB80.arraySize8[zero][screenId2][playerId], asset, size);
memcpy(&D_802DFB80[zero][screenId2][playerId], asset, 0x1000);
//osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
}
} else if (((temp & 0x400) == 0x400) || ((temp & 0x01000000) == 0x01000000) || ((temp & 0x02000000) == 0x02000000) || ((temp & 0x10000) == 0x10000)) {
@ -1768,10 +1768,10 @@ void load_kart_texture(Player *player, s8 playerId, s8 screenId, s8 screenId2, s
// &gDmaMesgQueue
// );
texture = gKartTextureTumbles[player->characterId][player->unk_0A8 >> 8];
printf("Tum Kart %s\n",texture);
//printf("Tum Kart %s\n",texture);
size = ResourceGetTexSizeByName(texture);
asset = (u8 *) LOAD_ASSET(texture);
memcpy(&D_802BFB80.arraySize8[zero][screenId2][playerId], asset, size);
memcpy(&D_802DFB80[zero][screenId2][playerId], asset, 0x1000);
osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
} else {
@ -1790,10 +1790,10 @@ void load_kart_texture(Player *player, s8 playerId, s8 screenId, s8 screenId2, s
// );
texture = gKartTextureTable0[player->characterId][player->animGroupSelector[screenId]][player->animFrameSelector[screenId]];
printf("T0 kart 2 %s\n", texture);
//printf("T0 kart 2 %s\n", texture);
size = ResourceGetTexSizeByName(texture);
asset = (u8 *) LOAD_ASSET(texture);
memcpy(&D_802BFB80.arraySize8[zero][screenId2][playerId], asset, size);
memcpy(&D_802DFB80[zero][screenId2][playerId], asset, 0x1000);
//osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
}
@ -1823,10 +1823,10 @@ void func_80027560(Player *player, s8 arg1, s8 arg2, s8 arg3, s8 arg4, size_t i)
// );
texture = gKartTextureTable1[player->characterId][player->animGroupSelector[arg2]][player->animFrameSelector[arg2]];
printf("T1 kart 2 %s\n", texture);
//printf("T1 kart 2 %s\n", texture);
size = ResourceGetTexSizeByName(texture);
asset = (u8 *) LOAD_ASSET(texture);
memcpy(&D_802BFB80.arraySize8[D_801651D0[D_80164AC0[i - 1]][D_80164AB0[i - 1]]][D_80164AC0[i - 1]][D_80164AB0[i - 1]].pixel_index_array,
memcpy(&D_802DFB80[arg4][arg3][arg1],
asset, size);
} else {
@ -1844,10 +1844,10 @@ void func_80027560(Player *player, s8 arg1, s8 arg2, s8 arg3, s8 arg4, size_t i)
// &gDmaMesgQueue
// );
texture = gKartTextureTable0[player->characterId][player->animGroupSelector[arg2]][player->animFrameSelector[arg2]];
printf("T0 kart 3 %s\n", texture);
//printf("T0 kart 3 %s\n", texture);
size = ResourceGetTexSizeByName(texture);
asset = (u8 *) LOAD_ASSET(texture);
memcpy(&D_802BFB80.arraySize8[D_801651D0[D_80164AC0[i - 1]][D_80164AB0[i - 1]]][D_80164AC0[i - 1]][D_80164AB0[i - 1]].pixel_index_array, asset, size);
memcpy(&D_802DFB80[arg4][arg3][arg1], asset, size);
}
} else if (((temp & 0x400) == 0x400) || ((temp & 0x01000000) == 0x01000000) ||
((temp & 0x02000000) == 0x02000000) || ((temp & 0x10000) == 0x10000))
@ -1866,10 +1866,10 @@ void func_80027560(Player *player, s8 arg1, s8 arg2, s8 arg3, s8 arg4, size_t i)
// &gDmaMesgQueue
// );
texture = gKartTextureTumbles[player->characterId][player->unk_0A8 >> 8];
printf("Tum kart 2 %s\n", texture);
//printf("Tum kart 2 %s\n", texture);
size = ResourceGetTexSizeByName(texture);
asset = (u8 *) LOAD_ASSET(texture);
memcpy(&D_802BFB80.arraySize8[D_801651D0[D_80164AC0[i - 1]][D_80164AB0[i - 1]]][D_80164AC0[i - 1]][D_80164AB0[i - 1]].pixel_index_array, asset, size);
memcpy(&D_802DFB80[arg4][arg3][arg1], asset, size);
} else {
osInvalDCache(&D_802DFB80[arg4][arg3][arg1], D_800DDEB0[player->characterId]);
@ -1885,10 +1885,10 @@ void func_80027560(Player *player, s8 arg1, s8 arg2, s8 arg3, s8 arg4, size_t i)
// &gDmaMesgQueue
// );
texture = gKartTextureTable0[player->characterId][player->animGroupSelector[arg2]][player->animFrameSelector[arg2]];
printf("T0 kart 4 %s 0x%llX\n", texture, &D_802DFB80[arg4][arg3][arg1]);
//printf("T0 kart 4 %s 0x%llX\n", texture, &D_802DFB80[arg4][arg3][arg1]);
size = ResourceGetTexSizeByName(texture);
asset = (u8 *) LOAD_ASSET(texture);
memcpy(&D_802BFB80.arraySize8[D_801651D0[D_80164AC0[i - 1]][D_80164AB0[i - 1]]][D_80164AC0[i - 1]][D_80164AB0[i - 1]].pixel_index_array, asset, size);
memcpy(&D_802DFB80[arg4][arg3][arg1], asset, size);
}
}
@ -1920,7 +1920,7 @@ void load_kart_palette(Player *player, s8 playerId, s8 screenId, s8 buffer) {
size = ResourceGetTexSizeByName(gKartPalettes[player->characterId]);
asset = (u8 *) LOAD_ASSET(gKartPalettes[player->characterId]);
memcpy(temp_s0, asset, size);
memcpy(&D_802F1F80[buffer][screenId][playerId], asset, size);
//osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
break;
@ -1941,7 +1941,7 @@ void load_kart_palette(Player *player, s8 playerId, s8 screenId, s8 buffer) {
size = ResourceGetTexSizeByName(gKartPalettes[player->characterId]);
asset = (u8 *) LOAD_ASSET(gKartPalettes[player->characterId]);
memcpy(temp_s0, asset, size);
memcpy(&D_802F1F80[buffer][screenId][playerId], asset, size);
//osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
break;
@ -1961,14 +1961,15 @@ void func_80027BDC(UNUSED Player *player, u8 *arg1, void *vAddr, u16 size) {
// &gDmaMesgQueue
// );
// u8 *asset = (u8 *) LOAD_ASSET(arg1);
// memcpy(vAddr, asset, size);
// u8 *asset = (u8 *) LOAD_ASSET(arg1);
// size_t textureSize = ResourceGetTexSizeByName(asset);
// memcpy(vAddr, asset, textureSize);
//osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
}
void func_80027C74(UNUSED Player *player, u8 *texture, void *vAddr, u16 size) {
osInvalDCache(vAddr, size);
//osInvalDCache(vAddr, size);
// osPiStartDma(
// &gDmaIoMesg,
@ -1979,7 +1980,8 @@ void func_80027C74(UNUSED Player *player, u8 *texture, void *vAddr, u16 size) {
// size,
// &gDmaMesgQueue
// );
// size_t textureSize = ResourceGetTexSizeByName(texture);
// printf("test %s\n",texture);
// memcpy(vAddr, texture, textureSize);
//printf("test %s\n",texture);
//size_t textureSize = ResourceGetTexSizeByName(texture);
memcpy(vAddr, texture, size);
}

View File

@ -9,6 +9,8 @@
#include <mk64.h>
#include <stubs.h>
#include "networking/networking.h"
#include "profiler.h"
#include "main.h"
#include "racing/memory.h"
@ -109,7 +111,8 @@ OSMesg gSIEventMesgBuf[3];
OSContStatus gControllerStatuses[4];
OSContPad gControllerPads[4];
u8 gControllerBits;
struct UnkStruct_8015F584 D_8014F110[1024];
// Contains a 32x32 grid of indices into gCollisionIndices containing indices into gCollisionMesh
CollisionGrid gCollisionGrid[1024];
u16 gNumActors;
u16 gMatrixObjectCount;
s32 gTickSpeed;
@ -596,6 +599,12 @@ void race_logic_loop(void) {
case SCREEN_MODE_1P:
gTickSpeed = 2;
staff_ghosts_loop();
// Wait for all racers to load
if (gNetwork.enabled) {
network_all_players_loaded();
}
if (gIsGamePaused == 0) {
for (i = 0; i < gTickSpeed; i++) {
if (D_8015011E) {

View File

@ -58,10 +58,10 @@ struct GfxPool {
/* 0x28B20 */ struct SPTask spTask;
}; // size = 0x28B70
struct UnkStruct_8015F584 {
u16 unk0;
u16 unk2;
};
typedef struct {
u16 triangle; // Index for gCollisionIndices which has indexes for gCollisionMesh
u16 numTriangles;
} CollisionGrid;
void create_thread(OSThread*, OSId, void (*entry)(void *), void*, void*, OSPri);
void main_func(void);
@ -159,7 +159,7 @@ extern OSContStatus gControllerStatuses[];
extern OSContPad gControllerPads[];
extern u8 gControllerBits;
extern struct UnkStruct_8015F584 D_8014F110[];
extern CollisionGrid gCollisionGrid[];
extern u16 gNumActors;
extern u16 gMatrixObjectCount;
extern s32 gTickSpeed;

View File

@ -444,7 +444,7 @@ s32 func_800418E8(f32 arg0, f32 arg1, Vec3f arg2) {
s32 func_80041924(Collision *arg0, Vec3f arg1) {
s32 ret = 0;
func_802ADDC8(arg0, 10.0f, arg1[0], arg1[1], arg1[2]);
check_bounding_collision(arg0, 10.0f, arg1[0], arg1[1], arg1[2]);
if (arg0->unk34 == 1) {
ret = 1;
}
@ -802,32 +802,32 @@ void mtxf_set_matrix_scale_transl(Mat4 transformMatrix, Vec3f vec1, Vec3f vec2,
void mtxf_set_matrix_gObjectList(s32 objectIndex, Mat4 transformMatrix) {
f32 sinX;
Objects *temp_s0 = &gObjectList[objectIndex];
Object *object = &gObjectList[objectIndex];
f32 sinY;
f32 cosY;
f32 sinZ;
f32 cosZ;
f32 cosX;
sinX = sins(temp_s0->orientation[0]);
cosX = coss(temp_s0->orientation[0]);
sinY = sins(temp_s0->orientation[1]);
cosY = coss(temp_s0->orientation[1]);
sinZ = sins(temp_s0->orientation[2]);
cosZ = coss(temp_s0->orientation[2]);
sinX = sins(object->orientation[0]);
cosX = coss(object->orientation[0]);
sinY = sins(object->orientation[1]);
cosY = coss(object->orientation[1]);
sinZ = sins(object->orientation[2]);
cosZ = coss(object->orientation[2]);
transformMatrix[0][0] = temp_s0->sizeScaling * ((cosY * cosZ) + (sinX * sinY * sinZ));
transformMatrix[1][0] = temp_s0->sizeScaling * ((-cosY * sinZ) + sinX * sinY * cosZ);
transformMatrix[2][0] = temp_s0->sizeScaling * (cosX * sinY);
transformMatrix[3][0] = temp_s0->pos[0];
transformMatrix[0][1] = temp_s0->sizeScaling * (cosX * sinZ);
transformMatrix[1][1] = temp_s0->sizeScaling * (cosX * cosZ);
transformMatrix[2][1] = temp_s0->sizeScaling * -sinX;
transformMatrix[3][1] = temp_s0->pos[1];
transformMatrix[0][2] = temp_s0->sizeScaling * ((-sinY * cosZ) + (sinX * cosY * sinZ));
transformMatrix[1][2] = temp_s0->sizeScaling * ((sinY * sinZ) + (sinX * cosY * cosZ));
transformMatrix[2][2] = temp_s0->sizeScaling * (cosX * cosY);
transformMatrix[3][2] = temp_s0->pos[2];
transformMatrix[0][0] = object->sizeScaling * ((cosY * cosZ) + (sinX * sinY * sinZ));
transformMatrix[1][0] = object->sizeScaling * ((-cosY * sinZ) + sinX * sinY * cosZ);
transformMatrix[2][0] = object->sizeScaling * (cosX * sinY);
transformMatrix[3][0] = object->pos[0];
transformMatrix[0][1] = object->sizeScaling * (cosX * sinZ);
transformMatrix[1][1] = object->sizeScaling * (cosX * cosZ);
transformMatrix[2][1] = object->sizeScaling * -sinX;
transformMatrix[3][1] = object->pos[1];
transformMatrix[0][2] = object->sizeScaling * ((-sinY * cosZ) + (sinX * cosY * sinZ));
transformMatrix[1][2] = object->sizeScaling * ((sinY * sinZ) + (sinX * cosY * cosZ));
transformMatrix[2][2] = object->sizeScaling * (cosX * cosY);
transformMatrix[3][2] = object->pos[2];
transformMatrix[0][3] = 0.0f;
transformMatrix[1][3] = 0.0f;
transformMatrix[2][3] = 0.0f;

237
src/networking/networking.c Normal file
View File

@ -0,0 +1,237 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_net.h>
#include <windows.h>
#include "networking.h"
#include "main.h"
#define BUFFER_SIZE 10240
NetworkClient dummyClient; // For use before server sends the real client
NetworkClient *localClient = NULL;
NetworkClient clients[NETWORK_MAX_PLAYERS];
Network gNetwork = {
.enabled = false,
.tcpSocket = NULL,
.address = {0, 64010},
.localPlayer = &gPlayerOne,
.isConnected = false,
.loaded = false, // local player loaded?
.playersLoaded = false,
.gameStarted = false,
};
// Global variables
HANDLE sNetworkThread;
DWORD threadID;
bool threadStarted = false;
int isNetworkingThreadEnabled = true;
void (*remoteConnectedHandler)(void);
void ConnectToServer(char* ip, uint16_t port, char *username) {
if (!threadStarted) {
threadStarted = true;
networking_init(ip, port);
SDL_Delay(20);
localClient = &dummyClient; // Temporary until server sends the real data
set_username(username);
send_str_packet(gNetwork.tcpSocket, PACKET_JOIN, localClient->username);
send_int_packet(gNetwork.tcpSocket, PACKET_SET_CHARACTER, 2, sizeof(uint32_t));
send_str_packet(gNetwork.tcpSocket, PACKET_MESSAGE, "a message");
send_str_packet(gNetwork.tcpSocket, PACKET_MESSAGE, "another message");
}
}
void set_username(const char *username) {
//srand(time(NULL) + rand()); // Use a different seed for each call
//int random_number = rand() % 10000; // Generate a random number between 0 and 9999
//snprintf(localClient->username, sizeof(localClient->username), "%s%d", username, random_number);
strncpy(localClient->username, username, sizeof(localClient->username) - 1);
localClient->username[sizeof(localClient->username) - 1] = '\0'; // Ensure null-termination
}
void networking_init(char* ip, uint16_t port) {
if (SDL_Init(0) == -1) {
fprintf(stderr, "SDL_Init: %s\n", SDL_GetError());
exit(EXIT_FAILURE);
}
if (SDLNet_Init() == -1) {
fprintf(stderr, "SDLNet_Init: %s\n", SDLNet_GetError());
SDL_Quit();
exit(EXIT_FAILURE);
}
if (SDLNet_ResolveHost(&gNetwork.address, ip, port) == -1) {
printf("[GameInteractor] SDLNet_ResolveHost: %s\n", SDLNet_GetError());
}
// Ensure no thread is already running
if (sNetworkThread != NULL) {
WaitForSingleObject(sNetworkThread, INFINITE);
CloseHandle(sNetworkThread);
sNetworkThread = NULL;
}
sNetworkThread = CreateThread(
NULL, // default security attributes
0, // default stack size
networking_loop, // thread function
NULL, // argument to thread function
0, // default creation flags
&threadID // receive thread identifier
);
if (sNetworkThread == NULL) {
printf("CreateThread failed: %d\n", GetLastError());
exit(EXIT_FAILURE);
}
//sNetworkThread = std::thread(&GameInteractor::ReceiveFromServer, this);
}
DWORD WINAPI networking_loop(LPVOID arg) {
while (isNetworkingThreadEnabled) {
while (!gNetwork.isConnected && isNetworkingThreadEnabled) { // && isRemoteInteractorEnabled) {
printf("[SpaghettiOnline] Attempting to make connection to server...\n");
gNetwork.tcpSocket = SDLNet_TCP_Open(&gNetwork.address);
if (gNetwork.tcpSocket) {
gNetwork.isConnected = true;
printf("[SpaghettiOnline] Connection to server established!\n");
if (remoteConnectedHandler) {
remoteConnectedHandler();
}
break;
}
}
SDLNet_SocketSet socketSet = SDLNet_AllocSocketSet(1);
if (gNetwork.tcpSocket) {
SDLNet_TCP_AddSocket(socketSet, gNetwork.tcpSocket);
}
// Listen to socket messages
while (gNetwork.isConnected && gNetwork.tcpSocket && isNetworkingThreadEnabled) { // && isRemoteInteractorEnabled) {
// we check first if socket has data, to not block in the TCP_Recv
int socketsReady = SDLNet_CheckSockets(socketSet, 0);
if (socketsReady == -1) {
printf("[SpaghettiOnline] SDLNet_CheckSockets: %s\n", SDLNet_GetError());
break;
}
if (socketsReady == 0) {
continue;
}
char remoteDataReceived[512];
memset(remoteDataReceived, 0, sizeof(remoteDataReceived));
int len = SDLNet_TCP_Recv(gNetwork.tcpSocket, &remoteDataReceived, sizeof(remoteDataReceived));
if (!len || !gNetwork.tcpSocket || len == -1) {
printf("[SpaghettiOnline] SDLNet_TCP_Recv: %s\n", SDLNet_GetError());
break;
}
handleReceivedData(remoteDataReceived, len); //HandleRemoteData(remoteDataReceived);
// receivedData.append(remoteDataReceived, len);
// // Process all complete packets
// size_t delimiterPos = receivedData.find('\0');
// while (delimiterPos != std::string::npos) {
// // Extract the complete packet until the delimiter
// std::string packet = receivedData.substr(0, delimiterPos);
// // Remove the packet (including the delimiter) from the received data
// receivedData.erase(0, delimiterPos + 1);
// HandleRemoteJson(packet);
// // Find the next delimiter
// delimiterPos = receivedData.find('\0');
// }
}
if (gNetwork.isConnected) {
//SDLNet_TCP_Close(gNetwork.tcpSocket);
gNetwork.isConnected = false;
//if (networking_cleanup) {
networking_cleanup(socketSet);
//}
printf("[SpaghettiOnline] Ending receiving thread...\n");
}
}
return 0;
}
void networking_ready_up(bool value) {
send_int_packet(gNetwork.tcpSocket, PACKET_READY_UP, value, sizeof(int));
}
void handleReceivedData(const char *buffer, size_t bufSize) {
if (bufSize < 4) {
printf("Malformed packet received: too short\n");
return;
}
uint8_t type = (uint8_t)buffer[0];
uint16_t length = (uint16_t)buffer[1] | ((uint16_t)buffer[2] << 8);
// Validate buffer size
if (bufSize < 3 + length) {
printf("Malformed packet received: declared length exceeds buffer size\n");
return;
}
// Point to the data
const char *data = buffer + 3;
switch (type) {
case PACKET_JOIN:
handleJoinPacket(data);
break;
case PACKET_LEAVE:
handleLeavePacket(data);
break;
case PACKET_MESSAGE:
handleMessagePacket(data);
break;
case PACKET_LOADED:
handle_start_game(data);
break;
case PACKET_PLAYER:
replicate_player(data);
break;
case PACKET_COURSE:
set_course(data);
break;
case PACKET_PLAYER_ASSIGN_SLOTS:
printf("\n\n\nASSIGN SLOT\n\n\n");
assign_player_slots(data);
break;
case PACKET_START_SESSION:
networking_start_session(data);
break;
default:
printf("Unknown packet type received: %d\n", type);
break;
}
}
void networking_cleanup(SDLNet_SocketSet socketSet) {
send_str_packet(gNetwork.tcpSocket, PACKET_LEAVE, localClient->username);
SDLNet_TCP_Close(gNetwork.tcpSocket);
SDLNet_FreeSocketSet(socketSet);
SDLNet_Quit();
SDL_Quit;
}

View File

@ -0,0 +1,81 @@
#ifndef NETWORKING_H
#define NETWORKING_H
#include <libultraship.h>
#include <common_structs.h>
#include <SDL2/SDL_net.h>
#include <windows.h>
#define NETWORK_MAX_PLAYERS 8
#define NETWORK_USERNAME_LENGTH 32
enum {
PACKET_JOIN,
PACKET_LEAVE,
PACKET_MESSAGE,
PACKET_LOADED,
PACKET_READY_UP,
PACKET_SET_CHARACTER,
PACKET_COURSE,
PACKET_PLAYER_ASSIGN_SLOTS,
PACKET_START_SESSION,
PACKET_PLAYER,
PACKET_ACTOR,
PACKET_OBJECT
};
typedef struct {
bool enabled; // Enables networking
TCPsocket tcpSocket;
IPaddress address;
Player *localPlayer;
bool isConnected;
bool loaded;
bool playersLoaded; // Are all players loaded?
bool gameStarted;
} Network;
extern Network gNetwork;
typedef struct {
char username[NETWORK_USERNAME_LENGTH];
s32 slot;
s32 isPlayer;
s32 isAI;
s32 character;
s32 hasAuthority;
} NetworkClient;
extern NetworkClient dummyClient;
extern NetworkClient *localClient;
extern NetworkClient clients[];
/* Main Networking */
void ConnectToServer(char* ip, uint16_t port, char *username);
void networking_init(char* ip, uint16_t port);
void networking_update(void);
void networking_ready_up(bool);
void networking_cleanup(void);
DWORD WINAPI networking_loop(LPVOID);
void handleReceivedData(const char *, size_t);
void set_username(const char *username);
/* Start Game */
void spawn_network_players(f32*,f32*,f32);
s32 network_all_players_loaded(void);
void set_course(const char *data);
void networking_start_session(const char *data);
/* Replication */
void replicate_player(const char* data);
void assign_player_slots(const char* data);
/* Packets */
void send_int_packet(TCPsocket socket, uint8_t type, uint32_t payload, uint16_t size);
void handleJoinPacket(const char *data);
void handleLeavePacket(const char *data);
void handleMessagePacket(const char *data);
#endif // NETWORKING_H

129
src/networking/packets.c Normal file
View File

@ -0,0 +1,129 @@
#include <libultraship.h>
#include <SDL2/SDL_net.h>
#include "networking.h"
#include "code_800029B0.h"
void handleJoinPacket(const char *data) {
printf("Join packet received: %s\n", data);
// Handle join logic here
}
void handleLeavePacket(const char *data) {
printf("Leave packet received: %s\n", data);
// Handle leave logic here
}
void handleMessagePacket(const char *data) {
printf("%s\n", data);
// Handle message logic here
}
void handleMessageNumberPacket(const char *data) {
printf("%s\n", data);
// Handle message logic here
}
void handle_start_game() {
gNetwork.playersLoaded = true;
gIsGamePaused = false;
}
#define BUFFER_SIZE 1024
void send_data_packet(TCPsocket socket, int type, const uint8_t* payload, size_t payload_size) {
// uint8_t buffer[BUFFER_SIZE];
// size_t packet_size = sizeof(type) + payload_size;
// if (packet_size > BUFFER_SIZE) {
// fprintf(stderr, "Packet size exceeds buffer size\n");
// return;
// }
// memcpy(buffer, &type, sizeof(type));
// memcpy(buffer + sizeof(type), payload, payload_size);
// int len = SDLNet_TCP_Send(socket, buffer, packet_size);
// if (len < packet_size) {
// fprintf(stderr, "SDLNet_TCP_Send: %s\n", SDLNet_GetError());
// }
}
void send_str_packet(TCPsocket socket, uint8_t type, const char *payload) {
char buffer[BUFFER_SIZE];
int offset = 0;
// Copy the integer type into the buffer
buffer[offset] = type;
offset += sizeof(uint8_t);
// Copy the payload into the buffer
int size = strlen(payload);
if (offset + size >= BUFFER_SIZE) {
fprintf(stderr, "Payload is too large to fit in buffer\n");
return;
}
*(uint16_t *)(buffer + offset) = size;
offset += sizeof(uint16_t);
memcpy(buffer + offset, payload, size);
offset += size;
// Send the buffer through the socket
int len = SDLNet_TCP_Send(socket, buffer, offset);
if (len < offset) {
fprintf(stderr, "SDLNet_TCP_Send: %s\n", SDLNet_GetError());
}
}
// void send_packet(TCPsocket socket, uint8_t type, const char *payload, uint16_t size) {
// // Ensure the buffer is large enough to hold the type, colon, and payload
// if (sizeof(int) + 1 + size > BUFFER_SIZE) {
// fprintf(stderr, "Sending data too big for the buffer\n");
// return;
// }
// char buffer[BUFFER_SIZE];
// int offset = 0;
// // Copy the type into the buffer
// buffer[offset] = type;
// offset += sizeof(uint8_t);
// // Copy the payload into the buffer
// memcpy(buffer + offset, payload, size);
// offset += size;
// // Send the buffer through the socket
// int len = SDLNet_TCP_Send(socket, buffer, offset);
// if (len < offset) {
// fprintf(stderr, "SDLNet_TCP_Send: %s\n", SDLNet_GetError());
// }
// }
void send_int_packet(TCPsocket socket, uint8_t type, uint32_t payload, uint16_t size) {
// Ensure the buffer is large enough to hold the type, colon, and payload
if (sizeof(int) + 1 + size > BUFFER_SIZE) {
fprintf(stderr, "Sending data too big for the buffer\n");
return;
}
char buffer[BUFFER_SIZE];
int offset = 0;
// Write the packet type into the buffer
buffer[offset] = type;
offset += sizeof(uint8_t);
// Write the data size into the buffer
*(uint16_t *)(buffer +offset) = size;
offset += sizeof(uint16_t);
// Write the payload into the buffer
*(uint32_t *)(buffer + offset) = payload;
offset += sizeof(uint32_t);
// Send the buffer through the socket
int len = SDLNet_TCP_Send(socket, buffer, offset);
if (len < offset) {
fprintf(stderr, "SDLNet_TCP_Send: %s\n", SDLNet_GetError());
}
}

View File

@ -0,0 +1,16 @@
#include <libultraship.h>
#include "networking.h"
#include "main.h"
void replicate_player(const char* data) {
// gPlayerOne->pos[0];
//send_data_packet(client, PACKET_PLAYER, &gPlayerOne, sizeof(Player));
}
void ActorReplication() {
}
void ObjectReplication() {
}

187
src/networking/start_game.c Normal file
View File

@ -0,0 +1,187 @@
#include <libultraship.h>
#include <defines.h>
#include "main.h"
#include "spawn_players.h"
#include "networking.h"
#include "code_800029B0.h"
#include "menus.h"
// PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_HUMAN
// PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_KART_AI
void assign_player_control_types(void) {
printf("Assign player control types\n");
for (size_t i = 0; i < NETWORK_MAX_PLAYERS; i++) {
s32 playerIndex = clients[i].slot;
gPlayers[playerIndex].nCharacter = clients[i].character;
gPlayers[playerIndex].nStartingRank = clients[i].slot;
//printf("CHAR %d\n", clients[i].character);
//printf("CHAR2 %d\n", gPlayers[playerIndex].nCharacter);
if (clients[i].isAI) {
gPlayers[playerIndex].nControlFlags = 0;
} else if (clients[i].hasAuthority) {
//printf("PLAYER SLOT %d, INDEX %d\n", clients[i].slot, clients[i].character);
gPlayers[playerIndex].nControlFlags = PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE; // Requires server replication to move.
}
//printf("Player Slot %d, character %d\n", playerIndex, clients[i].character);
}
// Get and Set player
// gNetwork.localPlayer = &gPlayers[i];
}
void set_course(const char* data) {
if (data != NULL) {
gCurrentCourseId = 8; //*(s16 *) data;
}
}
s32 testa = 0;
void assign_player_slots(const char* data) {
if (testa) {
return;
}
testa = 1;
int offset = 0;
printf("Assign Player Slots\n");
for (int i = 0; i < NETWORK_MAX_PLAYERS; ++i) {
// Read username
int usernameLength = *(int*)(data + offset);
offset += sizeof(int);
memcpy(clients[i].username, data + offset, usernameLength);
offset += usernameLength;
// Read slot
clients[i].slot = *(int*)(data + offset);
offset += sizeof(int);
// Read isPlayer
clients[i].isPlayer = *(int*)(data + offset);
offset += sizeof(int);
// Read IsAI
clients[i].isAI = *(int*)(data + offset);
offset += sizeof(int);
// Read character
clients[i].character = *(int*)(data + offset);
offset += sizeof(int);
//gCharacterSelections[i] = clients[i].character;
// Read hasAuthority
clients[i].hasAuthority = *(int*)(data + offset);
if (clients[i].hasAuthority) {
localClient = &clients[i];
gPlayers[clients[i].slot].nHasAuthority = true;
printf("You have been assigned slot %d\n", clients[i].slot + 1);
}
offset += sizeof(int);
}
}
s32 sessionBool = 0;
// Duplicate of setup_race
void networking_start_session(const char *data) {
if (sessionBool) {
return;
}
sessionBool = 1;
printf("Start session\n");
//gIsInQuitToMenuTransition = 1;
//gQuitToMenuTransitionCounter = 5;
gGotoMode = RACING; // Enter race state
gGamestateNext = RACING;
gCCSelection = CC_150;
gCupSelection = FLOWER_CUP;
gCupCourseSelection = CUP_COURSE_FOUR;
gScreenModeSelection = SCREEN_MODE_1P;
gModeSelection = GRAND_PRIX;
gPlayerCount = 1;
gCurrentCourseId = 8;
gDebugMenuSelection = DEBUG_MENU_EXITED;
func_8009E1C0();
func_800CA330(0x19);
}
// Wait for all players to load
s32 network_all_players_loaded() {
if (gNetwork.gameStarted) { return; }
if (!gNetwork.loaded) {
gNetwork.loaded = true;
send_int_packet(gNetwork.tcpSocket, PACKET_LOADED, true, sizeof(int));
}
if (gNetwork.playersLoaded) {
gNetwork.gameStarted = true;
gIsGamePaused = false;
} else {
gIsGamePaused = true;
}
}
s32 currentNetworkPlayers = 0;
void spawn_network_players(f32 *arg0, f32 *arg1, f32 arg2) {
if (currentNetworkPlayers) {
return;
}
currentNetworkPlayers = 1;
assign_player_control_types();
u32 posX[] = {0, 1, 3, 2, 5, 4, 7, 6};
u32 posZ[] = {0, 1, 2, 3, 4, 5, 6, 7};
u32 pos[] = {0, 1, 2, 3, 4, 5, 6, 7};
printf("----- Spawn Players ------\n");
//for (size_t i = 0; i < NETWORK_MAX_PLAYERS; i++) {
//s32 playerIndex = clients[i].slot;
//printf("Spawned %s, in slot %d as char %d with flags 0x%X", clients[i].username, clients[i].slot, gPlayers[playerIndex].nCharacter, gPlayers[playerIndex].nControlFlags);
//if (gPlayers[playerIndex].nCharacter == -1) {
// printf("\n\nCORRUPT PLAYER DATA\n\n");
//} else {
//printf(" X: %d, Z: %d\n", arg0[D_80165270[posX[playerIndex]]], arg1[D_80165270[posZ[playerIndex]]] + 250.0f) ;
//spawn_player(&gPlayers[clients[i].slot], clients[i].slot, arg0[D_80165270[posX[clients[i].slot]]], arg1[D_80165270[posZ[clients[i].slot]]] + 250.0f, arg2, 32768.0f, clients[i].character, gPlayers[playerIndex].nControlFlags);
//}
// This index isn't right like this ^
//if localClient.Slots
spawn_player(&gPlayers[clients[0].slot], clients[0].slot, arg0[D_80165270[0]], arg1[D_80165270[0]] + 250.0f, arg2, 32768.0f, clients[0].character, PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(&gPlayers[clients[1].slot], clients[1].slot, arg0[D_80165270[1]], arg1[D_80165270[1]] + 250.0f, arg2, 32768.0f, clients[1].character, PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_KART_AI);
spawn_player(&gPlayers[clients[2].slot], clients[2].slot, arg0[D_80165270[3]], arg1[D_80165270[2]] + 250.0f, arg2, 32768.0f, clients[2].character, PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_KART_AI);
spawn_player(&gPlayers[clients[3].slot], clients[3].slot, arg0[D_80165270[2]], arg1[D_80165270[3]] + 250.0f, arg2, 32768.0f, clients[3].character, PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_KART_AI);
spawn_player(&gPlayers[clients[4].slot], clients[4].slot, arg0[D_80165270[5]], arg1[D_80165270[4]] + 250.0f, arg2, 32768.0f, clients[4].character, PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_KART_AI);
spawn_player(&gPlayers[clients[5].slot], clients[5].slot, arg0[D_80165270[4]], arg1[D_80165270[5]] + 250.0f, arg2, 32768.0f, clients[5].character, PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_KART_AI);
spawn_player(&gPlayers[clients[6].slot], clients[6].slot, arg0[D_80165270[7]], arg1[D_80165270[6]] + 250.0f, arg2, 32768.0f, clients[6].character, PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_KART_AI);
spawn_player(&gPlayers[clients[7].slot], clients[7].slot, arg0[D_80165270[6]], arg1[D_80165270[7]] + 250.0f, arg2, 32768.0f, clients[7].character, PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_KART_AI);
//}
printf("--------------------------\n");
// gPlayers[i].nControlFlags
// spawn_player(&gPlayers[clients[0].slot], clients[0].slot, arg0[D_80165270[0]], arg1[D_80165270[0]] + 250.0f, arg2, 32768.0f, gCharacterSelections[0], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
// spawn_player(&gPlayers[clients[1].slot], clients[1].slot, arg0[D_80165270[1]], arg1[D_80165270[1]] + 250.0f, arg2, 32768.0f, chooseKartAIPlayers[0], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_KART_AI);
// spawn_player(&gPlayers[clients[2].slot], clients[2].slot, arg0[D_80165270[3]], arg1[D_80165270[2]] + 250.0f, arg2, 32768.0f, chooseKartAIPlayers[1], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_KART_AI);
// spawn_player(&gPlayers[clients[3].slot], clients[3].slot, arg0[D_80165270[2]], arg1[D_80165270[3]] + 250.0f, arg2, 32768.0f, chooseKartAIPlayers[2], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_KART_AI);
// spawn_player(&gPlayers[clients[4].slot], clients[4].slot, arg0[D_80165270[5]], arg1[D_80165270[4]] + 250.0f, arg2, 32768.0f, chooseKartAIPlayers[3], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_KART_AI);
// spawn_player(&gPlayers[clients[5].slot], clients[5].slot, arg0[D_80165270[4]], arg1[D_80165270[5]] + 250.0f, arg2, 32768.0f, chooseKartAIPlayers[4], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_KART_AI);
// spawn_player(&gPlayers[clients[6].slot], clients[6].slot, arg0[D_80165270[7]], arg1[D_80165270[6]] + 250.0f, arg2, 32768.0f, chooseKartAIPlayers[5], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_KART_AI);
// spawn_player(&gPlayers[clients[7].slot], clients[7].slot, arg0[D_80165270[6]], arg1[D_80165270[7]] + 250.0f, arg2, 32768.0f, chooseKartAIPlayers[6], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_KART_AI);
}

View File

@ -1022,61 +1022,61 @@ void func_80029B4C(Player *player, UNUSED f32 arg1, f32 arg2, UNUSED f32 arg3) {
sp8C[1] = -player->boundingBoxSize;
sp8C[2] = var_f12 - 2.0f;
mtxf_translate_vec3f_mat3(sp8C, sp5C);
sp80[0] = player->boundingBoxCorners[0].cornerPos[0];
sp80[1] = player->boundingBoxCorners[0].cornerPos[1];
sp80[2] = player->boundingBoxCorners[0].cornerPos[2];
player->boundingBoxCorners[0].cornerPos[0] = player->pos[0] + sp8C[0];
player->boundingBoxCorners[0].cornerPos[1] = player->pos[1] + sp8C[1];
player->boundingBoxCorners[0].cornerPos[2] = player->pos[2] + sp8C[2];
process_collision(player, &player->boundingBoxCorners[0], sp80[0], sp80[1], sp80[2]);
sp80[0] = player->tyres[FRONT_LEFT].pos[0];
sp80[1] = player->tyres[FRONT_LEFT].pos[1];
sp80[2] = player->tyres[FRONT_LEFT].pos[2];
player->tyres[FRONT_LEFT].pos[0] = player->pos[0] + sp8C[0];
player->tyres[FRONT_LEFT].pos[1] = player->pos[1] + sp8C[1];
player->tyres[FRONT_LEFT].pos[2] = player->pos[2] + sp8C[2];
process_collision(player, &player->tyres[FRONT_LEFT], sp80[0], sp80[1], sp80[2]);
sp8C[0] = (-var_f12) + 3.6;
sp8C[1] = -player->boundingBoxSize;
sp8C[2] = var_f12 - 2.0f;
mtxf_translate_vec3f_mat3(sp8C, sp5C);
sp80[0] = player->boundingBoxCorners[1].cornerPos[0];
sp80[1] = player->boundingBoxCorners[1].cornerPos[1];
sp80[2] = player->boundingBoxCorners[1].cornerPos[2];
player->boundingBoxCorners[1].cornerPos[0] = player->pos[0] + sp8C[0];
player->boundingBoxCorners[1].cornerPos[1] = player->pos[1] + sp8C[1];
player->boundingBoxCorners[1].cornerPos[2] = player->pos[2] + sp8C[2];
process_collision(player, &player->boundingBoxCorners[1], sp80[0], sp80[1], sp80[2]);
sp80[0] = player->tyres[FRONT_RIGHT].pos[0];
sp80[1] = player->tyres[FRONT_RIGHT].pos[1];
sp80[2] = player->tyres[FRONT_RIGHT].pos[2];
player->tyres[FRONT_RIGHT].pos[0] = player->pos[0] + sp8C[0];
player->tyres[FRONT_RIGHT].pos[1] = player->pos[1] + sp8C[1];
player->tyres[FRONT_RIGHT].pos[2] = player->pos[2] + sp8C[2];
process_collision(player, &player->tyres[FRONT_RIGHT], sp80[0], sp80[1], sp80[2]);
sp8C[0] = var_f12 - 2.6;
sp8C[1] = -player->boundingBoxSize;
sp8C[2] = (-var_f12) + 4.0f;
mtxf_translate_vec3f_mat3(sp8C, sp5C);
sp80[0] = player->boundingBoxCorners[2].cornerPos[0];
sp80[1] = player->boundingBoxCorners[2].cornerPos[1];
sp80[2] = player->boundingBoxCorners[2].cornerPos[2];
player->boundingBoxCorners[2].cornerPos[0] = player->pos[0] + sp8C[0];
player->boundingBoxCorners[2].cornerPos[1] = player->pos[1] + sp8C[1];
player->boundingBoxCorners[2].cornerPos[2] = player->pos[2] + sp8C[2];
process_collision(player, &player->boundingBoxCorners[2], sp80[0], sp80[1], sp80[2]);
sp80[0] = player->tyres[BACK_LEFT].pos[0];
sp80[1] = player->tyres[BACK_LEFT].pos[1];
sp80[2] = player->tyres[BACK_LEFT].pos[2];
player->tyres[BACK_LEFT].pos[0] = player->pos[0] + sp8C[0];
player->tyres[BACK_LEFT].pos[1] = player->pos[1] + sp8C[1];
player->tyres[BACK_LEFT].pos[2] = player->pos[2] + sp8C[2];
process_collision(player, &player->tyres[BACK_LEFT], sp80[0], sp80[1], sp80[2]);
sp8C[0] = (-var_f12) + 2.6;
sp8C[1] = -player->boundingBoxSize;
sp8C[2] = (-var_f12) + 4.0f;
mtxf_translate_vec3f_mat3(sp8C, sp5C);
sp80[0] = player->boundingBoxCorners[3].cornerPos[0];
sp80[1] = player->boundingBoxCorners[3].cornerPos[1];
sp80[2] = player->boundingBoxCorners[3].cornerPos[2];
player->boundingBoxCorners[3].cornerPos[0] = player->pos[0] + sp8C[0];
player->boundingBoxCorners[3].cornerPos[1] = player->pos[1] + sp8C[1];
player->boundingBoxCorners[3].cornerPos[2] = player->pos[2] + sp8C[2];
process_collision(player, &player->boundingBoxCorners[3], sp80[0], sp80[1], sp80[2]);
sp80[0] = player->tyres[BACK_RIGHT].pos[0];
sp80[1] = player->tyres[BACK_RIGHT].pos[1];
sp80[2] = player->tyres[BACK_RIGHT].pos[2];
player->tyres[BACK_RIGHT].pos[0] = player->pos[0] + sp8C[0];
player->tyres[BACK_RIGHT].pos[1] = player->pos[1] + sp8C[1];
player->tyres[BACK_RIGHT].pos[2] = player->pos[2] + sp8C[2];
process_collision(player, &player->tyres[BACK_RIGHT], sp80[0], sp80[1], sp80[2]);
if (!(player->effects & 8)) {
a = (player->boundingBoxCorners[2].cornerGroundY + player->boundingBoxCorners[0].cornerGroundY) / 2;
a = (player->tyres[BACK_LEFT].baseHeight + player->tyres[FRONT_LEFT].baseHeight) / 2;
move_f32_towards(&player->unk_230, a, 0.5f);
b = (player->boundingBoxCorners[3].cornerGroundY + player->boundingBoxCorners[1].cornerGroundY) / 2;
b = (player->tyres[BACK_RIGHT].baseHeight + player->tyres[FRONT_RIGHT].baseHeight) / 2;
move_f32_towards(&player->unk_23C, b, 0.5f);
c = (player->boundingBoxCorners[1].cornerGroundY + player->boundingBoxCorners[0].cornerGroundY) / 2;
c = (player->tyres[FRONT_RIGHT].baseHeight + player->tyres[FRONT_LEFT].baseHeight) / 2;
move_f32_towards(&player->unk_1FC, c, 0.5f);
d = (player->boundingBoxCorners[3].cornerGroundY + player->boundingBoxCorners[2].cornerGroundY) / 2;
d = (player->tyres[BACK_RIGHT].baseHeight + player->tyres[BACK_LEFT].baseHeight) / 2;
move_f32_towards(&player->unk_1F8, d, 0.5f);
}
temp_f2_3 = ((gCharacterSize[player->characterId] * 18.0f) + 1.0f) * player->size;
@ -1103,7 +1103,7 @@ void func_80029B4C(Player *player, UNUSED f32 arg1, f32 arg2, UNUSED f32 arg3) {
if (((player->effects & 8) == 8) && ((player->unk_0CA & 2) == 2)) {
player->slopeAccel = (s16) ((s32) player->unk_D9C);
}
player->surfaceType = get_surface_type(player->unk_110.unk3A) & 0xFF;
player->surfaceType = get_surface_type(player->collision.meshIndexZX) & 0xFF;
if (player->surfaceType == BOOST_RAMP_ASPHALT) {
if (((player->effects & BOOST_RAMP_ASPHALT_EFFECT) != BOOST_RAMP_ASPHALT_EFFECT) && ((player->effects & 8) != 8)) {
player->soundEffects |= BOOST_RAMP_ASPHALT_SOUND_EFFECT;
@ -1133,36 +1133,36 @@ void func_8002A194(Player *player, f32 arg1, f32 arg2, f32 arg3) {
var_f20 = (((gCharacterSize[player->characterId] * 18) / 2) * player->size) - 1;
}
player->boundingBoxCorners[0].cornerPos[2] = (coss(temp_v1 + 0x2000) * var_f20) + arg3;
player->tyres[FRONT_LEFT].pos[2] = (coss(temp_v1 + 0x2000) * var_f20) + arg3;
temp_f12 = (sins(temp_v1 + 0x2000) * var_f20) + arg1;
player->boundingBoxCorners[0].cornerPos[0] = temp_f12;
player->boundingBoxCorners[0].cornerGroundY = func_802ABE30(temp_f12, arg2, player->boundingBoxCorners[0].cornerPos[2], player->unk_110.unk3A);
player->tyres[FRONT_LEFT].pos[0] = temp_f12;
player->tyres[FRONT_LEFT].baseHeight = calculate_surface_height(temp_f12, arg2, player->tyres[FRONT_LEFT].pos[2], player->collision.meshIndexZX);
player->boundingBoxCorners[1].cornerPos[2] = (coss(temp_v1 - 0x2000) * var_f20) + arg3;
player->tyres[FRONT_RIGHT].pos[2] = (coss(temp_v1 - 0x2000) * var_f20) + arg3;
temp_f12 = (sins(temp_v1 - 0x2000) * var_f20) + arg1;
player->boundingBoxCorners[1].cornerPos[0] = temp_f12;
player->boundingBoxCorners[1].cornerGroundY = func_802ABE30(temp_f12, arg2, player->boundingBoxCorners[1].cornerPos[2], player->unk_110.unk3A);
player->tyres[FRONT_RIGHT].pos[0] = temp_f12;
player->tyres[FRONT_RIGHT].baseHeight = calculate_surface_height(temp_f12, arg2, player->tyres[FRONT_RIGHT].pos[2], player->collision.meshIndexZX);
player->boundingBoxCorners[2].cornerPos[2] = (coss(temp_v1 + 0x6000) * var_f20) + arg3;
player->tyres[BACK_LEFT].pos[2] = (coss(temp_v1 + 0x6000) * var_f20) + arg3;
temp_f12 = (sins(temp_v1 + 0x6000) * var_f20) + arg1;
player->boundingBoxCorners[2].cornerPos[0] = temp_f12;
player->boundingBoxCorners[2].cornerGroundY = func_802ABE30(temp_f12, arg2, player->boundingBoxCorners[2].cornerPos[2], player->unk_110.unk3A);
player->tyres[BACK_LEFT].pos[0] = temp_f12;
player->tyres[BACK_LEFT].baseHeight = calculate_surface_height(temp_f12, arg2, player->tyres[BACK_LEFT].pos[2], player->collision.meshIndexZX);
player->boundingBoxCorners[3].cornerPos[2] = (coss(temp_v1 - 0x6000) * var_f20) + arg3;
player->boundingBoxCorners[3].cornerPos[0] = (sins(temp_v1 - 0x6000) * var_f20) + arg1;
player->boundingBoxCorners[3].cornerGroundY = func_802ABE30(player->boundingBoxCorners[2].cornerPos[0], arg2, player->boundingBoxCorners[2].cornerPos[2], player->unk_110.unk3A);
player->tyres[BACK_RIGHT].pos[2] = (coss(temp_v1 - 0x6000) * var_f20) + arg3;
player->tyres[BACK_RIGHT].pos[0] = (sins(temp_v1 - 0x6000) * var_f20) + arg1;
player->tyres[BACK_RIGHT].baseHeight = calculate_surface_height(player->tyres[BACK_LEFT].pos[0], arg2, player->tyres[BACK_LEFT].pos[2], player->collision.meshIndexZX);
if ((player->effects & 8) != 8) {
player->unk_230 = (player->boundingBoxCorners[2].cornerGroundY + player->boundingBoxCorners[0].cornerGroundY) / 2;
player->unk_23C = (player->boundingBoxCorners[3].cornerGroundY + player->boundingBoxCorners[1].cornerGroundY) / 2;
player->unk_1FC = (player->boundingBoxCorners[1].cornerGroundY + player->boundingBoxCorners[0].cornerGroundY) / 2;
player->unk_1F8 = (player->boundingBoxCorners[3].cornerGroundY + player->boundingBoxCorners[2].cornerGroundY) / 2;
player->unk_230 = (player->tyres[BACK_LEFT].baseHeight + player->tyres[FRONT_LEFT].baseHeight) / 2;
player->unk_23C = (player->tyres[BACK_RIGHT].baseHeight + player->tyres[FRONT_RIGHT].baseHeight) / 2;
player->unk_1FC = (player->tyres[FRONT_RIGHT].baseHeight + player->tyres[FRONT_LEFT].baseHeight) / 2;
player->unk_1F8 = (player->tyres[BACK_RIGHT].baseHeight + player->tyres[BACK_LEFT].baseHeight) / 2;
}
player->surfaceType = (u8)get_surface_type(player->unk_110.unk3A);
player->boundingBoxCorners[3].surfaceType = player->surfaceType;
player->boundingBoxCorners[2].surfaceType = player->surfaceType;
player->boundingBoxCorners[1].surfaceType = player->surfaceType;
player->boundingBoxCorners[0].surfaceType = player->surfaceType;
player->surfaceType = (u8)get_surface_type(player->collision.meshIndexZX);
player->tyres[BACK_RIGHT].surfaceType = player->surfaceType;
player->tyres[BACK_LEFT].surfaceType = player->surfaceType;
player->tyres[FRONT_RIGHT].surfaceType = player->surfaceType;
player->tyres[FRONT_LEFT].surfaceType = player->surfaceType;
var_f20 = (gCharacterSize[player->characterId] * 18) + 1;
temp_f0 = (player->unk_23C - player->unk_230);
player->unk_206 = -func_802B7C40(temp_f0 / var_f20);
@ -1179,10 +1179,10 @@ void func_8002A194(Player *player, f32 arg1, f32 arg2, f32 arg3) {
}
move_s16_towards(&player->slopeAccel, var_a1, 0.5f);
}
if (func_802ABD7C(player->unk_110.unk3A) != 0) {
player->boundingBoxCorners[3].unk_14 |= 1;
if (func_802ABD7C(player->collision.meshIndexZX) != 0) {
player->tyres[BACK_RIGHT].unk_14 |= 1;
} else {
player->boundingBoxCorners[3].unk_14 &= ~1;
player->tyres[BACK_RIGHT].unk_14 &= ~1;
}
if (player->surfaceType == BOOST_RAMP_ASPHALT) {
if (((player->effects & BOOST_RAMP_ASPHALT_EFFECT) != BOOST_RAMP_ASPHALT_EFFECT) && ((player->effects & 8) != 8)) {
@ -1196,7 +1196,7 @@ void func_8002A194(Player *player, f32 arg1, f32 arg2, f32 arg3) {
}
}
// Near identical to func_802AC114 in memory.c
// Near identical to adjust_pos_orthogonally in memory.c
void func_8002A5F4(Vec3f arg0, f32 arg1, Vec3f arg2, f32 arg3, f32 arg4) {
f32 temp_f0;
f32 temp_f2;
@ -1368,7 +1368,7 @@ void func_8002AB70(Player *player) {
move_f32_towards(&player->unk_DAC, 1.0f, 0.07f);
}
} else {
if (player->unk_110.unk3C[2] >= 50.0f) {
if (player->collision.surfaceDistance[2] >= 50.0f) {
player->unk_DAC = 2.0f;
}
move_f32_towards(&player->kartGravity, gKartGravityTable[player->characterId], 0.02f);
@ -1860,7 +1860,7 @@ void func_8002C11C(Player *player) {
void func_8002C17C(Player *player, s8 playerId) {
switch (gCurrentCourseId) { /* irregular */
case COURSE_YOSHI_VALLEY:
if ((player->unk_110.unk3C[2] >= 600.0f) && (D_80165330[playerId] == 0)) {
if ((player->collision.surfaceDistance[2] >= 600.0f) && (D_80165330[playerId] == 0)) {
D_80165330[playerId] = 1;
gCopyNearestWaypointByPlayerId[playerId] = gNearestWaypointByPlayerId[playerId];
gCopyPathIndexByPlayerId[playerId] = gPathIndexByPlayerId[playerId];
@ -1868,7 +1868,7 @@ void func_8002C17C(Player *player, s8 playerId) {
gCopyNearestWaypointByPlayerId[playerId] = gNearestWaypointByPlayerId[playerId];
gCopyPathIndexByPlayerId[playerId] = gPathIndexByPlayerId[playerId];
} else if (!(player->effects & 8)) {
if (func_802ABDF4(player->unk_110.unk3A) == 0) {
if (func_802ABDF4(player->collision.meshIndexZX) == 0) {
D_80165330[playerId] = 0;
}
}
@ -1896,7 +1896,7 @@ void func_8002C17C(Player *player, s8 playerId) {
}
break;
case COURSE_RAINBOW_ROAD:
if ((player->unk_110.unk3C[2] >= 600.0f) && (D_80165330[playerId] == 0)) {
if ((player->collision.surfaceDistance[2] >= 600.0f) && (D_80165330[playerId] == 0)) {
D_80165330[playerId] = 1;
gCopyNearestWaypointByPlayerId[playerId] = gNearestWaypointByPlayerId[playerId];
gCopyPathIndexByPlayerId[playerId] = gPathIndexByPlayerId[playerId];
@ -1949,15 +1949,15 @@ void func_8002C4F8(Player *player, s8 arg1) {
(gCurrentCourseId == COURSE_RAINBOW_ROAD)) {
player->unk_0DE &= ~0x000C;
}
if ((player->boundingBoxSize < (D_801652A0[arg1] - player->pos[1])) && (player->unk_110.unk3C[2] >= 600.0f)) {
if ((player->boundingBoxSize < (D_801652A0[arg1] - player->pos[1])) && (player->collision.surfaceDistance[2] >= 600.0f)) {
player->unk_0CA |= 1;
}
if (player->unk_110.unk3C[2] >= 600.0f) {
if (player->collision.surfaceDistance[2] >= 600.0f) {
player->unk_0CA |= 0x0100;
} else if ((player->effects & 8) != 8) {
player->unk_0CA &= ~0x0100;
}
if ((player->type & PLAYER_KART_AI) && ((func_802ABDF4(player->unk_110.unk3A) != 0) || (player->unk_0CA & 1))) {
if ((player->type & PLAYER_KART_AI) && ((func_802ABDF4(player->collision.meshIndexZX) != 0) || (player->unk_0CA & 1))) {
if (!(player->unk_0CA & 2) && !(player->unk_0CA & 8) && !(player->effects & 0x1000)) {
func_80090778(player);
func_80090868(player);
@ -2017,20 +2017,21 @@ void func_8002C954(Player *player, s8 playerId, Vec3f arg2) {
f32 zdist;
temp_f0 = player->pos[1] - player->unk_074;
if (((((player->effects & 0x10000) != 0x10000) &&
((player->effects & BOOST_RAMP_ASPHALT_EFFECT) == BOOST_RAMP_ASPHALT_EFFECT)) ||
((((temp_f0 >= 20.0f) ||
(temp_f0 < (-1.0f))) &&
((player->effects & 0x10000) == 0)) &&
(player->effects & 8)) ||
((player->unk_110.unk34 == 0) &&
((player->effects & 0x10000) == 0))) &&
(((player->unk_0CA & 2) == 0) ||
if (((((player->effects & 0x10000) != 0x10000) &&
((player->effects & BOOST_RAMP_ASPHALT_EFFECT) == BOOST_RAMP_ASPHALT_EFFECT)) ||
((((temp_f0 >= 20.0f) ||
(temp_f0 < (-1.0f))) &&
((player->effects & 0x10000) == 0)) &&
(player->effects & 8)) ||
((player->collision.unk34 == 0) &&
((player->effects & 0x10000) == 0))) &&
(((player->unk_0CA & 2) == 0) ||
(!(player->unk_0CA & 8)))) {
func_8008F494(player, playerId);
}
if ((player->unk_046 & 0x20) != 0x20) {
if ((player->unk_110.unk3C[0] < (-1.0f)) || (player->unk_110.unk3C[1] < (-1.0f))) {
if ((player->collision.surfaceDistance[0] < (-1.0f)) || (player->collision.surfaceDistance[1] < (-1.0f))) {
player->unk_256 = 1;
}
player->unk_046 |= 0x20;
@ -2044,7 +2045,7 @@ void func_8002C954(Player *player, s8 playerId, Vec3f arg2) {
player->unk_256 = 0;
}
if ((player->slopeAccel >= 0) && (((player->unk_094 / 18.0f) * 216.0f) > 5.0f)) {
func_80031F48(player, 18.0f);
decelerate_ai_player(player, 18.0f);
}
if ((player->type & PLAYER_HUMAN) == PLAYER_HUMAN) {
xdist = D_80165070[playerId][0] - arg2[0];
@ -2110,7 +2111,7 @@ void apply_effect(Player *player, s8 arg1, s8 arg2) {
apply_boo_effect(player, arg1);
}
if (((player->effects & 0x20000000) == 0x20000000) && (player->unk_228 >= 0x64)) {
func_80031F48(player, 4.0f);
decelerate_ai_player(player, 4.0f);
}
if (((player->effects & 0x80) == 0x80) || ((player->effects & 0x40) == 0x40)) {
func_8008C9EC(player, arg1);
@ -2132,7 +2133,7 @@ void apply_effect(Player *player, s8 arg1, s8 arg2) {
}
if ((player->effects & 0x800000) == 0x800000) {
func_8008D8B4(player, arg1);
func_80031F48(player, 10.0f);
decelerate_ai_player(player, 10.0f);
}
if (D_800DC510 != 5) {
if (player->soundEffects & 0x04000000) {
@ -2249,19 +2250,19 @@ void func_8002D268(Player *player, UNUSED Camera *camera, s8 screenId, s8 player
player->unk_064[0] *= -1.0f;
player->unk_064[2] *= -1.0f;
}
if ((player->boundingBoxCorners[2].surfaceType == ASPHALT) && (player->boundingBoxCorners[3].surfaceType == ASPHALT)) {
spB4 = (-1 * (player->unk_064[0] + sp16C[0])) + ((-player->unk_110.orientationVector[0] * player->kartGravity) * 0.925);
spB0 = (-player->unk_110.orientationVector[1] * player->kartGravity);
spAC = (-1 * (player->unk_064[2] + sp16C[2])) + ((-player->unk_110.orientationVector[2] * player->kartGravity) * 0.925);
if ((player->tyres[BACK_LEFT].surfaceType == ASPHALT) && (player->tyres[BACK_RIGHT].surfaceType == ASPHALT)) {
spB4 = (-1 * (player->unk_064[0] + sp16C[0])) + ((-player->collision.orientationVector[0] * player->kartGravity) * 0.925);
spB0 = (-player->collision.orientationVector[1] * player->kartGravity);
spAC = (-1 * (player->unk_064[2] + sp16C[2])) + ((-player->collision.orientationVector[2] * player->kartGravity) * 0.925);
} else {
temp3 = (((player->unk_094 / 18.0f) * 216.0f) / 10.0f);
if (temp3 >= 10)
{
temp3 = 10;
}
spB4 = -1 * (player->unk_064[0] + sp16C[0]) + ((-player->unk_110.orientationVector[0] * player->kartGravity) * sp104[temp3]);
spB0 = (-player->unk_110.orientationVector[1] * player->kartGravity);
spAC = -1 * (player->unk_064[2] + sp16C[2]) + ((-player->unk_110.orientationVector[2] * player->kartGravity) * sp104[temp3]);
spB4 = -1 * (player->unk_064[0] + sp16C[0]) + ((-player->collision.orientationVector[0] * player->kartGravity) * sp104[temp3]);
spB0 = (-player->collision.orientationVector[1] * player->kartGravity);
spAC = -1 * (player->unk_064[2] + sp16C[2]) + ((-player->collision.orientationVector[2] * player->kartGravity) * sp104[temp3]);
}
if (((player->effects & 8) != 8) && ((player->effects & 0x20) == 0x20)) {
spB4 = 0 * (player->unk_064[0] + sp16C[0]);
@ -2340,7 +2341,7 @@ void func_8002D268(Player *player, UNUSED Camera *camera, s8 screenId, s8 player
spF8 += player->kartHopVelocity;
spF8 -= 0.02;
}
func_802AD950(&player->unk_110, player->boundingBoxSize, spFC, spF8, spF4, player->copy_rotation_x, player->copy_rotation_y, player->copy_rotation_z);
actor_terrain_collision(&player->collision, player->boundingBoxSize, spFC, spF8, spF4, player->copy_rotation_x, player->copy_rotation_y, player->copy_rotation_z);
player->unk_058 = 0.0f;
player->unk_060 = 0.0f;
player->unk_05C = 1.0f;
@ -2351,7 +2352,7 @@ void func_8002D268(Player *player, UNUSED Camera *camera, s8 screenId, s8 player
}
player->effects |= 8;
player->unk_0C2 += 1;
temp_var = player->unk_110.unk3C[2];
temp_var = player->collision.surfaceDistance[2];
if (temp_var <= 0.0f) {
player->effects = player->effects & (~2);
player->effects = player->effects & (~8);
@ -2402,23 +2403,23 @@ void func_8002D268(Player *player, UNUSED Camera *camera, s8 screenId, s8 player
player->unk_0C2 = 0;
player->kartHopVelocity = player->unk_0C2;
}
temp_var = player->unk_110.unk3C[2];
temp_var = player->collision.surfaceDistance[2];
if (temp_var <= 0.0f) {
func_8003F46C(player, sp8C, sp98, sp178, &temp_var, &spFC, &spF8, &spF4);
}
temp_var = player->unk_110.unk3C[0];
temp_var = player->collision.surfaceDistance[0];
if (temp_var < 0.0f) {
func_8003F734(player, sp8C, sp98, &temp_var, &spFC, &spF8, &spF4);
func_8002C954(player, playerId, sp98);
}
temp_var = player->unk_110.unk3C[1];
temp_var = player->collision.surfaceDistance[1];
if (temp_var < 0.0f) {
func_8003FBAC(player, sp8C, sp98, &temp_var, &spFC, &spF8, &spF4);
func_8002C954(player, playerId, sp98);
}
temp_var = player->unk_110.unk3C[0];
temp_var = player->collision.surfaceDistance[0];
if (temp_var >= 0.0f) {
temp_var = player->unk_110.unk3C[1];
temp_var = player->collision.surfaceDistance[1];
if (temp_var >= 0.0f) {
player->unk_046 &= 0xFFDF;
if (player->unk_256 != 0) {
@ -2430,14 +2431,14 @@ void func_8002D268(Player *player, UNUSED Camera *camera, s8 screenId, s8 player
}
}
}
if (((!(player->effects & 8)) && (func_802ABDB8(player->unk_110.unk3A) != 0)) && ((player->effects & 0x10000) != 0x10000)) {
if (((!(player->effects & 8)) && (func_802ABDB8(player->collision.meshIndexZX) != 0)) && ((player->effects & 0x10000) != 0x10000)) {
if ((!(player->unk_0CA & 2)) || (!(player->unk_0CA & 8))) {
func_8008F494(player, playerId);
}
} else if (((!(player->effects & 8)) && (func_802ABDB8(player->unk_110.unk3A) == 0)) && (player->effects & 0x10000)) {
} else if (((!(player->effects & 8)) && (func_802ABDB8(player->collision.meshIndexZX) == 0)) && (player->effects & 0x10000)) {
func_8008F5A4(player, playerId);
}
player->unk_074 = func_802ABE30(spFC, spF8, spF4, player->unk_110.unk3A);
player->unk_074 = calculate_surface_height(spFC, spF8, spF4, player->collision.meshIndexZX);
if (((player->type & PLAYER_HUMAN) == PLAYER_HUMAN) && (((gActiveScreenMode == SCREEN_MODE_1P) || (gActiveScreenMode == SCREEN_MODE_2P_SPLITSCREEN_VERTICAL)) || (gActiveScreenMode == SCREEN_MODE_2P_SPLITSCREEN_HORIZONTAL))) {
func_80029B4C(player, spFC, spF8, spF4);
} else {
@ -2489,7 +2490,7 @@ void func_8002D268(Player *player, UNUSED Camera *camera, s8 screenId, s8 player
player->unk_094 = 1;
}
}
if (player->unk_110.unk3C[2] >= 500.0f) {
if (player->collision.surfaceDistance[2] >= 500.0f) {
player->unk_078 = (s16) (((s16) player->unk_078) / 2);
}
func_8002C4F8(player, playerId);
@ -2502,7 +2503,7 @@ void func_8002E4C4(Player *player) {
player->kartHopJerk = 0.0f;
player->kartHopAcceleration = 0.0f;
player->kartHopVelocity = 0.0f;
player->pos[1] = func_802AE1C0(player->pos[0], D_80164510[player_index] + 10.0f, player->pos[2]) + player->boundingBoxSize;
player->pos[1] = spawn_actor_on_surface(player->pos[0], D_80164510[player_index] + 10.0f, player->pos[2]) + player->boundingBoxSize;
if (((player->pos[1] - D_80164510[player_index]) > 1200.0f) || ((player->pos[1] - D_80164510[player_index]) < -1200.0f)) {
player->pos[1] = player->copy_rotation_y;
}
@ -2549,9 +2550,9 @@ void func_8002E594(Player *player, UNUSED Camera *camera, s8 screenId, s8 player
if ((((player->effects & 0x80) == 0x80)
|| ((player->effects & 0x40) == 0x40))
|| ((player->effects & 0x20000) == 0x20000)) {
sp80 = -1 * (player->unk_064[0]) + (((-player->unk_110.orientationVector[0]) * player->kartGravity) * 0.1);
sp7C = (-player->unk_110.orientationVector[1]) * player->kartGravity;
sp78 = -1 * (player->unk_064[2]) + (((-player->unk_110.orientationVector[2]) * player->kartGravity) * 0.1);
sp80 = -1 * (player->unk_064[0]) + (((-player->collision.orientationVector[0]) * player->kartGravity) * 0.1);
sp7C = (-player->collision.orientationVector[1]) * player->kartGravity;
sp78 = -1 * (player->unk_064[2]) + (((-player->collision.orientationVector[2]) * player->kartGravity) * 0.1);
} else {
sp80 = -1 * player->unk_064[0];
sp7C = -1 * player->kartGravity;
@ -2605,13 +2606,13 @@ void func_8002E594(Player *player, UNUSED Camera *camera, s8 screenId, s8 player
spC8 = posZ + player->velocity[2] + D_8018CE10[playerId].unk_04[2];
func_8002AAC0(player);
spCC += player->kartHopVelocity;
func_802AD950(&player->unk_110, player->boundingBoxSize, spD0, spCC, spC8, player->copy_rotation_x, player->copy_rotation_y, player->copy_rotation_z);
actor_terrain_collision(&player->collision, player->boundingBoxSize, spD0, spCC, spC8, player->copy_rotation_x, player->copy_rotation_y, player->copy_rotation_z);
player->effects |= 8;
player->unk_0C2 += 1;
player->unk_058 = 0.0f;
player->unk_060 = 0.0f;
player->unk_05C = 1.0f;
sp74 = player->unk_110.unk3C[2];
sp74 = player->collision.surfaceDistance[2];
if (sp74 <= 0.0f) {
player->effects &= ~2;
player->effects &= ~8;
@ -2674,25 +2675,25 @@ void func_8002E594(Player *player, UNUSED Camera *camera, s8 screenId, s8 player
}
player->kartHopVelocity = (f32) player->unk_0C2;
}
sp74 = player->unk_110.unk3C[2];
sp74 = player->collision.surfaceDistance[2];
if (sp74 <= 0.0f) {
func_8003F46C(player, sp48, sp54, spE0, &sp74, &spD0, &spCC, &spC8);
}
sp74 = player->unk_110.unk3C[0];
sp74 = player->collision.surfaceDistance[0];
if (sp74 < 0.0f) {
func_8003F734(player, sp48, sp54, &sp74, &spD0, &spCC, &spC8);
func_8002C954(player, playerId, sp54);
func_80031F48(player, 6.0f);
decelerate_ai_player(player, 6.0f);
}
sp74 = player->unk_110.unk3C[1];
sp74 = player->collision.surfaceDistance[1];
if (sp74 < 0.0f) {
func_8003FBAC(player, sp48, sp54, &sp74, &spD0, &spCC, &spC8);
func_8002C954(player, playerId, sp54);
func_80031F48(player, 6.0f);
decelerate_ai_player(player, 6.0f);
}
sp74 = player->unk_110.unk3C[0];
sp74 = player->collision.surfaceDistance[0];
if (sp74 >= 0.0f) {
sp74 = player->unk_110.unk3C[1];
sp74 = player->collision.surfaceDistance[1];
if (sp74 >= 0.0f) {
player->unk_046 &= 0xFFDF;
if (player->unk_256 != 0) {
@ -2704,14 +2705,14 @@ void func_8002E594(Player *player, UNUSED Camera *camera, s8 screenId, s8 player
}
}
}
if (((func_802ABDB8(player->unk_110.unk3A) != 0) && ((player->effects & 0x10000) != 0x10000)) && (((player->unk_094 / 18.0f) * 216.0f) >= 20.0f)) {
if (((func_802ABDB8(player->collision.meshIndexZX) != 0) && ((player->effects & 0x10000) != 0x10000)) && (((player->unk_094 / 18.0f) * 216.0f) >= 20.0f)) {
if ((!(player->unk_0CA & 2)) || (!(player->unk_0CA & 8))) {
func_8008F494(player, playerId);
}
} else if (((!(player->effects & 8)) && (func_802ABDB8(player->unk_110.unk3A) == 0)) && (player->effects & 0x10000)) {
} else if (((!(player->effects & 8)) && (func_802ABDB8(player->collision.meshIndexZX) == 0)) && (player->effects & 0x10000)) {
func_8008F5A4(player, playerId);
}
player->unk_074 = func_802ABE30(spD0, spCC, spC8, player->unk_110.unk3A);
player->unk_074 = calculate_surface_height(spD0, spCC, spC8, player->collision.meshIndexZX);
if (((player->type & PLAYER_HUMAN) == PLAYER_HUMAN) && (((gActiveScreenMode == SCREEN_MODE_1P) || (gActiveScreenMode == SCREEN_MODE_2P_SPLITSCREEN_VERTICAL)) || (gActiveScreenMode == SCREEN_MODE_2P_SPLITSCREEN_HORIZONTAL))) {
func_80029B4C(player, spD0, spCC, spC8);
} else {
@ -2881,18 +2882,18 @@ void func_8002F730(Player *player, UNUSED Camera *camera, UNUSED s8 screenId, s8
func_8002AAC0(player);
spC8 += player->kartHopVelocity;
func_802AD950(&player->unk_110, player->boundingBoxSize, spCC, spC8, spC4, player->copy_rotation_x, player->copy_rotation_y, player->copy_rotation_z);
actor_terrain_collision(&player->collision, player->boundingBoxSize, spCC, spC8, spC4, player->copy_rotation_x, player->copy_rotation_y, player->copy_rotation_z);
player->unk_058 = 0.0f;
player->unk_05C = 1.0f;
player->unk_060 = 0.0f;
calculate_orientation_matrix(player->orientationMatrix, 0.0f, 1.0f, 0.0f, (s16) (s32) player->rotation[1]);
player->effects &= ~8;
sp78 = player->unk_110.unk3C[2];
sp78 = player->collision.surfaceDistance[2];
if (sp78 <= 0.0f) {
if(1) {};
func_8003F46C(player, sp5C, sp68, spE8, &sp78, &spCC, &spC8, &spC4);
}
player->unk_074 = func_802ABE30(spCC, spC8, spC4, player->unk_110.unk3A);
player->unk_074 = calculate_surface_height(spCC, spC8, spC4, player->collision.meshIndexZX);
if (((player->type & PLAYER_HUMAN) == PLAYER_HUMAN) && ((gActiveScreenMode == SCREEN_MODE_1P) || (gActiveScreenMode == SCREEN_MODE_2P_SPLITSCREEN_VERTICAL) || (gActiveScreenMode == SCREEN_MODE_2P_SPLITSCREEN_HORIZONTAL))) {
func_80029B4C(player, spCC, spC8, spC4);
} else {
@ -2941,17 +2942,17 @@ void func_8002FCA8(Player *player, s8 arg1) {
var_f0 = 0.0f;
if ((player->effects & STAR_EFFECT) != STAR_EFFECT) {
if ((s32) player->boundingBoxCorners[3].surfaceType < 0xF) {
var_f0 += D_800E2A90[player->characterId][player->boundingBoxCorners[3].surfaceType];
if ((s32) player->tyres[BACK_RIGHT].surfaceType < 0xF) {
var_f0 += D_800E2A90[player->characterId][player->tyres[BACK_RIGHT].surfaceType];
}
if ((s32) player->boundingBoxCorners[2].surfaceType < 0xF) {
var_f0 += D_800E2A90[player->characterId][player->boundingBoxCorners[2].surfaceType];
if ((s32) player->tyres[BACK_LEFT].surfaceType < 0xF) {
var_f0 += D_800E2A90[player->characterId][player->tyres[BACK_LEFT].surfaceType];
}
if ((s32) player->boundingBoxCorners[1].surfaceType < 0xF) {
var_f0 += D_800E2AB0[player->characterId][player->boundingBoxCorners[1].surfaceType];
if ((s32) player->tyres[FRONT_RIGHT].surfaceType < 0xF) {
var_f0 += D_800E2AB0[player->characterId][player->tyres[FRONT_RIGHT].surfaceType];
}
if ((s32) player->boundingBoxCorners[0].surfaceType < 0xF) {
var_f0 += D_800E2AB0[player->characterId][player->boundingBoxCorners[0].surfaceType];
if ((s32) player->tyres[FRONT_LEFT].surfaceType < 0xF) {
var_f0 += D_800E2AB0[player->characterId][player->tyres[FRONT_LEFT].surfaceType];
}
}
if (D_801652C0[arg1] & 4) {
@ -3003,12 +3004,12 @@ void func_8002FE84(Player *player, f32 arg1) {
var_f0 += (temp_lo * 0.025) / 1.2;
}
player->unk_098 = arg1 * (1.0f - var_f0);
if (player->boundingBoxCorners[3].surfaceType == GRASS) {
var_f0 += D_800E2E90[player->characterId][player->boundingBoxCorners[3].surfaceType] * 0.7;
if (player->tyres[BACK_RIGHT].surfaceType == GRASS) {
var_f0 += D_800E2E90[player->characterId][player->tyres[BACK_RIGHT].surfaceType] * 0.7;
}
if (player->boundingBoxCorners[2].surfaceType == GRASS) {
if (player->tyres[BACK_LEFT].surfaceType == GRASS) {
// The unecessary "* 1.0" here is to force the compiler to save this 0.7 as a separate RO value from the 0.7 just above this comment
var_f0 += D_800E2E90[player->characterId][player->boundingBoxCorners[2].surfaceType] * (0.7 * 1.0);
var_f0 += D_800E2E90[player->characterId][player->tyres[BACK_LEFT].surfaceType] * (0.7 * 1.0);
}
test = player->unk_0C0 / 182;
if (test < 0) {
@ -3033,21 +3034,21 @@ f32 func_80030150(Player *player, s8 arg1) {
var_f2 = (player->unk_094 / 18.0f) * 216.0f;
if (var_f2 >= 8.0f) {
if ((player->effects & STAR_EFFECT) != STAR_EFFECT) {
if ((s32) player->boundingBoxCorners[3].surfaceType >= 0xF) {
if ((s32) player->tyres[BACK_RIGHT].surfaceType >= 0xF) {
// ???????
if(1) {}
} else {
var_f0 += D_800E2E90[player->characterId][player->boundingBoxCorners[3].surfaceType];
var_f0 += D_800E2E90[player->characterId][player->tyres[BACK_RIGHT].surfaceType];
}
if ((s32) player->boundingBoxCorners[2].surfaceType < 0xF)
var_f0 += D_800E2E90[player->characterId][player->boundingBoxCorners[2].surfaceType];
if ((s32) player->boundingBoxCorners[1].surfaceType < 0xF)
var_f0 += D_800E2EB0[player->characterId][player->boundingBoxCorners[1].surfaceType];
if ((s32) player->boundingBoxCorners[0].surfaceType < 0xF)
var_f0 += D_800E2E90[player->characterId][player->boundingBoxCorners[0].surfaceType];
if ((s32) player->tyres[BACK_LEFT].surfaceType < 0xF)
var_f0 += D_800E2E90[player->characterId][player->tyres[BACK_LEFT].surfaceType];
if ((s32) player->tyres[FRONT_RIGHT].surfaceType < 0xF)
var_f0 += D_800E2EB0[player->characterId][player->tyres[FRONT_RIGHT].surfaceType];
if ((s32) player->tyres[FRONT_LEFT].surfaceType < 0xF)
var_f0 += D_800E2E90[player->characterId][player->tyres[FRONT_LEFT].surfaceType];
}
if (((player->effects & 8) != 8) && ((player->unk_0CA & 2) != 2)) {
temp_lo = player->slopeAccel / 182;
@ -3095,7 +3096,7 @@ f32 func_80030150(Player *player, s8 arg1) {
if ((player->unk_0DE & 2) == 2) {
var_f0 += 0.15;
}
if (((D_801652A0[arg1] - player->boundingBoxCorners[2].cornerGroundY) >= 3.5) || ((D_801652A0[arg1] - player->boundingBoxCorners[3].cornerGroundY) >= 3.5)) {
if (((D_801652A0[arg1] - player->tyres[BACK_LEFT].baseHeight) >= 3.5) || ((D_801652A0[arg1] - player->tyres[BACK_RIGHT].baseHeight) >= 3.5)) {
var_f0 += 0.05;
}
}
@ -3405,11 +3406,11 @@ void player_speed(Player *player) {
}
}
void func_80031F48(Player *player, f32 arg1) {
void decelerate_ai_player(Player *player, f32 speed) {
s32 player_index;
player_index = get_player_index_for_player(player);
player->currentSpeed -= arg1;
player->currentSpeed -= speed;
if (player->currentSpeed <= 0.0f) {
player->currentSpeed = 0.0f;
}
@ -3584,14 +3585,14 @@ void func_800323E4(Player *player) {
player->effects |= 1;
// This check will never be true, why is it here?
if ((player->effects & 0x20) == 0x20) {
func_80031F48(player, 1.0f);
decelerate_ai_player(player, 1.0f);
player->unk_20C = var_f2;
} else {
if ((s32) player->boundingBoxCorners[3].surfaceType < 0xF) {
var_f2 += D_800E3210[player->characterId][player->boundingBoxCorners[3].surfaceType];
if ((s32) player->tyres[BACK_RIGHT].surfaceType < 0xF) {
var_f2 += D_800E3210[player->characterId][player->tyres[BACK_RIGHT].surfaceType];
}
if ((s32) player->boundingBoxCorners[2].surfaceType < 0xF) {
var_f2 += D_800E3210[player->characterId][player->boundingBoxCorners[2].surfaceType];
if ((s32) player->tyres[BACK_LEFT].surfaceType < 0xF) {
var_f2 += D_800E3210[player->characterId][player->tyres[BACK_LEFT].surfaceType];
}
test = player->unk_22C - player->unk_094;
if (test <= 0.0f) {
@ -3604,18 +3605,18 @@ void func_800323E4(Player *player) {
}
if (gIsPlayerTripleBButtonCombo[var_v1] == true) {
if (player->unk_20C >= 2.0f) {
func_80031F48(player, (1.0f - var_f2) * 5.0f);
decelerate_ai_player(player, (1.0f - var_f2) * 5.0f);
} else {
func_80031F48(player, (1.0f - var_f2) * 3.0f);
decelerate_ai_player(player, (1.0f - var_f2) * 3.0f);
}
} else {
if (((player->unk_094 / 18.0f) * 216.0f) <= 20.0f) {
func_80031F48(player, (1.0f - var_f2) * 4.0f);
decelerate_ai_player(player, (1.0f - var_f2) * 4.0f);
}
if (player->unk_20C >= 2.0f) {
func_80031F48(player, (1.0f - var_f2) * 2.5);
decelerate_ai_player(player, (1.0f - var_f2) * 2.5);
} else {
func_80031F48(player, (1.0f - var_f2) * 1.2);
decelerate_ai_player(player, (1.0f - var_f2) * 1.2);
}
}
}
@ -3938,13 +3939,13 @@ void func_80033AE0(Player *player, struct Controller *controller, s8 arg2) {
player->soundEffects |= 0x80;
}
}
if (((s32) player->boundingBoxCorners[3].surfaceType) < 0xF)
if (((s32) player->tyres[BACK_RIGHT].surfaceType) < 0xF)
{
var_f2 += D_800E3610[player->characterId][player->boundingBoxCorners[3].surfaceType];
var_f2 += D_800E3610[player->characterId][player->tyres[BACK_RIGHT].surfaceType];
}
if (((s32) player->boundingBoxCorners[2].surfaceType) < 0xF)
if (((s32) player->tyres[BACK_LEFT].surfaceType) < 0xF)
{
var_f2 += D_800E3610[player->characterId][player->boundingBoxCorners[2].surfaceType];
var_f2 += D_800E3610[player->characterId][player->tyres[BACK_LEFT].surfaceType];
}
if ((player->effects & 0x20) == 0x20)
{
@ -4014,7 +4015,7 @@ void func_80033AE0(Player *player, struct Controller *controller, s8 arg2) {
sp2C8 *= 1.2;
sp2CC *= 1.2;
}
if ((((f64) (D_801652A0[arg2] - player->boundingBoxCorners[2].cornerGroundY)) >= 3.5) || (((f64) (D_801652A0[arg2] - player->boundingBoxCorners[3].cornerGroundY)) >= 3.5))
if ((((f64) (D_801652A0[arg2] - player->tyres[BACK_LEFT].baseHeight)) >= 3.5) || (((f64) (D_801652A0[arg2] - player->tyres[BACK_RIGHT].baseHeight)) >= 3.5))
{
sp2C8 *= 1.05;
sp2CC *= 1.05;
@ -4146,17 +4147,17 @@ void func_80033AE0(Player *player, struct Controller *controller, s8 arg2) {
func_8002BD58(player);
}
player->effects &= 0xDFFFFFFF;
if (((s32) player->boundingBoxCorners[3].surfaceType) > 0xE)
if (((s32) player->tyres[BACK_RIGHT].surfaceType) > 0xE)
{
var_f12 = var_f12;
}
else
{
var_f12 += D_800E3410[player->characterId][player->boundingBoxCorners[3].surfaceType];
var_f12 += D_800E3410[player->characterId][player->tyres[BACK_RIGHT].surfaceType];
}
if (((s32) player->boundingBoxCorners[2].surfaceType) < 0xF)
if (((s32) player->tyres[BACK_LEFT].surfaceType) < 0xF)
{
var_f12 += D_800E3410[player->characterId][player->boundingBoxCorners[2].surfaceType];
var_f12 += D_800E3410[player->characterId][player->tyres[BACK_LEFT].surfaceType];
}
if (((player->effects & 2) != 2) && ((player->effects & 0x10) != 0x10))
{
@ -4650,7 +4651,7 @@ void func_80037CFC(Player *player, struct Controller *controller, s8 arg2) {
}
if ((player->effects & 8) != 8) {
func_80033AE0(player, controller, arg2);
} else if (((player->effects & 2) == 2) && (player->unk_110.unk3C[2] <= 5.0f)) {
} else if (((player->effects & 2) == 2) && (player->collision.surfaceDistance[2] <= 5.0f)) {
func_80033AE0(player, controller, arg2);
}
player->effects &= ~1;
@ -4678,11 +4679,11 @@ void func_80037CFC(Player *player, struct Controller *controller, s8 arg2) {
} else {
if (gModeSelection == BATTLE)
{
func_80031F48(player, 2.0f);
decelerate_ai_player(player, 2.0f);
}
else
{
func_80031F48(player, 1.0f);
decelerate_ai_player(player, 1.0f);
}
detect_triple_a_combo_a_released(player);
}
@ -4715,7 +4716,7 @@ void func_80037CFC(Player *player, struct Controller *controller, s8 arg2) {
if (controller->button & A_BUTTON) {
player_speed(player);
} else {
func_80031F48(player, 5.0f);
decelerate_ai_player(player, 5.0f);
}
}
if (((((player->effects & 0x80) == 0x80) ||
@ -5012,42 +5013,42 @@ void func_80038C6C(Player *player, UNUSED Camera *camera, s8 arg2, s8 playerId)
func_8002AAC0(player);
spE8 += player->kartHopVelocity;
spE8 -= 0.02;
func_802AD950(&player->unk_110, player->boundingBoxSize, spEC, spE8, spE4, player->copy_rotation_x, player->copy_rotation_y, player->copy_rotation_z);
actor_terrain_collision(&player->collision, player->boundingBoxSize, spEC, spE8, spE4, player->copy_rotation_x, player->copy_rotation_y, player->copy_rotation_z);
player->unk_058 = 0;
player->unk_060 = 0;
player->unk_05C = 1.0f;
calculate_orientation_matrix(player->orientationMatrix, 0, 1.0f, 0, player->rotation[1]);
player->effects |= 8;
player->unk_0C2 += 1;
sp98 = player->unk_110.unk3C[2];
sp98 = player->collision.surfaceDistance[2];
if (sp98 <= 0) {
player->unk_0C2 = 0;
player->effects &= ~2;
player->effects &= ~8;
player->kartHopVelocity = player->unk_0C2;
}
sp98 = player->unk_110.unk3C[2];
sp98 = player->collision.surfaceDistance[2];
if (sp98 <= 0) {
func_8003F46C(player, sp7C, sp88, sp108, &sp98, &spEC, &spE8, &spE4);
}
sp98 = player->unk_110.unk3C[0];
sp98 = player->collision.surfaceDistance[0];
if (sp98 < 0) {
func_8003F734(player, sp7C, sp88, &sp98, &spEC, &spE8, &spE4);
func_8002C954(player, playerId, sp88);
}
sp98 = player->unk_110.unk3C[1];
sp98 = player->collision.surfaceDistance[1];
if (sp98 < 0) {
func_8003FBAC(player, sp7C, sp88, &sp98, &spEC, &spE8, &spE4);
func_8002C954(player, playerId, sp88);
}
sp98 = player->unk_110.unk3C[0];
sp98 = player->collision.surfaceDistance[0];
if (sp98 >= 0) {
sp98 = player->unk_110.unk3C[1];
sp98 = player->collision.surfaceDistance[1];
if (sp98 >= 0) {
player->unk_046 &= 0xFFDF;
}
}
player->unk_074 = func_802ABE30(spEC, spE8, spE4, player->unk_110.unk3A);
player->unk_074 = calculate_surface_height(spEC, spE8, spE4, player->collision.meshIndexZX);
func_80029B4C(player, spEC, spE8, spE4);
func_8002AE38(player, playerId, posX, posZ, spEC, spE4);
sqrt = (sp88[0] * sp88[0]) + (sp88[2] * sp88[2]);
@ -5086,7 +5087,7 @@ void func_80038C6C(Player *player, UNUSED Camera *camera, s8 arg2, s8 playerId)
player->unk_094 = 1.0f;
}
}
if (player->unk_110.unk3C[2] >= 500.0f) {
if (player->collision.surfaceDistance[2] >= 500.0f) {
player->unk_078 /= 2;
}
func_8002C4F8(player, playerId);

View File

@ -74,7 +74,7 @@ void func_80030A34(Player*);
void detect_triple_a_combo_a_released(Player*);
void detect_triple_a_combo_a_pressed(Player*);
void player_speed(Player*);
void func_80031F48(Player*, f32);
void decelerate_ai_player(Player*, f32);
void detect_triple_b_combo_b_released(Player*);
void detect_triple_b_combo_b_pressed(Player*);
void func_800323E4(Player*);

View File

@ -226,3 +226,23 @@ extern "C" void Timer_SetValue(int32_t* address, int32_t value) {
// }
// }
// }
extern "C" float OTRGetAspectRatio() {
return gfx_current_dimensions.aspect_ratio;
}
extern "C" float OTRGetDimensionFromLeftEdge(float v) {
return (SCREEN_WIDTH / 2 - SCREEN_HEIGHT / 2 * OTRGetAspectRatio() + (v));
}
extern "C" int16_t OTRGetRectDimensionFromLeftEdge(float v) {
return ((int)floorf(OTRGetDimensionFromLeftEdge(v)));
}
extern "C" float OTRGetDimensionFromRightEdge(float v) {
return (SCREEN_WIDTH / 2 + SCREEN_HEIGHT / 2 * OTRGetAspectRatio() - (SCREEN_WIDTH - v));
}
extern "C" int16_t OTRGetRectDimensionFromRightEdge(float v) {
return ((int)ceilf(OTRGetDimensionFromRightEdge(v)));
}

View File

@ -27,6 +27,11 @@ class GameEngine {
void ProcessFrame(void (*run_one_game_iter)()) const;
static void Destroy();
static void ProcessGfxCommands(Gfx* commands);
float OTRGetAspectRatio(void);
float OTRGetDimensionFromLeftEdge(float v);
float OTRGetDimensionFromRightEdge(float v);
int16_t OTRGetRectDimensionFromLeftEdge(float v);
int16_t OTRGetRectDimensionFromRightEdge(float v);
};
#else
void GameEngine_ProcessGfxCommands(Gfx* commands);

View File

@ -7,6 +7,7 @@ extern "C" {
#include "main.h"
#include "audio/load.h"
#include "audio/external.h"
#include "networking/networking.h"
}
extern "C"

View File

@ -0,0 +1,84 @@
#include "GameInfoWindow.h"
#include "UIWidgets.h"
#include "libultraship/src/Context.h"
#include <imgui.h>
#include <libultraship/libultraship.h>
#include "spdlog/spdlog.h"
#include <common_structs.h>
#include <defines.h>
extern "C" {
#include "../../../src/main.h"
#include "networking/networking.h"
}
namespace GameInfo {
GameInfoWindow::~GameInfoWindow() {
SPDLOG_TRACE("destruct game info window");
}
void GameInfoWindow::InitElement() {
}
static s32 sReadyUpBool = false;
void GameInfoWindow::DrawElement() {
const float framerate = ImGui::GetIO().Framerate;
const float deltatime = ImGui::GetIO().DeltaTime;
ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0, 0, 0, 0));
static char username[NETWORK_USERNAME_LENGTH] = "TestUser";
ImGui::Text("Username:");
ImGui::InputText("##edit", username, IM_ARRAYSIZE(username));
static char address[32] = "127.0.0.1:64010";
static char addressCopy[32];
strncpy(addressCopy, address, sizeof(addressCopy));
addressCopy[sizeof(addressCopy) - 1] = '\0'; // Ensure null termination
ImGui::Text("Host:");
ImGui::InputText("##edit3", addressCopy, IM_ARRAYSIZE(addressCopy));
if (ImGui::Button("Connect!")) {
char* ip = NULL;
uint16_t port = 0;
char* token = strtok(addressCopy, ":");
ip = token;
token = strtok(NULL, ":");
if (token != NULL) {
port = (uint16_t)atoi(token);
}
gNetwork.enabled = true;
ConnectToServer(ip, port, username);
}
char buttonLabel[32];
if (sReadyUpBool) {
strcpy(buttonLabel, "Lets Go!");
} else {
strcpy(buttonLabel, "Ready Up!");
}
if (ImGui::Button(buttonLabel)) {
sReadyUpBool = !sReadyUpBool;
networking_ready_up(sReadyUpBool);
}
if (gGamestate == RACING) {
for (int i = 0; i < NUM_PLAYERS; i++) {
ImGui::Text("Player %d: type: %X, char: %d, rank: %d, hasAuthority: %d", i, gPlayers[i].type, gPlayers[i].characterId, gPlayers[i].currentRank, gPlayers[i].nHasAuthority);
}
}
ImGui::PopStyleColor();
}
void GameInfoWindow::UpdateElement() {
}
} // namespace GameInfo

View File

@ -0,0 +1,16 @@
#pragma once
#include <libultraship/libultraship.h>
namespace GameInfo {
class GameInfoWindow : public Ship::GuiWindow {
public:
using Ship::GuiWindow::GuiWindow;
~GameInfoWindow();
private:
void InitElement() override;
void DrawElement() override;
void UpdateElement() override;
};
} // namespace GameInfo

View File

@ -1,6 +1,7 @@
#include "ImguiUI.h"
#include "UIWidgets.h"
#include "ResolutionEditor.h"
#include "GameInfoWindow.h"
#include <spdlog/spdlog.h>
#include <imgui.h>
@ -22,6 +23,7 @@ std::shared_ptr<Ship::GuiWindow> mConsoleWindow;
std::shared_ptr<Ship::GuiWindow> mStatsWindow;
std::shared_ptr<Ship::GuiWindow> mInputEditorWindow;
std::shared_ptr<Ship::GuiWindow> mGfxDebuggerWindow;
std::shared_ptr<Ship::GuiWindow> mGameInfoWindow;
std::shared_ptr<AdvancedResolutionSettings::AdvancedResolutionSettingsWindow> mAdvancedResolutionSettingsWindow;
void SetupGuiElements() {
@ -34,6 +36,12 @@ void SetupGuiElements() {
mGameMenuBar = std::make_shared<GameMenuBar>("gOpenMenuBar", CVarGetInteger("gOpenMenuBar", 0));
gui->SetMenuBar(mGameMenuBar);
mGameInfoWindow = gui->GetGuiWindow("GameInfo");
if (mGameInfoWindow == nullptr) {
SPDLOG_ERROR("Could not find game info window");
}
mStatsWindow = gui->GetGuiWindow("Stats");
if (mStatsWindow == nullptr) {
SPDLOG_ERROR("Could not find stats window");
@ -55,12 +63,16 @@ void SetupGuiElements() {
SPDLOG_ERROR("Could not find input GfxDebuggerWindow");
}
mGameInfoWindow = std::make_shared<GameInfo::GameInfoWindow>("gGameInfoEnabled", "Game info");
gui->AddGuiWindow(mGameInfoWindow);
mAdvancedResolutionSettingsWindow = std::make_shared<AdvancedResolutionSettings::AdvancedResolutionSettingsWindow>("gAdvancedResolutionEditorEnabled", "Advanced Resolution Settings");
gui->AddGuiWindow(mAdvancedResolutionSettingsWindow);
}
void Destroy() {
mAdvancedResolutionSettingsWindow = nullptr;
mGameInfoWindow = nullptr;
mConsoleWindow = nullptr;
mStatsWindow = nullptr;
mInputEditorWindow = nullptr;
@ -476,6 +488,10 @@ void DrawDebugMenu() {
UIWidgets::Spacer(0);
UIWidgets::WindowButton("GameInfo", "gGameInfoEnabled", GameUI::mGameInfoWindow, {
.tooltip = "Shows the game info window, contains player and actor information"
});
UIWidgets::WindowButton("Stats", "gStatsEnabled", GameUI::mStatsWindow, {
.tooltip = "Shows the stats window, with your FPS and frametimes, and the OS you're playing on"
});

View File

@ -8,6 +8,7 @@
#include <common_structs.h>
#include <actor_types.h>
#include <defines.h>
#include <macros.h>
#include "code_800029B0.h"
#include "main.h"
@ -27,6 +28,7 @@
#include "main.h"
#include <assets/other_textures.h>
#include <assets/mario_raceway_data.h>
#include <assets/luigi_raceway_data.h>
// Appears to be textures
// or tluts
@ -259,7 +261,7 @@ void actor_init(struct Actor *actor, Vec3f startingPos, Vec3s startingRot, Vec3f
actor->flags = actor->flags | 0x4000 | 0x1000;
actor->unk_08 = 0.35f;
actor->boundingBoxSize = 1.925f;
func_802ADDC8(&actor->unk30, 1.925f, actor->pos[0], actor->pos[1], actor->pos[2]);
check_bounding_collision(&actor->unk30, 1.925f, actor->pos[0], actor->pos[1], actor->pos[2]);
break;
case ACTOR_HOT_AIR_BALLOON_ITEM_BOX:
actor->flags |= 0x4000;
@ -378,35 +380,37 @@ void func_80297760(struct Actor *arg0, Vec3f arg1) {
arg1[0] = arg0->pos[0];
arg1[1] = arg0->pos[1];
arg1[2] = arg0->pos[2];
arg1[1] = func_802ABE30(arg1[0], arg1[1], arg1[2], arg0->unk30.unk3A);
arg1[1] = calculate_surface_height(arg1[0], arg1[1], arg1[2], arg0->unk30.meshIndexZX);
}
void func_802977B0(Player *arg0) {
arg0->boundingBoxCorners[1].unk_14 |= 2;
arg0->boundingBoxCorners[0].unk_14 |= 2;
arg0->boundingBoxCorners[3].unk_14 |= 2;
arg0->boundingBoxCorners[2].unk_14 |= 2;
arg0->tyres[FRONT_RIGHT].unk_14 |= 2;
arg0->tyres[FRONT_LEFT].unk_14 |= 2;
arg0->tyres[BACK_RIGHT].unk_14 |= 2;
arg0->tyres[BACK_LEFT].unk_14 |= 2;
}
void func_802977E4(Player *arg0) {
arg0->boundingBoxCorners[1].unk_14 &= ~2 & 0xFFFF;
arg0->boundingBoxCorners[0].unk_14 &= ~2 & 0xFFFF;
arg0->boundingBoxCorners[3].unk_14 &= ~2 & 0xFFFF;
arg0->boundingBoxCorners[2].unk_14 &= ~2 & 0xFFFF;
arg0->tyres[FRONT_RIGHT].unk_14 &= ~2 & 0xFFFF;
arg0->tyres[FRONT_LEFT].unk_14 &= ~2 & 0xFFFF;
arg0->tyres[BACK_RIGHT].unk_14 &= ~2 & 0xFFFF;
arg0->tyres[BACK_LEFT].unk_14 &= ~2 & 0xFFFF;
}
// Invert green and red on green shell texture
// Generate the red shell tlut by invert green the green one
void init_red_shell_texture(void) {
s16 *tlut = (s16 *) LOAD_ASSET(common_tlut_green_shell);
s16 *red_shell_texture = (s16 *) &gTLUTRedShell[0];
s16 *green_shell_texture = (s16 *) common_tlut_green_shell;
s16 *green_shell_texture = (s16 *) tlut;
s16 color_pixel, red_color, green_color, blue_color, alpha_color;
s32 i;
for (i = 0; i < 256; i++) {
color_pixel = *green_shell_texture;
red_color = color_pixel & 0xF800;
green_color = color_pixel & 0x7C0;
blue_color = color_pixel & 0x3E;
alpha_color = color_pixel & 0x1;
color_pixel = BSWAP16(*green_shell_texture);
red_color = BSWAP16(color_pixel & 0xF800);
green_color = BSWAP16(color_pixel & 0x7C0);
blue_color = BSWAP16(color_pixel & 0x3E);
alpha_color = BSWAP16(color_pixel & 0x1);
*red_shell_texture = (red_color >> 5) | (green_color << 5) | blue_color | alpha_color; // Invert green to red
green_shell_texture++;
@ -563,7 +567,7 @@ void evaluate_collision_players_palm_trees(void) {
for (index = 0; index < 4; index++){
// wtf is up with the << 0x18 >> 0x18? is it some weird type conversion? just use & 0xFF have the same effect to keep 8 first bit
if (((gPlayers[index].type & 0xC000) != 0) && (((get_surface_type(gPlayers[index].unk_110.unk3A) << 24) >> 24) == GRASS)) {
if (((gPlayers[index].type & 0xC000) != 0) && (((get_surface_type(gPlayers[index].collision.meshIndexZX) << 24) >> 24) == GRASS)) {
evaluate_collision_player_palm_trees(&gPlayers[index]);
}
}
@ -845,7 +849,7 @@ void spawn_palm_trees(struct ActorSpawnData *spawnData) {
temp_v1 = (struct PalmTree *) &gActorList[temp];
temp_v1->variant = temp_s0->someId;
func_802ADDC8((Collision *) &temp_v1->unk30, 5.0f, temp_v1->pos[0], temp_v1->pos[1], temp_v1->pos[2]);
check_bounding_collision((Collision *) &temp_v1->unk30, 5.0f, temp_v1->pos[0], temp_v1->pos[1], temp_v1->pos[2]);
func_802976EC((Collision *) &temp_v1->unk30, temp_v1->rot);
temp_s0++;
}
@ -923,9 +927,9 @@ void spawn_foliage(struct ActorSpawnData *arg0) {
if (gGamestate == CREDITS_SEQUENCE) {
func_802976D8(temp_s0->rot);
} else {
func_802ADDC8(&temp_s0->unk30, 5.0f, temp_s0->pos[0], temp_s0->pos[1], temp_s0->pos[2]);
if (temp_s0->unk30.unk3C[2] < 0.0f) {
temp_s0->pos[1] = func_802ABE30(temp_s0->pos[0], temp_s0->pos[1], temp_s0->pos[2], temp_s0->unk30.unk3A);
check_bounding_collision(&temp_s0->unk30, 5.0f, temp_s0->pos[0], temp_s0->pos[1], temp_s0->pos[2]);
if (temp_s0->unk30.surfaceDistance[2] < 0.0f) {
temp_s0->pos[1] = calculate_surface_height(temp_s0->pos[0], temp_s0->pos[1], temp_s0->pos[2], temp_s0->unk30.meshIndexZX);
}
func_802976EC(&temp_s0->unk30, temp_s0->rot);
}
@ -953,7 +957,7 @@ void spawn_all_item_boxes(struct ActorSpawnData *spawnData) {
startingRot[1] = random_u16();
startingRot[2] = random_u16();
temp_s1 = add_actor_to_empty_slot(startingPos, startingRot, startingVelocity, ACTOR_ITEM_BOX);
temp_f0 = func_802AE1C0(startingPos[0], startingPos[1] + 10.0f, startingPos[2]);
temp_f0 = spawn_actor_on_surface(startingPos[0], startingPos[1] + 10.0f, startingPos[2]);
// Should be struct ItemBox but not enough space in the stack.
// It's either the ItemBox or the SEGMENT/OFFSET variables.
@ -1150,7 +1154,7 @@ void spawn_course_actors(void) {
*
*/
void init_actors_and_load_textures(void) {
set_segment_base_addr(3, (void *) gNextFreeMemoryAddress);
set_segment_base_addr_x64(3, (void *) gNextFreeMemoryAddress);
D_802BA050 = dma_textures(gTextureGreenShell0, 0x00000257U, 0x00000400U);
dma_textures(gTextureGreenShell1, 0x00000242U, 0x00000400U);
dma_textures(gTextureGreenShell2, 0x00000259U, 0x00000400U);
@ -1806,18 +1810,18 @@ void destroy_destructable_actor(struct Actor *actor) {
Player *player;
switch (actor->type) {
case ACTOR_BANANA:
banana = (struct BananaActor *)actor;
switch (banana->state) {
case FIRST_BANANA_BUNCH_BANANA:
case BANANA_BUNCH_BANANA:
destroy_banana_in_banana_bunch(banana);
break;
case HELD_BANANA:
player = &gPlayers[banana->playerId];
player->soundEffects &= ~0x00040000;
/* fallthrough */
case BANANA_ON_GROUND:
case ACTOR_BANANA:
banana = (struct BananaActor *)actor;
switch (banana->state) {
case FIRST_BANANA_BUNCH_BANANA:
case BANANA_BUNCH_BANANA:
destroy_banana_in_banana_bunch(banana);
break;
case HELD_BANANA:
player = &gPlayers[banana->playerId];
player->soundEffects &= ~0x00040000;
/* fallthrough */
case BANANA_ON_GROUND:
banana->flags = -0x8000;
banana->unk_04 = 0x003C;
banana->state = DESTROYED_BANANA;

View File

@ -16,20 +16,20 @@
#include "effects.h"
#include "sounds.h"
void copy_collision(Collision *arg0, Collision *arg1) {
arg1->unk30 = arg0->unk30;
arg1->unk32 = arg0->unk32;
arg1->unk34 = arg0->unk34;
arg1->unk36 = arg0->unk36;
arg1->unk38 = arg0->unk38;
arg1->unk3A = arg0->unk3A;
arg1->unk3C[0] = arg0->unk3C[0];
arg1->unk3C[1] = arg0->unk3C[1];
arg1->unk3C[2] = arg0->unk3C[2];
void copy_collision(Collision *src, Collision *dest) {
dest->unk30 = src->unk30;
dest->unk32 = src->unk32;
dest->unk34 = src->unk34;
dest->meshIndexYX = src->meshIndexYX;
dest->meshIndexZY = src->meshIndexZY;
dest->meshIndexZX = src->meshIndexZX;
dest->surfaceDistance[0] = src->surfaceDistance[0];
dest->surfaceDistance[1] = src->surfaceDistance[1];
dest->surfaceDistance[2] = src->surfaceDistance[2];
vec3f_copy_return(arg1->unk48, arg0->unk48);
vec3f_copy_return(arg1->unk54, arg0->unk54);
vec3f_copy_return(arg1->orientationVector, arg0->orientationVector);
vec3f_copy_return(dest->unk48, src->unk48);
vec3f_copy_return(dest->unk54, src->unk54);
vec3f_copy_return(dest->orientationVector, src->orientationVector);
}
void triple_shell_actor_collide_with_player(struct ShellActor *shell, s32 shellType) {
@ -572,7 +572,7 @@ s32 init_triple_shell(TripleShellParent *parent, Player *player, s16 shellType,
startingPos[0] = player->pos[0];
startingPos[1] = player->pos[1];
startingPos[2] = player->pos[2];
func_802AD950(&shell->unk30, shell->boundingBoxSize + 1.0f, shell->pos[0], shell->pos[1], shell->pos[2], startingPos[0], startingPos[1], startingPos[2]);
actor_terrain_collision(&shell->unk30, shell->boundingBoxSize + 1.0f, shell->pos[0], shell->pos[1], shell->pos[2], startingPos[0], startingPos[1], startingPos[2]);
func_802B4E30((struct Actor *)shell);
shell->flags = 0x9000;
switch (shellType) {
@ -622,7 +622,7 @@ s32 use_green_shell_item(Player *player) {
startingPos[0] = player->pos[0];
startingPos[1] = player->pos[1];
startingPos[2] = player->pos[2];
func_802AD950(&shell->unk30, shell->boundingBoxSize + 1.0f, shell->pos[0], shell->pos[1], shell->pos[2], startingPos[0], startingPos[1], startingPos[2]);
actor_terrain_collision(&shell->unk30, shell->boundingBoxSize + 1.0f, shell->pos[0], shell->pos[1], shell->pos[2], startingPos[0], startingPos[1], startingPos[2]);
func_802B4E30((struct Actor *)shell);
shell->state = HELD_SHELL;
shell->rotVelocity = 0;
@ -661,7 +661,7 @@ s32 use_red_shell_item(Player *player) {
startingPos[0] = player->pos[0];
startingPos[1] = player->pos[1];
startingPos[2] = player->pos[2];
func_802AD950(&shell->unk30, shell->boundingBoxSize + 1.0f, shell->pos[0], shell->pos[1], shell->pos[2], startingPos[0], startingPos[1], startingPos[2]);
actor_terrain_collision(&shell->unk30, shell->boundingBoxSize + 1.0f, shell->pos[0], shell->pos[1], shell->pos[2], startingPos[0], startingPos[1], startingPos[2]);
func_802B4E30((struct Actor *)shell);
shell->state = HELD_SHELL;
shell->rotVelocity = 0;
@ -708,7 +708,7 @@ void func_802B2914(struct BananaBunchParent *banana_bunch, Player *player, s16 b
startingPos[0] = player->pos[0];
startingPos[1] = player->pos[1];
startingPos[2] = player->pos[2];
func_802AD950(&newBanana->unk30, newBanana->boundingBoxSize + 1.0f, newBanana->pos[0], newBanana->pos[1], newBanana->pos[2], startingPos[0], startingPos[1], startingPos[2]);
actor_terrain_collision(&newBanana->unk30, newBanana->boundingBoxSize + 1.0f, newBanana->pos[0], newBanana->pos[1], newBanana->pos[2], startingPos[0], startingPos[1], startingPos[2]);
func_802B4E30((struct Actor*)newBanana);
newBanana->flags = 0x9000;
newBanana->playerId = player - gPlayerOne;
@ -960,19 +960,19 @@ void check_player_use_item(void) {
#include "actors/blue_and_red_shells/update.inc.c"
void func_802B4E30(struct Actor *arg0) {
if ((arg0->unk30.unk3C[2] < 0.0f) && (arg0->unk30.unk34 == 1)) {
arg0->pos[0] -= (arg0->unk30.orientationVector[0] * arg0->unk30.unk3C[2]);
arg0->pos[1] -= (arg0->unk30.orientationVector[1] * arg0->unk30.unk3C[2]);
arg0->pos[2] -= (arg0->unk30.orientationVector[2] * arg0->unk30.unk3C[2]);
if ((arg0->unk30.surfaceDistance[2] < 0.0f) && (arg0->unk30.unk34 == 1)) {
arg0->pos[0] -= (arg0->unk30.orientationVector[0] * arg0->unk30.surfaceDistance[2]);
arg0->pos[1] -= (arg0->unk30.orientationVector[1] * arg0->unk30.surfaceDistance[2]);
arg0->pos[2] -= (arg0->unk30.orientationVector[2] * arg0->unk30.surfaceDistance[2]);
}
if ((arg0->unk30.unk3C[0] < 0.0f) && (arg0->unk30.unk30 == 1)) {
arg0->pos[0] -= (arg0->unk30.unk48[0] * arg0->unk30.unk3C[0]);
arg0->pos[1] -= (arg0->unk30.unk48[1] * arg0->unk30.unk3C[0]);
arg0->pos[2] -= (arg0->unk30.unk48[2] * arg0->unk30.unk3C[0]);
if ((arg0->unk30.surfaceDistance[0] < 0.0f) && (arg0->unk30.unk30 == 1)) {
arg0->pos[0] -= (arg0->unk30.unk48[0] * arg0->unk30.surfaceDistance[0]);
arg0->pos[1] -= (arg0->unk30.unk48[1] * arg0->unk30.surfaceDistance[0]);
arg0->pos[2] -= (arg0->unk30.unk48[2] * arg0->unk30.surfaceDistance[0]);
}
if ((arg0->unk30.unk3C[1] < 0.0f) && (arg0->unk30.unk32 == 1)) {
arg0->pos[0] -= (arg0->unk30.unk54[0] * arg0->unk30.unk3C[1]);
arg0->pos[1] -= (arg0->unk30.unk54[1] * arg0->unk30.unk3C[1]);
arg0->pos[2] -= (arg0->unk30.unk54[2] * arg0->unk30.unk3C[1]);
if ((arg0->unk30.surfaceDistance[1] < 0.0f) && (arg0->unk30.unk32 == 1)) {
arg0->pos[0] -= (arg0->unk30.unk54[0] * arg0->unk30.surfaceDistance[1]);
arg0->pos[1] -= (arg0->unk30.unk54[1] * arg0->unk30.surfaceDistance[1]);
arg0->pos[2] -= (arg0->unk30.unk54[2] * arg0->unk30.surfaceDistance[1]);
}
}

File diff suppressed because it is too large Load Diff

View File

@ -9,31 +9,31 @@
void nullify_displaylist(uintptr_t);
void func_802AAAAC(Collision*);
f32 func_802AAB4C(Player*);
s32 func_802AAE4C(Collision*, f32, f32, f32, f32, u16);
s32 func_802AB288(Collision*, f32, f32, f32, f32, u16);
s32 func_802AB6C4(Collision*, f32, f32, f32, f32, u16);
s32 check_collision_zx(Collision*, f32, f32, f32, f32, u16);
s32 check_collision_yx(Collision*, f32, f32, f32, f32, u16);
s32 check_collision_zy(Collision*, f32, f32, f32, f32, u16);
s8 get_surface_type(u16);
s16 func_802ABD40(u16);
s16 get_section_id(u16);
s16 func_802ABD7C(u16);
s16 func_802ABDB8(u16);
s16 func_802ABDF4(u16);
f32 func_802ABE30(f32, f32, f32, u16);
f32 calculate_surface_height(f32, f32, f32, u16);
f32 func_802ABEAC(Collision*, Vec3f);
void shell_collision(Collision *, Vec3f);
void process_shell_collision(Vec3f, f32, Vec3f, f32);
u16 process_collision(Player*, KartBoundingBoxCorner*, f32, f32, f32);
void func_802AC114(Vec3f, f32, Vec3f, f32);
s32 func_802AC22C(KartBoundingBoxCorner*);
u16 func_802AD950(Collision*, f32, f32, f32, f32, f32, f32, f32);
u16 func_802ADDC8(Collision*, f32, f32, f32, f32);
f32 func_802AE1C0(f32, f32, f32);
u16 process_collision(Player*, KartTyre*, f32, f32, f32);
void adjust_pos_orthogonally(Vec3f, f32, Vec3f, f32);
s32 detect_tyre_collision(KartTyre*);
u16 actor_terrain_collision(Collision*, f32, f32, f32, f32, f32, f32, f32);
u16 check_bounding_collision(Collision*, f32, f32, f32, f32);
f32 spawn_actor_on_surface(f32, f32, f32);
void set_vtx_buffer(uintptr_t, u32, u32);
s32 is_line_intersecting_rectangle(s16, s16, s16, s16, s16, s16, s16, s16);
s32 is_triangle_intersecting_bounding_box(s16, s16, s16, s16, u16);
void func_802AF314(void);
void set_vertex_data_with_defaults(Gfx*);
void set_vertex_data_with_default_section_id(Gfx*, s8);
void find_and_set_vertex_data(Gfx*, s8, u16);
void generate_collision_grid(void);
void generate_collision_mesh_with_defaults(Gfx*);
void generate_collision_mesh_with_default_section_id(Gfx*, s8);
void generate_collision_mesh(Gfx*, s8, u16);
void find_and_set_tile_size(uintptr_t, s32, s32);
void set_vertex_colours(uintptr_t, u32, s32, s8, u8, u8, u8);
void find_vtx_and_set_colours(uintptr_t, s8, u8, u8, u8);

View File

@ -0,0 +1,180 @@
// #include <libultraship.h>
// #include "framebuffer_effects.h"
// #include "mk64.h"
// #include <assets/common_data.h>
// int gfx_create_framebuffer(uint32_t width, uint32_t height, uint32_t native_width, uint32_t native_height,
// uint8_t resize);
// s32 gPauseFrameBuffer = -1;
// s32 gBlurFrameBuffer = -1;
// // A framebuffer that should only be used for drawing in the same frame that it is copied too
// // i.e. the VisMono and VisFbuf effects
// s32 gReusableFrameBuffer = -1;
// // N64 resolution sized buffer (320x240), used by picto box and deku bubble
// s32 gN64ResFrameBuffer = -1;
// void FB_CreateFramebuffers(void) {
// if (gPauseFrameBuffer == -1) {
// gPauseFrameBuffer = gfx_create_framebuffer(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_WIDTH, SCREEN_HEIGHT, true);
// }
// if (gBlurFrameBuffer == -1) {
// gBlurFrameBuffer = gfx_create_framebuffer(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_WIDTH, SCREEN_HEIGHT, true);
// }
// if (gReusableFrameBuffer == -1) {
// gReusableFrameBuffer = gfx_create_framebuffer(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_WIDTH, SCREEN_HEIGHT, true);
// }
// if (gN64ResFrameBuffer == -1) {
// gN64ResFrameBuffer = gfx_create_framebuffer(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_WIDTH, SCREEN_HEIGHT, false);
// }
// }
// /**
// * Copies the current texture data from the source frame buffer to the destination frame buffer
// * Setting oncePerFrame ensures that the copy will only happen once every game frame. This
// * is important for effects that could be affected by increased frame interpolation (like motion blur).
// * A pointer to a boolean is passed to the render for the render to set once the copy has been performed.
// * This function uses opcodes from f3dex2 but may be called when s2dex is loaded, such as during shrink window. Make
// * sure f3dex2 is loaded before this function is called.
// */
// void FB_CopyToFramebuffer(Gfx** gfxp, s32 fb_src, s32 fb_dest, u8 oncePerFrame, u8* hasCopied) {
// Gfx* gfx = *gfxp;
// gSPMatrix(gfx++, &D_0D008E98, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
// gDPSetOtherMode(gfx++,
// G_AD_DISABLE | G_CD_DISABLE | G_CK_NONE | G_TC_FILT | G_TF_POINT | G_TT_NONE | G_TL_TILE |
// G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
// G_AC_NONE | G_ZS_PRIM | G_RM_OPA_SURF | G_RM_OPA_SURF2);
// gSPClearGeometryMode(gfx++, G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR);
// gSPSetGeometryMode(gfx++, G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH);
// gDPSetBlendColor(gfx++, 255, 255, 255, 8);
// gDPSetPrimDepth(gfx++, 0xFFFF, 0xFFFF);
// gDPSetEnvColor(gfx++, 255, 255, 255, 255);
// gDPSetCombineLERP(gfx++, TEXEL0, 0, ENVIRONMENT, 0, 0, 0, 0, ENVIRONMENT, TEXEL0, 0, ENVIRONMENT, 0, 0, 0, 0,
// ENVIRONMENT);
// gDPSetScissor(gfx++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
// gDPCopyFB(gfx++, fb_dest, fb_src, oncePerFrame, hasCopied);
// *gfxp = gfx;
// }
// /**
// * Copies a 4:3 slice of the current framebuffer scaled down to 320x240 to a CPU buffer address.
// * The buffer output will be in RGBA16 format.
// * Specify the byteswap flag to force the buffer data to be written as BigEndian, which is
// * required if the buffer is being used as a texture in F3D.
// */
// void FB_WriteFramebufferSliceToCPU(Gfx** gfxp, void* buffer, u8 byteSwap) {
// Gfx* gfx = *gfxp;
// FB_CopyToFramebuffer(&gfx, 0, gReusableFrameBuffer, false, NULL);
// // Set the N64 resolution framebuffer as the draw target (320x240)
// gsSPSetFB(gfx++, gN64ResFrameBuffer);
// // Reset scissor for new framebuffer
// gDPSetScissor(gfx++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
// int16_t s0 = 0, t0 = 0;
// int16_t s1 = OTRGetGameRenderWidth();
// int16_t t1 = OTRGetGameRenderHeight();
// float aspectRatio = OTRGetAspectRatio();
// float fourByThree = 4.0f / 3.0f;
// // Adjust the texture coordinates so that only a 4:3 region from the center is drawn
// // to the N64 resolution buffer. Currently ratios smaller than 4:3 will just stretch to fill.
// if (aspectRatio > fourByThree) {
// int16_t adjustedWidth = OTRGetGameRenderWidth() / (aspectRatio / fourByThree);
// s0 = (OTRGetGameRenderWidth() - adjustedWidth) / 2;
// s1 -= s0;
// }
// gDPSetTextureImageFB(gfx++, 0, 0, 0, gReusableFrameBuffer);
// gDPImageRectangle(gfx++, 0 << 2, 0 << 2, s0, t0, SCREEN_WIDTH << 2, SCREEN_HEIGHT << 2, s1, t1, G_TX_RENDERTILE,
// OTRGetGameRenderWidth(), OTRGetGameRenderHeight());
// // Read the final N64 framebuffer back as rgba16 into the CPU-side buffer
// gDPReadFB(gfx++, gN64ResFrameBuffer, buffer, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, byteSwap);
// gsSPResetFB(gfx++);
// // Reset scissor for original framebuffer
// gDPSetScissor(gfx++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
// *gfxp = gfx;
// }
// /**
// * Draws the texture data from the specified frame buffer as a full screen image
// */
// void FB_DrawFromFramebuffer(Gfx** gfxp, s32 fb, u8 alpha) {
// Gfx* gfx = *gfxp;
// gSPMatrix(gfx++, &D_0D008E98, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
// gDPSetEnvColor(gfx++, 255, 255, 255, alpha);
// gDPSetOtherMode(gfx++,
// G_AD_NOISE | G_CD_NOISE | G_CK_NONE | G_TC_FILT | G_TF_POINT | G_TT_NONE | G_TL_TILE | G_TD_CLAMP |
// G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
// G_AC_NONE | G_ZS_PRIM | G_RM_CLD_SURF | G_RM_CLD_SURF2);
// gSPClearGeometryMode(gfx++, G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR);
// gSPSetGeometryMode(gfx++, G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH);
// gDPSetCombineLERP(gfx++, TEXEL0, 0, ENVIRONMENT, 0, 0, 0, 0, ENVIRONMENT, TEXEL0, 0, ENVIRONMENT, 0, 0, 0, 0,
// ENVIRONMENT);
// gDPSetScissor(gfx++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
// gDPSetTextureImageFB(gfx++, 0, 0, 0, fb);
// gDPImageRectangle(gfx++, OTRGetRectDimensionFromLeftEdge(0) << 2, 0 << 2, 0, 0,
// OTRGetRectDimensionFromRightEdge(SCREEN_WIDTH) << 2, SCREEN_HEIGHT << 2, OTRGetGameRenderWidth(),
// OTRGetGameRenderHeight(), G_TX_RENDERTILE, OTRGetGameRenderWidth(), OTRGetGameRenderHeight());
// *gfxp = gfx;
// }
// /**
// * Similar to FB_DrawFromFramebuffer, but scales the image relative to the center of the screen.
// * This function uses opcodes from f3dex2 but may be called when s2dex is loaded, such as during shrink window. Make
// * sure f3dex2 is loaded before this function is called.
// */
// void FB_DrawFromFramebufferScaled(Gfx** gfxp, s32 fb, u8 alpha, float scaleX, float scaleY) {
// Gfx* gfx = *gfxp;
// gDPSetEnvColor(gfx++, 255, 255, 255, alpha);
// gDPSetOtherMode(gfx++,
// G_AD_NOISE | G_CD_NOISE | G_CK_NONE | G_TC_FILT | G_TF_POINT | G_TT_NONE | G_TL_TILE | G_TD_CLAMP |
// G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
// G_AC_NONE | G_ZS_PRIM | G_RM_CLD_SURF | G_RM_CLD_SURF2);
// gDPSetCombineLERP(gfx++, TEXEL0, 0, ENVIRONMENT, 0, 0, 0, 0, ENVIRONMENT, TEXEL0, 0, ENVIRONMENT, 0, 0, 0, 0,
// ENVIRONMENT);
// gDPSetScissor(gfx++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
// gDPSetTextureImageFB(gfx++, 0, 0, 0, fb);
// float x0 = SCREEN_WIDTH * 0.5f * scaleX;
// float y0 = SCREEN_HEIGHT * 0.5f * scaleY;
// gDPImageRectangle(gfx++, OTRGetRectDimensionFromLeftEdge(x0) << 2, (int)(y0) << 2, 0, 0,
// OTRGetRectDimensionFromRightEdge((float)(SCREEN_WIDTH - x0)) << 2,
// (int)((float)(SCREEN_HEIGHT - y0)) << 2, OTRGetGameRenderWidth(), OTRGetGameRenderHeight(),
// G_TX_RENDERTILE, OTRGetGameRenderWidth(), OTRGetGameRenderHeight());
// *gfxp = gfx;
// }

View File

@ -0,0 +1,4 @@
// #include <libultraship.h>
// void FB_DrawFromFramebuffer(Gfx** gfxp, s32 fb, u8 alpha);
// void FB_DrawFromFramebufferScaled(Gfx** gfxp, s32 fb, u8 alpha, float scaleX, float scaleY);

View File

@ -1197,16 +1197,16 @@ void func_802B8614(Player *arg0) {
f64 temp_f4;
f64 temp_f6;
temp_f6 = (f64) arg0->boundingBoxCorners[1].cornerPos[0];
temp_f6 = (f64) arg0->tyres[FRONT_RIGHT].pos[0];
sp78 = temp_f6;
sp70 = (f64) arg0->boundingBoxCorners[1].cornerGroundY;
sp68 = (f64) arg0->boundingBoxCorners[1].cornerPos[2];
temp_f30 = (f64) arg0->boundingBoxCorners[0].cornerPos[0];
sp58 = (f64) arg0->boundingBoxCorners[0].cornerGroundY;
sp50 = (f64) arg0->boundingBoxCorners[0].cornerPos[2];
sp48 = (f64) arg0->boundingBoxCorners[3].cornerPos[0];
sp40 = (f64) arg0->boundingBoxCorners[3].cornerGroundY;
temp_f4 = (f64) arg0->boundingBoxCorners[3].cornerPos[2];
sp70 = (f64) arg0->tyres[FRONT_RIGHT].baseHeight;
sp68 = (f64) arg0->tyres[FRONT_RIGHT].pos[2];
temp_f30 = (f64) arg0->tyres[FRONT_LEFT].pos[0];
sp58 = (f64) arg0->tyres[FRONT_LEFT].baseHeight;
sp50 = (f64) arg0->tyres[FRONT_LEFT].pos[2];
sp48 = (f64) arg0->tyres[BACK_RIGHT].pos[0];
sp40 = (f64) arg0->tyres[BACK_RIGHT].baseHeight;
temp_f4 = (f64) arg0->tyres[BACK_RIGHT].pos[2];
temp_f2 = sp58 - sp70;
sp38 = temp_f4;
temp_f12 = temp_f4 - sp50;

View File

@ -17,6 +17,11 @@
#include <assets/mario_raceway_displaylists.h>
#include <assets/mario_raceway_vertices.h>
#include <assets/mario_raceway_data.h>
#include <assets/luigi_raceway_displaylists.h>
#include <assets/luigi_raceway_vertices.h>
#include <assets/luigi_raceway_data.h>
#include <assert.h>
#include <course_offsets.h>
@ -80,6 +85,11 @@ uintptr_t set_segment_base_addr(s32 segment, void *addr) {
return gSegmentTable[segment];
}
uintptr_t set_segment_base_addr_x64(s32 segment, void *addr) {
gSegmentTable[segment] = (uintptr_t) addr;
return gSegmentTable[segment];
}
/**
* @brief Returns the physical memory location of a segment.
* @param permits segment numbers from 0x0 to 0xF.
@ -104,13 +114,13 @@ void *segment_offset_to_virtual(uint32_t segment, uint32_t offset) {
}
void *segment_vtx_to_virtual(size_t offset) {
printf("seg_vtx_to_virt: 0x%llX to 0x%llX\n", offset, (gSegmentTable[0x04] + offset));
//printf("seg_vtx_to_virt: 0x%llX to 0x%llX\n", offset, (gSegmentTable[0x04] + offset));
return (void *) (gSegmentTable[0x04] + (offset));
}
void *segmented_texture_to_virtual(size_t offset) {
printf("seg_texture_to_virt: 0x%llX to 0x%llX\n", offset, (gSegmentTable[0x05] + offset));
//printf("seg_texture_to_virt: 0x%llX to 0x%llX\n", offset, (gSegmentTable[0x05] + offset));
return (void *) (gSegmentTable[0x05] + (offset));
}
@ -123,7 +133,7 @@ void *segmented_uintptr_t_to_virtual(uintptr_t addr) {
uint32_t numCommands = offset / 8;
offset = numCommands * sizeof(Gfx);
printf("seg_uintptr_t_to_virt: 0x%llX to 0x%llX\n", newAddr, (gSegmentTable[segment] + offset));
//printf("seg_uintptr_t_to_virt: 0x%llX to 0x%llX\n", newAddr, (gSegmentTable[segment] + offset));
return (void *) ((gSegmentTable[segment] + offset));
}
@ -135,7 +145,7 @@ void *segmented_gfx_to_virtual(const void *addr) {
uint32_t numCommands = offset / 8;
offset = numCommands * sizeof(Gfx);
printf("seg_gfx_to_virt: 0x%llX to 0x%llX\n", addr, (gSegmentTable[segment] + offset));
//printf("seg_gfx_to_virt: 0x%llX to 0x%llX\n", addr, (gSegmentTable[segment] + offset));
return (void *) ((gSegmentTable[segment] + offset));
}
@ -466,13 +476,13 @@ UNUSED u8 *func_802A841C(u8* arg0, s32 arg1, s32 arg2) {
return temp_v0;
}
u8 *dma_textures(u8 texture[], size_t arg1, size_t arg2) {
u8 *dma_textures(const char *texture, size_t arg1, size_t arg2) {
u8 *temp_v0;
void *temp_a0;
u8* tex = (u8 *) LOAD_ASSET(texture);
temp_v0 = (u8 *) gNextFreeMemoryAddress;
temp_v0 = (u8 *) allocate_memory(arg2); // gNextFreeMemoryAddress;
temp_a0 = temp_v0 + arg2;
arg1 = ALIGN16(arg1);
arg2 = ALIGN16(arg2);
@ -481,7 +491,7 @@ u8 *dma_textures(u8 texture[], size_t arg1, size_t arg2) {
// osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, (int) 1);
// mio0decode((u8 *) temp_a0, temp_v0);
memcpy(temp_v0, tex, arg2);
gNextFreeMemoryAddress += arg2;
//gNextFreeMemoryAddress += arg2;
return temp_v0;
}
@ -1416,20 +1426,126 @@ Gfx *testaaa;
* @brief Loads & DMAs course data. Vtx, textures, displaylists, etc.
* @param courseId
*/
typedef struct {
char* data;
char* vtx;
size_t vtxSize;
course_texture* textures;
char* displaylists;
size_t dlSize;
} NewCourseTable;
NewCourseTable gNewCourseTable[] = {
{
.data = d_course_mario_raceway_dl_0,
.vtx = d_course_mario_raceway_vertex,
.vtxSize = 5757,
.textures = mario_raceway_textures,
.displaylists = d_course_mario_raceway_packed_dls,
.dlSize = 3367
}, {
.data = NULL,
.vtx = NULL,
.vtxSize = 0,
.textures = NULL,
.displaylists = NULL,
.dlSize = 0
}, {
.data = NULL,
.vtx = NULL,
.vtxSize = 0,
.textures = NULL,
.displaylists = NULL,
.dlSize = 0
}, {
.data = NULL,
.vtx = NULL,
.vtxSize = 0,
.textures = NULL,
.displaylists = NULL,
.dlSize = 0
}, {
.data = NULL,
.vtx = NULL,
.vtxSize = 0,
.textures = NULL,
.displaylists = NULL,
.dlSize = 0
}, {
.data = NULL,
.vtx = NULL,
.vtxSize = 0,
.textures = NULL,
.displaylists = NULL,
.dlSize = 0
}, {
.data = NULL,
.vtx = NULL,
.vtxSize = 0,
.textures = NULL,
.displaylists = NULL,
.dlSize = 0
}, {
.data = NULL,
.vtx = NULL,
.vtxSize = 0,
.textures = NULL,
.displaylists = NULL,
.dlSize = 0
}, {
.data = d_course_luigi_raceway_dl_0,
.vtx = d_course_luigi_raceway_vertex,
.vtxSize = 5936,
.textures = luigi_raceway_textures,
.displaylists = d_course_luigi_raceway_packed_dls,
.dlSize = 6377
}
};
/** Load Lakitu Textures **/
u8 *load_lakitu_textures_x64(const char** textureList, size_t length) {
// Calculate lakitu texture size to allocate
size_t size = 0;
for (size_t i = 0; i < length; i++) {
size += ResourceGetTexSizeByName(textureList[i]);
}
u8 *textures = (u8 *) gNextFreeMemoryAddress;
gNextFreeMemoryAddress += size;
size_t offset = 0;
for (size_t i = 0; i < length; i++) {
u8 *tex = (u8 *) LOAD_ASSET(textureList[i]);
size_t texSize = ResourceGetTexSizeByName(textureList[i]);
memcpy(&textures[offset], tex, texSize);
offset += texSize;
}
return textures;
}
void load_luigi_raceway(void);
void load_course(s32 courseId) {
printf("Loading Course Data\n");
testaaa = (Gfx *) LOAD_ASSET(d_course_mario_raceway_dl_0);
char* data = gNewCourseTable[courseId].data;
char* vtxData = gNewCourseTable[courseId].vtx;
size_t vtxSize = gNewCourseTable[courseId].vtxSize;
course_texture *textures = gNewCourseTable[courseId].textures;
char* displaylists = gNewCourseTable[courseId].displaylists;
size_t dlSize = gNewCourseTable[courseId].dlSize;
testaaa = (Gfx *) LOAD_ASSET(data);
// Convert course vtx to vtx
CourseVtx *cvtx = (CourseVtx *) LOAD_ASSET(d_course_mario_raceway_vertex);
Vtx *vtx = (Vtx *) allocate_memory(sizeof(Vtx) * 5757);
CourseVtx *cvtx = (CourseVtx *) LOAD_ASSET(vtxData);
Vtx *vtx = (Vtx *) allocate_memory(sizeof(Vtx) * vtxSize);
gSegmentTable[4] = &vtx[0];
func_802A86A8(cvtx, vtx, 5757);
vtxSegEnd = &vtx[5757];
func_802A86A8(cvtx, vtx, vtxSize);
vtxSegEnd = &vtx[vtxSize];
// Load and allocate memory for course textures
course_texture *asset = mario_raceway_textures;
course_texture *asset = textures;
u8 *freeMemory = NULL;
u8 *texture = NULL;
size_t size = 0;
@ -1440,7 +1556,7 @@ void load_course(s32 courseId) {
texture = (u8 *) LOAD_ASSET(asset->addr);
if (texture) {
if (asset == &mario_raceway_textures[0]) {
if (asset == &textures[0]) {
gSegmentTable[5] = &freeMemory[0];
}
memcpy(freeMemory, texture, size);
@ -1453,11 +1569,11 @@ void load_course(s32 courseId) {
texSegEnd = &((u8 *)gSegmentTable[5])[texSegSize];
// Extract packed DLs
u8 *packed = (u8 *) LOAD_ASSET(d_course_mario_raceway_packed_dls);
Gfx *gfx = (Gfx *) allocate_memory(sizeof(Gfx) * 3367); // Size of unpacked DLs
u8 *packed = (u8 *) LOAD_ASSET(displaylists);
Gfx *gfx = (Gfx *) allocate_memory(sizeof(Gfx) * dlSize); // Size of unpacked DLs
gSegmentTable[7] = &gfx[0];
displaylist_unpack(gfx, packed, 0);
dlSegEnd = &gfx[3367];
dlSegEnd = &gfx[dlSize];
}

View File

@ -41,6 +41,7 @@ struct AllocOnlyPool {
extern f32 vtxStretchY;
u8 *load_lakitu_textures_x64(const char** textureList, size_t length);
void *get_next_available_memory_addr(uintptr_t);
uintptr_t set_segment_base_addr(s32, void*);
void *get_segment_base_addr(s32);
@ -69,7 +70,7 @@ void func_802A81EC(void);
struct AllocOnlyPool *alloc_only_pool_init(uintptr_t, uintptr_t);
uintptr_t func_802A82AC(s32);
uintptr_t func_802A8348(s32, s32, s32);
u8 *dma_textures(u8*, size_t, size_t);
u8 *dma_textures(const char*, size_t, size_t);
uintptr_t MIO0_0F(u8*, uintptr_t, uintptr_t);
void func_802A8844(void);
void unpack_lights(Gfx*, u8*, s8);

View File

@ -504,7 +504,7 @@ f32 func_8028EE8C(s32 arg0) {
f32 temp_v1 = gPlayers[arg0].copy_rotation_z;
f32 temp_f14 = D_8015F8D0[2] - temp_v0;
f32 temp_f16 = temp_v1 - D_8015F8D0[2];
return gCourseTimer - ((0.01666666f * temp_f14) / (temp_f14 + temp_f16));
return gCourseTimer - ((COURSE_TIMER_ITER * temp_f14) / (temp_f14 + temp_f16));
}
void func_8028EEF0(s32 i) {

View File

@ -21,6 +21,8 @@
#include "courses/all_course_offsets.h"
#include <assets/mario_raceway_data.h>
#include <assets/mario_raceway_displaylists.h>
#include <assets/luigi_raceway_data.h>
#include <assets/luigi_raceway_displaylists.h>
s16 D_802B87B0 = 995;
s16 D_802B87B4 = 1000;
@ -35,13 +37,13 @@ s16 D_802B87D4 = 0;
s16 currentScreenSection = 0;
s32 func_80290C20(Camera *camera) {
if (camera->unk_54.unk34 == 0) {
if (camera->collision.unk34 == 0) {
return 1;
}
if ((camera->unk_54.unk30 == 1) && (camera->unk_54.unk3C[0] < 3.0f)) {
if ((camera->collision.unk30 == 1) && (camera->collision.surfaceDistance[0] < 3.0f)) {
return 1;
}
if ((camera->unk_54.unk32 == 1) && (camera->unk_54.unk3C[1] < 3.0f)) {
if ((camera->collision.unk32 == 1) && (camera->collision.surfaceDistance[1] < 3.0f)) {
return 1;
}
return 0;
@ -60,7 +62,7 @@ void parse_course_displaylists(TrackSectionsI *addr) {
section->sectionId = addr->sectionId;
section->surfaceType = addr->surfaceType;
printf("SECTION ADDR: 0x%X\n", section->addr);
//printf("SECTION ADDR: 0x%X\n", section->addr);
section++;
addr++;
}
@ -85,18 +87,18 @@ void parse_course_displaylists(TrackSectionsI *addr) {
} else {
D_8015F5A4 = 0;
}
find_and_set_vertex_data(section->addr, section->surfaceType, section->sectionId);
generate_collision_mesh(section->addr, section->surfaceType, section->sectionId);
section++;
}
}
extern u32 isFlycam;
void load_surface_map(const char* addr[], struct UnkStruct_800DC5EC *arg1) {
void render_course_segments(const char* addr[], struct UnkStruct_800DC5EC *arg1) {
Player *player = arg1->player;
Camera *camera = arg1->camera;
s16 var_a3;
s16 temp_v1;
s16 index;
s16 sp1E;
s16 temp_v0_3;
u16 rot;
@ -133,72 +135,71 @@ void load_surface_map(const char* addr[], struct UnkStruct_800DC5EC *arg1) {
arg1->playerDirection = var_a3;
if (D_80152300[camera - camera1] == 1) {
printf("LOGIC\n");
sp1E = func_802ABD40(camera->unk_54.unk3A);
temp_v0_3 = func_802ABD40(player->unk_110.unk3A);
temp_v1 = sp1E - temp_v0_3;
if ((temp_v1 < 2) && (temp_v1 >= -1)) {
sp1E = get_section_id(camera->collision.meshIndexZX);
temp_v0_3 = get_section_id(player->collision.meshIndexZX);
index = sp1E - temp_v0_3;
if ((index < 2) && (index >= -1)) {
if (sp1E == 255) {
if (temp_v0_3 == 255) {
temp_v1 = arg1->pathCounter;
} else if (player->unk_110.unk3C[2] > 30.0f) {
temp_v1 = arg1->pathCounter;
index = arg1->pathCounter;
} else if (player->collision.surfaceDistance[2] > 30.0f) {
index = arg1->pathCounter;
} else {
temp_v1 = temp_v0_3;
index = temp_v0_3;
}
} else if (camera->unk_54.unk3C[2] > 30.0f) {
temp_v1 = arg1->pathCounter;
} else if (camera->collision.surfaceDistance[2] > 30.0f) {
index = arg1->pathCounter;
} else {
temp_v1 = sp1E;
index = sp1E;
}
} else {
switch(gCurrentCourseId) {
case COURSE_BOWSER_CASTLE:
if ((temp_v0_3 >= 0x11) && (temp_v0_3 < 0x18)) {
temp_v1 = temp_v0_3;
index = temp_v0_3;
} else if ((temp_v0_3 == 255) && (sp1E != 255)) {
temp_v1 = sp1E;
index = sp1E;
} else if ((temp_v0_3 != 255) && (sp1E == 255)) {
temp_v1 = temp_v0_3;
index = temp_v0_3;
} else {
temp_v1 = arg1->pathCounter;
index = arg1->pathCounter;
}
break;
case COURSE_CHOCO_MOUNTAIN:
if ((temp_v0_3 >= 0xE) && (temp_v0_3 < 0x16)) {
temp_v1 = temp_v0_3;
index = temp_v0_3;
} else if ((temp_v0_3 == 255) && (sp1E != 255)) {
temp_v1 = sp1E;
index = sp1E;
} else if ((temp_v0_3 != 255) && (sp1E == 255)) {
temp_v1 = temp_v0_3;
index = temp_v0_3;
} else {
temp_v1 = arg1->pathCounter;
index = arg1->pathCounter;
}
break;
default:
if (temp_v0_3 == 255) {
temp_v1 = arg1->pathCounter;
} else if (player->unk_110.unk3C[2] > 30.0f) {
temp_v1 = arg1->pathCounter;
index = arg1->pathCounter;
} else if (player->collision.surfaceDistance[2] > 30.0f) {
index = arg1->pathCounter;
} else {
temp_v1 = temp_v0_3;
index = temp_v0_3;
}
break;
}
}
} else {
temp_v1 = func_802ABD40(camera->unk_54.unk3A);
if (camera->unk_54.unk3C[2] > 30.0f) {
temp_v1 = arg1->pathCounter;
} else if (temp_v1 == 255) {
temp_v1 = arg1->pathCounter;
index = get_section_id(camera->collision.meshIndexZX);
if (camera->collision.surfaceDistance[2] > 30.0f) {
index = arg1->pathCounter;
} else if (index == 255) {
index = arg1->pathCounter;
}
}
arg1->pathCounter = temp_v1;
temp_v1 = ((temp_v1 - 1) * 4) + var_a3;
gSPDisplayList(gDisplayListHead++, addr[temp_v1]);
arg1->pathCounter = index;
index = ((index - 1) * 4) + var_a3;
gSPDisplayList(gDisplayListHead++, addr[index]);
}
void func_80291198(void) {
@ -304,7 +305,7 @@ void func_8029122C(struct UnkStruct_800DC5EC *arg0, s32 playerId) {
gDPSetBlendMask(gDisplayListHead++, 0xFF);
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA);
gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK);
load_surface_map((uintptr_t)d_course_koopa_troopa_beach_dl_list2, arg0);
render_course_segments((uintptr_t)d_course_koopa_troopa_beach_dl_list2, arg0);
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 1, 1, G_OFF);
gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK);
gDPSetAlphaCompare(gDisplayListHead++, G_AC_NONE);
@ -322,7 +323,7 @@ void func_8029122C(struct UnkStruct_800DC5EC *arg0, s32 playerId) {
mtxf_identity(matrix);
render_set_position(matrix, 0);
load_surface_map((uintptr_t) sherbet_land_dls_2, arg0);
render_course_segments((uintptr_t) sherbet_land_dls_2, arg0);
gDPSetAlphaCompare(gDisplayListHead++, G_AC_NONE);
if ((func_80290C20(arg0->camera) == 1) && (func_802AAB4C(player) < player->pos[1])) {
@ -339,7 +340,7 @@ void func_8029122C(struct UnkStruct_800DC5EC *arg0, s32 playerId) {
mtxf_identity(matrix);
render_set_position(matrix, 0);
gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK);
load_surface_map((uintptr_t) &d_course_rainbow_road_dl_list, arg0);
render_course_segments((uintptr_t) &d_course_rainbow_road_dl_list, arg0);
gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK);
gDPSetAlphaCompare(gDisplayListHead++, G_AC_NONE);
gDPPipeSync(gDisplayListHead++);
@ -624,9 +625,9 @@ void render_mario_raceway(struct UnkStruct_800DC5EC *arg0) {
gSPDisplayList(gDisplayListHead++, ((uintptr_t) segmented_gfx_to_virtual(0x07003240)));
// d_course_mario_raceway_packed_dl_14A0
gSPDisplayList(gDisplayListHead++, ((uintptr_t) segmented_gfx_to_virtual(0x070014A0)));
printf("LOADING SURFACE MAP\n");
load_surface_map(mario_raceway_dls, arg0);
printf("SURFACE MAP LOADED\n");
//printf("LOADING SURFACE MAP\n");
render_course_segments(mario_raceway_dls, arg0);
//printf("SURFACE MAP LOADED\n");
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_TEX_EDGE, G_RM_AA_ZB_TEX_EDGE2);
gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK);
@ -639,7 +640,7 @@ void render_mario_raceway(struct UnkStruct_800DC5EC *arg0) {
gSPDisplayList(gDisplayListHead++, ((uintptr_t) segmented_gfx_to_virtual(0x070000E0)));
// d_course_mario_raceway_packed_dl_160
gSPDisplayList(gDisplayListHead++, ((uintptr_t) segmented_gfx_to_virtual(0x07000160)));
printf("RENDERED COURSE\n");
//printf("RENDERED COURSE\n");
}
void render_choco_mountain(struct UnkStruct_800DC5EC *arg0) {
@ -674,7 +675,7 @@ void render_choco_mountain(struct UnkStruct_800DC5EC *arg0) {
gSPDisplayList(gDisplayListHead++, ((uintptr_t)0x07005868));
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
load_surface_map((uintptr_t) choco_mountain_dls, arg0);
render_course_segments((uintptr_t) choco_mountain_dls, arg0);
gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK);
gDPSetRenderMode(gDisplayListHead++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_TEX_EDGE2);
@ -712,7 +713,7 @@ void render_bowsers_castle(struct UnkStruct_800DC5EC *arg0) {
if (D_802B87BC > 255) {
D_802B87BC = 0;
}
load_surface_map((uintptr_t) bowsers_castle_dls, arg0);
render_course_segments((uintptr_t) bowsers_castle_dls, arg0);
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_TEX_EDGE, G_RM_AA_ZB_TEX_EDGE2);
@ -751,7 +752,7 @@ void render_banshee_boardwalk(struct UnkStruct_800DC5EC *arg0) {
// d_course_banshee_boardwalk_packed_dl_69B0
gSPDisplayList(gDisplayListHead++, ((uintptr_t)0x070069B0));
load_surface_map((uintptr_t) banshee_boardwalk_dls, arg0);
render_course_segments((uintptr_t) banshee_boardwalk_dls, arg0);
gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK);
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA);
@ -785,7 +786,7 @@ void render_yoshi_valley(struct UnkStruct_800DC5EC *arg0) {
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEI, G_CC_MODULATEI);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
load_surface_map((uintptr_t) d_course_yoshi_valley_dl_list, arg0);
render_course_segments((uintptr_t) d_course_yoshi_valley_dl_list, arg0);
gDPPipeSync(gDisplayListHead++);
}
@ -804,7 +805,7 @@ void render_frappe_snowland(struct UnkStruct_800DC5EC *arg0) {
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
load_surface_map((uintptr_t) d_course_frappe_snowland_dl_list, arg0);
render_course_segments((uintptr_t) d_course_frappe_snowland_dl_list, arg0);
}
void render_koopa_troopa_beach(struct UnkStruct_800DC5EC *arg0) {
@ -824,7 +825,7 @@ void render_koopa_troopa_beach(struct UnkStruct_800DC5EC *arg0) {
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
// d_course_koopa_troopa_beach_packed_dl_9688
gSPDisplayList(gDisplayListHead++, ((uintptr_t)0x07009688));
load_surface_map((uintptr_t) d_course_koopa_troopa_beach_dl_list1, arg0);
render_course_segments((uintptr_t) d_course_koopa_troopa_beach_dl_list1, arg0);
gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK);
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_TEX_EDGE, G_RM_AA_ZB_TEX_EDGE2);
@ -852,7 +853,7 @@ void render_royal_raceway(struct UnkStruct_800DC5EC *arg0) {
// d_course_royal_raceway_packed_dl_A648
gSPDisplayList(gDisplayListHead++, ((uintptr_t)0x0700A648));
load_surface_map((uintptr_t) royal_raceway_dls, arg0);
render_course_segments((uintptr_t) royal_raceway_dls, arg0);
// d_course_royal_raceway_packed_dl_11A8
gSPDisplayList(gDisplayListHead++, ((uintptr_t)0x070011A8));
@ -878,20 +879,20 @@ void render_luigi_raceway(struct UnkStruct_800DC5EC *arg0) {
gDPSetCombineMode(gDisplayListHead++, G_CC_SHADE, G_CC_SHADE);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
// d_course_luigi_raceway_packed_dl_9EC0
gSPDisplayList(gDisplayListHead++, ((uintptr_t)0x07009EC0));
gSPDisplayList(gDisplayListHead++, ((uintptr_t)segmented_gfx_to_virtual(0x07009EC0)));
}
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
load_surface_map((uintptr_t) luigi_raceway_dls, arg0);
render_course_segments(luigi_raceway_dls, arg0);
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_TEX_EDGE, G_RM_AA_ZB_TEX_EDGE2);
// d_course_luigi_raceway_packed_dl_E0
gSPDisplayList(gDisplayListHead++, ((uintptr_t)0x070000E0));
gSPDisplayList(gDisplayListHead++, ((uintptr_t)segmented_gfx_to_virtual(0x070000E0)));
// d_course_luigi_raceway_packed_dl_68
gSPDisplayList(gDisplayListHead++, ((uintptr_t)0x07000068));
gSPDisplayList(gDisplayListHead++, ((uintptr_t)segmented_gfx_to_virtual(0x07000068)));
D_800DC5DC = 88;
D_800DC5E0 = 72;
@ -955,7 +956,7 @@ void render_moo_moo_farm(struct UnkStruct_800DC5EC *arg0) {
gSPDisplayList(gDisplayListHead++, ((uintptr_t)0x07005640));
gSPFogPosition(gDisplayListHead++, D_802B87B0, D_802B87B4);
load_surface_map((uintptr_t) moo_moo_farm_dls, arg0);
render_course_segments((uintptr_t) moo_moo_farm_dls, arg0);
if ((temp_s0 < 14) && (temp_s0 > 10)) {
if ((temp_s1 == 2) || (temp_s1 == 3) || (temp_s1 == 1))
@ -1022,7 +1023,7 @@ void render_toads_turnpike(struct UnkStruct_800DC5EC *arg0) {
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEI, G_CC_PASS2);
gDPSetRenderMode(gDisplayListHead++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_SURF2);
load_surface_map((uintptr_t) d_course_toads_turnpike_dl_list, arg0);
render_course_segments((uintptr_t) d_course_toads_turnpike_dl_list, arg0);
gDPSetRenderMode(gDisplayListHead++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_TEX_EDGE2);
gDPSetCombineMode(gDisplayListHead++, G_CC_DECALRGBA, G_CC_PASS2);
@ -1053,7 +1054,7 @@ void render_kalimari_desert(struct UnkStruct_800DC5EC *arg0) {
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEI, G_CC_MODULATEI);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
load_surface_map((uintptr_t) kalimari_desert_dls, arg0);
render_course_segments((uintptr_t) kalimari_desert_dls, arg0);
// d_course_kalimari_desert_packed_dl_1ED8
gSPDisplayList(gDisplayListHead++, ((uintptr_t)0x07001ED8));
// d_course_kalimari_desert_packed_dl_1B18
@ -1077,7 +1078,7 @@ void render_sherbet_land(struct UnkStruct_800DC5EC *arg0) {
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEI, G_CC_MODULATEI);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
load_surface_map((uintptr_t) sherbet_land_dls, arg0);
render_course_segments((uintptr_t) sherbet_land_dls, arg0);
}
void render_rainbow_road(UNUSED struct UnkStruct_800DC5EC *arg0) {
@ -1107,7 +1108,7 @@ void render_wario_stadium(struct UnkStruct_800DC5EC *arg0) {
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATERGBA, G_CC_MODULATERGBA);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
load_surface_map((uintptr_t) wario_stadium_dls, arg0);
render_course_segments((uintptr_t) wario_stadium_dls, arg0);
// d_course_wario_stadium_packed_dl_A228
gSPDisplayList(gDisplayListHead++, ((uintptr_t)0x0700A228));
@ -1220,7 +1221,7 @@ void render_dks_jungle_parkway(struct UnkStruct_800DC5EC *arg0) {
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_TEX_EDGE, G_RM_AA_ZB_TEX_EDGE2);
load_surface_map((uintptr_t) d_course_dks_jungle_parkway_unknown_dl_list, arg0);
render_course_segments((uintptr_t) d_course_dks_jungle_parkway_unknown_dl_list, arg0);
gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK);
}
@ -1388,27 +1389,29 @@ void render_course(struct UnkStruct_800DC5EC *arg0) {
void func_80295BF8(s32 playerIndex) {
Player* player = &gPlayers[playerIndex];
func_802AAAAC(&player->unk_110);
player->boundingBoxCorners[FRONT_RIGHT_TYRE].surfaceFlags = 0;
player->boundingBoxCorners[FRONT_LEFT_TYRE].surfaceFlags = 0;
player->boundingBoxCorners[BACK_RIGHT_TYRE].surfaceFlags = 0;
player->boundingBoxCorners[BACK_LEFT_TYRE].surfaceFlags = 0;
func_802AAAAC(&player->collision);
player->tyres[FRONT_RIGHT].surfaceFlags = 0;
player->tyres[FRONT_LEFT].surfaceFlags = 0;
player->tyres[BACK_RIGHT].surfaceFlags = 0;
player->tyres[BACK_LEFT].surfaceFlags = 0;
player->boundingBoxCorners[FRONT_RIGHT_TYRE].surfaceMapIndex = 0x1388;
player->boundingBoxCorners[FRONT_LEFT_TYRE].surfaceMapIndex = 0x1388;
player->boundingBoxCorners[BACK_RIGHT_TYRE].surfaceMapIndex = 0x1388;
player->boundingBoxCorners[BACK_LEFT_TYRE].surfaceMapIndex = 0x1388;
player->tyres[FRONT_RIGHT].collisionMeshIndex = 0x1388;
player->tyres[FRONT_LEFT].collisionMeshIndex = 0x1388;
player->tyres[BACK_RIGHT].collisionMeshIndex = 0x1388;
player->tyres[BACK_LEFT].collisionMeshIndex = 0x1388;
}
void func_80295C6C(void) {
gNextFreeMemoryAddress += ALIGN16(D_8015F588 * sizeof(mk64_surface_map_ram));
gNextFreeMemoryAddress += ALIGN16(gCollisionMeshCount * sizeof(CollisionTriangle));
gCourseMaxX += 20;
gCourseMaxZ += 20;
gCourseMinX += -20;
gCourseMinZ += -20;
gCourseMinY += -20;
func_802AF314();
gNextFreeMemoryAddress += ALIGN16(D_8015F58A * 2);
gCollisionIndices = (u16 *) gNextFreeMemoryAddress;
generate_collision_grid();
gNextFreeMemoryAddress += ALIGN16(gNumCollisionTriangles * sizeof(u16));
}
UNUSED void func_80295D50(s16 arg0, s16 arg1) {
@ -1436,20 +1439,20 @@ void func_80295D88(void) {
D_8015F5A0 = 0;
func_80295D6C();
D_8015F58C = 0;
D_8015F588 = 0;
gSurfaceMap = (mk64_surface_map_ram *) gNextFreeMemoryAddress;
gCollisionMeshCount = 0;
gCollisionMesh = (CollisionTriangle *) gNextFreeMemoryAddress;
D_800DC5BC = 0;
D_800DC5C8 = 0;
switch (gCurrentCourseId) {
case COURSE_MARIO_RACEWAY:
// d_course_mario_raceway_packed_dl_1140
set_vertex_data_with_defaults((Gfx *) segmented_gfx_to_virtual(0x07001140));
generate_collision_mesh_with_defaults((Gfx *) segmented_gfx_to_virtual(0x07001140));
if (gScreenModeSelection == SCREEN_MODE_1P) {
// d_course_mario_raceway_packed_dl_8E8
set_vertex_data_with_defaults((Gfx *) segmented_gfx_to_virtual(0x070008E8));
generate_collision_mesh_with_defaults((Gfx *) segmented_gfx_to_virtual(0x070008E8));
} else {
// d_course_mario_raceway_packed_dl_2D68
set_vertex_data_with_defaults((Gfx *) segmented_gfx_to_virtual(0x07002D68));
generate_collision_mesh_with_defaults((Gfx *) segmented_gfx_to_virtual(0x07002D68));
}
TrackSectionsI *section = (TrackSectionsI *) LOAD_ASSET(d_course_mario_raceway_addr);
@ -1527,7 +1530,8 @@ void func_80295D88(void) {
D_8015F8E4 = -60.0f;
break;
case COURSE_LUIGI_RACEWAY:
parse_course_displaylists((uintptr_t) d_course_luigi_raceway_addr);
TrackSectionsI *section8 = (TrackSectionsI *) LOAD_ASSET(d_course_luigi_raceway_addr);
parse_course_displaylists(section8);
func_80295C6C();
D_8015F8E4 = gCourseMinY - 10.0f;
break;
@ -1599,22 +1603,22 @@ void func_80295D88(void) {
break;
case COURSE_BLOCK_FORT:
// d_course_block_fort_packed_dl_15C0
set_vertex_data_with_default_section_id((Gfx *)0x070015C0, 1);
generate_collision_mesh_with_default_section_id((Gfx *)0x070015C0, 1);
func_80295C6C();
D_8015F8E4 = gCourseMinY - 10.0f;
break;
case COURSE_SKYSCRAPER:
// d_course_skyscraper_packed_dl_1110
set_vertex_data_with_default_section_id((Gfx *)0x07001110, 1);
generate_collision_mesh_with_default_section_id((Gfx *)0x07001110, 1);
// d_course_skyscraper_packed_dl_258
set_vertex_data_with_default_section_id((Gfx *)0x07000258, 1);
generate_collision_mesh_with_default_section_id((Gfx *)0x07000258, 1);
func_80295C6C();
D_8015F8E4 = -480.0f;
break;
case COURSE_DOUBLE_DECK:
// d_course_double_deck_packed_dl_738
set_vertex_data_with_default_section_id((Gfx *)0x07000738, 1);
generate_collision_mesh_with_default_section_id((Gfx *)0x07000738, 1);
func_80295C6C();
D_8015F8E4 = gCourseMinY - 10.0f;
break;
@ -1627,15 +1631,15 @@ void func_80295D88(void) {
break;
case COURSE_BIG_DONUT:
// d_course_big_donut_packed_dl_1018
set_vertex_data_with_default_section_id((Gfx *)0x07001018, 6);
generate_collision_mesh_with_default_section_id((Gfx *)0x07001018, 6);
// d_course_big_donut_packed_dl_450
set_vertex_data_with_default_section_id((Gfx *)0x07000450, 6);
generate_collision_mesh_with_default_section_id((Gfx *)0x07000450, 6);
// d_course_big_donut_packed_dl_AC0
set_vertex_data_with_default_section_id((Gfx *)0x07000AC0, 6);
generate_collision_mesh_with_default_section_id((Gfx *)0x07000AC0, 6);
// d_course_big_donut_packed_dl_B58
set_vertex_data_with_default_section_id((Gfx *)0x07000B58, 6);
generate_collision_mesh_with_default_section_id((Gfx *)0x07000B58, 6);
// d_course_big_donut_packed_dl_230
set_vertex_data_with_default_section_id((Gfx *)0x07000230, 6);
generate_collision_mesh_with_default_section_id((Gfx *)0x07000230, 6);
func_80295C6C();
D_8015F8E4 = 100.0f;
break;

View File

@ -14,7 +14,7 @@ typedef struct {
void func_8029122C(struct UnkStruct_800DC5EC*, s32);
s32 func_80290C20(Camera*);
void parse_course_displaylists(TrackSectionsI*);
void load_surface_map(const char*[], struct UnkStruct_800DC5EC*);
void render_course_segments(const char*[], struct UnkStruct_800DC5EC*);
void func_80291198(void);
void func_802911C4(void);
void render_mario_raceway(struct UnkStruct_800DC5EC*);
@ -57,6 +57,6 @@ extern Lights1 D_800DC610[];
extern Lights1 D_800DC610[]; // Light data?
extern u16 D_8015F58A;
extern u16 gNumCollisionTriangles;
#endif

View File

@ -37,6 +37,7 @@
#include <vehicles.h>
#include "data/some_data.h"
#include <assets/some_data.h>
#include <assets/luigi_raceway_data.h>
void func_800431B0(Vec3f pos, Vec3su orientation, f32 scale, Vtx *vtx) {
rsp_set_matrix_transformation(pos, orientation, scale);
@ -229,14 +230,14 @@ void func_80044924(u8 *texture, s32 width, s32 height) {
// See comment above the `gDPLoadBlock` macro
//gDPLoadTextureBlock_4b(gDisplayListHead++, texture, G_IM_FMT_I, width, height, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
// gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_IA, G_IM_SIZ_16b, 1, texture);
// gDPSetTile(gDisplayListHead++, G_IM_FMT_IA, G_IM_SIZ_16b, 0, G_TX_RENDERTILE, G_TX_LOADTILE, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOLOD);
// gDPLoadSync(gDisplayListHead++);
// // The last argument to this macro really should be `CALC_DXT_4b(width)` but that creates a massive diff
// gDPLoadBlock(gDisplayListHead++, G_TX_LOADTILE, 0, 0, (((width * height) + 3) >> 2) - 1, ((width / 16) + 2047) / (width / 16));
// gDPPipeSync(gDisplayListHead++);
// gDPSetTile(gDisplayListHead++, G_IM_FMT_IA, G_IM_SIZ_4b, (((width >> 1) + 7) >> 3), G_TX_RENDERTILE, G_TX_RENDERTILE, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOLOD);
// gDPSetTileSize(gDisplayListHead++, G_TX_RENDERTILE, 0, 0, (width-1) << G_TEXTURE_IMAGE_FRAC, (height-1) << G_TEXTURE_IMAGE_FRAC);
gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_IA, G_IM_SIZ_16b, 1, texture);
gDPSetTile(gDisplayListHead++, G_IM_FMT_IA, G_IM_SIZ_16b, 0, G_TX_RENDERTILE, G_TX_LOADTILE, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOLOD);
gDPLoadSync(gDisplayListHead++);
// The last argument to this macro really should be `CALC_DXT_4b(width)` but that creates a massive diff
gDPLoadBlock(gDisplayListHead++, G_TX_LOADTILE, 0, 0, (((width * height) + 3) >> 2) - 1, ((width / 16) + 2047) / (width / 16));
gDPPipeSync(gDisplayListHead++);
gDPSetTile(gDisplayListHead++, G_IM_FMT_IA, G_IM_SIZ_4b, (((width >> 1) + 7) >> 3), G_TX_RENDERTILE, G_TX_RENDERTILE, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOLOD);
gDPSetTileSize(gDisplayListHead++, G_TX_RENDERTILE, 0, 0, (width-1) << G_TEXTURE_IMAGE_FRAC, (height-1) << G_TEXTURE_IMAGE_FRAC);
}
UNUSED void func_80044AB8(u8 *texture, s32 width, s32 height) {
@ -574,11 +575,13 @@ UNUSED void func_80046D40(Vec3f arg0, Vec3su arg1, f32 arg2, u8 *texture) {
}
UNUSED void func_80046D90(s32 arg0, s32 arg1, u16 arg2, f32 arg3, u8 *texture) {
func_800464D0(arg0, arg1, arg2, arg3, texture, common_vtx_hedgehog, 64, 64, 64, 32);
Vtx *vtx = (Vtx *) LOAD_ASSET(common_vtx_hedgehog);
func_800464D0(arg0, arg1, arg2, arg3, texture, vtx, 64, 64, 64, 32);
}
UNUSED void func_80046DF4(s32 arg0, s32 arg1, u16 arg2, f32 arg3, s32 arg4, u8 *texture) {
func_800465B8(arg0, arg1, arg2, arg3, arg4, texture, common_vtx_hedgehog, 64, 64, 64, 32);
Vtx *vtx = (Vtx *) LOAD_ASSET(common_vtx_hedgehog);
func_800465B8(arg0, arg1, arg2, arg3, arg4, texture, vtx, 64, 64, 64, 32);
}
void load_texture_and_tlut(u8 *tlut, u8 *texture, s32 width, s32 height) {
@ -1197,7 +1200,7 @@ UNUSED void func_8004A5E4(Vec3f arg0, Vec3su arg1, f32 arg2, u8 *texture, Vtx *a
void func_8004A630(Collision *arg0, Vec3f arg1, f32 arg2) {
if (func_80041924(arg0, arg1) != 0) {
D_80183E50[0] = arg1[0];
D_80183E50[1] = func_802ABE30(arg1[0], 0.0f, arg1[2], arg0->unk3A) + 0.8;
D_80183E50[1] = calculate_surface_height(arg1[0], 0.0f, arg1[2], arg0->meshIndexZX) + 0.8;
D_80183E50[2] = arg1[2];
rsp_set_matrix_transl_rot_scale(D_80183E50, arg0->orientationVector, arg2);
gSPDisplayList(gDisplayListHead++, D_0D007B98);
@ -1205,26 +1208,26 @@ void func_8004A630(Collision *arg0, Vec3f arg1, f32 arg2) {
}
void func_8004A6EC(s32 objectIndex, f32 scale) {
Objects *temp_v0;
Object *object;
if ((is_obj_flag_status_active(objectIndex, 0x00000020) != 0) && (is_obj_flag_status_active(objectIndex, 0x00800000) != 0)) {
temp_v0 = &gObjectList[objectIndex];
D_80183E50[0] = temp_v0->pos[0];
D_80183E50[1] = temp_v0->unk_044 + 0.8;
D_80183E50[2] = temp_v0->pos[2];
rsp_set_matrix_transformation(D_80183E50, temp_v0->unk_0B8, scale);
object = &gObjectList[objectIndex];
D_80183E50[0] = object->pos[0];
D_80183E50[1] = object->surfaceHeight + 0.8;
D_80183E50[2] = object->pos[2];
rsp_set_matrix_transformation(D_80183E50, object->unk_0B8, scale);
gSPDisplayList(gDisplayListHead++, D_0D007B20);
}
}
void func_8004A7AC(s32 objectIndex, f32 arg1) {
Objects *temp_v0;
Object *object;
if (is_obj_flag_status_active(objectIndex, 0x00000020) != 0) {
temp_v0 = &gObjectList[objectIndex];
D_80183E50[0] = temp_v0->pos[0];
D_80183E50[1] = temp_v0->unk_044 + 0.8;
D_80183E50[2] = temp_v0->pos[2];
object = &gObjectList[objectIndex];
D_80183E50[0] = object->pos[0];
D_80183E50[1] = object->surfaceHeight + 0.8;
D_80183E50[2] = object->pos[2];
D_80183E98[0] = 0x4000;
D_80183E98[1] = 0;
D_80183E98[2] = 0;
@ -1235,14 +1238,14 @@ void func_8004A7AC(s32 objectIndex, f32 arg1) {
void func_8004A870(s32 objectIndex, f32 arg1) {
Mat4 sp30;
Objects *temp_v0;
Object *object;
if ((is_obj_flag_status_active(objectIndex, 0x00000020) != 0) && (is_obj_flag_status_active(objectIndex, 0x00800000) != 0)) {
temp_v0 = &gObjectList[objectIndex];
D_80183E50[0] = temp_v0->pos[0];
D_80183E50[1] = temp_v0->unk_044 + 0.8;
D_80183E50[2] = temp_v0->pos[2];
set_transform_matrix(sp30, temp_v0->unk_01C, D_80183E50, 0U, arg1);
object = &gObjectList[objectIndex];
D_80183E50[0] = object->pos[0];
D_80183E50[1] = object->surfaceHeight + 0.8;
D_80183E50[2] = object->pos[2];
set_transform_matrix(sp30, object->unk_01C, D_80183E50, 0U, arg1);
convert_to_fixed_point_matrix(&gGfxPool->mtxHud[gMatrixHudCount], sp30);
gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxHud[gMatrixHudCount++]), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(gDisplayListHead++, D_0D007B98);
@ -2195,27 +2198,27 @@ UNUSED void func_8004E604(s32 arg0, s32 arg1, u8 *tlut, u8 *texture) {
void draw_item_window(s32 playerId) {
s32 objectIndex;
Objects *temp_v1;
Object *object;
hud_player *temp_v0;
objectIndex = gItemWindowObjectByPlayerId[playerId];
temp_v1 = &gObjectList[objectIndex];
if (temp_v1->state >= 2) {
object = &gObjectList[objectIndex];
if (object->state >= 2) {
temp_v0 = &playerHUD[playerId];
func_8004E4CC(temp_v0->slideItemBoxX + temp_v0->itemBoxX, temp_v0->slideItemBoxY + temp_v0->itemBoxY, (u8 *) temp_v1->activeTLUT, temp_v1->activeTexture);
func_8004E4CC(temp_v0->slideItemBoxX + temp_v0->itemBoxX, temp_v0->slideItemBoxY + temp_v0->itemBoxY, (u8 *) object->activeTLUT, object->activeTexture);
}
}
void func_8004E6C4(s32 playerId) {
s32 objectIndex;
Objects *temp_v1;
Object *object;
hud_player *temp_v0;
objectIndex = gItemWindowObjectByPlayerId[playerId];
temp_v1 = &gObjectList[objectIndex];
if (temp_v1->state >= 2) {
object = &gObjectList[objectIndex];
if (object->state >= 2) {
temp_v0 = &playerHUD[playerId];
func_80047910(temp_v0->slideItemBoxX + temp_v0->itemBoxX, temp_v0->slideItemBoxY + temp_v0->itemBoxY, 0U, temp_v0->unknownScaling, (u8 *) temp_v1->activeTLUT, (u8 *) temp_v1->activeTexture, D_0D005C30, 0x00000028, 0x00000020, 0x00000028, 0x00000020);
func_80047910(temp_v0->slideItemBoxX + temp_v0->itemBoxX, temp_v0->slideItemBoxY + temp_v0->itemBoxY, 0U, temp_v0->unknownScaling, (u8 *) object->activeTLUT, (u8 *) object->activeTexture, D_0D005C30, 0x00000028, 0x00000020, 0x00000028, 0x00000020);
}
}
@ -2279,7 +2282,7 @@ void func_8004EB38(s32 playerId) {
}
void func_8004ED40(s32 arg0) {
func_8004A2F4(playerHUD[arg0].speedometerX, playerHUD[arg0].speedometerY, 0U, 1.0f, D_8018D300, D_8018D308, D_8018D310, 0xFF, common_texture_speedometer, D_0D0064B0, 0x40, 0x60, 0x40, 0x30);
func_8004A2F4(playerHUD[arg0].speedometerX, playerHUD[arg0].speedometerY, 0U, 1.0f, D_8018D300, D_8018D308, D_8018D310, 0xFF, common_texture_speedometer, D_0D0064B0, 64, 96, 64, 48);
func_8004A258(D_8018CFEC, D_8018CFF4, D_8016579E, 1.0f, common_texture_speedometer_needle, D_0D005FF0, 0x40, 0x20, 0x40, 0x20);
}
@ -2533,6 +2536,7 @@ void draw_lap_count(s16 lapX, s16 lapY, s8 lap) {
gDPSetAlphaCompare(gDisplayListHead++, G_AC_THRESHOLD);
load_texture_block_rgba16_mirror((u8*) common_texture_hud_123, 32, 8);
// Display current lap. Ex. 1/3
func_8004BA98(lapX , lapY, 8, 8, lap * 8, 0, 0); // display the digit
func_8004BA98(lapX + 8 , lapY, 8, 8, 24, 0, 0); // display the /
func_8004BA98(lapX + 16, lapY, 8, 8, 16, 0, 0); // display the 3
@ -2810,7 +2814,7 @@ void func_80050E34(s32 playerId, s32 arg1) {
s32 characterId;
s32 spB8;
s32 temp_v0_2;
Objects *object;
Object *object;
Player *player;
player = &gPlayerOne[playerId];
@ -2913,7 +2917,7 @@ void func_800514BC(void) {
void render_object_leaf_particle(UNUSED s32 cameraId) {
s32 someIndex;
s32 leafIndex;
Objects *object;
Object *object;
gSPDisplayList(gDisplayListHead++, D_0D0079C8);
gSPClearGeometryMode(gDisplayListHead++, G_CULL_BOTH);
@ -2978,7 +2982,7 @@ void func_800519D4(s32 objectIndex, s16 arg1, s16 arg2) {
void func_80051ABC(s16 arg0, s32 arg1) {
s32 var_s0;
s32 objectIndex;
Objects *object;
Object *object;
D_8018D228 = 0xFF;
gSPDisplayList(gDisplayListHead++, D_0D007A60);
@ -3003,7 +3007,7 @@ void func_80051C60(s16 arg0, s32 arg1) {
s16 var_s5;
s32 var_s0;
s32 objectIndex;
Objects *object;
Object *object;
if (D_801658FE == 0) {
if (gCurrentCourseId == 6) {
@ -3099,7 +3103,7 @@ void func_800520C0(s32 arg0) {
void func_8005217C(UNUSED s32 arg0) {
Lights1 *D_800E45C0l = LOAD_ASSET(D_800E45C0);
Objects *object;
Object *object;
s32 temp_a3;
temp_a3 = indexObjectList2[0];
@ -3128,7 +3132,7 @@ void func_8005217C(UNUSED s32 arg0) {
void func_800523B8(s32 objectIndex, s32 arg1, u32 arg2) {
UNUSED s32 pad[2];
Objects *object;
Object *object;
Camera *camera = &camera1[arg1];
object = &gObjectList[objectIndex];
@ -3192,7 +3196,7 @@ void render_object_bat(s32 cameraId) {
void render_object_trash_bin(s32 cameraId) {
s32 objectIndex;
Objects *object;
Object *object;
objectIndex = indexObjectList1[1];
func_8008A364(objectIndex, cameraId, 0x5555U, 0x00000320);
@ -3220,7 +3224,7 @@ void func_8005285C(s32 arg0) {
void func_800528EC(s32 arg0) {
s32 var_s3;
s32 objectIndex;
Objects *object;
Object *object;
Lights1 D_800E4620l = *(Lights1 *) LOAD_ASSET(D_800E4620);
D_80183E80[0] = D_8016582C[0];
@ -3321,7 +3325,7 @@ void render_object_snowmans_list_2(s32 cameraId) {
Camera *sp44;
s32 someIndex;
s32 objectIndex;
Objects *object;
Object *object;
sp44 = &camera1[cameraId];
load_texture_and_tlut(d_course_frappe_snowland_snow_tlut, d_course_frappe_snowland_snow, 0x00000020, 0x00000020);
@ -3379,7 +3383,7 @@ void render_lakitu(s32 cameraId) {
f32 var_f0;
f32 var_f2;
s32 objectIndex;
Objects *object;
Object *object;
objectIndex = gIndexLakituList[cameraId];
camera = &camera1[cameraId];
@ -3472,7 +3476,7 @@ void render_object_thwomps(s32 cameraId) {
UNUSED s32 stackPadding0;
s16 minusone, plusone;
Camera *camera;
Objects *object;
Object *object;
Lights1 D_800E4668l = *(Lights1 *) LOAD_ASSET(D_800E4668);
camera = &camera1[cameraId];
@ -3538,14 +3542,16 @@ void render_object_thwomps(s32 cameraId) {
}
void func_80053D74(s32 objectIndex, UNUSED s32 arg1, s32 vertexIndex) {
Objects *temp_v0;
Object *object;
Vtx *vtx = (Vtx *) LOAD_ASSET(common_vtx_hedgehog);
if (gMatrixHudCount <= MTX_HUD_POOL_SIZE_MAX) {
temp_v0 = &gObjectList[objectIndex];
D_80183E80[2] = (s16) (temp_v0->unk_084[6] + 0x8000);
rsp_set_matrix_transformation(temp_v0->pos, (u16 *) D_80183E80, temp_v0->sizeScaling);
set_color_render((s32) temp_v0->unk_084[0], (s32) temp_v0->unk_084[1], (s32) temp_v0->unk_084[2], (s32) temp_v0->unk_084[3], (s32) temp_v0->unk_084[4], (s32) temp_v0->unk_084[5], (s32) temp_v0->primAlpha);
gSPVertex(gDisplayListHead++, &common_vtx_hedgehog[vertexIndex], 4, 0);
object = &gObjectList[objectIndex];
D_80183E80[2] = (s16) (object->unk_084[6] + 0x8000);
rsp_set_matrix_transformation(object->pos, (u16 *) D_80183E80, object->sizeScaling);
set_color_render((s32) object->unk_084[0], (s32) object->unk_084[1], (s32) object->unk_084[2], (s32) object->unk_084[3], (s32) object->unk_084[4], (s32) object->unk_084[5], (s32) object->primAlpha);
gSPVertex(gDisplayListHead++, &vtx[vertexIndex], 4, 0);
gSPDisplayList(gDisplayListHead++, common_rectangle_display);
}
}
@ -3559,14 +3565,20 @@ void func_80053E6C(s32 arg0) {
func_8004B614(0, 0, 0, 0, 0, 0, 0);
D_80183E80[0] = 0;
D_80183E80[1] = 0x8000;
rsp_load_texture(D_8018D4BC, 0x40, 0x20);
rsp_load_texture(gTextureBalloon1, 64, 32);
for (var_s1 = 0; var_s1 < D_80165738; var_s1++) {
objectIndex = gObjectParticle3[var_s1];
if ((objectIndex != NULL_OBJECT_ID) && (gObjectList[objectIndex].state >= 2)) {
func_80053D74(objectIndex, arg0, 0);
}
}
rsp_load_texture(D_8018D4C0, 0x40, 0x20);
//! @bug This part is not rendering.
gDPLoadTextureBlock(gDisplayListHead++, gTextureBalloon2, G_IM_FMT_CI, G_IM_SIZ_8b, 64, 32, 0,
G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
//rsp_load_texture(gTextureBalloon2, 64, 32);
for (var_s1 = 0; var_s1 < D_80165738; var_s1++) {
objectIndex = gObjectParticle3[var_s1];
if ((objectIndex != NULL_OBJECT_ID) && (gObjectList[objectIndex].state >= 2)) {
@ -3671,18 +3683,18 @@ void render_object_paddle_boat_smoke_particles(s32 cameraId) {
void render_object_bowser_flame_particle(s32 objectIndex, s32 cameraId) {
Camera *camera;
Objects *temp_s0;
Object *object;
camera = &camera1[cameraId];
if (gMatrixHudCount <= MTX_HUD_POOL_SIZE_MAX) {
temp_s0 = &gObjectList[objectIndex];
if (temp_s0->unk_0D5 == 9) {
func_8004B72C(0xFF, (s32) temp_s0->type, 0, (s32) temp_s0->unk_0A2, 0, 0, (s32) temp_s0->primAlpha);
object = &gObjectList[objectIndex];
if (object->unk_0D5 == 9) {
func_8004B72C(0xFF, (s32) object->type, 0, (s32) object->unk_0A2, 0, 0, (s32) object->primAlpha);
} else {
func_8004B138(0xFF, (s32) temp_s0->type, 0, (s32) temp_s0->primAlpha);
func_8004B138(0xFF, (s32) object->type, 0, (s32) object->primAlpha);
}
D_80183E80[1] = func_800418AC(temp_s0->pos[0], temp_s0->pos[2], camera->pos);
func_800431B0(temp_s0->pos, D_80183E80, temp_s0->sizeScaling, D_0D005AE0);
D_80183E80[1] = func_800418AC(object->pos[0], object->pos[2], camera->pos);
func_800431B0(object->pos, D_80183E80, object->sizeScaling, D_0D005AE0);
}
}
@ -3731,7 +3743,7 @@ void render_object_smoke_particles(s32 cameraId) {
Camera *sp54;
s32 var_s0;
s32 objectIndex;
Objects *object;
Object *object;
sp54 = &camera1[cameraId];
gSPDisplayList(gDisplayListHead++, D_0D007AE0);
@ -3804,7 +3816,7 @@ void func_80054E10(s32 objectIndex) {
if (gObjectList[objectIndex].state > 0) {
if (is_obj_flag_status_active(objectIndex, 0x00800000) != 0) {
D_80183E50[0] = gObjectList[objectIndex].pos[0];
D_80183E50[1] = gObjectList[objectIndex].unk_044 + 0.8;
D_80183E50[1] = gObjectList[objectIndex].surfaceHeight + 0.8;
D_80183E50[2] = gObjectList[objectIndex].pos[2];
D_80183E70[0] = gObjectList[objectIndex].velocity[0];
D_80183E70[1] = gObjectList[objectIndex].velocity[1];
@ -3827,7 +3839,7 @@ void func_80054F04(s32 cameraId) {
s32 var_s2;
s32 objectIndex;
Camera *sp44;
Objects * object;
Object *object;
sp44 = &camera1[cameraId];
gSPDisplayList(gDisplayListHead++, D_0D0079C8);
@ -3920,10 +3932,11 @@ void draw_crabs(s32 objectIndex, s32 cameraId) {
Camera *camera;
if (gObjectList[objectIndex].state >= 2) {
Vtx *vtx = (Vtx *) LOAD_ASSET(common_vtx_hedgehog);
camera = &camera1[cameraId];
func_8004A6EC(objectIndex, 0.5f);
gObjectList[objectIndex].orientation[1] = func_800418AC(gObjectList[objectIndex].pos[0], gObjectList[objectIndex].pos[2], camera->pos);
draw_2d_texture_at(gObjectList[objectIndex].pos, gObjectList[objectIndex].orientation, gObjectList[objectIndex].sizeScaling, (u8 *) gObjectList[objectIndex].activeTLUT, gObjectList[objectIndex].activeTexture, common_vtx_hedgehog, 0x00000040, 0x00000040, 0x00000040, 0x00000020);
draw_2d_texture_at(gObjectList[objectIndex].pos, gObjectList[objectIndex].orientation, gObjectList[objectIndex].sizeScaling, (u8 *) gObjectList[objectIndex].activeTLUT, gObjectList[objectIndex].activeTexture, vtx, 0x00000040, 0x00000040, 0x00000040, 0x00000020);
}
}
@ -3982,7 +3995,7 @@ UNUSED void func_800557AC() {
void func_800557B4(s32 objectIndex, u32 arg1, u32 arg2) {
Vec3f sp34;
Objects *object;
Object *object;
object = &gObjectList[objectIndex];
if (object->state >= 2) {
@ -4092,7 +4105,7 @@ void func_80055CCC(s32 objectIndex, s32 cameraId) {
camera = &camera1[cameraId];
if (gObjectList[objectIndex].state >= 2) {
func_8008A454(objectIndex, cameraId, 0x0000012C);
test = gObjectList[objectIndex].pos[1] - gObjectList[objectIndex].unk_044;
test = gObjectList[objectIndex].pos[1] - gObjectList[objectIndex].surfaceHeight;
func_8004A6EC(objectIndex, (20.0 / test) + 0.5);
if (is_obj_index_flag_status_inactive(objectIndex, 0x00100000) != 0) {
func_80043328(gObjectList[objectIndex].pos, (u16 *) gObjectList[objectIndex].direction_angle, gObjectList[objectIndex].sizeScaling, d_course_luigi_raceway_dl_F960);
@ -4125,7 +4138,7 @@ void render_object_hot_air_balloon(s32 arg0) {
}
void func_80055EF4(s32 objectIndex, UNUSED s32 arg1) {
Objects *object;
Object *object;
object = &gObjectList[objectIndex];
if (object->state >= 2) {
@ -4144,7 +4157,7 @@ void func_80055F48(s32 arg0) {
void func_80055FA0(s32 objectIndex, UNUSED s32 arg1) {
Mat4 someMatrix1;
Mat4 someMatrix2;
Objects *object;
Object *object;
object = &gObjectList[objectIndex];
if (object->state >= 2) {
@ -4169,7 +4182,7 @@ void render_object_neon(s32 cameraId) {
Camera *camera;
s32 var_s2;
s32 objectIndex;
Objects *object;
Object *object;
camera = &camera1[cameraId];
for (var_s2 =0; var_s2 < 10; var_s2++) {
@ -4177,8 +4190,9 @@ void render_object_neon(s32 cameraId) {
if (D_8018E838[cameraId] == 0) {
object = &gObjectList[objectIndex];
if ((object->state >= 2) && (is_obj_index_flag_status_inactive(objectIndex, 0x00080000) != 0) && (is_object_visible_on_camera(objectIndex, camera, 0x2AABU) != 0)) {
Vtx *vtx = (Vtx *) LOAD_ASSET(common_vtx_hedgehog);
object->orientation[1] = angle_between_object_camera(objectIndex, camera);
draw_2d_texture_at(object->pos, object->orientation, object->sizeScaling, (u8 *) object->activeTLUT, object->activeTexture, common_vtx_hedgehog, 0x00000040, 0x00000040, 0x00000040, 0x00000020);
draw_2d_texture_at(object->pos, object->orientation, object->sizeScaling, (u8 *) object->activeTLUT, object->activeTexture, vtx, 0x00000040, 0x00000040, 0x00000040, 0x00000020);
}
}
}
@ -4203,7 +4217,7 @@ void func_800563DC(s32 objectIndex, s32 cameraId, s32 arg2) {
s32 temp_v0;
s32 residue;
Camera *camera;
Objects *object;
Object *object;
camera = &camera1[cameraId];
object = &gObjectList[objectIndex];
@ -4259,9 +4273,9 @@ void func_800568A0(s32 objectIndex, s32 playerId) {
player = &gPlayerOne[playerId];
D_80183E50[0] = gObjectList[objectIndex].pos[0];
D_80183E50[1] = gObjectList[objectIndex].unk_044 + 0.8;
D_80183E50[1] = gObjectList[objectIndex].surfaceHeight + 0.8;
D_80183E50[2] = gObjectList[objectIndex].pos[2];
set_transform_matrix(sp30, player->unk_110.orientationVector, D_80183E50, 0U, 0.5f);
set_transform_matrix(sp30, player->collision.orientationVector, D_80183E50, 0U, 0.5f);
convert_to_fixed_point_matrix(&gGfxPool->mtxHud[gMatrixHudCount], sp30);
gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxHud[gMatrixHudCount++]), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(gDisplayListHead++, D_0D007B98);
@ -4292,18 +4306,18 @@ void render_object_bomb_kart(s32 cameraId) {
s32 temp_s1;
s32 temp_s0;
s32 payerId;
Objects *temp_v1;
Object *object;
for (payerId = 0; payerId < NUM_BOMB_KARTS_BATTLE; payerId++) {
temp_s0 = gIndexObjectBombKart[payerId];
temp_v1 = &gObjectList[temp_s0];
if (temp_v1->state != 0) {
temp_s1 = temp_v1->primAlpha;
object = &gObjectList[temp_s0];
if (object->state != 0) {
temp_s1 = object->primAlpha;
temp_v0 = &gPlayerOne[payerId];
temp_v1->pos[0] = temp_v0->pos[0];
temp_v1->pos[1] = temp_v0->pos[1] - 2.0;
temp_v1->pos[2] = temp_v0->pos[2];
temp_v1->unk_044 = temp_v0->unk_074;
object->pos[0] = temp_v0->pos[0];
object->pos[1] = temp_v0->pos[1] - 2.0;
object->pos[2] = temp_v0->pos[2];
object->surfaceHeight = temp_v0->unk_074;
func_800563DC(temp_s0, cameraId, temp_s1);
func_8005669C(temp_s0, cameraId, temp_s1);
func_800568A0(temp_s0, cameraId);

View File

@ -281,8 +281,8 @@ void func_80020524(void) {
//mio0decode((u8*) D_802DFB80[D_801651D0[D_80164AC0[i - 1]][D_80164AB0[i - 1]]][D_80164AC0[i - 1]][D_80164AB0[i - 1]].unk_00,
// D_802BFB80.arraySize8[D_801651D0[D_80164AC0[i - 1]][D_80164AB0[i - 1]]][D_80164AC0[i - 1]][D_80164AB0[i - 1]].pixel_index_array);
// memcpy(&D_802BFB80.arraySize8[D_801651D0[D_80164AC0[i - 1]][D_80164AB0[i - 1]]][D_80164AC0[i - 1]][D_80164AB0[i - 1]].pixel_index_array,
// D_802DFB80[D_801651D0[D_80164AC0[i - 1]][D_80164AB0[i - 1]]][D_80164AC0[i - 1]][D_80164AB0[i - 1]].unk_00, 0x1000);
memcpy(&D_802BFB80.arraySize8[D_801651D0[D_80164AC0[i - 1]][D_80164AB0[i - 1]]][D_80164AC0[i - 1]][D_80164AB0[i - 1]].pixel_index_array,
D_802DFB80[D_801651D0[D_80164AC0[i - 1]][D_80164AB0[i - 1]]][D_80164AC0[i - 1]][D_80164AB0[i - 1]].unk_00, 0x1000);
//osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
}
@ -290,8 +290,8 @@ void func_80020524(void) {
//mio0decode((u8*) D_802DFB80[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]].unk_00,
// D_802BFB80.arraySize8[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]].pixel_index_array);
// memcpy(&D_802BFB80.arraySize8[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]].pixel_index_array,
// D_802DFB80[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]].unk_00, 0x1000);
memcpy(&D_802BFB80.arraySize8[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]].pixel_index_array,
D_802DFB80[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]].unk_00, 0x1000);
}
@ -314,8 +314,8 @@ void func_8002088C(void) {
//mio0decode((u8*) D_802DFB80[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]].unk_00,
// D_802BFB80.arraySize8[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]].pixel_index_array);
// memcpy(&D_802BFB80.arraySize8[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]].pixel_index_array,
// D_802DFB80[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]].unk_00, 0x1000);
memcpy(&D_802BFB80.arraySize8[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]].pixel_index_array,
D_802DFB80[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]].unk_00, 0x1000);
//osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
}
@ -323,8 +323,8 @@ void func_8002088C(void) {
//mio0decode((u8*) D_802DFB80[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]].unk_00,
// D_802BFB80.arraySize8[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]].pixel_index_array);
// memcpy(&D_802BFB80.arraySize8[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]].pixel_index_array,
// D_802DFB80[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]].unk_00, 0x1000);
memcpy(&D_802BFB80.arraySize8[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]].pixel_index_array,
D_802DFB80[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]].unk_00, 0x1000);
}
void func_80020BF4(void) {
@ -339,11 +339,19 @@ void func_80020BF4(void) {
func_80027560(D_80164AD0[var_s0], D_80164AB0[var_s0] + 4, D_80164AC0[var_s0], D_80164AC0[var_s0] - 2, D_801651D0[D_80164AC0[var_s0]][D_80164AB0[var_s0]], var_s0);
// mio0decode((u8*) D_802DFB80[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1] - 2][D_80164AB0[var_s0 - 1] + 4].unk_00,
// D_802BFB80.arraySize8[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1] - 2][D_80164AB0[var_s0 - 1] + 4].pixel_index_array);
memcpy((u8*) &D_802BFB80.arraySize8[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1] - 2][D_80164AB0[var_s0 - 1] + 4].pixel_index_array,
D_802DFB80[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1] - 2][D_80164AB0[var_s0 - 1] + 4].unk_00, 0x1000);
// osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
}
//func_80027560(D_80164AD0[0], D_80164AB0[0] + 4, D_80164AC0[0], D_80164AC0[0] - 2, D_801651D0[D_80164AC0[0]][D_80164AB0[0]], 0);
// mio0decode((u8*) D_802DFB80[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1] - 2][D_80164AB0[gPlayersToRenderCount-1] + 4].unk_00,
// D_802BFB80.arraySize8[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1] - 2][D_80164AB0[gPlayersToRenderCount-1] + 4].pixel_index_array);
//mio0decode((u8*) D_802DFB80[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1] - 2][D_80164AB0[gPlayersToRenderCount-1] + 4].unk_00,
// D_802BFB80.arraySize8[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1] - 2][D_80164AB0[gPlayersToRenderCount-1] + 4].pixel_index_array);
memcpy((u8*) &D_802BFB80.arraySize8[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1] - 2][D_80164AB0[gPlayersToRenderCount-1] + 4].pixel_index_array, D_802DFB80[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1] - 2][D_80164AB0[gPlayersToRenderCount-1] + 4].unk_00, 0x1000);
}
void func_80020F1C(void) {
@ -359,10 +367,16 @@ void func_80020F1C(void) {
// mio0decode((u8*) D_802DFB80[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1] - 2][D_80164AB0[var_s0 - 1] + 4].unk_00,
// D_802BFB80.arraySize8[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1] - 2][D_80164AB0[var_s0 - 1] + 4].pixel_index_array);
// osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
memcpy((u8*) &D_802BFB80.arraySize8[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1] - 2][D_80164AB0[var_s0 - 1] + 4].pixel_index_array, D_802DFB80[D_801651D0[D_80164AC0[var_s0 - 1]][D_80164AB0[var_s0 - 1]]][D_80164AC0[var_s0 - 1] - 2][D_80164AB0[var_s0 - 1] + 4].unk_00,0x1000);
}
//func_80027560(D_80164AD0[0], D_80164AB0[0] + 4, D_80164AC0[0], D_80164AC0[0] - 2, D_801651D0[D_80164AC0[0]][D_80164AB0[0]], 0);
// mio0decode((u8*) D_802DFB80[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1] - 2][D_80164AB0[gPlayersToRenderCount-1] + 4].unk_00,
// D_802BFB80.arraySize8[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1] - 2][D_80164AB0[gPlayersToRenderCount-1] + 4].pixel_index_array);
memcpy((u8*) &D_802BFB80.arraySize8[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1] - 2][D_80164AB0[gPlayersToRenderCount-1] + 4].pixel_index_array, D_802DFB80[D_801651D0[D_80164AC0[gPlayersToRenderCount-1]][D_80164AB0[gPlayersToRenderCount-1]]][D_80164AC0[gPlayersToRenderCount-1] - 2][D_80164AB0[gPlayersToRenderCount-1] + 4].unk_00, 0x1000);
}
void try_render_player(Player *player, s8 playerId, s8 arg2) {
@ -1106,7 +1120,7 @@ void render_light_environment_on_player(Player *player, s8 arg1) {
if (((gNearestWaypointByPlayerId[arg1] >= 0x15) && (gNearestWaypointByPlayerId[arg1] < 0x2A))
|| ((gNearestWaypointByPlayerId[arg1] >= 0x14D) && (gNearestWaypointByPlayerId[arg1] < 0x15C))
|| ((gNearestWaypointByPlayerId[arg1] >= 0x1D1) && (gNearestWaypointByPlayerId[arg1] < 0x1E4))
|| (player->unk_110.unk3C[2] >= 500.0f)) { // over lava
|| (player->collision.surfaceDistance[2] >= 500.0f)) { // over lava
change_player_color_effect_rgb(player, arg1, COLOR_LAVA, 0.3f);
change_player_color_effect_cmy(player, arg1, 0x004040, 0.3f);
D_80164B80[arg1] = 0;
@ -1243,9 +1257,9 @@ void func_800235AC(Player *player, s8 arg1) {
}
}
if (is_player_under_light_luigi_raceway(player, arg1) != true) {
if (((player->boundingBoxCorners[3].unk_14 & 1) == 1)
|| ((player->boundingBoxCorners[3].unk_14 & 2) == 2)
|| ((player->boundingBoxCorners[0].unk_14 & 3) == 3)) {
if (((player->tyres[BACK_RIGHT].unk_14 & 1) == 1)
|| ((player->tyres[BACK_RIGHT].unk_14 & 2) == 2)
|| ((player->tyres[FRONT_LEFT].unk_14 & 3) == 3)) {
change_player_color_effect_rgb(player, arg1, COLOR_BLACK, 0.3f);
change_player_color_effect_cmy(player, arg1, 0x6F6F6F, 0.3f);
return;
@ -1298,12 +1312,12 @@ void render_player_shadow(Player *player, s8 arg1, s8 arg2) {
|| ((player->effects & 0x10000) == 0x10000)
|| ((player->effects & 8) == 8)) {
var_f2 = (f32) (1.0 - ((f64) player->unk_110.unk3C[2] * 0.02));
var_f2 = (f32) (1.0 - ((f64) player->collision.surfaceDistance[2] * 0.02));
if (var_f2 < 0.0f) {var_f2 = 0.0f;}
if (var_f2 > 1.0f) {var_f2 = 1.0f;}
spB4[0] = player->unk_110.orientationVector[0];
spB4[2] = player->unk_110.orientationVector[2];
spB4[1] = player->unk_110.orientationVector[1];
spB4[0] = player->collision.orientationVector[0];
spB4[2] = player->collision.orientationVector[2];
spB4[1] = player->collision.orientationVector[1];
spCC[0] = player->pos[0] + ((spB0 * sins(spC0)) + (spAC * coss(spC0)));
spCC[1] = player->unk_074 + 1.0f;
@ -1698,7 +1712,7 @@ void render_player(Player *player, s8 playerId, s8 screenId) {
}
func_80023BF0(player, playerId, screenId, var_v1);
temp_t1 = 8 << (screenId * 4);
if ((temp_t1 == (player->unk_002 & temp_t1)) && (player->unk_110.unk3C[2] <= 50.0f) && (player->surfaceType != ICE)) {
if ((temp_t1 == (player->unk_002 & temp_t1)) && (player->collision.surfaceDistance[2] <= 50.0f) && (player->surfaceType != ICE)) {
if ((player->effects & BOO_EFFECT) == BOO_EFFECT) {
if (playerId == screenId) {
render_player_shadow(player, playerId, screenId);
@ -1713,7 +1727,7 @@ void render_player(Player *player, s8 playerId, s8 screenId) {
ghost_render(player, playerId, screenId, var_v1);
}
osRecvMesg(&gDmaMesgQueue, (OSMesg *) &sp34, OS_MESG_BLOCK);
if ((temp_t1 == (player->unk_002 & temp_t1)) && (player->surfaceType == ICE) && ((player->unk_0CA & 1) != 1) && (player->unk_110.unk3C[2] <= 30.0f)) {
if ((temp_t1 == (player->unk_002 & temp_t1)) && (player->surfaceType == ICE) && ((player->unk_0CA & 1) != 1) && (player->collision.surfaceDistance[2] <= 30.0f)) {
player_ice_reflection_render(player, playerId, screenId, var_v1);
}
if (player->boostPower >= 2.0f) {

View File

@ -1,6 +1,7 @@
#include <defines.h>
#include <mk64.h>
#include <stubs.h>
#include "networking/networking.h"
#include "spawn_players.h"
#include "code_800029B0.h"
@ -111,7 +112,7 @@ void spawn_player(Player *player, s8 playerIndex, f32 startingRow, f32 startingC
}
player->pos[0] = startingRow;
ret = func_802AE1C0(startingRow, arg4 + 50.0f, startingColumn) + player->boundingBoxSize;
ret = spawn_actor_on_surface(startingRow, arg4 + 50.0f, startingColumn) + player->boundingBoxSize;
player->pos[2] = startingColumn;
player->pos[1] = ret;
player->copy_rotation_x = startingRow;
@ -292,66 +293,66 @@ void spawn_player(Player *player, s8 playerIndex, f32 startingRow, f32 startingC
D_801654C0[playerIndex] = 0;
D_80165340 = 0;
player->boundingBoxCorners[FRONT_LEFT_TYRE].surfaceType = 0;
player->boundingBoxCorners[FRONT_RIGHT_TYRE].surfaceType = 0;
player->boundingBoxCorners[BACK_LEFT_TYRE].surfaceType = 0;
player->boundingBoxCorners[BACK_RIGHT_TYRE].surfaceType = 0;
player->tyres[FRONT_LEFT].surfaceType = 0;
player->tyres[FRONT_RIGHT].surfaceType = 0;
player->tyres[BACK_LEFT].surfaceType = 0;
player->tyres[BACK_RIGHT].surfaceType = 0;
player->boundingBoxCorners[FRONT_LEFT_TYRE].surfaceFlags = 0;
player->boundingBoxCorners[FRONT_RIGHT_TYRE].surfaceFlags = 0;
player->boundingBoxCorners[BACK_LEFT_TYRE].surfaceFlags = 0;
player->boundingBoxCorners[BACK_RIGHT_TYRE].surfaceFlags = 0;
player->tyres[FRONT_LEFT].surfaceFlags = 0;
player->tyres[FRONT_RIGHT].surfaceFlags = 0;
player->tyres[BACK_LEFT].surfaceFlags = 0;
player->tyres[BACK_RIGHT].surfaceFlags = 0;
player->boundingBoxCorners[FRONT_LEFT_TYRE].surfaceMapIndex = 0;
player->boundingBoxCorners[FRONT_RIGHT_TYRE].surfaceMapIndex = 0;
player->boundingBoxCorners[BACK_LEFT_TYRE].surfaceMapIndex = 0;
player->boundingBoxCorners[BACK_RIGHT_TYRE].surfaceMapIndex = 0;
player->tyres[FRONT_LEFT].collisionMeshIndex = 0;
player->tyres[FRONT_RIGHT].collisionMeshIndex = 0;
player->tyres[BACK_LEFT].collisionMeshIndex = 0;
player->tyres[BACK_RIGHT].collisionMeshIndex = 0;
player->boundingBoxCorners[FRONT_RIGHT_TYRE].unk_14 = 0;
player->boundingBoxCorners[FRONT_LEFT_TYRE].unk_14 = 0;
player->boundingBoxCorners[BACK_LEFT_TYRE].unk_14 = 0;
player->boundingBoxCorners[BACK_RIGHT_TYRE].unk_14 = 0;
player->tyres[FRONT_RIGHT].unk_14 = 0;
player->tyres[FRONT_LEFT].unk_14 = 0;
player->tyres[BACK_LEFT].unk_14 = 0;
player->tyres[BACK_RIGHT].unk_14 = 0;
player->unk_110.unk30 = 0;
player->unk_110.unk32 = 0;
player->unk_110.unk34 = 0;
player->unk_110.unk36 = 0;
player->unk_110.unk38 = 0;
player->unk_110.unk3A = 0;
player->collision.unk30 = 0;
player->collision.unk32 = 0;
player->collision.unk34 = 0;
player->collision.meshIndexYX = 0;
player->collision.meshIndexZY = 0;
player->collision.meshIndexZX = 0;
player->boundingBoxCorners[FRONT_LEFT_TYRE].cornerPos[0] = 0.0f;
player->boundingBoxCorners[FRONT_LEFT_TYRE].cornerPos[1] = 0.0f;
player->boundingBoxCorners[FRONT_LEFT_TYRE].cornerPos[2] = 0.0f;
player->tyres[FRONT_LEFT].pos[0] = 0.0f;
player->tyres[FRONT_LEFT].pos[1] = 0.0f;
player->tyres[FRONT_LEFT].pos[2] = 0.0f;
player->boundingBoxCorners[FRONT_RIGHT_TYRE].cornerPos[0] = 0.0f;
player->boundingBoxCorners[FRONT_RIGHT_TYRE].cornerPos[1] = 0.0f;
player->boundingBoxCorners[FRONT_RIGHT_TYRE].cornerPos[2] = 0.0f;
player->tyres[FRONT_RIGHT].pos[0] = 0.0f;
player->tyres[FRONT_RIGHT].pos[1] = 0.0f;
player->tyres[FRONT_RIGHT].pos[2] = 0.0f;
player->boundingBoxCorners[BACK_LEFT_TYRE].cornerPos[0] = 0.0f;
player->boundingBoxCorners[BACK_LEFT_TYRE].cornerPos[1] = 0.0f;
player->boundingBoxCorners[BACK_LEFT_TYRE].cornerPos[2] = 0.0f;
player->tyres[BACK_LEFT].pos[0] = 0.0f;
player->tyres[BACK_LEFT].pos[1] = 0.0f;
player->tyres[BACK_LEFT].pos[2] = 0.0f;
player->boundingBoxCorners[BACK_RIGHT_TYRE].cornerPos[0] = 0.0f;
player->boundingBoxCorners[BACK_RIGHT_TYRE].cornerPos[1] = 0.0f;
player->boundingBoxCorners[BACK_RIGHT_TYRE].cornerPos[2] = 0.0f;
player->tyres[BACK_RIGHT].pos[0] = 0.0f;
player->tyres[BACK_RIGHT].pos[1] = 0.0f;
player->tyres[BACK_RIGHT].pos[2] = 0.0f;
player->boundingBoxCorners[ FRONT_LEFT_TYRE].cornerGroundY = 0.0f;
player->boundingBoxCorners[FRONT_RIGHT_TYRE].cornerGroundY = 0.0f;
player->boundingBoxCorners[ BACK_LEFT_TYRE].cornerGroundY = 0.0f;
player->boundingBoxCorners[ BACK_RIGHT_TYRE].cornerGroundY = 0.0f;
player->tyres[FRONT_LEFT].baseHeight = 0.0f;
player->tyres[FRONT_RIGHT].baseHeight = 0.0f;
player->tyres[BACK_LEFT].baseHeight = 0.0f;
player->tyres[BACK_RIGHT].baseHeight = 0.0f;
player->unk_110.unk3C[0] = 0.0f;
player->unk_110.unk3C[1] = 0.0f;
player->unk_110.unk3C[2] = 0.0f;
player->unk_110.unk48[0] = 0.0f;
player->unk_110.unk48[1] = 0.0f;
player->unk_110.unk48[2] = 0.0f;
player->unk_110.unk54[0] = 0.0f;
player->unk_110.unk54[1] = 0.0f;
player->unk_110.unk54[2] = 0.0f;
player->unk_110.orientationVector[0] = 0.0f;
player->unk_110.orientationVector[1] = 0.0f;
player->unk_110.orientationVector[2] = 0.0f;
player->collision.surfaceDistance[0] = 0.0f;
player->collision.surfaceDistance[1] = 0.0f;
player->collision.surfaceDistance[2] = 0.0f;
player->collision.unk48[0] = 0.0f;
player->collision.unk48[1] = 0.0f;
player->collision.unk48[2] = 0.0f;
player->collision.unk54[0] = 0.0f;
player->collision.unk54[1] = 0.0f;
player->collision.unk54[2] = 0.0f;
player->collision.orientationVector[0] = 0.0f;
player->collision.orientationVector[1] = 0.0f;
player->collision.orientationVector[2] = 0.0f;
D_80165300[playerIndex] = 0;
D_8018CE10[playerIndex].unk_04[0] = 0.0f;
@ -524,15 +525,19 @@ void spawn_players_gp_one_player(f32 *arg0, f32 *arg1, f32 arg2) {
spawn_player(gPlayerEight, 7, arg0[D_80165270[7]], arg1[D_80165270[7]], arg2, 32768.0f, chooseKartAIPlayers[6], PLAYER_EXISTS | PLAYER_KART_AI | PLAYER_START_SEQUENCE);
D_80164A28 = 0;
} else {
spawn_player(gPlayerOneCopy, 0, arg0[D_80165270[0]], arg1[D_80165270[0]] + 250.0f, arg2, 32768.0f, gCharacterSelections[0], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerTwo, 1, arg0[D_80165270[1]], arg1[D_80165270[1]] + 250.0f, arg2, 32768.0f, chooseKartAIPlayers[0], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_KART_AI);
spawn_player(gPlayerThree, 2, arg0[D_80165270[3]], arg1[D_80165270[2]] + 250.0f, arg2, 32768.0f, chooseKartAIPlayers[1], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_KART_AI);
spawn_player(gPlayerFour, 3, arg0[D_80165270[2]], arg1[D_80165270[3]] + 250.0f, arg2, 32768.0f, chooseKartAIPlayers[2], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_KART_AI);
spawn_player(gPlayerFive, 4, arg0[D_80165270[5]], arg1[D_80165270[4]] + 250.0f, arg2, 32768.0f, chooseKartAIPlayers[3], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_KART_AI);
spawn_player(gPlayerSix, 5, arg0[D_80165270[4]], arg1[D_80165270[5]] + 250.0f, arg2, 32768.0f, chooseKartAIPlayers[4], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_KART_AI);
spawn_player(gPlayerSeven, 6, arg0[D_80165270[7]], arg1[D_80165270[6]] + 250.0f, arg2, 32768.0f, chooseKartAIPlayers[5], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_KART_AI);
spawn_player(gPlayerEight, 7, arg0[D_80165270[6]], arg1[D_80165270[7]] + 250.0f, arg2, 32768.0f, chooseKartAIPlayers[6], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_KART_AI);
D_80164A28 = 1;
if (gNetwork.enabled) {
spawn_network_players(arg0, arg1, arg2);
} else {
spawn_player(gPlayerTwo, 1, arg0[0], arg1[0] + 250.0f, arg2, 32768.0f, chooseKartAIPlayers[0], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_KART_AI);
spawn_player(gPlayerOneCopy, 0, arg0[1], arg1[1] + 250.0f, arg2, 32768.0f, gCharacterSelections[0], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_HUMAN);
spawn_player(gPlayerThree, 2, arg0[D_80165270[3]], arg1[D_80165270[2]] + 250.0f, arg2, 32768.0f, chooseKartAIPlayers[1], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_KART_AI);
spawn_player(gPlayerFour, 3, arg0[D_80165270[2]], arg1[D_80165270[3]] + 250.0f, arg2, 32768.0f, chooseKartAIPlayers[2], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_KART_AI);
spawn_player(gPlayerFive, 4, arg0[D_80165270[5]], arg1[D_80165270[4]] + 250.0f, arg2, 32768.0f, chooseKartAIPlayers[3], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_KART_AI);
spawn_player(gPlayerSix, 5, arg0[D_80165270[4]], arg1[D_80165270[5]] + 250.0f, arg2, 32768.0f, chooseKartAIPlayers[4], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_KART_AI);
spawn_player(gPlayerSeven, 6, arg0[D_80165270[7]], arg1[D_80165270[6]] + 250.0f, arg2, 32768.0f, chooseKartAIPlayers[5], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_KART_AI);
spawn_player(gPlayerEight, 7, arg0[D_80165270[6]], arg1[D_80165270[7]] + 250.0f, arg2, 32768.0f, chooseKartAIPlayers[6], PLAYER_EXISTS | PLAYER_STAGING | PLAYER_START_SEQUENCE | PLAYER_KART_AI);
}
D_80164A28 = 1;
}
func_80039AE4();
}
@ -1082,13 +1087,13 @@ void func_8003CD98(Player *player, Camera *camera, s8 playerId, s8 screenId) {
load_kart_palette(player, playerId, screenId, 1);
load_kart_texture(player, playerId, screenId, screenId, 0);
//mio0decode((u8 *) &D_802DFB80[0][arg3][playerId], (u8 *) &D_802BFB80.arraySize8[0][arg3][playerId]);
//memcpy(&D_802BFB80.arraySize8[0][screenId][playerId], &D_802DFB80[0][screenId][playerId], 0x1000);
memcpy(&D_802BFB80.arraySize8[0][screenId][playerId], &D_802DFB80[0][screenId][playerId], 0x1000);
} else {
load_kart_palette(player, playerId, screenId, 0);
load_kart_palette(player, playerId, screenId, 1);
load_kart_texture(player, (s8) (playerId + 4), screenId, (s8) (screenId - 2), 0);
//mio0decode((u8 *) &D_802DFB80[0][arg3 - 2][playerId + 4], (u8 *) &D_802BFB80.arraySize8[0][arg3 - 2][playerId + 4]);
//memcpy(&D_802BFB80.arraySize8[0][screenId - 2][playerId + 4], &D_802DFB80[0][screenId - 2][playerId + 4], 0x1000);
memcpy(&D_802BFB80.arraySize8[0][screenId - 2][playerId + 4], &D_802DFB80[0][screenId - 2][playerId + 4], 0x1000);
}
D_801650D0[screenId][playerId] = player->animFrameSelector[screenId];

View File

@ -38,7 +38,7 @@ s16 D_80162DB8;
u32 *D_80162DBC;
u16 D_80162DC0;
u32 D_80162DC4;
StaffGhost *D_80162DC4;
s32 D_80162DC8;
s32 D_80162DCC;
s32 D_80162DD0;
@ -70,6 +70,7 @@ void func_80004EF0(void) {
D_80162DA4 = (u32 *) &D_802BFB80.arraySize8[0][2][3];
osInvalDCache(&D_80162DA4[0], 0x4000);
//osPiStartDma(&gDmaIoMesg, 0, 0, (uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(D_80162DC4)], D_80162DA4, 0x4000, &gDmaMesgQueue);
memcpy(&D_80162DA4, D_80162DC4, 0x4000);
osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
D_80162D9C = (*D_80162DA4 & 0xFF0000);
D_80162DA0 = 0;
@ -114,7 +115,7 @@ void set_staff_ghost(void) {
D_80162DD6 = 1;
D_80162DF4 = 1;
}
D_80162DC4 = (u32) &d_mario_raceway_staff_ghost;
D_80162DC4 = &d_mario_raceway_staff_ghost;
D_80162DE4 = 0;
break;
case COURSE_ROYAL_RACEWAY:
@ -126,7 +127,7 @@ void set_staff_ghost(void) {
D_80162DD6 = 1;
D_80162DF4 = 1;
}
D_80162DC4 = (u32) &d_royal_raceway_staff_ghost;
D_80162DC4 = &d_royal_raceway_staff_ghost;
D_80162DE4 = 6;
break;
case COURSE_LUIGI_RACEWAY:
@ -138,7 +139,7 @@ void set_staff_ghost(void) {
D_80162DD6 = 1;
D_80162DF4 = 1;
}
D_80162DC4 = (u32) &d_luigi_raceway_staff_ghost;
D_80162DC4 = &d_luigi_raceway_staff_ghost;
D_80162DE4 = 1;
break;
default:

File diff suppressed because it is too large Load Diff

View File

@ -105,8 +105,8 @@ void func_800744A0(s32);
void func_800744CC(void);
void func_80074510(uintptr_t, void*, size_t);
void func_800745C8(s32, s32);
void func_8007466C(s32, s32);
void func_80074704(s32, s32);
void func_8007466C(s32, uintptr_t);
void func_80074704(s32, uintptr_t);
u8 *func_80074790(s32, u8*);
void func_800747F0(s32, u8*);
void func_80074894(s32, u8*);
@ -371,9 +371,6 @@ void func_80086C14(s32);
void func_80086C6C(s32);
void func_80086D80(void);
s32 osPiStartDma(OSIoMesg *mb, s32 priority, s32 direction, uintptr_t devAddr, void *vAddr, size_t nbytes, OSMesgQueue *mq);
s32 osRecvMesg(OSMesgQueue*, OSMesg*, s32);
extern f32 D_800E43B0[];
extern Vtx D_800E43F0[];
extern Vtx D_800E4470[];

View File

@ -0,0 +1,816 @@
:config:
segments:
- [0x06, 0x84E8E0]
- [0x07, 0x800000]
header:
code:
- '#include <libultraship.h>'
header:
- '#include <libultraship.h>'
- '#include <libultra/gbi.h>'
- '#include <align_asset_macro.h>'
references_packed_displaylists: true
d_course_luigi_raceway_dl_0:
symbol: d_course_luigi_raceway_dl_0
type: gfx
offset: 0x0
otr_mode: index
d_course_luigi_raceway_dl_1A8:
symbol: d_course_luigi_raceway_dl_1A8
type: gfx
offset: 0x1A8
otr_mode: index
d_course_luigi_raceway_dl_328:
symbol: d_course_luigi_raceway_dl_328
type: gfx
offset: 0x328
otr_mode: index
d_course_luigi_raceway_dl_480:
symbol: d_course_luigi_raceway_dl_480
type: gfx
offset: 0x480
otr_mode: index
d_course_luigi_raceway_dl_6E0:
symbol: d_course_luigi_raceway_dl_6E0
type: gfx
offset: 0x6E0
otr_mode: index
d_course_luigi_raceway_dl_868:
symbol: d_course_luigi_raceway_dl_868
type: gfx
offset: 0x868
otr_mode: index
d_course_luigi_raceway_dl_9F8:
symbol: d_course_luigi_raceway_dl_9F8
type: gfx
offset: 0x9F8
otr_mode: index
d_course_luigi_raceway_dl_B48:
symbol: d_course_luigi_raceway_dl_B48
type: gfx
offset: 0xB48
otr_mode: index
d_course_luigi_raceway_dl_D80:
symbol: d_course_luigi_raceway_dl_D80
type: gfx
offset: 0xD80
otr_mode: index
d_course_luigi_raceway_dl_EE8:
symbol: d_course_luigi_raceway_dl_EE8
type: gfx
offset: 0xEE8
otr_mode: index
d_course_luigi_raceway_dl_1058:
symbol: d_course_luigi_raceway_dl_1058
type: gfx
offset: 0x1058
otr_mode: index
d_course_luigi_raceway_dl_1198:
symbol: d_course_luigi_raceway_dl_1198
type: gfx
offset: 0x1198
otr_mode: index
d_course_luigi_raceway_dl_1398:
symbol: d_course_luigi_raceway_dl_1398
type: gfx
offset: 0x1398
otr_mode: index
d_course_luigi_raceway_dl_1538:
symbol: d_course_luigi_raceway_dl_1538
type: gfx
offset: 0x1538
otr_mode: index
d_course_luigi_raceway_dl_16D8:
symbol: d_course_luigi_raceway_dl_16D8
type: gfx
offset: 0x16D8
otr_mode: index
d_course_luigi_raceway_dl_1888:
symbol: d_course_luigi_raceway_dl_1888
type: gfx
offset: 0x1888
otr_mode: index
d_course_luigi_raceway_dl_1B00:
symbol: d_course_luigi_raceway_dl_1B00
type: gfx
offset: 0x1B00
otr_mode: index
d_course_luigi_raceway_dl_1C78:
symbol: d_course_luigi_raceway_dl_1C78
type: gfx
offset: 0x1C78
otr_mode: index
d_course_luigi_raceway_dl_1E30:
symbol: d_course_luigi_raceway_dl_1E30
type: gfx
offset: 0x1E30
otr_mode: index
d_course_luigi_raceway_dl_1FD0:
symbol: d_course_luigi_raceway_dl_1FD0
type: gfx
offset: 0x1FD0
otr_mode: index
d_course_luigi_raceway_dl_2240:
symbol: d_course_luigi_raceway_dl_2240
type: gfx
offset: 0x2240
otr_mode: index
d_course_luigi_raceway_dl_2348:
symbol: d_course_luigi_raceway_dl_2348
type: gfx
offset: 0x2348
otr_mode: index
d_course_luigi_raceway_dl_2518:
symbol: d_course_luigi_raceway_dl_2518
type: gfx
offset: 0x2518
otr_mode: index
d_course_luigi_raceway_dl_2658:
symbol: d_course_luigi_raceway_dl_2658
type: gfx
offset: 0x2658
otr_mode: index
d_course_luigi_raceway_dl_2860:
symbol: d_course_luigi_raceway_dl_2860
type: gfx
offset: 0x2860
otr_mode: index
d_course_luigi_raceway_dl_2978:
symbol: d_course_luigi_raceway_dl_2978
type: gfx
offset: 0x2978
otr_mode: index
d_course_luigi_raceway_dl_2BC0:
symbol: d_course_luigi_raceway_dl_2BC0
type: gfx
offset: 0x2BC0
otr_mode: index
d_course_luigi_raceway_dl_2D00:
symbol: d_course_luigi_raceway_dl_2D00
type: gfx
offset: 0x2D00
otr_mode: index
d_course_luigi_raceway_dl_2F08:
symbol: d_course_luigi_raceway_dl_2F08
type: gfx
offset: 0x2F08
otr_mode: index
d_course_luigi_raceway_dl_2FF8:
symbol: d_course_luigi_raceway_dl_2FF8
type: gfx
offset: 0x2FF8
otr_mode: index
d_course_luigi_raceway_dl_32C0:
symbol: d_course_luigi_raceway_dl_32C0
type: gfx
offset: 0x32C0
otr_mode: index
d_course_luigi_raceway_dl_3408:
symbol: d_course_luigi_raceway_dl_3408
type: gfx
offset: 0x3408
otr_mode: index
d_course_luigi_raceway_dl_3610:
symbol: d_course_luigi_raceway_dl_3610
type: gfx
offset: 0x3610
otr_mode: index
d_course_luigi_raceway_dl_36A8:
symbol: d_course_luigi_raceway_dl_36A8
type: gfx
offset: 0x36A8
otr_mode: index
d_course_luigi_raceway_dl_3928:
symbol: d_course_luigi_raceway_dl_3928
type: gfx
offset: 0x3928
otr_mode: index
d_course_luigi_raceway_dl_3AB0:
symbol: d_course_luigi_raceway_dl_3AB0
type: gfx
offset: 0x3AB0
otr_mode: index
d_course_luigi_raceway_dl_3C18:
symbol: d_course_luigi_raceway_dl_3C18
type: gfx
offset: 0x3C18
otr_mode: index
d_course_luigi_raceway_dl_3CA0:
symbol: d_course_luigi_raceway_dl_3CA0
type: gfx
offset: 0x3CA0
otr_mode: index
d_course_luigi_raceway_dl_3EB0:
symbol: d_course_luigi_raceway_dl_3EB0
type: gfx
offset: 0x3EB0
otr_mode: index
d_course_luigi_raceway_dl_4058:
symbol: d_course_luigi_raceway_dl_4058
type: gfx
offset: 0x4058
otr_mode: index
d_course_luigi_raceway_dl_4198:
symbol: d_course_luigi_raceway_dl_4198
type: gfx
offset: 0x4198
otr_mode: index
d_course_luigi_raceway_dl_4240:
symbol: d_course_luigi_raceway_dl_4240
type: gfx
offset: 0x4240
otr_mode: index
d_course_luigi_raceway_dl_4440:
symbol: d_course_luigi_raceway_dl_4440
type: gfx
offset: 0x4440
otr_mode: index
d_course_luigi_raceway_dl_4638:
symbol: d_course_luigi_raceway_dl_4638
type: gfx
offset: 0x4638
otr_mode: index
d_course_luigi_raceway_dl_4720:
symbol: d_course_luigi_raceway_dl_4720
type: gfx
offset: 0x4720
otr_mode: index
d_course_luigi_raceway_dl_4828:
symbol: d_course_luigi_raceway_dl_4828
type: gfx
offset: 0x4828
otr_mode: index
d_course_luigi_raceway_dl_4A18:
symbol: d_course_luigi_raceway_dl_4A18
type: gfx
offset: 0x4A18
otr_mode: index
d_course_luigi_raceway_dl_4C60:
symbol: d_course_luigi_raceway_dl_4C60
type: gfx
offset: 0x4C60
otr_mode: index
d_course_luigi_raceway_dl_4CF8:
symbol: d_course_luigi_raceway_dl_4CF8
type: gfx
offset: 0x4CF8
otr_mode: index
d_course_luigi_raceway_dl_4E38:
symbol: d_course_luigi_raceway_dl_4E38
type: gfx
offset: 0x4E38
otr_mode: index
d_course_luigi_raceway_dl_4FD8:
symbol: d_course_luigi_raceway_dl_4FD8
type: gfx
offset: 0x4FD8
otr_mode: index
d_course_luigi_raceway_dl_5220:
symbol: d_course_luigi_raceway_dl_5220
type: gfx
offset: 0x5220
otr_mode: index
d_course_luigi_raceway_dl_52D0:
symbol: d_course_luigi_raceway_dl_52D0
type: gfx
offset: 0x52D0
otr_mode: index
d_course_luigi_raceway_dl_5420:
symbol: d_course_luigi_raceway_dl_5420
type: gfx
offset: 0x5420
otr_mode: index
d_course_luigi_raceway_dl_5558:
symbol: d_course_luigi_raceway_dl_5558
type: gfx
offset: 0x5558
otr_mode: index
d_course_luigi_raceway_dl_5728:
symbol: d_course_luigi_raceway_dl_5728
type: gfx
offset: 0x5728
otr_mode: index
d_course_luigi_raceway_dl_57F8:
symbol: d_course_luigi_raceway_dl_57F8
type: gfx
offset: 0x57F8
otr_mode: index
d_course_luigi_raceway_dl_5940:
symbol: d_course_luigi_raceway_dl_5940
type: gfx
offset: 0x5940
otr_mode: index
d_course_luigi_raceway_dl_5A60:
symbol: d_course_luigi_raceway_dl_5A60
type: gfx
offset: 0x5A60
otr_mode: index
d_course_luigi_raceway_dl_5BA0:
symbol: d_course_luigi_raceway_dl_5BA0
type: gfx
offset: 0x5BA0
otr_mode: index
d_course_luigi_raceway_dl_5CB8:
symbol: d_course_luigi_raceway_dl_5CB8
type: gfx
offset: 0x5CB8
otr_mode: index
d_course_luigi_raceway_dl_5E10:
symbol: d_course_luigi_raceway_dl_5E10
type: gfx
offset: 0x5E10
otr_mode: index
d_course_luigi_raceway_dl_5F08:
symbol: d_course_luigi_raceway_dl_5F08
type: gfx
offset: 0x5F08
otr_mode: index
d_course_luigi_raceway_dl_6018:
symbol: d_course_luigi_raceway_dl_6018
type: gfx
offset: 0x6018
otr_mode: index
d_course_luigi_raceway_dl_6150:
symbol: d_course_luigi_raceway_dl_6150
type: gfx
offset: 0x6150
otr_mode: index
d_course_luigi_raceway_dl_6288:
symbol: d_course_luigi_raceway_dl_6288
type: gfx
offset: 0x6288
otr_mode: index
d_course_luigi_raceway_dl_6350:
symbol: d_course_luigi_raceway_dl_6350
type: gfx
offset: 0x6350
otr_mode: index
d_course_luigi_raceway_dl_6400:
symbol: d_course_luigi_raceway_dl_6400
type: gfx
offset: 0x6400
otr_mode: index
d_course_luigi_raceway_dl_6558:
symbol: d_course_luigi_raceway_dl_6558
type: gfx
offset: 0x6558
otr_mode: index
d_course_luigi_raceway_dl_65B0:
symbol: d_course_luigi_raceway_dl_65B0
type: gfx
offset: 0x65B0
otr_mode: index
d_course_luigi_raceway_dl_6608:
symbol: d_course_luigi_raceway_dl_6608
type: gfx
offset: 0x6608
otr_mode: index
d_course_luigi_raceway_dl_6658:
symbol: d_course_luigi_raceway_dl_6658
type: gfx
offset: 0x6658
otr_mode: index
d_course_luigi_raceway_dl_66B8:
symbol: d_course_luigi_raceway_dl_66B8
type: gfx
offset: 0x66B8
otr_mode: index
d_course_luigi_raceway_dl_6708:
symbol: d_course_luigi_raceway_dl_6708
type: gfx
offset: 0x6708
otr_mode: index
d_course_luigi_raceway_dl_67A0:
symbol: d_course_luigi_raceway_dl_67A0
type: gfx
offset: 0x67A0
otr_mode: index
d_course_luigi_raceway_dl_6810:
symbol: d_course_luigi_raceway_dl_6810
type: gfx
offset: 0x6810
otr_mode: index
d_course_luigi_raceway_dl_68C0:
symbol: d_course_luigi_raceway_dl_68C0
type: gfx
offset: 0x68C0
otr_mode: index
d_course_luigi_raceway_dl_6930:
symbol: d_course_luigi_raceway_dl_6930
type: gfx
offset: 0x6930
otr_mode: index
d_course_luigi_raceway_dl_6A00:
symbol: d_course_luigi_raceway_dl_6A00
type: gfx
offset: 0x6A00
otr_mode: index
d_course_luigi_raceway_dl_6A90:
symbol: d_course_luigi_raceway_dl_6A90
type: gfx
offset: 0x6A90
otr_mode: index
d_course_luigi_raceway_dl_6B58:
symbol: d_course_luigi_raceway_dl_6B58
type: gfx
offset: 0x6B58
otr_mode: index
d_course_luigi_raceway_dl_6C40:
symbol: d_course_luigi_raceway_dl_6C40
type: gfx
offset: 0x6C40
otr_mode: index
d_course_luigi_raceway_dl_6DA0:
symbol: d_course_luigi_raceway_dl_6DA0
type: gfx
offset: 0x6DA0
otr_mode: index
d_course_luigi_raceway_dl_6EB0:
symbol: d_course_luigi_raceway_dl_6EB0
type: gfx
offset: 0x6EB0
otr_mode: index
d_course_luigi_raceway_dl_6FF0:
symbol: d_course_luigi_raceway_dl_6FF0
type: gfx
offset: 0x6FF0
otr_mode: index
d_course_luigi_raceway_dl_7110:
symbol: d_course_luigi_raceway_dl_7110
type: gfx
offset: 0x7110
otr_mode: index
d_course_luigi_raceway_dl_7248:
symbol: d_course_luigi_raceway_dl_7248
type: gfx
offset: 0x7248
otr_mode: index
d_course_luigi_raceway_dl_7388:
symbol: d_course_luigi_raceway_dl_7388
type: gfx
offset: 0x7388
otr_mode: index
d_course_luigi_raceway_dl_74B0:
symbol: d_course_luigi_raceway_dl_74B0
type: gfx
offset: 0x74B0
otr_mode: index
d_course_luigi_raceway_dl_75F0:
symbol: d_course_luigi_raceway_dl_75F0
type: gfx
offset: 0x75F0
otr_mode: index
d_course_luigi_raceway_dl_7750:
symbol: d_course_luigi_raceway_dl_7750
type: gfx
offset: 0x7750
otr_mode: index
d_course_luigi_raceway_dl_7928:
symbol: d_course_luigi_raceway_dl_7928
type: gfx
offset: 0x7928
otr_mode: index
d_course_luigi_raceway_dl_7A18:
symbol: d_course_luigi_raceway_dl_7A18
type: gfx
offset: 0x7A18
otr_mode: index
d_course_luigi_raceway_dl_7BB0:
symbol: d_course_luigi_raceway_dl_7BB0
type: gfx
offset: 0x7BB0
otr_mode: index
d_course_luigi_raceway_dl_7CD0:
symbol: d_course_luigi_raceway_dl_7CD0
type: gfx
offset: 0x7CD0
otr_mode: index
d_course_luigi_raceway_dl_7EE8:
symbol: d_course_luigi_raceway_dl_7EE8
type: gfx
offset: 0x7EE8
otr_mode: index
d_course_luigi_raceway_dl_7FA0:
symbol: d_course_luigi_raceway_dl_7FA0
type: gfx
offset: 0x7FA0
otr_mode: index
d_course_luigi_raceway_dl_8158:
symbol: d_course_luigi_raceway_dl_8158
type: gfx
offset: 0x8158
otr_mode: index
d_course_luigi_raceway_dl_8260:
symbol: d_course_luigi_raceway_dl_8260
type: gfx
offset: 0x8260
otr_mode: index
d_course_luigi_raceway_dl_8450:
symbol: d_course_luigi_raceway_dl_8450
type: gfx
offset: 0x8450
otr_mode: index
d_course_luigi_raceway_dl_8508:
symbol: d_course_luigi_raceway_dl_8508
type: gfx
offset: 0x8508
otr_mode: index
d_course_luigi_raceway_dl_86F8:
symbol: d_course_luigi_raceway_dl_86F8
type: gfx
offset: 0x86F8
otr_mode: index
d_course_luigi_raceway_dl_8790:
symbol: d_course_luigi_raceway_dl_8790
type: gfx
offset: 0x8790
otr_mode: index
d_course_luigi_raceway_dl_8958:
symbol: d_course_luigi_raceway_dl_8958
type: gfx
offset: 0x8958
otr_mode: index
d_course_luigi_raceway_dl_8A70:
symbol: d_course_luigi_raceway_dl_8A70
type: gfx
offset: 0x8A70
otr_mode: index
d_course_luigi_raceway_dl_8CC8:
symbol: d_course_luigi_raceway_dl_8CC8
type: gfx
offset: 0x8CC8
otr_mode: index
d_course_luigi_raceway_dl_8D68:
symbol: d_course_luigi_raceway_dl_8D68
type: gfx
offset: 0x8D68
otr_mode: index
d_course_luigi_raceway_dl_8F00:
symbol: d_course_luigi_raceway_dl_8F00
type: gfx
offset: 0x8F00
otr_mode: index
d_course_luigi_raceway_dl_9058:
symbol: d_course_luigi_raceway_dl_9058
type: gfx
offset: 0x9058
otr_mode: index
d_course_luigi_raceway_dl_9310:
symbol: d_course_luigi_raceway_dl_9310
type: gfx
offset: 0x9310
otr_mode: index
d_course_luigi_raceway_dl_9408:
symbol: d_course_luigi_raceway_dl_9408
type: gfx
offset: 0x9408
otr_mode: index
d_course_luigi_raceway_dl_95A0:
symbol: d_course_luigi_raceway_dl_95A0
type: gfx
offset: 0x95A0
otr_mode: index
d_course_luigi_raceway_dl_97B0:
symbol: d_course_luigi_raceway_dl_97B0
type: gfx
offset: 0x97B0
otr_mode: index
d_course_luigi_raceway_dl_99C0:
symbol: d_course_luigi_raceway_dl_99C0
type: gfx
offset: 0x99C0
otr_mode: index
d_course_luigi_raceway_dl_9AD0:
symbol: d_course_luigi_raceway_dl_9AD0
type: gfx
offset: 0x9AD0
otr_mode: index
d_course_luigi_raceway_dl_9C50:
symbol: d_course_luigi_raceway_dl_9C50
type: gfx
offset: 0x9C50
otr_mode: index
d_course_luigi_raceway_dl_9E58:
symbol: d_course_luigi_raceway_dl_9E58
type: gfx
offset: 0x9E58
otr_mode: index
d_course_luigi_raceway_dl_A028:
symbol: d_course_luigi_raceway_dl_A028
type: gfx
offset: 0xA028
otr_mode: index
d_course_luigi_raceway_dl_A178:
symbol: d_course_luigi_raceway_dl_A178
type: gfx
offset: 0xA178
otr_mode: index
d_course_luigi_raceway_dl_A320:
symbol: d_course_luigi_raceway_dl_A320
type: gfx
offset: 0xA320
otr_mode: index
d_course_luigi_raceway_unknown_waypoints:
symbol: d_course_luigi_raceway_unknown_waypoints
offset: 0xA540
count: 50
type: mk64:TRACK_WAYPOINTS
d_course_luigi_raceway_track_waypoints:
symbol: d_course_luigi_raceway_track_waypoints
offset: 0xA6D0
count: 632
type: mk64:TRACK_WAYPOINTS
d_course_luigi_raceway_basket_model_lod2:
symbol: d_course_luigi_raceway_basket_model_lod2
type: vtx
offset: 0xBA90
count: 16
d_course_luigi_raceway_unknown_model1:
symbol: d_course_luigi_raceway_unknown_model1
type: vtx
offset: 0xBB90
count: 20
d_course_luigi_raceway_unknown_model2:
symbol: d_course_luigi_raceway_unknown_model2
type: vtx
offset: 0xBCD0
count: 32
d_course_luigi_raceway_unknown_model3:
symbol: d_course_luigi_raceway_unknown_model3
type: vtx
offset: 0xBED0
count: 36
d_course_luigi_raceway_unknown_model4:
symbol: d_course_luigi_raceway_unknown_model4
type: vtx
offset: 0xC0D0
count: 12
d_course_luigi_raceway_unknown_model5:
symbol: d_course_luigi_raceway_unknown_model5
type: vtx
offset: 0xC1F0
count: 12
d_course_luigi_raceway_light1:
symbol: d_course_luigi_raceway_light1
type: lights
offset: 0xC3A0
d_course_luigi_raceway_basket_model_lod1:
symbol: d_course_luigi_raceway_basket_model_lod1
type: vtx
offset: 0xC3B8
count: 4
d_course_luigi_raceway_unknown_model6:
symbol: d_course_luigi_raceway_unknown_model6
type: vtx
offset: 0xC3F8
count: 12
d_course_luigi_raceway_unknown_model7:
symbol: d_course_luigi_raceway_unknown_model7
type: vtx
offset: 0xC4B8
count: 6
d_course_luigi_raceway_unknown_model8:
symbol: d_course_luigi_raceway_unknown_model8
type: vtx
offset: 0xC518
count: 7
d_course_luigi_raceway_sign_left:
symbol: d_course_luigi_raceway_sign_left
type: texture
offset: 0xC588
width: 32
height: 64
format: rgba16
ctype: u16
d_course_luigi_raceway_sign_right:
symbol: d_course_luigi_raceway_sign_right
type: texture
offset: 0xD588
width: 32
height: 64
format: rgba16
ctype: u16
d_course_luigi_raceway_balloon_basket:
symbol: d_course_luigi_raceway_balloon_basket
type: texture
offset: 0xE588
width: 32
height: 32
format: rgba16
ctype: u16
d_course_luigi_raceway_balloon_rope:
symbol: d_course_luigi_raceway_balloon_rope
type: texture
offset: 0xED88
width: 32
height: 32
format: rgba16
ctype: u16
d_course_luigi_raceway_dl_F588:
symbol: d_course_luigi_raceway_dl_F588
type: gfx
offset: 0xF588
d_course_luigi_raceway_dl_F630:
symbol: d_course_luigi_raceway_dl_F630
type: gfx
offset: 0xF630
d_course_luigi_raceway_dl_F640:
symbol: d_course_luigi_raceway_dl_F640
type: gfx
offset: 0xF640
d_course_luigi_raceway_dl_F650:
symbol: d_course_luigi_raceway_dl_F650
type: gfx
offset: 0xF650
d_course_luigi_raceway_dl_F660:
symbol: d_course_luigi_raceway_dl_F660
type: gfx
offset: 0xF660
d_course_luigi_raceway_dl_F718:
symbol: d_course_luigi_raceway_dl_F718
type: gfx
offset: 0xF718
d_course_luigi_raceway_dl_F728:
symbol: d_course_luigi_raceway_dl_F728
type: gfx
offset: 0xF728
d_course_luigi_raceway_dl_F938:
symbol: d_course_luigi_raceway_dl_F938
type: gfx
offset: 0xF938
d_course_luigi_raceway_dl_F948:
symbol: d_course_luigi_raceway_dl_F948
type: gfx
offset: 0xF948
d_course_luigi_raceway_dl_F960:
symbol: d_course_luigi_raceway_dl_F960
type: gfx
offset: 0xF960
d_course_luigi_raceway_dl_F970:
symbol: d_course_luigi_raceway_dl_F970
type: gfx
offset: 0xF970
d_course_luigi_raceway_dl_FA00:
symbol: d_course_luigi_raceway_dl_FA00
type: gfx
offset: 0xFA00
d_course_luigi_raceway_dl_FA10:
symbol: d_course_luigi_raceway_dl_FA10
type: gfx
offset: 0xFA10
d_course_luigi_raceway_dl_FA20:
symbol: d_course_luigi_raceway_dl_FA20
type: gfx
offset: 0xFA20
d_course_luigi_raceway_dl_FA30:
symbol: d_course_luigi_raceway_dl_FA30
type: gfx
offset: 0xFA30
d_course_luigi_raceway_dl_FB10:
symbol: d_course_luigi_raceway_dl_FB10
type: gfx
offset: 0xFB10
d_course_luigi_raceway_dl_FB20:
symbol: d_course_luigi_raceway_dl_FB20
type: gfx
offset: 0xFB20
d_course_luigi_raceway_dl_FBB8:
symbol: d_course_luigi_raceway_dl_FBB8
type: gfx
offset: 0xFBB8
d_course_luigi_raceway_dl_FBC8:
symbol: d_course_luigi_raceway_dl_FBC8
type: gfx
offset: 0xFBC8
d_course_luigi_raceway_dl_FBE0:
symbol: d_course_luigi_raceway_dl_FBE0
type: gfx
offset: 0xFBE0
d_course_luigi_raceway_tree_model:
symbol: d_course_luigi_raceway_tree_model
type: vtx
offset: 0xFBF0
count: 8
d_course_luigi_raceway_dl_FC70:
symbol: d_course_luigi_raceway_dl_FC70
type: gfx
offset: 0xFC70
d_course_luigi_raceway_dl_FD40:
symbol: d_course_luigi_raceway_dl_FD40
type: gfx
offset: 0xFD40
d_course_luigi_raceway_item_box_spawns:
symbol: d_course_luigi_raceway_item_box_spawns
type: mk64:spawn_data
count: 19
offset: 0xFDE8
d_course_luigi_raceway_tree_spawn:
symbol: d_course_luigi_raceway_tree_spawn
type: mk64:spawn_data
count: 21
offset: 0xFE80
d_course_luigi_raceway_addr:
symbol: d_course_luigi_raceway_addr
type: mk64:track_sections
offset: 0xFF28
count: 113

View File

@ -0,0 +1,17 @@
:config:
vram:
addr: 0x800E8700 # not used for anything
offset: 0x907E40
no_compression: true
header:
code:
- '#include <libultraship.h>'
header:
- '#include <libultraship.h>'
- '#include <libultra/gbi.h>'
- '#include <align_asset_macro.h>'
d_course_mario_raceway_packed_dls:
symbol: d_course_luigi_raceway_packed_dls
type: blob
offset: 0x907E40
size: 0x35A0

View File

@ -1,7 +1,6 @@
:config:
segments:
- [0x0F, 0x8FE640]
no_compression: true
header:
code:
- '#include <libultraship.h>'