melon-lua 3.4.0__py3-none-any.whl

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.
Files changed (986) hide show
  1. melon_lua/__init__.py +78 -0
  2. melon_lua/__main__.py +246 -0
  3. melon_lua/backend/__init__.py +49 -0
  4. melon_lua/backend/camera_backend.py +35 -0
  5. melon_lua/backend/chip_backend.py +95 -0
  6. melon_lua/backend/entity_backend.py +459 -0
  7. melon_lua/backend/env_backend.py +68 -0
  8. melon_lua/backend/input_backend.py +100 -0
  9. melon_lua/backend/mechanic_backend.py +67 -0
  10. melon_lua/backend/print_backend.py +63 -0
  11. melon_lua/backend/spawn_backend.py +116 -0
  12. melon_lua/backend/uicontrol_backend.py +110 -0
  13. melon_lua/backend/variables_backend.py +38 -0
  14. melon_lua/backend/world_backend.py +56 -0
  15. melon_lua/catalog.py +99 -0
  16. melon_lua/constraints.py +489 -0
  17. melon_lua/data/chip_template_1132.json +365 -0
  18. melon_lua/data/item_templates/0.json +215 -0
  19. melon_lua/data/item_templates/10.json +187 -0
  20. melon_lua/data/item_templates/102.json +89 -0
  21. melon_lua/data/item_templates/1096548672.json +208 -0
  22. melon_lua/data/item_templates/115.json +89 -0
  23. melon_lua/data/item_templates/116.json +203 -0
  24. melon_lua/data/item_templates/120.json +89 -0
  25. melon_lua/data/item_templates/121.json +105 -0
  26. melon_lua/data/item_templates/122.json +144 -0
  27. melon_lua/data/item_templates/123.json +89 -0
  28. melon_lua/data/item_templates/125.json +89 -0
  29. melon_lua/data/item_templates/1294925504.json +232 -0
  30. melon_lua/data/item_templates/13.json +209 -0
  31. melon_lua/data/item_templates/130.json +170 -0
  32. melon_lua/data/item_templates/131.json +118 -0
  33. melon_lua/data/item_templates/133.json +256 -0
  34. melon_lua/data/item_templates/1353580864.json +125 -0
  35. melon_lua/data/item_templates/138.json +89 -0
  36. melon_lua/data/item_templates/14.json +122 -0
  37. melon_lua/data/item_templates/140.json +89 -0
  38. melon_lua/data/item_templates/147.json +326 -0
  39. melon_lua/data/item_templates/15.json +322 -0
  40. melon_lua/data/item_templates/177.json +169 -0
  41. melon_lua/data/item_templates/178.json +173 -0
  42. melon_lua/data/item_templates/184.json +205 -0
  43. melon_lua/data/item_templates/1971846848.json +235 -0
  44. melon_lua/data/item_templates/201.json +268 -0
  45. melon_lua/data/item_templates/202.json +131 -0
  46. melon_lua/data/item_templates/2046689600.json +481 -0
  47. melon_lua/data/item_templates/21.json +245 -0
  48. melon_lua/data/item_templates/22.json +89 -0
  49. melon_lua/data/item_templates/222.json +192 -0
  50. melon_lua/data/item_templates/225.json +89 -0
  51. melon_lua/data/item_templates/226.json +136 -0
  52. melon_lua/data/item_templates/228.json +124 -0
  53. melon_lua/data/item_templates/229.json +149 -0
  54. melon_lua/data/item_templates/23.json +138 -0
  55. melon_lua/data/item_templates/233.json +173 -0
  56. melon_lua/data/item_templates/24.json +133 -0
  57. melon_lua/data/item_templates/246.json +385 -0
  58. melon_lua/data/item_templates/247.json +385 -0
  59. melon_lua/data/item_templates/248.json +391 -0
  60. melon_lua/data/item_templates/249.json +340 -0
  61. melon_lua/data/item_templates/25.json +225 -0
  62. melon_lua/data/item_templates/252.json +125 -0
  63. melon_lua/data/item_templates/253.json +182 -0
  64. melon_lua/data/item_templates/256.json +266 -0
  65. melon_lua/data/item_templates/257.json +170 -0
  66. melon_lua/data/item_templates/258.json +197 -0
  67. melon_lua/data/item_templates/261.json +260 -0
  68. melon_lua/data/item_templates/262.json +172 -0
  69. melon_lua/data/item_templates/271.json +174 -0
  70. melon_lua/data/item_templates/272.json +149 -0
  71. melon_lua/data/item_templates/274.json +386 -0
  72. melon_lua/data/item_templates/278.json +114 -0
  73. melon_lua/data/item_templates/28.json +105 -0
  74. melon_lua/data/item_templates/3.json +133 -0
  75. melon_lua/data/item_templates/303.json +196 -0
  76. melon_lua/data/item_templates/316.json +89 -0
  77. melon_lua/data/item_templates/319.json +176 -0
  78. melon_lua/data/item_templates/32.json +173 -0
  79. melon_lua/data/item_templates/33.json +123 -0
  80. melon_lua/data/item_templates/436732224.json +148 -0
  81. melon_lua/data/item_templates/50.json +89 -0
  82. melon_lua/data/item_templates/53.json +201 -0
  83. melon_lua/data/item_templates/57.json +133 -0
  84. melon_lua/data/item_templates/62.json +111 -0
  85. melon_lua/data/item_templates/687931072.json +122 -0
  86. melon_lua/data/item_templates/758447808.json +193 -0
  87. melon_lua/data/item_templates/76.json +105 -0
  88. melon_lua/data/item_templates/87.json +191 -0
  89. melon_lua/data/item_templates/897581376.json +144 -0
  90. melon_lua/data/melon_objects.json +15446 -0
  91. melon_lua/data/object_physics.json +16273 -0
  92. melon_lua/data/object_physics_by_id.json +34900 -0
  93. melon_lua/data/sprites_by_object_id.json +2747 -0
  94. melon_lua/data/sprites_pack/images/0000_obj_plastic.png +0 -0
  95. melon_lua/data/sprites_pack/images/0001_Propeller.png +0 -0
  96. melon_lua/data/sprites_pack/images/0001_Propeller_plastic.png +0 -0
  97. melon_lua/data/sprites_pack/images/0002_Apple.png +0 -0
  98. melon_lua/data/sprites_pack/images/0003_Armchair.png +0 -0
  99. melon_lua/data/sprites_pack/images/0003_Armchair_plastic.png +0 -0
  100. melon_lua/data/sprites_pack/images/0004_Armor.png +0 -0
  101. melon_lua/data/sprites_pack/images/0004_Armor_atlas.png +0 -0
  102. melon_lua/data/sprites_pack/images/0005_Arrow_atlas.png +0 -0
  103. melon_lua/data/sprites_pack/images/0006_ArrowH_atlas.png +0 -0
  104. melon_lua/data/sprites_pack/images/0007_AutoPistol.png +0 -0
  105. melon_lua/data/sprites_pack/images/0007_AutoPistol_plastic.png +0 -0
  106. melon_lua/data/sprites_pack/images/0008_AutoRifle.png +0 -0
  107. melon_lua/data/sprites_pack/images/0008_AutoRifle_plastic.png +0 -0
  108. melon_lua/data/sprites_pack/images/0009_Ax.png +0 -0
  109. melon_lua/data/sprites_pack/images/0009_Ax_plastic.png +0 -0
  110. melon_lua/data/sprites_pack/images/0010_Wing.png +0 -0
  111. melon_lua/data/sprites_pack/images/0011_AxeHammer.png +0 -0
  112. melon_lua/data/sprites_pack/images/0011_AxeHammer_plastic.png +0 -0
  113. melon_lua/data/sprites_pack/images/0012_AxeHev.png +0 -0
  114. melon_lua/data/sprites_pack/images/0012_AxeHev_plastic.png +0 -0
  115. melon_lua/data/sprites_pack/images/0013_Ranger.png +0 -0
  116. melon_lua/data/sprites_pack/images/0013_Ranger_plastic.png +0 -0
  117. melon_lua/data/sprites_pack/images/0014_Balk.png +0 -0
  118. melon_lua/data/sprites_pack/images/0014_Balk_atlas.png +0 -0
  119. melon_lua/data/sprites_pack/images/0015_BalkShort.png +0 -0
  120. melon_lua/data/sprites_pack/images/0015_BalkShort_plastic.png +0 -0
  121. melon_lua/data/sprites_pack/images/0016_Balloon_plastic.png +0 -0
  122. melon_lua/data/sprites_pack/images/0017_Bandage.png +0 -0
  123. melon_lua/data/sprites_pack/images/0017_Bandage_plastic.png +0 -0
  124. melon_lua/data/sprites_pack/images/0018_Bat.png +0 -0
  125. melon_lua/data/sprites_pack/images/0018_Bat_atlas.png +0 -0
  126. melon_lua/data/sprites_pack/images/0019_Beard.png +0 -0
  127. melon_lua/data/sprites_pack/images/0019_Beard_plastic.png +0 -0
  128. melon_lua/data/sprites_pack/images/0020_Boots.png +0 -0
  129. melon_lua/data/sprites_pack/images/0020_Boots_plastic.png +0 -0
  130. melon_lua/data/sprites_pack/images/0021_Bottle.png +0 -0
  131. melon_lua/data/sprites_pack/images/0021_Bottle_atlas.png +0 -0
  132. melon_lua/data/sprites_pack/images/0022_Bowl.png +0 -0
  133. melon_lua/data/sprites_pack/images/0022_Bowl_plastic.png +0 -0
  134. melon_lua/data/sprites_pack/images/0023_Box.png +0 -0
  135. melon_lua/data/sprites_pack/images/0024_Brick.png +0 -0
  136. melon_lua/data/sprites_pack/images/0024_Brick_plastic.png +0 -0
  137. melon_lua/data/sprites_pack/images/0025_BrickWall.png +0 -0
  138. melon_lua/data/sprites_pack/images/0025_BrickWall_plastic.png +0 -0
  139. melon_lua/data/sprites_pack/images/0026_NuclearBomb.png +0 -0
  140. melon_lua/data/sprites_pack/images/0026_NuclearBomb_plastic.png +0 -0
  141. melon_lua/data/sprites_pack/images/0027_Bulgeon.png +0 -0
  142. melon_lua/data/sprites_pack/images/0027_Bulgeon_plastic.png +0 -0
  143. melon_lua/data/sprites_pack/images/0028_BulletproofVestHeavy.png +0 -0
  144. melon_lua/data/sprites_pack/images/0028_BulletproofVestHeavy_plastic.png +0 -0
  145. melon_lua/data/sprites_pack/images/0029_BulletproofVestLight.png +0 -0
  146. melon_lua/data/sprites_pack/images/0029_BulletproofVestLight_plastic.png +0 -0
  147. melon_lua/data/sprites_pack/images/0030_BulletproofVestMedium.png +0 -0
  148. melon_lua/data/sprites_pack/images/0030_BulletproofVestMedium_plastic.png +0 -0
  149. melon_lua/data/sprites_pack/images/0031_Business suit.png +0 -0
  150. melon_lua/data/sprites_pack/images/0031_Business suit_plastic.png +0 -0
  151. melon_lua/data/sprites_pack/images/0032_C4.png +0 -0
  152. melon_lua/data/sprites_pack/images/0032_C4_plastic.png +0 -0
  153. melon_lua/data/sprites_pack/images/0033_Lever.png +0 -0
  154. melon_lua/data/sprites_pack/images/0033_Lever_atlas.png +0 -0
  155. melon_lua/data/sprites_pack/images/0034_Cap.png +0 -0
  156. melon_lua/data/sprites_pack/images/0034_Cap_plastic.png +0 -0
  157. melon_lua/data/sprites_pack/images/0035_Chair.png +0 -0
  158. melon_lua/data/sprites_pack/images/0035_Chair_plastic.png +0 -0
  159. melon_lua/data/sprites_pack/images/0036_Christmas hat.png +0 -0
  160. melon_lua/data/sprites_pack/images/0036_Christmas hat_atlas.png +0 -0
  161. melon_lua/data/sprites_pack/images/0037_Club.png +0 -0
  162. melon_lua/data/sprites_pack/images/0037_Club_plastic.png +0 -0
  163. melon_lua/data/sprites_pack/images/0038_Corn.png +0 -0
  164. melon_lua/data/sprites_pack/images/0039_Crossbow.png +0 -0
  165. melon_lua/data/sprites_pack/images/0039_Crossbow_atlas.png +0 -0
  166. melon_lua/data/sprites_pack/images/0040_Cup.png +0 -0
  167. melon_lua/data/sprites_pack/images/0040_Cup_plastic.png +0 -0
  168. melon_lua/data/sprites_pack/images/0041_DirectBomb.png +0 -0
  169. melon_lua/data/sprites_pack/images/0041_DirectBomb_plastic.png +0 -0
  170. melon_lua/data/sprites_pack/images/0042_Desintegrator.png +0 -0
  171. melon_lua/data/sprites_pack/images/0042_Desintegrator_plastic.png +0 -0
  172. melon_lua/data/sprites_pack/images/0043_Dress.png +0 -0
  173. melon_lua/data/sprites_pack/images/0043_Dress_plastic.png +0 -0
  174. melon_lua/data/sprites_pack/images/0044_Revolver.png +0 -0
  175. melon_lua/data/sprites_pack/images/0044_Revolver_plastic.png +0 -0
  176. melon_lua/data/sprites_pack/images/0045_CircularSaw.png +0 -0
  177. melon_lua/data/sprites_pack/images/0045_CircularSaw_atlas.png +0 -0
  178. melon_lua/data/sprites_pack/images/0046_Extinguisher.png +0 -0
  179. melon_lua/data/sprites_pack/images/0046_Extinguisher_plastic.png +0 -0
  180. melon_lua/data/sprites_pack/images/0047_FlameThrower.png +0 -0
  181. melon_lua/data/sprites_pack/images/0047_FlameThrower_plastic.png +0 -0
  182. melon_lua/data/sprites_pack/images/0048_FlashGranade.png +0 -0
  183. melon_lua/data/sprites_pack/images/0048_FlashGranade_plastic.png +0 -0
  184. melon_lua/data/sprites_pack/images/0049_FragGranade.png +0 -0
  185. melon_lua/data/sprites_pack/images/0049_FragGranade_plastic.png +0 -0
  186. melon_lua/data/sprites_pack/images/0050_Glass.png +0 -0
  187. melon_lua/data/sprites_pack/images/0050_Glass_plastic.png +0 -0
  188. melon_lua/data/sprites_pack/images/0051_RocketLauncher.png +0 -0
  189. melon_lua/data/sprites_pack/images/0051_RocketLauncher_plastic.png +0 -0
  190. melon_lua/data/sprites_pack/images/0052_GranadeLauncher.png +0 -0
  191. melon_lua/data/sprites_pack/images/0052_GranadeLauncher_plastic.png +0 -0
  192. melon_lua/data/sprites_pack/images/0053_ButtonF.png +0 -0
  193. melon_lua/data/sprites_pack/images/0053_ButtonF_atlas.png +0 -0
  194. melon_lua/data/sprites_pack/images/0054_HammerHev.png +0 -0
  195. melon_lua/data/sprites_pack/images/0054_HammerHev_plastic.png +0 -0
  196. melon_lua/data/sprites_pack/images/0055_Hard hat.png +0 -0
  197. melon_lua/data/sprites_pack/images/0055_Hard hat_plastic.png +0 -0
  198. melon_lua/data/sprites_pack/images/0056_Hat.png +0 -0
  199. melon_lua/data/sprites_pack/images/0056_Hat_plastic.png +0 -0
  200. melon_lua/data/sprites_pack/images/0057_HeartMonitor.png +0 -0
  201. melon_lua/data/sprites_pack/images/0058_Helmet Medieval 1.png +0 -0
  202. melon_lua/data/sprites_pack/images/0058_Helmet Medieval 1_plastic.png +0 -0
  203. melon_lua/data/sprites_pack/images/0059_Helmet Medieval 2.png +0 -0
  204. melon_lua/data/sprites_pack/images/0059_Helmet Medieval 2_plastic.png +0 -0
  205. melon_lua/data/sprites_pack/images/0060_Helmet Medieval 3.png +0 -0
  206. melon_lua/data/sprites_pack/images/0060_Helmet Medieval 3_plastic.png +0 -0
  207. melon_lua/data/sprites_pack/images/0061_Helmet.png +0 -0
  208. melon_lua/data/sprites_pack/images/0061_Helmet_plastic.png +0 -0
  209. melon_lua/data/sprites_pack/images/0062_Human.png +0 -0
  210. melon_lua/data/sprites_pack/images/0062_Human_atlas.png +0 -0
  211. melon_lua/data/sprites_pack/images/0063_HumanA.png +0 -0
  212. melon_lua/data/sprites_pack/images/0064_HumanC.png +0 -0
  213. melon_lua/data/sprites_pack/images/0064_HumanC_atlas.png +0 -0
  214. melon_lua/data/sprites_pack/images/0065_PulseGun.png +0 -0
  215. melon_lua/data/sprites_pack/images/0065_PulseGun_plastic.png +0 -0
  216. melon_lua/data/sprites_pack/images/0066_HumanP.png +0 -0
  217. melon_lua/data/sprites_pack/images/0066_HumanP_atlas.png +0 -0
  218. melon_lua/data/sprites_pack/images/0067_Impact Grenade_plastic.png +0 -0
  219. melon_lua/data/sprites_pack/images/0068_Jeans.png +0 -0
  220. melon_lua/data/sprites_pack/images/0068_Jeans_plastic.png +0 -0
  221. melon_lua/data/sprites_pack/images/0069_Knife.png +0 -0
  222. melon_lua/data/sprites_pack/images/0070_LandMineMini.png +0 -0
  223. melon_lua/data/sprites_pack/images/0070_LandMineMini_plastic.png +0 -0
  224. melon_lua/data/sprites_pack/images/0071_Mace_plastic.png +0 -0
  225. melon_lua/data/sprites_pack/images/0072_Machete.png +0 -0
  226. melon_lua/data/sprites_pack/images/0072_Machete_plastic.png +0 -0
  227. melon_lua/data/sprites_pack/images/0073_MedicalHat.png +0 -0
  228. melon_lua/data/sprites_pack/images/0073_MedicalHat_plastic.png +0 -0
  229. melon_lua/data/sprites_pack/images/0074_Melon.png +0 -0
  230. melon_lua/data/sprites_pack/images/0075_MelonGibs_plastic.png +0 -0
  231. melon_lua/data/sprites_pack/images/0076_MetalRod.png +0 -0
  232. melon_lua/data/sprites_pack/images/0076_MetalRod_plastic.png +0 -0
  233. melon_lua/data/sprites_pack/images/0077_MilitaryHelmet.png +0 -0
  234. melon_lua/data/sprites_pack/images/0077_MilitaryHelmet_plastic.png +0 -0
  235. melon_lua/data/sprites_pack/images/0078_MilitaryHelmetMedical.png +0 -0
  236. melon_lua/data/sprites_pack/images/0078_MilitaryHelmetMedical_plastic.png +0 -0
  237. melon_lua/data/sprites_pack/images/0079_Minigun.png +0 -0
  238. melon_lua/data/sprites_pack/images/0079_Minigun_plastic.png +0 -0
  239. melon_lua/data/sprites_pack/images/0080_Molotov.png +0 -0
  240. melon_lua/data/sprites_pack/images/0080_Molotov_plastic.png +0 -0
  241. melon_lua/data/sprites_pack/images/0081_Melon cooler.png +0 -0
  242. melon_lua/data/sprites_pack/images/0081_Melon cooler_atlas.png +0 -0
  243. melon_lua/data/sprites_pack/images/0082_Mask_atlas.png +0 -0
  244. melon_lua/data/sprites_pack/images/0083_MPM.png +0 -0
  245. melon_lua/data/sprites_pack/images/0083_MPM_plastic.png +0 -0
  246. melon_lua/data/sprites_pack/images/0084_Pads.png +0 -0
  247. melon_lua/data/sprites_pack/images/0084_Pads_atlas.png +0 -0
  248. melon_lua/data/sprites_pack/images/0085_Pickaxe.png +0 -0
  249. melon_lua/data/sprites_pack/images/0085_Pickaxe_plastic.png +0 -0
  250. melon_lua/data/sprites_pack/images/0086_Pistol.png +0 -0
  251. melon_lua/data/sprites_pack/images/0086_Pistol_plastic.png +0 -0
  252. melon_lua/data/sprites_pack/images/0087_Plate.png +0 -0
  253. melon_lua/data/sprites_pack/images/0087_Plate_plastic.png +0 -0
  254. melon_lua/data/sprites_pack/images/0088_Present.png +0 -0
  255. melon_lua/data/sprites_pack/images/0089_ProtoGun.png +0 -0
  256. melon_lua/data/sprites_pack/images/0089_ProtoGun_plastic.png +0 -0
  257. melon_lua/data/sprites_pack/images/0090_Pumpkin.png +0 -0
  258. melon_lua/data/sprites_pack/images/0091_PumpkinGibs_atlas.png +0 -0
  259. melon_lua/data/sprites_pack/images/0092_PushGranade.png +0 -0
  260. melon_lua/data/sprites_pack/images/0092_PushGranade_plastic.png +0 -0
  261. melon_lua/data/sprites_pack/images/0093_Railgun.png +0 -0
  262. melon_lua/data/sprites_pack/images/0093_Railgun_plastic.png +0 -0
  263. melon_lua/data/sprites_pack/images/0094_Ring.png +0 -0
  264. melon_lua/data/sprites_pack/images/0095_SawedOff.png +0 -0
  265. melon_lua/data/sprites_pack/images/0095_SawedOff_plastic.png +0 -0
  266. melon_lua/data/sprites_pack/images/0096_Sunglasses_plastic.png +0 -0
  267. melon_lua/data/sprites_pack/images/0097_Shoes.png +0 -0
  268. melon_lua/data/sprites_pack/images/0097_Shoes_atlas.png +0 -0
  269. melon_lua/data/sprites_pack/images/0098_Sniper.png +0 -0
  270. melon_lua/data/sprites_pack/images/0098_Sniper_plastic.png +0 -0
  271. melon_lua/data/sprites_pack/images/0099_SnowMan_plastic.png +0 -0
  272. melon_lua/data/sprites_pack/images/0100_Spas.png +0 -0
  273. melon_lua/data/sprites_pack/images/0100_Spas_atlas.png +0 -0
  274. melon_lua/data/sprites_pack/images/0101_Spear.png +0 -0
  275. melon_lua/data/sprites_pack/images/0101_Spear_atlas.png +0 -0
  276. melon_lua/data/sprites_pack/images/0102_Splint.png +0 -0
  277. melon_lua/data/sprites_pack/images/0102_Splint_plastic.png +0 -0
  278. melon_lua/data/sprites_pack/images/0103_FreezeStaff.png +0 -0
  279. melon_lua/data/sprites_pack/images/0103_FreezeStaff_plastic.png +0 -0
  280. melon_lua/data/sprites_pack/images/0104_StickyBomb.png +0 -0
  281. melon_lua/data/sprites_pack/images/0104_StickyBomb_plastic.png +0 -0
  282. melon_lua/data/sprites_pack/images/0105_Sword.png +0 -0
  283. melon_lua/data/sprites_pack/images/0105_Sword_plastic.png +0 -0
  284. melon_lua/data/sprites_pack/images/0106_SyringeAcid.png +0 -0
  285. melon_lua/data/sprites_pack/images/0106_SyringeAcid_plastic.png +0 -0
  286. melon_lua/data/sprites_pack/images/0107_SyringeFireproof.png +0 -0
  287. melon_lua/data/sprites_pack/images/0107_SyringeFireproof_plastic.png +0 -0
  288. melon_lua/data/sprites_pack/images/0108_SyringeHeal.png +0 -0
  289. melon_lua/data/sprites_pack/images/0108_SyringeHeal_plastic.png +0 -0
  290. melon_lua/data/sprites_pack/images/0109_SyringeImmortal.png +0 -0
  291. melon_lua/data/sprites_pack/images/0109_SyringeImmortal_plastic.png +0 -0
  292. melon_lua/data/sprites_pack/images/0110_SyringeRegen.png +0 -0
  293. melon_lua/data/sprites_pack/images/0110_SyringeRegen_plastic.png +0 -0
  294. melon_lua/data/sprites_pack/images/0111_SyringeVirus.png +0 -0
  295. melon_lua/data/sprites_pack/images/0111_SyringeVirus_plastic.png +0 -0
  296. melon_lua/data/sprites_pack/images/0112_SyringeWater.png +0 -0
  297. melon_lua/data/sprites_pack/images/0112_SyringeWater_plastic.png +0 -0
  298. melon_lua/data/sprites_pack/images/0113_T-shirt.png +0 -0
  299. melon_lua/data/sprites_pack/images/0113_T-shirt_plastic.png +0 -0
  300. melon_lua/data/sprites_pack/images/0114_Table.png +0 -0
  301. melon_lua/data/sprites_pack/images/0114_Table_plastic.png +0 -0
  302. melon_lua/data/sprites_pack/images/0115_Tea box.png +0 -0
  303. melon_lua/data/sprites_pack/images/0115_Tea box_plastic.png +0 -0
  304. melon_lua/data/sprites_pack/images/0116_Tokarev.png +0 -0
  305. melon_lua/data/sprites_pack/images/0116_Tokarev_plastic.png +0 -0
  306. melon_lua/data/sprites_pack/images/0117_TrapMain.png +0 -0
  307. melon_lua/data/sprites_pack/images/0117_TrapMain_plastic.png +0 -0
  308. melon_lua/data/sprites_pack/images/0118_Trousers.png +0 -0
  309. melon_lua/data/sprites_pack/images/0118_Trousers_plastic.png +0 -0
  310. melon_lua/data/sprites_pack/images/0119_Watergun.png +0 -0
  311. melon_lua/data/sprites_pack/images/0119_Watergun_atlas.png +0 -0
  312. melon_lua/data/sprites_pack/images/0120_Weight.png +0 -0
  313. melon_lua/data/sprites_pack/images/0121_Wheel.png +0 -0
  314. melon_lua/data/sprites_pack/images/0121_Wheel_plastic.png +0 -0
  315. melon_lua/data/sprites_pack/images/0122_Wooden lath.png +0 -0
  316. melon_lua/data/sprites_pack/images/0122_Wooden lath_plastic.png +0 -0
  317. melon_lua/data/sprites_pack/images/0123_WoodenBarel.png +0 -0
  318. melon_lua/data/sprites_pack/images/0123_WoodenBarel_plastic.png +0 -0
  319. melon_lua/data/sprites_pack/images/0124_Sunglasses_plastic.png +0 -0
  320. melon_lua/data/sprites_pack/images/0125_WoodenStick.png +0 -0
  321. melon_lua/data/sprites_pack/images/0125_WoodenStick_plastic.png +0 -0
  322. melon_lua/data/sprites_pack/images/0126_Camouflage pants.png +0 -0
  323. melon_lua/data/sprites_pack/images/0126_Camouflage pants_plastic.png +0 -0
  324. melon_lua/data/sprites_pack/images/0127_Camouflage suit.png +0 -0
  325. melon_lua/data/sprites_pack/images/0127_Camouflage suit_plastic.png +0 -0
  326. melon_lua/data/sprites_pack/images/0128_Construction vest.png +0 -0
  327. melon_lua/data/sprites_pack/images/0128_Construction vest_plastic.png +0 -0
  328. melon_lua/data/sprites_pack/images/0129_Teapot.png +0 -0
  329. melon_lua/data/sprites_pack/images/0129_Teapot_plastic.png +0 -0
  330. melon_lua/data/sprites_pack/images/0130_Gyroscope.png +0 -0
  331. melon_lua/data/sprites_pack/images/0130_Gyroscope_plastic.png +0 -0
  332. melon_lua/data/sprites_pack/images/0131_ElectroMotor.png +0 -0
  333. melon_lua/data/sprites_pack/images/0131_ElectroMotor_plastic.png +0 -0
  334. melon_lua/data/sprites_pack/images/0132_Thruster.png +0 -0
  335. melon_lua/data/sprites_pack/images/0132_Thruster_plastic.png +0 -0
  336. melon_lua/data/sprites_pack/images/0133_Piston.png +0 -0
  337. melon_lua/data/sprites_pack/images/0133_Piston_plastic.png +0 -0
  338. melon_lua/data/sprites_pack/images/0134_Button.png +0 -0
  339. melon_lua/data/sprites_pack/images/0134_Button_atlas.png +0 -0
  340. melon_lua/data/sprites_pack/images/0135_CupThrower.png +0 -0
  341. melon_lua/data/sprites_pack/images/0135_CupThrower_plastic.png +0 -0
  342. melon_lua/data/sprites_pack/images/0136_Turret.png +0 -0
  343. melon_lua/data/sprites_pack/images/0136_Turret_plastic.png +0 -0
  344. melon_lua/data/sprites_pack/images/0137_ResizableCamoGreen.png +0 -0
  345. melon_lua/data/sprites_pack/images/0137_ResizableCamoGreen_plastic.png +0 -0
  346. melon_lua/data/sprites_pack/images/0138_ResizableCamoGrey.png +0 -0
  347. melon_lua/data/sprites_pack/images/0138_ResizableCamoGrey_plastic.png +0 -0
  348. melon_lua/data/sprites_pack/images/0139_ResizableCamoYellow.png +0 -0
  349. melon_lua/data/sprites_pack/images/0139_ResizableCamoYellow_plastic.png +0 -0
  350. melon_lua/data/sprites_pack/images/0140_ResizableMetal.png +0 -0
  351. melon_lua/data/sprites_pack/images/0140_ResizableMetal_plastic.png +0 -0
  352. melon_lua/data/sprites_pack/images/0141_ResizableWood.png +0 -0
  353. melon_lua/data/sprites_pack/images/0141_ResizableWood_plastic.png +0 -0
  354. melon_lua/data/sprites_pack/images/0142_ToolGun.png +0 -0
  355. melon_lua/data/sprites_pack/images/0142_ToolGun_plastic.png +0 -0
  356. melon_lua/data/sprites_pack/images/0143_Sunglasses.png +0 -0
  357. melon_lua/data/sprites_pack/images/0143_Sunglasses_plastic.png +0 -0
  358. melon_lua/data/sprites_pack/images/0144_Mask.png +0 -0
  359. melon_lua/data/sprites_pack/images/0144_Mask_atlas.png +0 -0
  360. melon_lua/data/sprites_pack/images/0145_Toy1_plastic.png +0 -0
  361. melon_lua/data/sprites_pack/images/0146_Toy2_plastic.png +0 -0
  362. melon_lua/data/sprites_pack/images/0147_Toy3_plastic.png +0 -0
  363. melon_lua/data/sprites_pack/images/0148_Toy4_plastic.png +0 -0
  364. melon_lua/data/sprites_pack/images/0149_Toy5_plastic.png +0 -0
  365. melon_lua/data/sprites_pack/images/0150_Toy6_plastic.png +0 -0
  366. melon_lua/data/sprites_pack/images/0151_Toy7_plastic.png +0 -0
  367. melon_lua/data/sprites_pack/images/0152_Toy8_plastic.png +0 -0
  368. melon_lua/data/sprites_pack/images/0153_Parachute.png +0 -0
  369. melon_lua/data/sprites_pack/images/0153_Parachute_plastic.png +0 -0
  370. melon_lua/data/sprites_pack/images/0154_LimbConnector.png +0 -0
  371. melon_lua/data/sprites_pack/images/0154_LimbConnector_plastic.png +0 -0
  372. melon_lua/data/sprites_pack/images/0155_ResizableCamoSand.png +0 -0
  373. melon_lua/data/sprites_pack/images/0155_ResizableCamoSand_plastic.png +0 -0
  374. melon_lua/data/sprites_pack/images/0156_SpaceSuit.png +0 -0
  375. melon_lua/data/sprites_pack/images/0156_SpaceSuit_plastic.png +0 -0
  376. melon_lua/data/sprites_pack/images/0157_SpaceHelmet.png +0 -0
  377. melon_lua/data/sprites_pack/images/0157_SpaceHelmet_plastic.png +0 -0
  378. melon_lua/data/sprites_pack/images/0158_Cactus.png +0 -0
  379. melon_lua/data/sprites_pack/images/0159_Jeep.png +0 -0
  380. melon_lua/data/sprites_pack/images/0159_Jeep_plastic.png +0 -0
  381. melon_lua/data/sprites_pack/images/0160_SportsShorts.png +0 -0
  382. melon_lua/data/sprites_pack/images/0160_SportsShorts_plastic.png +0 -0
  383. melon_lua/data/sprites_pack/images/0161_BasketballBall.png +0 -0
  384. melon_lua/data/sprites_pack/images/0161_BasketballBall_plastic.png +0 -0
  385. melon_lua/data/sprites_pack/images/0162_BasketballHoop.png +0 -0
  386. melon_lua/data/sprites_pack/images/0162_BasketballHoop_plastic.png +0 -0
  387. melon_lua/data/sprites_pack/images/0163_FootballBall.png +0 -0
  388. melon_lua/data/sprites_pack/images/0163_FootballBall_plastic.png +0 -0
  389. melon_lua/data/sprites_pack/images/0164_FootballGoal.png +0 -0
  390. melon_lua/data/sprites_pack/images/0164_FootballGoal_plastic.png +0 -0
  391. melon_lua/data/sprites_pack/images/0165_TennisBall.png +0 -0
  392. melon_lua/data/sprites_pack/images/0165_TennisBall_plastic.png +0 -0
  393. melon_lua/data/sprites_pack/images/0166_TennisRacket.png +0 -0
  394. melon_lua/data/sprites_pack/images/0166_TennisRacket_plastic.png +0 -0
  395. melon_lua/data/sprites_pack/images/0167_HumanRobot_plastic.png +0 -0
  396. melon_lua/data/sprites_pack/images/0168_AxeHev_B.png +0 -0
  397. melon_lua/data/sprites_pack/images/0168_AxeHev_B_plastic.png +0 -0
  398. melon_lua/data/sprites_pack/images/0169_Pistol_B.png +0 -0
  399. melon_lua/data/sprites_pack/images/0169_Pistol_B_plastic.png +0 -0
  400. melon_lua/data/sprites_pack/images/0170_Revolver_B.png +0 -0
  401. melon_lua/data/sprites_pack/images/0170_Revolver_B_plastic.png +0 -0
  402. melon_lua/data/sprites_pack/images/0171_Sword_B.png +0 -0
  403. melon_lua/data/sprites_pack/images/0171_Sword_B_plastic.png +0 -0
  404. melon_lua/data/sprites_pack/images/0172_BTR_Vehicle.png +0 -0
  405. melon_lua/data/sprites_pack/images/0172_BTR_Vehicle_plastic.png +0 -0
  406. melon_lua/data/sprites_pack/images/0173_LaserGun.png +0 -0
  407. melon_lua/data/sprites_pack/images/0173_LaserGun_plastic.png +0 -0
  408. melon_lua/data/sprites_pack/images/0174_ScooterVehicle.png +0 -0
  409. melon_lua/data/sprites_pack/images/0174_ScooterVehicle_plastic.png +0 -0
  410. melon_lua/data/sprites_pack/images/0175_PaintballGun.png +0 -0
  411. melon_lua/data/sprites_pack/images/0175_PaintballGun_plastic.png +0 -0
  412. melon_lua/data/sprites_pack/images/0176_StreetLight.png +0 -0
  413. melon_lua/data/sprites_pack/images/0176_StreetLight_plastic.png +0 -0
  414. melon_lua/data/sprites_pack/images/0177_FlashLight.png +0 -0
  415. melon_lua/data/sprites_pack/images/0177_FlashLight_plastic.png +0 -0
  416. melon_lua/data/sprites_pack/images/0178_EdisonLamp.png +0 -0
  417. melon_lua/data/sprites_pack/images/0178_EdisonLamp_plastic.png +0 -0
  418. melon_lua/data/sprites_pack/images/0179_CandleLight.png +0 -0
  419. melon_lua/data/sprites_pack/images/0179_CandleLight_atlas.png +0 -0
  420. melon_lua/data/sprites_pack/images/0180_Candlestick.png +0 -0
  421. melon_lua/data/sprites_pack/images/0180_Candlestick_plastic.png +0 -0
  422. melon_lua/data/sprites_pack/images/0181_FestoonLight.png +0 -0
  423. melon_lua/data/sprites_pack/images/0181_FestoonLight_plastic.png +0 -0
  424. melon_lua/data/sprites_pack/images/0182_Firework.png +0 -0
  425. melon_lua/data/sprites_pack/images/0182_Firework_plastic.png +0 -0
  426. melon_lua/data/sprites_pack/images/0183_Cake.png +0 -0
  427. melon_lua/data/sprites_pack/images/0183_Cake_plastic.png +0 -0
  428. melon_lua/data/sprites_pack/images/0184_ContraptionSpawner.png +0 -0
  429. melon_lua/data/sprites_pack/images/0184_ContraptionSpawner_plastic.png +0 -0
  430. melon_lua/data/sprites_pack/images/0185_VacuumCleaner.png +0 -0
  431. melon_lua/data/sprites_pack/images/0185_VacuumCleaner_plastic.png +0 -0
  432. melon_lua/data/sprites_pack/images/0186_HumanCactus.png +0 -0
  433. melon_lua/data/sprites_pack/images/0186_HumanCactus_atlas.png +0 -0
  434. melon_lua/data/sprites_pack/images/0187_HalloweenPumpkin.png +0 -0
  435. melon_lua/data/sprites_pack/images/0187_HalloweenPumpkin_plastic.png +0 -0
  436. melon_lua/data/sprites_pack/images/0188_RabbitHat.png +0 -0
  437. melon_lua/data/sprites_pack/images/0188_RabbitHat_plastic.png +0 -0
  438. melon_lua/data/sprites_pack/images/0189_RabbitCostume.png +0 -0
  439. melon_lua/data/sprites_pack/images/0189_RabbitCostume_plastic.png +0 -0
  440. melon_lua/data/sprites_pack/images/0190_WitchHat.png +0 -0
  441. melon_lua/data/sprites_pack/images/0190_WitchHat_plastic.png +0 -0
  442. melon_lua/data/sprites_pack/images/0191_FairyWings.png +0 -0
  443. melon_lua/data/sprites_pack/images/0191_FairyWings_plastic.png +0 -0
  444. melon_lua/data/sprites_pack/images/0192_Bus.png +0 -0
  445. melon_lua/data/sprites_pack/images/0193_Spruce.png +0 -0
  446. melon_lua/data/sprites_pack/images/0193_Spruce_atlas.png +0 -0
  447. melon_lua/data/sprites_pack/images/0194_KefiaFull.png +0 -0
  448. melon_lua/data/sprites_pack/images/0194_KefiaFull_plastic.png +0 -0
  449. melon_lua/data/sprites_pack/images/0195_KefiaPartial.png +0 -0
  450. melon_lua/data/sprites_pack/images/0195_KefiaPartial_plastic.png +0 -0
  451. melon_lua/data/sprites_pack/images/0196_Shirt.png +0 -0
  452. melon_lua/data/sprites_pack/images/0196_Shirt_plastic.png +0 -0
  453. melon_lua/data/sprites_pack/images/0197_Santa_Costume.png +0 -0
  454. melon_lua/data/sprites_pack/images/0197_Santa_Costume_plastic.png +0 -0
  455. melon_lua/data/sprites_pack/images/0198_ElfHat.png +0 -0
  456. melon_lua/data/sprites_pack/images/0198_ElfHat_plastic.png +0 -0
  457. melon_lua/data/sprites_pack/images/0199_ElfCostume.png +0 -0
  458. melon_lua/data/sprites_pack/images/0199_ElfCostume_plastic.png +0 -0
  459. melon_lua/data/sprites_pack/images/0200_Sweater.png +0 -0
  460. melon_lua/data/sprites_pack/images/0200_Sweater_atlas.png +0 -0
  461. melon_lua/data/sprites_pack/images/0201_ResizableConcrete.png +0 -0
  462. melon_lua/data/sprites_pack/images/0201_ResizableConcrete_plastic.png +0 -0
  463. melon_lua/data/sprites_pack/images/0202_ResizablePlastic.png +0 -0
  464. melon_lua/data/sprites_pack/images/0202_ResizablePlastic_plastic.png +0 -0
  465. melon_lua/data/sprites_pack/images/0202_plastic_fallback.png +0 -0
  466. melon_lua/data/sprites_pack/images/0203_RedCoat.png +0 -0
  467. melon_lua/data/sprites_pack/images/0203_RedCoat_plastic.png +0 -0
  468. melon_lua/data/sprites_pack/images/0204_FurCoat.png +0 -0
  469. melon_lua/data/sprites_pack/images/0204_FurCoat_plastic.png +0 -0
  470. melon_lua/data/sprites_pack/images/0205_ResizableBrick.png +0 -0
  471. melon_lua/data/sprites_pack/images/0205_ResizableBrick_plastic.png +0 -0
  472. melon_lua/data/sprites_pack/images/0206_WinterJacket.png +0 -0
  473. melon_lua/data/sprites_pack/images/0206_WinterJacket_plastic.png +0 -0
  474. melon_lua/data/sprites_pack/images/0207_WinterCoat.png +0 -0
  475. melon_lua/data/sprites_pack/images/0207_WinterCoat_plastic.png +0 -0
  476. melon_lua/data/sprites_pack/images/0208_WinterSocks.png +0 -0
  477. melon_lua/data/sprites_pack/images/0208_WinterSocks_plastic.png +0 -0
  478. melon_lua/data/sprites_pack/images/0209_WarmPants.png +0 -0
  479. melon_lua/data/sprites_pack/images/0209_WarmPants_plastic.png +0 -0
  480. melon_lua/data/sprites_pack/images/0210_PompomHat.png +0 -0
  481. melon_lua/data/sprites_pack/images/0210_PompomHat_plastic.png +0 -0
  482. melon_lua/data/sprites_pack/images/0211_WinterBoots.png +0 -0
  483. melon_lua/data/sprites_pack/images/0211_WinterBoots_plastic.png +0 -0
  484. melon_lua/data/sprites_pack/images/0212_PilotHat.png +0 -0
  485. melon_lua/data/sprites_pack/images/0212_PilotHat_plastic.png +0 -0
  486. melon_lua/data/sprites_pack/images/0213_Truck.png +0 -0
  487. melon_lua/data/sprites_pack/images/0213_Truck_plastic.png +0 -0
  488. melon_lua/data/sprites_pack/images/0214_HumanTomato.png +0 -0
  489. melon_lua/data/sprites_pack/images/0214_HumanTomato_plastic.png +0 -0
  490. melon_lua/data/sprites_pack/images/0215_Thing_plastic.png +0 -0
  491. melon_lua/data/sprites_pack/images/0216_AppleTree.png +0 -0
  492. melon_lua/data/sprites_pack/images/0216_AppleTree_plastic.png +0 -0
  493. melon_lua/data/sprites_pack/images/0217_Tree.png +0 -0
  494. melon_lua/data/sprites_pack/images/0218_Bush.png +0 -0
  495. melon_lua/data/sprites_pack/images/0218_Bush_plastic.png +0 -0
  496. melon_lua/data/sprites_pack/images/0219_Palm.png +0 -0
  497. melon_lua/data/sprites_pack/images/0219_Palm_plastic.png +0 -0
  498. melon_lua/data/sprites_pack/images/0220_SpruceBig.png +0 -0
  499. melon_lua/data/sprites_pack/images/0220_SpruceBig_plastic.png +0 -0
  500. melon_lua/data/sprites_pack/images/0221_FireStaff.png +0 -0
  501. melon_lua/data/sprites_pack/images/0221_FireStaff_plastic.png +0 -0
  502. melon_lua/data/sprites_pack/images/0222_TriplexGlass.png +0 -0
  503. melon_lua/data/sprites_pack/images/0222_TriplexGlass_plastic.png +0 -0
  504. melon_lua/data/sprites_pack/images/0223_ResizableGothicBrick.png +0 -0
  505. melon_lua/data/sprites_pack/images/0223_ResizableGothicBrick_plastic.png +0 -0
  506. melon_lua/data/sprites_pack/images/0224_LogSide.png +0 -0
  507. melon_lua/data/sprites_pack/images/0224_LogSide_plastic.png +0 -0
  508. melon_lua/data/sprites_pack/images/0225_LogFront.png +0 -0
  509. melon_lua/data/sprites_pack/images/0225_LogFront_plastic.png +0 -0
  510. melon_lua/data/sprites_pack/images/0226_Cobblestone.png +0 -0
  511. melon_lua/data/sprites_pack/images/0226_Cobblestone_plastic.png +0 -0
  512. melon_lua/data/sprites_pack/images/0227_FuelBarrel1.png +0 -0
  513. melon_lua/data/sprites_pack/images/0227_FuelBarrel1_plastic.png +0 -0
  514. melon_lua/data/sprites_pack/images/0228_FuelBarrel2.png +0 -0
  515. melon_lua/data/sprites_pack/images/0228_FuelBarrel2_plastic.png +0 -0
  516. melon_lua/data/sprites_pack/images/0229_Generator.png +0 -0
  517. melon_lua/data/sprites_pack/images/0229_Generator_plastic.png +0 -0
  518. melon_lua/data/sprites_pack/images/0230_Adapter.png +0 -0
  519. melon_lua/data/sprites_pack/images/0230_Adapter_plastic.png +0 -0
  520. melon_lua/data/sprites_pack/images/0231_SyringeElectricityProtection.png +0 -0
  521. melon_lua/data/sprites_pack/images/0231_SyringeElectricityProtection_plastic.png +0 -0
  522. melon_lua/data/sprites_pack/images/0232_DuckNeon.png +0 -0
  523. melon_lua/data/sprites_pack/images/0232_DuckNeon_plastic.png +0 -0
  524. melon_lua/data/sprites_pack/images/0233_GlowLabel.png +0 -0
  525. melon_lua/data/sprites_pack/images/0233_GlowLabel_plastic.png +0 -0
  526. melon_lua/data/sprites_pack/images/0234_MelonNeon.png +0 -0
  527. melon_lua/data/sprites_pack/images/0234_MelonNeon_atlas.png +0 -0
  528. melon_lua/data/sprites_pack/images/0235_WatermelonNeon.png +0 -0
  529. melon_lua/data/sprites_pack/images/0235_WatermelonNeon_plastic.png +0 -0
  530. melon_lua/data/sprites_pack/images/0236_SyringeEmbalming.png +0 -0
  531. melon_lua/data/sprites_pack/images/0236_SyringeEmbalming_plastic.png +0 -0
  532. melon_lua/data/sprites_pack/images/0237_SyringeDamageResist.png +0 -0
  533. melon_lua/data/sprites_pack/images/0237_SyringeDamageResist_plastic.png +0 -0
  534. melon_lua/data/sprites_pack/images/0238_FreezeGrenade.png +0 -0
  535. melon_lua/data/sprites_pack/images/0238_FreezeGrenade_plastic.png +0 -0
  536. melon_lua/data/sprites_pack/images/0239_SyringeJointDiluent.png +0 -0
  537. melon_lua/data/sprites_pack/images/0239_SyringeJointDiluent_plastic.png +0 -0
  538. melon_lua/data/sprites_pack/images/0240_DarkStaff.png +0 -0
  539. melon_lua/data/sprites_pack/images/0240_DarkStaff_plastic.png +0 -0
  540. melon_lua/data/sprites_pack/images/0241_SmokeGrenade.png +0 -0
  541. melon_lua/data/sprites_pack/images/0241_SmokeGrenade_plastic.png +0 -0
  542. melon_lua/data/sprites_pack/images/0242_GasGrenade.png +0 -0
  543. melon_lua/data/sprites_pack/images/0242_GasGrenade_plastic.png +0 -0
  544. melon_lua/data/sprites_pack/images/0243_FragmentionGrenade.png +0 -0
  545. melon_lua/data/sprites_pack/images/0243_FragmentionGrenade_plastic.png +0 -0
  546. melon_lua/data/sprites_pack/images/0244_HumanDragonFruit_plastic.png +0 -0
  547. melon_lua/data/sprites_pack/images/0245_HumanDragonFruitNew.png +0 -0
  548. melon_lua/data/sprites_pack/images/0245_HumanDragonFruitNew_plastic.png +0 -0
  549. melon_lua/data/sprites_pack/images/0246_Door.png +0 -0
  550. melon_lua/data/sprites_pack/images/0246_Door_plastic.png +0 -0
  551. melon_lua/data/sprites_pack/images/0247_Grabber.png +0 -0
  552. melon_lua/data/sprites_pack/images/0247_Grabber_plastic.png +0 -0
  553. melon_lua/data/sprites_pack/images/0248_VPchip.png +0 -0
  554. melon_lua/data/sprites_pack/images/0248_VPchip_plastic.png +0 -0
  555. melon_lua/data/sprites_pack/images/0249_VPchipTutorial1.png +0 -0
  556. melon_lua/data/sprites_pack/images/0249_VPchipTutorial1_plastic.png +0 -0
  557. melon_lua/data/sprites_pack/images/0250_VPchipTutorial2.png +0 -0
  558. melon_lua/data/sprites_pack/images/0250_VPchipTutorial2_plastic.png +0 -0
  559. melon_lua/data/sprites_pack/images/0251_VPchipTutorial3.png +0 -0
  560. melon_lua/data/sprites_pack/images/0251_VPchipTutorial3_plastic.png +0 -0
  561. melon_lua/data/sprites_pack/images/0252_Trigger.png +0 -0
  562. melon_lua/data/sprites_pack/images/0252_Trigger_plastic.png +0 -0
  563. melon_lua/data/sprites_pack/images/0253_Timer.png +0 -0
  564. melon_lua/data/sprites_pack/images/0253_Timer_atlas.png +0 -0
  565. melon_lua/data/sprites_pack/images/0254_ContextActivator.png +0 -0
  566. melon_lua/data/sprites_pack/images/0254_ContextActivator_plastic.png +0 -0
  567. melon_lua/data/sprites_pack/images/0255_ElectricBaton.png +0 -0
  568. melon_lua/data/sprites_pack/images/0255_ElectricBaton_plastic.png +0 -0
  569. melon_lua/data/sprites_pack/images/0256_CameraDevice.png +0 -0
  570. melon_lua/data/sprites_pack/images/0256_CameraDevice_atlas.png +0 -0
  571. melon_lua/data/sprites_pack/images/0257_ScreenDevice.png +0 -0
  572. melon_lua/data/sprites_pack/images/0257_ScreenDevice_plastic.png +0 -0
  573. melon_lua/data/sprites_pack/images/0258_Radio.png +0 -0
  574. melon_lua/data/sprites_pack/images/0259_StunGun.png +0 -0
  575. melon_lua/data/sprites_pack/images/0259_StunGun_plastic.png +0 -0
  576. melon_lua/data/sprites_pack/images/0260_Helicopter.png +0 -0
  577. melon_lua/data/sprites_pack/images/0260_Helicopter_plastic.png +0 -0
  578. melon_lua/data/sprites_pack/images/0261_ScreenTextDevice.png +0 -0
  579. melon_lua/data/sprites_pack/images/0261_ScreenTextDevice_plastic.png +0 -0
  580. melon_lua/data/sprites_pack/images/0262_Synthesizer.png +0 -0
  581. melon_lua/data/sprites_pack/images/0262_Synthesizer_plastic.png +0 -0
  582. melon_lua/data/sprites_pack/images/0263_SyringeRegrowth.png +0 -0
  583. melon_lua/data/sprites_pack/images/0263_SyringeRegrowth_plastic.png +0 -0
  584. melon_lua/data/sprites_pack/images/0264_GasMask.png +0 -0
  585. melon_lua/data/sprites_pack/images/0264_GasMask_plastic.png +0 -0
  586. melon_lua/data/sprites_pack/images/0265_DragonFruit.png +0 -0
  587. melon_lua/data/sprites_pack/images/0265_DragonFruit_plastic.png +0 -0
  588. melon_lua/data/sprites_pack/images/0266_Icicle.png +0 -0
  589. melon_lua/data/sprites_pack/images/0266_Icicle_atlas.png +0 -0
  590. melon_lua/data/sprites_pack/images/0267_TomatoCan.png +0 -0
  591. melon_lua/data/sprites_pack/images/0267_TomatoCan_plastic.png +0 -0
  592. melon_lua/data/sprites_pack/images/0268_HumanRobotLivingMetal.png +0 -0
  593. melon_lua/data/sprites_pack/images/0268_HumanRobotLivingMetal_atlas.png +0 -0
  594. melon_lua/data/sprites_pack/images/0269_Snowblock.png +0 -0
  595. melon_lua/data/sprites_pack/images/0269_Snowblock_plastic.png +0 -0
  596. melon_lua/data/sprites_pack/images/0270_SnowMan2024.png +0 -0
  597. melon_lua/data/sprites_pack/images/0270_SnowMan2024_plastic.png +0 -0
  598. melon_lua/data/sprites_pack/images/0271_FreezeGun.png +0 -0
  599. melon_lua/data/sprites_pack/images/0271_FreezeGun_plastic.png +0 -0
  600. melon_lua/data/sprites_pack/images/0272_ImpulseThruster.png +0 -0
  601. melon_lua/data/sprites_pack/images/0272_ImpulseThruster_plastic.png +0 -0
  602. melon_lua/data/sprites_pack/images/0273_DirectionalEngineOld_plastic.png +0 -0
  603. melon_lua/data/sprites_pack/images/0274_WeightingAgent.png +0 -0
  604. melon_lua/data/sprites_pack/images/0274_WeightingAgent_plastic.png +0 -0
  605. melon_lua/data/sprites_pack/images/0275_Magnet.png +0 -0
  606. melon_lua/data/sprites_pack/images/0275_Magnet_atlas.png +0 -0
  607. melon_lua/data/sprites_pack/images/0276_DamageSensor.png +0 -0
  608. melon_lua/data/sprites_pack/images/0276_DamageSensor_plastic.png +0 -0
  609. melon_lua/data/sprites_pack/images/0277_ExplosiveCharge.png +0 -0
  610. melon_lua/data/sprites_pack/images/0277_ExplosiveCharge_plastic.png +0 -0
  611. melon_lua/data/sprites_pack/images/0278_BubbleLevel.png +0 -0
  612. melon_lua/data/sprites_pack/images/0278_BubbleLevel_plastic.png +0 -0
  613. melon_lua/data/sprites_pack/images/0279_Nanoassembler.png +0 -0
  614. melon_lua/data/sprites_pack/images/0279_Nanoassembler_plastic.png +0 -0
  615. melon_lua/data/sprites_pack/images/0280_Brick golem_plastic.png +0 -0
  616. melon_lua/data/sprites_pack/images/0281_Ceramic golem_plastic.png +0 -0
  617. melon_lua/data/sprites_pack/images/0282_Glass golem_plastic.png +0 -0
  618. melon_lua/data/sprites_pack/images/0283_Iron golem_plastic.png +0 -0
  619. melon_lua/data/sprites_pack/images/0284_Plastic golem_plastic.png +0 -0
  620. melon_lua/data/sprites_pack/images/0285_Toy golem_plastic.png +0 -0
  621. melon_lua/data/sprites_pack/images/0286_Wood golem_plastic.png +0 -0
  622. melon_lua/data/sprites_pack/images/0287_ChemicalProtectionHelmet.png +0 -0
  623. melon_lua/data/sprites_pack/images/0287_ChemicalProtectionHelmet_plastic.png +0 -0
  624. melon_lua/data/sprites_pack/images/0288_ChemicalProtectionSuit.png +0 -0
  625. melon_lua/data/sprites_pack/images/0288_ChemicalProtectionSuit_plastic.png +0 -0
  626. melon_lua/data/sprites_pack/images/0289_FlaskAcid.png +0 -0
  627. melon_lua/data/sprites_pack/images/0289_FlaskAcid_plastic.png +0 -0
  628. melon_lua/data/sprites_pack/images/0290_FlaskDamageResist.png +0 -0
  629. melon_lua/data/sprites_pack/images/0290_FlaskDamageResist_plastic.png +0 -0
  630. melon_lua/data/sprites_pack/images/0291_FlaskElectricityProtection.png +0 -0
  631. melon_lua/data/sprites_pack/images/0291_FlaskElectricityProtection_plastic.png +0 -0
  632. melon_lua/data/sprites_pack/images/0292_FlaskEmbalming.png +0 -0
  633. melon_lua/data/sprites_pack/images/0292_FlaskEmbalming_plastic.png +0 -0
  634. melon_lua/data/sprites_pack/images/0293_FlaskFireproof.png +0 -0
  635. melon_lua/data/sprites_pack/images/0293_FlaskFireproof_plastic.png +0 -0
  636. melon_lua/data/sprites_pack/images/0294_FlaskHeal.png +0 -0
  637. melon_lua/data/sprites_pack/images/0294_FlaskHeal_plastic.png +0 -0
  638. melon_lua/data/sprites_pack/images/0295_FlaskImmortal.png +0 -0
  639. melon_lua/data/sprites_pack/images/0295_FlaskImmortal_plastic.png +0 -0
  640. melon_lua/data/sprites_pack/images/0296_FlaskJointDiluent.png +0 -0
  641. melon_lua/data/sprites_pack/images/0296_FlaskJointDiluent_plastic.png +0 -0
  642. melon_lua/data/sprites_pack/images/0297_FlaskRegen.png +0 -0
  643. melon_lua/data/sprites_pack/images/0297_FlaskRegen_plastic.png +0 -0
  644. melon_lua/data/sprites_pack/images/0298_FlaskRegrowth.png +0 -0
  645. melon_lua/data/sprites_pack/images/0298_FlaskRegrowth_plastic.png +0 -0
  646. melon_lua/data/sprites_pack/images/0299_FlaskVirus.png +0 -0
  647. melon_lua/data/sprites_pack/images/0299_FlaskVirus_plastic.png +0 -0
  648. melon_lua/data/sprites_pack/images/0300_FlaskWater.png +0 -0
  649. melon_lua/data/sprites_pack/images/0300_FlaskWater_plastic.png +0 -0
  650. melon_lua/data/sprites_pack/images/0301_RackDecor.png +0 -0
  651. melon_lua/data/sprites_pack/images/0301_RackDecor_plastic.png +0 -0
  652. melon_lua/data/sprites_pack/images/0302_FluorescentLamp 2.png +0 -0
  653. melon_lua/data/sprites_pack/images/0302_FluorescentLamp 2_plastic.png +0 -0
  654. melon_lua/data/sprites_pack/images/0303_FluorescentLamp 1.png +0 -0
  655. melon_lua/data/sprites_pack/images/0303_FluorescentLamp 1_plastic.png +0 -0
  656. melon_lua/data/sprites_pack/images/0304_DecorConicalFlask.png +0 -0
  657. melon_lua/data/sprites_pack/images/0304_DecorConicalFlask_plastic.png +0 -0
  658. melon_lua/data/sprites_pack/images/0305_DecorMeasuringFlask.png +0 -0
  659. melon_lua/data/sprites_pack/images/0305_DecorMeasuringFlask_plastic.png +0 -0
  660. melon_lua/data/sprites_pack/images/0306_DecorReactionFlask.png +0 -0
  661. melon_lua/data/sprites_pack/images/0306_DecorReactionFlask_plastic.png +0 -0
  662. melon_lua/data/sprites_pack/images/0307_DecorSectionalTestTube.png +0 -0
  663. melon_lua/data/sprites_pack/images/0307_DecorSectionalTestTube_plastic.png +0 -0
  664. melon_lua/data/sprites_pack/images/0308_DecorThinTestTube.png +0 -0
  665. melon_lua/data/sprites_pack/images/0308_DecorThinTestTube_plastic.png +0 -0
  666. melon_lua/data/sprites_pack/images/0309_DecorWideTestTube.png +0 -0
  667. melon_lua/data/sprites_pack/images/0309_DecorWideTestTube_plastic.png +0 -0
  668. melon_lua/data/sprites_pack/images/0310_EffectGenerator.png +0 -0
  669. melon_lua/data/sprites_pack/images/0310_EffectGenerator_plastic.png +0 -0
  670. melon_lua/data/sprites_pack/images/0311_WelderGloves.png +0 -0
  671. melon_lua/data/sprites_pack/images/0311_WelderGloves_plastic.png +0 -0
  672. melon_lua/data/sprites_pack/images/0312_WelderMask.png +0 -0
  673. melon_lua/data/sprites_pack/images/0312_WelderMask_plastic.png +0 -0
  674. melon_lua/data/sprites_pack/images/0313_WelderSuit.png +0 -0
  675. melon_lua/data/sprites_pack/images/0313_WelderSuit_plastic.png +0 -0
  676. melon_lua/data/sprites_pack/images/0314_VatOfAcid.png +0 -0
  677. melon_lua/data/sprites_pack/images/0314_VatOfAcid_plastic.png +0 -0
  678. melon_lua/data/sprites_pack/images/0315_VirusBarrel.png +0 -0
  679. melon_lua/data/sprites_pack/images/0315_VirusBarrel_plastic.png +0 -0
  680. melon_lua/data/sprites_pack/images/0316_WasteBarrel.png +0 -0
  681. melon_lua/data/sprites_pack/images/0316_WasteBarrel_plastic.png +0 -0
  682. melon_lua/data/sprites_pack/images/0317_Wings.png +0 -0
  683. melon_lua/data/sprites_pack/images/0317_Wings_plastic.png +0 -0
  684. melon_lua/data/sprites_pack/images/0318_Nimbus.png +0 -0
  685. melon_lua/data/sprites_pack/images/0318_Nimbus_plastic.png +0 -0
  686. melon_lua/data/sprites_pack/images/0319_Iceblock.png +0 -0
  687. melon_lua/data/sprites_pack/images/0319_Iceblock_plastic.png +0 -0
  688. melon_lua/data/sprites_pack/images/0320_HeadPhones.png +0 -0
  689. melon_lua/data/sprites_pack/images/0320_HeadPhones_plastic.png +0 -0
  690. melon_lua/data/sprites_pack/images/0321_Wig.png +0 -0
  691. melon_lua/data/sprites_pack/images/0321_Wig_plastic.png +0 -0
  692. melon_lua/data/sprites_pack/images/0322_DarkWig.png +0 -0
  693. melon_lua/data/sprites_pack/images/0322_DarkWig_plastic.png +0 -0
  694. melon_lua/data/sprites_pack/images/0323_EmoWig.png +0 -0
  695. melon_lua/data/sprites_pack/images/0323_EmoWig_plastic.png +0 -0
  696. melon_lua/data/sprites_pack/images/0324_Iroquois.png +0 -0
  697. melon_lua/data/sprites_pack/images/0324_Iroquois_plastic.png +0 -0
  698. melon_lua/data/sprites_pack/images/0325_Piano.png +0 -0
  699. melon_lua/data/sprites_pack/images/0325_Piano_plastic.png +0 -0
  700. melon_lua/data/sprites_pack/images/0326_Guitar.png +0 -0
  701. melon_lua/data/sprites_pack/images/0326_Guitar_plastic.png +0 -0
  702. melon_lua/data/sprites_pack/images/0327_Xylophone.png +0 -0
  703. melon_lua/data/sprites_pack/images/0327_Xylophone_plastic.png +0 -0
  704. melon_lua/data/sprites_pack/images/0328_Flutes.png +0 -0
  705. melon_lua/data/sprites_pack/images/0328_Flutes_plastic.png +0 -0
  706. melon_lua/data/sprites_pack/images/0329_Drums.png +0 -0
  707. melon_lua/data/sprites_pack/images/0329_Drums_plastic.png +0 -0
  708. melon_lua/data/sprites_pack/images/0330_Chainsaw.png +0 -0
  709. melon_lua/data/sprites_pack/images/0330_Chainsaw_plastic.png +0 -0
  710. melon_lua/data/sprites_pack/images/0331_Battery.png +0 -0
  711. melon_lua/data/sprites_pack/images/0331_Battery_plastic.png +0 -0
  712. melon_lua/data/sprites_pack/images/0332_AcidicAmmoBox.png +0 -0
  713. melon_lua/data/sprites_pack/images/0332_AcidicAmmoBox_plastic.png +0 -0
  714. melon_lua/data/sprites_pack/images/0333_ArmorPiercingAmmoBox.png +0 -0
  715. melon_lua/data/sprites_pack/images/0333_ArmorPiercingAmmoBox_plastic.png +0 -0
  716. melon_lua/data/sprites_pack/images/0334_BouncingAmmoBox.png +0 -0
  717. melon_lua/data/sprites_pack/images/0334_BouncingAmmoBox_plastic.png +0 -0
  718. melon_lua/data/sprites_pack/images/0335_ExpandingAmmoBox.png +0 -0
  719. melon_lua/data/sprites_pack/images/0335_ExpandingAmmoBox_plastic.png +0 -0
  720. melon_lua/data/sprites_pack/images/0336_ExplosiveAmmoBox.png +0 -0
  721. melon_lua/data/sprites_pack/images/0336_ExplosiveAmmoBox_plastic.png +0 -0
  722. melon_lua/data/sprites_pack/images/0337_IncendiaryAmmoBox.png +0 -0
  723. melon_lua/data/sprites_pack/images/0337_IncendiaryAmmoBox_plastic.png +0 -0
  724. melon_lua/data/sprites_pack/images/0338_InvisibleAmmoBox.png +0 -0
  725. melon_lua/data/sprites_pack/images/0338_InvisibleAmmoBox_plastic.png +0 -0
  726. melon_lua/data/sprites_pack/images/0339_MixedAmmoBox_plastic.png +0 -0
  727. melon_lua/data/sprites_pack/images/0340_StandardAmmoBox.png +0 -0
  728. melon_lua/data/sprites_pack/images/0340_StandardAmmoBox_plastic.png +0 -0
  729. melon_lua/data/sprites_pack/images/0341_UnderwaterAmmoBox.png +0 -0
  730. melon_lua/data/sprites_pack/images/0341_UnderwaterAmmoBox_plastic.png +0 -0
  731. melon_lua/data/sprites_pack/images/0342_AmmoMixer.png +0 -0
  732. melon_lua/data/sprites_pack/images/0342_AmmoMixer_plastic.png +0 -0
  733. melon_lua/data/sprites_pack/images/0343_Relay.png +0 -0
  734. melon_lua/data/sprites_pack/images/0343_Relay_plastic.png +0 -0
  735. melon_lua/data/sprites_pack/images/0344_Defibrillator.png +0 -0
  736. melon_lua/data/sprites_pack/images/0344_Defibrillator_plastic.png +0 -0
  737. melon_lua/data/sprites_pack/images/0345_Slider.png +0 -0
  738. melon_lua/data/sprites_pack/images/0346_Voltmeter.png +0 -0
  739. melon_lua/data/sprites_pack/images/0346_Voltmeter_plastic.png +0 -0
  740. melon_lua/data/sprites_pack/images/0347_Conveyor.png +0 -0
  741. melon_lua/data/sprites_pack/images/0347_Conveyor_plastic.png +0 -0
  742. melon_lua/data/sprites_pack/images/0348_Transformer.png +0 -0
  743. melon_lua/data/sprites_pack/images/0348_Transformer_plastic.png +0 -0
  744. melon_lua/data/sprites_pack/images/0349_Plug.png +0 -0
  745. melon_lua/data/sprites_pack/images/0349_Plug_atlas.png +0 -0
  746. melon_lua/data/sprites_pack/images/0350_Socket.png +0 -0
  747. melon_lua/data/sprites_pack/images/0350_Socket_atlas.png +0 -0
  748. melon_lua/data/sprites_pack/images/0351_Old shawl.png +0 -0
  749. melon_lua/data/sprites_pack/images/0351_Old shawl_plastic.png +0 -0
  750. melon_lua/data/sprites_pack/images/0352_Old skirt.png +0 -0
  751. melon_lua/data/sprites_pack/images/0352_Old skirt_plastic.png +0 -0
  752. melon_lua/data/sprites_pack/images/0353_Old slippers.png +0 -0
  753. melon_lua/data/sprites_pack/images/0353_Old slippers_plastic.png +0 -0
  754. melon_lua/data/sprites_pack/images/0354_Old sweater.png +0 -0
  755. melon_lua/data/sprites_pack/images/0354_Old sweater_plastic.png +0 -0
  756. melon_lua/data/sprites_pack/images/0355_SpikedStaff.png +0 -0
  757. melon_lua/data/sprites_pack/images/0355_SpikedStaff_plastic.png +0 -0
  758. melon_lua/data/sprites_pack/images/0356_FluorescentStaff.png +0 -0
  759. melon_lua/data/sprites_pack/images/0356_FluorescentStaff_plastic.png +0 -0
  760. melon_lua/data/sprites_pack/images/0357_GlueStaff.png +0 -0
  761. melon_lua/data/sprites_pack/images/0357_GlueStaff_plastic.png +0 -0
  762. melon_lua/data/sprites_pack/images/0358_SlickStaff.png +0 -0
  763. melon_lua/data/sprites_pack/images/0358_SlickStaff_plastic.png +0 -0
  764. melon_lua/data/sprites_pack/images/0359_BallooningStaff.png +0 -0
  765. melon_lua/data/sprites_pack/images/0359_BallooningStaff_plastic.png +0 -0
  766. melon_lua/data/sprites_pack/images/0360_GhostlyStaff.png +0 -0
  767. melon_lua/data/sprites_pack/images/0360_GhostlyStaff_plastic.png +0 -0
  768. melon_lua/data/sprites_pack/images/0361_MutationStaff.png +0 -0
  769. melon_lua/data/sprites_pack/images/0361_MutationStaff_plastic.png +0 -0
  770. melon_lua/data/sprites_pack/images/0362_RoachesStaff.png +0 -0
  771. melon_lua/data/sprites_pack/images/0362_RoachesStaff_plastic.png +0 -0
  772. melon_lua/data/sprites_pack/images/0363_UIControl.png +0 -0
  773. melon_lua/data/sprites_pack/images/0363_UIControl_plastic.png +0 -0
  774. melon_lua/data/sprites_pack/images/0364_Policeman cap.png +0 -0
  775. melon_lua/data/sprites_pack/images/0364_Policeman cap_plastic.png +0 -0
  776. melon_lua/data/sprites_pack/images/0365_Policeman shirt.png +0 -0
  777. melon_lua/data/sprites_pack/images/0365_Policeman shirt_plastic.png +0 -0
  778. melon_lua/data/sprites_pack/images/0366_Policeman trousers.png +0 -0
  779. melon_lua/data/sprites_pack/images/0366_Policeman trousers_plastic.png +0 -0
  780. melon_lua/data/sprites_pack/images/0367_Clown nose.png +0 -0
  781. melon_lua/data/sprites_pack/images/0367_Clown nose_plastic.png +0 -0
  782. melon_lua/data/sprites_pack/images/0368_Clown shirt.png +0 -0
  783. melon_lua/data/sprites_pack/images/0368_Clown shirt_plastic.png +0 -0
  784. melon_lua/data/sprites_pack/images/0369_Clown shoes.png +0 -0
  785. melon_lua/data/sprites_pack/images/0369_Clown shoes_plastic.png +0 -0
  786. melon_lua/data/sprites_pack/images/0370_Clown trousers.png +0 -0
  787. melon_lua/data/sprites_pack/images/0370_Clown trousers_plastic.png +0 -0
  788. melon_lua/data/sprites_pack/images/0371_Clown wig.png +0 -0
  789. melon_lua/data/sprites_pack/images/0371_Clown wig_plastic.png +0 -0
  790. melon_lua/data/sprites_pack/images/0372_WizardBeard.png +0 -0
  791. melon_lua/data/sprites_pack/images/0372_WizardBeard_plastic.png +0 -0
  792. melon_lua/data/sprites_pack/images/0373_WizardRobe.png +0 -0
  793. melon_lua/data/sprites_pack/images/0373_WizardRobe_plastic.png +0 -0
  794. melon_lua/data/sprites_pack/images/0374_WizardShoes.png +0 -0
  795. melon_lua/data/sprites_pack/images/0374_WizardShoes_plastic.png +0 -0
  796. melon_lua/data/sprites_pack/images/0375_StopSign.png +0 -0
  797. melon_lua/data/sprites_pack/images/0375_StopSign_plastic.png +0 -0
  798. melon_lua/data/sprites_pack/images/0376_DirectionalEngine.png +0 -0
  799. melon_lua/data/sprites_pack/images/0376_DirectionalEngine_plastic.png +0 -0
  800. melon_lua/data/sprites_pack/images/0377_HeliumCylinder.png +0 -0
  801. melon_lua/data/sprites_pack/images/0377_HeliumCylinder_plastic.png +0 -0
  802. melon_lua/data/sprites_pack/images/0378_HeliumBalloon_plastic.png +0 -0
  803. melon_lua/data/sprites_pack/images/0379_PartyHat.png +0 -0
  804. melon_lua/data/sprites_pack/images/0379_PartyHat_plastic.png +0 -0
  805. melon_lua/data/sprites_pack/images/0380_PartyHorn.png +0 -0
  806. melon_lua/data/sprites_pack/images/0380_PartyHorn_plastic.png +0 -0
  807. melon_lua/data/sprites_pack/images/0381_HumanCake_plastic.png +0 -0
  808. melon_lua/data/sprites_pack/images/0382_ModularTurret.png +0 -0
  809. melon_lua/data/sprites_pack/images/0382_ModularTurret_plastic.png +0 -0
  810. melon_lua/data/sprites_pack/images/0383_HealingTurret.png +0 -0
  811. melon_lua/data/sprites_pack/images/0383_HealingTurret_plastic.png +0 -0
  812. melon_lua/data/sprites_pack/images/0384_RocketTurret.png +0 -0
  813. melon_lua/data/sprites_pack/images/0384_RocketTurret_plastic.png +0 -0
  814. melon_lua/data/sprites_pack/images/0385_KnifeTurret.png +0 -0
  815. melon_lua/data/sprites_pack/images/0385_KnifeTurret_plastic.png +0 -0
  816. melon_lua/data/sprites_pack/images/0386_KnifeProjectile_plastic.png +0 -0
  817. melon_lua/data/sprites_pack/images/0387_RocketTurretProjectile_plastic.png +0 -0
  818. melon_lua/data/sprites_pack/images/0388_Servo.png +0 -0
  819. melon_lua/data/sprites_pack/images/0388_Servo_plastic.png +0 -0
  820. melon_lua/data/sprites_pack/images/0389_BladeTrap.png +0 -0
  821. melon_lua/data/sprites_pack/images/0389_BladeTrap_plastic.png +0 -0
  822. melon_lua/data/sprites_pack/images/0390_SyringeFrozeProtection.png +0 -0
  823. melon_lua/data/sprites_pack/images/0390_SyringeFrozeProtection_plastic.png +0 -0
  824. melon_lua/data/sprites_pack/images/0391_RopeControllerDevice.png +0 -0
  825. melon_lua/data/sprites_pack/images/0391_RopeControllerDevice_plastic.png +0 -0
  826. melon_lua/data/sprites_pack/images/0392_FluidTank.png +0 -0
  827. melon_lua/data/sprites_pack/images/0392_FluidTank_plastic.png +0 -0
  828. melon_lua/data/sprites_pack/images/0393_OilCan.png +0 -0
  829. melon_lua/data/sprites_pack/images/0393_OilCan_plastic.png +0 -0
  830. melon_lua/data/sprites_pack/images/0394_JuiceBottle.png +0 -0
  831. melon_lua/data/sprites_pack/images/0394_JuiceBottle_plastic.png +0 -0
  832. melon_lua/data/sprites_pack/images/0395_TomatoBottle.png +0 -0
  833. melon_lua/data/sprites_pack/images/0395_TomatoBottle_plastic.png +0 -0
  834. melon_lua/data/sprites_pack/images/0396_PumpkinBottle.png +0 -0
  835. melon_lua/data/sprites_pack/images/0396_PumpkinBottle_atlas.png +0 -0
  836. melon_lua/data/sprites_pack/images/0397_MelonBottle.png +0 -0
  837. melon_lua/data/sprites_pack/images/0397_MelonBottle_plastic.png +0 -0
  838. melon_lua/data/sprites_pack/images/0398_DragonFruitBottle.png +0 -0
  839. melon_lua/data/sprites_pack/images/0398_DragonFruitBottle_plastic.png +0 -0
  840. melon_lua/data/sprites_pack/images/0399_CornBottle.png +0 -0
  841. melon_lua/data/sprites_pack/images/0399_CornBottle_plastic.png +0 -0
  842. melon_lua/data/sprites_pack/images/0400_CactusBottle.png +0 -0
  843. melon_lua/data/sprites_pack/images/0400_CactusBottle_plastic.png +0 -0
  844. melon_lua/data/sprites_pack/images/0401_AppleBottle.png +0 -0
  845. melon_lua/data/sprites_pack/images/0401_AppleBottle_plastic.png +0 -0
  846. melon_lua/data/sprites_pack/images/0402_WateringCan.png +0 -0
  847. melon_lua/data/sprites_pack/images/0402_WateringCan_atlas.png +0 -0
  848. melon_lua/data/sprites_pack/images/0403_GlassJar.png +0 -0
  849. melon_lua/data/sprites_pack/images/0403_GlassJar_plastic.png +0 -0
  850. melon_lua/data/sprites_pack/images/0404_LiquidCollector.png +0 -0
  851. melon_lua/data/sprites_pack/images/0404_LiquidCollector_plastic.png +0 -0
  852. melon_lua/data/sprites_pack/images/0405_LiquidValve.png +0 -0
  853. melon_lua/data/sprites_pack/images/0405_LiquidValve_plastic.png +0 -0
  854. melon_lua/data/sprites_pack/images/0406_Engine.png +0 -0
  855. melon_lua/data/sprites_pack/images/0406_Engine_plastic.png +0 -0
  856. melon_lua/data/sprites_pack/images/0407_Copywriter.png +0 -0
  857. melon_lua/data/sprites_pack/images/0407_Copywriter_plastic.png +0 -0
  858. melon_lua/data/sprites_pack/images/0408_NailGun.png +0 -0
  859. melon_lua/data/sprites_pack/images/0408_NailGun_plastic.png +0 -0
  860. melon_lua/data/sprites_pack/images/0409_Nail_plastic.png +0 -0
  861. melon_lua/data/sprites_pack/images/0410_Syringe_plastic.png +0 -0
  862. melon_lua/data/sprites_pack/images/0411_SyringeMachine.png +0 -0
  863. melon_lua/data/sprites_pack/images/0411_SyringeMachine_plastic.png +0 -0
  864. melon_lua/data/sprites_pack/images/0412_PumpkinLauncher.png +0 -0
  865. melon_lua/data/sprites_pack/images/0412_PumpkinLauncher_atlas.png +0 -0
  866. melon_lua/data/sprites_pack/images/0413_PumpkinProjectile_atlas.png +0 -0
  867. melon_lua/data/sprites_pack/images/0414_LiquidProbe.png +0 -0
  868. melon_lua/data/sprites_pack/images/0414_LiquidProbe_plastic.png +0 -0
  869. melon_lua/data/sprites_pack/images/0415_LiquidScanner.png +0 -0
  870. melon_lua/data/sprites_pack/images/0415_LiquidScanner_plastic.png +0 -0
  871. melon_lua/data/sprites_pack/images/0416_LeafBlower.png +0 -0
  872. melon_lua/data/sprites_pack/images/0416_LeafBlower_plastic.png +0 -0
  873. melon_lua/data/sprites_pack/images/0417_LiquidPump.png +0 -0
  874. melon_lua/data/sprites_pack/images/0417_LiquidPump_plastic.png +0 -0
  875. melon_lua/data/sprites_pack/images/0418_FlaskFrostProtection.png +0 -0
  876. melon_lua/data/sprites_pack/images/0418_FlaskFrostProtection_plastic.png +0 -0
  877. melon_lua/data/sprites_pack/images/0419_Radar.png +0 -0
  878. melon_lua/data/sprites_pack/images/0419_Radar_plastic.png +0 -0
  879. melon_lua/data/sprites_pack/images/0420_EntitiesMarker.png +0 -0
  880. melon_lua/data/sprites_pack/images/0420_EntitiesMarker_plastic.png +0 -0
  881. melon_lua/data/sprites_pack/images/0421_Saw_plastic.png +0 -0
  882. melon_lua/data/sprites_pack/images/0422_SawGun.png +0 -0
  883. melon_lua/data/sprites_pack/images/0422_SawGun_plastic.png +0 -0
  884. melon_lua/data/sprites_pack/images/0423_EnergySaber.png +0 -0
  885. melon_lua/data/sprites_pack/images/0423_EnergySaber_plastic.png +0 -0
  886. melon_lua/data/sprites_pack/images/0424_LEDMatrix.png +0 -0
  887. melon_lua/data/sprites_pack/images/0424_LEDMatrix_plastic.png +0 -0
  888. melon_lua/data/sprites_pack/images/0425_VPchipTutorial4_ArrayExample.png +0 -0
  889. melon_lua/data/sprites_pack/images/0425_VPchipTutorial4_ArrayExample_plastic.png +0 -0
  890. melon_lua/data/sprites_pack/images/0426_ImprovisedCharge.png +0 -0
  891. melon_lua/data/sprites_pack/images/0426_ImprovisedCharge_plastic.png +0 -0
  892. melon_lua/data/sprites_pack/images/0427_HomingLauncher.png +0 -0
  893. melon_lua/data/sprites_pack/images/0427_HomingLauncher_plastic.png +0 -0
  894. melon_lua/data/sprites_pack/images/0428_LetterGun.png +0 -0
  895. melon_lua/data/sprites_pack/images/0428_LetterGun_plastic.png +0 -0
  896. melon_lua/data/sprites_pack/images/0429_ParasiteCap.png +0 -0
  897. melon_lua/data/sprites_pack/images/0429_ParasiteCap_plastic.png +0 -0
  898. melon_lua/data/sprites_pack/images/0430_BouncyBombBox.png +0 -0
  899. melon_lua/data/sprites_pack/images/0430_BouncyBombBox_plastic.png +0 -0
  900. melon_lua/data/sprites_pack/images/0431_HoneyGrenade.png +0 -0
  901. melon_lua/data/sprites_pack/images/0431_HoneyGrenade_plastic.png +0 -0
  902. melon_lua/data/sprites_pack/images/0432_MutationGrenade.png +0 -0
  903. melon_lua/data/sprites_pack/images/0432_MutationGrenade_plastic.png +0 -0
  904. melon_lua/data/sprites_pack/images/0433_NastyBomb.png +0 -0
  905. melon_lua/data/sprites_pack/images/0433_NastyBomb_plastic.png +0 -0
  906. melon_lua/data/sprites_pack/images/0434_SpikeGrenade.png +0 -0
  907. melon_lua/data/sprites_pack/images/0434_SpikeGrenade_plastic.png +0 -0
  908. melon_lua/data/sprites_pack/images/0435_BouncyBomb_plastic.png +0 -0
  909. melon_lua/data/sprites_pack/images/0436_TeslaCoil.png +0 -0
  910. melon_lua/data/sprites_pack/images/0436_TeslaCoil_plastic.png +0 -0
  911. melon_lua/data/sprites_pack/images/0437_NewYearPresent.png +0 -0
  912. melon_lua/data/sprites_pack/images/0438_RectEndlessOceanRoom.png +0 -0
  913. melon_lua/data/sprites_pack/images/0438_RectEndlessOceanRoom_plastic.png +0 -0
  914. melon_lua/data/sprites_pack/images/0439_DepthAndPressureSensor.png +0 -0
  915. melon_lua/data/sprites_pack/images/0439_DepthAndPressureSensor_plastic.png +0 -0
  916. melon_lua/data/sprites_pack/images/0440_Speedboat.png +0 -0
  917. melon_lua/data/sprites_pack/images/0440_Speedboat_plastic.png +0 -0
  918. melon_lua/data/sprites_pack/images/0441_Submarine.png +0 -0
  919. melon_lua/data/sprites_pack/images/0441_Submarine_plastic.png +0 -0
  920. melon_lua/data/sprites_pack/images/0442_BoatVehicle.png +0 -0
  921. melon_lua/data/sprites_pack/images/0443_Wetsuit.png +0 -0
  922. melon_lua/data/sprites_pack/images/0443_Wetsuit_plastic.png +0 -0
  923. melon_lua/data/sprites_pack/images/0444_Diving armor.png +0 -0
  924. melon_lua/data/sprites_pack/images/0444_Diving armor_plastic.png +0 -0
  925. melon_lua/data/sprites_pack/images/0445_Diving suit.png +0 -0
  926. melon_lua/data/sprites_pack/images/0445_Diving suit_plastic.png +0 -0
  927. melon_lua/data/sprites_pack/images/0446_Ballast.png +0 -0
  928. melon_lua/data/sprites_pack/images/0446_Ballast_plastic.png +0 -0
  929. melon_lua/data/sprites_pack/images/0447_HermeticDoor.png +0 -0
  930. melon_lua/data/sprites_pack/images/0447_HermeticDoor_plastic.png +0 -0
  931. melon_lua/data/sprites_pack/images/0448_HumanCoral.png +0 -0
  932. melon_lua/data/sprites_pack/images/0448_HumanCoral_plastic.png +0 -0
  933. melon_lua/data/sprites_pack/images/0449_Passageway.png +0 -0
  934. melon_lua/data/sprites_pack/images/0449_Passageway_plastic.png +0 -0
  935. melon_lua/data/sprites_pack/images/0450_GlassDome.png +0 -0
  936. melon_lua/data/sprites_pack/images/0450_GlassDome_plastic.png +0 -0
  937. melon_lua/data/sprites_pack/images/0451_HermeticDoorBlue.png +0 -0
  938. melon_lua/data/sprites_pack/images/0451_HermeticDoorBlue_plastic.png +0 -0
  939. melon_lua/data/sprites_pack/images/0452_PassagewayBlue.png +0 -0
  940. melon_lua/data/sprites_pack/images/0452_PassagewayBlue_plastic.png +0 -0
  941. melon_lua/data/sprites_pack/images/0453_RectEndlessOceanRoomBlue.png +0 -0
  942. melon_lua/data/sprites_pack/images/0453_RectEndlessOceanRoomBlue_plastic.png +0 -0
  943. melon_lua/data/sprites_pack/images/0454_RectEndlessOceanDockingHatch.png +0 -0
  944. melon_lua/data/sprites_pack/images/0454_RectEndlessOceanDockingHatch_plastic.png +0 -0
  945. melon_lua/data/sprites_pack/images/0455_GlassDomeBlue.png +0 -0
  946. melon_lua/data/sprites_pack/images/0455_GlassDomeBlue_plastic.png +0 -0
  947. melon_lua/data/sprites_pack/images.zip +0 -0
  948. melon_lua/data/sprites_pack/sprites_by_object_id.json +2747 -0
  949. melon_lua/data/ui_controller_template.json +1 -0
  950. melon_lua/data/ui_element_prototypes.json +3590 -0
  951. melon_lua/entity.py +88 -0
  952. melon_lua/melmod.py +164 -0
  953. melon_lua/melsave.py +275 -0
  954. melon_lua/melsave_builder.py +744 -0
  955. melon_lua/melsave_writer.py +738 -0
  956. melon_lua/preamble.lua +388 -0
  957. melon_lua/preview.py +335 -0
  958. melon_lua/runner.py +409 -0
  959. melon_lua/session.py +396 -0
  960. melon_lua/spawn_queue.py +190 -0
  961. melon_lua/stdlib_bit32_shim.lua +105 -0
  962. melon_lua/stdlib_melon.py +113 -0
  963. melon_lua/uicontrol_builder.py +802 -0
  964. melon_lua/visuals.py +115 -0
  965. melon_lua/vpcompile/__init__.py +5 -0
  966. melon_lua/vpcompile/codegen.py +163 -0
  967. melon_lua/vpcompile/compile.py +20 -0
  968. melon_lua/vpcompile/graph.py +112 -0
  969. melon_lua/vpcompile/ir.py +33 -0
  970. melon_lua/vpcompile/nodes/__init__.py +22 -0
  971. melon_lua/vpcompile/nodes/_base.py +8 -0
  972. melon_lua/vpcompile/nodes/entity_read.py +164 -0
  973. melon_lua/vpcompile/nodes/entity_write.py +170 -0
  974. melon_lua/vpcompile/nodes/flow.py +323 -0
  975. melon_lua/vpcompile/nodes/logic.py +131 -0
  976. melon_lua/vpcompile/nodes/math_basic.py +235 -0
  977. melon_lua/vpcompile/nodes/math_trig.py +71 -0
  978. melon_lua/vpcompile/nodes/vector.py +101 -0
  979. melon_lua/vpcompile/ops.py +195 -0
  980. melon_lua/vpcompile/save_data.py +20 -0
  981. melon_lua/world.py +536 -0
  982. melon_lua-3.4.0.dist-info/METADATA +230 -0
  983. melon_lua-3.4.0.dist-info/RECORD +986 -0
  984. melon_lua-3.4.0.dist-info/WHEEL +5 -0
  985. melon_lua-3.4.0.dist-info/entry_points.txt +2 -0
  986. melon_lua-3.4.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,802 @@
