1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="utf-8" /> 5 <title>Projects - Ninji's Website</title> 6 7 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 8 <meta name="viewport" content="width=device-width, initial-scale=1"> 9 <meta name="generator" content="GravCMS" /> 10 <meta name="description" content="a bunch of weird and random technical stuff" /> 11 12 <link rel="icon" type="image/png" href="/user/themes/dog-theme-3/images/logo.png" /> 13 <link rel="canonical" href="https://wuffs.org/projects" /> 14 15 16 17 <link href="https://unpkg.com/[email protected]/build/pure-min.css" type="text/css" rel="stylesheet"> 18<link href="/user/themes/dog-theme-3/css/custom.css" type="text/css" rel="stylesheet"> 19<link href="/user/themes/dog-theme-3/css/social.css" type="text/css" rel="stylesheet"> 20<link href="https://use.fontawesome.com/releases/v5.1.0/css/all.css" type="text/css" rel="stylesheet"> 21<link href="/user/plugins/form/assets/form-styles.css" type="text/css" rel="stylesheet"> 22<link href="/user/plugins/prism-highlight/css/prism.css" type="text/css" rel="stylesheet"> 23<link href="/user/plugins/featherlight/css/featherlight.min.css" type="text/css" rel="stylesheet"> 24<link href="/user/plugins/login/css/login.css" type="text/css" rel="stylesheet"> 25<link href="/user/themes/dog-theme-3/css/light.css" type="text/css" rel="stylesheet" id="lightCSS"> 26<link href="/user/themes/dog-theme-3/css/dark.css" type="text/css" rel="stylesheet" media="(prefers-color-scheme: dark)" id="darkCSS"> 27 28
28<script src="/system/assets/jquery/jquery-2.x.min.js"></script>
vendor: 1 bytes, line 28
28
29<script src="/user/plugins/featherlight/js/featherlight.min.js"></script>
vendor: 1 bytes, line 29
29
30<script src="/user/plugins/static-social-embeds/assets/js/sse.js" defer></script>
vendor: 1 bytes, line 30
30
31<script> 32$(document).ready(function(){ 33 $('a[rel="lightbox"]').featherlight({ 34 openSpeed: 250, 35 closeSpeed: 250, 36 closeOnClick: 'background', 37 closeOnEsc: '1', 38 root: 'body' 39 }); 40}); 41</script>
41 42 43</head> 44<body id="top" class="projects-special"> 45 46<div id="wrapperGrid"> 47 <div id="headerWrapper"> 48 <div class="steelBar"></div> 49 <div id="header"> 50 <button id="sidebarToggle">â°</button> 51 <a class="logo" href="/"> 52 Ninji's Website 53 </a> 54 </div> 55 <div class="steelBar"></div> 56 </div> 57 58<div id="sidebar"> 59 <nav id="sidebarNav"> 60 <a href="/"> 61 Home 62 </a> 63 <a href="/blog"> 64 Posts 65 </a> 66 <a href="/projects" class="selected hasSubpages"> 67 Projects 68 </a> 69 <div class="subpages"> 70 <a href="/projects/nsmb" class=""> 71 New Super Mario Bros. Hacking 72 </a> 73 <a href="/projects/acnh" class=""> 74 Animal Crossing: New Horizons 75 </a> 76 <a href="/projects/twitter-bots" class=""> 77 Twitter Bots 78 </a> 79 <a href="/projects/telegram-bots" class=""> 80 Telegram Bots 81 </a> 82 </div> 83 <a href="/downloads"> 84 Downloads 85 </a> 86 </nav> 87 <div class="sideblock"> 88 <span class="sbHeader">Links</span> 89 <div class="sbBody"> 90 <a rel="me" href="https://wuffs.org/@Ninji">ð @[email protected]</a> 91 <!--<a rel="me" href="https://twitter.com/_Ninji">Twitter (@_Ninji)</a>--> 92 <a rel="me" href="https://github.com/Treeki">GitHub (@Treeki)</a> 93 <a rel="me" href="https://www.linkedin.com/in/ninji">LinkedIn</a> 94 </div> 95 </div> 96 <div class="sideblock" style="display: none" id="themeBlock"> 97 <span class="sbHeader">Theme</span> 98 <div class="sbBody"> 99 <a href="#" id="defaultTheme" class="selected">Auto</a> 100 <a href="#" id="lightTheme">Light</a> 101 <a href="#" id="darkTheme">Dark</a> 102 </div> 103 </div> 104</div> 105<div id="sidebarHider"></div> 106 107 <section id="body" class=""> 108 <p>I've built a lot of things. Here's a selection of them for your perusal.</p> 109<p>I've broken some stuff out into subpages with more detail:</p> 110<ul> 111<li>Game modding: <a href="/projects/nsmb">New Super Mario Bros.</a> (DS and Wii), <a href="/projects/acnh">Animal Crossing: New Horizons</a></li> 112<li>Social media bots I created: <a href="/projects/twitter-bots">Twitter</a>, <a href="/projects/telegram-bots">Telegram</a></li> 113</ul> 114<p>You can also find some other things on my <a href="https://github.com/Treeki">GitHub</a> which I didn't list here because I didn't think they were interesting enough.</p> 115<table> 116<thead> 117<tr> 118<th>Description</th> 119<th>Links</th> 120</tr> 121</thead> 122<tbody> 123<tr> 124<td><strong>mpw-emu (2022)</strong><br>Emulator for PowerPC command-line tools from Macintosh Programmer's Workshop</td> 125<td><a href="https://github.com/Treeki/mpw-emu">GitHub »</a><br><a href="/blog/emulating-mac-compilers">Writeup »</a></td> 126</tr> 127<tr> 128<td><strong>PocketWordle (2022)</strong><br>Wordle for Pocket PC 2003 - exactly what it says on the tin</td> 129<td><a href="https://github.com/Treeki/PocketWordle">GitHub »</a></td> 130</tr> 131<tr> 132<td><strong>MeteoNook (2020)</strong><br>Weather prediction app for Animal Crossing: New Horizons</td> 133<td><a href="/projects/acnh">More Info »</a><br><a href="https://github.com/Treeki/MeteoNook">GitHub »</a><br><a href="https://wuffs.org/acnh/weather">App »</a></td> 134</tr> 135<tr> 136<td><strong>Causson (2019-2020)</strong><br>Experimental programming language implemented in Rust, developed as my honours project for my CS degree</td> 137<td><a href="https://github.com/Treeki/Causson">GitHub »</a></td> 138</tr> 139<tr> 140<td><strong>WindEmu (2019-2020)</strong><br>Emulator for the Psion Series 5mx and other EPOC32 devices</td> 141<td><a href="https://github.com/Treeki/WindEmu">GitHub »</a><br><a href="https://wuffs.org/WindEmu/index.html">Live Demo »</a><br><a href="/blog/building-a-psion-emulator">Writeup »</a></td> 142</tr> 143<tr> 144<td><strong>FlicksForAll (2019)</strong><br>Tweak for jailbroken iPhones on iOS 12 and 13 that adds customisable shortcuts to the keyboard, based off the iPad 'key flick' shortcuts</td> 145<td><a href="https://github.com/Treeki/FlicksForAll">GitHub »</a><br><a href="https://cydia.wuffs.org">Repository »</a></td> 146</tr> 147<tr> 148<td><strong>SpoonsMap (2019)</strong><br>An interactive map visualising every JD Wetherspoon pub in the UK, ranked by price relative to other Wetherspoon outlets</td> 149<td><a href="https://wuffs.org/files/spoonsmap/">Map »</a><br><a href="/blog/spoonalysis-mapping-uk-chain-pub-prices">Writeup »</a></td> 150</tr> 151<tr> 152<td><strong>robert.js (2018)</strong><br>JavaScript tools for rendering the assistants from Microsoft Bob and Office 97, as well as some other miscellaneous Bob data files</td> 153<td><a href="https://github.com/Treeki/robert.js">GitHub »</a><br><a href="https://wuffs.org/bob/actors.html">Live Demo »</a></td> 154</tr> 155<tr> 156<td><strong>Kamek (2015-current)</strong><br>Framework for compiling and injecting new assembly, C and C++ code into GameCube and Wii games</td> 157<td><a href="/projects/nsmb">More Info »</a><br><a href="https://github.com/Treeki/Kamek">GitHub »</a></td> 158</tr> 159<tr> 160<td><strong>Reggie! Level Editor (2009)</strong><br>Cross-platform graphical level editor for <em>New Super Mario Bros. Wii</em>, developed by Tempus and I using PyQt4</td> 161<td><a href="/projects/nsmb">More Info »</a><br><a href="https://github.com/Treeki/Reggie">GitHub »</a></td> 162</tr> 163<tr> 164<td><strong>Newer Super Mario Bros. Wii (2009-2013)</strong><br>Unofficial sequel to <em>New Super Mario Bros. Wii</em>, created as a very extensive patch to the original game. Developed by myself (lead programmer) and some other fans from around the world.</td> 165<td><a href="/projects/nsmb">More Info »</a><br><a href="https://newerteam.com">Website »</a></td> 166</tr> 167<tr> 168<td><strong>Nelumbo (2011-2016)</strong><br>Ruby library with a simple DSL for creating interactive bots for Furcadia.</td> 169<td><a href="https://github.com/Treeki/Nelumbo">GitHub »</a></td> 170</tr> 171</tbody> 172</table> 173 </section> 174 175<div id="footer"> 176 <p> 177 © 2015-2026 Ash Wolf • Designed in Glasgow 178 </p> 179 <p> 180 â»ï¸ Please consider the environment before printing this website. 181 </p> 182</div> 183</div> 184 185
185<script> 186 function toggleSidebar() { 187 var sidebar = document.getElementById('sidebar'); 188 if (sidebar.className === 'visible') 189 sidebar.className = ''; 190 else 191 sidebar.className = 'visible'; 192 } 193 document.getElementById('sidebarToggle').onclick = toggleSidebar; 194 document.getElementById('sidebarHider').onclick = toggleSidebar; 195 196 var lightCSS = document.getElementById('lightCSS'); 197 var darkCSS = document.getElementById('darkCSS'); 198 199 function selectTheme(theme) { 200 if (theme === 'default') 201 window.localStorage.removeItem('theme'); 202 else 203 window.localStorage.setItem('theme', theme); 204 activateTheme(theme); 205 return false; 206 } 207 208 function activateTheme(theme) { 209 if (theme === 'default') { 210 darkCSS.disabled = false; 211 darkCSS.media = '(prefers-color-scheme: dark)'; 212 } else if (theme === 'dark') { 213 darkCSS.disabled = false; 214 darkCSS.media = ''; 215 } else if (theme === 'light') { 216 darkCSS.disabled = true; 217 darkCSS.media = ''; 218 } 219 220 document.getElementById('defaultTheme').className = (theme === 'default') ? 'selected' : ''; 221 document.getElementById('lightTheme').className = (theme === 'light') ? 'selected' : ''; 222 document.getElementById('darkTheme').className = (theme === 'dark') ? 'selected' : ''; 223 } 224 225 document.getElementById('themeBlock').style.display = ''; 226 document.getElementById('defaultTheme').onclick = () => selectTheme('default'); 227 document.getElementById('lightTheme').onclick = () => selectTheme('light'); 228 document.getElementById('darkTheme').onclick = () => selectTheme('dark'); 229 var theme = window.localStorage.getItem('theme'); 230 if (theme === 'light' || theme === 'dark') { 231 activateTheme(theme); 232 } 233 </script>
233 234
234<script src="/user/data/prism-highlight/prism.js"></script>
vendor: 1 bytes, line 234
234
235<script> 236var __prism_nodes = null; 237__prism_nodes = document.querySelectorAll('pre:not([class*="language-"])'); 238__prism_nodes.forEach(function(node) { node.classList.add('language-txt'); }); 239</script>
239 240 241 242</body> 243</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.