Experimental javascript engine reimplemention of Mario Kart DS.
 
 
 
Go to file
riperiperi bbb61394f4 Greatly improve shading model
- Directional toon lighting component on entities. (extension of the
shadow light source)
The shadows were doing this anyways, but with extremely bad
stairstepping. Now it smoothly blends into the shadow.
- Greatly reduce shadow acne via the above and a larger bias.
- Respect culling mode for each model.
- Two sided shading for course models.
- Disable alpha for water that does not use it.
- Only GBA Sky Garden's skybox receives shadows now.
- Custom light positions for some maps. (you can guess which)
2019-06-10 23:06:38 +01:00
code Greatly improve shading model 2019-06-10 23:06:38 +01:00
resource ...and add it all back. 2017-09-08 17:24:16 +01:00
server ...and add it all back. 2017-09-08 17:24:16 +01:00
.gitignore Tweak physics, cannons, nsbtp support, prepare to add items. 2019-05-29 01:08:48 +01:00
LICENSE Initial commit 2017-04-27 18:32:47 +01:00
README.md Update README.md 2017-09-08 18:25:31 +01:00
audio.html Tweak physics, cannons, nsbtp support, prepare to add items. 2019-05-29 01:08:48 +01:00
audioSFX.html All courses now render properly. WIP items (shell, banana, fake item) 2019-06-09 23:50:55 +01:00
index.html All courses now render properly. WIP items (shell, banana, fake item) 2019-06-09 23:50:55 +01:00

README.md

mkjs

mkscrn2s mkjs is an experimental javascript engine reimplemention of Mario Kart DS. Users of the application must provide their own Mario Kart DS ROM, dumped using a DS or 3DS. This project exists for entirely educational purposes.

If you have a ROM of MKDS available, you can give mkjs a shot here: http://rhy3756547.github.io/mkjs

Purpose

I started working on mkjs a few years ago to get a better grasp on a lot things, mainly for fun. Here are the key factors:

  • WebGL game engine with no dependancies. Entirely written using vanilla Javascript ES5. (will not accept contributions using libraries!)
    • (exception is GLMatrix, which is required for matrix and vector operations)
  • Entirely implement readers for NDS file formats, and ways to utilise them in an actual game environment.
  • SSEQ (midi) music and sfx player using Web Audio API features. Supports 3D sound, and used to support doppler...
  • Custom simple collision engine with swept sphere collision against quadtree partitioned triangle collision meshes. Performs well enough in javascript, but could likely be faster.
  • Attempts to replicate the perfect physics and feeling of this beautiful game, through format and physics reverse engineering.
  • Very clean "class" structure in ES5. ES6 port would be welcome, I might do that at some point.
  • Works on many platforms, including iOS at 60 fps!

Current Features

The base game mostly works. A lot of the grunt work is done - the current setup shows a good prototype of the game working.

  • Nitro filesystem management for real .nds files, allowing a ROM to be provided with no changes.
  • Loads and displays all courses (including battle) in some playable form. Textures, texture animations are intact.
  • Functional Kart vs. World physics, using kcl files for courses.
  • Work in progress Kart vs. Moving object physics (see Tick Tock Clock, Bowser's Castle DS)
  • Functional AI karts that follow the same waypoints as MKDS AI. (battle and race AI modes)
  • Content system for work in progress course objects, eg. routed car obstacles, moving platforms.

Possible Future

  • UI engine
  • Race Logic (checkpoints, lap count, lap tracking, race completion...)
  • All course obstacles (enemies, bridge in delfino)
  • Items & damage
  • Particle effects format reader and renderer (no idea how these formats work).
  • Custom Menus
  • Battle Mode & Mission Mode
  • Multiplayer (custom courses? >8 players?)
  • Lots of bug fixes for collisions and format readers!

Multiplayer

mkmulti

While multiplayer using a Websockets server is semi-functional, it is very simplistic and only exists for testing purposes. A future implementation would ideally connect to peers using WebRTC rather than connecting through a central server.