mkdedede 0.4.0

Rust crate for decoding and encoding Mario Kart ghost data passwords (Double Dash!! and DS)
Documentation
  • Coverage
  • 24.05%
    57 out of 237 items documented2 out of 47 items with examples
  • Size
  • Source code size: 121.18 kB This is the summed size of all the files inside the crates.io package for this release.
  • Documentation size: 7.8 MB This is the summed size of all files generated by rustdoc for all configured targets
  • Ø build duration
  • this release: 22s Average build duration of successful builds.
  • all releases: 23s Average build duration of successful builds in releases after 2024-10-23.
  • Links
  • tpglitch/mkdedede
    1 0 0
  • crates.io
  • Dependencies
  • Versions
  • Owners
  • tpglitch

MKDedede

A Rust crate for decoding and encoding Mario Kart: Double Dash!! and Mario Kart DS ghost data passwords


The games generate a 16-character password after a time trial that encodes some info about them. This crate parses and validates those passwords.

Double Dash ported from the JavaScript decoder by WaluigiBSOD.

DS ported from the C decoder by simontime.

Simple Double Dash decoding example

use mkdedede::double_dash::decode;

match decode("SOME16CHARPASSWD") {
    Ok(ghost) => println!("{}", ghost),
    Err(e)    => eprintln!("invalid password: {}", e),
}

Usage from C/C++ (FFI)

We provide an FFI layer that exposes C-compatible functions to decode and encode passwords!

To build for C/C++, use cargo to build the native bindings:

cargo build --release

This will produce .so, .dylib, or .dll (and their respective static architectures) inside target/release/.

Include the provided header from include/mkdedede.h in your project and link the output shared library.

#include <stdio.h>
#include "mkdedede.h"

int main() {
    MkddGhostDataC data;
    MkdededeDecodeStatus status = mkdedede_mkdd_decode("NJTXAJFLY4M7BGGG", &data);

    if (status == MKDEDEDE_SUCCESS) {
        printf("Course: %s\n", mkdedede_mkdd_course_name(data.course));
        printf("Kart: %s\n", mkdedede_mkdd_kart_name(data.kart));

        char time_str[16] = {0};
        mkdedede_mkdd_format_time(data.total_time_ms, time_str);
        printf("Total Time: %s\n", time_str);
    } else {
        printf("Decode failed with status: %d\n", status);
    }
    return 0;
}

License

AGPL-3.0, see LICENSE