deel-local-cli 1.4.3 → 1.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +6 -3
- package/README.md +6 -3
- package/package.json +2 -2
- package/src/i18n/en.js +1 -0
- package/src/i18n/ko.js +1 -0
- package/src/repl.js +110 -5
- package/src/ui/inputbox.js +178 -5
- package/src/ui/motion.js +312 -5
- package/src/ui/office.js +431 -0
- package/src/ui/screen.js +319 -312
- package/src/ui/status.js +13 -2
- package/src/ui/wrap.js +47 -2
package/src/ui/motion.js
CHANGED
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
* 그림을 점자 코드로 직접 적으면 나중에 아무도 못 고친다. 그래서 눈에 보이는
|
|
29
29
|
* 대로 '#' 과 '.' 으로 적고, 켜질 때 한 번 점자로 바꾼다.
|
|
30
30
|
*/
|
|
31
|
+
import { 켜달라했나 as 사무실켜달라했나 } from './office.js';
|
|
31
32
|
|
|
32
33
|
// 점 번호와 자리. 점자는 이렇게 번호가 매겨져 있다 —
|
|
33
34
|
// 1 4
|
|
@@ -47,13 +48,18 @@ export const 가로 = 칸수 * 2; // 점 6개
|
|
|
47
48
|
export const 세로 = 4; // 점 4줄
|
|
48
49
|
|
|
49
50
|
/**
|
|
50
|
-
*
|
|
51
|
+
* 그림 한 장을 점자로. 격자를 벗어난 자리는 꺼진 것으로 본다.
|
|
52
|
+
*
|
|
53
|
+
* 폭을 받는 이유는 **테마마다 폭이 다르기** 때문이다. 기본 그림은 세 칸이면
|
|
54
|
+
* 충분한데(덩어리·막대·훑는 줄), 사람이나 짐승 모양은 세 칸에 넣으면 그냥
|
|
55
|
+
* 얼룩으로 보인다. 아래 테마들 참고.
|
|
51
56
|
*
|
|
52
57
|
* @param {string[]} 그림 '#'(켜짐)과 그 밖(꺼짐)으로 그린 4줄
|
|
58
|
+
* @param {number} 폭 점자 몇 칸으로 그릴지
|
|
53
59
|
*/
|
|
54
|
-
export function 점자로(
|
|
60
|
+
export function 점자로(그림, 폭 = 칸수) {
|
|
55
61
|
let out = '';
|
|
56
|
-
for (let 칸 = 0; 칸 <
|
|
62
|
+
for (let 칸 = 0; 칸 < 폭; 칸++) {
|
|
57
63
|
let v = 0;
|
|
58
64
|
for (let r = 0; r < 세로; r++) {
|
|
59
65
|
for (let cc = 0; cc < 2; cc++) {
|
|
@@ -179,9 +185,295 @@ export const 그림들 = {
|
|
|
179
185
|
|
|
180
186
|
// 켜질 때 한 번만 바꾼다. 90ms 마다 다시 만들 이유가 없다.
|
|
181
187
|
export const 틀 = Object.fromEntries(
|
|
182
|
-
Object.entries(그림들).map(([갈래, 장들]) => [갈래, 장들.map(점자로)]),
|
|
188
|
+
Object.entries(그림들).map(([갈래, 장들]) => [갈래, 장들.map((g) => 점자로(g, 칸수))]),
|
|
183
189
|
);
|
|
184
190
|
|
|
191
|
+
/*
|
|
192
|
+
* ── 테마 ────────────────────────────────────────────────────────────────
|
|
193
|
+
*
|
|
194
|
+
* 위의 기본 그림은 **무엇을 하는 중인지**를 말한다 — 훑는 줄, 차오르는 막대.
|
|
195
|
+
* 그것으로 충분하지만, 몇 분을 들여다보는 화면이라면 그 이상이어도 된다.
|
|
196
|
+
* 그래서 같은 자리에 다른 그림을 끼울 수 있게 열어 둔다.
|
|
197
|
+
*
|
|
198
|
+
* 새 테마는 아래 규칙만 지키면 된다. 검사(motion.test.js)가 전부 확인한다.
|
|
199
|
+
* · 갈래가 기본과 똑같이 있어야 한다 (working.js 의 문구와 짝이 맞아야 한다)
|
|
200
|
+
* · 한 갈래에 최소 두 장 — 안 움직이면 그림이 아니라 글자다
|
|
201
|
+
* · 갈래끼리 움직임이 겹치면 안 된다 — 겹치면 '뭘 하는지 보인다' 가 거짓말이 된다
|
|
202
|
+
* · 느긋이 제일 길어야 한다 — 오래 기다릴 때 빨리 깜빡이면 더 조급해진다
|
|
203
|
+
* · 모든 장이 그 테마의 폭·높이 격자에 딱 맞아야 한다
|
|
204
|
+
*
|
|
205
|
+
* ── 왜 폭이 테마마다 다른가 ─────────────────────────────────────────────
|
|
206
|
+
*
|
|
207
|
+
* 기본은 6×4(점자 세 칸)다. 덩어리와 막대는 그 안에서 충분히 읽힌다.
|
|
208
|
+
* 그런데 사람이나 짐승은 안 된다 — 팔다리가 붙을 자리가 없어서 그냥 얼룩이 된다.
|
|
209
|
+
* 그래서 아래 두 테마는 12×4(여섯 칸)를 쓴다. 상자는 폭을 재서 그리므로
|
|
210
|
+
* (inputbox 의 width(왼쪽)) 넓어져도 테두리는 안 어긋난다.
|
|
211
|
+
*
|
|
212
|
+
* 세로는 못 늘린다. 작업 표시가 글자 한 줄 안에 들어가야 하고, 두 줄로 만들면
|
|
213
|
+
* 상자 높이와 커서 셈이 통째로 달라진다. 그래서 **가로로 누운 옆모습**으로
|
|
214
|
+
* 그린다 — 세로로 선 정면 모습은 4점 안에서 절대 안 읽힌다.
|
|
215
|
+
*/
|
|
216
|
+
export const 넓은칸수 = 6; // 점자 여섯 칸
|
|
217
|
+
export const 넓은가로 = 넓은칸수 * 2; // 점 12개
|
|
218
|
+
|
|
219
|
+
/*
|
|
220
|
+
* 중세 기사 — 옆모습. 왼쪽에 몸이 서 있고 오른쪽에서 칼이 움직인다.
|
|
221
|
+
*
|
|
222
|
+
* 몸을 고정해 두고 칼만 옮기는 것이 요령이다. 둘 다 움직이면 12×4 안에서는
|
|
223
|
+
* 그냥 어지럽다. 사람 눈은 **바뀌는 자리**를 따라가므로, 바뀌는 것이 하나여야
|
|
224
|
+
* 그게 칼로 읽힌다.
|
|
225
|
+
*
|
|
226
|
+
* .##. 투구
|
|
227
|
+
* #### 머리·어깨
|
|
228
|
+
* #### 몸통과 방패
|
|
229
|
+
* #..# 다리
|
|
230
|
+
*/
|
|
231
|
+
const 기사그림들 = {
|
|
232
|
+
// 생각 — 칼을 세워 든 채 방패만 까딱인다. 아직 안 덤빈다.
|
|
233
|
+
생각: [
|
|
234
|
+
['.##....#....', '####...#....', '####........', '#..#........'],
|
|
235
|
+
['.##....#....', '####...#....', '#####.......', '#..#........'],
|
|
236
|
+
['.##....#....', '####...#....', '####........', '#..#........'],
|
|
237
|
+
['.##....#....', '####...#....', '###.........', '#..#........'],
|
|
238
|
+
],
|
|
239
|
+
|
|
240
|
+
// 읽기 — 방패를 앞으로 내밀고 한 칸씩 나아간다. 살피며 걷는 모양.
|
|
241
|
+
읽기: [
|
|
242
|
+
['.##.........', '####.##.....', '####.##.....', '#..#........'],
|
|
243
|
+
['.##.........', '####..##....', '####..##....', '.#.#........'],
|
|
244
|
+
['.##.........', '####...##...', '####...##...', '#..#........'],
|
|
245
|
+
['.##.........', '####..##....', '####..##....', '.#.#........'],
|
|
246
|
+
],
|
|
247
|
+
|
|
248
|
+
/*
|
|
249
|
+
* 쓰기 — 칼질. 이 테마의 본편이다.
|
|
250
|
+
*
|
|
251
|
+
* 위로 들었다가(0) 옆으로 후려서(1) 아래로 내리꽂고(2) 다시 든다(3).
|
|
252
|
+
* 네 장이라 한 바퀴 360ms — 실제로 휘두르는 속도로 보인다.
|
|
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
|
+
* 느긋 — **넘어진다.** 45초가 넘어가면 이 그림으로 갈린다.
|
|
312
|
+
*
|
|
313
|
+
* 오래 걸릴 때 진행 중인 척하면 곧 끝날 것처럼 보여서 오히려 답답하다.
|
|
314
|
+
* 그렇다고 가만히 있으면 멈춘 줄 안다. 그래서 기사가 지쳐 쓰러졌다가
|
|
315
|
+
* 다시 일어난다 — 오래 걸리는 중이라는 것을 숨기지 않으면서, 화면은 계속
|
|
316
|
+
* 살아 있다. 열 장이라 한 바퀴 0.9초로 제일 느긋하다.
|
|
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
|
+
const 동물그림들 = {
|
|
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
|
+
* 않으면서 화면은 살아 있다. 열 장이라 한 바퀴 0.9초.
|
|
425
|
+
*/
|
|
426
|
+
느긋: [
|
|
427
|
+
['.#..#.......', '.####.......', '######......', '.#..#.......'],
|
|
428
|
+
['..#.#.......', '..###.......', '.#####......', '..#.#.......'],
|
|
429
|
+
['............', '............', '.#####......', '#######.....'],
|
|
430
|
+
['............', '............', '.#####......', '#######.....'],
|
|
431
|
+
['............', '.....#......', '.#####......', '#######.....'],
|
|
432
|
+
['............', '....#.#.....', '.#####......', '#######.....'],
|
|
433
|
+
['............', '.....#......', '.#####......', '#######.....'],
|
|
434
|
+
['............', '............', '.#####......', '#######.....'],
|
|
435
|
+
['............', '............', '.######.....', '#######.....'],
|
|
436
|
+
['..#.#.......', '..###.......', '.#####......', '..#.#.......'],
|
|
437
|
+
],
|
|
438
|
+
};
|
|
439
|
+
|
|
440
|
+
/**
|
|
441
|
+
* 테마 하나. 이름 → { 칸수, 가로, 그림들, 틀 }.
|
|
442
|
+
*
|
|
443
|
+
* 기본은 위에서 이미 만들어 둔 것을 그대로 쓴다 — 다시 만들면 같은 것이
|
|
444
|
+
* 두 벌 생긴다.
|
|
445
|
+
*/
|
|
446
|
+
const 테마만들기 = (그림들, 폭) => ({
|
|
447
|
+
칸수: 폭,
|
|
448
|
+
가로: 폭 * 2,
|
|
449
|
+
그림들,
|
|
450
|
+
틀: Object.fromEntries(
|
|
451
|
+
Object.entries(그림들).map(([갈래, 장들]) => [갈래, 장들.map((g) => 점자로(g, 폭))]),
|
|
452
|
+
),
|
|
453
|
+
});
|
|
454
|
+
|
|
455
|
+
export const 테마들 = {
|
|
456
|
+
기본: { 칸수, 가로, 그림들, 틀 },
|
|
457
|
+
기사: 테마만들기(기사그림들, 넓은칸수),
|
|
458
|
+
동물: 테마만들기(동물그림들, 넓은칸수),
|
|
459
|
+
};
|
|
460
|
+
|
|
461
|
+
/**
|
|
462
|
+
* 지금 고른 테마.
|
|
463
|
+
*
|
|
464
|
+
* DEEL_MOTION=기사 · knight · 동물 · animal 로 고른다. 영어 이름도 받는 것은
|
|
465
|
+
* 한글을 못 치는 자리(CI 설정 파일·도커 환경변수)가 있기 때문이다.
|
|
466
|
+
* 모르는 이름이면 조용히 기본으로 간다 — 오타 하나로 프로그램이 안 뜨면 안 된다.
|
|
467
|
+
*/
|
|
468
|
+
const 이름표 = {
|
|
469
|
+
기사: '기사', knight: '기사', 동물: '동물', animal: '동물', animals: '동물',
|
|
470
|
+
기본: '기본', default: '기본', plain: '기본',
|
|
471
|
+
};
|
|
472
|
+
export const 테마이름 = () => 이름표[String(process.env.DEEL_MOTION ?? '').trim().toLowerCase()]
|
|
473
|
+
?? 이름표[String(process.env.DEEL_MOTION ?? '').trim()]
|
|
474
|
+
?? '기본';
|
|
475
|
+
export const 테마 = () => 테마들[테마이름()] ?? 테마들.기본;
|
|
476
|
+
|
|
185
477
|
/*
|
|
186
478
|
* 그림을 끄고 싶을 때.
|
|
187
479
|
*
|
|
@@ -207,6 +499,21 @@ const 한칸 = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '
|
|
|
207
499
|
export function 그림고르기(갈래, 틱 = 0) {
|
|
208
500
|
const n = Math.trunc(틱) || 0;
|
|
209
501
|
if (끔()) return 한칸[((n % 한칸.length) + 한칸.length) % 한칸.length];
|
|
210
|
-
|
|
502
|
+
/*
|
|
503
|
+
* 사무실을 켰으면 상자 안 그림은 조용한 것으로 돌아간다.
|
|
504
|
+
*
|
|
505
|
+
* 둘 다 같은 것을 말하기 때문이다 — 기사가 칼을 휘두르는 것도 '코드 쓰는 중',
|
|
506
|
+
* 사무실 사람이 자판을 두드리는 것도 '코드 쓰는 중'. 바로 위아래에 붙여 놓고
|
|
507
|
+
* 같은 소리를 두 번 하면 시끄럽기만 하다. 게다가 그리는 방식이 달라서
|
|
508
|
+
* (점자 단색 · 반칸 256색) 나란히 두면 따로 논다.
|
|
509
|
+
*
|
|
510
|
+
* 켜 달라고 했나만 본다. 화면이 낮아 사무실이 실제로 안 뜨는 경우까지 여기서
|
|
511
|
+
* 따지면, 창 크기를 바꿀 때마다 상자 안 그림이 바뀌어 규칙이 안 보인다.
|
|
512
|
+
*/
|
|
513
|
+
if (사무실켜달라했나()) return 한칸[((n % 한칸.length) + 한칸.length) % 한칸.length];
|
|
514
|
+
// 테마는 매번 읽는다. 켤 때 한 번 굳혀 두면 검사가 테마를 바꿔 가며
|
|
515
|
+
// 못 잰다 — 90ms 마다 객체 하나 집는 값은 화면에 안 잡힌다.
|
|
516
|
+
const 이틀 = 테마().틀;
|
|
517
|
+
const 장들 = 이틀[갈래] ?? 이틀.기본;
|
|
211
518
|
return 장들[((n % 장들.length) + 장들.length) % 장들.length];
|
|
212
519
|
}
|