Pacman.metamodel 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. {
  2. "types": {
  3. "GridNode": [
  4. {
  5. "name": "position",
  6. "type": "list<int>",
  7. "default": [
  8. 0,
  9. 0
  10. ]
  11. }
  12. ],
  13. "left": [],
  14. "bottom": [],
  15. "top": [],
  16. "right": [],
  17. "Pacman": [
  18. {
  19. "name": "name",
  20. "type": "string",
  21. "default": ""
  22. },
  23. {
  24. "name": "position",
  25. "type": "list<int>",
  26. "default": [
  27. 0,
  28. 0
  29. ]
  30. }
  31. ],
  32. "Positionable": [
  33. {
  34. "name": "position",
  35. "type": "list<int>",
  36. "default": [
  37. 0,
  38. 0
  39. ]
  40. }
  41. ],
  42. "Ghost": [
  43. {
  44. "name": "type",
  45. "type": "ENUM(Blinky, Pinky, Inky, Clyde, CobraCommander)",
  46. "default": "pinky"
  47. },
  48. {
  49. "name": "position",
  50. "type": "list<int>",
  51. "default": [
  52. 0,
  53. 0
  54. ]
  55. }
  56. ],
  57. "Scoreboard": [
  58. {
  59. "name": "score",
  60. "type": "int",
  61. "default": 0
  62. }
  63. ],
  64. "Food": [
  65. {
  66. "name": "points",
  67. "type": "int",
  68. "default": "1"
  69. },
  70. {
  71. "name": "position",
  72. "type": "list<int>",
  73. "default": [
  74. 0,
  75. 0
  76. ]
  77. }
  78. ],
  79. "PoG": [],
  80. "GoG": [],
  81. "FoG": []
  82. },
  83. "constraints": [
  84. {
  85. "name": "noAbstractInstances",
  86. "event": "pre-create",
  87. "code": "false",
  88. "targetType": "Positionable"
  89. }
  90. ],
  91. "actions": [
  92. {
  93. "name": "snapToTarget",
  94. "event": "post-connect",
  95. "code": "/*newline*/var neighborLinks = getNeighbors('>'),/*newline*/ neighborLink = neighborLinks[neighborLinks.length-1];/*newline*/if( neighborLink )/*newline*/{/*newline*/ if( getAttr('$type', neighborLink).match(/left/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ npos = getAttr('position',neighbor);/*newline*/ setAttr('position', [npos[0] - 100, npos[1]]);/*newline*/ }/*newline*/ else if( getAttr('$type', neighborLink).match(/right/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ npos = getAttr('position',neighbor);/*newline*/ setAttr('position', [npos[0] + 100, npos[1]]);/*newline*/ }/*newline*/ else if( getAttr('$type', neighborLink).match(/top/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ npos = getAttr('position',neighbor);/*newline*/ setAttr('position', [npos[0], npos[1] - 100]);/*newline*/ }/*newline*/ else if( getAttr('$type', neighborLink).match(/bottom/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ npos = getAttr('position',neighbor);/*newline*/ setAttr('position', [npos[0], npos[1] + 100]);/*newline*/ }/*newline*/ else if( getAttr('$type', neighborLink).match(/(P|G)oG/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ gpos = getAttr('position');/*newline*/ setAttr('position', [gpos[0] + 26, gpos[1] + 26], neighbor);/*newline*/ }/*newline*/ else if( getAttr('$type', neighborLink).match(/FoG/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ gpos = getAttr('position');/*newline*/ setAttr('position', [gpos[0] + 70, gpos[1] + 43], neighbor);/*newline*/ }/*newline*/ else/*newline*/ {/*newline*/ print('Invalid grid node link');/*newline*/ }/*newline*/}",
  96. "targetType": "GridNode"
  97. },
  98. {
  99. "name": "snapToTarget",
  100. "event": "post-connect",
  101. "code": "/*newline*/var neighborLinks = getNeighbors('>'),/*newline*/ neighborLink = neighborLinks[neighborLinks.length-1];/*newline*/if( neighborLink )/*newline*/{/*newline*/ if( getAttr('$type', neighborLink).match(/left/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ npos = getAttr('position',neighbor);/*newline*/ setAttr('position', [npos[0] - 100, npos[1]]);/*newline*/ }/*newline*/ else if( getAttr('$type', neighborLink).match(/right/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ npos = getAttr('position',neighbor);/*newline*/ setAttr('position', [npos[0] + 100, npos[1]]);/*newline*/ }/*newline*/ else if( getAttr('$type', neighborLink).match(/top/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ npos = getAttr('position',neighbor);/*newline*/ setAttr('position', [npos[0], npos[1] - 100]);/*newline*/ }/*newline*/ else if( getAttr('$type', neighborLink).match(/bottom/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ npos = getAttr('position',neighbor);/*newline*/ setAttr('position', [npos[0], npos[1] + 100]);/*newline*/ }/*newline*/ else if( getAttr('$type', neighborLink).match(/(P|G)oG/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ gpos = getAttr('position');/*newline*/ setAttr('position', [gpos[0] + 26, gpos[1] + 26], neighbor);/*newline*/ }/*newline*/ else if( getAttr('$type', neighborLink).match(/FoG/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ gpos = getAttr('position');/*newline*/ setAttr('position', [gpos[0] + 70, gpos[1] + 43], neighbor);/*newline*/ }/*newline*/ else/*newline*/ {/*newline*/ print('Invalid grid node link');/*newline*/ }/*newline*/}",
  102. "targetType": "Pacman"
  103. },
  104. {
  105. "name": "snapToTarget",
  106. "event": "post-connect",
  107. "code": "/*newline*/var neighborLinks = getNeighbors('>'),/*newline*/ neighborLink = neighborLinks[neighborLinks.length-1];/*newline*/if( neighborLink )/*newline*/{/*newline*/ if( getAttr('$type', neighborLink).match(/left/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ npos = getAttr('position',neighbor);/*newline*/ setAttr('position', [npos[0] - 100, npos[1]]);/*newline*/ }/*newline*/ else if( getAttr('$type', neighborLink).match(/right/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ npos = getAttr('position',neighbor);/*newline*/ setAttr('position', [npos[0] + 100, npos[1]]);/*newline*/ }/*newline*/ else if( getAttr('$type', neighborLink).match(/top/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ npos = getAttr('position',neighbor);/*newline*/ setAttr('position', [npos[0], npos[1] - 100]);/*newline*/ }/*newline*/ else if( getAttr('$type', neighborLink).match(/bottom/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ npos = getAttr('position',neighbor);/*newline*/ setAttr('position', [npos[0], npos[1] + 100]);/*newline*/ }/*newline*/ else if( getAttr('$type', neighborLink).match(/(P|G)oG/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ gpos = getAttr('position');/*newline*/ setAttr('position', [gpos[0] + 26, gpos[1] + 26], neighbor);/*newline*/ }/*newline*/ else if( getAttr('$type', neighborLink).match(/FoG/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ gpos = getAttr('position');/*newline*/ setAttr('position', [gpos[0] + 70, gpos[1] + 43], neighbor);/*newline*/ }/*newline*/ else/*newline*/ {/*newline*/ print('Invalid grid node link');/*newline*/ }/*newline*/}",
  108. "targetType": "Positionable"
  109. },
  110. {
  111. "name": "snapToTarget",
  112. "event": "post-connect",
  113. "code": "/*newline*/var neighborLinks = getNeighbors('>'),/*newline*/ neighborLink = neighborLinks[neighborLinks.length-1];/*newline*/if( neighborLink )/*newline*/{/*newline*/ if( getAttr('$type', neighborLink).match(/left/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ npos = getAttr('position',neighbor);/*newline*/ setAttr('position', [npos[0] - 100, npos[1]]);/*newline*/ }/*newline*/ else if( getAttr('$type', neighborLink).match(/right/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ npos = getAttr('position',neighbor);/*newline*/ setAttr('position', [npos[0] + 100, npos[1]]);/*newline*/ }/*newline*/ else if( getAttr('$type', neighborLink).match(/top/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ npos = getAttr('position',neighbor);/*newline*/ setAttr('position', [npos[0], npos[1] - 100]);/*newline*/ }/*newline*/ else if( getAttr('$type', neighborLink).match(/bottom/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ npos = getAttr('position',neighbor);/*newline*/ setAttr('position', [npos[0], npos[1] + 100]);/*newline*/ }/*newline*/ else if( getAttr('$type', neighborLink).match(/(P|G)oG/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ gpos = getAttr('position');/*newline*/ setAttr('position', [gpos[0] + 26, gpos[1] + 26], neighbor);/*newline*/ }/*newline*/ else if( getAttr('$type', neighborLink).match(/FoG/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ gpos = getAttr('position');/*newline*/ setAttr('position', [gpos[0] + 70, gpos[1] + 43], neighbor);/*newline*/ }/*newline*/ else/*newline*/ {/*newline*/ print('Invalid grid node link');/*newline*/ }/*newline*/}",
  114. "targetType": "Ghost"
  115. },
  116. {
  117. "name": "snapToTarget",
  118. "event": "post-connect",
  119. "code": "/*newline*/var neighborLinks = getNeighbors('>'),/*newline*/ neighborLink = neighborLinks[neighborLinks.length-1];/*newline*/if( neighborLink )/*newline*/{/*newline*/ if( getAttr('$type', neighborLink).match(/left/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ npos = getAttr('position',neighbor);/*newline*/ setAttr('position', [npos[0] - 100, npos[1]]);/*newline*/ }/*newline*/ else if( getAttr('$type', neighborLink).match(/right/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ npos = getAttr('position',neighbor);/*newline*/ setAttr('position', [npos[0] + 100, npos[1]]);/*newline*/ }/*newline*/ else if( getAttr('$type', neighborLink).match(/top/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ npos = getAttr('position',neighbor);/*newline*/ setAttr('position', [npos[0], npos[1] - 100]);/*newline*/ }/*newline*/ else if( getAttr('$type', neighborLink).match(/bottom/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ npos = getAttr('position',neighbor);/*newline*/ setAttr('position', [npos[0], npos[1] + 100]);/*newline*/ }/*newline*/ else if( getAttr('$type', neighborLink).match(/(P|G)oG/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ gpos = getAttr('position');/*newline*/ setAttr('position', [gpos[0] + 26, gpos[1] + 26], neighbor);/*newline*/ }/*newline*/ else if( getAttr('$type', neighborLink).match(/FoG/) )/*newline*/ {/*newline*/ var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/ gpos = getAttr('position');/*newline*/ setAttr('position', [gpos[0] + 70, gpos[1] + 43], neighbor);/*newline*/ }/*newline*/ else/*newline*/ {/*newline*/ print('Invalid grid node link');/*newline*/ }/*newline*/}",
  120. "targetType": "Food"
  121. }
  122. ],
  123. "cardinalities": {
  124. "GridNode": [
  125. {
  126. "dir": "out",
  127. "type": "left",
  128. "min": "0",
  129. "max": "Infinity"
  130. },
  131. {
  132. "dir": "in",
  133. "type": "left",
  134. "min": "0",
  135. "max": "Infinity"
  136. },
  137. {
  138. "dir": "out",
  139. "type": "bottom",
  140. "min": "0",
  141. "max": "Infinity"
  142. },
  143. {
  144. "dir": "in",
  145. "type": "bottom",
  146. "min": "0",
  147. "max": "Infinity"
  148. },
  149. {
  150. "dir": "out",
  151. "type": "top",
  152. "min": "0",
  153. "max": "Infinity"
  154. },
  155. {
  156. "dir": "in",
  157. "type": "top",
  158. "min": "0",
  159. "max": "Infinity"
  160. },
  161. {
  162. "dir": "out",
  163. "type": "right",
  164. "min": "0",
  165. "max": "Infinity"
  166. },
  167. {
  168. "dir": "in",
  169. "type": "right",
  170. "min": "0",
  171. "max": "Infinity"
  172. },
  173. {
  174. "dir": "out",
  175. "type": "PoG",
  176. "min": "0",
  177. "max": "Infinity"
  178. },
  179. {
  180. "dir": "out",
  181. "type": "GoG",
  182. "min": "0",
  183. "max": "Infinity"
  184. },
  185. {
  186. "dir": "out",
  187. "type": "FoG",
  188. "min": "0",
  189. "max": "Infinity"
  190. }
  191. ],
  192. "left": [
  193. {
  194. "dir": "in",
  195. "type": "GridNode",
  196. "min": "0",
  197. "max": "1"
  198. },
  199. {
  200. "dir": "out",
  201. "type": "GridNode",
  202. "min": "0",
  203. "max": "1"
  204. }
  205. ],
  206. "bottom": [
  207. {
  208. "dir": "in",
  209. "type": "GridNode",
  210. "min": "0",
  211. "max": "1"
  212. },
  213. {
  214. "dir": "out",
  215. "type": "GridNode",
  216. "min": "0",
  217. "max": "1"
  218. }
  219. ],
  220. "top": [
  221. {
  222. "dir": "in",
  223. "type": "GridNode",
  224. "min": "0",
  225. "max": "1"
  226. },
  227. {
  228. "dir": "out",
  229. "type": "GridNode",
  230. "min": "0",
  231. "max": "1"
  232. }
  233. ],
  234. "right": [
  235. {
  236. "dir": "in",
  237. "type": "GridNode",
  238. "min": "0",
  239. "max": "1"
  240. },
  241. {
  242. "dir": "out",
  243. "type": "GridNode",
  244. "min": "0",
  245. "max": "1"
  246. }
  247. ],
  248. "Pacman": [
  249. {
  250. "dir": "in",
  251. "type": "PoG",
  252. "min": "0",
  253. "max": "Infinity"
  254. }
  255. ],
  256. "Positionable": [],
  257. "Ghost": [
  258. {
  259. "dir": "in",
  260. "type": "GoG",
  261. "min": "0",
  262. "max": "Infinity"
  263. }
  264. ],
  265. "Scoreboard": [],
  266. "Food": [
  267. {
  268. "dir": "in",
  269. "type": "FoG",
  270. "min": "0",
  271. "max": "Infinity"
  272. }
  273. ],
  274. "PoG": [
  275. {
  276. "dir": "in",
  277. "type": "GridNode",
  278. "min": "0",
  279. "max": "1"
  280. },
  281. {
  282. "dir": "out",
  283. "type": "Pacman",
  284. "min": "0",
  285. "max": "1"
  286. }
  287. ],
  288. "GoG": [
  289. {
  290. "dir": "in",
  291. "type": "GridNode",
  292. "min": "0",
  293. "max": "1"
  294. },
  295. {
  296. "dir": "out",
  297. "type": "Ghost",
  298. "min": "0",
  299. "max": "1"
  300. }
  301. ],
  302. "FoG": [
  303. {
  304. "dir": "in",
  305. "type": "GridNode",
  306. "min": "0",
  307. "max": "1"
  308. },
  309. {
  310. "dir": "out",
  311. "type": "Food",
  312. "min": "0",
  313. "max": "1"
  314. }
  315. ]
  316. },
  317. "legalConnections": {
  318. "GridNode": {
  319. "GridNode": [
  320. "left",
  321. "bottom",
  322. "top",
  323. "right"
  324. ],
  325. "Pacman": [
  326. "PoG"
  327. ],
  328. "Ghost": [
  329. "GoG"
  330. ],
  331. "Food": [
  332. "FoG"
  333. ]
  334. }
  335. },
  336. "connectorTypes": {
  337. "left": "visual",
  338. "bottom": "visual",
  339. "top": "visual",
  340. "right": "visual",
  341. "PoG": "containment",
  342. "GoG": "containment",
  343. "FoG": "containment"
  344. },
  345. "types2parentTypes": {
  346. "GridNode": [
  347. "Positionable"
  348. ],
  349. "left": [],
  350. "bottom": [],
  351. "top": [],
  352. "right": [],
  353. "Pacman": [
  354. "Positionable"
  355. ],
  356. "Positionable": [],
  357. "Ghost": [
  358. "Positionable"
  359. ],
  360. "Scoreboard": [],
  361. "Food": [
  362. "Positionable"
  363. ],
  364. "PoG": [],
  365. "GoG": [],
  366. "FoG": []
  367. }
  368. }