├── .jshintignore ├── .jshintrc ├── README.md ├── flags.js ├── fonts ├── Undertale-Bold.eot ├── Undertale-Bold.svg ├── Undertale-Bold.ttf ├── Undertale-Bold.woff ├── Undertale-Regular.eot ├── Undertale-Regular.svg ├── Undertale-Regular.ttf └── Undertale-Regular.woff ├── help.html ├── index.html ├── lib └── FileSaver.min.js ├── main.js ├── manifest.appcache ├── presets ├── asgore-normal.js ├── asgore-true.js ├── omega-flowey.js ├── presets.js ├── ruins-start.js ├── sans-battle.js ├── true-pacifist.js └── undyne-the-undying.js ├── res ├── download.svg ├── flowey_evil.png ├── flowey_laugh.mp3 ├── flowey_nice.png ├── flowey_wink.png ├── heart.svg ├── load.png └── star.png ├── research ├── README.md ├── TODO.md ├── file0_init ├── genocide-requirements.txt ├── savefile.md ├── scratchpad.md ├── system_information_962 └── undertale_ini.txt ├── style.css └── watcher ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── README.md └── src └── main.rs /.jshintignore: -------------------------------------------------------------------------------- 1 | lib/ 2 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "strict": true, 3 | "eqeqeq": true, 4 | "undef": true, 5 | "unused": true, 6 | "browser": true, 7 | "shadow": "outer", 8 | "globals": { 9 | "saveAs": false, 10 | "presets": true 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Flowey's Time Machine 2 | Undertale SAVE editor 3 | 4 | http://crumblingstatue.github.io/FloweysTimeMachine 5 | -------------------------------------------------------------------------------- /fonts/Undertale-Bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crumblingstatue/FloweysTimeMachine/55f40fc4c55427676df315caaafe348581b26ba8/fonts/Undertale-Bold.eot -------------------------------------------------------------------------------- /fonts/Undertale-Bold.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Created by FontForge 20090622 at Tue Jun 6 23:45:02 2017 6 | By deploy user 7 | © 2009 - 2014 Grand Chaos Productions. 8 | 9 | 10 | 11 | 26 | 28 | 30 | 32 | 34 | 36 | 38 | 40 | 42 | 44 | 46 | 48 | 50 | 52 | 54 | 56 | 58 | 60 | 62 | 64 | 66 | 68 | 70 | 72 | 74 | 76 | 78 | 80 | 82 | 84 | 86 | 88 | 90 | 92 | 94 | 96 | 98 | 100 | 102 | 104 | 106 | 108 | 110 | 112 | 114 | 116 | 118 | 120 | 122 | 124 | 126 | 128 | 130 | 132 | 134 | 136 | 138 | 140 | 142 | 144 | 146 | 148 | 150 | 152 | 154 | 156 | 158 | 160 | 162 | 164 | 166 | 168 | 170 | 172 | 174 | 176 | 178 | 180 | 182 | 184 | 186 | 188 | 190 | 192 | 194 | 196 | 198 | 200 | 202 | 204 | 206 | 208 | 210 | 212 | 214 | 216 | 218 | 220 | 222 | 224 | 226 | 228 | 230 | 232 | 234 | 237 | 239 | 241 | 244 | 246 | 248 | 250 | 252 | 254 | 256 | 258 | 260 | 262 | 264 | 266 | 268 | 270 | 272 | 274 | 276 | 278 | 280 | 282 | 284 | 286 | 288 | 290 | 292 | 294 | 296 | 298 | 300 | 302 | 304 | 306 | 308 | 310 | 312 | 314 | 316 | 318 | 320 | 322 | 324 | 326 | 328 | 330 | 332 | 334 | 336 | 338 | 340 | 342 | 344 | 346 | 348 | 350 | 352 | 354 | 356 | 358 | 360 | 362 | 364 | 366 | 368 | 370 | 372 | 374 | 376 | 378 | 380 | 382 | 384 | 386 | 388 | 390 | 392 | 394 | 396 | 398 | 400 | 402 | 404 | 406 | 408 | 410 | 412 | 414 | 416 | 418 | 420 | 422 | 424 | 426 | 428 | 430 | 432 | 434 | 436 | 438 | 440 | 442 | 444 | 446 | 448 | 450 | 452 | 454 | 456 | 458 | 460 | 462 | 464 | 466 | 468 | 470 | 472 | 474 | 476 | 478 | 480 | 482 | 484 | 486 | 488 | 489 | 490 | -------------------------------------------------------------------------------- /fonts/Undertale-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crumblingstatue/FloweysTimeMachine/55f40fc4c55427676df315caaafe348581b26ba8/fonts/Undertale-Bold.ttf -------------------------------------------------------------------------------- /fonts/Undertale-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crumblingstatue/FloweysTimeMachine/55f40fc4c55427676df315caaafe348581b26ba8/fonts/Undertale-Bold.woff -------------------------------------------------------------------------------- /fonts/Undertale-Regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crumblingstatue/FloweysTimeMachine/55f40fc4c55427676df315caaafe348581b26ba8/fonts/Undertale-Regular.eot -------------------------------------------------------------------------------- /fonts/Undertale-Regular.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Created by FontForge 20090622 at Tue Jun 6 23:43:33 2017 6 | By deploy user 7 | © 2009 - 2014 Grand Chaos Productions. 8 | 9 | 10 | 11 | 26 | 28 | 30 | 32 | 34 | 36 | 38 | 40 | 42 | 44 | 46 | 48 | 50 | 52 | 54 | 56 | 58 | 60 | 62 | 64 | 66 | 68 | 70 | 72 | 74 | 76 | 78 | 80 | 82 | 84 | 86 | 88 | 90 | 92 | 94 | 96 | 98 | 100 | 102 | 104 | 106 | 108 | 110 | 112 | 114 | 116 | 118 | 120 | 122 | 124 | 126 | 128 | 130 | 132 | 134 | 136 | 138 | 140 | 142 | 144 | 146 | 148 | 150 | 152 | 154 | 156 | 158 | 160 | 162 | 164 | 166 | 168 | 170 | 172 | 174 | 176 | 178 | 180 | 182 | 184 | 186 | 188 | 190 | 192 | 194 | 196 | 198 | 200 | 202 | 204 | 206 | 208 | 210 | 212 | 214 | 216 | 218 | 220 | 222 | 224 | 226 | 228 | 230 | 232 | 234 | 237 | 240 | 242 | 245 | 247 | 249 | 251 | 253 | 255 | 257 | 259 | 262 | 264 | 266 | 268 | 270 | 272 | 274 | 276 | 278 | 280 | 282 | 284 | 286 | 288 | 290 | 292 | 294 | 296 | 298 | 300 | 302 | 304 | 307 | 309 | 311 | 313 | 315 | 317 | 319 | 321 | 323 | 325 | 327 | 329 | 331 | 333 | 336 | 338 | 340 | 342 | 345 | 347 | 349 | 351 | 354 | 356 | 358 | 360 | 362 | 364 | 366 | 368 | 370 | 372 | 374 | 376 | 378 | 380 | 382 | 384 | 386 | 388 | 390 | 392 | 394 | 396 | 399 | 402 | 404 | 406 | 408 | 411 | 413 | 416 | 418 | 420 | 422 | 425 | 427 | 430 | 433 | 435 | 437 | 439 | 441 | 443 | 446 | 449 | 451 | 453 | 455 | 457 | 459 | 461 | 463 | 465 | 467 | 469 | 471 | 473 | 475 | 477 | 479 | 481 | 483 | 485 | 487 | 489 | 491 | 493 | 495 | 497 | 499 | 501 | 503 | 504 | 505 | -------------------------------------------------------------------------------- /fonts/Undertale-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crumblingstatue/FloweysTimeMachine/55f40fc4c55427676df315caaafe348581b26ba8/fonts/Undertale-Regular.ttf -------------------------------------------------------------------------------- /fonts/Undertale-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crumblingstatue/FloweysTimeMachine/55f40fc4c55427676df315caaafe348581b26ba8/fonts/Undertale-Regular.woff -------------------------------------------------------------------------------- /help.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Flowey's Time Machine - Help 6 | 7 | 20 | 21 | 22 | 23 |

24 | HELP 25 |

26 |

Using external tool

27 |

28 | If you wish to temporarily try out a save, you can use the third party 29 | tool 30 | UndertaleSandbox. Please note that we are in no way related to them, or any of 33 | their actions. If you wish to learn the manual way of installing, carry on 34 | with the tutorial! 35 |

36 |

Getting Started

37 |

38 | First, you need to find your Undertale save folder. This is usually 39 | C:/Users/username/AppData/Local/UNDERTALE, but it might be 40 | different for you, who knows. It should contain at least a file called 41 | undertale.ini and a file called file0, unless 42 | you haven't saved your game yet, or the save was deleted. 43 |

44 |

Loading

45 |

46 | Once you have found where your existing save data is, you can load it into 47 | Flowey's Time Machine to edit it. You don't have to load an existing save 48 | though you can select a preset instead at the top, or use the default 49 | preset which is set by default. 50 |

51 |

Editing

52 |

53 | Just edit the various fields to your liking. Some fields can be hovered over 54 | with the mouse to get some information about the field. 55 |

56 |

Saving

57 |

58 | Once you have edited the data to your liking, you can save it using the 59 | save button. Just overwrite your existing file0 and undertale.ini. 60 |

61 |

Undoing genocide erased world / selling your soul

62 |

63 | If you erased your world, you should see a file called 64 | system_information_962.
If you sold your soul, you 65 | should also see a file called system_information_963. 66 |
Just delete these files using your file manager. If you are using 67 | the Steam version of the game, these files might be backed up and restored 68 | by the game on startup. In that case, you should delete the Steam data for 69 | UNDERTALE in addition to the system_ files. You can do this in multiple ways: 70 |

71 | 86 |

Advanced Mode

87 |

88 | Flowey's Time Machine has an Advanced Mode for more detailed viewing and 89 | editing of file0. The vast majority of Undertale's save file is stored as 90 | a series of 512 "flags" containing extremely varied information, from your 91 | preferred pie flavor to whether you remembered Heats Flamesman's name. 92 |

93 |

94 | Flowey's Time Machine uses a consecutive list of these flags. Flags the game 95 | never normally accesses are grayed out, and flags the game never sets are 96 | highlighted in red. Every flag has a name and a mouseover description, often 97 | sourced from PoroCYon's data site and The Undermodding Document. Check those out for more information on most flags. 102 |

103 |

104 | Flags can be edited and saved in much the same way as in the basic interface, 105 | using the provided dropdowns, checkboxes, and numerical fields. (1 usually 106 | represents an "active" flag, as the two are equivalent in computer terms.) 107 | Many of the most important flags to various routes are more easily editable 108 | from the basic interface. However, there are a few that may warrant special 109 | interest: 110 |

111 | 141 | 142 | 143 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Flowey's Time Machine 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 66 | 67 |
68 | What is this? 69 |
70 | 71 | 72 |
73 |
74 | 75 |
76 |
77 |

Persistent Data (undertale.ini)

78 |

Things that UNDERTALE remembers throughout multiple playthroughs

79 |
80 | 81 |
82 |
83 | General 84 |
85 | 88 | 89 | 92 | 95 | 96 | 97 | 104 | 105 | 106 | 107 | 113 | 119 | 125 | 126 |
127 |
128 | 135 | 139 |
140 |
141 | 142 | 143 |
144 |
145 | 146 |
147 |
148 | Omega Flowey & Other 149 |
150 | 151 | 157 | 158 | 163 |
164 | 165 | 170 |
171 |
172 | 173 | 174 |
175 |
176 |
177 |
178 |
179 | 180 |
181 |

SAVE Data (file0)

182 |

This is what gets SAVED at SAVE points

183 |
184 | 185 |
186 |
187 | General 188 |
189 | 192 | 193 | 196 | 199 | 200 | 207 | 208 | 209 | 210 | 216 | 222 | 228 | 229 |
230 |
231 | 238 | 242 |
243 |
244 | 245 | 246 |
247 |
248 | 249 |
250 | Stats 251 |
252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 267 | 268 | 269 | 270 | 276 |
277 |
278 | 279 | 280 | 281 | 282 |
283 |
284 | 285 | 286 |
287 |
288 | 289 |
290 | Inventory 291 |
292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 |
309 |
310 | 311 |
312 | Cellphone 313 |
314 | 315 | 316 |
317 | 339 |
340 | 341 |
342 |
343 | Ruins 344 |
345 | 346 | 347 | 348 | 354 | 355 | 356 |
357 |
358 | 359 |
360 | Snowdin 361 |
362 | 363 | 364 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 |
380 |
381 |
382 | 383 |
384 |
385 | Waterfall 386 |
387 | 388 | 389 | 390 | 396 | 397 | 398 |
399 |
400 | 401 | 402 | 403 | 404 |
405 |
406 | 407 |
408 | Hotland 409 |
410 | 411 | 412 | 418 | 419 | 420 | 421 | 422 | 423 |
424 |
425 |
426 | 427 |
428 | Other 429 |
430 | 435 | 440 |
441 |
442 | 443 | 448 |
449 | 450 | 455 |
456 | 457 |
458 | FUN Values 459 |
460 | 461 | 462 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 |
Value 463 | Effect 464 |
2-39Wrong number
40-45Sans' call
46-50Alphys' call
56-57Nightmare mode
482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 |
61-63Gaster followers
65Sound test room
66Fake hallway
80-89Clam girl
90-100Goner kid
504 |
505 |
506 |
507 | Advanced 508 |
509 |
510 |

PLEASE only proceed if you know what you are doing!

511 |

Each flag has a mouseover explanation.

512 |

More info

513 |
514 | 515 |
516 | 517 |
518 |
519 |
520 | 521 | 522 | -------------------------------------------------------------------------------- /lib/FileSaver.min.js: -------------------------------------------------------------------------------- 1 | /*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */ 2 | var saveAs=saveAs||function(e){"use strict";if(typeof navigator!=="undefined"&&/MSIE [1-9]\./.test(navigator.userAgent)){return}var t=e.document,n=function(){return e.URL||e.webkitURL||e},r=t.createElementNS("http://www.w3.org/1999/xhtml","a"),i="download"in r,o=function(e){var t=new MouseEvent("click");e.dispatchEvent(t)},a=/Version\/[\d\.]+.*Safari/.test(navigator.userAgent),f=e.webkitRequestFileSystem,u=e.requestFileSystem||f||e.mozRequestFileSystem,s=function(t){(e.setImmediate||e.setTimeout)(function(){throw t},0)},c="application/octet-stream",d=0,l=500,w=function(t){var r=function(){if(typeof t==="string"){n().revokeObjectURL(t)}else{t.remove()}};if(e.chrome){r()}else{setTimeout(r,l)}},p=function(e,t,n){t=[].concat(t);var r=t.length;while(r--){var i=e["on"+t[r]];if(typeof i==="function"){try{i.call(e,n||e)}catch(o){s(o)}}}},v=function(e){if(/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)){return new Blob(["\ufeff",e],{type:e.type})}return e},y=function(t,s,l){if(!l){t=v(t)}var y=this,m=t.type,S=false,h,R,O=function(){p(y,"writestart progress write writeend".split(" "))},g=function(){if(R&&a&&typeof FileReader!=="undefined"){var r=new FileReader;r.onloadend=function(){var e=r.result;R.location.href="data:attachment/file"+e.slice(e.search(/[,;]/));y.readyState=y.DONE;O()};r.readAsDataURL(t);y.readyState=y.INIT;return}if(S||!h){h=n().createObjectURL(t)}if(R){R.location.href=h}else{var i=e.open(h,"_blank");if(i==undefined&&a){e.location.href=h}}y.readyState=y.DONE;O();w(h)},b=function(e){return function(){if(y.readyState!==y.DONE){return e.apply(this,arguments)}}},E={create:true,exclusive:false},N;y.readyState=y.INIT;if(!s){s="download"}if(i){h=n().createObjectURL(t);r.href=h;r.download=s;setTimeout(function(){o(r);O();w(h);y.readyState=y.DONE});return}if(e.chrome&&m&&m!==c){N=t.slice||t.webkitSlice;t=N.call(t,0,t.size,c);S=true}if(f&&s!=="download"){s+=".download"}if(m===c||f){R=e}if(!u){g();return}d+=t.size;u(e.TEMPORARY,d,b(function(e){e.root.getDirectory("saved",E,b(function(e){var n=function(){e.getFile(s,E,b(function(e){e.createWriter(b(function(n){n.onwriteend=function(t){R.location.href=e.toURL();y.readyState=y.DONE;p(y,"writeend",t);w(e)};n.onerror=function(){var e=n.error;if(e.code!==e.ABORT_ERR){g()}};"writestart progress write abort".split(" ").forEach(function(e){n["on"+e]=y["on"+e]});n.write(t);y.abort=function(){n.abort();y.readyState=y.DONE};y.readyState=y.WRITING}),g)}),g)};e.getFile(s,{create:false},b(function(e){e.remove();n()}),b(function(e){if(e.code===e.NOT_FOUND_ERR){n()}else{g()}}))}),g)}),g)},m=y.prototype,S=function(e,t,n){return new y(e,t,n)};if(typeof navigator!=="undefined"&&navigator.msSaveOrOpenBlob){return function(e,t,n){if(!n){e=v(e)}return navigator.msSaveOrOpenBlob(e,t||"download")}}m.abort=function(){var e=this;e.readyState=e.DONE;p(e,"abort")};m.readyState=m.INIT=0;m.WRITING=1;m.DONE=2;m.error=m.onwritestart=m.onprogress=m.onwrite=m.onabort=m.onerror=m.onwriteend=null;return S}(typeof self!=="undefined"&&self||typeof window!=="undefined"&&window||this.content);if(typeof module!=="undefined"&&module.exports){module.exports.saveAs=saveAs}else if(typeof define!=="undefined"&&define!==null&&define.amd!=null){define([],function(){return saveAs})} -------------------------------------------------------------------------------- /manifest.appcache: -------------------------------------------------------------------------------- 1 | CACHE MANIFEST 2 | # Increment to update the client cache 3 | # Version: 5 4 | 5 | index.html 6 | main.js 7 | style.css 8 | lib/FileSaver.min.js 9 | res/flowey_evil.png 10 | presets/presets.js 11 | presets/ruins-start.js 12 | 13 | NETWORK: 14 | * 15 | -------------------------------------------------------------------------------- /presets/asgore-normal.js: -------------------------------------------------------------------------------- 1 | presets["Asgore (normal)"] = {"ini":{"General":{"fun":"45","Room":"237","Kills":"0","Time":"0","Love":"1","Name":"Marty"},"Flowey":{"Met1":"1"}},"lines":["Marty","1","20","20","10","12","10","15","4","0","0","0","17","206","17","210","11","0","43","0","61","0","0","0","0","0","0","0","49","50","0","0","0","0","0","33","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","8","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","14","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","2","1","1","1","232","237","0"]}; 2 | -------------------------------------------------------------------------------- /presets/asgore-true.js: -------------------------------------------------------------------------------- 1 | presets["Asgore (true ending)"] = {"ini":{"General":{"fun":"45","Room":"237","Kills":"0","Time":"0","Love":"1","Name":"Marty"},"Flowey":{"Met1":"1"}},"lines":["Marty","1","20","20","10","12","10","15","4","0","0","0","17","206","17","210","11","0","43","0","61","0","0","0","0","0","0","0","49","50","0","0","0","0","0","33","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","8","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","14","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","12","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","2","1","1","1","232","237","0"]}; -------------------------------------------------------------------------------- /presets/omega-flowey.js: -------------------------------------------------------------------------------- 1 | presets["Omega Flowey"] = {"ini":{"General":{"fun":"45","Room":"237","Kills":"0","Time":"0","Love":"1","Name":"Marty"},"Flowey":{"Met1":"1"},"FFFFF":{"F":"1","P":"0"}},"lines":["Marty","1","20","20","10","12","10","15","4","0","0","0","17","206","17","210","11","0","43","0","61","0","0","0","0","0","0","0","49","50","0","0","0","0","0","33","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","8","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","14","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","2","1","1","1","232","237","0"]}; -------------------------------------------------------------------------------- /presets/presets.js: -------------------------------------------------------------------------------- 1 | presets = {}; 2 | -------------------------------------------------------------------------------- /presets/ruins-start.js: -------------------------------------------------------------------------------- 1 | presets["Ruins Start"] = { 2 | ini: { 3 | "General": { 4 | "fun": "45", 5 | "Room": "6", 6 | "Kills": "0", 7 | "Time": "0", 8 | "Love": "1", 9 | "Name": "Marty" 10 | }, 11 | "Flowey": { 12 | "Met1": "1" 13 | }, 14 | "FFFFF": { // technically produces invalid save but it should work fine 15 | "P": "0" 16 | } 17 | }, 18 | lines: [ 19 | "Marty", 20 | "1", 21 | "20", 22 | "20", 23 | "10", 24 | "0", 25 | "10", 26 | "0", 27 | "4", 28 | "0", 29 | "0", 30 | "0", 31 | "0", 32 | "0", 33 | "0", 34 | "0", 35 | "0", 36 | "0", 37 | "0", 38 | "0", 39 | "0", 40 | "0", 41 | "0", 42 | "0", 43 | "0", 44 | "0", 45 | "0", 46 | "0", 47 | "3", 48 | "4", 49 | "0", 50 | "0", 51 | "0", 52 | "0", 53 | "0", 54 | "33", 55 | "0", 56 | "0", 57 | "0", 58 | "0", 59 | "0", 60 | "0", 61 | "0", 62 | "0", 63 | "0", 64 | "0", 65 | "0", 66 | "0", 67 | "0", 68 | "0", 69 | "0", 70 | "0", 71 | "0", 72 | "0", 73 | "0", 74 | "8", 75 | "0", 76 | "0", 77 | "0", 78 | "0", 79 | "0", 80 | "0", 81 | "0", 82 | "0", 83 | "0", 84 | "0", 85 | "0", 86 | "0", 87 | "0", 88 | "0", 89 | "0", 90 | "0", 91 | "0", 92 | "0", 93 | "0", 94 | "0", 95 | "0", 96 | "0", 97 | "0", 98 | "0", 99 | "0", 100 | "0", 101 | "0", 102 | "0", 103 | "0", 104 | "0", 105 | "0", 106 | "0", 107 | "0", 108 | "0", 109 | "0", 110 | "0", 111 | "0", 112 | "0", 113 | "0", 114 | "0", 115 | "0", 116 | "0", 117 | "0", 118 | "0", 119 | "0", 120 | "0", 121 | "0", 122 | "0", 123 | "0", 124 | "0", 125 | "0", 126 | "0", 127 | "0", 128 | "0", 129 | "0", 130 | "0", 131 | "0", 132 | "0", 133 | "0", 134 | "0", 135 | "0", 136 | "0", 137 | "0", 138 | "0", 139 | "0", 140 | "0", 141 | "0", 142 | "0", 143 | "0", 144 | "0", 145 | "0", 146 | "0", 147 | "0", 148 | "0", 149 | "0", 150 | "0", 151 | "0", 152 | "0", 153 | "0", 154 | "0", 155 | "0", 156 | "0", 157 | "0", 158 | "0", 159 | "0", 160 | "0", 161 | "0", 162 | "0", 163 | "0", 164 | "0", 165 | "0", 166 | "0", 167 | "0", 168 | "0", 169 | "0", 170 | "0", 171 | "0", 172 | "0", 173 | "0", 174 | "0", 175 | "0", 176 | "0", 177 | "0", 178 | "0", 179 | "0", 180 | "0", 181 | "0", 182 | "0", 183 | "0", 184 | "0", 185 | "0", 186 | "0", 187 | "0", 188 | "0", 189 | "0", 190 | "0", 191 | "0", 192 | "0", 193 | "0", 194 | "0", 195 | "0", 196 | "0", 197 | "0", 198 | "0", 199 | "0", 200 | "0", 201 | "0", 202 | "0", 203 | "0", 204 | "0", 205 | "0", 206 | "0", 207 | "0", 208 | "0", 209 | "0", 210 | "0", 211 | "0", 212 | "0", 213 | "0", 214 | "0", 215 | "0", 216 | "0", 217 | "0", 218 | "0", 219 | "0", 220 | "0", 221 | "0", 222 | "0", 223 | "0", 224 | "0", 225 | "0", 226 | "0", 227 | "0", 228 | "0", 229 | "0", 230 | "0", 231 | "0", 232 | "0", 233 | "0", 234 | "0", 235 | "0", 236 | "0", 237 | "0", 238 | "0", 239 | "0", 240 | "0", 241 | "0", 242 | "0", 243 | "0", 244 | "0", 245 | "0", 246 | "0", 247 | "0", 248 | "0", 249 | "0", 250 | "0", 251 | "0", 252 | "0", 253 | "0", 254 | "0", 255 | "0", 256 | "0", 257 | "0", 258 | "0", 259 | "0", 260 | "0", 261 | "0", 262 | "0", 263 | "0", 264 | "0", 265 | "0", 266 | "0", 267 | "0", 268 | "0", 269 | "0", 270 | "0", 271 | "0", 272 | "0", 273 | "0", 274 | "0", 275 | "0", 276 | "0", 277 | "0", 278 | "0", 279 | "0", 280 | "0", 281 | "0", 282 | "0", 283 | "0", 284 | "0", 285 | "0", 286 | "0", 287 | "0", 288 | "0", 289 | "0", 290 | "0", 291 | "0", 292 | "0", 293 | "0", 294 | "0", 295 | "0", 296 | "0", 297 | "0", 298 | "0", 299 | "0", 300 | "0", 301 | "0", 302 | "0", 303 | "0", 304 | "0", 305 | "0", 306 | "0", 307 | "0", 308 | "0", 309 | "0", 310 | "0", 311 | "0", 312 | "0", 313 | "0", 314 | "0", 315 | "0", 316 | "0", 317 | "0", 318 | "0", 319 | "0", 320 | "0", 321 | "0", 322 | "0", 323 | "0", 324 | "0", 325 | "0", 326 | "0", 327 | "0", 328 | "0", 329 | "0", 330 | "0", 331 | "0", 332 | "0", 333 | "0", 334 | "0", 335 | "0", 336 | "0", 337 | "0", 338 | "0", 339 | "0", 340 | "0", 341 | "0", 342 | "0", 343 | "0", 344 | "0", 345 | "0", 346 | "0", 347 | "0", 348 | "0", 349 | "14", 350 | "0", 351 | "0", 352 | "0", 353 | "0", 354 | "0", 355 | "0", 356 | "0", 357 | "0", 358 | "0", 359 | "0", 360 | "0", 361 | "0", 362 | "0", 363 | "0", 364 | "0", 365 | "0", 366 | "0", 367 | "0", 368 | "0", 369 | "0", 370 | "0", 371 | "0", 372 | "0", 373 | "0", 374 | "0", 375 | "0", 376 | "0", 377 | "0", 378 | "0", 379 | "0", 380 | "0", 381 | "0", 382 | "0", 383 | "0", 384 | "0", 385 | "0", 386 | "0", 387 | "0", 388 | "0", 389 | "0", 390 | "0", 391 | "0", 392 | "0", 393 | "0", 394 | "0", 395 | "0", 396 | "0", 397 | "0", 398 | "0", 399 | "0", 400 | "0", 401 | "0", 402 | "0", 403 | "0", 404 | "0", 405 | "0", 406 | "0", 407 | "0", 408 | "0", 409 | "0", 410 | "0", 411 | "0", 412 | "0", 413 | "0", 414 | "0", 415 | "0", 416 | "0", 417 | "0", 418 | "0", 419 | "0", 420 | "0", 421 | "0", 422 | "0", 423 | "0", 424 | "0", 425 | "0", 426 | "0", 427 | "0", 428 | "0", 429 | "0", 430 | "0", 431 | "0", 432 | "0", 433 | "0", 434 | "0", 435 | "0", 436 | "0", 437 | "0", 438 | "0", 439 | "0", 440 | "0", 441 | "0", 442 | "0", 443 | "0", 444 | "0", 445 | "0", 446 | "0", 447 | "0", 448 | "0", 449 | "0", 450 | "0", 451 | "0", 452 | "0", 453 | "0", 454 | "0", 455 | "0", 456 | "0", 457 | "0", 458 | "0", 459 | "0", 460 | "0", 461 | "0", 462 | "0", 463 | "0", 464 | "0", 465 | "0", 466 | "0", 467 | "0", 468 | "0", 469 | "0", 470 | "0", 471 | "0", 472 | "0", 473 | "0", 474 | "0", 475 | "0", 476 | "0", 477 | "0", 478 | "0", 479 | "0", 480 | "0", 481 | "0", 482 | "0", 483 | "0", 484 | "0", 485 | "0", 486 | "0", 487 | "0", 488 | "0", 489 | "0", 490 | "0", 491 | "0", 492 | "0", 493 | "0", 494 | "0", 495 | "0", 496 | "0", 497 | "0", 498 | "0", 499 | "0", 500 | "0", 501 | "0", 502 | "0", 503 | "0", 504 | "0", 505 | "0", 506 | "0", 507 | "0", 508 | "0", 509 | "0", 510 | "0", 511 | "0", 512 | "0", 513 | "0", 514 | "0", 515 | "0", 516 | "0", 517 | "0", 518 | "0", 519 | "0", 520 | "0", 521 | "0", 522 | "0", 523 | "0", 524 | "0", 525 | "0", 526 | "0", 527 | "0", 528 | "0", 529 | "0", 530 | "0", 531 | "0", 532 | "0", 533 | "0", 534 | "0", 535 | "0", 536 | "0", 537 | "0", 538 | "0", 539 | "0", 540 | "0", 541 | "0", 542 | "0", 543 | "0", 544 | "0", 545 | "0", 546 | "0", 547 | "0", 548 | "0", 549 | "0", 550 | "0", 551 | "0", 552 | "0", 553 | "0", 554 | "0", 555 | "0", 556 | "0", 557 | "0", 558 | "0", 559 | "0", 560 | "0", 561 | "2", 562 | "1", 563 | "1", 564 | "0", 565 | "232", 566 | "6", 567 | "0", 568 | ] 569 | }; 570 | -------------------------------------------------------------------------------- /presets/sans-battle.js: -------------------------------------------------------------------------------- 1 | presets["Sans Battle"] = { 2 | ini: { 3 | "General": { 4 | "Name": "Chara", 5 | "Love": "19", 6 | "Time": "0", 7 | "Kills": "109", 8 | "Room": "231" 9 | } 10 | }, 11 | lines: [ 12 | "Chara", 13 | "19", 14 | "92", 15 | "20", 16 | "46", 17 | "99", 18 | "14", 19 | "99", 20 | "4", 21 | "50000", 22 | "0", 23 | "0", 24 | "11", 25 | "206", 26 | "61", 27 | "0", 28 | "43", 29 | "0", 30 | "43", 31 | "0", 32 | "43", 33 | "0", 34 | "16", 35 | "0", 36 | "16", 37 | "0", 38 | "16", 39 | "0", 40 | "52", 41 | "53", 42 | "0", 43 | "0", 44 | "0", 45 | "0", 46 | "0", 47 | "0", 48 | "0", 49 | "0", 50 | "0", 51 | "0", 52 | "0", 53 | "0", 54 | "0", 55 | "0", 56 | "0", 57 | "0", 58 | "0", 59 | "0", 60 | "0", 61 | "0", 62 | "0", 63 | "0", 64 | "0", 65 | "0", 66 | "0", 67 | "0", 68 | "0", 69 | "0", 70 | "0", 71 | "0", 72 | "0", 73 | "0", 74 | "0", 75 | "0", 76 | "0", 77 | "0", 78 | "0", 79 | "0", 80 | "0", 81 | "0", 82 | "0", 83 | "0", 84 | "0", 85 | "0", 86 | "0", 87 | "4", 88 | "0", 89 | "0", 90 | "0", 91 | "0", 92 | "0", 93 | "0", 94 | "1", 95 | "1", 96 | "1", 97 | "0", 98 | "0", 99 | "2", 100 | "0", 101 | "0", 102 | "0", 103 | "0", 104 | "0", 105 | "0", 106 | "0", 107 | "0", 108 | "0", 109 | "1", 110 | "0", 111 | "0", 112 | "0", 113 | "0", 114 | "0", 115 | "0", 116 | "0", 117 | "0", 118 | "0", 119 | "0", 120 | "0", 121 | "0", 122 | "0", 123 | "1", 124 | "0", 125 | "0", 126 | "0", 127 | "0", 128 | "0", 129 | "0", 130 | "0", 131 | "0", 132 | "0", 133 | "0", 134 | "0", 135 | "0", 136 | "0", 137 | "0", 138 | "0", 139 | "0", 140 | "0", 141 | "0", 142 | "0", 143 | "0", 144 | "0", 145 | "0", 146 | "0", 147 | "0", 148 | "0", 149 | "0", 150 | "0", 151 | "0", 152 | "0", 153 | "0", 154 | "0", 155 | "0", 156 | "0", 157 | "0", 158 | "0", 159 | "0", 160 | "0", 161 | "0", 162 | "0", 163 | "0", 164 | "0", 165 | "0", 166 | "0", 167 | "0", 168 | "0", 169 | "0", 170 | "0", 171 | "0", 172 | "0", 173 | "0", 174 | "0", 175 | "0", 176 | "0", 177 | "0", 178 | "0", 179 | "0", 180 | "0", 181 | "0", 182 | "0", 183 | "0", 184 | "0", 185 | "0", 186 | "0", 187 | "0", 188 | "0", 189 | "0", 190 | "0", 191 | "0", 192 | "0", 193 | "0", 194 | "0", 195 | "0", 196 | "0", 197 | "0", 198 | "0", 199 | "0", 200 | "0", 201 | "0", 202 | "0", 203 | "0", 204 | "0", 205 | "0", 206 | "0", 207 | "0", 208 | "0", 209 | "0", 210 | "0", 211 | "0", 212 | "0", 213 | "0", 214 | "0", 215 | "0", 216 | "0", 217 | "0", 218 | "0", 219 | "0", 220 | "0", 221 | "0", 222 | "0", 223 | "0", 224 | "0", 225 | "0", 226 | "0", 227 | "0", 228 | "0", 229 | "0", 230 | "0", 231 | "0", 232 | "0", 233 | "0", 234 | "0", 235 | "0", 236 | "0", 237 | "0", 238 | "0", 239 | "0", 240 | "0", 241 | "0", 242 | "0", 243 | "109", 244 | "21", 245 | "17", 246 | "21", 247 | "44", 248 | "0", 249 | "0", 250 | "0", 251 | "0", 252 | "0", 253 | "0", 254 | "0", 255 | "0", 256 | "0", 257 | "0", 258 | "0", 259 | "0", 260 | "0", 261 | "0", 262 | "0", 263 | "0", 264 | "0", 265 | "0", 266 | "0", 267 | "0", 268 | "0", 269 | "0", 270 | "0", 271 | "0", 272 | "0", 273 | "0", 274 | "0", 275 | "0", 276 | "0", 277 | "0", 278 | "0", 279 | "0", 280 | "0", 281 | "0", 282 | "0", 283 | "0", 284 | "0", 285 | "0", 286 | "0", 287 | "0", 288 | "0", 289 | "0", 290 | "0", 291 | "0", 292 | "0", 293 | "1", 294 | "1", 295 | "0", 296 | "0", 297 | "0", 298 | "0", 299 | "0", 300 | "0", 301 | "0", 302 | "0", 303 | "0", 304 | "0", 305 | "0", 306 | "0", 307 | "0", 308 | "0", 309 | "0", 310 | "0", 311 | "0", 312 | "0", 313 | "0", 314 | "0", 315 | "0", 316 | "0", 317 | "0", 318 | "0", 319 | "0", 320 | "0", 321 | "0", 322 | "0", 323 | "0", 324 | "0", 325 | "0", 326 | "0", 327 | "0", 328 | "0", 329 | "0", 330 | "0", 331 | "0", 332 | "0", 333 | "0", 334 | "0", 335 | "0", 336 | "0", 337 | "0", 338 | "0", 339 | "0", 340 | "0", 341 | "0", 342 | "0", 343 | "0", 344 | "0", 345 | "0", 346 | "0", 347 | "0", 348 | "0", 349 | "0", 350 | "0", 351 | "0", 352 | "0", 353 | "0", 354 | "0", 355 | "0", 356 | "0", 357 | "0", 358 | "0", 359 | "0", 360 | "0", 361 | "0", 362 | "0", 363 | "0", 364 | "0", 365 | "0", 366 | "0", 367 | "0", 368 | "0", 369 | "0", 370 | "0", 371 | "0", 372 | "0", 373 | "0", 374 | "0", 375 | "0", 376 | "0", 377 | "0", 378 | "0", 379 | "0", 380 | "0", 381 | "0", 382 | "0", 383 | "0", 384 | "0", 385 | "0", 386 | "0", 387 | "0", 388 | "0", 389 | "0", 390 | "0", 391 | "0", 392 | "1", 393 | "0", 394 | "0", 395 | "0", 396 | "0", 397 | "0", 398 | "0", 399 | "0", 400 | "0", 401 | "0", 402 | "0", 403 | "0", 404 | "0", 405 | "0", 406 | "0", 407 | "0", 408 | "0", 409 | "0", 410 | "0", 411 | "0", 412 | "0", 413 | "0", 414 | "0", 415 | "0", 416 | "0", 417 | "0", 418 | "0", 419 | "0", 420 | "0", 421 | "0", 422 | "0", 423 | "0", 424 | "0", 425 | "0", 426 | "0", 427 | "0", 428 | "0", 429 | "0", 430 | "0", 431 | "0", 432 | "0", 433 | "0", 434 | "0", 435 | "0", 436 | "0", 437 | "0", 438 | "0", 439 | "1", 440 | "0", 441 | "0", 442 | "0", 443 | "0", 444 | "1", 445 | "0", 446 | "0", 447 | "0", 448 | "0", 449 | "0", 450 | "0", 451 | "0", 452 | "0", 453 | "0", 454 | "0", 455 | "0", 456 | "0", 457 | "0", 458 | "0", 459 | "0", 460 | "0", 461 | "0", 462 | "0", 463 | "0", 464 | "0", 465 | "0", 466 | "0", 467 | "1", 468 | "0", 469 | "0", 470 | "0", 471 | "0", 472 | "0", 473 | "0", 474 | "0", 475 | "0", 476 | "0", 477 | "0", 478 | "0", 479 | "0", 480 | "0", 481 | "0", 482 | "0", 483 | "0", 484 | "0", 485 | "0", 486 | "0", 487 | "0", 488 | "0", 489 | "0", 490 | "0", 491 | "0", 492 | "0", 493 | "0", 494 | "0", 495 | "0", 496 | "0", 497 | "0", 498 | "0", 499 | "0", 500 | "0", 501 | "0", 502 | "0", 503 | "0", 504 | "0", 505 | "0", 506 | "0", 507 | "0", 508 | "0", 509 | "0", 510 | "0", 511 | "0", 512 | "0", 513 | "0", 514 | "0", 515 | "0", 516 | "0", 517 | "0", 518 | "0", 519 | "0", 520 | "0", 521 | "0", 522 | "0", 523 | "0", 524 | "0", 525 | "0", 526 | "0", 527 | "0", 528 | "0", 529 | "0", 530 | "0", 531 | "0", 532 | "0", 533 | "0", 534 | "0", 535 | "0", 536 | "0", 537 | "0", 538 | "0", 539 | "0", 540 | "0", 541 | "0", 542 | "0", 543 | "0", 544 | "0", 545 | "0", 546 | "0", 547 | "0", 548 | "0", 549 | "0", 550 | "0", 551 | "0", 552 | "0", 553 | "0", 554 | "199", 555 | "1", 556 | "1", 557 | "1", 558 | "0", 559 | "231", 560 | "0" 561 | ] 562 | }; 563 | -------------------------------------------------------------------------------- /presets/true-pacifist.js: -------------------------------------------------------------------------------- 1 | presets["True Pacifist Ending"] = {"ini":{"General":{"fun":"45","Room":"236","Kills":"0","Time":"0","Love":"1","Name":"Marty"},"Flowey":{"Met1":"1"}},"lines":["Marty","1","20","20","10","0","10","0","4","0","0","0","61","206","61","210","37","220","16","221","0","0","0","0","0","0","0","0","3","4","0","0","0","0","0","33","0","1","0","0","0","0","0","0","2","0","0","0","0","0","0","0","0","0","0","8","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","14","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","999","1","1","1","232","236","0"]}; -------------------------------------------------------------------------------- /presets/undyne-the-undying.js: -------------------------------------------------------------------------------- 1 | presets["Undyne the Undying"] = {"ini":{"General":{"fun":"45","Room":"132","Kills":"59","Time":"0","Love":"10","Name":"Chara"},"Flowey":{"Met1":"1"}},"lines":["Chara","10","56","20","15","7","13","7","4","1648","683","0","16","206","16","0","16","0","35","0","23","0","41","0","41","0","11","0","25","24","0","0","0","0","0","33","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","8","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","4","0","0","0","0","0","0","1","1","1","0","0","2","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","59","21","17","21","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","14","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","2","1","1","1","232","132","0"]}; 2 | -------------------------------------------------------------------------------- /res/download.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /res/flowey_evil.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crumblingstatue/FloweysTimeMachine/55f40fc4c55427676df315caaafe348581b26ba8/res/flowey_evil.png -------------------------------------------------------------------------------- /res/flowey_laugh.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crumblingstatue/FloweysTimeMachine/55f40fc4c55427676df315caaafe348581b26ba8/res/flowey_laugh.mp3 -------------------------------------------------------------------------------- /res/flowey_nice.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crumblingstatue/FloweysTimeMachine/55f40fc4c55427676df315caaafe348581b26ba8/res/flowey_nice.png -------------------------------------------------------------------------------- /res/flowey_wink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crumblingstatue/FloweysTimeMachine/55f40fc4c55427676df315caaafe348581b26ba8/res/flowey_wink.png -------------------------------------------------------------------------------- /res/heart.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /res/load.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crumblingstatue/FloweysTimeMachine/55f40fc4c55427676df315caaafe348581b26ba8/res/load.png -------------------------------------------------------------------------------- /res/star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crumblingstatue/FloweysTimeMachine/55f40fc4c55427676df315caaafe348581b26ba8/res/star.png -------------------------------------------------------------------------------- /research/README.md: -------------------------------------------------------------------------------- 1 | # Research 2 | 3 | Research into the mechanics of save games in undertale. 4 | 5 | ## Initial state 6 | 7 | Until you pick a name and begin the game, there is nothing. 8 | 9 | ## First play 10 | 11 | When you first pick a name and enter the world, undertale.ini gets created with the following data 12 | ``` 13 | [General] 14 | fun="45.000000" 15 | 16 | ``` 17 | 18 | ## Meeting Flowey 19 | When you first meet Flowey, the following entry gets added: 20 | ``` 21 | [Flowey]] 22 | Met1="1.000000" 23 | ``` 24 | ## First save 25 | When you first save the game, the following entries get added: 26 | ``` 27 | [General] 28 | Room="6.000000" 29 | Kills="0.000000" 30 | Time="5273.000000" 31 | Love="1.000000" 32 | Name="your_character_name" 33 | 34 | ``` 35 | 36 | `Fun` gets changed to `"33.000000"`. 37 | 38 | Two files named `file0` and `file9` also get created. 39 | They are two identical files at this time. 40 | The initial state can be found here in the `research/` directory as `file0_init`. 41 | The description table can be found as `savefile.md`. 42 | -------------------------------------------------------------------------------- /research/TODO.md: -------------------------------------------------------------------------------- 1 | - Write a diffing tool that properly ignores whitespace change at end of lines 2 | and perhaps sorts Undertale.ini so it isn't random anytime. 3 | Could do it without git, and automatically by keeping the file in memory and polling for 4 | changes on filesystem. 5 | -------------------------------------------------------------------------------- /research/file0_init: -------------------------------------------------------------------------------- 1 | Zoey 2 | 1 3 | 20 4 | 20 5 | 10 6 | 0 7 | 10 8 | 0 9 | 4 10 | 0 11 | 0 12 | 0 13 | 0 14 | 0 15 | 0 16 | 0 17 | 0 18 | 0 19 | 0 20 | 0 21 | 0 22 | 0 23 | 0 24 | 0 25 | 0 26 | 0 27 | 0 28 | 0 29 | 3 30 | 4 31 | 0 32 | 0 33 | 0 34 | 0 35 | 0 36 | 33 37 | 0 38 | 0 39 | 0 40 | 0 41 | 0 42 | 0 43 | 0 44 | 0 45 | 0 46 | 0 47 | 0 48 | 0 49 | 0 50 | 0 51 | 0 52 | 0 53 | 0 54 | 0 55 | 0 56 | 8 57 | 0 58 | 0 59 | 0 60 | 0 61 | 0 62 | 0 63 | 0 64 | 0 65 | 0 66 | 0 67 | 0 68 | 0 69 | 0 70 | 0 71 | 0 72 | 0 73 | 0 74 | 0 75 | 0 76 | 0 77 | 0 78 | 0 79 | 0 80 | 0 81 | 0 82 | 0 83 | 0 84 | 0 85 | 0 86 | 0 87 | 0 88 | 0 89 | 0 90 | 0 91 | 0 92 | 0 93 | 0 94 | 0 95 | 0 96 | 0 97 | 0 98 | 0 99 | 0 100 | 0 101 | 0 102 | 0 103 | 0 104 | 0 105 | 0 106 | 0 107 | 0 108 | 0 109 | 0 110 | 0 111 | 0 112 | 0 113 | 0 114 | 0 115 | 0 116 | 0 117 | 0 118 | 0 119 | 0 120 | 0 121 | 0 122 | 0 123 | 0 124 | 0 125 | 0 126 | 0 127 | 0 128 | 0 129 | 0 130 | 0 131 | 0 132 | 0 133 | 0 134 | 0 135 | 0 136 | 0 137 | 0 138 | 0 139 | 0 140 | 0 141 | 0 142 | 0 143 | 0 144 | 0 145 | 0 146 | 0 147 | 0 148 | 0 149 | 0 150 | 0 151 | 0 152 | 0 153 | 0 154 | 0 155 | 0 156 | 0 157 | 0 158 | 0 159 | 0 160 | 0 161 | 0 162 | 0 163 | 0 164 | 0 165 | 0 166 | 0 167 | 0 168 | 0 169 | 0 170 | 0 171 | 0 172 | 0 173 | 0 174 | 0 175 | 0 176 | 0 177 | 0 178 | 0 179 | 0 180 | 0 181 | 0 182 | 0 183 | 0 184 | 0 185 | 0 186 | 0 187 | 0 188 | 0 189 | 0 190 | 0 191 | 0 192 | 0 193 | 0 194 | 0 195 | 0 196 | 0 197 | 0 198 | 0 199 | 0 200 | 0 201 | 0 202 | 0 203 | 0 204 | 0 205 | 0 206 | 0 207 | 0 208 | 0 209 | 0 210 | 0 211 | 0 212 | 0 213 | 0 214 | 0 215 | 0 216 | 0 217 | 0 218 | 0 219 | 0 220 | 0 221 | 0 222 | 0 223 | 0 224 | 0 225 | 0 226 | 0 227 | 0 228 | 0 229 | 0 230 | 0 231 | 0 232 | 0 233 | 0 234 | 0 235 | 0 236 | 0 237 | 0 238 | 0 239 | 0 240 | 0 241 | 0 242 | 0 243 | 0 244 | 0 245 | 0 246 | 0 247 | 0 248 | 0 249 | 0 250 | 0 251 | 0 252 | 0 253 | 0 254 | 0 255 | 0 256 | 0 257 | 0 258 | 0 259 | 0 260 | 0 261 | 0 262 | 0 263 | 0 264 | 0 265 | 0 266 | 0 267 | 0 268 | 0 269 | 0 270 | 0 271 | 0 272 | 0 273 | 0 274 | 0 275 | 0 276 | 0 277 | 0 278 | 0 279 | 0 280 | 0 281 | 0 282 | 0 283 | 0 284 | 0 285 | 0 286 | 0 287 | 0 288 | 0 289 | 0 290 | 0 291 | 0 292 | 0 293 | 0 294 | 0 295 | 0 296 | 0 297 | 0 298 | 0 299 | 0 300 | 0 301 | 0 302 | 0 303 | 0 304 | 0 305 | 0 306 | 0 307 | 0 308 | 0 309 | 0 310 | 0 311 | 0 312 | 0 313 | 0 314 | 0 315 | 0 316 | 0 317 | 0 318 | 0 319 | 0 320 | 0 321 | 0 322 | 0 323 | 0 324 | 0 325 | 0 326 | 0 327 | 0 328 | 0 329 | 0 330 | 0 331 | 14 332 | 0 333 | 0 334 | 0 335 | 0 336 | 0 337 | 0 338 | 0 339 | 0 340 | 0 341 | 0 342 | 0 343 | 0 344 | 0 345 | 0 346 | 0 347 | 0 348 | 0 349 | 0 350 | 0 351 | 0 352 | 0 353 | 0 354 | 0 355 | 0 356 | 0 357 | 0 358 | 0 359 | 0 360 | 0 361 | 0 362 | 0 363 | 0 364 | 0 365 | 0 366 | 0 367 | 0 368 | 0 369 | 0 370 | 0 371 | 0 372 | 0 373 | 0 374 | 0 375 | 0 376 | 0 377 | 0 378 | 0 379 | 0 380 | 0 381 | 0 382 | 0 383 | 0 384 | 0 385 | 0 386 | 0 387 | 0 388 | 0 389 | 0 390 | 0 391 | 0 392 | 0 393 | 0 394 | 0 395 | 0 396 | 0 397 | 0 398 | 0 399 | 0 400 | 0 401 | 0 402 | 0 403 | 0 404 | 0 405 | 0 406 | 0 407 | 0 408 | 0 409 | 0 410 | 0 411 | 0 412 | 0 413 | 0 414 | 0 415 | 0 416 | 0 417 | 0 418 | 0 419 | 0 420 | 0 421 | 0 422 | 0 423 | 0 424 | 0 425 | 0 426 | 0 427 | 0 428 | 0 429 | 0 430 | 0 431 | 0 432 | 0 433 | 0 434 | 0 435 | 0 436 | 0 437 | 0 438 | 0 439 | 0 440 | 0 441 | 0 442 | 0 443 | 0 444 | 0 445 | 0 446 | 0 447 | 0 448 | 0 449 | 0 450 | 0 451 | 0 452 | 0 453 | 0 454 | 0 455 | 0 456 | 0 457 | 0 458 | 0 459 | 0 460 | 0 461 | 0 462 | 0 463 | 0 464 | 0 465 | 0 466 | 0 467 | 0 468 | 0 469 | 0 470 | 0 471 | 0 472 | 0 473 | 0 474 | 0 475 | 0 476 | 0 477 | 0 478 | 0 479 | 0 480 | 0 481 | 0 482 | 0 483 | 0 484 | 0 485 | 0 486 | 0 487 | 0 488 | 0 489 | 0 490 | 0 491 | 0 492 | 0 493 | 0 494 | 0 495 | 0 496 | 0 497 | 0 498 | 0 499 | 0 500 | 0 501 | 0 502 | 0 503 | 0 504 | 0 505 | 0 506 | 0 507 | 0 508 | 0 509 | 0 510 | 0 511 | 0 512 | 0 513 | 0 514 | 0 515 | 0 516 | 0 517 | 0 518 | 0 519 | 0 520 | 0 521 | 0 522 | 0 523 | 0 524 | 0 525 | 0 526 | 0 527 | 0 528 | 0 529 | 0 530 | 0 531 | 0 532 | 0 533 | 0 534 | 0 535 | 0 536 | 0 537 | 0 538 | 0 539 | 0 540 | 0 541 | 0 542 | 0 543 | 2 544 | 1 545 | 1 546 | 0 547 | 232 548 | 6 549 | 5273 -------------------------------------------------------------------------------- /research/genocide-requirements.txt: -------------------------------------------------------------------------------- 1 | # Toriel 2 | - Ruins kill count must be high enough 3 | # Snowdin X Left mode 4 | - line 76 must be 4 5 | -------------------------------------------------------------------------------- /research/savefile.md: -------------------------------------------------------------------------------- 1 | # Save files 2 | 3 | The save files are a list of values separated by newline. 4 | 5 | There are two save files, `file0` and `file9`. When you save your game, both get written to the same values. 6 | It is unknown why there are two save files instead of one. `file9` seem to be written to when you load a save file. 7 | Only `file0` is required to load a game. `file9` might be used as a backup, or when Flowey breaks your main save game. 8 | A `file8` also gets created when you fight Flowey after he killed Asgore. 9 | 10 | Line | Description 11 | ----:| ----------- 12 | 1 | Character name 13 | 2 | LV 14 | 3 | HP 15 | 5 | AT 16 | 6 | Weapon AT 17 | 7 | DF 18 | 8 | Armor DF 19 | 10 | EXP 20 | 11 | GOLD 21 | 12 | Kills 22 | 13 | Inventory slot 1. See `main.js` for a list of items. 23 | 14 | Cellphone talk option 1. See `main.js for a list of options.` This actually takes an item id, but item ids above 200 are cellphone options. If you put an item in this slot, you can use it indefinitely because it doesn't get used up. 24 | 15 | Inventory slot 2 25 | 16 | Cellphone talk option 2 26 | 17 | Inventory slot 3 27 | 18 | Cellphone talk option 3 28 | 19 | Inventory slot 4 29 | 20 | Cellphone talk option 4 30 | 21 | Inventory slot 5 31 | 22 | Cellphone talk option 5 32 | 23 | Inventory slot 6 33 | 24 | Cellphone talk option 6 34 | 25 | Inventory slot 7 35 | 26 | Cellphone talk option 7 36 | 27 | Inventory slot 8 37 | 28 | Cellphone talk option 8 38 | 29 | Weapon 39 | 30 | Armor 40 | 39 | Hotland genocide 0->1 (Mettaton?) 41 | 41 | `0->1` if you talk to training dummy. `1->0` after you meet first Froggit. 42 | 42 | Toriel's house 0->1, snowdin 1->0 43 | 43 | `0->1` if you kill training dummy. `0->1` if you kill first Froggit (but spared dummy). `1->0` if nobody came. 44 | 45 | `0->1` if you kill training dummy. `0->2` if you talk to training dummy. 45 | 46 | Hotland genocide 1->0 46 | 47 | Core genocide 0->1 47 | 51 | Waterfall genocide 0->1->3 48 | 55 | Toriel's house 0->1 49 | 56 | Gets incremented every time you save. Purpose unknown. 50 | 61 | `0->1` after you meet first Froggit. 51 | 65 | How many candies you took from candy room. 52 | 76 | Toriel's house 0->3, 3->4. This must be 4 to allow Snowdin genocide mode. 53 | 83 | Snowdin genocide 0->1 (no moving dog) 54 | 84 | Snowdin genocide 0->1 (dog guards) 55 | 85 | Snowdin genocide 0->1 (greater dog) 56 | 88 | 0 -> Comedian got away failure, 2 -> OK 57 | 93 | Snowdin genocide 0->1 58 | 95 | Snowdin genocide 0->1 59 | 98 | Snowdin genocide 0->1 (Papyrus) 60 | 99 | Snowdin genocide 0->1 61 | 101 | Snowdin genocide 0->1 62 | 119 | Papyrus friendship progress? 1 - front of house, 2 - in house 4 - finished 63 | 112 | Waterfall genocide 0->1 (Shyren) 64 | 121 | Waterfall genocide 0->2 65 | 122 | Waterfall genocide 0->10 66 | 231 | `0->202` at second save point. 67 | 232 | ? kills 68 | 233 | Ruins kills 69 | 234 | Snowdin kills 70 | 235 | Waterfall kills 71 | 236 | Hotland kills 72 | 252 | `0->1` if nobody came. 73 | 253 | `0->1` nobody came snowdin? 74 | 282 | Waterfall genocide 0->1 (Undyne genocide 1) 75 | 283 | Waterfall genocide 0->1 (Mad Dummy) 76 | 301 | Waterfall genocide 0->1 (before cave bridge) 77 | 302 | Throne room genocide 0->1 (Sans?) 78 | 284 | 0->4 snowdin genocide 79 | 381 | Waterfall genocide 0->1 (Undyne genocide 2) 80 | 385 | Waterfall genocide 0->1 81 | 387 | Waterfall genocide 0->1 82 | 388 | Waterfall genocide 4->6 83 | 389 | Waterfall genocide 0->8 (before cave bridge) 84 | 391 | Waterfall genocide 0->1->0 85 | 392 | Waterfall genocide 0->0.08 -> 0 86 | 393 | Waterfall genocide 0 -> 0.5 87 | 394 | Waterfall genocide 0->272->-1 88 | 395 | Waterfall genocide 273->-1 89 | 413 | Hotland genocide 0->10 90 | 427 | Hotland genocide 0->6 91 | 428 | Hotland genocide 0->1 (Muffet) 92 | 429 | Hotland genocide 0->4 (no kills inbetween) 93 | 433 | Hotland genocide 0->1 (bro guards) 94 | 439 | Hotland genocide 3->4 95 | 456 | Hotland genocide 0->1 (Mettaton) 96 | 462 | Hotland genocide 0->1 (after you kill Mettaton) 97 | 463 | Hotland genocide 0->1 (after you kill Mettaton) 98 | 481 | Hotland genocide 0->17 (probably flowey dialogue) 99 | 483 | Hotland genocide 0->1 100 | 484 | Hotland genocide 0->1 101 | 485 | Hotland genocide 0->1 102 | 486 | Hotland genocide 0->2 103 | 487 | Hotland genocide 0->1 104 | 524 | If it's 12, Toriel will intervene in Asgore battle, and you can get pacifist ending. 105 | 527 | Waterfall genocide 0->-1 106 | 543 | Gets increased by varying values as you are making progress in the ruins. Possibly Toriel event marker. 25 when you killed toriel. 47 in snowdin spaghetti. Hmm. 107 | 546 | Player has cellphone. 108 | 547 | `232->235` if nobody came. 235->-999 waterfall genocide 109 | 548 | Room the player is located in. See the `main.js` for a list of rooms. 110 | 549 | The game time. Same as `Time` in the ini. 111 | -------------------------------------------------------------------------------- /research/scratchpad.md: -------------------------------------------------------------------------------- 1 | ## Sparing Papyrus ## 2 | 3 | New section 'Papyrus' 4 | PS => "1.000000" 5 | 6 | > let's be friends 7 | 8 | ### save ### 9 | ``` 10 | unknown (99) changed: '0' to '1 ' 11 | unknown (119) changed: '0' to '1 ' 12 | unknown (543) changed: '2' to '101 ' 13 | unknown (547) changed: '232' to '239 ' 14 | ``` 15 | ### Second save ### 16 | ``` 17 | unknown (119) changed: '1' to '2 ' 18 | unknown (547) changed: '232' to '239 ' 19 | ``` 20 | New section 'Papyrus' 21 | PD => "1.000000" 22 | 23 | ### Third save ### 24 | ``` 25 | cellphone 1 (14) changed: '0 ' to '210 ' 26 | unknown (119) changed: '2 ' to '4 ' 27 | unknown (314) changed: '0 ' to '1 ' 28 | ``` 29 | -------------------------------------------------------------------------------- /research/system_information_962: -------------------------------------------------------------------------------- 1 | `a` 2 | 3 | This gets created after Chara deletes the world. 4 | The save data is deleted. 5 | If there is system_information_963, you can play again. 6 | -------------------------------------------------------------------------------- /research/undertale_ini.txt: -------------------------------------------------------------------------------- 1 | [Toriel] 2 | TK = (1 if you killed toriel) 3 | [Flowey] 4 | truename => "1.000000" #\ 5 | # - When you meet Flowey after killed toriel 6 | alter2 => "1.000000" #/ 7 | [Sans] 8 | F => "1.000000" # How many times Sans kills you in genocide 9 | -------------------------------------------------------------------------------- /style.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: "Undertale"; 3 | src: url("fonts/Undertale-Regular.eot"); 4 | 5 | src: url("fonts/Undertale-Regular.eot?#iefix") format("embedded-opentype"), 6 | url("fonts/Undertale-Regular.woff") format("woff"), 7 | url("fonts/Undertale-Regular.ttf") format("truetype"), 8 | url("fonts/Undertale-Regular.svg#svgFontName") format("svg"); 9 | } 10 | 11 | @font-face { 12 | font-family: "Undertale-Bold"; 13 | src: url("fonts/Undertale-Bold.eot"); 14 | 15 | src: url("fonts/Undertale-Bold.eot?#iefix") format("embedded-opentype"), 16 | url("fonts/Undertale-Bold.woff") format("woff"), 17 | url("fonts/Undertale-Bold.ttf") format("truetype"), 18 | url("fonts/Undertale-Bold.svg#svgFontName") format("svg"); 19 | } 20 | 21 | * { 22 | font-family: "Undertale-Bold", monospace; 23 | color: #fff; 24 | } 25 | 26 | body { 27 | margin: 2rem auto; 28 | background: #000; 29 | max-width: 64rem; 30 | } 31 | 32 | h1 { 33 | font-size: 1.5rem; 34 | line-height: 2rem; 35 | margin: 0; 36 | } 37 | 38 | h3 { 39 | padding-top: 0.5rem; 40 | padding-bottom: 0.25rem; 41 | margin: 0; 42 | } 43 | 44 | a { 45 | font-size: 1.25rem; 46 | color: #f4e656; 47 | text-decoration: none; 48 | margin: 0; 49 | } 50 | 51 | a:hover { 52 | color: #f9a64c; 53 | margin: 0; 54 | } 55 | 56 | p { 57 | margin: 0; 58 | } 59 | 60 | header { 61 | display: flex; 62 | margin: auto; 63 | /* align-items: center; 64 | justify-content: center; */ 65 | } 66 | 67 | section { 68 | display: grid; 69 | grid-template-columns: repeat(3, minmax(0, 1fr)); 70 | -moz-gap: 0.325rem; 71 | gap: 0.325rem; 72 | margin-top: 0.5rem; 73 | } 74 | 75 | fieldset { 76 | background: #000; 77 | border: 3px solid #fff; 78 | padding-bottom: 0.9rem; 79 | } 80 | 81 | legend { 82 | font-size: 1.25rem; 83 | } 84 | 85 | .disabled { 86 | background: #151515; 87 | pointer-events: none; 88 | } 89 | 90 | button, 91 | select, 92 | input:not([type="file"]):not([type="checkbox"]), 93 | [for="ini-file"], 94 | [for="sav-file"] { 95 | box-sizing: border-box; 96 | background: #090909; 97 | border: 2px solid #292929; 98 | font-size: 100%; 99 | display: flex; 100 | -moz-gap: 0.325rem; 101 | gap: 0.325rem; 102 | align-items: center; 103 | padding-left: 0.5rem; 104 | padding-right: 0.5rem; 105 | height: 2.25rem; 106 | justify-content: center; 107 | appearance: none; 108 | margin: 0; 109 | } 110 | 111 | .checkbox { 112 | margin-top: 0.25rem; 113 | display: flex; 114 | align-items: center; 115 | -moz-gap: 0.5rem; 116 | gap: 0.5rem; 117 | } 118 | 119 | [type="checkbox"] { 120 | -webkit-appearance: none; 121 | -moz-appearance: none; 122 | appearance: none; 123 | vertical-align: middle; 124 | width: 1.25rem; 125 | height: 1.25rem; 126 | color: #fb984a; 127 | background: #090909; 128 | border: 2px solid #292929; 129 | margin: 0 0 1px 0; 130 | } 131 | 132 | select { 133 | background-repeat: no-repeat; 134 | background-position: right; 135 | background-size: 14px; 136 | background-origin: content-box; 137 | background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 24 24' fill='gray' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M0 7.33l2.829-2.83 9.175 9.339 9.167-9.339 2.829 2.83-11.996 12.17z'/%3e%3c/svg%3e"); 138 | } 139 | 140 | [type="checkbox"]:checked { 141 | background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e"); 142 | background-color: currentColor; 143 | } 144 | 145 | button:focus, 146 | button:hover, 147 | select:focus, 148 | input:not([type="file"]):not([type="checkbox"]):focus, 149 | [for="ini-file"]:focus, 150 | [for="ini-file"]:hover, 151 | [for="sav-file"]:focus, 152 | [for="sav-file"]:hover { 153 | border: 2px solid #fff; 154 | font-size: 100%; 155 | outline: none; 156 | } 157 | 158 | button, 159 | [for="ini-file"], 160 | [for="sav-file"] { 161 | cursor: pointer; 162 | } 163 | 164 | ::placeholder { 165 | color: #aaaaaa; 166 | } 167 | 168 | .flex { 169 | display: flex; 170 | flex-wrap: wrap; 171 | } 172 | 173 | .items-center { 174 | align-items: center; 175 | } 176 | 177 | .mt-1\.5 { 178 | margin-top: 0.325rem; 179 | } 180 | 181 | .mt-6 { 182 | margin-top: 1.5rem; 183 | } 184 | 185 | .w-full { 186 | width: 100%; 187 | } 188 | 189 | .grid { 190 | display: grid; 191 | -moz-gap: 0.325rem; 192 | gap: 0.325rem; 193 | } 194 | 195 | .grid-cols-2 { 196 | display: grid; 197 | grid-template-columns: repeat(2, minmax(0, 1fr)); 198 | -moz-gap: 0.325rem; 199 | gap: 0.325rem; 200 | } 201 | 202 | .grid-cols-3 { 203 | display: grid; 204 | grid-template-columns: repeat(3, minmax(0, 1fr)); 205 | -moz-gap: 0.325rem; 206 | gap: 0.325rem; 207 | } 208 | 209 | .grid-cols-4 { 210 | display: grid; 211 | grid-template-columns: repeat(4, minmax(0, 1fr)); 212 | -moz-gap: 0.325rem; 213 | gap: 0.325rem; 214 | } 215 | 216 | .grid-cols-6 { 217 | display: grid; 218 | grid-template-columns: repeat(6, minmax(0, 1fr)); 219 | -moz-gap: 0.325rem; 220 | gap: 0.325rem; 221 | } 222 | 223 | .grid-cols-7 { 224 | display: grid; 225 | grid-template-columns: repeat(7, minmax(0, 1fr)); 226 | -moz-gap: 0.325rem; 227 | gap: 0.325rem; 228 | } 229 | 230 | .col-span-2 { 231 | grid-column: span 2 / span 2; 232 | } 233 | 234 | .col-span-3 { 235 | grid-column: span 3 / span 3; 236 | } 237 | 238 | .col-span-4 { 239 | grid-column: span 4 / span 4; 240 | } 241 | 242 | .row-span-2 { 243 | grid-row: span 2 / span 2; 244 | } 245 | 246 | th { 247 | text-align: left; 248 | } 249 | 250 | td:first-child { 251 | color: #bbbbbb; 252 | } 253 | 254 | .gray { 255 | color: #888888; 256 | } 257 | 258 | .red { 259 | color: #ff0000; 260 | } 261 | 262 | .hidden { 263 | display: none; 264 | } 265 | -------------------------------------------------------------------------------- /watcher/.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | -------------------------------------------------------------------------------- /watcher/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "ansi_term" 7 | version = "0.7.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "1f46cd5b1d660c938e3f92dfe7a73d832b3281479363dd0cd9c1c2fbf60f7962" 10 | 11 | [[package]] 12 | name = "bitflags" 13 | version = "0.3.3" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "32866f4d103c4e438b1db1158aa1b1a80ee078e5d77a59a2f906fd62a577389c" 16 | 17 | [[package]] 18 | name = "bitflags" 19 | version = "0.4.0" 20 | source = "registry+https://github.com/rust-lang/crates.io-index" 21 | checksum = "8dead7461c1127cf637931a1e50934eb6eee8bff2f74433ac7909e9afcee04a3" 22 | 23 | [[package]] 24 | name = "bytes" 25 | version = "0.3.0" 26 | source = "registry+https://github.com/rust-lang/crates.io-index" 27 | checksum = "c129aff112dcc562970abb69e2508b40850dd24c274761bb50fb8a0067ba6c27" 28 | 29 | [[package]] 30 | name = "cfg-if" 31 | version = "0.1.0" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "de1e760d7b6535af4241fca8bd8adf68e2e7edacc6b29f5d399050c5e48cf88c" 34 | 35 | [[package]] 36 | name = "filetime" 37 | version = "0.1.10" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "5363ab8e4139b8568a6237db5248646e5a8a2f89bd5ccb02092182b11fd3e922" 40 | dependencies = [ 41 | "libc 0.2.126", 42 | ] 43 | 44 | [[package]] 45 | name = "fsevent" 46 | version = "0.2.14" 47 | source = "registry+https://github.com/rust-lang/crates.io-index" 48 | checksum = "31a6d4f88a3b2d6c8620f2541c085ecca7ccedd383e3e794fb36044d243fd023" 49 | dependencies = [ 50 | "bitflags 0.4.0", 51 | "fsevent-sys", 52 | "libc 0.2.126", 53 | ] 54 | 55 | [[package]] 56 | name = "fsevent-sys" 57 | version = "0.1.5" 58 | source = "registry+https://github.com/rust-lang/crates.io-index" 59 | checksum = "72e33a926306442d961595c3a325864326ca4287795e106dae8993afe484ede6" 60 | dependencies = [ 61 | "libc 0.2.126", 62 | ] 63 | 64 | [[package]] 65 | name = "inotify" 66 | version = "0.1.12" 67 | source = "registry+https://github.com/rust-lang/crates.io-index" 68 | checksum = "97f24cabe84c981a9a10dc19b0030020d683a93c55240c2ba220e149d68fd8ee" 69 | dependencies = [ 70 | "libc 0.1.12", 71 | ] 72 | 73 | [[package]] 74 | name = "kernel32-sys" 75 | version = "0.2.1" 76 | source = "registry+https://github.com/rust-lang/crates.io-index" 77 | checksum = "b5b5e7edf375e6d26243bde172f1d5ed1446f4a766fc9b7006e1fd27258243f1" 78 | dependencies = [ 79 | "winapi 0.2.6", 80 | "winapi-build", 81 | ] 82 | 83 | [[package]] 84 | name = "libc" 85 | version = "0.1.12" 86 | source = "registry+https://github.com/rust-lang/crates.io-index" 87 | checksum = "e32a70cf75e5846d53a673923498228bbec6a8624708a9ea5645f075d6276122" 88 | 89 | [[package]] 90 | name = "libc" 91 | version = "0.2.126" 92 | source = "registry+https://github.com/rust-lang/crates.io-index" 93 | checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" 94 | 95 | [[package]] 96 | name = "log" 97 | version = "0.3.6" 98 | source = "registry+https://github.com/rust-lang/crates.io-index" 99 | checksum = "ab83497bf8bf4ed2a74259c1c802351fcd67a65baa86394b6ba73c36f4838054" 100 | 101 | [[package]] 102 | name = "mio" 103 | version = "0.5.0" 104 | source = "registry+https://github.com/rust-lang/crates.io-index" 105 | checksum = "7b506ea50508bd30f10fd9eca67095a3f22ca63dc7c0415634cac28ff23a3faa" 106 | dependencies = [ 107 | "bytes", 108 | "libc 0.1.12", 109 | "log", 110 | "miow", 111 | "net2", 112 | "nix", 113 | "slab", 114 | "time", 115 | "winapi 0.2.6", 116 | ] 117 | 118 | [[package]] 119 | name = "miow" 120 | version = "0.1.2" 121 | source = "registry+https://github.com/rust-lang/crates.io-index" 122 | checksum = "4e93d633d34b8ff65a24566d67d49703e7a5c7ac2844d6139a9fc441a799e89a" 123 | dependencies = [ 124 | "kernel32-sys", 125 | "net2", 126 | "winapi 0.2.6", 127 | "ws2_32-sys", 128 | ] 129 | 130 | [[package]] 131 | name = "net2" 132 | version = "0.2.37" 133 | source = "registry+https://github.com/rust-lang/crates.io-index" 134 | checksum = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae" 135 | dependencies = [ 136 | "cfg-if", 137 | "libc 0.2.126", 138 | "winapi 0.3.9", 139 | ] 140 | 141 | [[package]] 142 | name = "nix" 143 | version = "0.4.2" 144 | source = "registry+https://github.com/rust-lang/crates.io-index" 145 | checksum = "afbbf1030ee400300c3baacae708faca40231046f20b2664b161508c7959adde" 146 | dependencies = [ 147 | "bitflags 0.3.3", 148 | "libc 0.1.12", 149 | ] 150 | 151 | [[package]] 152 | name = "notify" 153 | version = "2.5.5" 154 | source = "registry+https://github.com/rust-lang/crates.io-index" 155 | checksum = "10d1f7ba7785f5cf6ad767d6f069e14b3d40b903cd4d6c862035a2a2298c927d" 156 | dependencies = [ 157 | "bitflags 0.4.0", 158 | "filetime", 159 | "fsevent", 160 | "fsevent-sys", 161 | "inotify", 162 | "kernel32-sys", 163 | "libc 0.2.126", 164 | "log", 165 | "mio", 166 | "time", 167 | "walkdir", 168 | "winapi 0.2.6", 169 | ] 170 | 171 | [[package]] 172 | name = "rust-ini" 173 | version = "0.9.4" 174 | source = "registry+https://github.com/rust-lang/crates.io-index" 175 | checksum = "9c1323533371ff34419021d0c126d8baa0bbb2d08d9028dcb46047c774267785" 176 | dependencies = [ 177 | "log", 178 | ] 179 | 180 | [[package]] 181 | name = "slab" 182 | version = "0.1.3" 183 | source = "registry+https://github.com/rust-lang/crates.io-index" 184 | checksum = "d807fd58c4181bbabed77cb3b891ba9748241a552bcc5be698faaebefc54f46e" 185 | 186 | [[package]] 187 | name = "time" 188 | version = "0.1.35" 189 | source = "registry+https://github.com/rust-lang/crates.io-index" 190 | checksum = "3c7ec6d62a20df54e07ab3b78b9a3932972f4b7981de295563686849eb3989af" 191 | dependencies = [ 192 | "kernel32-sys", 193 | "libc 0.2.126", 194 | "winapi 0.2.6", 195 | ] 196 | 197 | [[package]] 198 | name = "walkdir" 199 | version = "0.1.5" 200 | source = "registry+https://github.com/rust-lang/crates.io-index" 201 | checksum = "7ad450634b9022aeb0e8e7f1c79c1ded92d0fc5bee831033d148479771bd218d" 202 | dependencies = [ 203 | "kernel32-sys", 204 | "winapi 0.2.6", 205 | ] 206 | 207 | [[package]] 208 | name = "watcher" 209 | version = "0.1.0" 210 | dependencies = [ 211 | "ansi_term", 212 | "notify", 213 | "rust-ini", 214 | ] 215 | 216 | [[package]] 217 | name = "winapi" 218 | version = "0.2.6" 219 | source = "registry+https://github.com/rust-lang/crates.io-index" 220 | checksum = "4dfaaa8fbdaa618fa6914b59b2769d690dd7521920a18d84b42d254678dd5fd4" 221 | 222 | [[package]] 223 | name = "winapi" 224 | version = "0.3.9" 225 | source = "registry+https://github.com/rust-lang/crates.io-index" 226 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 227 | dependencies = [ 228 | "winapi-i686-pc-windows-gnu", 229 | "winapi-x86_64-pc-windows-gnu", 230 | ] 231 | 232 | [[package]] 233 | name = "winapi-build" 234 | version = "0.1.1" 235 | source = "registry+https://github.com/rust-lang/crates.io-index" 236 | checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" 237 | 238 | [[package]] 239 | name = "winapi-i686-pc-windows-gnu" 240 | version = "0.4.0" 241 | source = "registry+https://github.com/rust-lang/crates.io-index" 242 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 243 | 244 | [[package]] 245 | name = "winapi-x86_64-pc-windows-gnu" 246 | version = "0.4.0" 247 | source = "registry+https://github.com/rust-lang/crates.io-index" 248 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 249 | 250 | [[package]] 251 | name = "ws2_32-sys" 252 | version = "0.2.1" 253 | source = "registry+https://github.com/rust-lang/crates.io-index" 254 | checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" 255 | dependencies = [ 256 | "winapi 0.2.6", 257 | "winapi-build", 258 | ] 259 | -------------------------------------------------------------------------------- /watcher/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "watcher" 3 | version = "0.1.0" 4 | authors = ["Mika Attila "] 5 | 6 | [dependencies] 7 | notify = "2.5.5" 8 | rust-ini = "0.9.4" 9 | ansi_term = "0.7.2" 10 | -------------------------------------------------------------------------------- /watcher/README.md: -------------------------------------------------------------------------------- 1 | Watch for changes in undertale save files 2 | -------------------------------------------------------------------------------- /watcher/src/main.rs: -------------------------------------------------------------------------------- 1 | extern crate notify; 2 | extern crate ini; 3 | extern crate ansi_term; 4 | 5 | use notify::{RecommendedWatcher, Watcher}; 6 | use std::sync::mpsc::channel; 7 | use std::fs::File; 8 | use std::path::Path; 9 | use std::io::prelude::*; 10 | use ini::Ini; 11 | use ansi_term::Colour::*; 12 | use std::thread::sleep; 13 | use std::time::Duration; 14 | 15 | // Sometimes a write is incomplete when we recieve a write event. 16 | // Since we can't determine when it will be complete, we just sleep some 17 | // and hope the write will be complete by the time we wake up. 18 | const FILE_READ_WAIT: u64 = 350; 19 | 20 | fn load_file, P2: AsRef>(base_path: P1, filename: P2) -> Option { 21 | let mut file = match File::open(base_path.as_ref().join(filename)) { 22 | Ok(file) => file, 23 | Err(_) => return None, 24 | }; 25 | let mut text = String::new(); 26 | file.read_to_string(&mut text).unwrap(); 27 | Some(text) 28 | } 29 | 30 | fn load_ini, P2: AsRef>(base_path: P1, filename: P2) -> Option { 31 | let text = match load_file(base_path, filename) { 32 | Some(text) => text, 33 | None => return None, 34 | }; 35 | Some(Ini::load_from_str(&text).unwrap()) 36 | } 37 | 38 | fn compare_inis(ini: &Ini, new: &Ini) { 39 | for (section, properties) in new.iter() { 40 | if let Some(old_props) = ini.section(section.clone()) { 41 | for (k, v) in properties.iter() { 42 | if let Some(old_value) = old_props.get(k) { 43 | if v != old_value { 44 | let msg = format!("'Changed value for '{}.{}': {} -> {}", 45 | section.as_ref().unwrap_or(&"".into()), 46 | k, 47 | old_value, 48 | v); 49 | println!("{}", Yellow.paint(msg)); 50 | } 51 | } else { 52 | let msg = format!("New key: {}.{} => {}", 53 | section.as_ref().unwrap_or(&"".into()), 54 | k, 55 | v); 56 | println!("{}", Green.paint(msg)); 57 | } 58 | } 59 | } else if let Some(section) = section.clone() { 60 | let msg = format!("New section '{}'", section); 61 | println!("{}", Green.bold().paint(msg)); 62 | for (k, v) in properties.iter() { 63 | println!("{}", Green.paint(format!("{} => {}", k, v))); 64 | } 65 | } 66 | } 67 | for (section, properties) in ini.iter() { 68 | if let Some(new_props) = new.section(section.clone()) { 69 | for (k, _) in properties.iter() { 70 | if new_props.get(k).is_none() { 71 | let msg = format!("Key '{}.{}' deleted.", 72 | section.as_ref().unwrap_or(&"".into()), 73 | k); 74 | println!("{}", Red.paint(msg)); 75 | } 76 | } 77 | } else if let Some(section) = section.clone() { 78 | println!("{}", 79 | Red.bold().paint(format!("Deleted section '{}'", section))); 80 | } 81 | } 82 | } 83 | 84 | fn resolve_line(n: usize) -> &'static str { 85 | match n { 86 | 1 => "Name", 87 | 2 => "LV", 88 | 3 => "HP", 89 | 5 => "AT", 90 | 6 => "Weapon AT", 91 | 7 => "DF", 92 | 8 => "Armor DF", 93 | 10 => "EXP", 94 | 11 => "GOLD", 95 | 12 => "Kills", 96 | 13 => "inv 1", 97 | 14 => "cellphone 1", 98 | 15 => "inv 2", 99 | 16 => "cellphone 2", 100 | 17 => "inv 3", 101 | 18 => "cellphone 3", 102 | 19 => "inv 4", 103 | 20 => "cellphone 4", 104 | 21 => "inv 5", 105 | 22 => "cellphone 5", 106 | 23 => "inv 6", 107 | 24 => "cellphone 6", 108 | 25 => "inv 7", 109 | 26 => "cellphone 7", 110 | 27 => "inv 8", 111 | 28 => "cellphone 8", 112 | 29 => "weapon", 113 | 30 => "armor", 114 | 56 => "saveinc", 115 | 65 => "candy room candies", 116 | 88 => "snowdin comedian genocide 2=killed", 117 | 232 => "? kills", 118 | 233 => "Ruins kills", 119 | 234 => "snowdin kills", 120 | 546 => "has cellphone", 121 | 548 => "room", 122 | 549 => "time", 123 | _ => "unknown", 124 | } 125 | } 126 | 127 | fn main() { 128 | let dir = std::env::args().skip(1).next().expect("Expected directory as argument"); 129 | let (tx, rx) = channel(); 130 | let mut watcher = RecommendedWatcher::new(tx).unwrap(); 131 | watcher.watch(&dir).unwrap(); 132 | let mut file0 = load_file(&dir, "file0"); 133 | let mut ini = load_ini(&dir, "undertale.ini"); 134 | loop { 135 | use notify::op; 136 | let event = rx.recv().unwrap(); 137 | println!("{:?}", event); 138 | let path = event.path.unwrap(); 139 | match path.file_name().unwrap().to_str().unwrap() { 140 | "file0" => { 141 | let op = event.op.unwrap(); 142 | if op == op::WRITE { 143 | sleep(Duration::from_millis(FILE_READ_WAIT)); 144 | let new = load_file(&dir, "file0").unwrap(); 145 | for (n, (old, new)) in file0.unwrap().lines().zip(new.lines()).enumerate() { 146 | if old.trim_right() != new.trim_right() { 147 | let msg = format!("{} ({}) changed: '{}' to '{}'", 148 | resolve_line(n + 1), 149 | n + 1, 150 | old, 151 | new); 152 | println!("{}", Yellow.paint(msg)); 153 | } 154 | } 155 | file0 = Some(new); 156 | } else if op == op::CREATE { 157 | println!("file0 created."); 158 | file0 = Some(load_file(&dir, "file0").unwrap()); 159 | } 160 | } 161 | "undertale.ini" => { 162 | let op = event.op.unwrap(); 163 | if op == op::WRITE { 164 | sleep(Duration::from_millis(FILE_READ_WAIT)); 165 | let new = load_ini(&dir, "undertale.ini").unwrap(); 166 | compare_inis(&ini.unwrap(), &new); 167 | ini = Some(new); 168 | } else if op == op::CREATE { 169 | println!("undertale.ini created."); 170 | ini = Some(load_ini(&dir, "undertale.ini").unwrap()); 171 | } 172 | } 173 | _ => {} 174 | } 175 | } 176 | } 177 | --------------------------------------------------------------------------------