1
+ """UI Controller builder SDK for Melon Playground.
2
+
3
+ Constructs UIController (objectId=2046689600) save objects with custom UI
4
+ element layouts. Each UI controller has a tree of UI elements (buttons,
5
+ sliders, joysticks, etc.) defined in `uicontrol_elements` metadata.
6
+
7
+ Based on reverse-engineering of `6527test.melsave` — a real-device UI
8
+ controller demo with all 13 element types.
9
+
10
+ Element types (by Type field in save data):
11
+ 1=Button, 2=Pedal, 3=Pedal, 22=Joystick, 5=SliderStyle1, 6=SliderStyle2,
12
+ 7=SliderStyle3, 11=InputField, 12=SteeringWheel, 14=Pointer, 17=Toggle,
13
+ 18=Screen, 19=CustomIcon
14
+
15
+ Note: Types 1/2/3 are all button-family (output "Button is down/up");
16
+ Types 5/6/7 are all slider-family (output "Value"); user-visible names
17
+ in saves may differ (e.g. Type=5 named "Slider 1").
18
+
19
+ Coordinate system: screen-space pixels, anchored to RectTransform anchors.
20
+ (0,0) = screen center, +x = right, +y = up.
21
+ AnchorMin/Max (0-1): relative position in parent.
22
+ AnchoredPosition: pixel offset from anchor point.
23
+ SizeDelta: element size in pixels.
24
+ """
25
+ from __future__ import annotations
26
+
27
+ import copy
28
+ import json
29
+ import uuid
30
+ from dataclasses import dataclass, field
31
+ from pathlib import Path
32
+ from typing import Any
33
+
34
+ # ---------------------------------------------------------------------------
35
+ # Element type constants
36
+ # ---------------------------------------------------------------------------
37
+
38
+ BUTTON = 1
39
+ PEDAL = 2
40
+ PEDAL_ALT = 3 # Same behavior as PEDAL (outputs Button is down/up)
41
+ SLIDER = 5 # SliderStyle1 (target value + Value output)
42
+ SLIDER_ALT = 6 # SliderStyle2
43
+ SLIDER_ALT2 = 7 # SliderStyle3 (adds Fill color)
44
+ INDICATOR1 = 6 # Alias (same as SLIDER_ALT)
45
+ ROTATION_WHEEL = 12 # Steering wheel
46
+ INPUT_FIELD = 11
47
+ STEERING_WHEEL = 12
48
+ POINTER = 14
49
+ TOGGLE = 17
50
+ SCREEN = 18
51
+ CUSTOM_ICON = 19
52
+ JOYSTICK = 22
53
+ LABEL = 5 # Alias (SLIDER family is commonly used as a label/indicator)
54
+
55
+ # Deprecated aliases (kept for compat but Type values were corrected)
56
+ ROTATION_WHEEL_OLD = 7 # This was SliderStyle3, not RotationWheel
57
+
58
+ _TYPE_NAMES = {
59
+ BUTTON: "Button", PEDAL: "Pedal", PEDAL_ALT: "Pedal",
60
+ SLIDER: "Slider", SLIDER_ALT: "Slider", SLIDER_ALT2: "Slider",
61
+ INPUT_FIELD: "InputField", STEERING_WHEEL: "SteeringWheel",
62
+ POINTER: "Pointer", TOGGLE: "Toggle", SCREEN: "Screen",
63
+ CUSTOM_ICON: "CustomIcon", JOYSTICK: "Joystick",
64
+ }
65
+
66
+ # GateDataType constants (match mechanic system)
67
+ _DT_NUMBER = 2
68
+ _DT_STRING = 4
69
+ _DT_VECTOR = 8
70
+ _DT_ENTITY = 1
71
+ _DT_COLOR = 24
72
+ _DT_INT = 32
73
+
74
+ # Prototype loader
75
+ _PROTOTYPES_PATH = Path(__file__).parent / "data" / "ui_element_prototypes.json"
76
+ _CONTROLLER_TEMPLATE_PATH = Path(__file__).parent / "data" / "ui_controller_template.json"
77
+
78
+
79
+ def _load_prototypes() -> dict[int, dict]:
80
+ with open(_PROTOTYPES_PATH, "r", encoding="utf-8") as f:
81
+ raw = json.load(f)
82
+ return {int(k): v for k, v in raw.items()}
83
+
84
+
85
+ # ---------------------------------------------------------------------------
86
+ # Introspection — agent-friendly element catalog
87
+ # ---------------------------------------------------------------------------
88
+
89
+ _COMMON_INPUTS = {
90
+ "Element shown", "Element Title shown", "Button is interactable", "Color",
91
+ "Label Pivot", "Anchor min", "Anchor max", "Anchored position",
92
+ "Size delta", "Sorting order",
93
+ }
94
+ _COMMON_OUTPUTS = {
95
+ "Anchor min out", "Anchor max out", "Anchored position out",
96
+ "Size delta out",
97
+ }
98
+
99
+ _DT_NAMES = {1: "entity", 2: "number", 4: "string", 8: "vector",
100
+ 24: "color", 32: "int"}
101
+
102
+
103
+ def element_schema(name: str = "") -> dict:
104
+ """Return a human/agent-readable schema for a UI element type.
105
+
106
+ Call ``element_schema()`` for a list of all available types, or
107
+ ``element_schema("button")`` / ``element_schema("slider")`` etc. for the
108
+ schema of one type (case-insensitive prefix match).
109
+
110
+ Returns::
111
+
112
+ {
113
+ "type": "button", # canonical name
114
+ "type_id": 1, # save-data Type field
115
+ "aliases": ["button", "pedal"],
116
+ "description": "...",
117
+ "inputs": [ # type-specific input gates only
118
+ {"key": "Button text", "type": "string", "default": "", "description": "..."},
119
+ ...
120
+ ],
121
+ "outputs": [ # type-specific output gates only
122
+ {"key": "Button is down", "type": "number", "description": "..."},
123
+ ...
124
+ ],
125
+ "factory": "UIElement.button(name, x, y, text='...')",
126
+ }
127
+
128
+ Common layout gates (present on every element: Element shown, Color,
129
+ Anchor min/max, Size delta, etc.) are omitted for brevity.
130
+ """
131
+ protos = _load_prototypes()
132
+ groups = {
133
+ "button": [BUTTON, PEDAL, PEDAL_ALT],
134
+ "slider": [SLIDER, SLIDER_ALT, SLIDER_ALT2],
135
+ "joystick": [JOYSTICK],
136
+ "toggle": [TOGGLE],
137
+ "steering_wheel": [STEERING_WHEEL],
138
+ "input_field": [INPUT_FIELD],
139
+ "pointer": [POINTER],
140
+ "screen": [SCREEN],
141
+ "custom_icon": [CUSTOM_ICON],
142
+ }
143
+ # Inverse map: type_id -> group name
144
+ id2group = {}
145
+ for gname, ids in groups.items():
146
+ for tid in ids:
147
+ id2group[tid] = gname
148
+
149
+ if not name:
150
+ # List all types
151
+ result = []
152
+ for gname, ids in groups.items():
153
+ tid = ids[0]
154
+ proto = protos[tid]
155
+ outs = [_describe_gate(o, _COMMON_OUTPUTS) for o in proto["Outputs"]
156
+ if o["Key"] not in _COMMON_OUTPUTS]
157
+ result.append({
158
+ "type": gname,
159
+ "type_ids": ids,
160
+ "outputs": outs,
161
+ "factory": _factory_sig(gname),
162
+ })
163
+ return {"available_types": result}
164
+
165
+ key = name.lower().strip()
166
+ # Match by group name (prefix) or alias
167
+ matched_group = None
168
+ for gname in groups:
169
+ if gname == key or gname.startswith(key) or key.startswith(gname):
170
+ matched_group = gname
171
+ break
172
+ if matched_group is None:
173
+ # Try direct type name from _TYPE_NAMES
174
+ for tid, tname in _TYPE_NAMES.items():
175
+ if tname.lower() == key:
176
+ matched_group = id2group.get(tid)
177
+ break
178
+ if matched_group is None:
179
+ return {"error": f"Unknown element type '{name}'. Call element_schema() for available types."}
180
+
181
+ tid = groups[matched_group][0]
182
+ proto = protos[tid]
183
+ ins = [_describe_gate(i, _COMMON_INPUTS) for i in proto["Inputs"]
184
+ if i["Key"] not in _COMMON_INPUTS]
185
+ outs = [_describe_gate(o, _COMMON_OUTPUTS) for o in proto["Outputs"]
186
+ if o["Key"] not in _COMMON_OUTPUTS]
187
+ return {
188
+ "type": matched_group,
189
+ "type_ids": groups[matched_group],
190
+ "aliases": groups[matched_group],
191
+ "description": _type_description(matched_group),
192
+ "inputs": ins,
193
+ "outputs": outs,
194
+ "factory": _factory_sig(matched_group),
195
+ }
196
+
197
+
198
+ def _describe_gate(gate: dict, skip: set[str]) -> dict | None:
199
+ """Describe one gate, skipping common layout gates."""
200
+ if gate["Key"] in skip:
201
+ return None
202
+ dt = gate.get("GateDataType", _DT_NUMBER)
203
+ desc = {
204
+ "key": gate["Key"],
205
+ "type": _DT_NAMES.get(dt, f"dt{dt}"),
206
+ "editable": gate.get("CanBeEdited", True),
207
+ }
208
+ # Parse default value
209
+ sv = gate.get("SerializedValue", "")
210
+ if sv:
211
+ try:
212
+ pv = json.loads(sv)
213
+ if "Value" in pv:
214
+ desc["default"] = pv["Value"]
215
+ except (json.JSONDecodeError, TypeError):
216
+ pass
217
+ # Add semantic hint for well-known gates
218
+ hint = _GATE_HINTS.get(gate["Key"])
219
+ if hint:
220
+ desc["hint"] = hint
221
+ return desc
222
+
223
+
224
+ _GATE_HINTS = {
225
+ "Button text": "按钮上显示的文字",
226
+ "Button multiplier": "按下时输出的倍率",
227
+ "Inverse": "反转输出(0↔1)",
228
+ "Target value": "滑块/标签的目标值(运行时可改)",
229
+ "Min Value": "滑块最小值",
230
+ "Max Value": "滑块最大值",
231
+ "Integers only": "只允许整数值",
232
+ "Joystick Multiplier": "摇杆灵敏度倍率",
233
+ "Offset Angle": "摇杆基准角度偏移",
234
+ "Active": "开关初始状态(0=关 1=开)",
235
+ "Rotation wheel limit": "转向轮旋转范围(度)",
236
+ "Button is down": "按钮按下时=1",
237
+ "Button is up": "按钮松开时=1",
238
+ "Value": "当前值(滑块/开关/标签)",
239
+ "Joystick Activation": "摇杆激活时=1",
240
+ "Joystick Direction": "摇杆方向向量{x,y}",
241
+ "Joystick Angle": "摇杆角度(度)",
242
+ "Angle Value": "转向轮当前角度",
243
+ "Up direction": "转向轮向上方向向量",
244
+ "Is changed": "输入框内容变化时=1",
245
+ "Field Value": "输入框当前值",
246
+ "Dot viewport position": "触控点视口坐标",
247
+ "Dot screen position": "触控点屏幕坐标",
248
+ "Dot worlds position": "触控点世界坐标向量",
249
+ "active": "屏幕是否激活",
250
+ "camera": "绑定的相机实体",
251
+ }
252
+
253
+
254
+ _TYPE_DESC = {
255
+ "button": "按钮,按下输出 Button is down=1,松开输出 Button is up=1",
256
+ "slider": "滑块,拖动改变 Value 输出,支持 Min/Max 范围和整数模式",
257
+ "joystick": "摇杆,输出 Joystick Direction 向量和 Joystick Angle 角度",
258
+ "toggle": "开关,点击切换 Value(0/1)",
259
+ "steering_wheel": "转向轮,旋转输出 Angle Value 角度和 Up direction 方向",
260
+ "input_field": "文本输入框,输出 Field Value 和 Is changed 变化标志",
261
+ "pointer": "触控点,输出屏幕/视口/世界坐标位置",
262
+ "screen": "屏幕/相机面板,绑定相机实体显示视角",
263
+ "custom_icon": "自定义图标,纯显示用途无交互输出",
264
+ }
265
+
266
+
267
+ def _type_description(name: str) -> str:
268
+ return _TYPE_DESC.get(name, "")
269
+
270
+
271
+ def _factory_sig(name: str) -> str:
272
+ sigs = {
273
+ "button": 'UIElement.button(name, x, y, text="")',
274
+ "slider": 'UIElement.slider(name, x, y, value=0, mn=0, mx=1, integers_only=False)',
275
+ "joystick": 'UIElement.joystick(name, x, y, multiplier=1.0, offset_angle=0.0)',
276
+ "toggle": 'UIElement.toggle(name, x, y, active=False)',
277
+ "steering_wheel": 'UIElement.steering_wheel(name, x, y)',
278
+ "input_field": 'UIElement.input_field(name, x, y)',
279
+ "pointer": 'UIElement.pointer(name, x, y)',
280
+ "screen": 'UIElement.screen(name, x, y, active=True)',
281
+ "custom_icon": 'UIElement.custom_icon(name, x, y)',
282
+ }
283
+ return sigs.get(name, "")
284
+
285
+
286
+ # ---------------------------------------------------------------------------
287
+ # Vector2 builder (mimics Unity Vector2 JSON with magnitude/sqrMagnitude)
288
+ # ---------------------------------------------------------------------------
289
+
290
+ def _vec2(x: float, y: float) -> dict:
291
+ """Build a Unity Vector2 JSON structure with computed magnitude fields."""
292
+ import math
293
+ mag = math.sqrt(x * x + y * y)
294
+ if mag > 0:
295
+ nx, ny = x / mag, y / mag
296
+ else:
297
+ nx, ny = 0.0, 0.0
298
+ sm = x * x + y * y
299
+ if mag > 0:
300
+ snx, sny = nx, ny
301
+ snorm_nx = snx / mag if mag else 0.0
302
+ snorm_ny = sny / mag if mag else 0.0
303
+ else:
304
+ snorm_nx = snorm_ny = 0.0
305
+ return {
306
+ "x": float(x),
307
+ "y": float(y),
308
+ "normalized": {
309
+ "x": nx, "y": ny,
310
+ "normalized": {"x": snorm_nx, "y": snorm_ny,
311
+ "magnitude": 1.0 if mag > 0 else 0.0,
312
+ "sqrMagnitude": 1.0 if mag > 0 else 0.0},
313
+ "magnitude": 1.0 if mag > 0 else 0.0,
314
+ "sqrMagnitude": 1.0 if mag > 0 else 0.0,
315
+ },
316
+ "magnitude": mag,
317
+ "sqrMagnitude": sm,
318
+ }
319
+
320
+
321
+ def _vec4(x: float, y: float, z: float = 0.0, w: float = 0.0) -> dict:
322
+ """Build a Unity Vector4 (used by mechanic gates as quaternion-like)."""
323
+ import math
324
+ mag = math.sqrt(x * x + y * y + z * z + w * w)
325
+ nx = x / mag if mag > 0 else 0.0
326
+ ny = y / mag if mag > 0 else 0.0
327
+ nz = z / mag if mag > 0 else 0.0
328
+ nw = w / mag if mag > 0 else 0.0
329
+ sm = x * x + y * y + z * z + w * w
330
+ return {
331
+ "x": float(x), "y": float(y), "z": float(z), "w": float(w),
332
+ "normalized": {
333
+ "x": nx, "y": ny, "z": nz, "w": nw,
334
+ "magnitude": 1.0 if mag > 0 else 0.0,
335
+ "sqrMagnitude": 1.0 if mag > 0 else 0.0,
336
+ },
337
+ "magnitude": mag,
338
+ "sqrMagnitude": sm,
339
+ }
340
+
341
+
342
+ # ---------------------------------------------------------------------------
343
+ # SerializedValue builders (for element Inputs/Outputs)
344
+ # ---------------------------------------------------------------------------
345
+
346
+ def _num_gate_value(value: float, default: float = 0.0,
347
+ mn: float = -3.40282347e38, mx: float = 3.40282347e38,
348
+ checkbox: bool = False) -> str:
349
+ return json.dumps({
350
+ "Value": value, "Default": default,
351
+ "Min": mn, "Max": mx, "IsCheckbox": checkbox,
352
+ }, separators=(",", ":"))
353
+
354
+
355
+ def _vec_gate_value(x: float, y: float, dx: float = 0.0, dy: float = 0.0,
356
+ mn: float = -3.40282347e38, mx: float = 3.40282347e38) -> str:
357
+ return json.dumps({
358
+ "Value": _vec4(x, y),
359
+ "Default": _vec4(dx, dy),
360
+ "MinVector": _vec4(mn, mn, mn, mn),
361
+ "MaxVector": _vec4(mx, mx, mx, mx),
362
+ }, separators=(",", ":"))
363
+
364
+
365
+ def _color_gate_value(r: float, g: float, b: float, a: float = 1.0) -> str:
366
+ """Color stored as Vector4 (r,g,b,a) in 0-1 range."""
367
+ return _vec_gate_value(r, g, b, a)
368
+
369
+
370
+ def _string_gate_value(text: str = "", default: str = "",
371
+ max_len: int = 2147483647) -> str:
372
+ return json.dumps({
373
+ "IsMultiline": False, "Value": text,
374
+ "Default": default, "MaxLength": max_len,
375
+ }, separators=(",", ":"))
376
+
377
+
378
+ def _entity_gate_value() -> str:
379
+ return json.dumps({"Value": 0}, separators=(",", ":"))
380
+
381
+
382
+ # ---------------------------------------------------------------------------
383
+ # UIElement
384
+ # ---------------------------------------------------------------------------
385
+
386
+ @dataclass
387
+ class UIElement:
388
+ """A single UI element on a UI controller panel.
389
+
390
+ Use the class methods (`.button()`, `.slider()`, `.joystick()`, etc.) to
391
+ create elements with sensible defaults; then customize position/size/values.
392
+ """
393
+ type: int
394
+ name: str = ""
395
+ x: float = 0.0
396
+ y: float = 0.0
397
+ width: float = 200.0
398
+ height: float = 200.0
399
+ anchor_min: tuple[float, float] = (0.5, 0.5)
400
+ anchor_max: tuple[float, float] = (0.5, 0.5)
401
+ pivot: tuple[float, float] = (0.5, 0.5)
402
+ sorting_order: int = -1
403
+ color: tuple[float, float, float, float] = (1.0, 1.0, 1.0, 1.0)
404
+ show: bool = True
405
+ show_title: bool = False
406
+ interactible: bool = True
407
+ # Type-specific overrides for input gate values
408
+ values: dict[str, Any] = field(default_factory=dict)
409
+
410
+ # ---- Factory methods ----
411
+
412
+ @classmethod
413
+ def button(cls, name: str = "Button", x: float = 0, y: float = 0,
414
+ text: str = "", **kw) -> "UIElement":
415
+ el = cls(type=BUTTON, name=name, x=x, y=y, **kw)
416
+ if text:
417
+ el.values["Button text"] = text
418
+ return el
419
+
420
+ @classmethod
421
+ def pedal(cls, name: str = "Pedal", x: float = 0, y: float = 0,
422
+ text: str = "", **kw) -> "UIElement":
423
+ el = cls(type=PEDAL, name=name, x=x, y=y, **kw)
424
+ if text:
425
+ el.values["Button text"] = text
426
+ return el
427
+
428
+ @classmethod
429
+ def slider(cls, name: str = "Slider", x: float = 0, y: float = 0,
430
+ value: float = 0.0, mn: float = 0.0, mx: float = 1.0,
431
+ integers_only: bool = False, **kw) -> "UIElement":
432
+ el = cls(type=SLIDER, name=name, x=x, y=y, **kw)
433
+ el.values["Target value"] = value
434
+ el.values["Min Value"] = mn
435
+ el.values["Max Value"] = mx
436
+ if integers_only:
437
+ el.values["Integers only"] = 1.0
438
+ return el
439
+
440
+ @classmethod
441
+ def joystick(cls, name: str = "Joystick", x: float = 0, y: float = 0,
442
+ multiplier: float = 1.0, offset_angle: float = 0.0, **kw) -> "UIElement":
443
+ el = cls(type=JOYSTICK, name=name, x=x, y=y, **kw)
444
+ el.values["Joystick Multiplier"] = multiplier
445
+ el.values["Offset Angle"] = offset_angle
446
+ return el
447
+
448
+ @classmethod
449
+ def toggle(cls, name: str = "Toggle", x: float = 0, y: float = 0,
450
+ active: bool = False, **kw) -> "UIElement":
451
+ el = cls(type=TOGGLE, name=name, x=x, y=y, **kw)
452
+ el.values["Active"] = 1.0 if active else 0.0
453
+ return el
454
+
455
+ @classmethod
456
+ def label(cls, name: str = "Label", x: float = 0, y: float = 0,
457
+ value: float = 0.0, **kw) -> "UIElement":
458
+ # Label uses Slider family (Type=5) which has a Value output
459
+ el = cls(type=SLIDER, name=name, x=x, y=y, **kw)
460
+ el.values["Target value"] = value
461
+ return el
462
+
463
+ @classmethod
464
+ def rotation_wheel(cls, name: str = "SteeringWheel", x: float = 0, y: float = 0,
465
+ value: float = 0.0, limit: float = 360.0, **kw) -> "UIElement":
466
+ el = cls(type=STEERING_WHEEL, name=name, x=x, y=y, **kw)
467
+ el.values["Target value"] = value
468
+ el.values["Rotation wheel limit"] = limit
469
+ return el
470
+
471
+ @classmethod
472
+ def input_field(cls, name: str = "InputField", x: float = 0, y: float = 0,
473
+ **kw) -> "UIElement":
474
+ return cls(type=INPUT_FIELD, name=name, x=x, y=y, **kw)
475
+
476
+ @classmethod
477
+ def steering_wheel(cls, name: str = "SteeringWheel", x: float = 0, y: float = 0,
478
+ **kw) -> "UIElement":
479
+ return cls(type=STEERING_WHEEL, name=name, x=x, y=y, **kw)
480
+
481
+ @classmethod
482
+ def pointer(cls, name: str = "Pointer", x: float = 0, y: float = 0, **kw) -> "UIElement":
483
+ return cls(type=POINTER, name=name, x=x, y=y, **kw)
484
+
485
+ @classmethod
486
+ def screen(cls, name: str = "Screen", x: float = 0, y: float = 0,
487
+ active: bool = True, **kw) -> "UIElement":
488
+ el = cls(type=SCREEN, name=name, x=x, y=y, **kw)
489
+ el.values["active"] = 1.0 if active else 0.0
490
+ return el
491
+
492
+ @classmethod
493
+ def custom_icon(cls, name: str = "CustomIcon", x: float = 0, y: float = 0, **kw) -> "UIElement":
494
+ return cls(type=CUSTOM_ICON, name=name, x=x, y=y, **kw)
495
+
496
+ @classmethod
497
+ def indicator(cls, name: str = "Indicator1", x: float = 0, y: float = 0,
498
+ value: float = 0.0, mn: float = 0.0, mx: float = 1.0, **kw) -> "UIElement":
499
+ # Indicator1 uses Slider family (Type=6)
500
+ el = cls(type=SLIDER_ALT, name=name, x=x, y=y, **kw)
501
+ el.values["Target value"] = value
502
+ el.values["Min Value"] = mn
503
+ el.values["Max Value"] = mx
504
+ return el
505
+
506
+ # ---- Serialization ----
507
+
508
+ def to_dict(self, order: int, prototypes: dict[int, dict]) -> dict:
509
+ """Build the full element dict matching uicontrol_elements schema."""
510
+ proto = copy.deepcopy(prototypes[self.type])
511
+ el_id = str(uuid.uuid4())
512
+ proto["Id"] = el_id
513
+ proto["Name"] = self.name or proto.get("DefaultName", _TYPE_NAMES.get(self.type, ""))
514
+ proto["IsUserChangedName"] = bool(self.name)
515
+ proto["Order"] = order
516
+ proto["Show"] = self.show
517
+ proto["ShowTitle"] = self.show_title
518
+ proto["Interactible"] = self.interactible
519
+ proto["MainColor"] = {
520
+ "r": int(self.color[0] * 255),
521
+ "g": int(self.color[1] * 255),
522
+ "b": int(self.color[2] * 255),
523
+ "a": int(self.color[3] * 255),
524
+ }
525
+ proto["Key"] = order
526
+ # Apply user value overrides on Inputs
527
+ for inp in proto["Inputs"]:
528
+ gate_key = inp["Key"]
529
+ if gate_key in self.values:
530
+ new_val = self.values[gate_key]
531
+ inp["SerializedValue"] = _build_serialized_value(
532
+ inp.get("GateDataType", _DT_NUMBER), gate_key, new_val, inp.get("SerializedValue", ""))
533
+ # Update RectTransformData
534
+ proto["RectTransformData"] = _build_rect_transform(
535
+ self.x, self.y, self.width, self.height,
536
+ self.anchor_min, self.anchor_max, self.pivot, self.sorting_order)
537
+ return proto
538
+
539
+
540
+ def _build_serialized_value(data_type: int, gate_key: str, value: Any,
541
+ original_sv: str) -> str:
542
+ """Build a SerializedValue JSON string for a gate based on its type."""
543
+ if data_type in (_DT_NUMBER, _DT_INT):
544
+ # Special handling for known checkbox gates
545
+ is_checkbox = gate_key in (
546
+ "Element shown", "Element Title shown", "Button is interactable",
547
+ "Inverse", "Use border", "Use text", "Auto size", "Integers only",
548
+ "Use by timescale",
549
+ )
550
+ mn, mx = (0.0, 1.0) if is_checkbox else (-3.40282347e38, 3.40282347e38)
551
+ return _num_gate_value(float(value), default=float(value),
552
+ mn=mn, mx=mx, checkbox=is_checkbox)
553
+ if data_type == _DT_STRING:
554
+ return _string_gate_value(str(value))
555
+ if data_type == _DT_VECTOR:
556
+ if isinstance(value, dict):
557
+ return _vec_gate_value(value.get("x", 0), value.get("y", 0))
558
+ if isinstance(value, (list, tuple)):
559
+ return _vec_gate_value(value[0], value[1])
560
+ return _vec_gate_value(0.0, 0.0)
561
+ if data_type == _DT_COLOR:
562
+ if isinstance(value, dict):
563
+ return _color_gate_value(value.get("r", 1), value.get("g", 1),
564
+ value.get("b", 1), value.get("a", 1))
565
+ if isinstance(value, (list, tuple)):
566
+ return _color_gate_value(*value)
567
+ return _color_gate_value(1.0, 1.0, 1.0, 1.0)
568
+ return original_sv
569
+
570
+
571
+ def _build_rect_transform(x: float, y: float, w: float, h: float,
572
+ anchor_min: tuple, anchor_max: tuple,
573
+ pivot: tuple, sorting_order: int) -> dict:
574
+ """Build a RectTransformData dict."""
575
+ return {
576
+ "AnchoredPosition": _vec2(x, y),
577
+ "AnchorMin": _vec2(anchor_min[0], anchor_min[1]),
578
+ "AnchorMax": _vec2(anchor_max[0], anchor_max[1]),
579
+ "Pivot": _vec2(pivot[0], pivot[1]),
580
+ "SizeDelta": _vec2(w, h),
581
+ "Rotation": _vec2(0.0, 0.0),
582
+ "Scale": _vec2(1.0, 1.0),
583
+ "SortingOrder": sorting_order,
584
+ }
585
+
586
+
587
+ # ---------------------------------------------------------------------------
588
+ # UIControllerBuilder
589
+ # ---------------------------------------------------------------------------
590
+
591
+ def _float_max() -> float:
592
+ return 3.40282347e38
593
+
594
+
595
+ def _build_mech_gate(key: str, data_type: int, gate_data: str | None,
596
+ can_edit: bool = True, data_name: str | None = None) -> dict:
597
+ """Build a mechanicSerializedInputs/Outputs gate entry."""
598
+ return {
599
+ "Key": key,
600
+ "DataName": data_name or key,
601
+ "CanBeEdited": can_edit,
602
+ "GateData": gate_data,
603
+ "GateDataType": data_type,
604
+ }
605
+
606
+
607
+ def _gate_data_default(data_type: int, value: Any = None) -> str:
608
+ """Build a default GateData JSON for mechanicData."""
609
+ if data_type in (_DT_NUMBER, _DT_INT):
610
+ return json.dumps({
611
+ "Value": float(value) if value is not None else 0.0,
612
+ "Default": 0.0,
613
+ "Min": -_float_max(), "Max": _float_max(),
614
+ "IsCheckbox": False,
615
+ }, separators=(",", ":"))
616
+ if data_type == _DT_VECTOR:
617
+ return json.dumps({"Value": _vec4(0, 0)}, separators=(",", ":"))
618
+ if data_type == _DT_COLOR:
619
+ return json.dumps({"Value": _vec4(1, 1, 1, 1)}, separators=(",", ":"))
620
+ if data_type == _DT_ENTITY:
621
+ return json.dumps({"Value": 0}, separators=(",", ":"))
622
+ return "{}"
623
+
624
+
625
+ class UIControllerBuilder:
626
+ """Build a UI controller (objectId=2046689600) save object.
627
+
628
+ A UI controller holds a panel of UI elements (buttons, sliders, joysticks,
629
+ etc.). Each element has inputs (configurable properties + control signals)
630
+ and outputs (interaction events + layout state).
631
+
632
+ Example::
633
+
634
+ b = UIControllerBuilder()
635
+ b.add(UIElement.button("Fire", x=-100, y=100, text="FIRE"))
636
+ b.add(UIElement.slider("Speed", x=100, y=100, value=0.5, mx=10))
637
+ b.add(UIElement.joystick("Move", x=0, y=-100))
638
+ so = b.build_save_object(x=0, y=0)
639
+ """
640
+
641
+ def __init__(self):
642
+ self._elements: list[UIElement] = []
643
+ self._prototypes = _load_prototypes()
644
+
645
+ def add(self, element: UIElement) -> "UIControllerBuilder":
646
+ """Add a UI element. Returns self for chaining."""
647
+ self._elements.append(element)
648
+ return self
649
+
650
+ def add_button(self, name: str = "Button", x: float = 0, y: float = 0,
651
+ text: str = "", **kw) -> "UIControllerBuilder":
652
+ return self.add(UIElement.button(name, x, y, text=text, **kw))
653
+
654
+ def add_slider(self, name: str = "Slider", x: float = 0, y: float = 0,
655
+ value: float = 0.0, mn: float = 0.0, mx: float = 1.0, **kw) -> "UIControllerBuilder":
656
+ return self.add(UIElement.slider(name, x, y, value=value, mn=mn, mx=mx, **kw))
657
+
658
+ def add_joystick(self, name: str = "Joystick", x: float = 0, y: float = 0,
659
+ multiplier: float = 1.0, **kw) -> "UIControllerBuilder":
660
+ return self.add(UIElement.joystick(name, x, y, multiplier=multiplier, **kw))
661
+
662
+ def add_toggle(self, name: str = "Toggle", x: float = 0, y: float = 0,
663
+ active: bool = False, **kw) -> "UIControllerBuilder":
664
+ return self.add(UIElement.toggle(name, x, y, active=active, **kw))
665
+
666
+ def add_label(self, name: str = "Label", x: float = 0, y: float = 0,
667
+ value: float = 0.0, **kw) -> "UIControllerBuilder":
668
+ return self.add(UIElement.label(name, x, y, value=value, **kw))
669
+
670
+ @property
671
+ def element_count(self) -> int:
672
+ return len(self._elements)
673
+
674
+ def build_uicontrol_elements(self) -> dict:
675
+ """Build the uicontrol_elements metadata value."""
676
+ elements_json = [el.to_dict(i, self._prototypes)
677
+ for i, el in enumerate(self._elements)]
678
+ return {"Elements": elements_json}
679
+
680
+ def build_mechanic_data(self) -> dict:
681
+ """Build the mechanicData entry (mechanicSerializedInputs/Outputs).
682
+
683
+ Each element's Inputs/Outputs are flattened into the controller's
684
+ global gate list. Gate names may repeat across elements (e.g. multiple
685
+ "Color" gates), which is normal — the game distinguishes them by order.
686
+ """
687
+ mech_inputs: list[dict] = []
688
+ mech_outputs: list[dict] = []
689
+
690
+ # System gates
691
+ mech_inputs.append(_build_mech_gate("activation", _DT_NUMBER,
692
+ _gate_data_default(_DT_NUMBER, 1.0), can_edit=False))
693
+ mech_outputs.append(_build_mech_gate("entity", _DT_ENTITY, None, can_edit=False))
694
+ mech_outputs.append(_build_mech_gate("activation", _DT_NUMBER,
695
+ _gate_data_default(_DT_NUMBER), can_edit=False))
696
+
697
+ # Flatten element gates
698
+ for el_idx, el in enumerate(self._elements):
699
+ proto = el.to_dict(el_idx, self._prototypes)
700
+ for inp in proto["Inputs"]:
701
+ sv = inp.get("SerializedValue", "")
702
+ gd = None
703
+ if sv:
704
+ try:
705
+ parsed = json.loads(sv)
706
+ if "Value" in parsed:
707
+ gd = json.dumps({"Value": parsed["Value"]},
708
+ separators=(",", ":"))
709
+ except (json.JSONDecodeError, TypeError):
710
+ pass
711
+ mech_inputs.append(_build_mech_gate(
712
+ inp["Key"], inp.get("GateDataType", _DT_NUMBER),
713
+ gd, can_edit=inp.get("CanBeEdited", True),
714
+ data_name=inp.get("DataName", inp["Key"])))
715
+ for out in proto["Outputs"]:
716
+ sv = out.get("SerializedValue", "")
717
+ gd = None
718
+ if sv:
719
+ try:
720
+ parsed = json.loads(sv)
721
+ if "Value" in parsed:
722
+ gd = json.dumps({"Value": parsed["Value"]},
723
+ separators=(",", ":"))
724
+ except (json.JSONDecodeError, TypeError):
725
+ pass
726
+ mech_outputs.append(_build_mech_gate(
727
+ out["Key"], out.get("GateDataType", _DT_NUMBER),
728
+ gd, can_edit=out.get("CanBeEdited", True),
729
+ data_name=out.get("DataName", out["Key"])))
730
+
731
+ return {
732
+ "activationInput": 0.0,
733
+ "floatParameters": [0.0, 0.0],
734
+ "mechanicSerializedInputs": json.dumps(mech_inputs, ensure_ascii=False,
735
+ separators=(",", ":")),
736
+ "mechanicSerializedOutputs": json.dumps(mech_outputs, ensure_ascii=False,
737
+ separators=(",", ":")),
738
+ }
739
+
740
+ def build_save_object(self, x: float = 0.0, y: float = 0.0, *,
741
+ z: float = 0.0, title: str = "") -> dict:
742
+ """Build a complete UI controller saveObjects dict.
743
+
744
+ Deep-copies the controller template (from 6527test.melsave) and
745
+ overwrites mechanicData + uicontrol_elements metadata + position.
746
+ """
747
+ with open(_CONTROLLER_TEMPLATE_PATH, "r", encoding="utf-8") as f:
748
+ template = json.load(f)
749
+ so = copy.deepcopy(template)
750
+ so["position"] = {"x": float(x), "y": float(y), "z": float(z)}
751
+ so["freezed"] = True
752
+ so["constraints"] = []
753
+
754
+ # Replace mechanicData
755
+ so["mechanicData"] = [self.build_mechanic_data()]
756
+
757
+ # Replace uicontrol_elements metadata
758
+ elements_json = self.build_uicontrol_elements()
759
+ elements_str = json.dumps(elements_json, ensure_ascii=False,
760
+ separators=(",", ":"))
761
+
762
+ found = False
763
+ for sm in so["saveMetaDatas"]:
764
+ if sm["key"] == "uicontrol_elements":
765
+ sm["stringValue"] = elements_str
766
+ found = True
767
+ break
768
+ if not found:
769
+ so["saveMetaDatas"].append({
770
+ "key": "uicontrol_elements",
771
+ "boolValue": False,
772
+ "stringValue": elements_str,
773
+ "intValue": 0,
774
+ "floatValue": 0.0,
775
+ "vector2Value": {"x": 0.0, "y": 0.0},
776
+ "vector3Value": {"x": 0.0, "y": 0.0, "z": 0.0},
777
+ "vector4Value": {"x": 0.0, "y": 0.0, "z": 0.0, "w": 0.0,
778
+ "magnitude": 0.0, "sqrMagnitude": 0.0},
779
+ "texture2DValue": None,
780
+ })
781
+
782
+ # Update uicontrol_inputs / uicontrol_outputs metadata
783
+ msi = json.loads(so["mechanicData"][0]["mechanicSerializedInputs"])
784
+ mso = json.loads(so["mechanicData"][0]["mechanicSerializedOutputs"])
785
+ for sm in so["saveMetaDatas"]:
786
+ if sm["key"] == "uicontrol_inputs":
787
+ sm["stringValue"] = json.dumps(msi, ensure_ascii=False,
788
+ separators=(",", ":"))
789
+ elif sm["key"] == "uicontrol_outputs":
790
+ sm["stringValue"] = json.dumps(mso, ensure_ascii=False,
791
+ separators=(",", ":"))
792
+
793
+ return so
794
+
795
+
796
+ __all__ = [
797
+ "UIControllerBuilder", "UIElement", "element_schema",
798
+ # Type constants
799
+ "BUTTON", "PEDAL", "PEDAL_ALT", "SLIDER", "SLIDER_ALT", "SLIDER_ALT2",
800
+ "INPUT_FIELD", "STEERING_WHEEL", "POINTER", "TOGGLE", "SCREEN",
801
+ "CUSTOM_ICON", "JOYSTICK",
802
+ ]