hikkaku 0.1.0
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/package.json +25 -0
- package/src/blocks/control.ts +169 -0
- package/src/blocks/data.ts +203 -0
- package/src/blocks/events.ts +116 -0
- package/src/blocks/index.ts +9 -0
- package/src/blocks/looks.ts +189 -0
- package/src/blocks/motion.ts +146 -0
- package/src/blocks/operator.ts +219 -0
- package/src/blocks/procedures.ts +208 -0
- package/src/blocks/sensing.ts +129 -0
- package/src/blocks/sound.ts +77 -0
- package/src/client/fiber.ts +110 -0
- package/src/client/index.ts +26 -0
- package/src/client/types.ts +7 -0
- package/src/compiler/block-helper.ts +49 -0
- package/src/compiler/composer.ts +177 -0
- package/src/compiler/index.ts +6 -0
- package/src/compiler/project.ts +138 -0
- package/src/compiler/types.ts +37 -0
- package/src/index.ts +5 -0
- package/src/utils/assets.ts +4 -0
- package/src/vite/env.ts +46 -0
- package/src/vite/index.ts +77 -0
- package/tsconfig.json +3 -0
- package/tsdown.config.ts +0 -0
package/package.json
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "hikkaku",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"private": false,
|
|
6
|
+
"module": "src/index.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": "./src/index.ts",
|
|
9
|
+
"./client": "./src/client/index.ts",
|
|
10
|
+
"./vite": "./src/vite/index.ts",
|
|
11
|
+
"./*": "./src/*",
|
|
12
|
+
"./blocks": "./src/blocks/index.ts"
|
|
13
|
+
},
|
|
14
|
+
"scripts": {},
|
|
15
|
+
"devDependencies": {
|
|
16
|
+
"@types/bun": "latest"
|
|
17
|
+
},
|
|
18
|
+
"peerDependencies": {
|
|
19
|
+
"typescript": "^5"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"vite": "8.0.0-beta.8",
|
|
23
|
+
"@pnsk-lab/sb3-types": "npm:@jsr/pnsk-lab__sb3-types@0.1.8"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { fromPrimitiveSource } from '../compiler/block-helper'
|
|
2
|
+
import { block, substack, valueBlock } from '../compiler/composer'
|
|
3
|
+
import type { PrimitiveSource, VariableReference } from '../compiler/types'
|
|
4
|
+
|
|
5
|
+
export type StopOption =
|
|
6
|
+
| 'all'
|
|
7
|
+
| 'this script'
|
|
8
|
+
| 'other scripts in sprite'
|
|
9
|
+
| 'other scripts in stage'
|
|
10
|
+
|
|
11
|
+
export const repeat = (times: PrimitiveSource<number>, handler: () => void) => {
|
|
12
|
+
const substackId = substack(handler)
|
|
13
|
+
return block('control_repeat', {
|
|
14
|
+
inputs: {
|
|
15
|
+
TIMES: fromPrimitiveSource(times),
|
|
16
|
+
...(substackId ? { SUBSTACK: [2, substackId] } : {}),
|
|
17
|
+
},
|
|
18
|
+
})
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export const repeatUntil = (
|
|
22
|
+
condition: PrimitiveSource<boolean>,
|
|
23
|
+
handler: () => void,
|
|
24
|
+
) => {
|
|
25
|
+
const substackId = substack(handler)
|
|
26
|
+
return block('control_repeat_until', {
|
|
27
|
+
inputs: {
|
|
28
|
+
CONDITION: fromPrimitiveSource(condition),
|
|
29
|
+
...(substackId ? { SUBSTACK: [2, substackId] } : {}),
|
|
30
|
+
},
|
|
31
|
+
})
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export const repeatWhile = (
|
|
35
|
+
condition: PrimitiveSource<boolean>,
|
|
36
|
+
handler: () => void,
|
|
37
|
+
) => {
|
|
38
|
+
const substackId = substack(handler)
|
|
39
|
+
return block('control_while', {
|
|
40
|
+
inputs: {
|
|
41
|
+
CONDITION: fromPrimitiveSource(condition),
|
|
42
|
+
...(substackId ? { SUBSTACK: [2, substackId] } : {}),
|
|
43
|
+
},
|
|
44
|
+
})
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export const forEach = (
|
|
48
|
+
variable: VariableReference,
|
|
49
|
+
value: PrimitiveSource<number>,
|
|
50
|
+
handler: () => void,
|
|
51
|
+
) => {
|
|
52
|
+
const substackId = substack(handler)
|
|
53
|
+
return block('control_for_each', {
|
|
54
|
+
inputs: {
|
|
55
|
+
VALUE: fromPrimitiveSource(value),
|
|
56
|
+
...(substackId ? { SUBSTACK: [2, substackId] } : {}),
|
|
57
|
+
},
|
|
58
|
+
fields: {
|
|
59
|
+
VARIABLE: [variable.name, variable.id],
|
|
60
|
+
},
|
|
61
|
+
})
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export const forever = (handler: () => void) => {
|
|
65
|
+
const substackId = substack(handler)
|
|
66
|
+
return block('control_forever', {
|
|
67
|
+
inputs: substackId
|
|
68
|
+
? {
|
|
69
|
+
SUBSTACK: [2, substackId],
|
|
70
|
+
}
|
|
71
|
+
: {},
|
|
72
|
+
})
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export const wait = (seconds: PrimitiveSource<number>) => {
|
|
76
|
+
return block('control_wait', {
|
|
77
|
+
inputs: {
|
|
78
|
+
DURATION: fromPrimitiveSource(seconds),
|
|
79
|
+
},
|
|
80
|
+
})
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export const waitUntil = (condition: PrimitiveSource<boolean>) => {
|
|
84
|
+
return block('control_wait_until', {
|
|
85
|
+
inputs: {
|
|
86
|
+
CONDITION: fromPrimitiveSource(condition),
|
|
87
|
+
},
|
|
88
|
+
})
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export const ifThen = (
|
|
92
|
+
condition: PrimitiveSource<boolean>,
|
|
93
|
+
handler: () => void,
|
|
94
|
+
) => {
|
|
95
|
+
const substackId = substack(handler)
|
|
96
|
+
return block('control_if', {
|
|
97
|
+
inputs: {
|
|
98
|
+
CONDITION: fromPrimitiveSource(condition),
|
|
99
|
+
...(substackId ? { SUBSTACK: [2, substackId] } : {}),
|
|
100
|
+
},
|
|
101
|
+
})
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export const ifElse = (
|
|
105
|
+
condition: PrimitiveSource<boolean>,
|
|
106
|
+
thenHandler: () => void,
|
|
107
|
+
elseHandler: () => void,
|
|
108
|
+
) => {
|
|
109
|
+
const thenSubstackId = substack(thenHandler)
|
|
110
|
+
const elseSubstackId = substack(elseHandler)
|
|
111
|
+
return block('control_if_else', {
|
|
112
|
+
inputs: {
|
|
113
|
+
CONDITION: fromPrimitiveSource(condition),
|
|
114
|
+
...(thenSubstackId ? { SUBSTACK: [2, thenSubstackId] } : {}),
|
|
115
|
+
...(elseSubstackId ? { SUBSTACK2: [2, elseSubstackId] } : {}),
|
|
116
|
+
},
|
|
117
|
+
})
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export const stop = (option: StopOption) => {
|
|
121
|
+
return block('control_stop', {
|
|
122
|
+
fields: {
|
|
123
|
+
STOP_OPTION: [option, null],
|
|
124
|
+
},
|
|
125
|
+
})
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export const createClone = (target: string) => {
|
|
129
|
+
return block('control_create_clone_of', {
|
|
130
|
+
inputs: {
|
|
131
|
+
CLONE_OPTION: fromPrimitiveSource(target),
|
|
132
|
+
},
|
|
133
|
+
})
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export const deleteThisClone = () => {
|
|
137
|
+
return block('control_delete_this_clone', {})
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export const getCounter = () => {
|
|
141
|
+
return valueBlock('control_get_counter', {})
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export const incrCounter = () => {
|
|
145
|
+
return block('control_incr_counter', {})
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export const clearCounter = () => {
|
|
149
|
+
return block('control_clear_counter', {})
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export const controlStartAsClone = (stack?: () => void) => {
|
|
153
|
+
const res = block('control_start_as_clone', {
|
|
154
|
+
topLevel: true,
|
|
155
|
+
})
|
|
156
|
+
stack?.()
|
|
157
|
+
return res
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export const allAtOnce = (handler: () => void) => {
|
|
161
|
+
const substackId = substack(handler)
|
|
162
|
+
return block('control_all_at_once', {
|
|
163
|
+
inputs: substackId
|
|
164
|
+
? {
|
|
165
|
+
SUBSTACK: [2, substackId],
|
|
166
|
+
}
|
|
167
|
+
: {},
|
|
168
|
+
})
|
|
169
|
+
}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import type { Fields } from '@pnsk-lab/sb3-types'
|
|
2
|
+
import { fromPrimitiveSource } from '../compiler/block-helper'
|
|
3
|
+
import { block, valueBlock } from '../compiler/composer'
|
|
4
|
+
import type {
|
|
5
|
+
ListReference,
|
|
6
|
+
PrimitiveSource,
|
|
7
|
+
VariableReference,
|
|
8
|
+
} from '../compiler/types'
|
|
9
|
+
|
|
10
|
+
export type ListIndex = PrimitiveSource<number | string>
|
|
11
|
+
|
|
12
|
+
const toField = (field: VariableReference | ListReference): Fields => [
|
|
13
|
+
field.name,
|
|
14
|
+
field.id,
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
export const getVariable = (variable: VariableReference) => {
|
|
18
|
+
return valueBlock('data_variable', {
|
|
19
|
+
fields: {
|
|
20
|
+
VARIABLE: toField(variable),
|
|
21
|
+
},
|
|
22
|
+
})
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export const setVariableTo = (
|
|
26
|
+
variable: VariableReference,
|
|
27
|
+
value: PrimitiveSource<number | string>,
|
|
28
|
+
) => {
|
|
29
|
+
return block('data_setvariableto', {
|
|
30
|
+
inputs: {
|
|
31
|
+
VALUE: fromPrimitiveSource(value),
|
|
32
|
+
},
|
|
33
|
+
fields: {
|
|
34
|
+
VARIABLE: toField(variable),
|
|
35
|
+
},
|
|
36
|
+
})
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export const changeVariableBy = (
|
|
40
|
+
variable: VariableReference,
|
|
41
|
+
value: PrimitiveSource<number>,
|
|
42
|
+
) => {
|
|
43
|
+
return block('data_changevariableby', {
|
|
44
|
+
inputs: {
|
|
45
|
+
VALUE: fromPrimitiveSource(value),
|
|
46
|
+
},
|
|
47
|
+
fields: {
|
|
48
|
+
VARIABLE: toField(variable),
|
|
49
|
+
},
|
|
50
|
+
})
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export const showVariable = (variable: VariableReference) => {
|
|
54
|
+
return block('data_showvariable', {
|
|
55
|
+
fields: {
|
|
56
|
+
VARIABLE: toField(variable),
|
|
57
|
+
},
|
|
58
|
+
})
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export const hideVariable = (variable: VariableReference) => {
|
|
62
|
+
return block('data_hidevariable', {
|
|
63
|
+
fields: {
|
|
64
|
+
VARIABLE: toField(variable),
|
|
65
|
+
},
|
|
66
|
+
})
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export const getListContents = (list: ListReference) => {
|
|
70
|
+
return valueBlock('data_listcontents', {
|
|
71
|
+
fields: {
|
|
72
|
+
LIST: toField(list),
|
|
73
|
+
},
|
|
74
|
+
})
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export const addToList = (
|
|
78
|
+
list: ListReference,
|
|
79
|
+
item: PrimitiveSource<string | number>,
|
|
80
|
+
) => {
|
|
81
|
+
return block('data_addtolist', {
|
|
82
|
+
inputs: {
|
|
83
|
+
ITEM: fromPrimitiveSource(item),
|
|
84
|
+
},
|
|
85
|
+
fields: {
|
|
86
|
+
LIST: toField(list),
|
|
87
|
+
},
|
|
88
|
+
})
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export const deleteOfList = (list: ListReference, index: ListIndex) => {
|
|
92
|
+
return block('data_deleteoflist', {
|
|
93
|
+
inputs: {
|
|
94
|
+
INDEX: fromPrimitiveSource(index),
|
|
95
|
+
},
|
|
96
|
+
fields: {
|
|
97
|
+
LIST: toField(list),
|
|
98
|
+
},
|
|
99
|
+
})
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export const deleteAllOfList = (list: ListReference) => {
|
|
103
|
+
return block('data_deletealloflist', {
|
|
104
|
+
fields: {
|
|
105
|
+
LIST: toField(list),
|
|
106
|
+
},
|
|
107
|
+
})
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export const insertAtList = (
|
|
111
|
+
list: ListReference,
|
|
112
|
+
index: ListIndex,
|
|
113
|
+
item: PrimitiveSource<string | number>,
|
|
114
|
+
) => {
|
|
115
|
+
return block('data_insertatlist', {
|
|
116
|
+
inputs: {
|
|
117
|
+
INDEX: fromPrimitiveSource(index),
|
|
118
|
+
ITEM: fromPrimitiveSource(item),
|
|
119
|
+
},
|
|
120
|
+
fields: {
|
|
121
|
+
LIST: toField(list),
|
|
122
|
+
},
|
|
123
|
+
})
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export const replaceItemOfList = (
|
|
127
|
+
list: ListReference,
|
|
128
|
+
index: ListIndex,
|
|
129
|
+
item: PrimitiveSource<string | number>,
|
|
130
|
+
) => {
|
|
131
|
+
return block('data_replaceitemoflist', {
|
|
132
|
+
inputs: {
|
|
133
|
+
INDEX: fromPrimitiveSource(index),
|
|
134
|
+
ITEM: fromPrimitiveSource(item),
|
|
135
|
+
},
|
|
136
|
+
fields: {
|
|
137
|
+
LIST: toField(list),
|
|
138
|
+
},
|
|
139
|
+
})
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export const getItemOfList = (list: ListReference, index: ListIndex) => {
|
|
143
|
+
return valueBlock('data_itemoflist', {
|
|
144
|
+
inputs: {
|
|
145
|
+
INDEX: fromPrimitiveSource(index),
|
|
146
|
+
},
|
|
147
|
+
fields: {
|
|
148
|
+
LIST: toField(list),
|
|
149
|
+
},
|
|
150
|
+
})
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export const getItemNumOfList = (
|
|
154
|
+
list: ListReference,
|
|
155
|
+
item: PrimitiveSource<string | number>,
|
|
156
|
+
) => {
|
|
157
|
+
return valueBlock('data_itemnumoflist', {
|
|
158
|
+
inputs: {
|
|
159
|
+
ITEM: fromPrimitiveSource(item),
|
|
160
|
+
},
|
|
161
|
+
fields: {
|
|
162
|
+
LIST: toField(list),
|
|
163
|
+
},
|
|
164
|
+
})
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export const lengthOfList = (list: ListReference) => {
|
|
168
|
+
return valueBlock('data_lengthoflist', {
|
|
169
|
+
fields: {
|
|
170
|
+
LIST: toField(list),
|
|
171
|
+
},
|
|
172
|
+
})
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export const listContainsItem = (
|
|
176
|
+
list: ListReference,
|
|
177
|
+
item: PrimitiveSource<string | number>,
|
|
178
|
+
) => {
|
|
179
|
+
return valueBlock('data_listcontainsitem', {
|
|
180
|
+
inputs: {
|
|
181
|
+
ITEM: fromPrimitiveSource(item),
|
|
182
|
+
},
|
|
183
|
+
fields: {
|
|
184
|
+
LIST: toField(list),
|
|
185
|
+
},
|
|
186
|
+
})
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export const showList = (list: ListReference) => {
|
|
190
|
+
return block('data_showlist', {
|
|
191
|
+
fields: {
|
|
192
|
+
LIST: toField(list),
|
|
193
|
+
},
|
|
194
|
+
})
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export const hideList = (list: ListReference) => {
|
|
198
|
+
return block('data_hidelist', {
|
|
199
|
+
fields: {
|
|
200
|
+
LIST: toField(list),
|
|
201
|
+
},
|
|
202
|
+
})
|
|
203
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import type { Input } from '@pnsk-lab/sb3-types'
|
|
2
|
+
import { fromPrimitiveSource } from '../compiler/block-helper'
|
|
3
|
+
import { block } from '../compiler/composer'
|
|
4
|
+
import type { PrimitiveSource } from '../compiler/types'
|
|
5
|
+
|
|
6
|
+
export const whenFlagClicked = (stack?: () => void) => {
|
|
7
|
+
const res = block('event_whenflagclicked', {
|
|
8
|
+
topLevel: true,
|
|
9
|
+
})
|
|
10
|
+
stack?.()
|
|
11
|
+
return res
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const whenKeyPressed = (key: string, stack?: () => void) => {
|
|
15
|
+
const res = block('event_whenkeypressed', {
|
|
16
|
+
topLevel: true,
|
|
17
|
+
fields: {
|
|
18
|
+
KEY_OPTION: [key, null],
|
|
19
|
+
},
|
|
20
|
+
})
|
|
21
|
+
stack?.()
|
|
22
|
+
return res
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export const whenThisSpriteClicked = (stack?: () => void) => {
|
|
26
|
+
const res = block('event_whenthisspriteclicked', {
|
|
27
|
+
topLevel: true,
|
|
28
|
+
})
|
|
29
|
+
stack?.()
|
|
30
|
+
return res
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export const whenStageClicked = (stack?: () => void) => {
|
|
34
|
+
const res = block('event_whenstageclicked', {
|
|
35
|
+
topLevel: true,
|
|
36
|
+
})
|
|
37
|
+
stack?.()
|
|
38
|
+
return res
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export const whenBackdropSwitchesTo = (
|
|
42
|
+
backdrop: string,
|
|
43
|
+
stack?: () => void,
|
|
44
|
+
) => {
|
|
45
|
+
const res = block('event_whenbackdropswitchesto', {
|
|
46
|
+
topLevel: true,
|
|
47
|
+
fields: {
|
|
48
|
+
BACKDROP: [backdrop, null],
|
|
49
|
+
},
|
|
50
|
+
})
|
|
51
|
+
stack?.()
|
|
52
|
+
return res
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export const whenBroadcastReceived = (
|
|
56
|
+
broadcast: string,
|
|
57
|
+
stack?: () => void,
|
|
58
|
+
) => {
|
|
59
|
+
const res = block('event_whenbroadcastreceived', {
|
|
60
|
+
topLevel: true,
|
|
61
|
+
fields: {
|
|
62
|
+
BROADCAST_OPTION: [broadcast, null],
|
|
63
|
+
},
|
|
64
|
+
})
|
|
65
|
+
stack?.()
|
|
66
|
+
return res
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export const whenTouchingObject = (target: string, stack?: () => void) => {
|
|
70
|
+
const res = block('event_whentouchingobject', {
|
|
71
|
+
topLevel: true,
|
|
72
|
+
fields: {
|
|
73
|
+
TOUCHINGOBJECTMENU: [target, null],
|
|
74
|
+
},
|
|
75
|
+
})
|
|
76
|
+
stack?.()
|
|
77
|
+
return res
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export const whenGreaterThan = (
|
|
81
|
+
menu: string,
|
|
82
|
+
value: PrimitiveSource<number>,
|
|
83
|
+
stack?: () => void,
|
|
84
|
+
) => {
|
|
85
|
+
const res = block('event_whengreaterthan', {
|
|
86
|
+
topLevel: true,
|
|
87
|
+
inputs: {
|
|
88
|
+
VALUE: fromPrimitiveSource(value),
|
|
89
|
+
},
|
|
90
|
+
fields: {
|
|
91
|
+
WHENGREATERTHANMENU: [menu, null],
|
|
92
|
+
},
|
|
93
|
+
})
|
|
94
|
+
stack?.()
|
|
95
|
+
return res
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export const broadcast = (message: PrimitiveSource<string>) => {
|
|
99
|
+
return block('event_broadcast', {
|
|
100
|
+
inputs: {
|
|
101
|
+
BROADCAST_INPUT:
|
|
102
|
+
typeof message === 'string'
|
|
103
|
+
? // @ts-expect-error type issue
|
|
104
|
+
([1, [11, message]] as Input)
|
|
105
|
+
: fromPrimitiveSource(message),
|
|
106
|
+
},
|
|
107
|
+
})
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export const broadcastAndWait = (message: PrimitiveSource<string>) => {
|
|
111
|
+
return block('event_broadcastandwait', {
|
|
112
|
+
inputs: {
|
|
113
|
+
BROADCAST_INPUT: fromPrimitiveSource(message),
|
|
114
|
+
},
|
|
115
|
+
})
|
|
116
|
+
}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import {
|
|
2
|
+
fromCostumeSource,
|
|
3
|
+
fromPrimitiveSource,
|
|
4
|
+
} from '../compiler/block-helper'
|
|
5
|
+
import { block, valueBlock } from '../compiler/composer'
|
|
6
|
+
import type { CostumeSource, PrimitiveSource } from '../compiler/types'
|
|
7
|
+
|
|
8
|
+
export type LookEffect =
|
|
9
|
+
| 'color'
|
|
10
|
+
| 'fisheye'
|
|
11
|
+
| 'whirl'
|
|
12
|
+
| 'pixelate'
|
|
13
|
+
| 'mosaic'
|
|
14
|
+
| 'brightness'
|
|
15
|
+
| 'ghost'
|
|
16
|
+
|
|
17
|
+
export type FrontBack = 'front' | 'back'
|
|
18
|
+
export type ForwardBackward = 'forward' | 'backward'
|
|
19
|
+
export type NumberName = 'number' | 'name'
|
|
20
|
+
|
|
21
|
+
export const say = (message: PrimitiveSource<string>) => {
|
|
22
|
+
return block('looks_say', {
|
|
23
|
+
inputs: {
|
|
24
|
+
MESSAGE: fromPrimitiveSource(message),
|
|
25
|
+
},
|
|
26
|
+
})
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export const sayForSecs = (
|
|
30
|
+
message: PrimitiveSource<string>,
|
|
31
|
+
seconds: PrimitiveSource<number>,
|
|
32
|
+
) => {
|
|
33
|
+
return block('looks_sayforsecs', {
|
|
34
|
+
inputs: {
|
|
35
|
+
MESSAGE: fromPrimitiveSource(message),
|
|
36
|
+
SECS: fromPrimitiveSource(seconds),
|
|
37
|
+
},
|
|
38
|
+
})
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export const think = (message: PrimitiveSource<string>) => {
|
|
42
|
+
return block('looks_think', {
|
|
43
|
+
inputs: {
|
|
44
|
+
MESSAGE: fromPrimitiveSource(message),
|
|
45
|
+
},
|
|
46
|
+
})
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export const thinkForSecs = (
|
|
50
|
+
message: PrimitiveSource<string>,
|
|
51
|
+
seconds: PrimitiveSource<number>,
|
|
52
|
+
) => {
|
|
53
|
+
return block('looks_thinkforsecs', {
|
|
54
|
+
inputs: {
|
|
55
|
+
MESSAGE: fromPrimitiveSource(message),
|
|
56
|
+
SECS: fromPrimitiveSource(seconds),
|
|
57
|
+
},
|
|
58
|
+
})
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export const show = () => {
|
|
62
|
+
return block('looks_show', {})
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export const hide = () => {
|
|
66
|
+
return block('looks_hide', {})
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export const switchCostumeTo = (costume: CostumeSource) => {
|
|
70
|
+
return block('looks_switchcostumeto', {
|
|
71
|
+
inputs: {
|
|
72
|
+
COSTUME: fromCostumeSource(costume),
|
|
73
|
+
},
|
|
74
|
+
})
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export const nextCostume = () => {
|
|
78
|
+
return block('looks_nextcostume', {})
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export const switchBackdropTo = (backdrop: PrimitiveSource<string>) => {
|
|
82
|
+
return block('looks_switchbackdropto', {
|
|
83
|
+
inputs: {
|
|
84
|
+
BACKDROP: fromPrimitiveSource(backdrop),
|
|
85
|
+
},
|
|
86
|
+
})
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export const switchBackdropToAndWait = (backdrop: PrimitiveSource<string>) => {
|
|
90
|
+
return block('looks_switchbackdroptoandwait', {
|
|
91
|
+
inputs: {
|
|
92
|
+
BACKDROP: fromPrimitiveSource(backdrop),
|
|
93
|
+
},
|
|
94
|
+
})
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export const nextBackdrop = () => {
|
|
98
|
+
return block('looks_nextbackdrop', {})
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export const changeLooksEffectBy = (
|
|
102
|
+
effect: LookEffect,
|
|
103
|
+
value: PrimitiveSource<number>,
|
|
104
|
+
) => {
|
|
105
|
+
return block('looks_changeeffectby', {
|
|
106
|
+
inputs: {
|
|
107
|
+
CHANGE: fromPrimitiveSource(value),
|
|
108
|
+
},
|
|
109
|
+
fields: {
|
|
110
|
+
EFFECT: [effect, null],
|
|
111
|
+
},
|
|
112
|
+
})
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export const setLooksEffectTo = (
|
|
116
|
+
effect: LookEffect,
|
|
117
|
+
value: PrimitiveSource<number>,
|
|
118
|
+
) => {
|
|
119
|
+
return block('looks_seteffectto', {
|
|
120
|
+
inputs: {
|
|
121
|
+
VALUE: fromPrimitiveSource(value),
|
|
122
|
+
},
|
|
123
|
+
fields: {
|
|
124
|
+
EFFECT: [effect, null],
|
|
125
|
+
},
|
|
126
|
+
})
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export const clearGraphicEffects = () => {
|
|
130
|
+
return block('looks_cleargraphiceffects', {})
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export const changeSizeBy = (value: PrimitiveSource<number>) => {
|
|
134
|
+
return block('looks_changesizeby', {
|
|
135
|
+
inputs: {
|
|
136
|
+
CHANGE: fromPrimitiveSource(value),
|
|
137
|
+
},
|
|
138
|
+
})
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export const setSizeTo = (value: PrimitiveSource<number>) => {
|
|
142
|
+
return block('looks_setsizeto', {
|
|
143
|
+
inputs: {
|
|
144
|
+
SIZE: fromPrimitiveSource(value),
|
|
145
|
+
},
|
|
146
|
+
})
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export const goToFrontBack = (position: FrontBack) => {
|
|
150
|
+
return block('looks_gotofrontback', {
|
|
151
|
+
fields: {
|
|
152
|
+
FRONT_BACK: [position, null],
|
|
153
|
+
},
|
|
154
|
+
})
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export const goForwardBackwardLayers = (
|
|
158
|
+
direction: ForwardBackward,
|
|
159
|
+
layers: PrimitiveSource<number>,
|
|
160
|
+
) => {
|
|
161
|
+
return block('looks_goforwardbackwardlayers', {
|
|
162
|
+
inputs: {
|
|
163
|
+
NUM: fromPrimitiveSource(layers),
|
|
164
|
+
},
|
|
165
|
+
fields: {
|
|
166
|
+
FORWARD_BACKWARD: [direction, null],
|
|
167
|
+
},
|
|
168
|
+
})
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export const getSize = () => {
|
|
172
|
+
return valueBlock('looks_size', {})
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export const getCostumeNumberName = (value: NumberName) => {
|
|
176
|
+
return valueBlock('looks_costumenumbername', {
|
|
177
|
+
fields: {
|
|
178
|
+
NUMBER_NAME: [value, null],
|
|
179
|
+
},
|
|
180
|
+
})
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export const getBackdropNumberName = (value: NumberName) => {
|
|
184
|
+
return valueBlock('looks_backdropnumbername', {
|
|
185
|
+
fields: {
|
|
186
|
+
NUMBER_NAME: [value, null],
|
|
187
|
+
},
|
|
188
|
+
})
|
|
189
|
+
}
|