forked from github/game-off-2012
-
Notifications
You must be signed in to change notification settings - Fork 0
/
interaction_dictionary.js
1575 lines (1503 loc) · 63.6 KB
/
interaction_dictionary.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/**
* A dictionary from interaction names to details about those interactions. Each one is represented
* as an object with the following fields:
* - doAction: a function that, when called, carries out the interaction.
* - taskString: optional; the text to display in the task list for this interaction.
* - referrable: optional; indicates whether the interaction is referrable or not. If absent, "false" is assumed.
* - icon: TODO
*/
define([
'config',
'utils',
'underscore',
'Crafty',
'components/ScriptRunner',
], function(config, utils) {
var sveniteNames = ['Apache', 'Berkeley', 'Colin', 'Disco', 'Mergee', 'Conflictee'];
var pullWrongAnswers = ["git transmit", "git send", "git update", "git receive", "git fetch"];
var pushWrongAnswers = ["git send", "git update", "git transmit"];
function checkGitPushDone(scriptUtils) {
var gameState = scriptUtils.getGameState();
return [{
action: 'arbitraryCode',
code: function(curState, callback) {
var completed = _.all([1,2,3,4], function(i) {
return gameState.findInteraction('villager'+i+'GitPush').length === 0;
});
if (completed) {
gameState.addInteraction(['Linus'], 'linusFinal');
}
callback(curState+1);
}
}];
}
return {
linusIntro: {
doAction: function(scriptUtils) {
var gameState = scriptUtils.getGameState();
var vm = Crafty.e('ScriptRunner');
vm.ScriptRunner(_.flatten([
scriptUtils.dialogAndPause([
"@npcName@: Hello @heroName@! It's nice of you to come by. Listen, I'm working on this new book and I'd love to share my draft with the villagers in Sveni. They will be so happy to hear the good news!",
"@npcName@: To get a copy of my book, they need to recite the magic words, <span class='cmd'>“git clone https://github.com/git/git.git”</span>. But they often git it wrong.",
"@npcName@: Your mission: go to the six villagers in Sveni, north of here, and help them say the right magic words. You will be rewarded with one silver coin once you complete your mission."
]),
[{
action: 'arbitraryCode',
code: function(curState, callback) {
var helpTextEnt = Crafty(Crafty('HelpText')[0]);
helpTextEnt.setLines(["Drag or slide to look around.", "Click or tap on someone to talk to them."]);
setTimeout(function() { helpTextEnt.setLines([]); }, 120000);
callback(curState+1);
}
}],
scriptUtils.addInteraction(sveniteNames, 'villagerGitClone'),
scriptUtils.addInteraction(['Scott', 'Junio'], 'scottJunioGitClone'),
scriptUtils.addInteraction(['Linus'], 'linusGitCloneRepeat'),
]));
vm.run();
},
taskString: "",
referrable: false
},
defaultInteraction: {
doAction: function(scriptUtils) {
var vm = Crafty.e('ScriptRunner');
vm.ScriptRunner(_.flatten([
scriptUtils.makeReferral(
"@npcName@: Hi @heroName@! I've got nothing for you right now. Why don't you go see @npcNameRef@? @HeOrSheRef@ said @heOrSheRef@ wanted to speak with you.",
"@npcName@: Hi @heroName@! I've got nothing for you right now. Why don't you go see @npcNameRef@? @HeOrSheRef@ said @heOrSheRef@ wanted to speak with you.",
"@npcName@: Hi @heroName@! I've got nothing for you right now. Why don't you look around to see if anyone else needs help?",
undefined
),
[{ action: 'destroyVM' }]
]));
vm.run();
}
},
defaultLinus: {
doAction: function(scriptUtils) {
utils.profile('interaction_dictionary defaultLinus action', function() {
var vm = Crafty.e('ScriptRunner');
vm.ScriptRunner(_.flatten([
/* TODO: implement getting help with git */
scriptUtils.dialogAndPause(
["@npcName@: Hi @heroName@! I'd give you some help with git, but that feature hasn't been implemented yet..."]
),
[{ action: 'destroyVM' }]
]));
vm.run();
});
}
},
linusGitCloneRepeat: {
doAction: function(scriptUtils) {
var gameState = scriptUtils.getGameState();
var vm = Crafty.e('ScriptRunner');
vm.ScriptRunner(_.flatten([
scriptUtils.dialogAndPause([
"@npcName@: Go and see the six villagers in the town of Sveni, northeast of here, and teach them how to get a copy of my book.",
"@npcName@: Don't forgit, um, forget the magic words: <span class='cmd'>“git clone https://github.com/git/git.git.”</span>",
"@npcName@: What are you waiting for? Go!"
])
]));
vm.run();
},
taskString: "",
referrable: false
},
scottJunioGitClone: {
doAction: function(scriptUtils) {
var gameState = scriptUtils.getGameState();
var vm = Crafty.e('ScriptRunner');
vm.ScriptRunner(_.flatten([
scriptUtils.dialogAndPause([
"@npcName@: Are you looking for the village of Sveni? You can drag (or slide) the map to move around.",
"@npcName@: You shouldn't have trouble finding it if you follow the road... it's on the hill northeast of here."
])
]));
vm.run();
},
taskString: "",
referrable: false,
},
villagerGitClone: {
doAction: function(scriptUtils) {
var gameState = scriptUtils.getGameState();
var thisInteraction = 'villagerGitClone';
var rightAnswerAction = {
label: "git clone https://github.com/git/git.git",
result: _.flatten([
scriptUtils.removeCurrentInteraction(),
[{
action: 'arbitraryCode',
code: function(curState, callback) {
var npcsWithClone = gameState.findInteraction(thisInteraction);
var numClonesLeft = npcsWithClone.length;
if (numClonesLeft === 0) {
gameState.removeInteraction('Linus', 'linusGitCloneRepeat');
gameState.removeInteraction('Scott', 'scottJunioGitClone');
gameState.removeInteraction('Junio', 'scottJunioGitClone');
gameState.addInteraction(['Linus'], 'linusGitCloneComplete');
}
callback(curState+1);
}
}],
scriptUtils.makeReferral(
"@npcName@: Thanks @heroName@! It worked! Please help other fellow Svenites learn about this new magic! "
+ "Maybe you could go and help @npcNameRef@? @HeOrSheRef@ doesn't live too far from here...",
"@npcName@: Thanks @heroName@! It worked! Have you spoken to @npcNameRef@ lately? I think @heOrSheRef@ was looking for you.",
"Thanks @heroName@! It worked!", /* should never happen */
thisInteraction
),
scriptUtils.giveCopper(config.coinValues.copper),
])
};
var jokeAnswerAction = {
label: "rm -rf ~",
result: scriptUtils.dialogAndPause(
["@npcName@: Really? That sounds dangerous... are you sure Linus said to use that? Maybe you should check with him again... "
+ "I wouldn’t want to set my whole bookshelf on fire!"]
)
};
var wrongAnswers = [
"git init https://github.com/git/git.git",
"git checkout https://github.com/git/git.git",
"clone https://github.com/git/git.git",
"clone git https://github.com/git/git.git",
"git-clone https://github.com/git/git.git",
"git clone AntPortal/game-off-2012.git"
];
var wrongAnswerAction = {
label: wrongAnswers[_.random(wrongAnswers.length - 1)],
result: scriptUtils.dialogAndPause(
["@npcName@: Hmm @heroName@! That didn’t work! Please go tell Linus my piece of mind about his git magic. "
+ "It doesn’t work!! Or maybe come talk to me again when you’ve listened more carefully to Linus’ lessons."]
)
};
var vm = Crafty.e('ScriptRunner');
vm.ScriptRunner(_.flatten([
scriptUtils.dialogAndPause(
["@npcName@: Hi @heroName@! I've been trying to clone that book from Linus. What are the magic words to get it?"]
),
scriptUtils.actionBranch(
_.shuffle([rightAnswerAction, jokeAnswerAction, wrongAnswerAction]),
"What are the magic words to clone Linus' book?"
),
[{ action: 'destroyVM' }]
]));
vm.run();
},
taskString: "Teach villagers about git clone (@num@ left)",
referrable: true,
icon: null /* TODO */
},
linusGitCloneComplete: {
doAction: function(scriptUtils) {
var gameState = scriptUtils.getGameState();
var vm = Crafty.e('ScriptRunner');
vm.ScriptRunner(_.flatten([
scriptUtils.dialogAndPause(
["@npcName@: @heroName@, I see in my scrying pool that you have succesfuly helped all "
+ "the Svenites obtain the latest copy of my book. Thank you! Here’s your silver coin."]
),
scriptUtils.removeCurrentInteraction(),
scriptUtils.giveCopper(config.coinValues.silver),
scriptUtils.addInteraction(['Linus'], 'linusGitAdd1'),
[{ action: 'destroyVM' }]
]));
vm.run();
},
taskString: "Report back to Linus",
referrable: true,
icon: null /* TODO */
},
linusGitAdd1: {
doAction: function(scriptUtils) {
var gameState = scriptUtils.getGameState();
var vm = Crafty.e('ScriptRunner');
vm.ScriptRunner(_.flatten([
scriptUtils.dialogAndPause([
"@npcName@: Ah, this is embarrassing... it seems there was a squashed bug in my book! He must have jumped in there when I wasn’t looking.",
"@npcName@: Let me see... Okay. I’ve rewritten the page and the bug is there no more!",
"@npcName@: Now I need to add that page into the book. For that I will use the magic words <span class='cmd'>“git add page503.”</span>",
"@npcName@: But the page won’t be bound to my book until I call the magic words <span class='cmd'>“git commit,”</span> and then add a note explaining that I’ve removed a bug.",
"@npcName@: <span class='cmd'>“git add,”</span> then <span class='cmd'>“git commit.”</span> You might want to remember that in case you ever need to commit something yourself...",
]),
[{
action: 'arbitraryCode',
code: function(curState, callback) {
gameState.addInteraction(['Scott'], 'villagerGitAdd1');
gameState.addInteraction(['Linus'], 'linusGitAdd1Repeat');
callback(curState+1);
}
}],
scriptUtils.makeReferral(
"@npcName@: BTW, I think @npcNameRef@ said @heOrSheRef@ wanted to talk to you. It might be a good opportunity for you to teach @himOrHerRef@ about the new magic words I just taught you.",
"@npcName@: BTW, I think @npcNameRef@ said @heOrSheRef@ wanted to talk to you.",
"@npcName@: Come back and see me later in case I find another bug.",
"villagerGitAdd1"
),
scriptUtils.removeCurrentInteraction(),
[{ action: 'destroyVM' }]
]));
vm.run();
},
taskString: "Talk to Linus",
referrable: true
},
linusGitAdd1Repeat: {
doAction: function(scriptUtils) {
var gameState = scriptUtils.getGameState();
var vm = Crafty.e('ScriptRunner');
vm.ScriptRunner(_.flatten([
scriptUtils.makeReferral(
"@npcName@: I think @npcNameRef@ said @heOrSheRef@ wanted to talk to you. It might be a good opportunity for you to teach @himOrHerRef@ about the <span class='cmd'>“git add”</span> and <span class='cmd'>“git commit”</span> spells I just taught you.",
"@npcName@: BTW, I think @npcNameRef@ said @heOrSheRef@ wanted to talk to you.",
"@npcName@: Come back and see me later in case I find another bug.",
"villagerGitAdd1"
)
]));
vm.run();
},
taskString: "",
referrable: false
},
villagerGitAdd1: {
doAction: function(scriptUtils) {
var gameState = scriptUtils.getGameState();
var vm = Crafty.e('ScriptRunner');
vm.ScriptRunner(_.flatten([
scriptUtils.dialogAndPause([
/* TODO: replace "alchemy" with randomized topics */
"@npcName@: Hey @heroName@, you came just in time. I’ve written a few pages on alchemy that I think would fit right into that book Linus is writing.",
"@npcName@: The only problem is, I don’t know what I need to do to get them in.",
"@npcName@: He said something about magically cloning his book, adding my new pages, and then binding those pages in.",
"@npcName@: It all sounds really complicated. He called that “committing” or something... maybe you can help me with this.",
"@npcName@: OK, let's start by getting a copy of the book. What's the incantation?"
]),
[{ action: 'jumpToLabel', label: 'askClone' }],
[{ action: 'label', label: 'wrongAnswerClone' }],
scriptUtils.dialogAndPause([
"@npcName@: I can’t seem to see Linus’ stuff. I think I’d rather we start again. Give me a second to clean this up.",
"@npcName@: Let’s try again. What’s the incantation for getting Linus’ stuff?"
]),
[{ action: 'label', label: 'askClone' }],
scriptUtils.quizBranch(
{ /* right answer */
text: 'git clone https://github.com/git/git.git',
result: [{ action: 'jumpToLabel', label: 'beginGitAdd' }],
},
{ /* wrong answers */
texts: [
'git-clone https://github.com/git/git.git',
'git clone AntPortal/game-off-2012.git'
],
result: [{ action: 'jumpToLabel', label: 'wrongAnswerClone'}],
take: 1
},
{ /* joke answers */
choices: [
{
text: 'git init',
result: _.flatten([
scriptUtils.dialogAndPause([
"@npcName@: This doesn’t look like the right book... all it has is one page that says “This page intentionally left blank.” Are you sure that’s the right spell?"
]),
[{ action: 'jumpToLabel', label: 'wrongAnswerClone' }]
])
},
{
text: 'git clone https://github.com/ruby/ruby.git',
result: _.flatten([
scriptUtils.dialogAndPause([
"@npcName@: Woah!! That’s a lot of stuff! Though are you sure this is Linus’ book? There’s all these gems, and clever trinkets."
]),
[{ action: 'jumpToLabel', label: 'wrongAnswerClone' }]
])
}
],
take: 1
},
"How do you get Linus' book?"
),
[{ action: 'label', label: 'beginGitAdd' }],
scriptUtils.dialogAndPause([
"@npcName@: Okay, I think I got the right book. Now I’ll add my pages at the end of the book... It will be Chapter 74.",
"@npcName@: Now, what spell do I need to cast to insert the pages in the book?"
]),
scriptUtils.quizBranch(
{ /* right answer */
text: 'git add chapter74',
result: [{ action: 'jumpToLabel', label: 'beginGitCommit' }],
},
{ /* wrong answers */
texts: ['git fetch', 'git-add chapter74', 'git insert chapter74', 'mv chapter74 git'],
result: scriptUtils.dialogAndPause([
"@npcName@: Aaah, no, that didn’t work. You didn’t lose my changes, did you?",
"@npcName@: I hope I don’t have to rewrite that chapter all over again..."
]),
take: 1
},
{ /* joke answers */
choices: [
{
text: 'cat /dev/random',
result: scriptUtils.dialogAndPause([
"@npcName@: I͠ ͞ḑon'͠t̢ ̴k̶ńo͞w w̕h͟a͏t ̨you̡ ̛did, b͜u̕t̕ ̶I t͞hink̛ th̶e̸ ţe̢x͠t ͘is̴ ͞ovȩr̡f̀l̀o̧wi҉ng̛ ͘oút ̶of ͏the b̴óok̕.͜"
])
},
{
text: 'sudo systemctl poweroff',
result: scriptUtils.dialogAndPause([
"@npcName@: I don't think I have the wizardly authority to cast the 'sudo' spell..." /* TODO: say something about the "poweroff" part */
])
}
],
take: 1
},
"How do you insert the pages in the book?"
),
[{ action: 'jumpToLabel', label: 'end' }],
[{ action: 'label', label: 'beginGitCommit' }],
scriptUtils.dialogAndPause([
"@npcName@: That looks like it worked! But the pages don’t seem to be glued to the book.",
"@npcName@: Did Linus mention about anyway to permanently attach the pages? What’s that spell?"
]),
scriptUtils.quizBranch(
{ /* right answer */
text: 'git commit',
result: _.flatten(
[{ action: 'jumpToLabel', label: 'endGitCommit' }]
),
},
{ /* wrong answers */
texts: ['svn commit', 'git commit chapter74'],
result: scriptUtils.dialogAndPause([
"@npcName@: Aaah, no, that didn’t work. You didn’t lose my changes, did you?",
"@npcName@: I hope I don’t have to rewrite that chapter all over again..."
]),
take: 1
},
{ /* joke answers */
choices: [
{
text: 'wget -r -l0 -e robots=off http://en.wikipedia.org',
result: scriptUtils.dialogAndPause([
"@npcName@: My house isn't big enough to hold a whole library..."
])
},
{
text: 'nmap 0.0.0.0/0',
result: scriptUtils.dialogAndPause([
"@npcName@: I don't know, I've heard people have gotten themselves into a lot of trouble with that 'nmap' spell..."
])
}
],
take: 1
},
"How do you permanently attach the pages?"
),
[{ action: 'jumpToLabel', label: 'end' }],
[{ action: 'label', label: 'endGitCommit' }],
scriptUtils.dialogAndPause([
"@npcName@: Ahh! Interesting, the book asked me to explain why I was gluing these pages in. But it’s all said and done now.",
"@npcName@: Perfect, looks like the pages are securely fastened to the book. I guess I’ll continue writing my next chapter.",
"@npcName@: Thank you! Oh, please go say thank you to Linus on my behalf."
]),
scriptUtils.removeCurrentInteraction(),
scriptUtils.giveCopper(config.coinValues.gold),
[{
action: 'arbitraryCode',
code: function(curState, callback) {
gameState.removeInteraction('Linus', 'linusGitAdd1Repeat');
gameState.addInteraction(['Linus'], 'linusGitAdd2');
callback(curState+1);
}
}],
[
{ action: 'label', label: 'end' },
{ action: 'destroyVM' }
]
]));
vm.run();
},
taskString: "Teach Scott how to add and commit",
referrable: true
},
linusGitAdd2: {
doAction: function(scriptUtils) {
var gameState = scriptUtils.getGameState();
var vm = Crafty.e('ScriptRunner');
vm.ScriptRunner(_.flatten([
scriptUtils.dialogAndPause([
"@npcName@: It sounds like you’ve now mastered the art of adding pages to the book.",
"@npcName@: Could you please go back to the Svenites and teach them what you just taught Scott?", /* TODO: put actual name here */
"@npcName@: This time, I think you can just teach 3 of them, and they’ll spread the word themselves from there.",
"@npcName@: While you're at it, could you could pass by Ceeveeus’ house? He lives alone in a fortress in the forest far North of Sveni.",
"@npcName@: He never really wanted to join the village of Sveni. Maybe it was for tax purposes. Who knows."
]),
[{
action: 'arbitraryCode',
code: function(curState, callback) {
gameState.addInteraction(['Linus'], 'linusGitAdd2Repeat');
gameState.addInteraction(sveniteNames, 'villagerGitAdd2');
gameState.addInteraction(['Ceeveeus'], 'ceeveeus1');
callback(curState+1);
}
}],
scriptUtils.removeCurrentInteraction()
]));
vm.run();
},
taskString: "Talk to Linus",
referrable: true
},
linusGitAdd2Repeat: {
doAction: function(scriptUtils) {
var gameState = scriptUtils.getGameState();
var vm = Crafty.e('ScriptRunner');
vm.ScriptRunner(_.flatten([
scriptUtils.dialogAndPause([
"@npcName@: Go and teach the Svenites about the <span class='cmd'>“git add”</span> and <span class='cmd'>“git commit”</span> spells you just taught Scott.",
"@npcName@: Also make sure to pass by Ceeveeus’ house, far north of Sveni. Hopefully he’ll listen to you more than he listened to me…"
])
]));
vm.run();
},
taskString: "",
referrable: false,
},
villagerGitAdd2: {
doAction: function(scriptUtils) {
var gameState = scriptUtils.getGameState();
var thisInteraction = 'villagerGitAdd2';
var vm = Crafty.e('ScriptRunner');
vm.ScriptRunner(_.flatten([
scriptUtils.dialogAndPause([
"@npcName@: Hi @heroName@, I’m so glad to see you. After we started reading Linus’ book, we realized how much we’d love to start writing ourselves too.",
"@npcName@: I heard that writing magical books is the new literacy! Could you please show me how to add my new chapter?"
]),
scriptUtils.quizBranch(
{ /* right answer */
text: "git add chapter75",
result: [{ action: 'jumpToLabel', label: 'beginCommit' }]
},
{ /* wrong answers */
texts: ['git fetch', 'git-add chapter75', 'git insert chapter75', 'mv chapter75 git'],
result: scriptUtils.dialogAndPause(["@npcName@: Aaah, no, that didn’t work. You didn’t lose my changes, did you? I hope I don’t have to rewrite that chapter all over again... "]),
take: 2
},
{ /* joke answers; none for now */
choices: [], take: 0
},
"How do I add my new chapter?"
),
[{ action: 'jumpToLabel', label: 'end' }],
[{ action: 'label', label: 'beginCommit' }],
scriptUtils.dialogAndPause([
"@npcName@: The pages don’t seem to be glued to the book, though. There's another spell to actually attach them, right? What is it?"
]),
scriptUtils.quizBranch(
{ /* right answer */
text: "git commit",
result: [{ action: 'jumpToLabel', label: 'endCommit' }]
},
{ /* wrong answers */
texts: ['svn commit', 'git commit chapter75'],
result: scriptUtils.dialogAndPause([
"@npcName@: Aaah, no, that didn’t work. You didn’t lose my changes, did you?",
"@npcName@: I hope I don’t have to rewrite that chapter all over again..."
]),
take: 2
},
{ /* joke answers; none for now */
choices: [], take: 0
},
"How to attach the pages to the book?"
),
[{ action: 'jumpToLabel', label: 'end' }],
[{ action: 'label', label: 'endCommit' }],
scriptUtils.removeCurrentInteraction(),
scriptUtils.tryRemoveInteraction(
"@npcName@: Thanks! As a token of gratitude, I’m going to go teach it to @npcNameRef@ on your behalf. My mother always told me that teaching is the best way to learn.",
"@npcName@: Thanks!"
),
scriptUtils.giveCopper(config.coinValues.silver),
scriptUtils.removeCurrentInteraction(),
[{
action: 'arbitraryCode',
code: function(curState, callback) {
var villagersWithGitAdd = gameState.findInteraction(thisInteraction);
var ceeveeusInteraction = gameState.getOneInteraction('Ceeveeus');
if (villagersWithGitAdd.length === 0 && !ceeveeusInteraction) {
gameState.removeInteraction('Linus', 'linusGitAdd2Repeat');
gameState.addInteraction(['Linus'], 'linusGitPull');
}
callback(curState+1);
}
}],
[
{ action: 'label', label: 'end' },
{ action: 'destroyVM' }
]
]));
vm.run();
},
taskString: "Teach villagers about git add",
referrable: true
},
ceeveeus1: {
doAction: function(scriptUtils) {
var vm = Crafty.e('ScriptRunner');
vm.ScriptRunner(_.flatten([
scriptUtils.dialogAndPause([
"@npcName@: What do you want? Can’t you see I’m busy chopping down trees? There are branches all over the property!!",
"@npcName@: Unless you’re here to help me clean up the mess, please go away!"
]),
scriptUtils.removeCurrentInteraction(),
scriptUtils.addInteraction(['Ceeveeus'], 'ceeveeus2')
]));
vm.run();
},
taskString: "Talk to Ceeveeus",
referrable: true
},
ceeveeus2: {
doAction: function(scriptUtils) {
var vm = Crafty.e('ScriptRunner');
vm.ScriptRunner(_.flatten([
scriptUtils.dialogAndPause([
"@npcName@: You again? Don’t tell me Linus sent you. I already said I didn’t want to join Sveni.",
"@npcName@: They are a bunch of high tax payers and their central government is slow.",
]),
scriptUtils.removeCurrentInteraction(),
scriptUtils.addInteraction(['Ceeveeus'], 'ceeveeus3')
]));
vm.run();
},
taskString: "Talk to Ceeveeus",
referrable: true
},
ceeveeus3: {
doAction: function(scriptUtils) {
var vm = Crafty.e('ScriptRunner');
vm.ScriptRunner(_.flatten([
scriptUtils.dialogAndPause(["@npcName@: Hey, git outta my face!"]),
scriptUtils.removeCurrentInteraction(),
scriptUtils.addInteraction(['Ceeveeus'], 'ceeveeus4')
]));
vm.run();
},
taskString: "Talk to Ceeveeus",
referrable: true
},
ceeveeus4: {
doAction: function(scriptUtils) {
var vm = Crafty.e('ScriptRunner');
vm.ScriptRunner(_.flatten([
scriptUtils.dialogAndPause([
"@npcName@: Well, I respect stubbornness.",
"@npcName@: You know I was stubborn too when I was young.",
"@npcName@: I used to fight for righteous causes. Like this one time when I wrote a book on how to make chips and wafers."
]),
scriptUtils.removeCurrentInteraction(),
scriptUtils.addInteraction(['Ceeveeus'], 'ceeveeusClone')
]));
vm.run();
},
taskString: "Talk to Ceeveeus",
referrable: true
},
ceeveeusClone: {
doAction: function(scriptUtils) {
var gameState = scriptUtils.getGameState();
var vm = Crafty.e('ScriptRunner');
vm.ScriptRunner(_.flatten([
scriptUtils.dialogAndPause([
"@npcName@: I give in. Maybe I’ll read just <em>one</em> page.",
"@npcName@: So let’s get that book. Just tell me the magic words... "
]),
scriptUtils.quizBranch(
{ /* right answer */
text: "git clone https://github.com/git/git.git",
result: [{ action: 'jumpToLabel', label: 'beginAdd' }],
},
{ /* wrong answers */
texts: [
"git checkout https://github.com/git/git.git",
"cvs checkout https://github.com/git/git.git",
"cvs clone https://github.com/git/git.git"
],
result: scriptUtils.dialogAndPause([
"@npcName@: Hrm, didn’t work. You know, back in my day, we made spells that actually did things..."
]),
take: 2
},
{ /* joke answers; none for now */
choices: [],
take: 0
},
"How do you get the book?"
),
[{ action: 'jumpToLabel', label: 'end' }],
[{ action: 'label', label: 'beginAdd' }],
scriptUtils.dialogAndPause([
"@npcName@: Okay, I have the book now. Le’ssee here... Geez, I can tell that this was written by a bunch of youngins’ who think they know everything.",
"@npcName@: Why, I have half a mind to show this “Linus” what for. Tell me, son, how do I add my own pages to this book?"
]),
scriptUtils.quizBranch(
{ /* right answer */
text: "git add page504",
result: [{ action: 'jumpToLabel', label: 'beginCommit' }]
},
{ /* wrong answers */
texts: ["git-add page504", "cvs add page504"],
result: scriptUtils.dialogAndPause(["@npcName@: No, that didn’t seem to do anything. Are you sure this “Linus magic” is any good?"]),
take: 2
},
{ /* joke answers; none for now */
choices: [],
take: 0
},
"How do you add pages to this book?"
),
[{ action: 'jumpToLabel', label: 'end' }],
[{ action: 'label', label: 'beginCommit' }],
scriptUtils.dialogAndPause([
"@npcName@: Huh, that pretty much looks like the way <em>I’ve</em> been doing things all along. Reinventing the wheel is all you kids have done.",
"@npcName@: Anyway, what do I do to permanently bind the page to the book?"
]),
scriptUtils.quizBranch(
{ /* right answer */
text: "git commit",
result: [{ action: 'jumpToLabel', label: 'endCommit' }]
},
{ /* wrong answers */
texts: ["cvs commit", "svn commit", "g95 git.for"], /* TODO: add more */
result: scriptUtils.dialogAndPause(["@npcName@: Nope, the pages aren’t bound to the book. If you whippersnappers are gonna reinvent the wheel, and least invent a wheel that works!"]),
take: 2
},
{ /* joke answers; none for now */
choices: [],
take: 0
},
"How do you permanently bind the page to the book?"
),
[{ action: 'jumpToLabel', label: 'end' }],
[{ action: 'label', label: 'endCommit' }],
scriptUtils.dialogAndPause([
"@npcName@: “git commit?” Sounds like this “Linus” kid just took my ideas, changed a few keywords around, and called it his own.",
"@npcName@: Still, at least the book is bound now. Give it a look... or don’t, I don’t care! I got work to do here.",
"@npcName@: But I sure hope Linus will invent a spell to put all my branches in order... You wouldn’t happen to know how to do that, would you?"
]),
scriptUtils.removeCurrentInteraction(),
scriptUtils.actionBranch(_.shuffle([
{
label: "Maybe you can do something with “csv2svn” and “git svn”...",
result: _.flatten([
scriptUtils.dialogAndPause(["@npcName@: Hmm, really? That sounds like it just might work... here’s something for your trouble."]),
scriptUtils.giveCopper(config.coinValues.gold)
])
},
{
label: "I don't know",
result: scriptUtils.dialogAndPause(["@npcName@: Figures. Well, back to the old way... at least I know it works..."])
},
{
label: "Just use “git cvs”",
result: scriptUtils.dialogAndPause(["@npcName@: Son, I don’t want to be rude, but you have no idea what you’re talking about, do you?"])
}
]),
"Is there a spell to bridge from cvs to git?"),
[{
action: 'arbitraryCode',
code: function(curState, callback) {
var villagersWithGitAdd = gameState.findInteraction('villagerGitAdd2');
var ceeveeusInteraction = gameState.getOneInteraction('Ceeveeus');
if (villagersWithGitAdd.length === 0 && !ceeveeusInteraction) {
gameState.removeInteraction('Linus', 'linusGitAdd2Repeat');
gameState.addInteraction(['Linus'], 'linusGitPull');
}
callback(curState+1);
}
}],
[
{ action: 'label', label: 'end' },
{ action: 'destroyVM' }
]
]));
vm.run();
},
taskString: "Talk to Ceeveeus",
referrable: true
},
linusGitPull: {
doAction: function(scriptUtils) {
var gameState = scriptUtils.getGameState();
var vm = Crafty.e('ScriptRunner');
vm.ScriptRunner(_.flatten([
scriptUtils.dialogAndPause([
"@npcName@: Well done. I could never get Ceeveeus to even take one look at git magic... Here’s two silver coins for doing such a good job."
]),
scriptUtils.giveCopper(2*config.coinValues.silver),
scriptUtils.dialogAndPause([
"@npcName@: By the way, Junio came by earlier. He was telling me about that squashed bug I found in chapter 10 of the book.",
"@npcName@: I told him that I’d fixed it, and that he could use the <span class='cmd'>“git pull”</span> spell to get my changes into his copy of the book.",
"@npcName@: I’m not sure he understood, though... I’m afraid he might’ve taken “pull” to mean “pull the page out of the book.”",
"@npcName@: Maybe you should go visit him to explain it in more depth. He lives south of here, by the lake. Don’t forget the spell: <span class='cmd'>“git pull.”</span>"
]),
scriptUtils.removeCurrentInteraction(),
scriptUtils.addInteraction(['Linus'], 'linusGitPullRepeat'),
scriptUtils.addInteraction(['Junio'], 'junioGitPull')
]));
vm.run();
},
taskString: "Talk to Linus",
referrable: true
},
linusGitPullRepeat: {
doAction: function(scriptUtils) {
var gameState = scriptUtils.getGameState();
var vm = Crafty.e('ScriptRunner');
vm.ScriptRunner(_.flatten([
scriptUtils.dialogAndPause([
"@npcName@: Go see Junio and show him how to get my changes into his copy of the book.",
"@npcName@: Remember the spell: <span class='cmd'>“git pull.”</span>"
])
]));
vm.run();
},
taskString: "",
referrable: false
},
junioGitPull: {
doAction: function(scriptUtils) {
var gameState = scriptUtils.getGameState();
var vm = Crafty.e('ScriptRunner');
vm.ScriptRunner(_.flatten([
scriptUtils.dialogAndPause([
"@npcName@: Hi @heroName@; I saw a squashed bug between the pages of the book, and I spoke to Linus about it, but he said he had already gotten rid of it in his copy.",
"@npcName@: I thought I could try and fix the affected pages myself, but then I’d have to guess at all the words that were under the bug.",
"@npcName@: He said there’s a way to use git magic to get his changes into my copy ... I think he called it “pulling.” You know how to do that?"
]),
[{ action: 'label', label: 'askPull' }],
scriptUtils.quizBranch(
{ /* right answer */
text: "git pull",
result: [{ action: 'jumpToLabel', label: 'endPull' }]
},
{ /* wrong answers */
texts: ["git fetch", "git receive", "git update"],
result: [], /* fall through */
take: 2
},
{ /* joke answers; none for now */
choices: [], take: 0
},
"How do you get Linus' changes?"
),
scriptUtils.dialogAndPause([
"@npcName@: Doesn't look like that worked. The bug is still here between the pages. Should we try again?"
]),
[{ action: 'jumpToLabel', label: 'askPull' }],
[{ action: 'label', label: 'endPull' }],
scriptUtils.dialogAndPause([
"@npcName@: Hey, great. The bug is gone. Thanks!",
"@npcName@: I’m sure all the villagers in Sveni will want their books “de-bugged” as well. Why don’t you go and teach them how?"
]),
scriptUtils.removeInteraction('Linus', 'linusGitPullRepeat'),
scriptUtils.giveCopper(config.coinValues.copper),
scriptUtils.removeCurrentInteraction(),
scriptUtils.addInteraction(sveniteNames, 'villagerGitPull')
]));
vm.run();
},
taskString: "Explain 'git pull' to Junio",
referrable: true
},
villagerGitPull: {
doAction: function(scriptUtils) {
var gameState = scriptUtils.getGameState();
var thisInteraction = 'villagerGitPull';
var vm = Crafty.e('ScriptRunner');
vm.ScriptRunner(_.flatten([
scriptUtils.dialogAndPause([
"@npcName@: Hi @heroName@, you came just at the right time. I’ve really been enjoying Linus’ book, but now I’m at chapter 10 and there’s a squashed bug over the most important paragraph!",
"@npcName@: I won’t be able to understand any of the rest this way.",
"@npcName@: I heard Linus fixed that, but I’d hate to have to throw the whole book out and “git clone” it all over again, just to get that fix.",
"@npcName@: You know, there’s a limit on how many pages I can pull through the ether every month... What should I do?"
]),
[{ action: 'label', label: 'askPull' }],
scriptUtils.quizBranch(
{ /* right answer */
text: "git pull",
result: [{ action: 'jumpToLabel', label: 'endPull' }]
},
{ /* wrong answers */
texts: ["git fetch", "git receive", "git update"],
result: [], /* fall through */
take: 2
},
{ /* joke answers; none for now */
choices: [], take: 0
},
"How do you get only the pages that changed?"
),
scriptUtils.dialogAndPause(["@npcName@: Doesn’t look like that worked. The bug is still here between the pages. Should we try again?"]),
[{ action: 'jumpToLabel', label: 'askPull' }],
[{ action: 'label', label: 'endPull' }],
scriptUtils.dialogAndPause(["@npcName@: Hey, great. The bug is gone. Thanks! Here’s something for your help."]),
scriptUtils.giveCopper(config.coinValues.copper),
scriptUtils.removeCurrentInteraction(),
[{
action: 'arbitraryCode',
code: function(curState, callback) {
var npcsWithPull = gameState.findInteraction(thisInteraction);
if (npcsWithPull.length === 0) {
gameState.addInteraction(['Linus'], 'linusGitPush');
}
callback(curState+1);
}
}]
]));
vm.run();
},
taskString: "Explain 'git pull' to villagers (@num@ left)",
referrable: true
},
linusGitPush: {
doAction: function(scriptUtils) {
var gameState = scriptUtils.getGameState();
var vm = Crafty.e('ScriptRunner');
vm.ScriptRunner(_.flatten([
scriptUtils.dialogAndPause([
"@npcName@: Hey, I heard my book is a big success. Everyone’s been adding their own little chapter to it.",
"@npcName@: I think it’s great that we can all work together to make it better, but now everyone’s work is only in their own copy!",
"@npcName@: Scott’s version has the chapter on alchemy, while Junio’s version has the chapter on summoning, and the Svenites all have their own books.",
"@npcName@: You should teach them how to cast the “push” spell on each of their versions of the book, to send those changes to me. Then I can combine everything into one complete “master edition” with all of their chapters.",
"@npcName@: The incantation is short and to-the-point: <span class='cmd'>“git push.”</span> But there's a small wrinkle you might run into when you're using that spell.",
"@npcName@: I’m always working on my book, you see, and even after you've gotten a copy with “git clone,” or gotten the latest and greatest with “git pull”, there's always a chance that I'll have changed something else by the time you're ready to send your own changes back.",
"@npcName@: And if you were to just send your changes straight off, they could interfere with mine, which would cause lots of trouble...",
"@npcName@: So I've built some safeguards into the “git push” spell: it'll bounce your changes back to you if they would interfere with any of mine. When that happens, what you need to do is cast <span class='cmd'>“git pull.”</span>. That will retrieve my latest changes and make sure they can fit together with yours.",
"@npcName@: Once you've done that, you can try the <span class='cmd'>“git push”</span> again, and it should work.",
"@npcName@: So, to sum it all up: first try <span class='cmd'>“git push”</span>; if your changes bounce back, do <span class='cmd'>“git pull”</span>, then try the <span class='cmd'>“git push”</span> again.",
"@npcName@: Scott seems to be quick at picking up new spells. Why don’t you go see him first?"
]),
scriptUtils.removeCurrentInteraction(),
scriptUtils.addInteraction(['Scott'], 'scottGitPush'),
scriptUtils.addInteraction(['Linus'], 'linusGitPushRepeat')
]));
vm.run();
},
taskString: "Check in with Linus",
referrable: true
},
linusGitPushRepeat: {
doAction: function(scriptUtils) {
var gameState = scriptUtils.getGameState();
var vm = Crafty.e('ScriptRunner');
vm.ScriptRunner(_.flatten([
scriptUtils.dialogAndPause([
"@npcName@: Go see Scott and teach him how to send him changes back to me.",
"@npcName@: To do that, you first cast <span class='cmd'>“git push”</span>. If your changes bounce back, then cast <span class='cmd'>“git pull”</span> to get my latest changes and make sure they fit together with yours, then try the <span class='cmd'>“git push”</span> one more time."
])
]));
vm.run();
},
taskString: "",
referrable: false
},
scottGitPush: {
doAction: function(scriptUtils) {
var gameState = scriptUtils.getGameState();
var vm = Crafty.e('ScriptRunner');
vm.ScriptRunner(_.flatten([
scriptUtils.dialogAndPause([
"@npcName@: Hey @heroName@, what’s up?",
"@npcName@: Oh, Linus wants my chapter added to his “master edition”? Wow, that sounds great.",
"@npcName@: There must be some magic involved to do that automatically, right? What's the first thing I need to do?"
]),
scriptUtils.quizBranch(
{ /* right answer */
text: "git push",
result: [{ action: 'jumpToLabel', label: 'endPush' }]
},
{ /* wrong answers */
texts: ["git commit", "git add", "git update", "git send"],
result: scriptUtils.dialogAndPause([
"@npcName@: Well, it doesn’t seem like anything happened.",
"@npcName@: I mean, you could go ask Linus if he now has my chapter I guess, but something didn’t feel quite right about casting that last spell..."
]),
take: 2
},
{ /* joke answers; none for now */
choices: [], take: 0
},
"How do I send my changes over to Linus?"
),
[{ action: 'jumpToLabel', label: 'end' }],
[{ action: 'label', label: 'endPush' }],
scriptUtils.dialogAndPause(["@npcName@: Hey, did you see that? The extra pages from my chapter flew into the clouds. I bet Linus probably has my chapter now."]),
scriptUtils.addInteraction(['Junio'], 'junioGitPush'),
scriptUtils.removeInteraction('Linus', 'linusGitPushRepeat'),
scriptUtils.removeCurrentInteraction(),
scriptUtils.giveCopper(config.coinValues.copper),
[
{ action: 'label', label: 'end' },
{ action: 'destroyVM' }
]
]));
vm.run();
},
taskString: "Explain 'git push' to Scott",
referrable: true
},
junioGitPush: {
doAction: function(scriptUtils) {