summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
authorMegaMech <MegaMech@users.noreply.github.com>2025-12-30 11:36:08 -0700
committerGitHub <noreply@github.com>2025-12-30 11:36:08 -0700
commit89c747b35f71f753cdeef20c8903152a531c8e27 (patch)
tree6648db844bc5d5597db41b395607c4942b44b000 /docs
parent2acbac7a378f029dfdaca4c4e8c049c8afe2cad3 (diff)
Docs (#615)
* aaa * New menus
Diffstat (limited to 'docs')
-rw-r--r--docs/basics/basicconcepts.md105
-rw-r--r--docs/basics/compiling.md107
-rw-r--r--docs/basics/controlflow.md138
-rw-r--r--docs/basics/placeholder.pngbin6761 -> 0 bytes
-rw-r--r--docs/basics/terminology.md21
-rw-r--r--docs/characters/charactermenu.md24
-rw-r--r--docs/characters/overview.md54
-rw-r--r--docs/mainpage.md40
-rw-r--r--docs/track_returns.md4
-rw-r--r--docs/tracks/export.md54
-rw-r--r--docs/tracks/image-1.pngbin0 -> 24991 bytes
-rw-r--r--docs/tracks/image-10.pngbin0 -> 36798 bytes
-rw-r--r--docs/tracks/image-11.pngbin0 -> 41873 bytes
-rw-r--r--docs/tracks/image-12.pngbin0 -> 21180 bytes
-rw-r--r--docs/tracks/image-13.pngbin0 -> 14595 bytes
-rw-r--r--docs/tracks/image-14.pngbin0 -> 12562 bytes
-rw-r--r--docs/tracks/image-15.pngbin0 -> 9397 bytes
-rw-r--r--docs/tracks/image-16.pngbin0 -> 96789 bytes
-rw-r--r--docs/tracks/image-17.pngbin0 -> 254468 bytes
-rw-r--r--docs/tracks/image-18.pngbin0 -> 109826 bytes
-rw-r--r--docs/tracks/image-19.pngbin0 -> 12517 bytes
-rw-r--r--docs/tracks/image-2.pngbin0 -> 21024 bytes
-rw-r--r--docs/tracks/image-20.pngbin0 -> 23565 bytes
-rw-r--r--docs/tracks/image-21.pngbin0 -> 74863 bytes
-rw-r--r--docs/tracks/image-3.pngbin0 -> 451 bytes
-rw-r--r--docs/tracks/image-4.pngbin0 -> 460 bytes
-rw-r--r--docs/tracks/image-5.pngbin0 -> 5765 bytes
-rw-r--r--docs/tracks/image-6.pngbin0 -> 31598 bytes
-rw-r--r--docs/tracks/image-7.pngbin0 -> 32973 bytes
-rw-r--r--docs/tracks/image-8.pngbin0 -> 144992 bytes
-rw-r--r--docs/tracks/image-9.pngbin0 -> 47570 bytes
-rw-r--r--docs/tracks/image.pngbin0 -> 26049 bytes
-rw-r--r--docs/tracks/import.md47
-rw-r--r--docs/tracks/materials.md8
-rw-r--r--docs/tracks/minimap.md47
-rw-r--r--docs/tracks/overview.md (renamed from docs/custom-track.md)39
-rw-r--r--docs/tracks/quick.md39
-rw-r--r--docs/tracks/setup.md29
-rw-r--r--docs/tracks/track-properties.md22
-rw-r--r--docs/tracks/trackmenu.md145
-rw-r--r--docs/tracks/troubleshooting.md60
41 files changed, 540 insertions, 443 deletions
diff --git a/docs/basics/basicconcepts.md b/docs/basics/basicconcepts.md
deleted file mode 100644
index f5b2d555b..000000000
--- a/docs/basics/basicconcepts.md
+++ /dev/null
@@ -1,105 +0,0 @@
-@page concepts Basic Concepts
-See [terminology](terminology.html) for explanations of terms.
-
-# Addresses
-Computers use addresses to jump through code. This works similar to a house number.
-* A house contains a series of instructions or some data (ex. a texture).
-* A house can contain more jumps.
-* When business in a house completes, the computer jumps to the last house it was in.
-* The program execution completes when there are no more branches left.
-* Programs run in a big infinite loop so it cannot run out of branches.
-* A program may be imagined as a big spaghetti monster.
-* Note that n64 only runs one command/thread at a time.
-
-A typical N64 address: `0x80160158`
-
-In an N64 program, addresses begin at `0x80000000`. As you create code, data, and the like, the compiler will add onto this base number and assign variables to an address.
-```c
-s32 a = 2; // 0x80000004
-s32 b = 7; // 0x80000008
-s32 c = 5; // 0x8000000C
-s32 d = 1; // 0x80000010
-s32 e = 3; // 0x80000014
-```
-Replacing a variable with a hard-coded address grabs the value at that address.
-```c
-print(0x80000004); // or
-print(a);
-```
-Both would output `2`. This allows some trickery. Such as pointer math: `print(0x800000004 + 0x80000004)` would output `7`.
-Pointers may be similarily influenced: `&a + 4` results in `0x800000008` thus printing the value at `b`.
-
-The compiler may `align` or offset variables to certain addresses. Generally, certain types of data is aligned to 0x10.
-
-If `c` were placed in a new file, the compiler would place `c` at `0x80000010` and `e` would be placed at `0x80000020`.
-
-Data can take up tonnes of space:
-```
-Texture a_texture[] = {
- 0x01, 0x0A, 0xAA, 0x34, 0x23, // Imagine five-hundred lines of this
-};
-```
-The address of this could extend from `0x80000100` to `0x800000534`. However, you would not see data begin at `0x80000533`. The compiler generally aligns objects to 4, 8, 0xC, or 0x10. With the exception being when you're working with s16 and s8. If you have:
-```c
-s16 a = 3; // Value compiled to 0x0003
-s32 b = 5; // Value compiled to 0x00000005
-```
-In a hexadecimal editor you may expect to see this: `000300000005` or `0x0003 0x00000005` But actually, it will be this:
-```
-0003000000000005 or 0x0003 0x0000 0x00000005
-```
-The compiler aligned `b` to the nearest 0x4. If there were two s16's then the blank `0x0000` will be used.
-
-# How Errors Happen
-The maximum value of an s8 (0x00) is 0xFF or 255. `0xFF + 1 = 0x100` imagine this scenario:
-```c
-s8 a = 1;
-s8 b = 2;
-s8 c = 3;
-s8 d = 255;
-f32 e = 5.0f;
-```
-If `d` was set to 0x100, the final `0` would be written to the first bit of `e`. This could result in an invalid float value or perhaps flipping the signedness of an s32 (from negative to positive and vice-versa).
-
-Issues such as this could result in glitches or crashes. Once humble math calculating to immeasurable values.
-
-## Array Overflows
-In the below example, my_func writes a value at the fifth index which does not exist. This results in writing 5.0f into the next variable lkely resulting in a crash. Array overflows may be easy to miss in complex programs and sometimes only crash on rare occasion.
-```
-f32 myArray[4] = {8.0f, 3.0f, 9.0f, 1.0f};
-
-void my_func(index) {
- myArray[index] = 5.0f;
-}
-my_func(5);
-```
-
-# Code
-Code contains addresses too. Lets take a look at some example assembly:
-```
-glabel entry_point
-/* 001000 80000400 3C08800F */ lui $t0, %hi(_mainSegmentEnd) # $t0, 0x800f
-/* 001004 80000404 3C09000A */ lui $t1, (0x000A0FC0 >> 16) # lui $t1, 0xa
-/* 001008 80000408 25086910 */ addiu $t0, %lo(_mainSegmentEnd) # addiu $t0, $t0, 0x6910
-/* 00100C 8000040C 35290FC0 */ ori $t1, (0x000A0FC0 & 0xFFFF) # ori $t1, $t1, 0xfc0
-.L80000410:
-/* 001010 80000410 2129FFF8 */ addi $t1, $t1, -8
-/* 001014 80000414 AD000000 */ sw $zero, ($t0)
-/* 001018 80000418 AD000004 */ sw $zero, 4($t0)
-```
-Format: `rom address (file on disc), ram address, machine-code, assembly, arguments/parameters`
-
-The `lui, addiu, ori, etc.` are just representations of the machine-code. For example: `0x3C08800F` is what the cpu is actually running. Lets break down this one command:
-`op-code, parameters`
-0x3C is the op-code (lui or load-upper-immediate) this command loads an address. The `08` tells the CPU to use the register `t0` and the `0x800F` is the first-half of the address to load. So, in the register t0 (which is the size of an int: 0x00000000) the value `0x800F0000` is written.
-
-Note that one machine-code command is the size of an int/s32/word. How do we load an address (which is the size of an int). There isn't enough room when you include the op-code and register: `0x3C08800F6990`. That no worky. As such, loading data at an address requires two commands. The first half of the address is called a hi and the second half is called a lo:
-```
-/* 001008 80000408 25086910 */ addiu $t0, %lo(_mainSegmentEnd) # addiu $t0, $t0, 0x6910
-```
-Now, we're going to *add* the *offset*: `t0: 0x800F0000 + 0x6910 = 0x800F6910`.
-If you run the game and use a memory viewer at this location. You will quickly realize this region of data (it's actually .bss but lets not get into that), is the controller data. The data alters to reflect which controller buttons are pressed. So if I just wanted to read one of these values, the cpu will run two commands to put the address into the register. Then another command can read the address in that register to receive the value at that location. This value can be compared to see if the button is active. Ex. zero might mean not pressed, whereas one might mean pressed.
-
-Now, earlier it was mentioned that code contains addresses. If I wanted to, I could do this: `Jump to: 0x80000410`. Which would make the CPU start running code at that location. Or I could read the value that exists there: `0x2129FFF8`. Not sure what I might do with that number, but it does act like a normal number. In decimal it is: `556,400,632`. I could add and subtract to it (Which would likely crash the game if it tried to run that command after). Now, jumping to any code address in the middle of a function would almost certainly crash the game or result in strange behaviour. The purpose of this explanation is really to show that everything is just a bunch of numbers or values, represented by an address. Even the code itself.
-
-For a more refined explanation of addresses and pointers its suggested to use the Googles. However, this explanation was written with the N64 in-mind.
diff --git a/docs/basics/compiling.md b/docs/basics/compiling.md
deleted file mode 100644
index 1cfd50c94..000000000
--- a/docs/basics/compiling.md
+++ /dev/null
@@ -1,107 +0,0 @@
-@page compiling Installing mk64 Decomp
-# Build Instructions
-The build system has the following package requirements:
-
- binutils-mips >= 2.27
- python3 >= 3.6
- libaudiofile
-
-[TOC]
-
-To add submodules run `git submodule update --init --recursive` after cloning.
-
-Run `make assets` to extract assets.
-
-# Linux
-
-### Ubuntu
-
-```bash
-sudo apt install cmake build-essential pkg-config git binutils-mips-linux-gnu python3 zlib1g-dev libaudiofile-dev libcapstone-dev
-```
-
-### Fedora
-
-```bash
-sudo dnf install make automake gcc gcc-c++ kernel-devel cmake pkg-config git python3 zlib-devel audiofile-devel capstone
-```
-and install [gcc toolchain of libdragon](https://github.com/DragonMinded/libdragon/releases/tag/toolchain-continuous-prerelease) and add `export PATH="/opt/libdragon/bin:$PATH"` to ~/.bashrc
-
-### Arch
-
-```bash
-sudo pacman -S base-devel capstone python
-```
-Install the following AUR package:
-* [mips64-elf-binutils](https://aur.archlinux.org/packages/mips64-elf-binutils) (AUR)
-
-Review the [n64decomp/sm64](https://github.com/n64decomp/sm64) readme for instructions to compile in other distributions.
-
-# Windows
-
-- Clone the repo or download the zip.
-- Download and extract the toolchain from [here](https://github.com/coco875/mk64-tools/releases/download/v0.0.8/mips-tools-chain-windows.zip)
-
-### Setup
-- Place the `mingw64` folder from the toolchain into the tools folder like so: `mk64/tools/mingw64`.
-- Open a terminal (cmd or powershell) in the repo folder and run `"tools\mingw64\w64devkit.exe"` and after `make assets && make -j`
-- Wait for the build to finish and Enjoy!
-
-# macOS
-
-Install [Homebrew](https://brew.sh), then install the following dependencies:
-```bash
-brew update
-brew install python3 capstone coreutils make pkg-config tehzz/n64-dev/mips64-elf-binutils
-```
-
-Build using `gmake` ensuring homebrew `make` is used instead of the old macOS system `make`.
-
-# Docker
-
-Build the Docker image:
-```bash
-docker build -t mk64 .
-```
-
-When building and using other tools, append the following in front of every command you run:
-```bash
-docker run --rm -v .:/mk64 mk64
-```
-
-For example:
-```bash
-docker run --rm -v .:/mk64 mk64 make
-```
-
-# Building US
-
-Place a US version of Mario Kart 64 called `baserom.us.z64` into the project folder for asset extraction.
-
-Run the following commands after pulling:
-```bash
-make -j
-```
-
-# Building EU
-
-Building EU requires US to be built first. See above.
-
-mk64 decomp supports two EU versions
-* EU 1.0 `eu-1.0`
-* EU 1.1 `eu-final`
-
-Build using
-```bash
-make -j VERSION=eu-1.0
-```
-or
-```bash
-make -j VERSION=eu-final
-```
-
-First-diff/diff commands for EU
-```bash
-python3 first-diff.py --eu
-./diff <function> -eu
-``` \ No newline at end of file
diff --git a/docs/basics/controlflow.md b/docs/basics/controlflow.md
deleted file mode 100644
index 2583a270b..000000000
--- a/docs/basics/controlflow.md
+++ /dev/null
@@ -1,138 +0,0 @@
-@page controlflow Codebase Overview
-
-[TOC]
-
-# Paradigm
-The developers wrote mk64 using a state-driven paradigm. Gamestate, gamemode, track, actors, structs, and more decide which branches code should follow. As an example, a condition can check the current track to load and then load that tracks resources or run logic based on that.
-
-# Threading
-After boot, the game begins by setting up its four threads; [idle](@ref thread1_idle), [video](@ref thread3_video), [audio](@ref thread4_audio), and the [game loop](@ref thread5_game_loop).
-
-The [idle thread](@ref thread1_idle) allows the cpu to sleep. Without it, if at any time execution of all threads were paused, the cpu would never be able to continue. The idle thread is active if all the other threads are paused.
-
-As such, the [idle thread](@ref thread1_idle) runs the following loop: `while(true);` (it runs in a perpetual loop of nothing; sleep). In mips assembly it looks like this:
-```
-.L800005B8:
-b .L800005B8
-nop
-```
-b stands for branch which acts akin to a goto. In this case, branch to the label `.L800005B8`. This creates an infinite loop. Whenever the cpu branches it always runs the next instruction as well which is called a delay slot. This means the cpu will continuously branch then run `nop` or `no operation` with no method of escaping the loop (except for when another thread has a higher priority which means the cpu switches to that thread and stops running the idle thread).
-
-N64 threads are ran based on priority running whichever thread holds the most of it. Threads can also pause and wait for events. Note that the N64 is not multi-threaded by modern standards as the other threads contain specific purposes which slightly differs from the concept of splitting a single program into multiple processes for efficiency.
-
-# Overall Control Flow
-order of initialisation of thread:
-boot:
-* init_threads:<br />
- * [idle](@ref thread1_idle), [video](@ref thread3_video), [audio](@ref thread4_audio), [game loop](@ref thread5_game_loop)<br />
-* [game loop](@ref thread5_game_loop):<br />
- * [audio](@ref thread4_audio)<br />
- * [jumpTo a specific menu or race based on a gameState flag.](@ref update_gamestate)<br />
- * [profiler](@ref profiler_log_thread5_time)<br />
- * [config_gfx_pool](@ref config_gfx_pool)<br />
- * [read_controllers](@ref read_controllers)<br />
- * [game_state_handler](@ref game_state_handler)<br />
- * [endDL/vsync](@ref display_and_vsync)<br />
- * [game_state_handler](@ref game_state_handler):<br />
- * switch([gGamestate](@ref gGamestate))<br />
- * [menus](@ref update_menus) -> switch([menu](@ref gMenuSelection)) { // do menu stuff }<br />
- * [race_logic_loop](@ref race_logic_loop) -> spaghetti<br />
- * [podium_ceremony](@ref podium_ceremony_loop)<br />
- * [credits](@ref credits_loop)<br />
-* [video](@ref thread3_video):<br />
- handles interaction between video/audio threads.
- handles vblanking and some elements pertaining to framebuffer
- most of all, handles which step of rendering a frame the cpu is in.
- Checks when new to start new sp tasks
-
-
-If mk64 is in a menu state it will branch off to the menu code, running relevant bits of code based on more flags such as which particular menu the user is in. This will loop until the state changes to a different one such as race mode. If mk64 is in a race state, then race related code is ran and it spaghetti's off into a wide series of branches. This may include concepts such as `isLinedUp, isRacing, isRaceFinished, gotoNextCourse, isHuman, and isAI`.
-
-This relatively primitive design could be defined as a state machine from an abstract point of view. This would differ from an OOP design that uses objects and hierarchy. You will become very familiar with this design principle as you explore the code-base. During any step of the game loop, a switch can be setup to check a flag then run code relevant to the situation. For instance, a flag can check whether a race is in-progress or complete. If in-progress set the player to human controlled. If complete, set player to AI controlled.
-
-# Segments
-mk64 code is split into three sections for now.
-|Segment|desc|
-|---|---|
-|Main|[Menus](@ref menus.c), [audio](@ref audio), [libultra](@ref PR), rsp (include in libultra)|
-|Racing|[Memory management](@ref memory.c), [courses](@ref render_courses.c), [players](player_controller.c), [actors](@ref actors.c), [skybox](@ref skybox_and_splitscreen.c), [collision](@ref collision.c), [math](@ref math_util.c) |
-|Ending|[Podium ceremony](@ref ending), [credits](@ref credits.c)|
-
-Racing segment loads after selecting a grand prix. Note that it is always reloaded preventing randomization of cpu's at the start of the first race due to no time for the random seed to actually become random.
-
-# Code Breakdown
-
-## Menus
-|file|desc|
-|---|---|
-|[menus](@ref menus.c)| Menu related code |
-|[save](@ref save.c)| Save related |
-|[startup_logo](@ref data/startup_logo.c)|Startup logo|
-
-## Players
-Player related code resides in
-|file|desc|
-|---|---|
-|[player_controller](@ref player_controller.c)| Applies physics to players |
-|[camera](@ref camera.c)| Player cameras |
-
-## Actors
-Actor related code resides in
-|file|desc|
-|---|---|
-|[actors](@ref actors.c)|Variety of [actors](actorsmenu.html), see link for specifics.|
-|[actors_extended](@ref actors_extended.c)|Shells and bananas|
-|[code_80005FD0](@ref code_80005FD0.c)| Vehicles; trains, cars, trucks, boats |
-
-## Objects
-Object related code resides in
-|file|desc|
-|---|---|
-|[code_80057C60](@ref code_80057C60.c)|Objects|
-|[update_objects](@ref update_objects.c)|Objects|
-|[code_80086E70](@ref code_80086E70.c)|Objects|
-
-Documentation of the specifics still in-progress. See [actors](actorsmenu.html) for more information.
-
-## Tracks
-Track related code resides in
-|file|desc|
-|---|---|
-|[memory](@ref memory.c)| Loads and extracts track data|
-|[render_courses](@ref render_courses.c)|Renders track content|
-|[common_textures](@ref common_textures.c)|Content accessible to every track such as items and portraits|
-
-### Course Folder
-[course folder link][@ref courses]
-|file|desc|
-|---|---|
-|courses/course_name/course_data.c|Course data|
-|courses/course_name/course_vertices.inc.c|Course vertices (this + _displaylists.inc.c makes the course geography)|
-|courses/course_name/course_displaylists.inc.c|Course displaylists (these get compressed during compile)|
-|courses/course_name/course_offsets.c|Textures used in the course|
-
-## UI & Other 2D Screen data
-|file|desc|
-|---|---|
-|[render_objects](@ref render_objects.c)|ItemWindows|
-
-## Engine
-|file|desc|
-|---|---|
-|[collision](@ref collision.c)| |
-|[code_80005FD0](@ref code_80005FD0.c)| Pathing code |
-
-## Math
-Math related code resides in
-|file|desc|
-|---|---|
-|[math_util](@ref math_util.c)| |
-|[math_util_2](@ref math_util_2.c)| |
-
-## Ending
-|file|desc|
-|---|---|
-|[ceremony_and_credits](@ref ceremony_and_credits.c)|Camera rails for podium ceremony and credits|
-|[podium_ceremony_actors](@ref podium_ceremony_actors.c)|Fireworks and balloons for podium ceremony|
-|[ceremony_data](@ref ceremony_data.c)|Trophies and podium models. Paths.|
-|[credits](@ref credits.c)|Credits text and UI positions|
diff --git a/docs/basics/placeholder.png b/docs/basics/placeholder.png
deleted file mode 100644
index 4ad36b792..000000000
--- a/docs/basics/placeholder.png
+++ /dev/null
Binary files differ
diff --git a/docs/basics/terminology.md b/docs/basics/terminology.md
deleted file mode 100644
index a4f8e15d2..000000000
--- a/docs/basics/terminology.md
+++ /dev/null
@@ -1,21 +0,0 @@
-@page terminology Terminology
-# Technical Definitions
-* `Jump/Branch/Function` - Tells the cpu to execute instructions somewhere else and come back here when done.
-* `Hexadecimal` - A [numbering system](https://en.wikipedia.org/wiki/Hexadecimal). Similar numbering sytems include decimal (also called base-ten) and roman numerals.
- * Easy method for programmers and computers to understand each other which groups/separates bytes of information in a readable format.
- * Representing computer numbers as decimal results in an unreadable mess.
-* `s32/word/int` - A max size for a number. Data represented as 32 bits or 4 bytes: `0x00000001`. It consists of eight digits.
-* `s16/half-word/short` - A number represented as 16 bits or 2 bytes: `0x0001`. It consists of four digits. Maximum value 65,535 (0xFFFF).
-* `s8/byte/char` - A number represented as 8 bits or 1 byte: `0x01`. It consists of two digits. Maximum value 255 (0xFF).
-* `unsigned` - A positive integer. 0, 1 to maximum value.
-* `signed` - A positive or negative integer. 0, -1 to -max, 1 to max.
- * Max value slightly lower than unsigned due to a bit being used to set whether negative or positive.
- * Google "Two's complement" for an indepth technical explanation.
-* `f32/float` - A positive or negative value containing a decimals such as `5.0f` or `5.1f` or `5.148282f`
-* `f64/double` - A positive or negative value of high-precision. Ex. `5.5784298538832` (many decimals).
-
-# Racing Terminology
-* `Light Tree` - The tree of lights that Lakitu carries; red, orange, green, etc. Tells the racers when to start racing.
- * Called a Christmas tree in drag racing.
-* `Staging` - Align the racecars with the starting line.
-* `Start Sequence` - The light tree activates, going from red to orange to green (Colours and number of lights may differ between different types of races).
diff --git a/docs/characters/charactermenu.md b/docs/characters/charactermenu.md
new file mode 100644
index 000000000..545e0e1f6
--- /dev/null
+++ b/docs/characters/charactermenu.md
@@ -0,0 +1,24 @@
+@page basics Understanding the Basics
+
+@htmlonly
+
+Guides for making custom characters!
+<br><br>
+<div class="pagebutton">
+<a class="pagea" href="overview.html">
+<div class="pagelink">
+ <div class="pageimg"><img width=320 src="buttonimage.png" /></div>
+ <div class="content">
+ <div class="pageheading">Overview</div>
+ <div class="pagedescription">
+ <p>All the steps for making a character</p>
+ </div>
+ </div>
+</div>
+</a>
+</div>
+
+@endhtmlonly
+
+@subpage overview
+
diff --git a/docs/characters/overview.md b/docs/characters/overview.md
new file mode 100644
index 000000000..a4c1e79c7
--- /dev/null
+++ b/docs/characters/overview.md
@@ -0,0 +1,54 @@
+# Custom characters
+Custom characters can only replace existing characters for now.
+
+1. Download the Kart Setup blender file included with this post(Slightly altered .blender file provided by the Overkart server with some adjustments to the animation to export for Spaghetti, thanks again Andrat for permission to post this and a huge thanks to the Overkart 64 community in general.) [Kart Setup.blend](MK64_Spaghetti_Adjusted_Kart_Setup.blend)
+2. Replace Mario with your character, and handle weights of the skeleton as needed to make them move properly.
+3. Set the path a valid one(the included path is what Andrat had setup for his original kart setup) but make sure the name matches a listed kart name below and ends with ###, this will ensure it is 3 digits(example path/to/export/toad_kart/toad_kart_frame###)
+4. Render the animation at whatever power of 2 of 64x64 you want(64x64, 128x128, 256x256 and so on),
+5. In the above toad example, zip up the toad_kart folder and rename it to a .o2r file.
+6. Put it in mods folder and run.
+
+# Examples for all characters:
+mario_kart/mario_kart_frame###
+
+luigi_kart/luigi_kart_frame###
+
+peach_kart/peach_kart_frame###
+
+wario_kart/wario_kart_frame###
+
+toad_kart/toad_kart_frame###
+
+donkeykong_kart/donkeykong_kart_frame###
+
+bowser_kart/bowser_kart_frame###
+
+yoshi_kart/yoshi_kart_frame###
+
+# Additional Files
+Some other files to look out for(still using toad as a example)
+
+placement icon = common_data/common_texture_portrait_toad.png Original frame is 32x32
+
+player selection frames = player_selection/toad_face_00.png ~ toad_face_16.png Original frames is 64x64 (note that Donkeykong uses donkey_kong here instead)
+
+player select nameplate = texture_tkmk00/gTextureNameToad.png Original frame is 64x12 (note that Donkeykong uses DK here instead)
+
+## Tips
+### Change Viewport Render Settings
+Assuming your using the overkart setup kart.
+
+In object mode, select View -> Cameras -> Active Camera
+
+Set your render resolution and path as shown in the image below
+
+Then render your animation by selecting View -> Viewport Render Animation
+
+![Viewport Render Settings](change_viewport.png)
+
+## Tools To Help
+* There is [Racer Ready-Up](https://vinievex.itch.io/racer-ready-up) which is a tool to help you create custom characters for SpaghettiKart.
+
+## Future plans
+* Support for custom characters that do not replace existing ones.
+* Support 3d models for characters. \ No newline at end of file
diff --git a/docs/mainpage.md b/docs/mainpage.md
index 7ae71ef0d..63dc6cd55 100644
--- a/docs/mainpage.md
+++ b/docs/mainpage.md
@@ -2,13 +2,13 @@ Complete resources for learning about mk64 decomp
@htmlonly
<br>
<div class="pagebutton">
-<a class="pagea" href="basics.html">
+<a class="pagea" href="tracks/trackmenu.html">
<div class="pagelink">
<div class="pageimg"><img width=320 src="buttonimage.png" /></div>
<div class="content">
- <div class="pageheading">Understanding the Basics</div>
+ <div class="pageheading">Track Making</div>
<div class="pagedescription">
- <p>Essential skills and concepts to help you get started with mk64 decomp</p>
+ <p>It's time to race!</p>
</div>
</div>
</div>
@@ -16,41 +16,13 @@ Complete resources for learning about mk64 decomp
</div>
<div class="pagebutton">
-<a class="pagea" href="actorsmenu.html">
+<a class="pagea" href="characters/charactermenu.html">
<div class="pagelink">
<div class="pageimg"><img width=320 src="buttonimage.png" /></div>
<div class="content">
- <div class="pageheading">Actors</div>
+ <div class="pageheading">Custom Characters</div>
<div class="pagedescription">
- <p>Learn the inns and outs of mk64's actors, items, vehicles, and behaviour code</p>
- </div>
- </div>
-</div>
-</a>
-</div>
-
-<div class="pagebutton">
-<a class="pagea" href="coursesmenu.html">
-<div class="pagelink">
- <div class="pageimg"><img width=320 src="buttonimage.png" /></div>
- <div class="content">
- <div class="pageheading">Courses</div>
- <div class="pagedescription">
- <p>Learn how mk64's courses are constructed</p>
- </div>
- </div>
-</div>
-</a>
-</div>
-
-<div class="pagebutton">
-<a class="pagea" href="tutorials.html">
-<div class="pagelink">
- <div class="pageimg"><img width=320 src="buttonimage.png" /></div>
- <div class="content">
- <div class="pageheading">Tutorials</div>
- <div class="pagedescription">
- <p>Topics tailored to specific issues such as boostramps.</p>
+ <p>Make your first character!</p>
</div>
</div>
</div>
diff --git a/docs/track_returns.md b/docs/track_returns.md
index 074a3faa0..8f11eaf8f 100644
--- a/docs/track_returns.md
+++ b/docs/track_returns.md
@@ -4,7 +4,7 @@
Here is the table containing only the regular Mario Kart courses, from Banshee Boardwalk to Yoshi Valley:
-| **Mario Kart 64 Track** | **Mario Kart DS** | **Mario Kart Wii** | **Mario Kart 7** | **Mario Kart 8 / Deluxe** | **Booster Track Pass** | **Mario Kart Tour** | **Mario Kart World** |
+| **SpaghettiKart Track** | **Mario Kart DS** | **Mario Kart Wii** | **Mario Kart 7** | **Mario Kart 8 / Deluxe** | **Booster Track Pass** | **Mario Kart Tour** | **Mario Kart World** |
| ------------------------ | ----------------- | ------------------ | ---------------- | ------------------------- | ----------------------- | ------------------- | -------------------- |
| Banshee Boardwalk | ✓ | | | | | | |
| Bowser's Castle | | ✓ | | | | | |
@@ -34,7 +34,7 @@ Here is the table containing only the regular Mario Kart courses, from Banshee B
## Mario Kart World Remixes
-| **Mario Kart 64 Theme** |
+| **SpaghettiKart Theme** |
| :---------------------- |
| Title Theme |
| Setup and Kart Select |
diff --git a/docs/tracks/export.md b/docs/tracks/export.md
new file mode 100644
index 000000000..433aa6a4f
--- /dev/null
+++ b/docs/tracks/export.md
@@ -0,0 +1,54 @@
+# Export
+
+## Quick Overview
+A basic track needs the following:
+* A surface mesh built using a plane (a flat square, not a cube)
+ * Large enough to encompass the spawn area from (0,0,0) to (0, -16.8, 0) in blender, in-game (0, 0, -420)
+* A path built using a Path or bezier curve
+
+
+## Setup
+* Naming the objects in blender is not required.
+* To export a track all the objects need to be placed inside the empty like so:
+![](image-1.png)
+
+* This can be done by dragging mesh or path into the empty while holding `SHIFT`
+
+## Export Panel
+![alt text](image-2.png)
+
+Featureset
+* Must be set to HM64
+Name
+* The name of your track
+Mods Path
+* The mods folder where the data will output too
+ * `desktop/mycoolmods` will output as `desktop/mycoolmods/tracks/mytrackname/stuff_here`
+Export
+* Press this button to export the track!
+
+## Packaging
+
+* Find the `desktop/mycoolmods/tracks` folder and place a mods.toml file beside the tracks folder. Place the following in mods.toml
+```toml
+[mod]
+name = "mymod"
+version = "1.0.0"
+```
+* Highlight the tracks folder and the mods.toml file.
+<img width="120" height="74" alt="image" src="https://github.com/user-attachments/assets/8842a528-ef67-4ae6-81cd-802f133bbea1" />
+
+* Right-click --> *Add To Archive* and turn into a stored zip archive.
+ * This file should *not* be compressed.
+* If you wish, you may rename this file to mod_name.o2r or mod_name.zip
+
+If you open the zip folder, you should immediately see the `tracks` folder and the mods.toml file. Inside `tracks` should be a folder with the name of your track, and some files inside of that folder.
+
+If it does not contain any files similar to the below then something has gone wrong.
+
+<img width="289" height="466" alt="image" src="https://github.com/user-attachments/assets/ccef558b-ac9a-42ed-bc85-e27da4f16598" />
+
+* If all checks out, go to your game executable
+* Add a `mods` folder. Drag and drop your mod into the mods folder.
+* Any number of tracks may be placed in the tracks folder
+ * This allows map packs \ No newline at end of file
diff --git a/docs/tracks/image-1.png b/docs/tracks/image-1.png
new file mode 100644
index 000000000..74b6f8a7a
--- /dev/null
+++ b/docs/tracks/image-1.png
Binary files differ
diff --git a/docs/tracks/image-10.png b/docs/tracks/image-10.png
new file mode 100644
index 000000000..8d767c9f6
--- /dev/null
+++ b/docs/tracks/image-10.png
Binary files differ
diff --git a/docs/tracks/image-11.png b/docs/tracks/image-11.png
new file mode 100644
index 000000000..1fd2d4ad5
--- /dev/null
+++ b/docs/tracks/image-11.png
Binary files differ
diff --git a/docs/tracks/image-12.png b/docs/tracks/image-12.png
new file mode 100644
index 000000000..400d0ff10
--- /dev/null
+++ b/docs/tracks/image-12.png
Binary files differ
diff --git a/docs/tracks/image-13.png b/docs/tracks/image-13.png
new file mode 100644
index 000000000..32db2107b
--- /dev/null
+++ b/docs/tracks/image-13.png
Binary files differ
diff --git a/docs/tracks/image-14.png b/docs/tracks/image-14.png
new file mode 100644
index 000000000..01416d142
--- /dev/null
+++ b/docs/tracks/image-14.png
Binary files differ
diff --git a/docs/tracks/image-15.png b/docs/tracks/image-15.png
new file mode 100644
index 000000000..fd07fdd94
--- /dev/null
+++ b/docs/tracks/image-15.png
Binary files differ
diff --git a/docs/tracks/image-16.png b/docs/tracks/image-16.png
new file mode 100644
index 000000000..91be63078
--- /dev/null
+++ b/docs/tracks/image-16.png
Binary files differ
diff --git a/docs/tracks/image-17.png b/docs/tracks/image-17.png
new file mode 100644
index 000000000..28a984c30
--- /dev/null
+++ b/docs/tracks/image-17.png
Binary files differ
diff --git a/docs/tracks/image-18.png b/docs/tracks/image-18.png
new file mode 100644
index 000000000..5eb1773a8
--- /dev/null
+++ b/docs/tracks/image-18.png
Binary files differ
diff --git a/docs/tracks/image-19.png b/docs/tracks/image-19.png
new file mode 100644
index 000000000..c30a06cbb
--- /dev/null
+++ b/docs/tracks/image-19.png
Binary files differ
diff --git a/docs/tracks/image-2.png b/docs/tracks/image-2.png
new file mode 100644
index 000000000..a27edfefb
--- /dev/null
+++ b/docs/tracks/image-2.png
Binary files differ
diff --git a/docs/tracks/image-20.png b/docs/tracks/image-20.png
new file mode 100644
index 000000000..7875f23da
--- /dev/null
+++ b/docs/tracks/image-20.png
Binary files differ
diff --git a/docs/tracks/image-21.png b/docs/tracks/image-21.png
new file mode 100644
index 000000000..b6c635030
--- /dev/null
+++ b/docs/tracks/image-21.png
Binary files differ
diff --git a/docs/tracks/image-3.png b/docs/tracks/image-3.png
new file mode 100644
index 000000000..6ba8b30f9
--- /dev/null
+++ b/docs/tracks/image-3.png
Binary files differ
diff --git a/docs/tracks/image-4.png b/docs/tracks/image-4.png
new file mode 100644
index 000000000..d051a2239
--- /dev/null
+++ b/docs/tracks/image-4.png
Binary files differ
diff --git a/docs/tracks/image-5.png b/docs/tracks/image-5.png
new file mode 100644
index 000000000..8e45c9742
--- /dev/null
+++ b/docs/tracks/image-5.png
Binary files differ
diff --git a/docs/tracks/image-6.png b/docs/tracks/image-6.png
new file mode 100644
index 000000000..786cebfb7
--- /dev/null
+++ b/docs/tracks/image-6.png
Binary files differ
diff --git a/docs/tracks/image-7.png b/docs/tracks/image-7.png
new file mode 100644
index 000000000..321eafa1c
--- /dev/null
+++ b/docs/tracks/image-7.png
Binary files differ
diff --git a/docs/tracks/image-8.png b/docs/tracks/image-8.png
new file mode 100644
index 000000000..f45db2390
--- /dev/null
+++ b/docs/tracks/image-8.png
Binary files differ
diff --git a/docs/tracks/image-9.png b/docs/tracks/image-9.png
new file mode 100644
index 000000000..fd944124e
--- /dev/null
+++ b/docs/tracks/image-9.png
Binary files differ
diff --git a/docs/tracks/image.png b/docs/tracks/image.png
new file mode 100644
index 000000000..abadce8ba
--- /dev/null
+++ b/docs/tracks/image.png
Binary files differ
diff --git a/docs/tracks/import.md b/docs/tracks/import.md
new file mode 100644
index 000000000..f939228fb
--- /dev/null
+++ b/docs/tracks/import.md
@@ -0,0 +1,47 @@
+# Import
+
+Presuming you have followed the steps in the export page, you should have
+* `mymod.zip` or `mymod.o2r` placed in the mods folder beside the game executable.
+* The track is ready for testing
+
+## Launch the Game
+* Press `ESC` and enable `Debug Mode`
+<img width="379" height="210" alt="image" src="https://github.com/user-attachments/assets/1a3f09ba-0743-4243-b400-2a443df78cdd" />
+
+* Navigate away and back to the start screen and a debug menu should pop up.
+Use the left/right arrow keys to switch tracks. Custom tracks are placed at the end of the list.
+
+* Press *Launch HM64 Labs* to configure your track and place actors.
+
+<img width="767" height="413" alt="image" src="https://github.com/user-attachments/assets/52bcde3e-0b23-4611-9417-1adb71397a5c" />
+
+* Select your track in the Content Browser
+* When opening your track for the first time, a scene.json file is created in the tracks data folder.
+ * If something ever goes horribly wrong you could manually edit this file or back it up to restore it later.
+* If the game crashes while loading, then there is an issue with track path or mesh. Check logs, they are quite detailed and may point out what is wrong.
+
+<img width="1301" height="275" alt="image" src="https://github.com/user-attachments/assets/5f092a60-3377-48e1-8d23-d527a0e60684" />
+
+* Navigate to the Track Properties winow to modify track name and settings
+
+<img width="323" height="339" alt="image" src="https://github.com/user-attachments/assets/59116891-0fca-4eb8-8050-02e70b75021d" />
+
+![alt text](image-6.png)
+
+### Resource Name
+* Must be named identifier:track_name
+* The identifier can be used as a keyword for all of your mods
+* This format prevents name collisions so that everyone could make their own version of banana if they wish. mk is used for original game content and hm for harbour masters content. mk:banana, hm:harbour, etc.
+
+### Name
+* The display name for the track
+### Debug Name
+* The display name in the debug menu.
+### Track Length
+* An arbitrary value that describes the general length of the track
+
+
+## Conclusion
+Congrats! You have successfully made a track
+
+If thet track did not work, try the troubleshooting page.
diff --git a/docs/tracks/materials.md b/docs/tracks/materials.md
new file mode 100644
index 000000000..acb59985c
--- /dev/null
+++ b/docs/tracks/materials.md
@@ -0,0 +1,8 @@
+# Materials
+
+Suggest using the youtubes on this one.
+
+https://youtu.be/LwODZixL_II?si=7o4shGYo6V-mQPeh
+
+
+Proper material presets need to be setup still \ No newline at end of file
diff --git a/docs/tracks/minimap.md b/docs/tracks/minimap.md
new file mode 100644
index 000000000..362d685cd
--- /dev/null
+++ b/docs/tracks/minimap.md
@@ -0,0 +1,47 @@
+# Minimap
+Create a new `minimap.png` file using your favourite graphics editor.
+
+There are two options for making a minimap. The outcome is identical.
+
+## Format
+* Image size of 32x32 to 128x128
+ * Odd sizes like 64x32 or 128x64 is fine.
+ * Recommend no bigger than 128x128 but it will work.
+ * Save as 32-bit
+
+## Tips
+* Turn off anti-aliasing
+* White pixels must be RGB(255, 255, 255)
+* Black pixels must be RGB(0, 0, 0)
+* Any other pixel colour will turn into white
+
+## Option 1: Black Background, White Track
+* Use black pixels for the background and white pixels for the track.
+* The black pixels will be transparent in-game
+
+![alt text](image-3.png)
+* Easiest option to make because it is easy to see the track
+
+
+## Option 2: Transparent Background, White Track
+* Transparent pixels must be *FULL* transparent or they will turn into white pixels
+
+<img width=64 src="image-5.png" />
+
+* Transparent version much harder to see the track in the graphics editor.
+
+## Export
+Place `minimap.png` in the track folder.
+```
+desktop/mycoolmods/tracks/mytrackname/minimap.png
+```
+The same folder as the track data that looks like this:
+
+<img width="289" height="466" alt="image" src="https://github.com/user-attachments/assets/ccef558b-ac9a-42ed-bc85-e27da4f16598" />
+
+## In-game configuration
+
+* In the minimap tab the position of the minimap, finishline, and players markers can be configured.
+* The minimap can also be coloured
+
+![alt text](image-18.png) \ No newline at end of file
diff --git a/docs/custom-track.md b/docs/tracks/overview.md
index c2221bb5a..d8cbd4438 100644
--- a/docs/custom-track.md
+++ b/docs/tracks/overview.md
@@ -1,6 +1,6 @@
# Custom Track Overview
-This guide is not all-encompassing but rather covers the basics for track creation.
+This guide is not all-encompassing but rather covers the utmost basics for track creation.
## Dependencies
* Blender v4.3 or older.
@@ -16,7 +16,7 @@ This guide is not all-encompassing but rather covers the basics for track creati
* Add an empty and place it at coordinates 0, 0, 0
<img width="482" height="532" alt="image" src="https://github.com/user-attachments/assets/ab1475c9-9610-4735-8083-d1586bd76cd7" />
-* Select the empty and in the object panel select `Course Root`
+* Select the empty and in the object panel select `Track Root`
* This is the root of the custom track. All mesh and path are placed within.
<img width="342" height="372" alt="image" src="https://github.com/user-attachments/assets/f1ac68f0-2beb-4078-af62-52d9925e56f4" />
@@ -28,7 +28,7 @@ This guide is not all-encompassing but rather covers the basics for track creati
* The drivable surface *must* be a flat mesh. It cannot be a cube.
* Select the plane and scale it to a reasonable size by pressing the `s` key and dragging with the mouse.
- * Z coordinate 420.0f must have mesh under it for the players to spawn correctly.
+ * Z coordinate -420.0f must have mesh under it for the players to spawn correctly.
* This is approximately -16.8 Y in Blender units (420 / scale of 25)
* One method to test the plane size is by adding a cube
@@ -189,36 +189,3 @@ Example of correct texture format
## Export
* Check `Ignore Textures Restrictions` failing to do so may result in errors
<img width="318" height="315" alt="image" src="https://github.com/user-attachments/assets/60f084d3-aef4-429c-889f-2e2d74473e1a" />
-
-# Tips
-
-**The Laws of SpaghettiKart**
-* Track geography must be a plane, not a box
- * A flat track with a basic plane (square), needs to be turned into triangules and/or subdivided a few times, otherwise the collision generation will 'wig out', placing the racers incorrectly
-* The starting line must face north
- * In Blender: Positive Green Y Axis
- * In game: Negative Z axis
-* The meshes anchor needs to be center of mass or at 0,0,0
- * Otherwise the mesh will have a weird offset.
-* Don't draw your path backwards (In blender turn on normals on the bezier curve to see the direction)
-* The first path point is set at 0,0,0
-* Recommend a scaling of 20 in the F3D Exporter window
-* Must be 10 path points behind the starting line
-
-**Minimap**
-* Must be named: minimap.png
-
-Two options for making minimap textures:
-* Make the background full black (this will be transparent in-game). Use White for the track.
- * This option is easiest to see the track.
-* Use FULL alpha for the background. Use white for the track.
-*Extra details:*
-* Save .png as 32bit. 32x32 (other resolutions should work if needed, but recommend no bigger than 128x128)
-* Turn off brush anti-aliasing.
- * Semi-transparent pixels will be rendered full white. So your lines will end up thicker.
-
-## Extra information that may be helpful
-https://github.com/DeadHamster35/Tarmac64/wiki/Troubleshooting
-
-Applicable only to Overkart 64, but some concepts may transfer to SpaghettiKart
-https://github.com/DeadHamster35/Tarmac64/wiki/Blender-Reference-Guide
diff --git a/docs/tracks/quick.md b/docs/tracks/quick.md
new file mode 100644
index 000000000..db49669cf
--- /dev/null
+++ b/docs/tracks/quick.md
@@ -0,0 +1,39 @@
+# Quick Reference
+
+Important details without the steps
+
+## Track Details
+Path Points: ~800 (any number is fine)
+Triangle Count: Original tracks average ~6000 triangles
+ * SpaghettiKart will start losing fps after ~100k triangles
+
+Starting Line Width: 1.75 units
+Track Boundaries: +-32767.0 in Blender units this is +-1310.68 (32767 / 25)
+ * Note that this allows a very big track
+
+Track Widths:
+* Wide: 1.5 points to 2.7 points.
+* Medium: 1.5 points to 1 point.
+* Narrow: 1 point to 0.5.*
+
+## The Laws of SpaghettiKart
+* Track geography must be a plane, not a box
+ * A flat track with a basic plane (square), needs to be turned into triangules and/or subdivided a few times, otherwise the collision generation will 'wig out', placing the racers incorrectly
+* The starting line must face north
+ * In Blender: Positive Green Y Axis
+ * In game: Negative Z axis
+* The meshes anchor needs to be center of mass or at 0,0,0
+ * Otherwise the mesh will have a weird offset.
+* Do not draw your path backwards (In blender turn on normals on the bezier curve to see the direction)
+* The first path point is set at 0,0,0
+* Recommend a scaling of 25 in the F3D Exporter window
+* Must be 10 path points behind the starting line
+
+
+# Collision Surface Extra Types
+Colouring vertices the following colours will set these actions for that area.
+* Player Tumbles: RGB(153, 0, 153)
+* No Collision: RGB(0, 153, 153)
+* Darkens the player: RGB(255, 0, 0)
+* Out of Bounds: RGB(230, 204, 0)
+
diff --git a/docs/tracks/setup.md b/docs/tracks/setup.md
new file mode 100644
index 000000000..347440d43
--- /dev/null
+++ b/docs/tracks/setup.md
@@ -0,0 +1,29 @@
+# Setup
+
+## Pre-requisites
+* Blender 4.3 or older
+* Harbour Masters Fast64 Blender Addon https://github.com/HarbourMasters/fast64
+
+## Install
+Download Fast64 from github
+
+![alt text](image-7.png)
+
+* Open blender
+* Edit --> Preferences --> Add-ons
+
+<img width="500" alt="image" src="image-8.png" />
+
+* Press the arrow button --> `Install from Disk...`
+* Open the fast64 zip folder
+* Restart Blender
+
+## Configure Fast64
+* Open this pane
+![alt text](image-9.png)
+
+* Change Game to `MK64` and microcode to `F3DEX`
+
+![alt text](image-10.png)
+
+* The `MK64` tab contains the export track panel
diff --git a/docs/tracks/track-properties.md b/docs/tracks/track-properties.md
new file mode 100644
index 000000000..544e9a947
--- /dev/null
+++ b/docs/tracks/track-properties.md
@@ -0,0 +1,22 @@
+# Track Properties
+
+Track Props contains the track data that the modern C++ interface sends into the C game engine. This allows complete configuration of the track from lighting, skybox, and environment, to CPU pathing, minimap, and music.
+
+## Overview
+The following settings are available. Most of these are straight forward.
+
+![alt text](image-20.png)
+# Environment
+Light 1 is unused. Use Light 2.
+
+## AI
+This allows adjusting how precise the CPUs steering is, and the separation between CPUs.
+
+* This section sets AI distance * lap. The first 8 elements are first lap 1, the next 8 lap 2, etc. The first element is for the player in-first, etc.
+
+![alt text](image-19.png)
+
+## Random Junk
+This section effects the speed of the CPUs. Whether they should slow down or speed up in corners, and how fast they should go when they are not on the track.
+
+![alt text](image-21.png)
diff --git a/docs/tracks/trackmenu.md b/docs/tracks/trackmenu.md
new file mode 100644
index 000000000..f19c01a06
--- /dev/null
+++ b/docs/tracks/trackmenu.md
@@ -0,0 +1,145 @@
+@page basics Understanding the Basics
+
+@htmlonly
+
+Guides for making custom tracks!
+<br><br>
+<div class="pagebutton">
+<a class="pagea" href="overview.html">
+<div class="pagelink">
+ <div class="pageimg"><img width=320 src="buttonimage.png" /></div>
+ <div class="content">
+ <div class="pageheading">Overview</div>
+ <div class="pagedescription">
+ <p>All the steps for building the simplest possible track.</p>
+ </div>
+ </div>
+</div>
+</a>
+</div>
+
+<br><br>
+<div class="pagebutton">
+<a class="pagea" href="quick.html">
+<div class="pagelink">
+ <div class="pageimg"><img width=320 src="buttonimage.png" /></div>
+ <div class="content">
+ <div class="pageheading">Quick Reference</div>
+ <div class="pagedescription">
+ <p>Cheatsheet with tips, and tricks.</p>
+ </div>
+ </div>
+</div>
+</a>
+</div>
+
+<br><br>
+<div class="pagebutton">
+<a class="pagea" href="setup.html">
+<div class="pagelink">
+ <div class="pageimg"><img width=320 src="buttonimage.png" /></div>
+ <div class="content">
+ <div class="pageheading">Setup</div>
+ <div class="pagedescription">
+ <p>Your first baby steps. Start here!</p>
+ </div>
+ </div>
+</div>
+</a>
+</div>
+
+<div class="pagebutton">
+<a class="pagea" href="materials.html">
+<div class="pagelink">
+ <div class="pageimg"><img width=320 src="buttonimage.png" /></div>
+ <div class="content">
+ <div class="pageheading">Materials</div>
+ <div class="pagedescription">
+ <p>Working with fast64 materials.</p>
+ </div>
+ </div>
+</div>
+</a>
+</div class="pagebutton">
+
+<div class="pagebutton">
+<a class="pagea" href="minimap.html">
+<div class="pagelink">
+ <div class="pageimg"><img width=320 src="buttonimage.png" /></div>
+ <div class="content">
+ <div class="pageheading">Minimap</div>
+ <div class="pagedescription">
+ <p>How to draw a minimap for your track.</p>
+ </div>
+ </div>
+</div>
+</a>
+</div class="pagebutton">
+
+<div class="pagebutton">
+<a class="pagea" href="export.html">
+<div class="pagelink">
+ <div class="pageimg"><img width=320 src="buttonimage.png" /></div>
+ <div class="content">
+ <div class="pageheading">Export</div>
+ <div class="pagedescription">
+ <p>Export from Blender.</p>
+ </div>
+ </div>
+</div>
+</a>
+</div>
+
+<div class="pagebutton">
+<a class="pagea" href="import.html">
+<div class="pagelink">
+ <div class="pageimg"><img width=320 src="buttonimage.png" /></div>
+ <div class="content">
+ <div class="pageheading">Import</div>
+ <div class="pagedescription">
+ <p>Setting up a new track in-game.</p>
+ </div>
+ </div>
+</div>
+</a>
+</div>
+
+<div class="pagebutton">
+<a class="pagea" href="track-properties.html">
+<div class="pagelink">
+ <div class="pageimg"><img width=320 src="buttonimage.png" /></div>
+ <div class="content">
+ <div class="pageheading">Track Properties</div>
+ <div class="pagedescription">
+ <p>What do all these settings do?</p>
+ </div>
+ </div>
+</div>
+</a>
+</div>
+
+<div class="pagebutton">
+<a class="pagea" href="troubleshooting.html">
+<div class="pagelink">
+ <div class="pageimg"><img width=320 src="buttonimage.png" /></div>
+ <div class="content">
+ <div class="pageheading">Troubleshooting</div>
+ <div class="pagedescription">
+ <p>Something not working right? Try here!</p>
+ </div>
+ </div>
+</div>
+</a>
+</div>
+
+@endhtmlonly
+
+@subpage overview
+@subpage quick
+@subpage setup
+@subpage materials
+@subpage minimap
+@subpage export
+@subpage import
+@subpage track-properties
+@subpage troubleshooting
diff --git a/docs/tracks/troubleshooting.md b/docs/tracks/troubleshooting.md
new file mode 100644
index 000000000..c73f89836
--- /dev/null
+++ b/docs/tracks/troubleshooting.md
@@ -0,0 +1,60 @@
+# Troubleshooting
+
+## Players Spawn in the Air
+Players and actors are placed at 3000.0 if the game cannot find a surface
+* The surface must be a plane not a cube
+* Must be surface from (0,0,0) to (0,0,-420) in Blender units this is (0,-16.8,0) like so:
+<img width="600" alt="image" src="https://github.com/user-attachments/assets/71566a5b-06b5-4a95-829a-1f9edde3c530" />
+
+* The surface must be set to default clip or surface. Clip none means players can drive through the mesh
+![alt text](image.png)
+
+
+## Scaling Issues or Missing Geometry
+* Set scale in the Fast64 export panel between 20-25. Recommended 25.
+* Select the geometry, press CTRL+A and click `Apply Transformations`
+
+## Traversal Issues
+Certain rules must be followed for players to correctly traverse from one mesh to another mesh.
+
+### Driving Through Surfaces or onto Walls
+* The first example below will result in players ignoring the ramp. They will drive through the ramping geography keeping to the current racing surface.
+* The second example correctly transfers the player onto the ramp.
+
+<img width="400" alt="image" src="image-11.png" />
+
+* Players always stick to their current surface unless it ends and another begins. The below also does not consitute as good practice.
+
+<img width="400" alt="image" src="image-12.png" />
+
+* The above variation will result in the player sticking to the original ground and not transferring to the ramp.
+
+### Walls
+* The harsh angle of this wall will likely work as intended. However, it may result in unknown behaviour and as such is not good practice.
+* The bottom of the wall should perfectly align with the surface for it to work reliably as a wall. Any gaps can be driven through.
+
+<img width="400" alt="image" src="image-13.png" />
+
+
+
+* Here is an example of good modelling practices
+
+<img width="400" alt="image" src="image-14.png" />
+
+## Render Conflicts
+In-game example:
+
+<img width="160" alt="image" src="image-15.png" />
+
+Another example:
+
+<img width="360" alt="image" src="image-16.png" />
+
+* Observe that two separate mesh objects are overlapping each other. Solve this by adding more vertices to the objects and connecting the vertices together:
+
+<img width="360" alt="image" src="image-17.png" />
+
+This may seem tedius. Especially if you rely on the extrude tool to make the track. However, there are other tools and tricks that help prevent this issue from happening as much
+
+Source:
+https://github.com/DeadHamster35/Tarmac64/wiki/Troubleshooting \ No newline at end of file