##// END OF EJS Templates
Bugfixes, remaining font stuff
naryl -
r33:7e7dc5dd default
parent child Browse files
Show More
@@ -1,96 +1,97 b''
1
1
2 # start
2 # start
3 USEHTML=1
3 USEHTML=1
4 BCOLOR = RGB(255, 255, 255)
4 '<center><font size="20" color="#FF0000" face="Times New Roman"><b>ВСкстовый квСст</b></font></center><br>'
5 '<center><font size="20" color="#FF0000" face="Times New Roman"><b>ВСкстовый квСст</b></font></center><br>'
5 ' <b>Π’Π°ΡˆΠ° Ρ†Π΅Π»ΡŒ</b> - Π·Π°Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ <i>дСньги</i>, ΠΏΠΎΠΊΡƒΠΏΠ°Ρ‚ΡŒ Π½Π° Π½ΠΈΡ… <i>ΠΏΠΎΠ΄Π°Ρ€ΠΊΠΈ</i> ΠΈ Π΄Π°Ρ€ΠΈΡ‚ΡŒ своим <i>Π±Π»ΠΈΠ·ΠΊΠΈΠΌ</i>.'
6 ' <b>Π’Π°ΡˆΠ° Ρ†Π΅Π»ΡŒ</b> - Π·Π°Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ <i>дСньги</i>, ΠΏΠΎΠΊΡƒΠΏΠ°Ρ‚ΡŒ Π½Π° Π½ΠΈΡ… <i>ΠΏΠΎΠ΄Π°Ρ€ΠΊΠΈ</i> ΠΈ Π΄Π°Ρ€ΠΈΡ‚ΡŒ своим <i>Π±Π»ΠΈΠ·ΠΊΠΈΠΌ</i>.'
6 ACT '<b>ΠΠ°Ρ‡Π°Ρ‚ΡŒ ΠΈΠ³Ρ€Ρƒ</b>':GOTO 'Π”ΠΎΠΌ'
7 ACT '<b>ΠΠ°Ρ‡Π°Ρ‚ΡŒ ΠΈΠ³Ρ€Ρƒ</b>':GOTO 'Π”ΠΎΠΌ'
7 -
8 -
8 #Π Π°Π±ΠΎΡ‚Π°
9 #Π Π°Π±ΠΎΡ‚Π°
9 '<center><b>ΠŸΠΎΡ€Ρ‚</b></center><br>'
10 '<center><b>ΠŸΠΎΡ€Ρ‚</b></center><br>'
10 ' ΠŸΠΎΡ€Ρ‚ находится Π½Π° самой юТной ΠΎΠΊΡ€Π°ΠΈΠ½Π΅ Π³ΠΎΡ€ΠΎΠ΄Π°. Π—Π΄Π΅ΡΡŒ постоянно Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ ΠΈ Ρ€Π°Π·Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ суда. Π Π°Π±ΠΎΡ‡ΠΈΡ… Ρ€ΡƒΠΊ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ ΠΈ складской Π±Ρ€ΠΈΠ³Π°Π΄ΠΈΡ€ всСгда Ρ€Π°Π΄ Π·Π°ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ <i>дСньги</i> Π·Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ.'
11 ' ΠŸΠΎΡ€Ρ‚ находится Π½Π° самой юТной ΠΎΠΊΡ€Π°ΠΈΠ½Π΅ Π³ΠΎΡ€ΠΎΠ΄Π°. Π—Π΄Π΅ΡΡŒ постоянно Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ ΠΈ Ρ€Π°Π·Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ суда. Π Π°Π±ΠΎΡ‡ΠΈΡ… Ρ€ΡƒΠΊ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ ΠΈ складской Π±Ρ€ΠΈΠ³Π°Π΄ΠΈΡ€ всСгда Ρ€Π°Π΄ Π·Π°ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ <i>дСньги</i> Π·Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ.'
11 ' Π£ вас <font size="16"><b><<Π”Π΅Π½ΡŒΠ³ΠΈ>></b></font> ΠΌΠΎΠ½Π΅Ρ‚.'
12 ' Π£ вас <font size="16"><b><<Π”Π΅Π½ΡŒΠ³ΠΈ>></b></font> ΠΌΠΎΠ½Π΅Ρ‚.'
12 ' Π’Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ пСрСнСсти <font size="16" color="#00AA00"><b><<3-Π―Ρ‰ΠΈΠΊ>></b></font> ящика.'
13 ' Π’Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ пСрСнСсти <font size="16" color="#00AA00"><b><<3-Π―Ρ‰ΠΈΠΊ>></b></font> ящика.'
13 ACT 'Π˜Π΄Ρ‚ΠΈ Π΄ΠΎΠΌΠΎΠΉ':GOTO 'Π”ΠΎΠΌ'
14 ACT 'Π˜Π΄Ρ‚ΠΈ Π΄ΠΎΠΌΠΎΠΉ':GOTO 'Π”ΠΎΠΌ'
14 ACT 'Π˜Π΄Ρ‚ΠΈ Π² ΠΌΠ°Π³Π°Π·ΠΈΠ½':GOTO 'Магазин'
15 ACT 'Π˜Π΄Ρ‚ΠΈ Π² ΠΌΠ°Π³Π°Π·ΠΈΠ½':GOTO 'Магазин'
15 ACT 'ΠŸΠ΅Ρ€Π΅Π½Π΅ΡΡ‚ΠΈ ящик':
16 ACT 'ΠŸΠ΅Ρ€Π΅Π½Π΅ΡΡ‚ΠΈ ящик':
16 Π―Ρ‰ΠΈΠΊ = Π―Ρ‰ΠΈΠΊ + 1
17 Π―Ρ‰ΠΈΠΊ = Π―Ρ‰ΠΈΠΊ + 1
17 WAIT 500
18 WAIT 500
18 IF Π―Ρ‰ΠΈΠΊ = 3:
19 IF Π―Ρ‰ΠΈΠΊ = 3:
19 Π”Π΅Π½ΡŒΠ³ΠΈ = Π”Π΅Π½ΡŒΠ³ΠΈ + 5
20 Π”Π΅Π½ΡŒΠ³ΠΈ = Π”Π΅Π½ΡŒΠ³ΠΈ + 5
20 Π―Ρ‰ΠΈΠΊ = 0
21 Π―Ρ‰ΠΈΠΊ = 0
21 END
22 END
22 GOTO 'Π Π°Π±ΠΎΡ‚Π°'
23 GOTO 'Π Π°Π±ΠΎΡ‚Π°'
23 END
24 END
24 -
25 -
25 #Магазин
26 #Магазин
26 '<center><b>Магазин</b></center><br>'
27 '<center><b>Магазин</b></center><br>'
27 ' Магазин нСбольшой, Π½ΠΎ Ρ‚ΡƒΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π΅ΡΡ‚ΡŒ всё, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ простому Π³ΠΎΡ€ΠΎΠΆΠ°Π½ΠΈΠ½Ρƒ. Π’ΠΈΡ‚Ρ€ΠΈΠ½Ρ‹ заставлСны Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Ρ‚ΠΎΠ²Π°Ρ€Π°ΠΌΠΈ. Π£ кассы стоит полная ΠΆΠ΅Π½Ρ‰ΠΈΠ½Π° ΠΈ Ρ…ΠΌΡƒΡ€ΠΎ смотрит Π½Π° вас.'
28 ' Магазин нСбольшой, Π½ΠΎ Ρ‚ΡƒΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π΅ΡΡ‚ΡŒ всё, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ простому Π³ΠΎΡ€ΠΎΠΆΠ°Π½ΠΈΠ½Ρƒ. Π’ΠΈΡ‚Ρ€ΠΈΠ½Ρ‹ заставлСны Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Ρ‚ΠΎΠ²Π°Ρ€Π°ΠΌΠΈ. Π£ кассы стоит полная ΠΆΠ΅Π½Ρ‰ΠΈΠ½Π° ΠΈ Ρ…ΠΌΡƒΡ€ΠΎ смотрит Π½Π° вас.'
28 ' Π£ вас <font size="16"><b><<Π”Π΅Π½ΡŒΠ³ΠΈ>></b></font> ΠΌΠΎΠ½Π΅Ρ‚.'
29 ' Π£ вас <font size="16"><b><<Π”Π΅Π½ΡŒΠ³ΠΈ>></b></font> ΠΌΠΎΠ½Π΅Ρ‚.'
29 IF Π”Π΅Π½ΡŒΠ³ΠΈ >= 3:
30 IF Π”Π΅Π½ΡŒΠ³ΠΈ >= 3:
30 ACT 'ΠšΡƒΠΏΠΈΡ‚ΡŒ конструктор':
31 ACT 'ΠšΡƒΠΏΠΈΡ‚ΡŒ конструктор':
31 Π”Π΅Π½ΡŒΠ³ΠΈ = Π”Π΅Π½ΡŒΠ³ΠΈ - 3
32 Π”Π΅Π½ΡŒΠ³ΠΈ = Π”Π΅Π½ΡŒΠ³ΠΈ - 3
32 ADDOBJ 'ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€'
33 ADDOBJ 'ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€'
33 GOTO 'Магазин'
34 GOTO 'Магазин'
34 END
35 END
35 END
36 END
36 IF Π”Π΅Π½ΡŒΠ³ΠΈ >= 5:
37 IF Π”Π΅Π½ΡŒΠ³ΠΈ >= 5:
37 ACT 'ΠšΡƒΠΏΠΈΡ‚ΡŒ плюшСвого мСдвСдя':
38 ACT 'ΠšΡƒΠΏΠΈΡ‚ΡŒ плюшСвого мСдвСдя':
38 Π”Π΅Π½ΡŒΠ³ΠΈ = Π”Π΅Π½ΡŒΠ³ΠΈ - 5
39 Π”Π΅Π½ΡŒΠ³ΠΈ = Π”Π΅Π½ΡŒΠ³ΠΈ - 5
39 ADDOBJ 'ΠŸΠ»ΡŽΡˆΠ΅Π²Ρ‹ΠΉ мСдвСдь'
40 ADDOBJ 'ΠŸΠ»ΡŽΡˆΠ΅Π²Ρ‹ΠΉ мСдвСдь'
40 GOTO 'Магазин'
41 GOTO 'Магазин'
41 END
42 END
42 ACT 'ΠšΡƒΠΏΠΈΡ‚ΡŒ Π²ΡΠ·Π°Π»ΡŒΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€':
43 ACT 'ΠšΡƒΠΏΠΈΡ‚ΡŒ Π²ΡΠ·Π°Π»ΡŒΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€':
43 Π”Π΅Π½ΡŒΠ³ΠΈ = Π”Π΅Π½ΡŒΠ³ΠΈ - 5
44 Π”Π΅Π½ΡŒΠ³ΠΈ = Π”Π΅Π½ΡŒΠ³ΠΈ - 5
44 ADDOBJ 'Π’ΡΠ·Π°Π»ΡŒΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€'
45 ADDOBJ 'Π’ΡΠ·Π°Π»ΡŒΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€'
45 GOTO 'Магазин'
46 GOTO 'Магазин'
46 END
47 END
47 END
48 END
48 IF Π”Π΅Π½ΡŒΠ³ΠΈ >= 7:
49 IF Π”Π΅Π½ΡŒΠ³ΠΈ >= 7:
49 ACT 'ΠšΡƒΠΏΠΈΡ‚ΡŒ инструмСнты':
50 ACT 'ΠšΡƒΠΏΠΈΡ‚ΡŒ инструмСнты':
50 Π”Π΅Π½ΡŒΠ³ΠΈ = Π”Π΅Π½ΡŒΠ³ΠΈ - 7
51 Π”Π΅Π½ΡŒΠ³ΠΈ = Π”Π΅Π½ΡŒΠ³ΠΈ - 7
51 ADDOBJ 'Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹'
52 ADDOBJ 'Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹'
52 GOTO 'Магазин'
53 GOTO 'Магазин'
53 END
54 END
54 END
55 END
55 ACT 'Π˜Π΄Ρ‚ΠΈ Π΄ΠΎΠΌΠΎΠΉ':GOTO 'Π”ΠΎΠΌ'
56 ACT 'Π˜Π΄Ρ‚ΠΈ Π΄ΠΎΠΌΠΎΠΉ':GOTO 'Π”ΠΎΠΌ'
56 ACT 'Π˜Π΄Ρ‚ΠΈ Π² ΠΏΠΎΡ€Ρ‚':GOTO 'Π Π°Π±ΠΎΡ‚Π°'
57 ACT 'Π˜Π΄Ρ‚ΠΈ Π² ΠΏΠΎΡ€Ρ‚':GOTO 'Π Π°Π±ΠΎΡ‚Π°'
57 -
58 -
58 #Π”ΠΎΠΌ
59 #Π”ΠΎΠΌ
59 '<center><b>Π”ΠΎΠΌ</b></center><br>'
60 '<center><b>Π”ΠΎΠΌ</b></center><br>'
60 ' Π”ΠΎΠΌΠ° всСгда ΠΎΡ‡Π΅Π½ΡŒ ΡƒΡŽΡ‚Π½ΠΎ. И вкусно ΠΏΠ°Ρ…Π½Π΅Ρ‚ Π΅Π΄ΠΎΠΉ. Мама, сидя Π² крСслС, вяТСт носки. ΠžΡ‚Π΅Ρ† с вашим Π±Ρ€Π°Ρ‚ΠΎΠΌ Ρ‡ΠΈΠ½ΠΈΡ‚ скворСчник. БСстра Ρ…Π»ΠΎΠΏΠΎΡ‡Π΅Ρ‚ Π½Π° ΠΊΡƒΡ…Π½Π΅. Π”ΠΎΠΌΠ° всСгда Ρ…ΠΎΡ€ΠΎΡˆΠΎ.'
61 ' Π”ΠΎΠΌΠ° всСгда ΠΎΡ‡Π΅Π½ΡŒ ΡƒΡŽΡ‚Π½ΠΎ. И вкусно ΠΏΠ°Ρ…Π½Π΅Ρ‚ Π΅Π΄ΠΎΠΉ. Мама, сидя Π² крСслС, вяТСт носки. ΠžΡ‚Π΅Ρ† с вашим Π±Ρ€Π°Ρ‚ΠΎΠΌ Ρ‡ΠΈΠ½ΠΈΡ‚ скворСчник. БСстра Ρ…Π»ΠΎΠΏΠΎΡ‡Π΅Ρ‚ Π½Π° ΠΊΡƒΡ…Π½Π΅. Π”ΠΎΠΌΠ° всСгда Ρ…ΠΎΡ€ΠΎΡˆΠΎ.'
61 ' Π£ вас <font size="16"><b><<Π”Π΅Π½ΡŒΠ³ΠΈ>></b></font> ΠΌΠΎΠ½Π΅Ρ‚.'
62 ' Π£ вас <font size="16"><b><<Π”Π΅Π½ΡŒΠ³ΠΈ>></b></font> ΠΌΠΎΠ½Π΅Ρ‚.'
62 IF OBJ 'ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€':
63 IF OBJ 'ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€':
63 ACT 'ΠŸΠΎΠ΄Π°Ρ€ΠΈΡ‚ΡŒ конструктор Π±Ρ€Π°Ρ‚Ρƒ':
64 ACT 'ΠŸΠΎΠ΄Π°Ρ€ΠΈΡ‚ΡŒ конструктор Π±Ρ€Π°Ρ‚Ρƒ':
64 DELOBJ 'ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€'
65 DELOBJ 'ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€'
65 ' - Π’ΠΎΡ‚ Ρ‚Π΅Π±Π΅ конструктор.'
66 ' - Π’ΠΎΡ‚ Ρ‚Π΅Π±Π΅ конструктор.'
66 ' - Бпасибо, Π±Ρ€Π°Ρ‚.'
67 ' - Бпасибо, Π±Ρ€Π°Ρ‚.'
67 DELACT 'ΠŸΠΎΠ΄Π°Ρ€ΠΈΡ‚ΡŒ конструктор Π±Ρ€Π°Ρ‚Ρƒ'
68 DELACT 'ΠŸΠΎΠ΄Π°Ρ€ΠΈΡ‚ΡŒ конструктор Π±Ρ€Π°Ρ‚Ρƒ'
68 END
69 END
69 END
70 END
70 IF OBJ 'ΠŸΠ»ΡŽΡˆΠ΅Π²Ρ‹ΠΉ мСдвСдь':
71 IF OBJ 'ΠŸΠ»ΡŽΡˆΠ΅Π²Ρ‹ΠΉ мСдвСдь':
71 ACT 'ΠŸΠΎΠ΄Π°Ρ€ΠΈΡ‚ΡŒ мСдвСдя сСстрС':
72 ACT 'ΠŸΠΎΠ΄Π°Ρ€ΠΈΡ‚ΡŒ мСдвСдя сСстрС':
72 DELOBJ 'ΠŸΠ»ΡŽΡˆΠ΅Π²Ρ‹ΠΉ мСдвСдь'
73 DELOBJ 'ΠŸΠ»ΡŽΡˆΠ΅Π²Ρ‹ΠΉ мСдвСдь'
73 ' - Π’ΠΎΡ‚ Ρ‚Π΅Π±Π΅ ΠΏΠ»ΡŽΡˆΠ΅Π²Ρ‹ΠΉ мСдвСдь.'
74 ' - Π’ΠΎΡ‚ Ρ‚Π΅Π±Π΅ ΠΏΠ»ΡŽΡˆΠ΅Π²Ρ‹ΠΉ мСдвСдь.'
74 ' - Бпасибо, Π±Ρ€Π°Ρ‚.'
75 ' - Бпасибо, Π±Ρ€Π°Ρ‚.'
75 DELACT 'ΠŸΠΎΠ΄Π°Ρ€ΠΈΡ‚ΡŒ мСдвСдя сСстрС'
76 DELACT 'ΠŸΠΎΠ΄Π°Ρ€ΠΈΡ‚ΡŒ мСдвСдя сСстрС'
76 END
77 END
77 END
78 END
78 IF OBJ 'Π’ΡΠ·Π°Π»ΡŒΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€':
79 IF OBJ 'Π’ΡΠ·Π°Π»ΡŒΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€':
79 ACT 'ΠŸΠΎΠ΄Π°Ρ€ΠΈΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ ΠΌΠ°ΠΌΠ΅':
80 ACT 'ΠŸΠΎΠ΄Π°Ρ€ΠΈΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ ΠΌΠ°ΠΌΠ΅':
80 DELOBJ 'Π’ΡΠ·Π°Π»ΡŒΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€'
81 DELOBJ 'Π’ΡΠ·Π°Π»ΡŒΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€'
81 ' - Π’ΠΎΡ‚ Ρ‚Π΅Π±Π΅ Π²ΡΠ·Π°Π»ΡŒΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€.'
82 ' - Π’ΠΎΡ‚ Ρ‚Π΅Π±Π΅ Π²ΡΠ·Π°Π»ΡŒΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€.'
82 ' - Бпасибо, сынок.'
83 ' - Бпасибо, сынок.'
83 DELACT 'ΠŸΠΎΠ΄Π°Ρ€ΠΈΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ ΠΌΠ°ΠΌΠ΅'
84 DELACT 'ΠŸΠΎΠ΄Π°Ρ€ΠΈΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ ΠΌΠ°ΠΌΠ΅'
84 END
85 END
85 END
86 END
86 IF OBJ 'Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹':
87 IF OBJ 'Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹':
87 ACT 'ΠŸΠΎΠ΄Π°Ρ€ΠΈΡ‚ΡŒ инструмСнты ΠΎΡ‚Ρ†Ρƒ':
88 ACT 'ΠŸΠΎΠ΄Π°Ρ€ΠΈΡ‚ΡŒ инструмСнты ΠΎΡ‚Ρ†Ρƒ':
88 DELOBJ 'Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹'
89 DELOBJ 'Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹'
89 ' - Π’ΠΎΡ‚ Ρ‚Π΅Π±Π΅ инструмСнты.'
90 ' - Π’ΠΎΡ‚ Ρ‚Π΅Π±Π΅ инструмСнты.'
90 ' - Бпасибо, сын.'
91 ' - Бпасибо, сын.'
91 DELACT 'ΠŸΠΎΠ΄Π°Ρ€ΠΈΡ‚ΡŒ инструмСнты ΠΎΡ‚Ρ†Ρƒ'
92 DELACT 'ΠŸΠΎΠ΄Π°Ρ€ΠΈΡ‚ΡŒ инструмСнты ΠΎΡ‚Ρ†Ρƒ'
92 END
93 END
93 END
94 END
94 ACT 'Π˜Π΄Ρ‚ΠΈ Π² ΠΏΠΎΡ€Ρ‚':GOTO 'Π Π°Π±ΠΎΡ‚Π°'
95 ACT 'Π˜Π΄Ρ‚ΠΈ Π² ΠΏΠΎΡ€Ρ‚':GOTO 'Π Π°Π±ΠΎΡ‚Π°'
95 ACT 'Π˜Π΄Ρ‚ΠΈ Π² ΠΌΠ°Π³Π°Π·ΠΈΠ½':GOTO 'Магазин'
96 ACT 'Π˜Π΄Ρ‚ΠΈ Π² ΠΌΠ°Π³Π°Π·ΠΈΠ½':GOTO 'Магазин'
96 -
97 -
@@ -1,132 +1,136 b''
1
1
2 .qsp-frame {
2 .qsp-frame {
3 border: 1px solid black;
3 border: 1px solid black;
4 overflow: auto;
4 overflow: auto;
5 padding: 5px;
5 padding: 5px;
6 box-sizing: border-box;
6 box-sizing: border-box;
7 }
7 }
8
8
9 #qsp {
9 #qsp {
10 position: absolute;
10 position: absolute;
11 display: flex;
11 display: flex;
12 flex-flow: row;
12 flex-flow: row;
13 top: 0;
13 top: 0;
14 left: 0;
14 left: 0;
15 width: 100%;
15 width: 100%;
16 height: 100%;
16 height: 100%;
17 }
17 }
18
18
19 .qsp-col {
19 .qsp-col {
20 display: flex;
20 display: flex;
21 flex-flow: column;
21 flex-flow: column;
22 }
22 }
23
23
24 .qsp-col1 {
24 .qsp-col1 {
25 flex: 7 7 70px;
25 flex: 7 7 70px;
26 }
26 }
27
27
28 .qsp-col2 {
28 .qsp-col2 {
29 flex: 3 3 30px;
29 flex: 3 3 30px;
30 }
30 }
31
31
32 .qsp-col3 {
32 .qsp-col3 {
33 flex: 0 0 40px;
33 flex: 0 0 40px;
34 }
34 }
35
35
36 #qsp-main {
36 #qsp-main {
37 flex: 6 6 60px;
37 flex: 6 6 60px;
38 background-repeat: no-repeat;
38 background-repeat: no-repeat;
39 background-position: right top;
39 background-position: right top;
40 background-attachment: fixed;
40 background-attachment: fixed;
41 }
41 }
42
42
43 #qsp-acts {
43 #qsp-acts {
44 flex: 4 4 40px;
44 flex: 4 4 40px;
45 }
45 }
46
46
47 #qsp-input {
47 #qsp-input {
48 }
48 }
49
49
50 #qsp-stat {
50 #qsp-stat {
51 flex: 5 5 50px;
51 flex: 5 5 50px;
52 }
52 }
53
53
54 #qsp-objs {
54 #qsp-objs {
55 flex: 5 5 50px;
55 flex: 5 5 50px;
56 }
56 }
57
57
58 .qsp-act {
58 .qsp-act {
59 display: block;
59 display: block;
60 padding: 2px;
60 padding: 2px;
61 font-size: large;
61 font-size: large;
62 }
62 }
63
63
64 .qsp-act:hover {
64 .qsp-act:hover {
65 outline: #9E9E9E outset 3px
65 outline: #9E9E9E outset 3px
66 }
66 }
67
67
68 /* Dropdown */
68 /* Dropdown */
69
69
70 #qsp-dropdown {
70 #qsp-dropdown {
71 display: none;
71 display: none;
72 position: absolute;
72 position: absolute;
73 background-color: #f1f1f1;
73 background-color: #f1f1f1;
74 min-width: 160px;
74 min-width: 160px;
75 overflow: auto;
75 overflow: auto;
76 box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
76 box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
77 z-index: 1;
77 z-index: 1;
78 margin: auto;
78 margin: auto;
79 }
79 }
80
80
81 #qsp-dropdown a {
81 #qsp-dropdown a {
82 color: black;
82 color: black;
83 padding: 12px 16px;
83 padding: 12px 16px;
84 text-decoration: none;
84 text-decoration: none;
85 display: block;
85 display: block;
86 }
86 }
87
87
88 #qsp-dropdown a:hover {
88 #qsp-dropdown a:hover {
89 background-color: #ddd;
89 background-color: #ddd;
90 }
90 }
91
91
92 /* Buttons */
92 /* Buttons */
93
93
94 .qsp-col3 a, .qsp-col3 img {
94 .qsp-col3 a, .qsp-col3 img {
95 width: 50px;
95 width: 50px;
96 height: 50px;
96 height: 50px;
97 }
97 }
98
98
99 #qsp-btn-save img {
99 #qsp-btn-save img {
100 background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAABmJLR0QA/wD/AP+gvaeTAAACSklEQVRoge3ZPWgUQRjG8V/iRRFU/GoEQdSohSgWWqQSooVgK9iJFiKCnYV2BkFQsBRBQQwWVsHKIoWxEOzEwmhhogbRMhhFicTvYm+JCUlmZzabRLN/OPaWeZ+ZeW7feXf2lpqampqamnRaImKP4hA2VjCP27hbpoNGwbib2IPreB+IPYY7M7SvxWYM4QNO4QqWyQxVRgdeYnnB+K5A+wUcbB7z+O14hxPx08toLRDTgfv4mjrIJFrwwMS0HsABXMTxlE6LpNYqfE7pPJIBdOKhLM1uxIiLrpG5YtC4GSLMVGGkLdD+GpfxAuvxaVL7oCzN+jCG7iKDVmHkKS5hSSBuJ3bg6hRt+Zrpa553z8bEuoQrUVXk1exwKLBI1ZpPBnAL+0KBqanVim1Ykaifji+yNfIrVphipB1n8BgjCfqZ2IrTuIZXMcIUIydxFj8TtEW4JysW52JEKWtkVHUm4EdzjChSrkgLlmJXghb6m8ep9MN4K25XjvTF3sCaElrT6McS+0w2Mirb+JWhrH4CC/0+UpjUK7Ia5/86f4IeHMHeEvPJ+4km1chHE43k9KROpCyLPrViym8/vjW/b5Jt3acjL7/RzEX5bRg3sjKg+2fK7/PmZ9aZzdTqxwYzp06IBZFaDeHUCbFgUquy1Anx35TfRWXkd+WzCBOcQxEjQ7JH0PmiHW9CQUWM9Mr+Y+osO6ME8nF7Q4FFn8T2y14VDMt2vsFfqCRbZBvTdbLXFI9CgphHyjbsVu4+EcMInuH7HI1XU1NTU7OI+QMFe2N82rtssgAAAABJRU5ErkJggg==');
100 background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAABmJLR0QA/wD/AP+gvaeTAAACSklEQVRoge3ZPWgUQRjG8V/iRRFU/GoEQdSohSgWWqQSooVgK9iJFiKCnYV2BkFQsBRBQQwWVsHKIoWxEOzEwmhhogbRMhhFicTvYm+JCUlmZzabRLN/OPaWeZ+ZeW7feXf2lpqampqamnRaImKP4hA2VjCP27hbpoNGwbib2IPreB+IPYY7M7SvxWYM4QNO4QqWyQxVRgdeYnnB+K5A+wUcbB7z+O14hxPx08toLRDTgfv4mjrIJFrwwMS0HsABXMTxlE6LpNYqfE7pPJIBdOKhLM1uxIiLrpG5YtC4GSLMVGGkLdD+GpfxAuvxaVL7oCzN+jCG7iKDVmHkKS5hSSBuJ3bg6hRt+Zrpa553z8bEuoQrUVXk1exwKLBI1ZpPBnAL+0KBqanVim1Ykaifji+yNfIrVphipB1n8BgjCfqZ2IrTuIZXMcIUIydxFj8TtEW4JysW52JEKWtkVHUm4EdzjChSrkgLlmJXghb6m8ep9MN4K25XjvTF3sCaElrT6McS+0w2Mirb+JWhrH4CC/0+UpjUK7Ia5/86f4IeHMHeEvPJ+4km1chHE43k9KROpCyLPrViym8/vjW/b5Jt3acjL7/RzEX5bRg3sjKg+2fK7/PmZ9aZzdTqxwYzp06IBZFaDeHUCbFgUquy1Anx35TfRWXkd+WzCBOcQxEjQ7JH0PmiHW9CQUWM9Mr+Y+osO6ME8nF7Q4FFn8T2y14VDMt2vsFfqCRbZBvTdbLXFI9CgphHyjbsVu4+EcMInuH7HI1XU1NTU7OI+QMFe2N82rtssgAAAABJRU5ErkJggg==');
101 }
101 }
102
102
103 #qsp-btn-open img {
103 #qsp-btn-open img {
104 background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAABmJLR0QA/wD/AP+gvaeTAAACCklEQVRoge3Yz6sNYRzH8deVexNxSaEoroWFUuomOceSPVnIwsbSxs6Psrgphf9AsrZR7kJWsroUlrZKKZRSl4USGouZk9Npzp1n5pm5x4/nXdNzpvP9Pp/v95nv82OGRCKRSCQS/w8zuIn3yGpe37CEQ6sedQk38BA7G/jO4BQ+YEebQZUxVfH/OxzGVSxX2D4o2mO4jmt4jpNFe6d5mPFkRbvQ0H9h6OqUtR33/xXr0celGn4/sYjXoQ5dJ3ILB7AOW2r4bcIj7GsrkEFpXWyrwwbaf15nXWqv6SqK1abuHDmPjV0EMobhBWIZt8cZVu0j2ZDNHF7gblRozdiO49g1zqDOEzmKJ7gcGVQTzmLDSgZ1Eunh2dD9aewpsXtctH3cwzn5ALysoVWlXZvhleMV5ovfU8J363mciAliRLsRg0Q244vfT3A/zgT2cQHbImIY1S4ldPk9Ii+NH8V9H08DfbfiY6BtiHYpoYmMBr4bbwN9YzfVoEELnew9+blpwBv5u0oI9wPtQrUbkWFaXqOzsZ01IFg7pLQOyp/A58igmhCsHZJInYndNsHa/0wiVWTy9/a5NjprQGvag0Qmwd462iGltdQ8lihqlVVIIn/9/CAvrajDWgTRB8VhMt1/aSljVr4RToc6hJTWioe1jujJD4rfQx2qRvuTyX1JuTIh3UQikUgkEhPnF+1xZ9hHnLjAAAAAAElFTkSuQmCC');
104 background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAABmJLR0QA/wD/AP+gvaeTAAACCklEQVRoge3Yz6sNYRzH8deVexNxSaEoroWFUuomOceSPVnIwsbSxs6Psrgphf9AsrZR7kJWsroUlrZKKZRSl4USGouZk9Npzp1n5pm5x4/nXdNzpvP9Pp/v95nv82OGRCKRSCQS/w8zuIn3yGpe37CEQ6sedQk38BA7G/jO4BQ+YEebQZUxVfH/OxzGVSxX2D4o2mO4jmt4jpNFe6d5mPFkRbvQ0H9h6OqUtR33/xXr0celGn4/sYjXoQ5dJ3ILB7AOW2r4bcIj7GsrkEFpXWyrwwbaf15nXWqv6SqK1abuHDmPjV0EMobhBWIZt8cZVu0j2ZDNHF7gblRozdiO49g1zqDOEzmKJ7gcGVQTzmLDSgZ1Eunh2dD9aewpsXtctH3cwzn5ALysoVWlXZvhleMV5ovfU8J363mciAliRLsRg0Q244vfT3A/zgT2cQHbImIY1S4ldPk9Ii+NH8V9H08DfbfiY6BtiHYpoYmMBr4bbwN9YzfVoEELnew9+blpwBv5u0oI9wPtQrUbkWFaXqOzsZ01IFg7pLQOyp/A58igmhCsHZJInYndNsHa/0wiVWTy9/a5NjprQGvag0Qmwd462iGltdQ8lihqlVVIIn/9/CAvrajDWgTRB8VhMt1/aSljVr4RToc6hJTWioe1jujJD4rfQx2qRvuTyX1JuTIh3UQikUgkEhPnF+1xZ9hHnLjAAAAAAElFTkSuQmCC');
105 }
105 }
106
106
107 .center-on-screen {
107 .center-on-screen {
108 position: absolute;
108 position: absolute;
109 top: 0;
109 top: 0;
110 left: 0;
110 left: 0;
111 height: 100%;
111 height: 100%;
112 width: 100%;
112 width: 100%;
113 pointer-events: none;
113 pointer-events: none;
114 display: flex;
114 display: flex;
115 justify-content: center;
115 justify-content: center;
116 align-items: center;
116 align-items: center;
117 }
117 }
118
118
119 .center-on-screen > * {
119 .center-on-screen > * {
120 pointer-events: auto;
120 pointer-events: auto;
121 }
121 }
122
122
123 #qsp-image-container {
123 #qsp-image-container {
124 display: none;
124 display: none;
125 }
125 }
126
126
127 /* misc */
127 /* misc */
128
128
129 .disable a {
129 .disable a {
130 pointer-events: none;
130 pointer-events: none;
131 cursor: default;
131 cursor: default;
132 }
132 }
133
134 .qsp-objs li.qsp-obj-selected {
135 background-color: blue;
136 }
@@ -1,46 +1,44 b''
1
1
2 (in-package sugar-qsp.api)
2 (in-package sugar-qsp.api)
3
3
4 (defpsmacro with-call-args (args &body body)
4 (defpsmacro with-call-args (args &body body)
5 `(progn
5 `(progn
6 (init-args ,args)
6 (init-args ,args)
7 ,@body
7 ,@body
8 (get-result)))
8 (get-result)))
9
9
10 (defpsmacro with-frame (&body body)
10 (defpsmacro with-frame (&body body)
11 `(progn
11 `(progn
12 (push-local-frame)
12 (push-local-frame)
13 (unwind-protect
13 (unwind-protect
14 ,@body
14 ,@body
15 (pop-local-frame))))
15 (pop-local-frame))))
16
16
17 (defpsmacro href-call (func &rest args)
17 (defpsmacro href-call (func &rest args)
18 `(+ "javascript:" (inline-call ,func ,@args)))
18 `(+ "javascript:" (inline-call ,func ,@args)))
19
19
20 (defpsmacro inline-call (func &rest args)
20 (defpsmacro inline-call (func &rest args)
21 `(+ ,func
21 `(+ ',func
22 "(\""
22 "(\""
23 ,(first args)
23 ,(first args)
24 ,@(loop :for arg :in (cdr args)
24 ,@(loop :for arg :in (cdr args)
25 :collect "\", \""
25 :collect "\", \""
26 :collect arg)
26 :collect arg)
27 "\");"))
27 "\");"))
28
28
29 (defpsmacro with-sleep ((resume-func) &body body)
29 (defpsmacro with-sleep ((resume-func) &body body)
30 `(new (*promise
30 `(new (*promise
31 (lambda (resolve)
31 (lambda (resolve)
32 (start-sleeping)
32 (start-sleeping)
33 (let ((,resume-func (lambda ()
33 (let ((,resume-func (lambda ()
34 (finish-sleeping)
34 (finish-sleeping)
35 (resolve)))))
35 (resolve)))))
36 ,@body))))
36 ,@body))))
37
37
38 (defvar serv-vars (create))
39
40 (defpsmacro define-serv-var (name (slot value &optional index) &body body)
38 (defpsmacro define-serv-var (name (slot value &optional index) &body body)
41 (setf name (string-upcase (symbol-name name)))
39 (setf name (string-upcase (symbol-name name)))
42 `(setf (getprop serv-vars name)
40 `(setf (getprop serv-vars ,name)
43 (create :name ,name
41 (create :name ,name
44 :slot ,slot
42 :slot ,slot
45 :body (lambda (,value ,@(when index (list index)))
43 :body (lambda (,value ,@(when index (list index)))
46 ,@body))))
44 ,@body))))
@@ -1,528 +1,536 b''
1
1
2 (in-package sugar-qsp.api)
2 (in-package sugar-qsp.api)
3
3
4 ;;; API deals with DOM manipulation and some bookkeeping for the
4 ;;; API deals with DOM manipulation and some bookkeeping for the
5 ;;; intrinsics, namely variables
5 ;;; intrinsics, namely variables
6 ;;; API is an implementation detail and has no QSP documentation. It
6 ;;; API is an implementation detail and has no QSP documentation. It
7 ;;; doesn't call intrinsics
7 ;;; doesn't call intrinsics
8
8
9 ;;; Utils
9 ;;; Utils
10
10
11 (defun make-act-html (title img)
11 (defun make-act-html (title img)
12 (+ "<a class='qsp-act' href='" (href-call call-act title) "' onmouseover='" (inline-call select-act title) "'>"
12 (+ "<a class='qsp-act' href='" (href-call call-act title) "' onmouseover='" (inline-call select-act title) "'>"
13 (if img (+ "<img src='" img "'>") "")
13 (if img (+ "<img src='" img "'>") "")
14 title
14 title
15 "</a>"))
15 "</a>"))
16
16
17 (defun make-menu-item-html (num title img loc)
17 (defun make-menu-item-html (num title img loc)
18 (+ "<a href='" (href-call finish-menu loc) "'>"
18 (+ "<a href='" (href-call finish-menu loc) "'>"
19 (if img (+ "<img src='" img "'>") "")
19 (if img (+ "<img src='" img "'>") "")
20 title
20 title
21 "</a>"))
21 "</a>"))
22
22
23 (defun make-obj (title img selected)
23 (defun make-obj (title img selected)
24 (+ "<li>"
24 (+ "<li onclick='" (inline-call select-obj title img) "'>"
25 "<a href='" (href-call select-obj title img) "'"
25 "<a class='qsp-obj" (if selected " qsp-obj-selected" "") "'>"
26 "class='qsp-obj" (if selected " qsp-obj-selected" "") "'>"
27 (if img (+ "<img src='" img "'>") "")
26 (if img (+ "<img src='" img "'>") "")
28 obj
27 title
29 "</a>"))
28 "</a>"))
30
29
31 (defun make-menu-delimiter ()
30 (defun make-menu-delimiter ()
32 "<hr>")
31 "<hr>")
33
32
34 (defun report-error (text)
33 (defun report-error (text)
35 (alert text))
34 (alert text))
36
35
37 (defun start-sleeping ()
36 (defun start-sleeping ()
38 (chain (by-id "qsp") class-list (add "disable")))
37 (chain (by-id "qsp") class-list (add "disable")))
39
38
40 (defun finish-sleeping ()
39 (defun finish-sleeping ()
41 (chain (by-id "qsp") class-list (remove "disable")))
40 (chain (by-id "qsp") class-list (remove "disable")))
42
41
43 (defun sleep (msec)
42 (defun sleep (msec)
44 (with-sleep (resume)
43 (with-sleep (resume)
45 (set-timeout resume msec)))
44 (set-timeout resume msec)))
46
45
47 (defun init-dom ()
46 (defun init-dom ()
48 ;; Save/load buttons
47 ;; Save/load buttons
49 (let ((btn (by-id "qsp-btn-save")))
48 (let ((btn (by-id "qsp-btn-save")))
50 (setf (@ btn onclick) savegame)
49 (setf (@ btn onclick) savegame)
51 (setf (@ btn href) "#"))
50 (setf (@ btn href) "#"))
52 (let ((btn (by-id "qsp-btn-open")))
51 (let ((btn (by-id "qsp-btn-open")))
53 (setf (@ btn onclick) opengame)
52 (setf (@ btn onclick) opengame)
54 (setf (@ btn href) "#"))
53 (setf (@ btn href) "#"))
55 ;; Close image on click
54 ;; Close image on click
56 (setf (@ (by-id "qsp-image-container") onclick)
55 (setf (@ (by-id "qsp-image-container") onclick)
57 show-image)
56 show-image)
57 ;; Enter in input field
58 (setf (@ (get-frame :input) onkeyup)
58 (setf (@ (get-frame :input) onkeyup)
59 on-input-key)
59 on-input-key)
60 ;; Close the dropdown on any click
60 ;; Close the dropdown on any click
61 (setf (@ window onclick)
61 (setf (@ window onclick)
62 (lambda (event)
62 (lambda (event)
63 (setf (@ window mouse)
63 (setf (@ window mouse)
64 (list (@ event page-x)
64 (list (@ event page-x)
65 (@ event page-y)))
65 (@ event page-y)))
66 (finish-menu nil))))
66 (finish-menu nil))))
67
67
68 (defun call-serv-loc (var-name &rest args)
68 (defun call-serv-loc (var-name &rest args)
69 (let ((loc-name (get-var var-name 0 :str)))
69 (let ((loc-name (get-var var-name 0 :str)))
70 (when loc-name
70 (when loc-name
71 (let ((loc (getprop (root locs) loc-name)))
71 (let ((loc (getprop (root locs) loc-name)))
72 (when loc
72 (when loc
73 (call-loc loc-name args))))))
73 (call-loc loc-name args))))))
74
74
75 (defun filename-game (filename)
75 (defun filename-game (filename)
76 (let ((game-name (chain filename (match "(.*/)?([^.]+)(\\.[a-zA-Z]+)?") 2))))
76 (let ((game-name (chain filename (match "(.*/)?([^.]+)(\\.[a-zA-Z]+)?") 2))))
77 (getprop (root games) game-name))
77 (getprop (root games) game-name))
78
78
79 (defun run-game (name)
79 (defun run-game (name)
80 (let ((game (filename-game name)))
80 (let ((game (filename-game name)))
81 (setf (root main-game) name)
81 (setf (root main-game) name)
82 ;; Replace locations with the new game's
82 ;; Replace locations with the new game's
83 (setf (root locs) game)
83 (setf (root locs) game)
84 (funcall (getprop game
84 (funcall (getprop game
85 (chain *object (keys game) 0))
85 (chain *object (keys game) 0))
86 (list))))
86 (list))))
87
87
88 ;;; Misc
88 ;;; Misc
89
89
90 (defun newline (key)
90 (defun newline (key)
91 (append-id (key-to-id key) "<br>" t))
91 (append-id (key-to-id key) "<br>" t))
92
92
93 (defun clear-id (id)
93 (defun clear-id (id)
94 (setf (inner-html (by-id id)) ""))
94 (setf (inner-html (by-id id)) ""))
95
95
96 (defvar text-escaper (chain document (create-element :textarea)))
96 (defvar text-escaper (chain document (create-element :textarea)))
97
97
98 (defun prepare-contents (s &optional force-html)
98 (defun prepare-contents (s &optional force-html)
99 (if (or force-html (get-var "USEHTML" 0 :num))
99 (if (or force-html (get-var "USEHTML" 0 :num))
100 s
100 s
101 (progn
101 (progn
102 (setf (@ text-escaper text-content) s)
102 (setf (@ text-escaper text-content) s)
103 (inner-html text-escaper))))
103 (inner-html text-escaper))))
104
104
105 (defun get-id (id &optional force-html)
105 (defun get-id (id &optional force-html)
106 (inner-html (by-id id)))
106 (inner-html (by-id id)))
107
107
108 (defun set-id (id contents &optional force-html)
108 (defun set-id (id contents &optional force-html)
109 (setf (inner-html (by-id id)) (prepare-contents contents force-html)))
109 (setf (inner-html (by-id id)) (prepare-contents contents force-html)))
110
110
111 (defun append-id (id contents &optional force-html)
111 (defun append-id (id contents &optional force-html)
112 (when contents
112 (when contents
113 (incf (inner-html (by-id id)) (prepare-contents contents force-html))))
113 (incf (inner-html (by-id id)) (prepare-contents contents force-html))))
114
114
115 (defun on-input-key (ev)
115 (defun on-input-key (ev)
116 (when (= 13 (@ ev key-code))
116 (when (= 13 (@ ev key-code))
117 (chain ev (prevent-default))
117 (chain ev (prevent-default))
118 (call-serv-loc "USERCOM")))
118 (call-serv-loc "USERCOM")))
119
119
120 ;;; Function calls
120 ;;; Function calls
121
121
122 (defun init-args (args)
122 (defun init-args (args)
123 (dotimes (i (length args))
123 (dotimes (i (length args))
124 (let ((arg (elt args i)))
124 (let ((arg (elt args i)))
125 (if (numberp arg)
125 (if (numberp arg)
126 (set-var args i :num arg)
126 (set-var args i :num arg)
127 (set-var args i :str arg)))))
127 (set-var args i :str arg)))))
128
128
129 (defun get-result ()
129 (defun get-result ()
130 (if (not (equal "" (get-var "RESULT" 0 :str)))
130 (if (not (equal "" (get-var "RESULT" 0 :str)))
131 (get-var "RESULT" 0 :str)
131 (get-var "RESULT" 0 :str)
132 (get-var "RESULT" 0 :num)))
132 (get-var "RESULT" 0 :num)))
133
133
134 (defun call-loc (name args)
134 (defun call-loc (name args)
135 (setf name (chain name (to-upper-case)))
135 (setf name (chain name (to-upper-case)))
136 (with-frame
136 (with-frame
137 (with-call-args args
137 (with-call-args args
138 (funcall (getprop (root locs) name)))))
138 (funcall (getprop (root locs) name)))))
139
139
140 (defun call-act (title)
140 (defun call-act (title)
141 (with-frame
141 (with-frame
142 (funcall (getprop (root acts) title :act))))
142 (funcall (getprop (root acts) title :act))))
143
143
144 ;;; Text windows
144 ;;; Text windows
145
145
146 (defun key-to-id (key)
146 (defun key-to-id (key)
147 (case key
147 (case key
148 (:all "qsp")
148 (:all "qsp")
149 (:main "qsp-main")
149 (:main "qsp-main")
150 (:stat "qsp-stat")
150 (:stat "qsp-stat")
151 (:objs "qsp-objs")
151 (:objs "qsp-objs")
152 (:acts "qsp-acts")
152 (:acts "qsp-acts")
153 (:input "qsp-input")
153 (:input "qsp-input")
154 (:image "qsp-image")
154 (:image "qsp-image")
155 (:dropdown "qsp-dropdown")
155 (:dropdown "qsp-dropdown")
156 (t (report-error "Internal error!"))))
156 (t (report-error "Internal error!"))))
157
157
158 (defun get-frame (key)
158 (defun get-frame (key)
159 (by-id (key-to-id key)))
159 (by-id (key-to-id key)))
160
160
161 (defun add-text (key text)
161 (defun add-text (key text)
162 (append-id (key-to-id key) text))
162 (append-id (key-to-id key) text))
163
163
164 (defun get-text (key)
164 (defun get-text (key)
165 (get-id (key-to-id key)))
165 (get-id (key-to-id key)))
166
166
167 (defun clear-text (key)
167 (defun clear-text (key)
168 (clear-id (key-to-id key)))
168 (clear-id (key-to-id key)))
169
169
170 (defun enable-frame (key enable)
170 (defun enable-frame (key enable)
171 (let ((obj (get-frame key)))
171 (let ((obj (get-frame key)))
172 (setf (@ obj style display) (if enable "block" "none"))
172 (setf (@ obj style display) (if enable "block" "none"))
173 (void)))
173 (void)))
174
174
175 ;;; Actions
175 ;;; Actions
176
176
177 (defun add-act (title img act)
177 (defun add-act (title img act)
178 (setf (getprop (root acts) title)
178 (setf (getprop (root acts) title)
179 (create :title title :img img :act act :selected nil))
179 (create :title title :img img :act act :selected nil))
180 (update-acts))
180 (update-acts))
181
181
182 (defun del-act (title)
182 (defun del-act (title)
183 (delete (getprop (root acts) title))
183 (delete (getprop (root acts) title))
184 (update-acts))
184 (update-acts))
185
185
186 (defun clear-act ()
186 (defun clear-act ()
187 (setf (root acts) (create))
187 (setf (root acts) (create))
188 (update-acts))
188 (update-acts))
189
189
190 (defun update-acts ()
190 (defun update-acts ()
191 (clear-id "qsp-acts")
191 (clear-id "qsp-acts")
192 (let ((elt (by-id "qsp-acts")))
192 (let ((elt (by-id "qsp-acts")))
193 (for-in (title (root acts))
193 (for-in (title (root acts))
194 (let ((obj (getprop (root acts) title)))
194 (let ((obj (getprop (root acts) title)))
195 (incf (inner-html elt) (make-act-html title (getprop obj :img)))))))
195 (incf (inner-html elt) (make-act-html title (getprop obj :img)))))))
196
196
197 (defun select-act (title)
197 (defun select-act (title)
198 (loop :for (k v) :of (root acts)
198 (loop :for (k v) :of (root acts)
199 (setf (getprop v :selected) nil))
199 :do (setf (getprop v :selected) nil))
200 (setf (getprop (root acts) title :selected) t)
200 (setf (getprop (root acts) title :selected) t)
201 (call-serv-loc "ONACTSEL"))
201 (call-serv-loc "ONACTSEL"))
202
202
203 ;;; "Syntax"
203 ;;; "Syntax"
204
204
205 (defun qspfor (name index from to step body)
205 (defun qspfor (name index from to step body)
206 (for ((i from))
206 (for ((i from))
207 ((< i to))
207 ((< i to))
208 ((incf i step))
208 ((incf i step))
209 (set-var name index :num i)
209 (set-var name index :num i)
210 (unless (funcall body)
210 (unless (funcall body)
211 (return-from qspfor))))
211 (return-from qspfor))))
212
212
213 ;;; Variable class
213 ;;; Variable class
214
214
215 (defun *var (name)
215 (defun *var (name)
216 ;; From strings to numbers
216 ;; From strings to numbers
217 (setf (@ this :indexes) (create))
217 (setf (@ this :indexes) (create))
218 ;; From numbers to {num: 0, str: ""} objects
218 ;; From numbers to {num: 0, str: ""} objects
219 (setf (@ this :values) (list))
219 (setf (@ this :values) (list))
220 (void))
220 (void))
221
221
222 (defun new-value ()
222 (defun new-value ()
223 (create :num 0 :str ""))
223 (create :num 0 :str ""))
224
224
225 (setf (@ *var prototype index-num)
225 (setf (@ *var prototype index-num)
226 (lambda (index)
226 (lambda (index)
227 (let ((num-index
227 (let ((num-index
228 (if (stringp index)
228 (if (stringp index)
229 (if (in index (@ this :indexes))
229 (if (in index (@ this :indexes))
230 (getprop (@ this :indexes) index)
230 (getprop (@ this :indexes) index)
231 (let ((n (length (@ this :values))))
231 (let ((n (length (@ this :values))))
232 (setf (getprop (@ this :indexes) index) n)
232 (setf (getprop (@ this :indexes) index) n)
233 n))
233 n))
234 index)))
234 index)))
235 (unless (in num-index (@ this :values))
235 (unless (in num-index (@ this :values))
236 (setf (elt (@ this :values) num-index) (new-value)))
236 (setf (elt (@ this :values) num-index) (new-value)))
237 num-index)))
237 num-index)))
238
238
239 (setf (@ *var prototype get)
239 (setf (@ *var prototype get)
240 (lambda (index slot)
240 (lambda (index slot)
241 (unless (or index (= 0 index))
241 (unless (or index (= 0 index))
242 (setf index (1- (length (@ this :values)))))
242 (setf index (1- (length (@ this :values)))))
243 (getprop (@ this :values) (chain this (index-num index)) slot)))
243 (getprop (@ this :values) (chain this (index-num index)) slot)))
244
244
245 (setf (@ *var prototype set)
245 (setf (@ *var prototype set)
246 (lambda (index slot value)
246 (lambda (index slot value)
247 (unless (or index (= 0 index))
247 (unless (or index (= 0 index))
248 (setf index (length (@ this :values))))
248 (setf index (length (@ this :values))))
249 (case slot
249 (case slot
250 (:num (setf value (chain *number (parse-int value))))
250 (:num (setf value (chain *number (parse-int value))))
251 (:str (setf value (chain value (to-string)))))
251 (:str (setf value (chain value (to-string)))))
252 (setf (getprop (@ this :values)
252 (setf (getprop (@ this :values)
253 (chain this (index-num index))
253 (chain this (index-num index))
254 slot) value)
254 slot) value)
255 (void)))
255 (void)))
256
256
257 (setf (@ *var prototype kill)
257 (setf (@ *var prototype kill)
258 (lambda (index)
258 (lambda (index)
259 (setf (elt (@ this :values) (chain this (index-num index)))
259 (setf (elt (@ this :values) (chain this (index-num index)))
260 (new-value))
260 (new-value))
261 (delete (getprop 'this :indexes index))))
261 (delete (getprop 'this :indexes index))))
262
262
263 ;;; Variables
263 ;;; Variables
264
264
265 (defun var-real-name (name)
265 (defun var-real-name (name)
266 (if (= (@ name 0) #\$)
266 (if (= (@ name 0) #\$)
267 (values (chain name (substr 1)) :str)
267 (values (chain name (substr 1)) :str)
268 (values name :num)))
268 (values name :num)))
269
269
270 (defun ensure-var (name)
270 (defun ensure-var (name)
271 (setf name (chain name (to-upper-case)))
271 (setf name (chain name (to-upper-case)))
272 (let ((store (var-ref name)))
272 (let ((store (var-ref name)))
273 (unless store
273 (unless store
274 (setf store (new (*var name)))
274 (setf store (new (*var name)))
275 (setf (getprop (root vars) name) store))
275 (setf (getprop (root vars) name) store))
276 store))
276 store))
277
277
278 (defun var-ref (name)
278 (defun var-ref (name)
279 (let ((local-store (current-local-frame)))
279 (let ((local-store (current-local-frame)))
280 (cond ((and local-store (in name local-store))
280 (cond ((and local-store (in name local-store))
281 (getprop local-store name))
281 (getprop local-store name))
282 ((in name (root vars))
282 ((in name (root vars))
283 (getprop (root vars) name))
283 (getprop (root vars) name))
284 (t nil))))
284 (t nil))))
285
285
286 (defun get-var (name index slot)
286 (defun get-var (name index slot)
287 (chain (ensure-var name) (get index slot)))
287 (chain (ensure-var name) (get index slot)))
288
288
289 (defun set-var (name index slot value)
289 (defun set-var (name index slot value)
290 (chain (ensure-var name) (set index slot value))
290 (chain (ensure-var name) (set index slot value))
291 (let ((serv-var (getprop serv-vars name)))
291 (let ((serv-var (getprop serv-vars name)))
292 (when serv-var
292 (when serv-var
293 (funcall (@ serv-var :func)
293 (funcall (@ serv-var :body)
294 (get-var name index (@ serv-var :slot))
294 (get-var name index (@ serv-var :slot))
295 index)))
295 index)))
296 (void))
296 (void))
297
297
298 (defun get-array (name)
298 (defun get-array (name)
299 (setf name (chain name (to-upper-case)))
299 (setf name (chain name (to-upper-case)))
300 (ensure-var name))
300 (ensure-var name))
301
301
302 (defun set-array (name value)
302 (defun set-array (name value)
303 (setf name (chain name (to-upper-case)))
303 (setf name (chain name (to-upper-case)))
304 (let ((store (ensure-var name)))
304 (let ((store (ensure-var name)))
305 (setf (@ store :values) (@ value :values))
305 (setf (@ store :values) (@ value :values))
306 (setf (@ store :indexes) (@ value :indexes)))
306 (setf (@ store :indexes) (@ value :indexes)))
307 (void))
307 (void))
308
308
309 (defun kill-var (name &optional index)
309 (defun kill-var (name &optional index)
310 (setf name (chain name (to-upper-case)))
310 (setf name (chain name (to-upper-case)))
311 (if (and index (not (= 0 index)))
311 (if (and index (not (= 0 index)))
312 (chain (getprop (root vars) name) (kill index))
312 (chain (getprop (root vars) name) (kill index))
313 (delete (getprop (root vars) name)))
313 (delete (getprop (root vars) name)))
314 (void))
314 (void))
315
315
316 (defun array-size (name)
316 (defun array-size (name)
317 (@ (var-ref name) :values length))
317 (@ (var-ref name) :values length))
318
318
319 ;;; Locals
319 ;;; Locals
320
320
321 (defun push-local-frame ()
321 (defun push-local-frame ()
322 (chain (root locals) (push (create)))
322 (chain (root locals) (push (create)))
323 (void))
323 (void))
324
324
325 (defun pop-local-frame ()
325 (defun pop-local-frame ()
326 (chain (root locals) (pop))
326 (chain (root locals) (pop))
327 (void))
327 (void))
328
328
329 (defun current-local-frame ()
329 (defun current-local-frame ()
330 (elt (root locals) (1- (length (root locals)))))
330 (elt (root locals) (1- (length (root locals)))))
331
331
332 (defun new-local (name)
332 (defun new-local (name)
333 (let ((frame (current-local-frame)))
333 (let ((frame (current-local-frame)))
334 (unless (in name frame)
334 (unless (in name frame)
335 (setf (getprop frame name) (create)))
335 (setf (getprop frame name) (create)))
336 (void)))
336 (void)))
337
337
338 ;;; Objects
338 ;;; Objects
339
339
340 (defun select-obj (title img)
340 (defun select-obj (title img)
341 (loop :for (k v) :of (root objs)
341 (loop :for (k v) :of (root objs)
342 (setf (getprop v :selected) nil))
342 :do (setf (getprop v :selected) nil))
343 (setf (getprop (root objs) title :selected) t)
343 (setf (getprop (root objs) title :selected) t)
344 (call-serv-loc "ONOBJSEL" title img))
344 (call-serv-loc "ONOBJSEL" title img))
345
345
346 (defun update-objs ()
346 (defun update-objs ()
347 (let ((elt (by-id "qsp-objs")))
347 (let ((elt (by-id "qsp-objs")))
348 (setf (inner-html elt) "<ul>")
348 (setf (inner-html elt) "<ul>")
349 (loop :for obj :in (root objs)
349 (loop :for (name obj) :of (root objs)
350 :do (incf (inner-html elt)
350 :do (incf (inner-html elt)
351 (make-obj obj)))
351 (make-obj name (@ obj :img) (@ obj :selected))))
352 (incf (inner-html elt) "</ul>")))
352 (incf (inner-html elt) "</ul>")))
353
353
354 ;;; Menu
354 ;;; Menu
355
355
356 (defun open-menu (menu-data)
356 (defun open-menu (menu-data)
357 (let ((elt (get-frame :dropdown))
357 (let ((elt (get-frame :dropdown))
358 (i 0))
358 (i 0))
359 (loop :for item :in menu-data
359 (loop :for item :in menu-data
360 :do (incf i)
360 :do (incf i)
361 :do (incf (inner-html elt)
361 :do (incf (inner-html elt)
362 (if (eq item :delimiter)
362 (if (eq item :delimiter)
363 (make-menu-delimiter i)
363 (make-menu-delimiter i)
364 (make-menu-item-html i
364 (make-menu-item-html i
365 (@ item :text)
365 (@ item :text)
366 (@ item :icon)
366 (@ item :icon)
367 (@ item :loc)))))
367 (@ item :loc)))))
368 (let ((mouse (@ window mouse)))
368 (let ((mouse (@ window mouse)))
369 (setf (@ elt style left) (+ (elt mouse 0) "px"))
369 (setf (@ elt style left) (+ (elt mouse 0) "px"))
370 (setf (@ elt style top) (+ (elt mouse 1) "px"))
370 (setf (@ elt style top) (+ (elt mouse 1) "px"))
371 ;; Make sure it's inside the viewport
371 ;; Make sure it's inside the viewport
372 (when (> (@ document body inner-width)
372 (when (> (@ document body inner-width)
373 (+ (elt mouse 0) (@ elt inner-width)))
373 (+ (elt mouse 0) (@ elt inner-width)))
374 (incf (@ elt style left) (@ elt inner-width)))
374 (incf (@ elt style left) (@ elt inner-width)))
375 (when (> (@ document body inner-height)
375 (when (> (@ document body inner-height)
376 (+ (elt mouse 0) (@ elt inner-height)))
376 (+ (elt mouse 0) (@ elt inner-height)))
377 (incf (@ elt style top) (@ elt inner-height))))
377 (incf (@ elt style top) (@ elt inner-height))))
378 (setf (@ elt style display) "block")))
378 (setf (@ elt style display) "block")))
379
379
380 (defun finish-menu (loc)
380 (defun finish-menu (loc)
381 (when (root menu-resume)
381 (when (root menu-resume)
382 (let ((elt (get-frame :dropdown)))
382 (let ((elt (get-frame :dropdown)))
383 (setf (inner-html elt) "")
383 (setf (inner-html elt) "")
384 (setf (@ elt style display) "none")
384 (setf (@ elt style display) "none")
385 (funcall (root menu-resume))
385 (funcall (root menu-resume))
386 (setf (root menu-resume) nil))
386 (setf (root menu-resume) nil))
387 (when loc
387 (when loc
388 (call-loc loc)))
388 (call-loc loc)))
389 (void))
389 (void))
390
390
391 (defun menu (menu-data)
391 (defun menu (menu-data)
392 (with-sleep (resume)
392 (with-sleep (resume)
393 (open-menu menu-data)
393 (open-menu menu-data)
394 (setf (root menu-resume) resume))
394 (setf (root menu-resume) resume))
395 (void))
395 (void))
396
396
397 ;;; Content
397 ;;; Content
398
398
399 (defun clean-audio ()
399 (defun clean-audio ()
400 (loop :for k :in (chain *object (keys (root playing)))
400 (loop :for k :in (chain *object (keys (root playing)))
401 :for v := (getprop (root playing) k)
401 :for v := (getprop (root playing) k)
402 :do (when (@ v ended)
402 :do (when (@ v ended)
403 (delete (@ (root playing) k)))))
403 (delete (@ (root playing) k)))))
404
404
405 (defun show-image (path)
405 (defun show-image (path)
406 (let ((img (get-frame :image)))
406 (let ((img (get-frame :image)))
407 (cond (path
407 (cond (path
408 (setf (@ img src) path)
408 (setf (@ img src) path)
409 (setf (@ img style display) "flex"))
409 (setf (@ img style display) "flex"))
410 (t
410 (t
411 (setf (@ img src) "")
411 (setf (@ img src) "")
412 (setf (@ img style display) "hidden")))))
412 (setf (@ img style display) "hidden")))))
413
413
414 (defun rgb-string (rgb)
414 (defun rgb-string (rgb)
415 (let ((red (rgb >> 16))
415 (let ((red (ps::>> rgb 16))
416 (green (& (rgb >> 8) 255))
416 (green (logand (ps::>> rgb 8) 255))
417 (blue (& rgb 255)))
417 (blue (logand rgb 255)))
418 (flet ((rgb-to-hex (comp)
418 (flet ((rgb-to-hex (comp)
419 (let ((hex (chain (*number comp) (to-string 16))))
419 (let ((hex (chain (*number comp) (to-string 16))))
420 (if (< (length hex) 2)
420 (if (< (length hex) 2)
421 (+ "0" hex)
421 (+ "0" hex)
422 hex))))
422 hex))))
423 (+ "#" (rgb-to-hex red) (rgb-to-hex green) (rgb-to-hex red)))))
423 (+ "#" (rgb-to-hex red) (rgb-to-hex green) (rgb-to-hex red)))))
424
424
425 ;;; Saves
425 ;;; Saves
426
426
427 (defun opengame ()
427 (defun opengame ()
428 (let ((element (chain document (create-element :input))))
428 (let ((element (chain document (create-element :input))))
429 (chain element (set-attribute :type :file))
429 (chain element (set-attribute :type :file))
430 (chain element (set-attribute :id :qsp-opengame))
430 (chain element (set-attribute :id :qsp-opengame))
431 (chain element (set-attribute :tabindex -1))
431 (chain element (set-attribute :tabindex -1))
432 (chain element (set-attribute "aria-hidden" t))
432 (chain element (set-attribute "aria-hidden" t))
433 (setf (@ element style display) :block)
433 (setf (@ element style display) :block)
434 (setf (@ element style visibility) :hidden)
434 (setf (@ element style visibility) :hidden)
435 (setf (@ element style position) :fixed)
435 (setf (@ element style position) :fixed)
436 (setf (@ element onchange)
436 (setf (@ element onchange)
437 (lambda (event)
437 (lambda (event)
438 (let* ((file (@ event target files 0))
438 (let* ((file (@ event target files 0))
439 (reader (new (*file-reader))))
439 (reader (new (*file-reader))))
440 (setf (@ reader onload)
440 (setf (@ reader onload)
441 (lambda (ev)
441 (lambda (ev)
442 (block nil
442 (block nil
443 (let ((target (@ ev current-target)))
443 (let ((target (@ ev current-target)))
444 (unless (@ target result)
444 (unless (@ target result)
445 (return))
445 (return))
446 (base64-to-state (@ target result))
446 (base64-to-state (@ target result))
447 (unstash-state)))))
447 (unstash-state)))))
448 (chain reader (read-as-text file)))))
448 (chain reader (read-as-text file)))))
449 (chain document body (append-child element))
449 (chain document body (append-child element))
450 (chain element (click))
450 (chain element (click))
451 (chain document body (remove-child element))))
451 (chain document body (remove-child element))))
452
452
453 (defun savegame ()
453 (defun savegame ()
454 (let ((element (chain document (create-element :a))))
454 (let ((element (chain document (create-element :a))))
455 (chain element (set-attribute :href (+ "data:text/plain;charset=utf-8," (state-to-base64))))
455 (chain element (set-attribute :href (+ "data:text/plain;charset=utf-8," (state-to-base64))))
456 (chain element (set-attribute :download "savegame.sav"))
456 (chain element (set-attribute :download "savegame.sav"))
457 (setf (@ element style display) :none)
457 (setf (@ element style display) :none)
458 (chain document body (append-child element))
458 (chain document body (append-child element))
459 (chain element (click))
459 (chain element (click))
460 (chain document body (remove-child element))))
460 (chain document body (remove-child element))))
461
461
462 (defun stash-state (args)
462 (defun stash-state (args)
463 (call-serv-loc "ONGSAVE")
463 (call-serv-loc "ONGSAVE")
464 (setf (root state-stash)
464 (setf (root state-stash)
465 (chain *j-s-o-n (stringify
465 (chain *j-s-o-n (stringify
466 (create :vars (root vars)
466 (create :vars (root vars)
467 :objs (root objs)
467 :objs (root objs)
468 :loc-args args
468 :loc-args args
469 :msecs (- (chain *date (now)) (root started-at))
469 :msecs (- (chain *date (now)) (root started-at))
470 :timer-interval (root timer-interval)
470 :timer-interval (root timer-interval)
471 :main-html (inner-html
471 :main-html (inner-html
472 (get-frame :main))
472 (get-frame :main))
473 :stat-html (inner-html
473 :stat-html (inner-html
474 (get-frame :stat))
474 (get-frame :stat))
475 :next-location (root current-location)))))
475 :next-location (root current-location)))))
476 (void))
476 (void))
477
477
478 (defun unstash-state ()
478 (defun unstash-state ()
479 (let ((data (chain *j-s-o-n (parse (root state-stash)))))
479 (let ((data (chain *j-s-o-n (parse (root state-stash)))))
480 (clear-act)
480 (clear-act)
481 (setf (root vars) (@ data :vars))
481 (setf (root vars) (@ data :vars))
482 (loop :for k :in (chain *object (keys (root vars)))
482 (loop :for k :in (chain *object (keys (root vars)))
483 :do (chain *object (set-prototype-of (getprop (root vars) k)
483 :do (chain *object (set-prototype-of (getprop (root vars) k)
484 (@ *var prototype))))
484 (@ *var prototype))))
485 (setf (root started-at) (- (chain *date (now)) (@ data :msecs)))
485 (setf (root started-at) (- (chain *date (now)) (@ data :msecs)))
486 (setf (root objs) (@ data :objs))
486 (setf (root objs) (@ data :objs))
487 (setf (root current-location) (@ data :next-location))
487 (setf (root current-location) (@ data :next-location))
488 (setf (inner-html (get-frame :main))
488 (setf (inner-html (get-frame :main))
489 (@ data :main-html))
489 (@ data :main-html))
490 (setf (inner-html (get-frame :stat))
490 (setf (inner-html (get-frame :stat))
491 (@ data :stat-html))
491 (@ data :stat-html))
492 (update-objs)
492 (update-objs)
493 (set-timer (@ data :timer-interval))
493 (set-timer (@ data :timer-interval))
494 (call-serv-loc "ONGLOAD")
494 (call-serv-loc "ONGLOAD")
495 (call-loc (root current-location) (@ data :loc-args))
495 (call-loc (root current-location) (@ data :loc-args))
496 (void)))
496 (void)))
497
497
498 (defun state-to-base64 ()
498 (defun state-to-base64 ()
499 (btoa (encode-u-r-i-component (root state-stash))))
499 (btoa (encode-u-r-i-component (root state-stash))))
500
500
501 (defun base64-to-state (data)
501 (defun base64-to-state (data)
502 (setf (root state-stash) (decode-u-r-i-component (atob data))))
502 (setf (root state-stash) (decode-u-r-i-component (atob data))))
503
503
504 ;;; Timers
504 ;;; Timers
505
505
506 (defun set-timer (interval)
506 (defun set-timer (interval)
507 (setf (root timer-interval) interval)
507 (setf (root timer-interval) interval)
508 (clear-interval (root timer-obj))
508 (clear-interval (root timer-obj))
509 (setf (root timer-obj)
509 (setf (root timer-obj)
510 (set-interval
510 (set-interval
511 (lambda ()
511 (lambda ()
512 (call-serv-loc "COUNTER"))
512 (call-serv-loc "COUNTER"))
513 interval)))
513 interval)))
514
514
515 ;;; Special variables
515 ;;; Special variables
516
516
517 (defvar serv-vars (create))
518
517 (define-serv-var backimage (:str path)
519 (define-serv-var backimage (:str path)
518 (setf (@ (get-frame :main) style background-image) path))
520 (setf (@ (get-frame :main) style background-image) path))
519
521
520 (define-serv-var bcolor (:num color)
522 (define-serv-var bcolor (:num color)
521 (setf (@ (get-frame :all) style background-color) (rgb-string color)))
523 (setf (@ (get-frame :all) style background-color) (rgb-string color)))
522
524
523 (define-serv-var fcolor (:num color)
525 (define-serv-var fcolor (:num color)
524 (setf (@ (get-frame :all) style color) (rgb-string color)))
526 (setf (@ (get-frame :all) style color) (rgb-string color)))
525
527
526 (define-serv-var lcolor (:num color)
528 (define-serv-var lcolor (:num color)
527 (setf (@ (get-frame :style) inner-text)
529 (setf (@ (get-frame :style) inner-text)
528 (+ "a { color: " (rgb-string color) ";}")))
530 (+ "a { color: " (rgb-string color) ";}")))
531
532 (define-serv-var fsize (:num size)
533 (setf (@ (get-frame :all) style font-size) size))
534
535 (define-serv-var fname (:str font-name)
536 (setf (@ (get-frame :all) style font-family) (+ font-name ",serif")))
@@ -1,168 +1,168 b''
1
1
2 (in-package sugar-qsp.lib)
2 (in-package sugar-qsp.lib)
3
3
4 ;;;; Macros implementing some intrinsics where it makes sense
4 ;;;; Macros implementing some intrinsics where it makes sense
5 ;;;; E.g. an equivalent JS function exists, or it's a direct API call
5 ;;;; E.g. an equivalent JS function exists, or it's a direct API call
6
6
7 ;;; 1loc
7 ;;; 1loc
8
8
9 ;;; 2var
9 ;;; 2var
10
10
11 (defpsmacro killvar (varname &optional index)
11 (defpsmacro killvar (varname &optional index)
12 `(api-call kill-var ,varname ,index))
12 `(api-call kill-var ,varname ,index))
13
13
14 (defpsmacro killall ()
14 (defpsmacro killall ()
15 `(api-call kill-all))
15 `(api-call kill-all))
16
16
17 ;;; 3expr
17 ;;; 3expr
18
18
19 (defpsmacro obj (name)
19 (defpsmacro obj (name)
20 `(funcall (root objs includes) ,name))
20 `(in ,name (root objs)))
21
21
22 (defpsmacro loc (name)
22 (defpsmacro loc (name)
23 `(funcall (root locs includes) ,name))
23 `(in ,name (root locs)))
24
24
25 (defpsmacro no (arg)
25 (defpsmacro no (arg)
26 `(- -1 ,arg))
26 `(- -1 ,arg))
27
27
28 ;;; 4code
28 ;;; 4code
29
29
30 (defpsmacro qspver ()
30 (defpsmacro qspver ()
31 "0.0.1")
31 "0.0.1")
32
32
33 (defpsmacro curloc ()
33 (defpsmacro curloc ()
34 `(root current-location))
34 `(root current-location))
35
35
36 (defpsmacro rnd ()
36 (defpsmacro rnd ()
37 `(funcall rand 1 1000))
37 `(funcall rand 1 1000))
38
38
39 (defpsmacro qspmax (&rest args)
39 (defpsmacro qspmax (&rest args)
40 (if (= 1 (length args))
40 (if (= 1 (length args))
41 `(*math.max.apply nil ,@args)
41 `(*math.max.apply nil ,@args)
42 `(*math.max ,@args)))
42 `(*math.max ,@args)))
43
43
44 (defpsmacro qspmin (&rest args)
44 (defpsmacro qspmin (&rest args)
45 (if (= 1 (length args))
45 (if (= 1 (length args))
46 `(*math.min.apply nil ,@args)
46 `(*math.min.apply nil ,@args)
47 `(*math.min ,@args)))
47 `(*math.min ,@args)))
48
48
49 ;;; 5arrays
49 ;;; 5arrays
50
50
51 (defpsmacro arrsize (name)
51 (defpsmacro arrsize (name)
52 `(api-call array-size ,name))
52 `(api-call array-size ,name))
53
53
54 ;;; 6str
54 ;;; 6str
55
55
56 (defpsmacro len (s)
56 (defpsmacro len (s)
57 `(length ,s))
57 `(length ,s))
58
58
59 (defpsmacro mid (s from &optional count)
59 (defpsmacro mid (s from &optional count)
60 `(chain ,s (substring ,from ,count)))
60 `(chain ,s (substring ,from ,count)))
61
61
62 (defpsmacro ucase (s)
62 (defpsmacro ucase (s)
63 `(chain ,s (to-upper-case)))
63 `(chain ,s (to-upper-case)))
64
64
65 (defpsmacro lcase (s)
65 (defpsmacro lcase (s)
66 `(chain ,s (to-lower-case)))
66 `(chain ,s (to-lower-case)))
67
67
68 (defpsmacro trim (s)
68 (defpsmacro trim (s)
69 `(chain ,s (trim)))
69 `(chain ,s (trim)))
70
70
71 (defpsmacro replace (s from to)
71 (defpsmacro replace (s from to)
72 `(chain ,s (replace ,from ,to)))
72 `(chain ,s (replace ,from ,to)))
73
73
74 (defpsmacro val (s)
74 (defpsmacro val (s)
75 `(parse-int ,s 10))
75 `(parse-int ,s 10))
76
76
77 (defpsmacro qspstr (n)
77 (defpsmacro qspstr (n)
78 `(chain ,n (to-string)))
78 `(chain ,n (to-string)))
79
79
80 ;;; 7if
80 ;;; 7if
81
81
82 ;;; 8sub
82 ;;; 8sub
83
83
84 ;;; 9loops
84 ;;; 9loops
85
85
86 ;; JUMP is in ps-macros.lisp (because it's a part of a huge kludge)
86 ;; JUMP is in ps-macros.lisp (because it's a part of a huge kludge)
87
87
88 (defpsmacro exit ()
88 (defpsmacro exit ()
89 `(return-from nil (values)))
89 `(return-from nil (values)))
90
90
91 ;;; 10dynamic
91 ;;; 10dynamic
92
92
93 ;;; 11main
93 ;;; 11main
94
94
95 (defpsmacro desc (s)
95 (defpsmacro desc (s)
96 (declare (ignore s))
96 (declare (ignore s))
97 "")
97 "")
98
98
99 ;;; 12stat
99 ;;; 12stat
100
100
101 (defpsmacro showstat (enable)
101 (defpsmacro showstat (enable)
102 `(api-call enable-frame :stat ,enable))
102 `(api-call enable-frame :stat ,enable))
103
103
104 ;;; 13diag
104 ;;; 13diag
105
105
106 (defpsmacro msg (text)
106 (defpsmacro msg (text)
107 `(alert ,text))
107 `(alert ,text))
108
108
109 ;;; 14act
109 ;;; 14act
110
110
111 (defpsmacro showacts (enable)
111 (defpsmacro showacts (enable)
112 `(api-call enable-frame :acts ,enable))
112 `(api-call enable-frame :acts ,enable))
113
113
114 (defpsmacro delact (name)
114 (defpsmacro delact (name)
115 `(api-call del-act ,name))
115 `(api-call del-act ,name))
116
116
117 (defpsmacro cla ()
117 (defpsmacro cla ()
118 `(api-call clear-act))
118 `(api-call clear-act))
119
119
120 ;;; 15objs
120 ;;; 15objs
121
121
122 (defpsmacro showobjs (enable)
122 (defpsmacro showobjs (enable)
123 `(api-call enable-frame :objs ,enable))
123 `(api-call enable-frame :objs ,enable))
124
124
125 (defpsmacro countobj ()
125 (defpsmacro countobj ()
126 `(length (root objs)))
126 `(length (root objs)))
127
127
128 (defpsmacro getobj (index)
128 (defpsmacro getobj (index)
129 `(or (elt (root objs) ,index) ""))
129 `(or (elt (root objs) ,index) ""))
130
130
131 ;;; 16menu
131 ;;; 16menu
132
132
133 ;;; 17sound
133 ;;; 17sound
134
134
135 (defpsmacro isplay (filename)
135 (defpsmacro isplay (filename)
136 `(funcall (root playing includes) ,filename))
136 `(funcall (root playing includes) ,filename))
137
137
138 ;;; 18img
138 ;;; 18img
139
139
140 (defpsmacro view (&optional path)
140 (defpsmacro view (&optional path)
141 `(api-call show-image ,path))
141 `(api-call show-image ,path))
142
142
143 ;;; 19input
143 ;;; 19input
144
144
145 (defpsmacro showinput (enable)
145 (defpsmacro showinput (enable)
146 `(api-call enable-frame :input ,enable))
146 `(api-call enable-frame :input ,enable))
147
147
148 ;;; 20time
148 ;;; 20time
149
149
150 (defpsmacro wait (msec)
150 (defpsmacro wait (msec)
151 `(await (api-call sleep ,msec)))
151 `(await (api-call sleep ,msec)))
152
152
153 (defpsmacro settimer (interval)
153 (defpsmacro settimer (interval)
154 `(api-call set-timer ,interval))
154 `(api-call set-timer ,interval))
155
155
156 ;;; 21local
156 ;;; 21local
157
157
158 ;;; 22for
158 ;;; 22for
159
159
160 ;;; misc
160 ;;; misc
161
161
162 (defpsmacro opengame (&optional filename)
162 (defpsmacro opengame (&optional filename)
163 (declare (ignore filename))
163 (declare (ignore filename))
164 `(api-call opengame))
164 `(api-call opengame))
165
165
166 (defpsmacro savegame (&optional filename)
166 (defpsmacro savegame (&optional filename)
167 (declare (ignore filename))
167 (declare (ignore filename))
168 `(api-call savegame))
168 `(api-call savegame))
@@ -1,41 +1,41 b''
1
1
2 (in-package sugar-qsp.js)
2 (in-package sugar-qsp.js)
3
3
4 ;;; Contains symbols from standard JS library to avoid obfuscating
4 ;;; Contains symbols from standard JS library to avoid obfuscating
5 ;;; and/or namespacing them
5 ;;; and/or namespacing them
6
6
7 (cl:defmacro syms (cl:&rest syms)
7 (cl:defmacro syms (cl:&rest syms)
8 `(cl:progn
8 `(cl:progn
9 ,@(cl:loop :for sym :in syms
9 ,@(cl:loop :for sym :in syms
10 :collect `(cl:export ',sym))))
10 :collect `(cl:export ',sym))))
11
11
12 (syms
12 (syms
13 ;; main
13 ;; main
14 window
14 window
15 *object assign
15 *object assign
16 now
16 now
17 onload
17 onload
18 keys includes
18 keys includes
19 has-own-property
19 has-own-property
20 ;; api
20 ;; api
21 document get-element-by-id
21 document get-element-by-id get-elements-by-tag-name
22 onclick onchange
22 onclick onchange
23 atob btoa split
23 atob btoa split
24 alert prompt
24 alert prompt
25 set-timeout set-interval clear-interval
25 set-timeout set-interval clear-interval
26 *promise *j-s-o-n
26 *promise *j-s-o-n
27 href parse match
27 href parse match
28 set-prototype-of
28 set-prototype-of
29 body append-child remove-child
29 body append-child remove-child
30 add ; remove (is already in COMMON-LISP)
30 add ; remove (is already in COMMON-LISP)
31 create-element set-attribute class-list
31 create-element set-attribute class-list
32 *file-reader read-as-text
32 *file-reader read-as-text
33 style display src
33 style display src
34 page-x page-y
34 page-x page-y
35 top left
35 top left
36 ;; lib
36 ;; lib
37 *number parse-int
37 *number parse-int
38 to-string to-upper-case concat
38 to-string to-upper-case concat
39 click target current-target files index-of result
39 click target current-target files index-of result
40 decode-u-r-i-component splice
40 decode-u-r-i-component splice
41 )
41 )
@@ -1,69 +1,74 b''
1
1
2 (in-package parenscript)
2 (in-package parenscript)
3
3
4 ;;; async/await
4 ;;; async/await
5
5
6 (defprinter ps-js::await (x)
6 (defprinter ps-js::await (x)
7 (psw (string-downcase "await "))
7 (psw (string-downcase "await "))
8 (print-op-argument 'ps-js::await x))
8 (print-op-argument 'ps-js::await x))
9
9
10 (define-trivial-special-ops await ps-js::await)
10 (define-trivial-special-ops await ps-js::await)
11
11
12 (define-statement-operator async-defun (name lambda-list &rest body)
12 (define-statement-operator async-defun (name lambda-list &rest body)
13 (multiple-value-bind (effective-args body-block docstring)
13 (multiple-value-bind (effective-args body-block docstring)
14 (compile-named-function-body name lambda-list body)
14 (compile-named-function-body name lambda-list body)
15 (list 'ps-js::async-defun name effective-args docstring body-block)))
15 (list 'ps-js::async-defun name effective-args docstring body-block)))
16
16
17 (defprinter ps-js::async-defun (name args docstring body-block)
17 (defprinter ps-js::async-defun (name args docstring body-block)
18 (when docstring (print-comment docstring))
18 (when docstring (print-comment docstring))
19 (psw "async ")
19 (psw "async ")
20 (print-fun-def name args body-block))
20 (print-fun-def name args body-block))
21
21
22 (define-expression-operator async-lambda (lambda-list &rest body)
22 (define-expression-operator async-lambda (lambda-list &rest body)
23 (multiple-value-bind (effective-args effective-body)
23 (multiple-value-bind (effective-args effective-body)
24 (parse-extended-function lambda-list body)
24 (parse-extended-function lambda-list body)
25 `(ps-js::async-lambda
25 `(ps-js::async-lambda
26 ,effective-args
26 ,effective-args
27 ,(let ((*function-block-names* ()))
27 ,(let ((*function-block-names* ()))
28 (compile-function-body effective-args effective-body)))))
28 (compile-function-body effective-args effective-body)))))
29
29
30 (defprinter ps-js::async-lambda (args body-block)
30 (defprinter ps-js::async-lambda (args body-block)
31 (psw "async ")
31 (psw "async ")
32 (print-fun-def nil args body-block))
32 (print-fun-def nil args body-block))
33
33
34 (cl:export 'await)
34 (cl:export 'await)
35 (cl:export 'async-defun)
35 (cl:export 'async-defun)
36 (cl:export 'async-lambda)
36 (cl:export 'async-lambda)
37
37
38 ;;; ES6
38 ;;; ES6
39
39
40 (define-expression-operator => (lambda-list &rest body)
40 (define-expression-operator => (lambda-list &rest body)
41 (unless (listp lambda-list)
41 (unless (listp lambda-list)
42 (setf lambda-list (list lambda-list)))
42 (setf lambda-list (list lambda-list)))
43 (multiple-value-bind (effective-args effective-body)
43 (multiple-value-bind (effective-args effective-body)
44 (parse-extended-function lambda-list body)
44 (parse-extended-function lambda-list body)
45 `(ps-js::=>
45 `(ps-js::=>
46 ,effective-args
46 ,effective-args
47 ,(let ((*function-block-names* ()))
47 ,(let ((*function-block-names* ()))
48 (compile-function-body effective-args effective-body)))))
48 (compile-function-body effective-args effective-body)))))
49
49
50 (defprinter ps-js::=> (args body)
50 (defprinter ps-js::=> (args body)
51 (unless (= 1 (length args))
51 (unless (= 1 (length args))
52 (psw "("))
52 (psw "("))
53 (loop for (arg . remaining) on args do
53 (loop for (arg . remaining) on args do
54 (psw (symbol-to-js-string arg)) (when remaining (psw ", ")))
54 (psw (symbol-to-js-string arg)) (when remaining (psw ", ")))
55 (unless (= 1 (length args))
55 (unless (= 1 (length args))
56 (psw ")"))
56 (psw ")"))
57 (psw " => ")
57 (psw " => ")
58 (ps-print body))
58 (ps-print body))
59
59
60 (cl:export '=>)
60 (cl:export '=>)
61
61
62 ;;; Actually return nothing (with no empty return)
62 ;;; Actually return nothing (with no empty return)
63 (defvar *old-return-result-of* (function return-result-of))
63 (defvar *old-return-result-of* (function return-result-of))
64
64
65 (defun return-result-of (tag form)
65 (defun return-result-of (tag form)
66 (if (equal form '(void))
66 (if (equal form '(void))
67 nil
67 nil
68 (funcall *old-return-result-of* tag form)))
68 (funcall *old-return-result-of* tag form)))
69 (export 'void)
69 (export 'void)
70
71 ;;; Bitwise stuff
72 ;; No idea why these are not exported
73 (export '<<)
74 (export '>>)
General Comments 0
You need to be logged in to leave comments. Login now