1
- /* global Opal */
2
- import _ from 'lodash' ;
3
1
import Variable from 'scratch-vm/src/engine/variable' ;
4
2
import { KeyOptions } from './constants' ;
5
3
@@ -12,77 +10,90 @@ const GreaterThanMenu = [
12
10
* Event converter
13
11
*/
14
12
const EventConverter = {
15
- // eslint-disable-next-line no-unused-vars
16
- onSend : function ( receiver , name , args , rubyBlockArgs , rubyBlock ) {
17
- let block ;
18
- if ( ( this . _isSelf ( receiver ) || receiver === Opal . nil ) &&
19
- name === 'when' &&
20
- args . length >= 1 && args [ 0 ] . type === 'sym' &&
21
- rubyBlockArgs && rubyBlockArgs . length === 0 &&
22
- rubyBlock ) {
23
- switch ( args [ 0 ] . value ) {
24
- case 'flag_clicked' :
25
- case 'clicked' :
26
- if ( args . length === 1 ) {
27
- let opcode ;
28
- switch ( args [ 0 ] . value ) {
29
- case 'flag_clicked' :
30
- opcode = 'event_whenflagclicked' ;
31
- break ;
32
- case 'clicked' :
33
- if ( this . _context . target && this . _context . target . isStage ) {
34
- opcode = 'event_whenstageclicked' ;
35
- } else {
36
- opcode = 'event_whenthisspriteclicked' ;
37
- }
38
- break ;
39
- }
40
- block = this . _createBlock ( opcode , 'hat' ) ;
41
- this . _setParent ( rubyBlock , block ) ;
42
- }
43
- break ;
44
- case 'key_pressed' :
45
- if ( args . length === 2 && this . _isString ( args [ 1 ] ) && KeyOptions . indexOf ( args [ 1 ] . toString ( ) ) >= 0 ) {
46
- block = this . _createBlock ( 'event_whenkeypressed' , 'hat' ) ;
47
- this . _addField ( block , 'KEY_OPTION' , args [ 1 ] ) ;
48
- this . _setParent ( rubyBlock , block ) ;
49
- }
50
- break ;
51
- case 'backdrop_switches' :
52
- if ( args . length === 2 && this . _isString ( args [ 1 ] ) ) {
53
- block = this . _createBlock ( 'event_whenbackdropswitchesto' , 'hat' ) ;
54
- this . _addField ( block , 'BACKDROP' , args [ 1 ] ) ;
55
- this . _setParent ( rubyBlock , block ) ;
56
- }
57
- break ;
58
- case 'greater_than' :
59
- if ( args . length === 3 &&
60
- this . _isString ( args [ 1 ] ) && GreaterThanMenu . indexOf ( args [ 1 ] . toString ( ) . toUpperCase ( ) ) >= 0 &&
61
- this . _isNumberOrBlock ( args [ 2 ] ) ) {
62
- block = this . _createBlock ( 'event_whengreaterthan' , 'hat' ) ;
63
- this . _addField ( block , 'WHENGREATERTHANMENU' , args [ 1 ] . toString ( ) . toUpperCase ( ) ) ;
64
- this . _addNumberInput ( block , 'VALUE' , 'math_number' , args [ 2 ] , 10 ) ;
65
- this . _setParent ( rubyBlock , block ) ;
66
- }
67
- break ;
68
- case 'receive' :
69
- if ( args . length === 2 && this . _isString ( args [ 1 ] ) ) {
70
- const broadcastMsg = this . _lookupOrCreateBroadcastMsg ( args [ 1 ] ) ;
71
- block = this . _createBlock ( 'event_whenbroadcastreceived' , 'hat' ) ;
72
- this . _addField ( block , 'BROADCAST_OPTION' , broadcastMsg . name , {
73
- id : broadcastMsg . id ,
74
- variableType : Variable . BROADCAST_MESSAGE_TYPE
75
- } ) ;
76
- this . _setParent ( rubyBlock , block ) ;
77
- }
78
- break ;
13
+ register : function ( converter ) {
14
+ converter . registerCallMethodWithBlock ( 'self' , 'when' , 1 , 0 , params => {
15
+ const { receiverName, args, rubyBlock} = params ;
16
+
17
+ if ( args [ 0 ] . type !== 'sym' ) return null ;
18
+
19
+ if ( args [ 0 ] . value === 'flag_clicked' ) {
20
+ const block = converter . createBlock ( 'event_whenflagclicked' , 'hat' ) ;
21
+ converter . setParent ( rubyBlock , block ) ;
22
+ return block ;
79
23
}
80
- }
81
24
82
- return block ;
83
- } ,
25
+ if ( args [ 0 ] . value === 'clicked' ) {
26
+ let opcode = 'event_whenthisspriteclicked' ;
27
+ if ( receiverName === 'stage' ) opcode = 'event_whenstageclicked' ;
28
+ const block = converter . createBlock ( opcode , 'hat' ) ;
29
+ converter . setParent ( rubyBlock , block ) ;
30
+ return block ;
31
+ }
32
+
33
+ return null ;
34
+ } ) ;
35
+
36
+ converter . registerCallMethodWithBlock ( 'self' , 'when' , 2 , 0 , params => {
37
+ const { args, rubyBlock} = params ;
38
+
39
+ if ( args [ 0 ] . type !== 'sym' ) return null ;
40
+
41
+ if ( args [ 0 ] . value === 'key_pressed' ) {
42
+ if ( ! converter . isString ( args [ 1 ] ) ) return null ;
43
+ if ( KeyOptions . indexOf ( args [ 1 ] . toString ( ) ) < 0 ) return null ;
44
+
45
+ const block = converter . createBlock ( 'event_whenkeypressed' , 'hat' ) ;
46
+ converter . addField ( block , 'KEY_OPTION' , args [ 1 ] ) ;
47
+ converter . setParent ( rubyBlock , block ) ;
48
+ return block ;
49
+ }
50
+
51
+ if ( args [ 0 ] . value === 'backdrop_switches' ) {
52
+ if ( ! converter . isString ( args [ 1 ] ) ) return null ;
53
+
54
+ const block = converter . createBlock ( 'event_whenbackdropswitchesto' , 'hat' ) ;
55
+ converter . addField ( block , 'BACKDROP' , args [ 1 ] ) ;
56
+ converter . setParent ( rubyBlock , block ) ;
57
+ return block ;
58
+ }
59
+
60
+ if ( args [ 0 ] . value === 'receive' ) {
61
+ if ( ! converter . isString ( args [ 1 ] ) ) return null ;
62
+
63
+ const broadcastMsg = converter . lookupOrCreateBroadcastMsg ( args [ 1 ] ) ;
64
+ const block = converter . createBlock ( 'event_whenbroadcastreceived' , 'hat' ) ;
65
+ converter . addField ( block , 'BROADCAST_OPTION' , broadcastMsg . name , {
66
+ id : broadcastMsg . id ,
67
+ variableType : Variable . BROADCAST_MESSAGE_TYPE
68
+ } ) ;
69
+ converter . setParent ( rubyBlock , block ) ;
70
+ return block ;
71
+ }
72
+
73
+ return null ;
74
+ } ) ;
75
+
76
+ converter . registerCallMethodWithBlock ( 'self' , 'when' , 3 , 0 , params => {
77
+ const { args, rubyBlock} = params ;
78
+
79
+ if ( args [ 0 ] . type !== 'sym' ) return null ;
80
+
81
+ if ( args [ 0 ] . value === 'greater_than' ) {
82
+ if ( ! converter . isString ( args [ 1 ] ) ) return null ;
83
+ const args1 = args [ 1 ] . toString ( ) . toUpperCase ( ) ;
84
+ if ( GreaterThanMenu . indexOf ( args1 ) < 0 ) return null ;
85
+ if ( ! converter . isNumberOrBlock ( args [ 2 ] ) ) return null ;
86
+
87
+ const block = converter . createBlock ( 'event_whengreaterthan' , 'hat' ) ;
88
+ converter . addField ( block , 'WHENGREATERTHANMENU' , args1 ) ;
89
+ converter . addNumberInput ( block , 'VALUE' , 'math_number' , args [ 2 ] , 10 ) ;
90
+ converter . setParent ( rubyBlock , block ) ;
91
+ return block ;
92
+ }
93
+
94
+ return null ;
95
+ } ) ;
84
96
85
- register : function ( converter ) {
86
97
converter . registerCallMethodWithBlock ( 'self' , 'when_flag_clicked' , 0 , 0 , params => {
87
98
const { rubyBlock} = params ;
88
99
@@ -103,18 +114,12 @@ const EventConverter = {
103
114
return block ;
104
115
} ) ;
105
116
106
- converter . registerCallMethodWithBlock ( 'sprite' , 'when_clicked' , 0 , 0 , params => {
107
- const { rubyBlock} = params ;
108
-
109
- const block = converter . createBlock ( 'event_whenthisspriteclicked' , 'hat' ) ;
110
- converter . setParent ( rubyBlock , block ) ;
111
- return block ;
112
- } ) ;
113
-
114
- converter . registerCallMethodWithBlock ( 'stage' , 'when_clicked' , 0 , 0 , params => {
115
- const { rubyBlock} = params ;
117
+ converter . registerCallMethodWithBlock ( 'self' , 'when_clicked' , 0 , 0 , params => {
118
+ const { receiverName, rubyBlock} = params ;
116
119
117
- const block = converter . createBlock ( 'event_whenstageclicked' , 'hat' ) ;
120
+ let opcode = 'event_whenthisspriteclicked' ;
121
+ if ( receiverName === 'stage' ) opcode = 'event_whenstageclicked' ;
122
+ const block = converter . createBlock ( opcode , 'hat' ) ;
118
123
converter . setParent ( rubyBlock , block ) ;
119
124
return block ;
120
125
} ) ;
0 commit comments