├── .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 |
72 |
73 | Modify the file permissions so that Steam cannot detect the file.
74 | If you replace the file with a folder of the same name and restrict Steam's
75 | permissions to it, neither the game nor Steam will detect the file.
76 |
77 |
78 | Disconnect the game from Steam.
79 | By renaming or deleting steam_api.dll
in Undertale's game folder
80 | (NOT the save folder; it's where the game executable runs from, usually
81 | C:/Program Files (x86)/Steam/steamapps/common/Undertale
), the
82 | game will be disconnected from Steam. Deleting the system_ files will then work
83 | normally, but you won't be able to launch the game through Steam.
84 |
85 |
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 |
112 |
113 | The Genocide Route can entirely be controlled using the basic menu, but if
114 | you don't want to fill that out (nor use a preset to do it for you), flag
115 | 26
is a debugging flag that can jump you to any point in the
116 | route. Note, however: it will ignore further progress and lock you at
117 | whatever value the flag has.
118 |
119 |
120 | The Pacifist Route has several key points determined by flags. Flag 88
121 | tracks your progress in Papyrus's date; flag 389
tracks dating
122 | Undyne; and flag 493
tracks Undyne's Letter, Alphys's date, and
123 | the True Lab. Finally, flag 7
(accessible in the basic menu)
124 | activates the post-Asriel epilogue.
125 |
126 |
127 | Flags 300-324
contain the contents of your Dimensional Boxes.
128 | If you want to hack in more than eight items, use these.
129 |
130 |
131 | Flags 130-156
control a great many of the yellow credits for
132 | sparing enemies in the right way. If you want an all-yellow-credits run
133 | (or to analyze one), look here first.
134 |
135 |
136 | The status of your keychain is contained in flags. Asgore's keys are
137 | flags 452-454
; True Lab keys are flags 481-484
;
138 | and Sans's room keys are flag 497
.
139 |
140 |
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 |
23 |
24 |
Built-in Presets
25 |
26 |
27 | Load
28 |
29 |
30 |
31 |
35 | sys_info_962
36 |
37 |
41 | sys_info_963
42 |
43 |
44 |
45 |
46 |
47 |
48 | Flowey's Time Machine
49 |
50 |
51 |
52 |
Your Presets
53 |
54 |
55 |
Load
56 |
Save
57 |
58 |
59 | New
60 | Delete
61 | Export
62 |
63 |
64 |
65 |
66 |
67 |
74 |
75 |
76 |
77 |
Persistent Data (undertale.ini)
78 |
Things that UNDERTALE remembers throughout multiple playthroughs
79 |
80 |
81 |
82 |
83 | General
84 |
127 |
128 |
135 |
139 |
140 |
141 | Filter rooms:
142 |
143 |
144 |
145 |
146 |
147 |
148 | Omega Flowey & Other
149 |
150 |
Times you died
151 |
157 |
Upcoming soul fight
158 |
163 |
164 |
165 | Trapped in Flowey's World
170 |
171 |
172 |
173 | Dodged special thanks
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 |
230 |
231 |
238 |
242 |
243 |
244 | Filter rooms:
245 |
246 |
247 |
248 |
249 |
250 | Stats
251 |
252 | HP
253 | EXP
254 | Gold
255 |
256 |
257 |
258 | ATK
259 | Weapon ATK
260 |
261 |
267 | DF
268 | Armor DF
269 |
270 |
276 |
277 |
278 | Weapon
279 | Armor
280 |
281 |
282 |
283 |
284 |
285 | Allow all items
286 |
287 |
288 |
289 |
290 | Inventory
291 |
292 | SLOT 1
293 | SLOT 2
294 |
295 |
296 | SLOT 3
297 | SLOT 4
298 |
299 |
300 | SLOT 5
301 | SLOT 6
302 |
303 |
304 | SLOT 7
305 | SLOT 8
306 |
307 |
308 |
309 |
310 |
311 |
312 | Cellphone
313 |
314 |
315 | You have a cellphone
316 |
317 |
318 |
SLOT 1
319 |
SLOT 2
320 |
321 |
322 |
SLOT 3
323 |
SLOT 4
324 |
325 |
326 |
SLOT 5
327 |
SLOT 6
328 |
329 |
330 |
SLOT 7
331 |
SLOT 8
332 |
333 |
334 |
335 |
336 | Dated Undyne (call with Papyrus)
337 |
338 |
339 |
340 |
341 |
382 |
383 |
384 |
385 | Waterfall
386 |
387 | Kills
388 | Shyren
389 | Dummy
390 |
396 |
397 |
398 |
399 |
400 | Undyne
401 | Undyne the Undying
402 |
403 |
404 |
405 |
406 |
407 |
408 | Hotland
409 |
410 | Kills
411 | Bro Guards
412 |
418 |
419 | Muffet
420 | Mettaton
421 |
422 |
423 |
424 |
425 |
426 |
427 |
428 | Other
429 |
430 |
435 | True lab exited
440 |
441 |
442 |
443 | Defeated Asriel
448 |
449 | Plot value
450 |
455 |
456 |
457 |
458 | FUN Values
459 |
460 |
461 |
462 | Value
463 | Effect
464 |
465 |
466 | 2-39
467 | Wrong number
468 |
469 |
470 | 40-45
471 | Sans' call
472 |
473 |
474 | 46-50
475 | Alphys' call
476 |
477 |
478 | 56-57
479 | Nightmare mode
480 |
481 |
482 |
483 |
484 | 61-63
485 | Gaster followers
486 |
487 |
488 | 65
489 | Sound test room
490 |
491 |
492 | 66
493 | Fake hallway
494 |
495 |
496 | 80-89
497 | Clam girl
498 |
499 |
500 | 90-100
501 | Goner kid
502 |
503 |
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 | Show
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 |
--------------------------------------------------------------------------------