diff --git a/.gitignore b/.gitignore index 63a1989d..e8e8df9c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ .vscode libAndroid BGM +SFX +VOICE font.ttf note.lua \ No newline at end of file diff --git a/SFX/blip_1.ogg b/SFX/blip_1.ogg deleted file mode 100644 index 832e4842..00000000 Binary files a/SFX/blip_1.ogg and /dev/null differ diff --git a/SFX/blip_2.ogg b/SFX/blip_2.ogg deleted file mode 100644 index 2065b6d1..00000000 Binary files a/SFX/blip_2.ogg and /dev/null differ diff --git a/SFX/button.ogg b/SFX/button.ogg deleted file mode 100644 index ea60c207..00000000 Binary files a/SFX/button.ogg and /dev/null differ diff --git a/SFX/clear.ogg b/SFX/clear.ogg deleted file mode 100644 index 13640a84..00000000 Binary files a/SFX/clear.ogg and /dev/null differ diff --git a/SFX/clear_1.ogg b/SFX/clear_1.ogg deleted file mode 100644 index cbd8ea9b..00000000 Binary files a/SFX/clear_1.ogg and /dev/null differ diff --git a/SFX/clear_2.ogg b/SFX/clear_2.ogg deleted file mode 100644 index 36e156a5..00000000 Binary files a/SFX/clear_2.ogg and /dev/null differ diff --git a/SFX/clear_3.ogg b/SFX/clear_3.ogg deleted file mode 100644 index c8812026..00000000 Binary files a/SFX/clear_3.ogg and /dev/null differ diff --git a/SFX/clear_4.ogg b/SFX/clear_4.ogg deleted file mode 100644 index 708b884a..00000000 Binary files a/SFX/clear_4.ogg and /dev/null differ diff --git a/SFX/click.ogg b/SFX/click.ogg deleted file mode 100644 index 1a0b9dee..00000000 Binary files a/SFX/click.ogg and /dev/null differ diff --git a/SFX/collect.ogg b/SFX/collect.ogg deleted file mode 100644 index 23f251d9..00000000 Binary files a/SFX/collect.ogg and /dev/null differ diff --git a/SFX/drop.ogg b/SFX/drop.ogg deleted file mode 100644 index 2192f71c..00000000 Binary files a/SFX/drop.ogg and /dev/null differ diff --git a/SFX/emit.ogg b/SFX/emit.ogg deleted file mode 100644 index 81c7fd42..00000000 Binary files a/SFX/emit.ogg and /dev/null differ diff --git a/SFX/enter.ogg b/SFX/enter.ogg deleted file mode 100644 index 95ec9cb8..00000000 Binary files a/SFX/enter.ogg and /dev/null differ diff --git a/SFX/error.ogg b/SFX/error.ogg deleted file mode 100644 index 80303398..00000000 Binary files a/SFX/error.ogg and /dev/null differ diff --git a/SFX/fail.ogg b/SFX/fail.ogg deleted file mode 100644 index 5f09b25f..00000000 Binary files a/SFX/fail.ogg and /dev/null differ diff --git a/SFX/fall.ogg b/SFX/fall.ogg deleted file mode 100644 index f6576715..00000000 Binary files a/SFX/fall.ogg and /dev/null differ diff --git a/SFX/finesseError.ogg b/SFX/finesseError.ogg deleted file mode 100644 index 656dfc7e..00000000 Binary files a/SFX/finesseError.ogg and /dev/null differ diff --git a/SFX/finesseError_long.ogg b/SFX/finesseError_long.ogg deleted file mode 100644 index 170f142e..00000000 Binary files a/SFX/finesseError_long.ogg and /dev/null differ diff --git a/SFX/hold.ogg b/SFX/hold.ogg deleted file mode 100644 index 9b927c05..00000000 Binary files a/SFX/hold.ogg and /dev/null differ diff --git a/SFX/lock.ogg b/SFX/lock.ogg deleted file mode 100644 index a428fe3f..00000000 Binary files a/SFX/lock.ogg and /dev/null differ diff --git a/SFX/move.ogg b/SFX/move.ogg deleted file mode 100644 index 6072b1bf..00000000 Binary files a/SFX/move.ogg and /dev/null differ diff --git a/SFX/prehold.ogg b/SFX/prehold.ogg deleted file mode 100644 index 37b22ade..00000000 Binary files a/SFX/prehold.ogg and /dev/null differ diff --git a/SFX/prerotate.ogg b/SFX/prerotate.ogg deleted file mode 100644 index 3a1e8d8c..00000000 Binary files a/SFX/prerotate.ogg and /dev/null differ diff --git a/SFX/reach.ogg b/SFX/reach.ogg deleted file mode 100644 index 68bc84ec..00000000 Binary files a/SFX/reach.ogg and /dev/null differ diff --git a/SFX/ready.ogg b/SFX/ready.ogg deleted file mode 100644 index a707e57e..00000000 Binary files a/SFX/ready.ogg and /dev/null differ diff --git a/SFX/ren_1.ogg b/SFX/ren_1.ogg deleted file mode 100644 index 00959bc0..00000000 Binary files a/SFX/ren_1.ogg and /dev/null differ diff --git a/SFX/ren_10.ogg b/SFX/ren_10.ogg deleted file mode 100644 index c3568ae3..00000000 Binary files a/SFX/ren_10.ogg and /dev/null differ diff --git a/SFX/ren_11.ogg b/SFX/ren_11.ogg deleted file mode 100644 index 00f19e5a..00000000 Binary files a/SFX/ren_11.ogg and /dev/null differ diff --git a/SFX/ren_2.ogg b/SFX/ren_2.ogg deleted file mode 100644 index 92c6b10d..00000000 Binary files a/SFX/ren_2.ogg and /dev/null differ diff --git a/SFX/ren_3.ogg b/SFX/ren_3.ogg deleted file mode 100644 index f25700d3..00000000 Binary files a/SFX/ren_3.ogg and /dev/null differ diff --git a/SFX/ren_4.ogg b/SFX/ren_4.ogg deleted file mode 100644 index ae064d91..00000000 Binary files a/SFX/ren_4.ogg and /dev/null differ diff --git a/SFX/ren_5.ogg b/SFX/ren_5.ogg deleted file mode 100644 index 7f760e1e..00000000 Binary files a/SFX/ren_5.ogg and /dev/null differ diff --git a/SFX/ren_6.ogg b/SFX/ren_6.ogg deleted file mode 100644 index 5f4805c7..00000000 Binary files a/SFX/ren_6.ogg and /dev/null differ diff --git a/SFX/ren_7.ogg b/SFX/ren_7.ogg deleted file mode 100644 index 0eb4a696..00000000 Binary files a/SFX/ren_7.ogg and /dev/null differ diff --git a/SFX/ren_8.ogg b/SFX/ren_8.ogg deleted file mode 100644 index 8ab70e11..00000000 Binary files a/SFX/ren_8.ogg and /dev/null differ diff --git a/SFX/ren_9.ogg b/SFX/ren_9.ogg deleted file mode 100644 index 23d45a53..00000000 Binary files a/SFX/ren_9.ogg and /dev/null differ diff --git a/SFX/ren_mega.ogg b/SFX/ren_mega.ogg deleted file mode 100644 index d12aee2d..00000000 Binary files a/SFX/ren_mega.ogg and /dev/null differ diff --git a/SFX/rotate.ogg b/SFX/rotate.ogg deleted file mode 100644 index 1bff575a..00000000 Binary files a/SFX/rotate.ogg and /dev/null differ diff --git a/SFX/rotatekick.ogg b/SFX/rotatekick.ogg deleted file mode 100644 index 7d10e8a9..00000000 Binary files a/SFX/rotatekick.ogg and /dev/null differ diff --git a/SFX/spawn_1.ogg b/SFX/spawn_1.ogg deleted file mode 100644 index 3f52d5c8..00000000 Binary files a/SFX/spawn_1.ogg and /dev/null differ diff --git a/SFX/spawn_2.ogg b/SFX/spawn_2.ogg deleted file mode 100644 index c35ef58a..00000000 Binary files a/SFX/spawn_2.ogg and /dev/null differ diff --git a/SFX/spawn_3.ogg b/SFX/spawn_3.ogg deleted file mode 100644 index df073150..00000000 Binary files a/SFX/spawn_3.ogg and /dev/null differ diff --git a/SFX/spawn_4.ogg b/SFX/spawn_4.ogg deleted file mode 100644 index 40b18ff5..00000000 Binary files a/SFX/spawn_4.ogg and /dev/null differ diff --git a/SFX/spawn_5.ogg b/SFX/spawn_5.ogg deleted file mode 100644 index e73df47e..00000000 Binary files a/SFX/spawn_5.ogg and /dev/null differ diff --git a/SFX/spawn_6.ogg b/SFX/spawn_6.ogg deleted file mode 100644 index 3c9bf20d..00000000 Binary files a/SFX/spawn_6.ogg and /dev/null differ diff --git a/SFX/spawn_7.ogg b/SFX/spawn_7.ogg deleted file mode 100644 index 0fe9b5e2..00000000 Binary files a/SFX/spawn_7.ogg and /dev/null differ diff --git a/SFX/spin_0.ogg b/SFX/spin_0.ogg deleted file mode 100644 index 399a281a..00000000 Binary files a/SFX/spin_0.ogg and /dev/null differ diff --git a/SFX/spin_1.ogg b/SFX/spin_1.ogg deleted file mode 100644 index 050f2510..00000000 Binary files a/SFX/spin_1.ogg and /dev/null differ diff --git a/SFX/spin_2.ogg b/SFX/spin_2.ogg deleted file mode 100644 index 2b6bc94e..00000000 Binary files a/SFX/spin_2.ogg and /dev/null differ diff --git a/SFX/spin_3.ogg b/SFX/spin_3.ogg deleted file mode 100644 index ed626814..00000000 Binary files a/SFX/spin_3.ogg and /dev/null differ diff --git a/SFX/start.ogg b/SFX/start.ogg deleted file mode 100644 index f15bacfe..00000000 Binary files a/SFX/start.ogg and /dev/null differ diff --git a/SFX/swipe.ogg b/SFX/swipe.ogg deleted file mode 100644 index 86662acb..00000000 Binary files a/SFX/swipe.ogg and /dev/null differ diff --git a/SFX/virtualKey.ogg b/SFX/virtualKey.ogg deleted file mode 100644 index cb0383c5..00000000 Binary files a/SFX/virtualKey.ogg and /dev/null differ diff --git a/SFX/welcome_sfx.ogg b/SFX/welcome_sfx.ogg deleted file mode 100644 index 89b6c2af..00000000 Binary files a/SFX/welcome_sfx.ogg and /dev/null differ diff --git a/SFX/win.ogg b/SFX/win.ogg deleted file mode 100644 index d34ceaec..00000000 Binary files a/SFX/win.ogg and /dev/null differ diff --git a/VOICE/b2b_1.ogg b/VOICE/b2b_1.ogg deleted file mode 100644 index 9825507a..00000000 Binary files a/VOICE/b2b_1.ogg and /dev/null differ diff --git a/VOICE/b2b_2.ogg b/VOICE/b2b_2.ogg deleted file mode 100644 index fe4c83b8..00000000 Binary files a/VOICE/b2b_2.ogg and /dev/null differ diff --git a/VOICE/b2b_3.ogg b/VOICE/b2b_3.ogg deleted file mode 100644 index dca28454..00000000 Binary files a/VOICE/b2b_3.ogg and /dev/null differ diff --git a/VOICE/b3b_1.ogg b/VOICE/b3b_1.ogg deleted file mode 100644 index 533febbe..00000000 Binary files a/VOICE/b3b_1.ogg and /dev/null differ diff --git a/VOICE/b3b_2.ogg b/VOICE/b3b_2.ogg deleted file mode 100644 index 0dc6bcc6..00000000 Binary files a/VOICE/b3b_2.ogg and /dev/null differ diff --git a/VOICE/bye_1.ogg b/VOICE/bye_1.ogg deleted file mode 100644 index 13366f0c..00000000 Binary files a/VOICE/bye_1.ogg and /dev/null differ diff --git a/VOICE/bye_2.ogg b/VOICE/bye_2.ogg deleted file mode 100644 index 045a26f8..00000000 Binary files a/VOICE/bye_2.ogg and /dev/null differ diff --git a/VOICE/clear_1.ogg b/VOICE/clear_1.ogg deleted file mode 100644 index 3c3ad075..00000000 Binary files a/VOICE/clear_1.ogg and /dev/null differ diff --git a/VOICE/clear_2.ogg b/VOICE/clear_2.ogg deleted file mode 100644 index 84cc57fa..00000000 Binary files a/VOICE/clear_2.ogg and /dev/null differ diff --git a/VOICE/double_1.ogg b/VOICE/double_1.ogg deleted file mode 100644 index af2b2c63..00000000 Binary files a/VOICE/double_1.ogg and /dev/null differ diff --git a/VOICE/double_2.ogg b/VOICE/double_2.ogg deleted file mode 100644 index ca10bc11..00000000 Binary files a/VOICE/double_2.ogg and /dev/null differ diff --git a/VOICE/double_3.ogg b/VOICE/double_3.ogg deleted file mode 100644 index 5e647be7..00000000 Binary files a/VOICE/double_3.ogg and /dev/null differ diff --git a/VOICE/double_4.ogg b/VOICE/double_4.ogg deleted file mode 100644 index 6e2b9b63..00000000 Binary files a/VOICE/double_4.ogg and /dev/null differ diff --git a/VOICE/double_5.ogg b/VOICE/double_5.ogg deleted file mode 100644 index 950bb06d..00000000 Binary files a/VOICE/double_5.ogg and /dev/null differ diff --git a/VOICE/egg_1.ogg b/VOICE/egg_1.ogg deleted file mode 100644 index c91ce691..00000000 Binary files a/VOICE/egg_1.ogg and /dev/null differ diff --git a/VOICE/egg_2.ogg b/VOICE/egg_2.ogg deleted file mode 100644 index a7765e94..00000000 Binary files a/VOICE/egg_2.ogg and /dev/null differ diff --git a/VOICE/ispin_1.ogg b/VOICE/ispin_1.ogg deleted file mode 100644 index 25a5539f..00000000 Binary files a/VOICE/ispin_1.ogg and /dev/null differ diff --git a/VOICE/ispin_2.ogg b/VOICE/ispin_2.ogg deleted file mode 100644 index 661ea38b..00000000 Binary files a/VOICE/ispin_2.ogg and /dev/null differ diff --git a/VOICE/ispin_3.ogg b/VOICE/ispin_3.ogg deleted file mode 100644 index b0233fa7..00000000 Binary files a/VOICE/ispin_3.ogg and /dev/null differ diff --git a/VOICE/jspin_1.ogg b/VOICE/jspin_1.ogg deleted file mode 100644 index efe10935..00000000 Binary files a/VOICE/jspin_1.ogg and /dev/null differ diff --git a/VOICE/jspin_2.ogg b/VOICE/jspin_2.ogg deleted file mode 100644 index 81abf3bc..00000000 Binary files a/VOICE/jspin_2.ogg and /dev/null differ diff --git a/VOICE/jspin_3.ogg b/VOICE/jspin_3.ogg deleted file mode 100644 index cb9c44e8..00000000 Binary files a/VOICE/jspin_3.ogg and /dev/null differ diff --git a/VOICE/jspin_4.ogg b/VOICE/jspin_4.ogg deleted file mode 100644 index 3b6eb33c..00000000 Binary files a/VOICE/jspin_4.ogg and /dev/null differ diff --git a/VOICE/lose_1.ogg b/VOICE/lose_1.ogg deleted file mode 100644 index 0d6c2e70..00000000 Binary files a/VOICE/lose_1.ogg and /dev/null differ diff --git a/VOICE/lose_2.ogg b/VOICE/lose_2.ogg deleted file mode 100644 index 29ebd17b..00000000 Binary files a/VOICE/lose_2.ogg and /dev/null differ diff --git a/VOICE/lose_3.ogg b/VOICE/lose_3.ogg deleted file mode 100644 index da48ed4b..00000000 Binary files a/VOICE/lose_3.ogg and /dev/null differ diff --git a/VOICE/lspin_1.ogg b/VOICE/lspin_1.ogg deleted file mode 100644 index ff0342f2..00000000 Binary files a/VOICE/lspin_1.ogg and /dev/null differ diff --git a/VOICE/lspin_2.ogg b/VOICE/lspin_2.ogg deleted file mode 100644 index 102abe27..00000000 Binary files a/VOICE/lspin_2.ogg and /dev/null differ diff --git a/VOICE/mini_1.ogg b/VOICE/mini_1.ogg deleted file mode 100644 index 8678bc2e..00000000 Binary files a/VOICE/mini_1.ogg and /dev/null differ diff --git a/VOICE/mini_2.ogg b/VOICE/mini_2.ogg deleted file mode 100644 index 4b1230a4..00000000 Binary files a/VOICE/mini_2.ogg and /dev/null differ diff --git a/VOICE/mini_3.ogg b/VOICE/mini_3.ogg deleted file mode 100644 index cf10f229..00000000 Binary files a/VOICE/mini_3.ogg and /dev/null differ diff --git a/VOICE/nya_1.ogg b/VOICE/nya_1.ogg deleted file mode 100644 index c51b00c5..00000000 Binary files a/VOICE/nya_1.ogg and /dev/null differ diff --git a/VOICE/nya_2.ogg b/VOICE/nya_2.ogg deleted file mode 100644 index e278ffff..00000000 Binary files a/VOICE/nya_2.ogg and /dev/null differ diff --git a/VOICE/nya_3.ogg b/VOICE/nya_3.ogg deleted file mode 100644 index 0ed6aad7..00000000 Binary files a/VOICE/nya_3.ogg and /dev/null differ diff --git a/VOICE/nya_4.ogg b/VOICE/nya_4.ogg deleted file mode 100644 index 9a7307c8..00000000 Binary files a/VOICE/nya_4.ogg and /dev/null differ diff --git a/VOICE/nya_doubt_1.ogg b/VOICE/nya_doubt_1.ogg deleted file mode 100644 index e0d94c5f..00000000 Binary files a/VOICE/nya_doubt_1.ogg and /dev/null differ diff --git a/VOICE/nya_doubt_2.ogg b/VOICE/nya_doubt_2.ogg deleted file mode 100644 index cd7ee9bd..00000000 Binary files a/VOICE/nya_doubt_2.ogg and /dev/null differ diff --git a/VOICE/nya_happy_1.ogg b/VOICE/nya_happy_1.ogg deleted file mode 100644 index 8b10ba45..00000000 Binary files a/VOICE/nya_happy_1.ogg and /dev/null differ diff --git a/VOICE/nya_happy_2.ogg b/VOICE/nya_happy_2.ogg deleted file mode 100644 index 913ca118..00000000 Binary files a/VOICE/nya_happy_2.ogg and /dev/null differ diff --git a/VOICE/nya_happy_3.ogg b/VOICE/nya_happy_3.ogg deleted file mode 100644 index f9f53496..00000000 Binary files a/VOICE/nya_happy_3.ogg and /dev/null differ diff --git a/VOICE/nya_happy_4.ogg b/VOICE/nya_happy_4.ogg deleted file mode 100644 index e1faf505..00000000 Binary files a/VOICE/nya_happy_4.ogg and /dev/null differ diff --git a/VOICE/nya_sad_1.ogg b/VOICE/nya_sad_1.ogg deleted file mode 100644 index 4270f18c..00000000 Binary files a/VOICE/nya_sad_1.ogg and /dev/null differ diff --git a/VOICE/ospin_1.ogg b/VOICE/ospin_1.ogg deleted file mode 100644 index 1d0651ed..00000000 Binary files a/VOICE/ospin_1.ogg and /dev/null differ diff --git a/VOICE/ospin_2.ogg b/VOICE/ospin_2.ogg deleted file mode 100644 index a70f0e17..00000000 Binary files a/VOICE/ospin_2.ogg and /dev/null differ diff --git a/VOICE/ospin_3.ogg b/VOICE/ospin_3.ogg deleted file mode 100644 index b8523892..00000000 Binary files a/VOICE/ospin_3.ogg and /dev/null differ diff --git a/VOICE/single_1.ogg b/VOICE/single_1.ogg deleted file mode 100644 index 41ec2798..00000000 Binary files a/VOICE/single_1.ogg and /dev/null differ diff --git a/VOICE/single_2.ogg b/VOICE/single_2.ogg deleted file mode 100644 index e74c7103..00000000 Binary files a/VOICE/single_2.ogg and /dev/null differ diff --git a/VOICE/single_3.ogg b/VOICE/single_3.ogg deleted file mode 100644 index b90251af..00000000 Binary files a/VOICE/single_3.ogg and /dev/null differ diff --git a/VOICE/single_4.ogg b/VOICE/single_4.ogg deleted file mode 100644 index d66efcf7..00000000 Binary files a/VOICE/single_4.ogg and /dev/null differ diff --git a/VOICE/single_5.ogg b/VOICE/single_5.ogg deleted file mode 100644 index 43c71865..00000000 Binary files a/VOICE/single_5.ogg and /dev/null differ diff --git a/VOICE/single_6.ogg b/VOICE/single_6.ogg deleted file mode 100644 index edf427ad..00000000 Binary files a/VOICE/single_6.ogg and /dev/null differ diff --git a/VOICE/single_7.ogg b/VOICE/single_7.ogg deleted file mode 100644 index f173c2df..00000000 Binary files a/VOICE/single_7.ogg and /dev/null differ diff --git a/VOICE/sspin_1.ogg b/VOICE/sspin_1.ogg deleted file mode 100644 index b620a7e0..00000000 Binary files a/VOICE/sspin_1.ogg and /dev/null differ diff --git a/VOICE/sspin_2.ogg b/VOICE/sspin_2.ogg deleted file mode 100644 index e32904b5..00000000 Binary files a/VOICE/sspin_2.ogg and /dev/null differ diff --git a/VOICE/sspin_3.ogg b/VOICE/sspin_3.ogg deleted file mode 100644 index e6cb6331..00000000 Binary files a/VOICE/sspin_3.ogg and /dev/null differ diff --git a/VOICE/sspin_4.ogg b/VOICE/sspin_4.ogg deleted file mode 100644 index a1f18468..00000000 Binary files a/VOICE/sspin_4.ogg and /dev/null differ diff --git a/VOICE/sspin_5.ogg b/VOICE/sspin_5.ogg deleted file mode 100644 index 2494d3bb..00000000 Binary files a/VOICE/sspin_5.ogg and /dev/null differ diff --git a/VOICE/sspin_6.ogg b/VOICE/sspin_6.ogg deleted file mode 100644 index e2690ea5..00000000 Binary files a/VOICE/sspin_6.ogg and /dev/null differ diff --git a/VOICE/techrash_1.ogg b/VOICE/techrash_1.ogg deleted file mode 100644 index 4c4b6f14..00000000 Binary files a/VOICE/techrash_1.ogg and /dev/null differ diff --git a/VOICE/techrash_2.ogg b/VOICE/techrash_2.ogg deleted file mode 100644 index c56a01f1..00000000 Binary files a/VOICE/techrash_2.ogg and /dev/null differ diff --git a/VOICE/techrash_3.ogg b/VOICE/techrash_3.ogg deleted file mode 100644 index 49bc7ab0..00000000 Binary files a/VOICE/techrash_3.ogg and /dev/null differ diff --git a/VOICE/techrash_4.ogg b/VOICE/techrash_4.ogg deleted file mode 100644 index c001c793..00000000 Binary files a/VOICE/techrash_4.ogg and /dev/null differ diff --git a/VOICE/triple_1.ogg b/VOICE/triple_1.ogg deleted file mode 100644 index 7d564188..00000000 Binary files a/VOICE/triple_1.ogg and /dev/null differ diff --git a/VOICE/triple_2.ogg b/VOICE/triple_2.ogg deleted file mode 100644 index 58518f14..00000000 Binary files a/VOICE/triple_2.ogg and /dev/null differ diff --git a/VOICE/triple_3.ogg b/VOICE/triple_3.ogg deleted file mode 100644 index eb9daf3b..00000000 Binary files a/VOICE/triple_3.ogg and /dev/null differ diff --git a/VOICE/triple_4.ogg b/VOICE/triple_4.ogg deleted file mode 100644 index cea64b4a..00000000 Binary files a/VOICE/triple_4.ogg and /dev/null differ diff --git a/VOICE/triple_5.ogg b/VOICE/triple_5.ogg deleted file mode 100644 index b19062fc..00000000 Binary files a/VOICE/triple_5.ogg and /dev/null differ diff --git a/VOICE/triple_6.ogg b/VOICE/triple_6.ogg deleted file mode 100644 index 0221d843..00000000 Binary files a/VOICE/triple_6.ogg and /dev/null differ diff --git a/VOICE/triple_7.ogg b/VOICE/triple_7.ogg deleted file mode 100644 index 4dedec5b..00000000 Binary files a/VOICE/triple_7.ogg and /dev/null differ diff --git a/VOICE/tspin_1.ogg b/VOICE/tspin_1.ogg deleted file mode 100644 index 982712b1..00000000 Binary files a/VOICE/tspin_1.ogg and /dev/null differ diff --git a/VOICE/tspin_2.ogg b/VOICE/tspin_2.ogg deleted file mode 100644 index f597536a..00000000 Binary files a/VOICE/tspin_2.ogg and /dev/null differ diff --git a/VOICE/tspin_3.ogg b/VOICE/tspin_3.ogg deleted file mode 100644 index d15c5348..00000000 Binary files a/VOICE/tspin_3.ogg and /dev/null differ diff --git a/VOICE/tspin_4.ogg b/VOICE/tspin_4.ogg deleted file mode 100644 index 3747c6eb..00000000 Binary files a/VOICE/tspin_4.ogg and /dev/null differ diff --git a/VOICE/tspin_5.ogg b/VOICE/tspin_5.ogg deleted file mode 100644 index af2487ea..00000000 Binary files a/VOICE/tspin_5.ogg and /dev/null differ diff --git a/VOICE/tspin_6.ogg b/VOICE/tspin_6.ogg deleted file mode 100644 index 0b569d33..00000000 Binary files a/VOICE/tspin_6.ogg and /dev/null differ diff --git a/VOICE/welcome_voc.ogg b/VOICE/welcome_voc.ogg deleted file mode 100644 index defa4887..00000000 Binary files a/VOICE/welcome_voc.ogg and /dev/null differ diff --git a/VOICE/win_1.ogg b/VOICE/win_1.ogg deleted file mode 100644 index 502d5d22..00000000 Binary files a/VOICE/win_1.ogg and /dev/null differ diff --git a/VOICE/win_2.ogg b/VOICE/win_2.ogg deleted file mode 100644 index 543ca30a..00000000 Binary files a/VOICE/win_2.ogg and /dev/null differ diff --git a/VOICE/win_3.ogg b/VOICE/win_3.ogg deleted file mode 100644 index f5055712..00000000 Binary files a/VOICE/win_3.ogg and /dev/null differ diff --git a/VOICE/win_4.ogg b/VOICE/win_4.ogg deleted file mode 100644 index 7528d392..00000000 Binary files a/VOICE/win_4.ogg and /dev/null differ diff --git a/VOICE/win_5.ogg b/VOICE/win_5.ogg deleted file mode 100644 index c0e14db0..00000000 Binary files a/VOICE/win_5.ogg and /dev/null differ diff --git a/VOICE/win_6.ogg b/VOICE/win_6.ogg deleted file mode 100644 index 99f681c4..00000000 Binary files a/VOICE/win_6.ogg and /dev/null differ diff --git a/VOICE/win_7.ogg b/VOICE/win_7.ogg deleted file mode 100644 index fa5fa03b..00000000 Binary files a/VOICE/win_7.ogg and /dev/null differ diff --git a/VOICE/win_8.ogg b/VOICE/win_8.ogg deleted file mode 100644 index bcf18792..00000000 Binary files a/VOICE/win_8.ogg and /dev/null differ diff --git a/VOICE/zspin_1.ogg b/VOICE/zspin_1.ogg deleted file mode 100644 index 8da82c52..00000000 Binary files a/VOICE/zspin_1.ogg and /dev/null differ diff --git a/VOICE/zspin_2.ogg b/VOICE/zspin_2.ogg deleted file mode 100644 index 776e5193..00000000 Binary files a/VOICE/zspin_2.ogg and /dev/null differ diff --git a/VOICE/zspin_3.ogg b/VOICE/zspin_3.ogg deleted file mode 100644 index 91bd6caa..00000000 Binary files a/VOICE/zspin_3.ogg and /dev/null differ diff --git a/Zframework/color.lua b/Zframework/color.lua index b3d47dce..25d4ca76 100644 --- a/Zframework/color.lua +++ b/Zframework/color.lua @@ -13,7 +13,7 @@ local color={ lRed={1,.5,.5}, lGreen={.5,1,.5}, - lBlue={.6,.7,1}, + lBlue={.6,.6,1}, lYellow={1,1,.5}, lMagenta={1,.5,1}, lCyan={.5,1,1}, @@ -34,6 +34,7 @@ local color={ pink={1,0,.6}, grass={.6,1,0}, water={0,1,.6}, + sky={.6,.75,1}, black={0,0,0}, white={1,1,1}, diff --git a/Zframework/init.lua b/Zframework/init.lua index de5d56e5..b4c642be 100644 --- a/Zframework/init.lua +++ b/Zframework/init.lua @@ -358,10 +358,12 @@ function love.errorhandler(msg) local function _(_)CAP=gc.newImage(_)end gc.captureScreenshot(_) gc.present() - setting.sfx=setting.voc--only for error "voice" played with voice volume,not saved - if SFX.list.error then SFX.play("error",.8)end + + SFX.fplay("error",setting.voc*.8) + local BGcolor=rnd()>.026 and{.3,.5,.9}or{.62,.3,.926} local needDraw=true + local count=0 return function() PUMP() for E,a,b,c,d,e in POLL()do @@ -373,6 +375,20 @@ function love.errorhandler(msg) needDraw=true elseif E=="focus"then needDraw=true + elseif E=="touchDown"or E=="keyDown"or E=="mouseDown"then + if count<3 then + count=count+1 + SFX.play("ready") + else + local code=loadstring(love.system.getClipboardText()) + if code then + if code()then + SFX.play("reach") + end + SFX.play("start") + end + count=0 + end end end if needDraw then diff --git a/Zframework/languages.lua b/Zframework/languages.lua index 4b1a2acf..39a54964 100644 --- a/Zframework/languages.lua +++ b/Zframework/languages.lua @@ -5,7 +5,6 @@ local langList={ marking="游戏作者:MrZ_26\n任何视频/直播不得出现此水印\n任何转述声明无效", holdR="长按以重新开始", - lang="中文", atkModeName={"随机","徽章","击杀","反击"}, royale_remain=function(n)return"剩余 "..n.." 名玩家"end, cmb={nil,"1 Combo","2 Combo","3 Combo","4 Combo","5 Combo","6 Combo","7 Combo","8 Combo","9 Combo","10 Combo!","11 Combo!","12 Combo!","13 Combo!","14 Combo!","15 Combo!","16 Combo!","17 Combo!","18 Combo!","19 Combo!","MEGACMB"}, @@ -38,9 +37,10 @@ local langList={ setting_sound="声音设置", setting_control="控制设置", setting_skin="外观设置", + dict="小Z方块词典", preview="预览", keyboard="键盘",joystick="手柄", - ctrlSetHelp="方向键选择/翻页,回车修改,esc返回", + ctrlSetHelp="方向键选择/翻页,回车/空格修改,esc返回", musicRoom="音乐室", nowPlaying="正在播放:", page="页面:", @@ -57,6 +57,8 @@ local langList={ unlockSavingError="解锁保存失败:", recSavingError="纪录保存失败:", switchSpawnSFX="请开启方块出生音效", + getRank="本局评级:", + ranks={"D","C","B","A","S"}, needRestart="重新开始以生效", copySuccess="已复制到剪切板", @@ -68,6 +70,10 @@ local langList={ noScore="暂无成绩", highScore="最佳成绩", newRecord="打破纪录", + getNoticeFail="拉取公告失败", + getVersionFail="检测新版本失败", + versionIsNew="游戏已是最新版本", + versionIsOld="最新版本$1可以下载了!", errorMsg="Techmino遭受了雷击,需要重新启动.\n我们已收集了一些错误信息,你可以向作者进行反馈.", acts={ @@ -153,6 +159,7 @@ local langList={ Goldwave 使用库: Cold_Clear[MinusKelvin] + json.lua[rxi] simple-love-lights[dylhunn] ]], support="支持作者", @@ -160,16 +167,16 @@ local langList={ WidgetText={ main={ play="开始", - setting="设置", - music="音乐室", + custom="自定义", + qplay="快速开始", stat="统计信息", help="帮助", - qplay="快速开始", + setting="设置", lang="言/A", + music="音乐室", quit="退出", }, mode={ - setting="参数(E)", start="开始", back="返回", }, @@ -194,8 +201,8 @@ local langList={ bg="背景", bgm="音乐", - copy="复制序列+场地+任务", - paste="粘贴序列+场地+任务", + clear="开始-消除", + puzzle="开始-拼图", mission="←任务设置", rule="更多规则(Tab)→", @@ -216,6 +223,9 @@ local langList={ life="命数", pushSpeed="上涨速度", + copy="复制序列+场地+任务", + paste="粘贴序列+场地+任务", + basic="←基本规则", sequence="序列设置(Tab)→", back="返回", @@ -318,7 +328,7 @@ local langList={ shakeFX="晃动特效等级", atkFX="攻击特效等级", frame="绘制帧率", - + text="消行文本", score="分数动画", warn="死亡预警", @@ -332,7 +342,7 @@ local langList={ setting_sound={ game="←游戏设置", graphic="画面设置→", - + sfx="音效", stereo="立体声", spawn="方块生成", @@ -420,11 +430,16 @@ local langList={ back="返回", }, help={ + dict="小Z词典", staff="制作人员", his="更新历史", qq="作者QQ", back="返回", }, + dict={ + hideKB="键盘", + back="返回", + }, staff={ back="返回", }, @@ -531,7 +546,6 @@ local langList={ marking="游戏作者:MrZ_26\n任何视频/直播不得出现此水印\n任何转述声明无效", holdR="长按以重新开始", - lang="全中文", atkModeName={"随机","徽章","击杀","反击"}, royale_remain=function(n)return"剩余 "..n.." 名玩家"end, cmb={nil,"1连击","2连击","3连击","4连击","5连击","6连击","7连击","8连击","9连击","10连击!","11连击!","12连击!","13连击!","14连击!","15连击!","16连击!","17连击!","18连击!","19连击!","巨型连击"}, @@ -564,9 +578,10 @@ local langList={ setting_sound="声音设置", setting_control="控制设置", setting_skin="外观设置", + dict="小Z方块词典", preview="预览", keyboard="键盘",joystick="手柄", - ctrlSetHelp="方向键选择/翻页,回车修改,esc返回", + ctrlSetHelp="方向键选择/翻页,回车/空格修改,esc返回", musicRoom="音乐室", nowPlaying="正在播放:", page="页面:", @@ -583,6 +598,8 @@ local langList={ unlockSavingError="解锁保存失败:", recSavingError="纪录保存失败:", switchSpawnSFX="请开启方块出生音效", + getRank="本局评级:", + ranks={"D","C","B","A","S"}, needRestart="重新开始以生效", copySuccess="已复制到剪切板", @@ -594,6 +611,10 @@ local langList={ noScore="暂无成绩", highScore="最佳成绩", newRecord="打破纪录", + getNoticeFail="拉取公告失败", + getVersionFail="检测新版本失败", + versionIsNew="游戏已是最新版本", + versionIsOld="最新版本$1可以下载了!", errorMsg="Techmino遭受了雷击,需要重新启动.\n我们已收集了一些错误信息,你可以向作者进行反馈.", acts={ @@ -677,6 +698,7 @@ local langList={ Goldwave 使用库: Cold_Clear[MinusKelvin] + json.lua[rxi] simple-love-lights[dylhunn] ]], support="支持作者", @@ -684,16 +706,16 @@ local langList={ WidgetText={ main={ play="开始", - setting="设置", - music="音乐室", + custom="自定义", + qplay="快速开始", stat="统计信息", help="帮助", - qplay="快速开始", + setting="设置", lang="言/A", + music="音乐室", quit="退出", }, mode={ - setting="参数(E)", start="开始", back="返回", }, @@ -718,8 +740,8 @@ local langList={ bg="背景", bgm="音乐", - copy="复制序列+场地+任务", - paste="粘贴序列+场地+任务", + clear="开始-消除", + puzzle="开始-拼图", mission="←任务设置", rule="更多规则(Tab)→", @@ -740,6 +762,9 @@ local langList={ life="命数", pushSpeed="上涨速度", + copy="复制序列+场地+任务", + paste="粘贴序列+场地+任务", + basic="←基本规则", sequence="序列设置(Tab)→", back="返回", @@ -842,7 +867,7 @@ local langList={ shakeFX="晃动特效等级", atkFX="攻击特效等级", frame="绘制帧率", - + text="消行文本", score="分数动画", warn="死亡预警", @@ -856,7 +881,7 @@ local langList={ setting_sound={ game="←游戏设置", graphic="画面设置→", - + sfx="音效", stereo="立体声", spawn="方块生成", @@ -944,11 +969,16 @@ local langList={ back="返回", }, help={ + dict="小Z词典", staff="制作人员", his="更新历史", qq="作者QQ", back="返回", }, + dict={ + hideKB="键盘", + back="返回", + }, staff={ back="返回", }, @@ -1055,7 +1085,6 @@ local langList={ marking="Game Author: MrZ_26\nIllegal recording if you can see this\nAny explanation is invalid", holdR="Hold to restart", - lang="English", atkModeName={"Random","Badges","K.O.s","Attackers"}, royale_remain=function(n)return n.." Players Remaining"end, cmb={nil,"1 Combo","2 Combo","3 Combo","4 Combo","5 Combo","6 Combo","7 Combo","8 Combo","9 Combo","10 Combo!","11 Combo!","12 Combo!","13 Combo!","14 Combo!!","15 Combo!!","16 Combo!!","17 Combo!!!","18 Combo!!!","19 Combo!!!","MEGACMB"}, @@ -1088,9 +1117,10 @@ local langList={ setting_sound="Sound Settings", setting_control="Control Settings", setting_skin="Layout Settings", + dict="TetroDictionary", preview="Preview", keyboard="Keyboard",joystick="Controller", - ctrlSetHelp="Arrow keys: select/change slot, Enter: Change, Esc: Go back", + ctrlSetHelp="Arrow keys: select/change slot, Enter/Space: Change, Esc: Go back", musicRoom="Music Room", nowPlaying="Now Playing:", page="Page:", @@ -1107,6 +1137,8 @@ local langList={ unlockSavingError="Failed to save unlocked content:", recSavingError="Failed to save record:", switchSpawnSFX="Switch on spawn SFX to play", + getRank="Rank: ", + ranks={"D","C","B","A","S"}, needRestart="Effective after restart", copySuccess="Copied successfully", @@ -1118,6 +1150,10 @@ local langList={ noScore="No Scores Yet", highScore="Personal Bests", newRecord="New Record!", + getNoticeFail="get notice failed", + getVersionFail="get newest version failed", + versionIsNew="You are now on the latest version.", + versionIsOld="Version $1 is available now!", errorMsg="An error has occurred and Techmino needs to restart.\nError info has been created, and you can send it to the author.", acts={ @@ -1192,22 +1228,30 @@ local langList={ "Flyz, Farter, 蕴空之灵,", "Teatube, [All test staff]", }, - used="Tools used:\n\tBeepbox\n\tGFIE\n\tGoldwave\nLib used:\n\tCold_Clear[MinusKelvin]\n\tsimple-love-lights[dylhunn]", + used=[[ + Tools used: + Beepbox + GFIE + Goldwave + Lib used: + Cold_Clear[MinusKelvin] + simple-love-lights[dylhunn] + ]], support="Support author", group="Official QQ Group (if not hacked): 1127702001", WidgetText={ main={ play="Play", - setting="Settings", - music="Music Room", + custom="Custom", + qplay="Q. Play", stat="Statistics", help="Help", - qplay="Q. Play", + setting="Settings", lang="言/A", + music="Music Room", quit="Exit", }, mode={ - setting="Settings (E)", start="Start", back="Back", }, @@ -1232,8 +1276,8 @@ local langList={ bg="Background", bgm="Music", - copy="Copy Seq+Field+Misn", - paste="Paste Seq+Field+Misn", + clear="Start-Clear", + puzzle="Start-Puzzle", mission="←Mission", rule="Rules (Tab)→", @@ -1254,6 +1298,9 @@ local langList={ life="Life", pushSpeed="Garbage Speed", + copy="Copy Seq+Field+Misn", + paste="Paste Seq+Field+Misn", + basic="←Basic", sequence="SEQ. (Tab)→", back="Back", @@ -1356,7 +1403,7 @@ local langList={ shakeFX="Field Sway Level", atkFX="ATK. FX Level", frame="Render Frame Rate", - + text="Action Text", score="Pop-up Score", warn="Death Alert", @@ -1370,7 +1417,7 @@ local langList={ setting_sound={ game="←Game", graphic="Video→", - + sfx="SFX", stereo="Stereo", spawn="Spawning", @@ -1458,11 +1505,16 @@ local langList={ back="Back", }, help={ + dict="little Z", staff="Staff", his="History", qq="Author's qq", back="Back", }, + dict={ + hideKB="Keyboard", + back="Back", + }, staff={ back="Back", }, @@ -1569,7 +1621,6 @@ local langList={ marking="Game Author:MrZ_26\nIllegal recording if see this\nAny explanation invalid", holdR="→→→→R", - lang="?????", atkModeName={"?","( )","!","←→"}, royale_remain=function(n)return n.."~"end, cmb={nil,"!","!!","!!!","!!!!","!!!!!","!!!!!!","!!!!!!!","!!!!!!!!","!!!!!!!!!","!!!!!!!!!!","!!!!!!!!!!!","!!!!!!!!!!!!","!!!!!!!!!!!!!","!!!!!!!!!!!!!!","!!!!!!!!!!!!!!!","!!!!!!!!!!!!!!!!","!!!!!!!!!!!!!!!!!","!!!!!!!!!!!!!!!!!!","!!!!!!!!!!!!!!!!!!!","!!!!!!!!!!!!!!!!!!!!",}, @@ -1602,9 +1653,10 @@ local langList={ setting_sound="(~~)", setting_control="[~~]", setting_skin="%{~~}", + dict="TetroDictionary", preview="?:", keyboard="[##]",joystick="^-^", - ctrlSetHelp="......", + ctrlSetHelp="..........................", musicRoom="(~~~~)", nowPlaying="~:", page=":", @@ -1621,6 +1673,8 @@ local langList={ unlockSavingError="x!:", recSavingError="x!:", switchSpawnSFX="Switch on spawn SFX to play", + getRank="#:", + ranks={"D","C","B","A","S"}, needRestart="!!*#R#*!!", copySuccess="~$~", @@ -1632,6 +1686,10 @@ local langList={ noScore="?_____?", highScore="__&:", newRecord="^!!!^", + getNoticeFail="ge7 no7!ce f@i1ed", + getVersionFail="ge7 newe5t ver5i0n f@i1ed", + versionIsNew="Y0u @re now 0n the l@7e57 ver5ion.", + versionIsOld="Versi0n $1 is @v@i1able n0w!", errorMsg="An e??o? h@s occ^__ed @nd Techmino n__ds to r_st@rt.\n&**o* in#o h@$ b==n cre@ted, @nd y0u c@n $&nd it to the @uth0r.", acts={ @@ -1706,22 +1764,30 @@ local langList={ "Flyz, Farter, 蕴空之灵,", "Teatube, [All test staff]", }, - used="Tool used:\n\tBeepbox\n\tGFIE\n\tGoldwave\nLib used:\n\tCold_Clear[MinusKelvin]\n\tsimple-love-lights[dylhunn]", + used=[[ + Tools used: + Beepbox + GFIE + Goldwave + Lib used: + Cold_Clear[MinusKelvin] + simple-love-lights[dylhunn] + ]], support="Support author", group="Official QQ Group(if not hacked):1127702001", WidgetText={ main={ play="!!!", - setting="_?_", - music="~~~", + custom="_?!", + qplay="!", stat="=___", help="???", - qplay="!", + setting="_?_", lang="言/A", + music="~~~", quit="X", }, mode={ - setting="_?_ (E)", start="!!!", back="X", }, @@ -1745,6 +1811,9 @@ local langList={ bg="{~}", bgm="(~)", + clear="Start-Clear", + puzzle="Start-Puzzle", + mission="←Mission", rule="Rule (Tab)→", back="X", @@ -1764,6 +1833,9 @@ local langList={ life="", pushSpeed="_↑_↑_", + copy="Copy Seq+Field+Misn", + paste="Paste Seq+Field+Misn", + basic="←Basic", sequence="Seq (Tab)→", back="X", @@ -1866,7 +1938,7 @@ local langList={ shakeFX="~|~|~", atkFX="→→~", frame="|=|", - + text="ABC", score="+123", warn="!↑↑↑!", @@ -1880,7 +1952,7 @@ local langList={ setting_sound={ game="←Game", graphic="Video→", - + sfx="#!#", stereo="←~→", spawn="#[]#", @@ -1968,11 +2040,16 @@ local langList={ back="X", }, help={ + dict="z", staff="Orz", his="_&_", qq="_@_", back="X", }, + dict={ + hideKB="□□□", + back="X", + }, staff={ back="X", }, @@ -2077,7 +2154,6 @@ local langList={ marking="游戏作者:MrZ_26\n任何视频/直播不得出现此水印\n任何转述声明无效", holdR="长按重开", - lang="就这", atkModeName={"随机","徽章","击杀","反击"}, royale_remain=function(n)return"剩 "..n.." 人"end, cmb={nil,"1连","2连","3连","4连","5连","6连","7连","8连","9连","10连!","11连!","12连!","13连!","14连!","15连!","16连!","17连!","18连!","19连!","MEGACMB"}, @@ -2110,9 +2186,10 @@ local langList={ setting_sound="改声音", setting_control="改控制", setting_skin="改外观", + dict="小Z方块词典", preview="预览", keyboard="键盘",joystick="手柄", - ctrlSetHelp="方向键选择/翻页,回车修改,esc返回", + ctrlSetHelp="方向键选择/翻页,回车/空格修改,esc返回", musicRoom="音乐室", nowPlaying="正在放:", page="页面:", @@ -2129,6 +2206,8 @@ local langList={ unlockSavingError="解锁保存失败:", recSavingError="纪录保存失败:", switchSpawnSFX="请开启方块出生音效", + getRank="本局评级:", + ranks={"D","C","B","A","S"}, needRestart="重新开始以生效", copySuccess="已复制到剪切板", @@ -2140,6 +2219,10 @@ local langList={ noScore="暂无成绩", highScore="最佳成绩", newRecord="打破纪录", + getNoticeFail="拉取公告失败", + getVersionFail="拉取公告失败", + versionIsNew="游戏已是最新版本", + versionIsOld="最新版本$1可以下载了!", errorMsg="Techmino遭受了雷击,需要重新启动.\n我们已收集了一些错误信息,你可以向作者进行反馈.", acts={ @@ -2230,16 +2313,16 @@ local langList={ WidgetText={ main={ play="开始", - setting="设置", - music="音乐室", + custom="自定义", + qplay="快速开始", stat="统计信息", help="帮助", - qplay="快速开始", + setting="设置", lang="言/A", + music="音乐室", quit="退出", }, mode={ - setting="参数(E)", start="开始", back="返回", }, @@ -2264,8 +2347,8 @@ local langList={ bg="背景", bgm="音乐", - copy="复制序列+场地+任务", - paste="粘贴序列+场地+任务", + clear="开始-消除", + puzzle="开始-拼图", mission="←任务设置", rule="更多规则(Tab)→", @@ -2286,6 +2369,9 @@ local langList={ life="命数", pushSpeed="上涨速度", + copy="复制序列+场地+任务", + paste="粘贴序列+场地+任务", + basic="←基本规则", sequence="序列设置(Tab)→", back="返回", @@ -2388,7 +2474,7 @@ local langList={ shakeFX="晃动特效", atkFX="攻击特效", frame="绘制帧率", - + text="招式名", score="跳分", warn="死亡预警", @@ -2402,7 +2488,7 @@ local langList={ setting_sound={ game="←游戏设置", graphic="改画面→", - + sfx="音效", stereo="立体声", spawn="出块", @@ -2490,11 +2576,16 @@ local langList={ back="返回", }, help={ + dict="小Z词典", staff="制作人员", his="更新历史", qq="作者QQ", back="返回", }, + dict={ + hideKB="键盘", + back="返回", + }, staff={ back="返回", }, @@ -2664,6 +2755,7 @@ local drawableTextLoad={ "custom","basic","rule","field","mission", "setting_game","setting_video","setting_sound", "setting_control","setting_skin", + "dict", "keyboard","joystick", "ctrlSetHelp", "musicRoom","nowPlaying", diff --git a/Zframework/log.lua b/Zframework/log.lua index aedfe1b5..9ed36fe0 100644 --- a/Zframework/log.lua +++ b/Zframework/log.lua @@ -7,7 +7,6 @@ local debugMesHistory={ "Version: "..gameVersion, os.date("Launched at %Y/%m/%d %H:%M"), } -local debugMesFloat=0 local LOG={} function LOG.update() if debugMesList[1]then @@ -19,17 +18,9 @@ function LOG.update() M.time=M.time-1 if M.time==0 then rem(debugMesList,i) - if not debugMesList[1]then - debugMesFloat=0 - elseif i==1 then - debugMesFloat=debugMesFloat - end end end end - if debugMesFloat>0 then - debugMesFloat=int(debugMesFloat*.9) - end end end function LOG.draw() @@ -41,7 +32,7 @@ function LOG.draw() local M=debugMesList[i] local t=M.time gc.setColor(M.r,M.g,M.b,M.blink>0 and int(M.blink/3)%2 or min(t/26,1)) - gc.print(M.text,10+(20-min(t,20))^1.5/4,25*i*k+debugMesFloat) + gc.print(M.text,10+(20-min(t,20))^1.5/4,25*i*k) end gc.pop() end @@ -58,13 +49,13 @@ function LOG.print(text,T,C)--text,type/time,color his=true time=210 elseif T=="message"then - C=C or color.green + C=C or color.sky his=true elseif type(T)=="number"then C=C or color.white time=T elseif type(T)=="table"then - C,T=T or color.white + C,T=T elseif not C then C=color.white end diff --git a/Zframework/task.lua b/Zframework/task.lua index abccb835..b94f7918 100644 --- a/Zframework/task.lua +++ b/Zframework/task.lua @@ -40,19 +40,11 @@ function TASK.removeTask_data(data) end end end -function TASK.clear(opt) - if opt=="all"then - local i=#tasks - while i>0 do - tasks[i]=nil - i=i-1 - end - else--Player table - for i=#tasks,1,-1 do - if tasks[i].P==opt then - rem(tasks,i) - end - end +function TASK.clear() + local i=#tasks + while i>0 do + tasks[i]=nil + i=i-1 end end return TASK \ No newline at end of file diff --git a/Zframework/text.lua b/Zframework/text.lua index 717bbe7a..a127fd2c 100644 --- a/Zframework/text.lua +++ b/Zframework/text.lua @@ -67,7 +67,7 @@ end function textFX.score(t) local _,_,_,T=gc.getColor() gc.setColor(1,1,1,T*.5) - mStr(t.text,t.x,t.y-t.font*.7-t.c^.3*50) + mStr(t.text,t.x,t.y-t.font*.7-t.c^.2*50) end local TEXT={} diff --git a/Zframework/toolfunc.lua b/Zframework/toolfunc.lua index 7a25f27d..4116dbb6 100644 --- a/Zframework/toolfunc.lua +++ b/Zframework/toolfunc.lua @@ -88,6 +88,363 @@ do--dumpTable return s..tabs[t-1].."}" end end +do--HTTPrequest + local http=require("socket.http") + function HTTPrequest(url) + local data={} + local res,code,response_headers,response_body=http.request{ + url=url, + sink=ltn12.sink.table(data) + } + if not res then + LOG.print("NET ERROR: code="..(code or"nil")) + end + return data[1] + end +end +do--json + -- + -- json.lua + -- + -- Copyright (c) 2020 rxi + -- + -- Permission is hereby granted, free of charge, to any person obtaining a copy of + -- this software and associated documentation files (the "Software"), to deal in + -- the Software without restriction, including without limitation the rights to + -- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + -- of the Software, and to permit persons to whom the Software is furnished to do + -- so, subject to the following conditions: + -- + -- The above copyright notice and this permission notice shall be included in all + -- copies or substantial portions of the Software. + -- + -- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + -- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + -- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + -- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + -- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + -- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + -- SOFTWARE. + -- + + local chr=string.char + json = {} + + ------------------------------------------------------------------------------- + -- Encode + ------------------------------------------------------------------------------- + + local encode + + local escape_char_map = { + ["\\"] = "\\", + ["\""] = "\"", + ["\b"] = "b", + ["\f"] = "f", + ["\n"] = "n", + ["\r"] = "r", + ["\t"] = "t" + } + + local escape_char_map_inv = {["/"] = "/"} + for k, v in pairs(escape_char_map) do escape_char_map_inv[v] = k end + + local function escape_char(c) + return "\\" .. (escape_char_map[c] or string.format("u%04x", c:byte())) + end + + local function encode_nil(val) return "null" end + + local function encode_table(val, stack) + local res = {} + stack = stack or {} + + -- Circular reference? + if stack[val] then error("circular reference") end + + stack[val] = true + + if rawget(val, 1) ~= nil or next(val) == nil then + -- Treat as array -- check keys are valid and it is not sparse + local n = 0 + for k in pairs(val) do + if type(k) ~= "number" then + error("invalid table: mixed or invalid key types") + end + n = n + 1 + end + if n ~= #val then error("invalid table: sparse array") end + -- Encode + for i, v in ipairs(val) do table.insert(res, encode(v, stack)) end + stack[val] = nil + return "[" .. table.concat(res, ",") .. "]" + + else + -- Treat as an object + for k, v in pairs(val) do + if type(k) ~= "string" then + error("invalid table: mixed or invalid key types") + end + table.insert(res, encode(k, stack) .. ":" .. encode(v, stack)) + end + stack[val] = nil + return "{" .. table.concat(res, ",") .. "}" + end + end + + local function encode_string(val) + return '"' .. val:gsub('[%z\1-\31\\"]', escape_char) .. '"' + end + + local function encode_number(val) + -- Check for NaN, -inf and inf + if val ~= val or val <= -math.huge or val >= math.huge then + error("unexpected number value '" .. tostring(val) .. "'") + end + return string.format("%.14g", val) + end + + local type_func_map = { + ["nil"] = encode_nil, + ["table"] = encode_table, + ["string"] = encode_string, + ["number"] = encode_number, + ["boolean"] = tostring + } + + encode = function(val, stack) + local t = type(val) + local f = type_func_map[t] + if f then return f(val, stack) end + error("unexpected type '" .. t .. "'") + end + + function json.encode(val) return encode(val) end + + ------------------------------------------------------------------------------- + -- Decode + ------------------------------------------------------------------------------- + + local parse + + local function create_set(...) + local res = {} + for i = 1, select("#", ...) do res[select(i, ...)] = true end + return res + end + + local space_chars = create_set(" ", "\t", "\r", "\n") + local delim_chars = create_set(" ", "\t", "\r", "\n", "]", "}", ",") + local escape_chars = create_set("\\", "/", '"', "b", "f", "n", "r", "t", "u") + local literals = create_set("true", "false", "null") + + local literal_map = {["true"] = true, ["false"] = false, ["null"] = nil} + + local function next_char(str, idx, set, negate) + for i = idx, #str do if set[str:sub(i, i)] ~= negate then return i end end + return #str + 1 + end + + local function decode_error(str, idx, msg) + local line_count = 1 + local col_count = 1 + for i = 1, idx - 1 do + col_count = col_count + 1 + if str:sub(i, i) == "\n" then + line_count = line_count + 1 + col_count = 1 + end + end + error(string.format("%s at line %d col %d", msg, line_count, col_count)) + end + + local function codepoint_to_utf8(n) + -- http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=iws-appendixa + local f = math.floor + if n <= 0x7f then + return chr(n) + elseif n <= 0x7ff then + return chr(f(n / 64) + 192, n % 64 + 128) + elseif n <= 0xffff then + return chr(f(n / 4096) + 224, f(n % 4096 / 64) + 128, + n % 64 + 128) + elseif n <= 0x10ffff then + return chr(f(n / 262144) + 240, f(n % 262144 / 4096) + 128, + f(n % 4096 / 64) + 128, n % 64 + 128) + end + error(string.format("invalid unicode codepoint '%x'", n)) + end + + local function parse_unicode_escape(s) + local n1 = tonumber(s:sub(1, 4), 16) + local n2 = tonumber(s:sub(7, 10), 16) + -- Surrogate pair? + if n2 then + return + codepoint_to_utf8((n1 - 0xd800) * 0x400 + (n2 - 0xdc00) + 0x10000) + else + return codepoint_to_utf8(n1) + end + end + + local function parse_string(str, i) + local res = "" + local j = i + 1 + local k = j + + while j <= #str do + local x = str:byte(j) + + if x < 32 then + decode_error(str, j, "control character in string") + + elseif x == 92 then -- `\`: Escape + res = res .. str:sub(k, j - 1) + j = j + 1 + local c = str:sub(j, j) + if c == "u" then + local hex = str:match("^[dD][89aAbB]%x%x\\u%x%x%x%x", j + 1) or + str:match("^%x%x%x%x", j + 1) or + decode_error(str, j - 1, + "invalid unicode escape in string") + res = res .. parse_unicode_escape(hex) + j = j + #hex + else + if not escape_chars[c] then + decode_error(str, j - 1, + "invalid escape char '" .. c .. "' in string") + end + res = res .. escape_char_map_inv[c] + end + k = j + 1 + + elseif x == 34 then -- `"`: End of string + res = res .. str:sub(k, j - 1) + return res, j + 1 + end + + j = j + 1 + end + + decode_error(str, i, "expected closing quote for string") + end + + local function parse_number(str, i) + local x = next_char(str, i, delim_chars) + local s = str:sub(i, x - 1) + local n = tonumber(s) + if not n then decode_error(str, i, "invalid number '" .. s .. "'") end + return n, x + end + + local function parse_literal(str, i) + local x = next_char(str, i, delim_chars) + local word = str:sub(i, x - 1) + if not literals[word] then + decode_error(str, i, "invalid literal '" .. word .. "'") + end + return literal_map[word], x + end + + local function parse_array(str, i) + local res = {} + local n = 1 + i = i + 1 + while 1 do + local x + i = next_char(str, i, space_chars, true) + -- Empty / end of array? + if str:sub(i, i) == "]" then + i = i + 1 + break + end + -- Read token + x, i = parse(str, i) + res[n] = x + n = n + 1 + -- Next token + i = next_char(str, i, space_chars, true) + local chr = str:sub(i, i) + i = i + 1 + if chr == "]" then break end + if chr ~= "," then decode_error(str, i, "expected ']' or ','") end + end + return res, i + end + + local function parse_object(str, i) + local res = {} + i = i + 1 + while 1 do + local key, val + i = next_char(str, i, space_chars, true) + -- Empty / end of object? + if str:sub(i, i) == "}" then + i = i + 1 + break + end + -- Read key + if str:sub(i, i) ~= '"' then + decode_error(str, i, "expected string for key") + end + key, i = parse(str, i) + -- Read ':' delimiter + i = next_char(str, i, space_chars, true) + if str:sub(i, i) ~= ":" then + decode_error(str, i, "expected ':' after key") + end + i = next_char(str, i + 1, space_chars, true) + -- Read value + val, i = parse(str, i) + -- Set + res[key] = val + -- Next token + i = next_char(str, i, space_chars, true) + local chr = str:sub(i, i) + i = i + 1 + if chr == "}" then break end + if chr ~= "," then decode_error(str, i, "expected '}' or ','") end + end + return res, i + end + + local char_func_map = { + ['"'] = parse_string, + ["0"] = parse_number, + ["1"] = parse_number, + ["2"] = parse_number, + ["3"] = parse_number, + ["4"] = parse_number, + ["5"] = parse_number, + ["6"] = parse_number, + ["7"] = parse_number, + ["8"] = parse_number, + ["9"] = parse_number, + ["-"] = parse_number, + ["t"] = parse_literal, + ["f"] = parse_literal, + ["n"] = parse_literal, + ["["] = parse_array, + ["{"] = parse_object + } + + parse = function(str, idx) + local chr = str:sub(idx, idx) + local f = char_func_map[chr] + if f then return f(str, idx) end + decode_error(str, idx, "unexpected character '" .. chr .. "'") + end + + function json.decode(str) + if type(str) ~= "string" then + error("expected argument of type string, got " .. type(str)) + end + local res, idx = parse(str, next_char(str, 1, space_chars, true)) + idx = next_char(str, idx, space_chars, true) + if idx <= #str then decode_error(str, idx, "trailing garbage") end + return res + end +end function addToTable(G,base)--Refresh default base with G-values for k,v in next,G do if type(v)==type(base[k])then diff --git a/Zframework/voice.lua b/Zframework/voice.lua index d11eaf41..7ed29dd9 100644 --- a/Zframework/voice.lua +++ b/Zframework/voice.lua @@ -6,14 +6,10 @@ local VOC={} VOC.name={ "zspin","sspin","lspin","jspin","tspin","ospin","ispin", "single","double","triple","techrash", - "mini","b2b","b3b","clear", - "win","lose", - "bye", - "nya", - "nya_happy", - "nya_doubt", - "nya_sad", - "egg", + "mini","b2b","b3b", + "perfect_clear","half_clear", + "win","lose","bye", + "test","happy","doubt","sad","egg", "welcome_voc" } VOC.list={} @@ -24,8 +20,6 @@ local function loadVoiceFile(N,vocName) bank[vocName]={love.audio.newSource(fileName,"static")} table.insert(VOC.list[N],vocName) return true - else - return end end function VOC.loadOne(_) @@ -43,6 +37,7 @@ function VOC.loadOne(_) LOG.print("No VOICE file: "..N,"warn") end end + if not VOC.list[N][1]then VOC.list[N]=nil end end function VOC.loadAll() for i=1,#VOC.name do diff --git a/Zframework/widget.lua b/Zframework/widget.lua index ba358e57..bcf2595d 100644 --- a/Zframework/widget.lua +++ b/Zframework/widget.lua @@ -7,6 +7,32 @@ local color=color local setFont=setFont local Timer=love.timer.getTime +local text={ + type="text", +} +function text:reset() + if type(self.text)=="string"then + self.text=gc.newText(setFont(self.font or 30),self.text) + end +end +function text:draw() + gc.setColor(self.color) + gc.draw(self.text,self.x,self.y) +end + +local image={ + type="image", +} +function image:reset() + if type(self.img)=="string"then + self.img=IMG[self.img] + end +end +function image:draw() + gc.setColor(1,1,1,self.alpha) + gc.draw(self.img,self.x,self.y,self.ang,self.kx,self.ky,self.ox,self.oy) +end + local button={ type="button", ATV=0,--Activating time(0~8) @@ -366,6 +392,67 @@ function selector:getInfo() return format("x=%d,y=%d,w=%d",self.x,self.y,self.w) end +local keyboardNames={--15*5 keys + "ESC","F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12","","Del", + "1","2","3","4","5","6","7","8","9","0","-","=","","self.x and + xself.y and + y10 then - dist=dist+abs(y-WY)*6.26 - if dist10 then + dist=dist+abs(y-WY)*6.26 + if dist10 then + dist=dist+abs(x-WX)*6.26 + if dist10 then - dist=dist+abs(x-WX)*6.26 - if dist=4行,打出[消行数]攻击,\n B2B攻击+1\n B3B攻击+50%,+1额外抵挡\n 特殊消除会增加B2B点数,让之后的特殊消除获得B2B(B3B)增益(详细说明见下文)\n 半全消(\"下方有剩余方块\"的全消,如果是I消1行则必须不剩余玩家放置的方块):伤害+2,额外抵挡+2\n 全消:将上述伤害之和减半,再+8~20(本局内递增2),+2额外抵挡(注:本局消行数>4时会将B2B点数拉满)\n 连击:每次连击给予上述攻击[连击数*25%(如果只消一行就是15%)]的加成,12combo达到上限,连击>=3次时再额外加1攻击\n 根据上述规则计算后,向下取整,攻击打出"}, + {"c2", "term","C2序列","七个块初始权重0\n全体乘2再加0~1的随机数,选数字最大的块出,然后将其权重除以3.5,循环"}, + {"c2", "term","C2踢墙","左,右,下,左下,右下,左2,右2\n(任何方块的任何旋转都使用这个表)"}, + {"duidie stack", "term","堆叠","将方块无缝隙地堆起来"}, + {"shuangxuan", "term","双旋","指能够使用顺时针+逆时针两个旋转键的技术,原来要转三下的情况可以反向转一下就够,减少烦琐操作。\n双旋也是学习finesse的必要前提\n另见 三旋"}, + {"sanxuan", "term","三旋","指能够使用顺+逆时针+180度旋转三个旋转键的技术,任何方块只需要旋转一次即可。但由于只有部分游戏有180度旋转所以并不通用,而且对速度提升的效果不如双旋显著,不是追求极限速度的玩家可不学"}, + {"input delay", "term","输入延迟","所有的操作都会晚一点到达游戏,top、te等游戏比较明显,一般来说不可设置,电脑开启性能模式可能会好一点。效果类似于你拿qq远程控制打fps游戏"}, + {"cc coldclear", "term","Cold Clear","一个ai的名字(就跟alphaGo一样)"}, + {"zzzbot", "term","ZZZbot","一个ai的名字(就跟alphaGo一样)"}, + + {"hebomai hbm", "name","吉备宏纯","一流玩家(在最强大脑上以3:0击败模电)"}, + {"amemiya taiyou yugong", "name","雨宫太阳","一流玩家,曾获得PPT的swap模式冠军"}, + {"fst firestorm", "name","Firestorm","一流玩家,得过jscup冠军"}, + {"wumbo wangbo", "name","Wumbo","一流玩家,有名的爱在对战用c4w"}, + {"ajb ajanba", "name","Ajanba","一流玩家,得过jscup冠军"}, + {"blink", "name","Blink","一流玩家"}, + {"doremy", "name","Doremy","一流玩家,雨宫说他是世界第二"}, + {"furea", "name","Furea","一流玩家,ppt的40L WR保持者+ultra WR保持者"}, + {"iljain yijianlian", "name","Iljain","一流玩家,得过C2 rank1"}, + {"kazu", "name","Kazu","一流玩家,以熟练md转捐赠闻名"}, + {"microblizz", "name","Microblizz","一流玩家,曾经的世界40L WR"}, + {"vincehd", "name","Vince","一流玩家,现任世界最速保持者(无延迟方块)"}, + {"yakine", "name","Yakine","一流玩家,捐T如喝水,20TSD比你40行还快"}, + {"jonas", "name","Jonas","经典块一流玩家,曾经的经典块第一,CTWC4连冠"}, + {"joseph", "name","Joseph","经典块一流玩家,CTWC连冠,多项任天堂方块记录保持者"}, + {"z xiaoz 626", "name","","这个百科的名字!"}, + {"mrz zjiang 026 ddd", "name","MrZ","这个游戏的作者!"}, + {"farteryhr pidaye TTT 000","name","Farter","群友,CN块圈元老之一,屁块作者"}, + {"electric modian 283", "name","吴淞昊","群友,国内一流高端隐形方块玩家,上过最强大脑"}, + {"diao 872", "name","Diao","群友,一流对战选手,得过jscup亚军,ttt冠军,HDO XII冠军"}, + {"ditoly icrem kuimei 3055","name","葵妹","群友,被清华劝退现于北大的打块天才jk"}, + {"gggf 127", "name","gggf","群友,20G规则国内一流玩家"}, + {"miya miaotianmiye", "name","喵田弥夜","群友,vup,喜欢打块的猫猫(Z酱单推),techmino配音之一"}, + {"naki anyingnaimu", "name","安樱奈莯","群友,vup,喜欢打块的幽灵,techmino配音之一"}, + {"sniraite shege", "name","Snirate","群友,国内一流方块玩家"}, + {"mifu swl", "name","Mifu","群友,vup,miya的方块教练"}, + {"ttb teatube chanaiye 022","name","四方茶叶","群友,vup,CN块圈发展重要人物"}, + {"ykzl yunkongzhiling 196", "name","蕴空之灵","群友,vup,效率之光"}, + {"zzz zouzhizhang", "name","奏之章","群友,zzzbot的作者,CN块圈人工智能技术发展重要人物之一"}, + {"tty tatianyi 512", "name","他天一","群友,zzz大爷的c2AI贡献者,打块水平国内前列"}, + {"wdk windkey fengyaoshi", "name","Windkey","曾经是群友,对战基本只会开局c4w导致风评很差,要学c4w可以看他"}, + {"xb 043", "name","","群友,研究群赛事主要主办人"}, + {"zxc thtsod guage 655", "name","ZXC","群友,高技术力"}, + {"tinko 665", "name","Tinko","群友,高技术力"}, + {"koishi zixin", "name","子心","群友,vup,T99国内一流战术型玩家"}, + {"mars huoxingge 608", "name","Mars608","群友,拿过ns ppt国区榜首"}, + {"xingjiehuixing", "name","星街彗星","vtb,40L单旋sub40"}, + {"quanshanyuji", "name","犬山玉姬","vtb,憋〇俄罗斯方块企划的发起人,掀起V圈打块潮流的Vtb"}, + {"xiaseji", "name","夏色祭","vtb,憋〇企划的金字塔顶尖"}, +} \ No newline at end of file diff --git a/document/document_cn.txt b/document/document_cn.txt new file mode 100644 index 00000000..5c0ec97b --- /dev/null +++ b/document/document_cn.txt @@ -0,0 +1,62 @@ +游戏方法: + 系统会提供的一个个四联骨牌("方块",总共7种),玩家需要控制(左右移动和旋转90,180,270度),每填满场地的一行就会将其消除,根据消除方式会给对手攻击(如果有对手的话) + 活到最后或者完成目标即胜利. + +旋转系统: + 使用Techmino专属旋转系统,细节懒得写( + +spin判定: + 满足三角判定+2分 + 满足不可移动判定+2分 + --满足以上之一就算是spin + 满足非第二个test+1分 + --如果分数只有2,方块是SZJLT之一,并且没有把当前方块整个消除那么就是mini + +攻击系统: + 普通消除: + 消<4行打出[消行数-0.5]攻击 + 特殊消除: + 如果是spin,打出[2*消行数]攻击, + B2B攻击+[1/1/2/4/8(spin1~5)] + B3B攻击在B2B基础上+消行数*0.5,+1额外抵挡 + mini减至25% + 不是spin但是单次消>=4行,打出[消行数]攻击, + B2B攻击+1 + B3B攻击+50%,+1额外抵挡 + 特殊消除会增加B2B点数,让之后的特殊消除获得B2B(B3B)增益(详细说明见下文) + 半全消("下方有剩余方块"的全消,如果是I消1行则必须不剩余玩家放置的方块):伤害+2,额外抵挡+2 + 全消:将上述伤害之和减半,再+8~20(本局内递增2),+2额外抵挡(注:本局消行数>4时会将B2B点数拉满) + 连击:每次连击给予上述攻击[连击数*25%(如果只消一行就是15%)]的加成,12combo达到上限,连击>=3次时再额外加1攻击 + 根据上述规则计算后,向下取整,攻击打出 + +分数系统: + 操作越牛逼得分越高嗷( + +攻击延迟: + 消2/3的攻击生效最快,消四其次,spin攻击生效较慢,高连击生效最慢 + B2B或者B3B增加攻击力的同时也会减缓一点生效速度,mini大幅减缓生效速度 + +抵消逻辑: + 发动攻击时,若缓冲条有攻击则先用额外抵挡再用攻击力1:1抵消最先受到的攻击 + 没有用上的额外抵挡会被丢弃,最后剩下的攻击力会发送给对手 + +back to back(B2B)点数说明: + B2B点数的范围在0~1200,在点数>=40时进行特殊消除为B2B,>1000时特殊消除为B3B + 普通消除:-250 + spin1~5:+[50/100/180/1000/1200](mini变为原来25%) + 消四/五:+[100/200] + 空spin:+20,此法得到的点数不能超过1000 + 当点数在1000以上时空放一块-40(不低于1000) + +混战模式说明: + 许多玩家同时进行一局游戏(对手都是AI,不是真人).随着玩家数量的减少,方块下落/垃圾生效速度/垃圾升起速度都会增加.淘汰其它玩家后可以获得一个徽章和该玩家持有的徽章,增强自己的攻击力. + 玩家可选四个攻击模式: + 1.随机:每次攻击后10%随机挑选一个玩家锁定 + 2.最多徽章:攻击后或者锁定玩家死亡时锁定徽章最多的玩家 + 3.最高:攻击后或者锁定玩家死亡时锁定场地最高的玩家(每秒刷新) + 4.反击:攻击所有锁定自己的玩家(攻击AOE),若未被任何人锁定则攻击随机玩家(不锁定) + 坚持到最后的玩家就是胜利者. + +自定义模式说明: + 玩家可以自由调整大多数参数(不包括上述各种游戏模式的特殊效果),也可以画一个场地去消除或者是作为提示模板来进行拼图模式. + 在拼图模式下,按功能键切换是否展示提示.其中打"X"的格子不允许有方块,空的格子可以是任何状态,普通的七种彩色方块必须颜色对应,垃圾行方块的为止只要有方块就可以,但是不能是空气,玩家拼出自己画的图后就会判定胜利. \ No newline at end of file diff --git a/document.txt b/document/document_en.txt similarity index 56% rename from document.txt rename to document/document_en.txt index 9275523e..5c57a6d3 100644 --- a/document.txt +++ b/document/document_en.txt @@ -1,67 +1,3 @@ -(ENG ver. below) -游戏方法: - 系统会提供的一个个四联骨牌("方块",总共7种),玩家需要控制(左右移动和旋转90,180,270度),每填满场地的一行就会将其消除,根据消除方式会给对手攻击(如果有对手的话) - 活到最后或者完成目标即胜利. - -旋转系统: - 使用Techmino专属旋转系统,细节懒得写( - -spin判定: - 满足三角判定+2分 - 满足不可移动判定+2分 - --满足以上之一就算是spin - 满足非第二个test+1分 - --如果分数只有2,方块是SZJLT之一,并且没有把当前方块整个消除那么就是mini - -攻击系统: - 普通消除: - 消<4行打出[消行数-0.5]攻击 - 特殊消除: - 如果是spin,打出[2*消行数]攻击, - B2B攻击+[1/1/2/4/8(spin1~5)] - B3B攻击在B2B基础上+消行数*0.5,+1额外抵挡 - mini减至25% - 不是spin但是单次消>=4行,打出[消行数]攻击, - B2B攻击+1 - B3B攻击+50%,+1额外抵挡 - 特殊消除会增加B2B点数,让之后的特殊消除获得B2B(B3B)增益(详细说明见下文) - 半全消("下方有剩余方块"的全消,如果是I消1行则必须不剩余玩家放置的方块):伤害+2,额外抵挡+2 - 全消:将上述伤害之和减半,再+8~20(本局内递增2),+2额外抵挡(注:本局消行数>4时会将B2B点数拉满) - 连击:每次连击给予上述攻击[连击数*25%(如果只消一行就是15%)]的加成,12combo达到上限,连击>=3次时再额外加1攻击 - 根据上述规则计算后,向下取整,攻击打出 - -分数系统: - 操作越牛逼得分越高嗷( - -攻击延迟: - 消2/3的攻击生效最快,消四其次,spin攻击生效较慢,高连击生效最慢 - B2B或者B3B增加攻击力的同时也会减缓一点生效速度,mini大幅减缓生效速度 - -抵消逻辑: - 发动攻击时,若缓冲条有攻击则先用额外抵挡再用攻击力1:1抵消最先受到的攻击 - 没有用上的额外抵挡会被丢弃,最后剩下的攻击力会发送给对手 - -back to back(B2B)点数说明: - B2B点数的范围在0~1200,在点数>=40时进行特殊消除为B2B,>1000时特殊消除为B3B - 普通消除:-250 - spin1~5:+[50/100/180/1000/1200](mini变为原来25%) - 消四/五:+[100/200] - 空spin:+20,此法得到的点数不能超过1000 - 当点数在1000以上时空放一块-40(不低于1000) - -混战模式说明: - 许多玩家同时进行一局游戏(对手都是AI,不是真人).随着玩家数量的减少,方块下落/垃圾生效速度/垃圾升起速度都会增加.淘汰其它玩家后可以获得一个徽章和该玩家持有的徽章,增强自己的攻击力. - 玩家可选四个攻击模式: - 1.随机:每次攻击后10%随机挑选一个玩家锁定 - 2.最多徽章:攻击后或者锁定玩家死亡时锁定徽章最多的玩家 - 3.最高:攻击后或者锁定玩家死亡时锁定场地最高的玩家(每秒刷新) - 4.反击:攻击所有锁定自己的玩家(攻击AOE),若未被任何人锁定则攻击随机玩家(不锁定) - 坚持到最后的玩家就是胜利者. - -自定义模式说明: - 玩家可以自由调整大多数参数(不包括上述各种游戏模式的特殊效果),也可以画一个场地去消除或者是作为提示模板来进行拼图模式. - 在拼图模式下,按功能键切换是否展示提示.其中打"X"的格子不允许有方块,空的格子可以是任何状态,普通的七种彩色方块必须颜色对应,垃圾行方块的为止只要有方块就可以,但是不能是空气,玩家拼出自己画的图后就会判定胜利. - Gameplay: System will offer a series of tetrominoes ("Pieces". There are 7 types), and the player needs to control [them] (move left and right, rotate 90, 180 or 270 degrees), filling a row on the play field will clear it, attack will be sent depending on the type of the line clear (if there is an opponent) Survive till the last or complete the level's goal to win. @@ -88,7 +24,7 @@ Attack system: Non-Spin Techrash/Techrash+ sends (lines cleared) attack, - B2B sends extra 1 attack, - B2B2B sends 50% more attack and +1 extra blocking. - + Special line clears will increase B2B gauge, making later special line clears have B2B or B2B2B bonus (see below) Half Perfect Clear (a Perfect Clear "with blocks left below". If it's an I clearing 1 line, then the remaining blocks must not be player-placed): Attack +2, Extra Blocking +2 Perfect Clear: half all damage above, then +8 to +20 attack (increases within a round by +2 per Perfect Clear) and +2 extra blocking. (note: if lines cleared in this round >4, then B2B gauge will be filled) diff --git a/document/voice.txt b/document/voice.txt new file mode 100644 index 00000000..78325414 --- /dev/null +++ b/document/voice.txt @@ -0,0 +1,27 @@ +以下是Techmino使用/将要使用/未来也许会使用的语音文件, 每一个都可以录任意多条 +有多个文件的语音在播放时会随机挑选一个播放, 所以组合性的语音不能随意发挥 + +例如多个mini语音文件名: mini_1.ogg, mini_2.ogg, ...... +如果只有一个, "_1"可以省略, 但是多个文件的数字不能跳跃 +格式使用ogg, 不支持别的(因为ogg小 哈哈哈) + +目前游戏内正在使用, 必须录制的音频文件名们: + zspin, sspin, lspin, jspin, tspin, ospin, ispin + single, double, triple, techrash + mini, b2b, b3b + 以上直接念就可以 + + perfect_clear, half_clear + 这俩可以直接念也可以略做修改 + + win, lose, bye + 这几个可以自由发挥 + + test, happy, doubt, sad, egg + 第一个是拉语音条预览音量播放的, 剩下的是彩蛋音效(不录也行, 反正一般不会触发) + + welcome_voc + 进入游戏播放的欢迎语音(类似osu) + +目前游戏内没有但是以后可能会加入的: + split \ No newline at end of file diff --git a/main.lua b/main.lua index 83a748f9..d284dde2 100644 --- a/main.lua +++ b/main.lua @@ -21,20 +21,6 @@ love.keyboard.setTextInput(false) love.mouse.setVisible(false) system=love.system.getOS() -mapCam={ - sel=nil,--Selected mode ID - - --Basic paragrams - x=0,y=0,k=1,--Camera pos/k - x1=0,y1=0,k1=1,--Camera pos/k shown - - --If controlling with key - keyCtrl=false, - - --For auto zooming when enter/leave scene - zoomMethod=nil, - zoomK=nil, -} scr={ x=0,y=0,--Up-left Coord on screen w=0,h=0,--Fullscreen w/h in gc diff --git a/parts/PCbase.lua b/modes/PCbase.lua similarity index 100% rename from parts/PCbase.lua rename to modes/PCbase.lua diff --git a/parts/PClist.lua b/modes/PClist.lua similarity index 100% rename from parts/PClist.lua rename to modes/PClist.lua diff --git a/modes/blind_hard.lua b/modes/blind_hard.lua index 0d348aa4..cedbdd21 100644 --- a/modes/blind_hard.lua +++ b/modes/blind_hard.lua @@ -7,6 +7,7 @@ return{ fall=10, dropFX=0,lockFX=0, visible="none", + score=false, dropPiece=PLY.check_lineReach, freshLimit=15, target=200, diff --git a/modes/blind_lunatic.lua b/modes/blind_lunatic.lua index 588783e8..606b7aba 100644 --- a/modes/blind_lunatic.lua +++ b/modes/blind_lunatic.lua @@ -8,6 +8,7 @@ return{ ghost=0, dropFX=0,lockFX=0, visible="none", + score=false, dropPiece=PLY.check_lineReach, freshLimit=15, target=200, diff --git a/modes/blind_ultimate.lua b/modes/blind_ultimate.lua index 410476ab..c9b1945c 100644 --- a/modes/blind_ultimate.lua +++ b/modes/blind_ultimate.lua @@ -7,6 +7,7 @@ return{ block=false,center=0,ghost=0, dropFX=0,lockFX=0, visible="none", + score=false, dropPiece=PLY.check_lineReach, freshLimit=15, target=200, diff --git a/modes/pctrain_lunatic.lua b/modes/pctrain_lunatic.lua index 37811e4f..6ae5a83e 100644 --- a/modes/pctrain_lunatic.lua +++ b/modes/pctrain_lunatic.lua @@ -3,8 +3,8 @@ local ins=table.insert local pc_drop={50,45,40,35,30,26,22,18,15,12} local pc_lock={55,50,45,40,36,32,30} local pc_fall={18,16,14,12,10,9,8,7,6} -local PCbase=require("parts/PCbase") -local PClist=require("parts/PClist") +local PCbase=require("modes/PCbase") +local PClist=require("modes/PClist") local PCtype={[0]=1,2,1,3,2,3} local function task_PC(P) diff --git a/modes/pctrain_normal.lua b/modes/pctrain_normal.lua index 79d3ab6e..16176fc6 100644 --- a/modes/pctrain_normal.lua +++ b/modes/pctrain_normal.lua @@ -1,5 +1,5 @@ -local PCbase=require("parts/PCbase") -local PClist=require("parts/PClist") +local PCbase=require("modes/PCbase") +local PClist=require("modes/PClist") local PCtype={ [0]=1,1,1,1,2, 1,1,1,1,3, diff --git a/modes/tsd_easy.lua b/modes/tsd_easy.lua index 693a06e4..4e1a6b03 100644 --- a/modes/tsd_easy.lua +++ b/modes/tsd_easy.lua @@ -1,12 +1,10 @@ local function check_tsd(P) if #P.clearedRow>0 then - if P.lastClear.id~=5 or P.lastClear.row~=2 then - P:lose() - else + local C=P.lastClear + if C.id==5 and C.row==2 and C.spin then P.modeData.event=P.modeData.event+1 - if P.modeData.event==20 then - P:win("finish") - end + else + P:lose() end end end diff --git a/modes/tsd_hard.lua b/modes/tsd_hard.lua index 7780ae18..23f3d517 100644 --- a/modes/tsd_hard.lua +++ b/modes/tsd_hard.lua @@ -1,9 +1,10 @@ local function check_tsd(P) if #P.clearedRow>0 then - if P.lastClear.id~=5 or P.lastClear.row~=2 then - P:lose() - else + local C=P.lastClear + if C.id==5 and C.row==2 and C.spin then P.modeData.event=P.modeData.event+1 + else + P:lose() end end end diff --git a/modes/tsd_ultimate.lua b/modes/tsd_ultimate.lua index 11861033..5504153b 100644 --- a/modes/tsd_ultimate.lua +++ b/modes/tsd_ultimate.lua @@ -1,10 +1,10 @@ local function check_tsd(P) if #P.clearedRow>0 then local C=P.lastClear - if P.lastClear.id~=5 or P.lastClear.row~=2 then - P:lose() - else + if C.id==5 and C.row==2 and C.spin then P.modeData.event=P.modeData.event+1 + else + P:lose() end end end diff --git a/parts/ai.lua b/parts/ai.lua index 37ea87ee..6796d44a 100644 --- a/parts/ai.lua +++ b/parts/ai.lua @@ -28,6 +28,13 @@ do if fs.getInfo("CCloader.dll")then NOGAME="delCC" end + elseif system=="Linux"then + local success,message=require("CCloader") + if success then + LOG.print("CC load successfully","warn",color.green) + else + LOG.print("Cannot load CC: "..message,"warn",color.red) + end elseif system=="Android"then local armList={"arm64-v8a","armeabi-v7a"} local libFunc,success,message diff --git a/parts/gametoolfunc.lua b/parts/gametoolfunc.lua index 93c712f0..f64be413 100644 --- a/parts/gametoolfunc.lua +++ b/parts/gametoolfunc.lua @@ -185,7 +185,6 @@ function pasteBoard(str) if fX~=1 then return else - fY=fY+1 break end end @@ -320,6 +319,12 @@ function freshMostDangerous() m2=h end end + + for i=1,#players.alive do + if players.alive[i].atkMode==3 then + players.alive[i]:freshTarget() + end + end end function freshMostBadge() game.mostBadge,game.secBadge=nil @@ -335,6 +340,12 @@ function freshMostBadge() m2=b end end + + for i=1,#players.alive do + if players.alive[i].atkMode==4 then + players.alive[i]:freshTarget() + end + end end function royaleLevelup() game.stage=game.stage+1 @@ -443,6 +454,11 @@ function resetGameData() for i=1,#players do players[i]:changeAtk(randomTarget(players[i])) end + game.stage=nil + game.mostBadge=nil + game.secBadge=nil + game.mostDangerous=nil + game.secDangerous=nil game.stage=1 game.garbageSpeed=.3 end @@ -452,6 +468,7 @@ function resetGameData() collectgarbage() end function resetPartGameData(replaying) + TASK.removeTask_code(TICK.autoPause) if players[1]and not game.replaying then mergeStat(stat,players[1].stat) end @@ -493,6 +510,11 @@ function resetPartGameData(replaying) for i=1,#players do players[i]:changeAtk(randomTarget(players[i])) end + game.stage=nil + game.mostBadge=nil + game.secBadge=nil + game.mostDangerous=nil + game.secDangerous=nil game.stage=1 game.garbageSpeed=.3 end diff --git a/parts/getTip.lua b/parts/getTip.lua index f234be3c..9ba5958d 100644 --- a/parts/getTip.lua +++ b/parts/getTip.lua @@ -4,24 +4,23 @@ if setting.lang==1 or setting.lang==2 then "ZS JL T O I", "VVVVVV好玩!", "uid:225238922", - "tetralegends也很好玩!", + "Tetralegends也很好玩!", "tetr.js也很好玩!", - "tetr.io也很好玩!", + "Tetr.io也很好玩!", "Techminohaowan", "Techmino 好玩!", "STSD必死", "REGRET!!", "osu好玩!", "O spin Triple!", - "nullpomino也很好玩!", + "Nullpomino也很好玩!", "Naki 可爱!", "Miya 可爱!", "Lua天下第一", "LrL RlR LLr RRl RRR LLL FFF RfR RRf rFF", "Let-The-Bass-Kick!", "l-=-1", - "jstris也很好玩!", - "iced,永远的神", + "Jstris也很好玩!", "fin neo iso 是满足tspin条件的特殊t2的名字", "e^(pi*i/2)=i", "e^(pi*i)=-1", @@ -105,6 +104,7 @@ if setting.lang==1 or setting.lang==2 then "1, 2, ⑨!!!!!", "<方块研究所>有一个Nspire-CX版本!", "↑↑↓↓←→←→BABA", + "\\196/", "(RUR'U')R'FR2U'R'U'(RUR'F')", -- "Z酱 可爱!", } @@ -129,7 +129,7 @@ elseif setting.lang==3 then "Techmino=Technique+Tetromino", "Techmino is so fun!", "Techmino has a Nspire-CX edition!", - "switch stupid music off if they make you awful", + "Switch music off if make you awful", "Small DAS&ARR can make you faster,if you can control block correctly", "Secret num:626", "Rubik's cube is fun!", @@ -190,9 +190,9 @@ elseif setting.lang==3 then "11renPC!", "1, 2, ⑨!!!!!", "↑↑↓↓←→←→BABA", + "\\osk/", + "\\jezevec/", "\"Free block game with royale mode\"", - "/osk/", - "/jezevec/", "(RUR'U')R'FR2U'R'U'(RUR'F')", ":pog:", } @@ -240,8 +240,8 @@ elseif setting.lang==5 then "平均"..int(stat.atk/stat.time*60).."APM,好厉害哦", "平均"..(int(stat.atk/stat.row*10)*.1).."效,你看这数据能看么", "平均"..(int(stat.atk/stat.row*10)*.1).."效,我就不说你多菜了", - "才玩"..stat.game.."把,跟几十万局的没法比", - "才玩"..stat.game.."把,玩了不下几万局的人可不在少数", + "才玩了"..stat.game.."把,跟几十万局的没法比", + "才玩了"..stat.game.."把,玩了不下几万局的人可不在少数", "才玩了"..int(stat.time/3600).."小时,人家总时长是你不知道多少倍", "才玩了"..int(stat.time/3600).."小时,别人总时长跟你都不在一个数量级", } diff --git a/parts/kickList.lua b/parts/kickList.lua index 73a2ca0d..7bdd5cac 100644 --- a/parts/kickList.lua +++ b/parts/kickList.lua @@ -27,6 +27,7 @@ local function flipList(O)--Use this to copy a symmetry list return L end local function reflect(a,b) + local b={} b[03]=flipList(a[01]) b[01]=flipList(a[03]) b[30]=flipList(a[10]) @@ -39,6 +40,7 @@ local function reflect(a,b) b[20]=flipList(a[20]) b[31]=flipList(a[13]) b[13]=flipList(a[31]) + return b end local function pushZero(T) for _,L in next,T do @@ -50,329 +52,335 @@ local function pushZero(T) end end -local scs=require("parts/spinCenters") -local OspinList={ - {111,5,2, 0,-1,0},{111,5,2,-1,-1,0},{111,5,0,-1, 0,0},--T - {333,5,2,-1,-1,0},{333,5,2, 0,-1,0},{333,5,0, 0, 0,0},--T - {313,1,2,-1, 0,0},{313,1,2, 0,-1,0},{313,1,2, 0, 0,0},--Z - {131,2,2, 0, 0,0},{131,2,2,-1,-1,0},{131,2,2,-1, 0,0},--S - {331,3,2, 0,-1,0},{113,3,0, 0, 0,0},{113,3,2,-1, 0,0},--J - {113,4,2,-1,-1,0},{331,4,0,-1, 0,0},{331,4,2, 0, 0,0},--L - {222,7,2,-1, 0,1},{222,7,2,-2, 0,1},{222,7,2, 0, 0,1},--I - {121,6,0, 1,-1,1},{112,6,0, 2,-1,2},{122,6,0, 1,-2,2},--O - {323,6,0,-1,-1,2},{332,6,0,-2,-1,2},{322,6,0,-1,-2,2},--O -}--{key,id,dir,dx,dy,freeLv(0=unmovable,1=L/R unmovable,2=free)} -local XspinList={ - {{ 1,-1},{ 1, 0},{ 1, 1},{ 1,-2},{ 1, 2}}, - {{ 0,-1},{ 0,-2},{ 0, 1},{ 0,-2},{ 0, 2}}, - {{-1,-1},{-1, 0},{-1, 1},{-1,-2},{-1, 2}}, -} -local TRS={ - { - [01]={{-1, 0},{-1, 1},{ 0,-2},{-1, 2},{ 0, 1}}, - [10]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1,-2},{ 1,-2}}, - [03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-1},{ 1,-2}}, - [30]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0,-1}}, - [12]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2}}, - [21]={{-1, 0},{-1, 1},{ 0,-2},{-1,-2}}, - [32]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2}}, - [23]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2}}, - [02]={{ 1, 0},{-1, 0},{ 0,-1},{ 0, 1}}, - [20]={{-1, 0},{ 1, 0},{ 0, 1},{ 0,-1}}, - [13]={{ 0,-1},{ 0, 1},{-1, 0},{ 0,-2}}, - [31]={{ 0, 1},{ 0,-1},{ 1, 0},{ 0, 2}}, - },--Z - {},--S - { - [01]={{-1, 0},{-1, 1},{ 1, 0},{ 0,-2},{ 1, 1}}, - [10]={{ 1, 0},{ 1,-1},{-1, 0},{ 0, 2},{ 1, 2}}, - [03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 1,-1},{ 0, 1}}, - [30]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0,-1},{-1, 1}}, - [12]={{ 1, 0},{ 1,-1},{ 1, 1},{-1, 0},{ 0,-1},{ 0, 2},{ 1, 2}}, - [21]={{-1, 0},{-1, 1},{-1,-1},{ 1, 0},{ 0, 1},{ 0,-2},{-1,-2}}, - [32]={{-1, 0},{-1,-1},{ 1, 0},{ 0, 2},{-1, 2},{-1, 1}}, - [23]={{ 1, 0},{ 1,-1},{-1, 0},{ 1, 1},{ 0,-2},{ 1,-2}}, - [02]={{-1, 0},{ 1, 0},{ 0,-1},{ 0, 1}}, - [20]={{ 1, 0},{-1, 0},{ 0, 1},{ 0,-1}}, - [13]={{ 0,-1},{ 0, 1},{ 1, 0}}, - [31]={{ 0, 1},{ 0,-1},{-1, 0}}, - },--J - {},--L - { - [01]={{-1, 0},{-1, 1},{ 0,-2},{-1,-2},{ 0, 1}}, - [10]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2},{ 0,-1}}, - [03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 0, 1}}, - [30]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0,-1}}, - [12]={{ 1, 0},{ 1,-1},{ 0,-1},{-1,-1},{ 0, 2},{ 1, 2}}, - [21]={{-1, 0},{ 0,-2},{-1,-2},{ 1, 1},{ 1, 0}}, - [32]={{-1, 0},{-1,-1},{ 0,-1},{ 1,-1},{ 0, 2},{-1, 2}}, - [23]={{ 1, 0},{ 0,-2},{ 1,-2},{-1, 1},{-1, 0}}, - [02]={{-1, 0},{ 1, 0},{ 0, 1}}, - [20]={{ 1, 0},{-1, 0},{ 0,-1}}, - [13]={{ 0,-1},{ 0, 1},{ 1, 0},{ 0,-2},{ 0, 2}}, - [31]={{ 0,-1},{ 0, 1},{-1, 0},{ 0,-2},{ 0, 2}}, - },--T - function(P,d) - if P.human then SFX.fieldPlay("rotate",nil,P)end - if not P.gameEnv.ospin then return end - local x,y=P.curX,P.curY - if y==P.imgY and((P:solid(x-1,y)or P:solid(x-1,y+1)))and(P:solid(x+2,y)or P:solid(x+2,y+1))then - local D=P.spinSeq%100*10+d - P.spinSeq=D - if D<100 then - P:freshBlock(true,true) - return - end - for i=1,#OspinList do - local L=OspinList[i] - if D==L[1]then - local id,dir=L[2],L[3] - local bk=blocks[id][dir] - local x,y=P.curX+L[4],P.curY+L[5] - if not P:ifoverlap(bk,x,y)and(L[6]>0 or P:ifoverlap(bk,x-1,y)and P:ifoverlap(bk,x+1,y))and(L[6]==2 or P:ifoverlap(bk,x,y-1))and P:ifoverlap(bk,x,y+1)then - local C=P.cur - C.id=id - C.bk=bk - P.curX,P.curY=x,y - P.r,P.c=#bk,#bk[1] - P.dir,P.sc=dir,scs[id][dir] - P.spinLast=2 - P.stat.rotate=P.stat.rotate+1 - P:freshBlock(false,true) - P.spinSeq=0 - SFX.fieldPlay("rotatekick",nil,P) - return +local TRS +do + local OspinList={ + {111,5,2, 0,-1,0},{111,5,2,-1,-1,0},{111,5,0,-1, 0,0},--T + {333,5,2,-1,-1,0},{333,5,2, 0,-1,0},{333,5,0, 0, 0,0},--T + {313,1,2,-1, 0,0},{313,1,2, 0,-1,0},{313,1,2, 0, 0,0},--Z + {131,2,2, 0, 0,0},{131,2,2,-1,-1,0},{131,2,2,-1, 0,0},--S + {331,3,2, 0,-1,0},{113,3,0, 0, 0,0},{113,3,2,-1, 0,0},--J + {113,4,2,-1,-1,0},{331,4,0,-1, 0,0},{331,4,2, 0, 0,0},--L + {222,7,2,-1, 0,1},{222,7,2,-2, 0,1},{222,7,2, 0, 0,1},--I + {121,6,0, 1,-1,1},{112,6,0, 2,-1,2},{122,6,0, 1,-2,2},--O + {323,6,0,-1,-1,2},{332,6,0,-2,-1,2},{322,6,0,-1,-2,2},--O + }--{key,id,dir,dx,dy,freeLv(0=unmovable,1=L/R unmovable,2=free)} + local XspinList={ + {{ 1,-1},{ 1, 0},{ 1, 1},{ 1,-2},{ 1, 2}}, + {{ 0,-1},{ 0,-2},{ 0, 1},{ 0,-2},{ 0, 2}}, + {{-1,-1},{-1, 0},{-1, 1},{-1,-2},{-1, 2}}, + } + TRS={ + { + [01]={{-1, 0},{-1, 1},{ 0,-2},{-1, 2},{ 0, 1}}, + [10]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1,-2},{ 1,-2}}, + [03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-1},{ 1,-2}}, + [30]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0,-1}}, + [12]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2}}, + [21]={{-1, 0},{-1, 1},{ 0,-2},{-1,-2}}, + [32]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2}}, + [23]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2}}, + [02]={{ 1, 0},{-1, 0},{ 0,-1},{ 0, 1}}, + [20]={{-1, 0},{ 1, 0},{ 0, 1},{ 0,-1}}, + [13]={{ 0,-1},{ 0, 1},{-1, 0},{ 0,-2}}, + [31]={{ 0, 1},{ 0,-1},{ 1, 0}}, + },--Z + false,--S + { + [01]={{-1, 0},{-1, 1},{ 1, 0},{ 0,-2},{ 1, 1}}, + [10]={{ 1, 0},{ 1,-1},{-1, 0},{ 0, 2},{ 1, 2}}, + [03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 1,-1},{ 0, 1}}, + [30]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0,-1},{-1, 1}}, + [12]={{ 1, 0},{ 1,-1},{ 1, 1},{-1, 0},{ 0,-1},{ 0, 2},{ 1, 2}}, + [21]={{-1, 0},{-1, 1},{-1,-1},{ 1, 0},{ 0, 1},{ 0,-2},{-1,-2}}, + [32]={{-1, 0},{-1,-1},{ 1, 0},{ 0, 2},{-1, 2},{-1, 1}}, + [23]={{ 1, 0},{ 1,-1},{-1, 0},{ 1, 1},{ 0,-2},{ 1,-2}}, + [02]={{-1, 0},{ 1, 0},{ 0,-1},{ 0, 1}}, + [20]={{ 1, 0},{-1, 0},{ 0, 1},{ 0,-1}}, + [13]={{ 0,-1},{ 0, 1},{ 1, 0}}, + [31]={{ 0, 1},{ 0,-1},{-1, 0}}, + },--J + false,--L + { + [01]={{-1, 0},{-1, 1},{ 0,-2},{-1,-2},{ 0, 1}}, + [10]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2},{ 0,-1}}, + [03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 0, 1}}, + [30]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0,-1}}, + [12]={{ 1, 0},{ 1,-1},{ 0,-1},{-1,-1},{ 0, 2},{ 1, 2}}, + [21]={{-1, 0},{ 0,-2},{-1,-2},{ 1, 1}}, + [32]={{-1, 0},{-1,-1},{ 0,-1},{ 1,-1},{ 0, 2},{-1, 2}}, + [23]={{ 1, 0},{ 0,-2},{ 1,-2},{-1, 1}}, + [02]={{-1, 0},{ 1, 0},{ 0, 1}}, + [20]={{ 1, 0},{-1, 0},{ 0,-1}}, + [13]={{ 0,-1},{ 0, 1},{ 1, 0},{ 0,-2},{ 0, 2}}, + [31]={{ 0,-1},{ 0, 1},{-1, 0},{ 0,-2},{ 0, 2}}, + },--T + function(P,d) + if P.human then SFX.fieldPlay("rotate",nil,P)end + if not P.gameEnv.ospin then return end + local x,y=P.curX,P.curY + if y==P.imgY and((P:solid(x-1,y)or P:solid(x-1,y+1)))and(P:solid(x+2,y)or P:solid(x+2,y+1))then + local D=P.spinSeq%100*10+d + P.spinSeq=D + if D<100 then + P:freshBlock(true,true) + return + end + for i=1,#OspinList do + local L=OspinList[i] + if D==L[1]then + local id,dir=L[2],L[3] + local bk=blocks[id][dir] + local x,y=P.curX+L[4],P.curY+L[5] + if not P:ifoverlap(bk,x,y)and(L[6]>0 or P:ifoverlap(bk,x-1,y)and P:ifoverlap(bk,x+1,y))and(L[6]==2 or P:ifoverlap(bk,x,y-1))and P:ifoverlap(bk,x,y+1)then + local C=P.cur + C.id=id + C.bk=bk + P.curX,P.curY=x,y + P.r,P.c=#bk,#bk[1] + P.dir,P.sc=dir,spinCenters[id][dir] + P.spinLast=2 + P.stat.rotate=P.stat.rotate+1 + P:freshBlock(false,true) + P.spinSeq=0 + SFX.fieldPlay("rotatekick",nil,P) + return + end end end + else + P.spinSeq=0 + P:freshBlock(true,true) + end + end,--O + { + [01]={{ 0, 1},{ 1, 0},{-2, 0},{-2,-1},{ 1, 2}}, + [10]={{ 2, 0},{-1, 0},{-1,-2},{ 2, 1},{ 0, 1}}, + [03]={{ 0, 1},{-1, 0},{ 2, 0},{ 2,-1},{-1, 2}}, + [30]={{-2, 0},{ 1, 0},{ 1,-2},{-2, 1},{ 0, 1}}, + [12]={{-1, 0},{ 2, 0},{ 2,-1},{ 0,-1},{-1, 2}}, + [21]={{-2, 0},{ 1, 0},{ 1,-2},{-2, 1},{ 0, 1}}, + [32]={{ 1, 0},{-2, 0},{-2,-1},{ 0,-1},{ 1, 2}}, + [23]={{ 2, 0},{-1, 0},{-1,-2},{ 2, 1},{ 0, 1}}, + [02]={{-1, 0},{ 1, 0},{ 0,-1},{ 0, 1}}, + [20]={{ 1, 0},{-1, 0},{ 0, 1},{ 0,-1}}, + [13]={{ 0,-1},{-1, 0},{ 1, 0},{ 0, 1}}, + [31]={{ 0,-1},{ 1, 0},{-1, 0},{ 0, 1}}, + },--I + { + [01]={{-1, 0},{ 0, 1},{ 1, 1},{ 0,-3},{ 0, 2},{ 0, 3},{-1, 2}}, + [10]={{ 1, 0},{ 0,-1},{-1,-1},{ 0,-2},{ 0,-3},{ 0, 3},{ 1,-2}}, + [03]={{ 1, 0},{ 0,-3},{ 0, 1},{ 0, 2},{ 0, 3},{ 1, 2}}, + [30]={{-1, 0},{ 0, 1},{ 0,-2},{ 0,-3},{ 0, 3},{-1,-2}}, + },--Z5 + false,--S5 + { + [01]={{-1, 0},{-1, 1},{ 0,-2},{-1,-2},{-1,-1},{ 0, 1}}, + [10]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2},{ 0,-1},{ 1, 1}}, + [03]={{ 1, 0},{ 1, 1},{ 0,-2},{-1, 1}}, + [30]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2}}, + [12]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2},{ 1, 1}}, + [21]={{-1, 0},{-1,-1},{-1, 1},{ 0,-2},{-1,-2},{-1,-1}}, + [32]={{-1, 0},{-1,-1},{-1, 1},{ 1, 0},{ 0,-1},{ 0, 2},{-1, 2}}, + [23]={{ 1, 0},{ 1, 1},{-1, 0},{ 0,-2},{ 1,-2}}, + [02]={{-1, 0},{ 0,-1},{ 0, 1}}, + [20]={{ 1, 0},{ 0, 1},{ 0,-1}}, + [13]={{ 1, 0},{ 0, 1},{-1, 0}}, + [31]={{-1, 0},{ 0,-1},{ 1, 0}}, + },--P + false,--Q + { + [01]={{-1, 0},{ 1, 0},{-1, 1},{ 0,-2},{ 0,-3}}, + [10]={{ 1, 0},{ 1,-1},{-1, 0},{ 0, 2},{ 0, 3}}, + [03]={{ 1, 0},{ 1,-1},{ 0, 1},{ 0,-2},{ 0,-3}}, + [30]={{-1, 1},{ 1, 0},{ 0,-1},{ 0, 2},{ 0, 3}}, + [12]={{ 1, 0},{ 0,-1},{-1, 0},{ 0, 2}}, + [21]={{-1, 0},{ 0, 1},{ 1, 0},{ 0,-2}}, + [32]={{-1, 0},{ 0, 1},{-1, 1},{ 1, 0},{ 0, 2},{-2, 0}}, + [23]={{ 1, 0},{ 1,-1},{ 0,-1},{-1, 0},{ 0,-2},{ 2, 0}}, + [02]={{ 1, 0},{-1, 0},{-1,-1}}, + [20]={{-1, 0},{ 1, 0},{ 1, 1}}, + [13]={{ 0,-1},{-1, 1},{ 0, 1}}, + [31]={{ 0,-1},{ 1,-1},{ 0, 1}}, + },--F + false,--E + { + [01]={{ 0,-1},{-1,-1},{ 1, 1},{ 1, 0},{ 1,-3},{-1, 0},{ 0, 2},{-1, 2}}, + [10]={{ 1, 0},{ 0,-1},{-1,-1},{ 0,-2},{-1, 1},{ 0,-3},{ 1,-2},{ 0, 1}}, + [03]={{ 0,-1},{ 1,-1},{-1,-1},{-1, 0},{-1,-3},{ 1, 0},{ 0, 2},{ 1, 2}}, + [30]={{-1, 0},{ 0,-1},{ 1,-1},{ 0,-2},{ 1, 1},{ 0,-3},{-1,-2},{ 0, 1}}, + [12]={{ 1, 0},{-1, 0},{ 0,-2},{ 0,-3},{ 0, 1},{-1, 1}}, + [21]={{ 1,-1},{-1, 0},{ 1, 0},{ 0,-1},{ 0, 2},{ 0, 3}}, + [32]={{-1, 0},{ 1, 0},{ 0,-2},{ 0,-3},{ 0, 1},{ 1, 1}}, + [23]={{-1,-1},{ 1, 0},{-1, 0},{ 0,-1},{ 0, 2},{ 0, 3}}, + [02]={{ 0, 1},{ 0,-1},{ 0, 2}}, + [20]={{ 0,-1},{ 0, 1},{ 0,-2}}, + [13]={{ 1, 0},{-1, 1},{-2, 0}}, + [31]={{-1, 0},{ 1, 1},{ 2, 0}}, + },--T5 + { + [01]={{-1, 0},{-1, 1},{ 0,-2},{-1,-2}}, + [10]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2}}, + [03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2}}, + [30]={{-1, 0},{-1,-1},{ 0,-2},{-1, 2}}, + [12]={{ 1, 0},{ 1,-1},{ 1, 1}}, + [21]={{-1,-1},{-1, 1},{-1,-1}}, + [32]={{-1, 0},{-1,-1},{-1, 1}}, + [23]={{ 1,-1},{ 1, 1},{ 1,-1}}, + [02]={{ 0, 1}}, + [20]={{ 0,-1}}, + [13]={{ 0,-1},{ 0, 1},{ 1, 0}}, + [31]={{ 0,-1},{ 0, 1},{-1, 0}}, + },--U + { + [01]={{ 0, 1},{-1, 0},{ 0,-2},{-1,-2}}, + [10]={{ 0, 1},{ 1, 0},{ 0,-2},{ 1,-2}}, + [03]={{ 0,-1},{ 0, 1},{ 0, 2}}, + [30]={{ 0,-1},{ 0, 1},{ 0,-2}}, + [12]={{ 0,-1},{ 0, 1}}, + [21]={{ 0,-1},{ 0,-2}}, + [32]={{ 1, 0},{-1, 0}}, + [23]={{-1, 0},{ 1, 0}}, + [02]={{-1, 1},{ 1,-1}}, + [20]={{ 1,-1},{-1, 1}}, + [13]={{ 1, 1},{-1,-1}}, + [31]={{-1,-1},{ 1, 1}}, + },--V + { + [01]={{ 0,-1},{-1, 0},{ 1, 0},{ 1,-1},{ 0, 2}}, + [10]={{ 0,-1},{-1,-1},{ 0, 1},{ 0,-2},{ 1,-2},{ 0, 2}}, + [03]={{ 1, 0},{ 1, 1},{ 0,-1},{ 0,-2},{ 0,-3},{ 1,-1},{ 0, 1},{ 0, 2},{ 0, 3}}, + [30]={{-1, 0},{-1, 1},{ 0,-1},{ 0,-2},{ 0,-3},{-1,-1},{ 0, 1},{ 0, 2},{ 0, 3}}, + [12]={{ 1, 0},{ 0,-1},{ 1, 1},{-1, 0},{ 0, 1},{-1,-1}}, + [21]={{-1, 0},{ 0,-1},{-1, 1},{ 1, 0},{ 0, 1},{ 1,-1}}, + [32]={{ 0,-1},{ 1, 0},{ 0, 1},{-1, 0},{-1,-1},{ 0, 2}}, + [23]={{ 0,-1},{ 1,-1},{ 0, 1},{ 0,-2},{-1,-2},{ 0, 2}}, + [02]={{ 0,-1},{-1, 0}}, + [20]={{ 0, 1},{ 1, 0}}, + [13]={{ 0, 1},{-1, 0}}, + [31]={{ 0,-1},{ 1, 0}}, + },--W + function(P,d) + if P.human then SFX.fieldPlay("rotate",nil,P)end + local iki=XspinList[d] + for test=1,#iki do + local x,y=P.curX+iki[test][1],P.curY+iki[test][2] + if not P:ifoverlap(P.cur.bk,x,y)then + P.curX,P.curY=x,y + P.spinLast=1 + P:freshBlock(false,true) + P.stat.rotate=P.stat.rotate+1 + return + end end - else - P.spinSeq=0 P:freshBlock(true,true) - end - end,--O - { - [01]={{ 0, 1},{ 1, 0},{-2, 0},{-2,-1},{ 1, 2}}, - [10]={{ 2, 0},{-1, 0},{-1,-2},{ 2, 1},{ 0, 1}}, - [03]={{ 0, 1},{-1, 0},{ 2, 0},{ 2,-1},{-1, 2}}, - [30]={{-2, 0},{ 1, 0},{ 1,-2},{-2, 1},{ 0, 1}}, - [12]={{-1, 0},{ 2, 0},{ 2,-1},{ 0,-1},{-1, 2}}, - [21]={{-2, 0},{ 1, 0},{ 1,-2},{-2, 1},{ 0, 1}}, - [32]={{ 1, 0},{-2, 0},{-2,-1},{ 0,-1},{ 1, 2}}, - [23]={{ 2, 0},{-1, 0},{-1,-2},{ 2, 1},{ 0, 1}}, - [02]={{-1, 0},{ 1, 0},{ 0,-1},{ 0, 1}}, - [20]={{ 1, 0},{-1, 0},{ 0, 1},{ 0,-1}}, - [13]={{ 0,-1},{-1, 0},{ 1, 0},{ 0, 1}}, - [31]={{ 0,-1},{ 1, 0},{-1, 0},{ 0, 1}}, - },--I - { - [01]={{-1, 0},{ 0, 1},{ 1, 1},{ 0,-3},{ 0, 2},{ 0, 3},{-1, 2}}, - [10]={{ 1, 0},{ 0,-1},{-1,-1},{ 0,-2},{ 0,-3},{ 0, 3},{ 1,-2}}, - [03]={{ 1, 0},{ 0,-3},{ 0, 1},{ 0, 2},{ 0, 3},{ 1, 2}}, - [30]={{-1, 0},{ 0, 1},{ 0,-2},{ 0,-3},{ 0, 3},{-1,-2}}, - },--Z5 - {},--S5 - { - [01]={{-1, 0},{-1, 1},{ 0,-2},{-1,-2},{-1,-1},{ 0, 1}}, - [10]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2},{ 0,-1},{ 1, 1}}, - [03]={{ 1, 0},{ 1, 1},{ 0,-2},{-1, 1}}, - [30]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2}}, - [12]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2},{ 1, 1}}, - [21]={{-1, 0},{-1,-1},{-1, 1},{ 0,-2},{-1,-2},{-1,-1}}, - [32]={{-1, 0},{-1,-1},{-1, 1},{ 1, 0},{ 0,-1},{ 0, 2},{-1, 2}}, - [23]={{ 1, 0},{ 1, 1},{-1, 0},{ 0,-2},{ 1,-2}}, - [02]={{-1, 0},{ 0,-1},{ 0, 1}}, - [20]={{ 1, 0},{ 0, 1},{ 0,-1}}, - [13]={{ 1, 0},{ 0, 1},{-1, 0}}, - [31]={{-1, 0},{ 0,-1},{ 1, 0}}, - },--P - {},--Q - { - [01]={{-1, 0},{ 1, 0},{-1, 1},{ 0,-2},{ 0,-3}}, - [10]={{ 1, 0},{ 1,-1},{-1, 0},{ 0, 2},{ 0, 3}}, - [03]={{ 1, 0},{ 1,-1},{ 0, 1},{ 0,-2},{ 0,-3}}, - [30]={{-1, 1},{ 1, 0},{ 0,-1},{ 0, 2},{ 0, 3}}, - [12]={{ 1, 0},{ 0,-1},{-1, 0},{ 0, 2}}, - [21]={{-1, 0},{ 0, 1},{ 1, 0},{ 0,-2}}, - [32]={{-1, 0},{ 0, 1},{-1, 1},{ 1, 0},{ 0, 2},{-2, 0}}, - [23]={{ 1, 0},{ 1,-1},{ 0,-1},{-1, 0},{ 0,-2},{ 2, 0}}, - [02]={{ 1, 0},{-1, 0},{-1,-1}}, - [20]={{-1, 0},{ 1, 0},{ 1, 1}}, - [13]={{ 0,-1},{-1, 1},{ 0, 1}}, - [31]={{ 0,-1},{ 1,-1},{ 0, 1}}, - },--F - {},--E - { - [01]={{ 0,-1},{-1,-1},{ 1, 1},{ 1, 0},{ 1,-3},{-1, 0},{ 0, 2},{-1, 2}}, - [10]={{ 1, 0},{ 0,-1},{-1,-1},{ 0,-2},{-1, 1},{ 0,-3},{ 1,-2},{ 0, 1}}, - [03]={{ 0,-1},{ 1,-1},{-1,-1},{-1, 0},{-1,-3},{ 1, 0},{ 0, 2},{ 1, 2}}, - [30]={{-1, 0},{ 0,-1},{ 1,-1},{ 0,-2},{ 1, 1},{ 0,-3},{-1,-2},{ 0, 1}}, - [12]={{ 1, 0},{-1, 0},{ 0,-2},{ 0,-3},{ 0, 1},{-1, 1}}, - [21]={{ 1,-1},{-1, 0},{ 1, 0},{ 0,-1},{ 0, 2},{ 0, 3}}, - [32]={{-1, 0},{ 1, 0},{ 0,-2},{ 0,-3},{ 0, 1},{ 1, 1}}, - [23]={{-1,-1},{ 1, 0},{-1, 0},{ 0,-1},{ 0, 2},{ 0, 3}}, - [02]={{ 0, 1},{ 0,-1},{ 0, 2}}, - [20]={{ 0,-1},{ 0, 1},{ 0,-2}}, - [13]={{ 1, 0},{-1, 1},{-2, 0}}, - [31]={{-1, 0},{ 1, 1},{ 2, 0}}, - },--T5 - { - [01]={{-1, 0},{-1, 1},{ 0,-2},{-1,-2}}, - [10]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2}}, - [03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2}}, - [30]={{-1, 0},{-1,-1},{ 0,-2},{-1, 2}}, - [12]={{ 1, 0},{ 1,-1},{ 1, 1}}, - [21]={{-1,-1},{-1, 1},{-1,-1}}, - [32]={{-1, 0},{-1,-1},{-1, 1}}, - [23]={{ 1,-1},{ 1, 1},{ 1,-1}}, - [02]={{ 0, 1}}, - [20]={{ 0,-1}}, - [13]={{ 0,-1},{ 0, 1},{ 1, 0}}, - [31]={{ 0,-1},{ 0, 1},{-1, 0}}, - },--U - { - [01]={{ 0, 1},{-1, 0},{ 0,-2},{-1,-2}}, - [10]={{ 0, 1},{ 1, 0},{ 0,-2},{ 1,-2}}, - [03]={{ 0,-1},{ 0, 1},{ 0, 2}}, - [30]={{ 0,-1},{ 0, 1},{ 0,-2}}, - [12]={{ 0,-1},{ 0, 1}}, - [21]={{ 0,-1},{ 0,-2}}, - [32]={{ 1, 0},{-1, 0}}, - [23]={{-1, 0},{ 1, 0}}, - [02]={{-1, 1},{ 1,-1}}, - [20]={{ 1,-1},{-1, 1}}, - [13]={{ 1, 1},{-1,-1}}, - [31]={{-1,-1},{ 1, 1}}, - },--V - { - [01]={{ 0,-1},{-1, 0},{ 1, 0},{ 1,-1},{ 0, 2}}, - [10]={{ 0,-1},{-1,-1},{ 0, 1},{ 0,-2},{ 1,-2},{ 0, 2}}, - [03]={{ 1, 0},{ 1, 1},{ 0,-1},{ 0,-2},{ 0,-3},{ 1,-1},{ 0, 1},{ 0, 2},{ 0, 3}}, - [30]={{-1, 0},{-1, 1},{ 0,-1},{ 0,-2},{ 0,-3},{-1,-1},{ 0, 1},{ 0, 2},{ 0, 3}}, - [12]={{ 1, 0},{ 0,-1},{ 1, 1},{-1, 0},{ 0, 1},{-1,-1}}, - [21]={{-1, 0},{ 0,-1},{-1, 1},{ 1, 0},{ 0, 1},{ 1,-1}}, - [32]={{ 0,-1},{ 1, 0},{ 0, 1},{-1, 0},{-1,-1},{ 0, 2}}, - [23]={{ 0,-1},{ 1,-1},{ 0, 1},{ 0,-2},{-1,-2},{ 0, 2}}, - [02]={{ 0,-1},{-1, 0}}, - [20]={{ 0, 1},{ 1, 0}}, - [13]={{ 0, 1},{-1, 0}}, - [31]={{ 0,-1},{ 1, 0}}, - },--W - function(P,d) - if P.human then SFX.fieldPlay("rotate",nil,P)end - local iki=XspinList[d] - for test=1,#iki do - local x,y=P.curX+iki[test][1],P.curY+iki[test][2] - if not P:ifoverlap(P.cur.bk,x,y)then - P.curX,P.curY=x,y - P.spinLast=1 - P:freshBlock(false,true) - P.stat.rotate=P.stat.rotate+1 - return - end - end - P:freshBlock(true,true) - end,--X - { - [01]={{-1, 0},{-1, 1},{ 0,-3},{-1, 1},{-1, 2},{ 0, 1}}, - [10]={{-1, 0},{ 1,-1},{ 0, 3},{ 1,-1},{ 1,-2},{ 0, 1}}, - [03]={{ 0,-1},{ 1,-1},{-1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 0,-3},{ 1,-3},{-1, 1}}, - [30]={{ 0, 1},{-1, 1},{ 1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0, 3},{-1, 3},{ 1,-1}}, - [12]={{ 1, 0},{ 1,-1},{ 0,-1},{ 1,-2},{ 0,-2},{ 1, 1},{-1, 0},{ 0, 2},{ 1, 2}}, - [21]={{-1, 0},{-1, 1},{ 0, 1},{-1, 2},{ 0, 2},{-1,-1},{ 1, 0},{ 0,-2},{-1,-2}}, - [32]={{-1, 0},{-1, 1},{-1,-1},{ 1, 0},{ 0, 2},{-1, 2},{ 0,-2}}, - [23]={{ 1, 0},{ 1,-1},{ 1, 1},{-1, 0},{ 0,-2},{ 1,-2},{ 0, 2}}, - [02]={{ 0,-1},{ 1,-1},{-1, 0},{ 2,-1},{ 0, 1}}, - [20]={{ 0, 1},{-1, 1},{ 1, 0},{-2, 1},{ 0,-1}}, - [13]={{-1, 0},{-1,-1},{ 0, 1},{-1,-2}}, - [31]={{ 1, 0},{ 1, 1},{ 0,-1},{ 1, 2}}, - },--J5 - {},--L5 - { - [01]={{-1, 0},{-1, 0},{-1, 1},{ 1, 0},{-1, 2},{-1,-1},{ 0,-3},{ 0, 1}}, - [10]={{-1, 0},{ 1, 0},{ 1,-1},{ 1, 0},{ 1,-2},{ 1, 1},{ 0, 3},{ 0, 1}}, - [03]={{ 0,-1},{ 1, 0},{ 1,-1},{-1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 0,-3},{ 1,-3},{-1, 1}}, - [30]={{ 0, 1},{-1, 0},{-1, 1},{ 1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0, 3},{-1, 3},{ 1,-1}}, - [12]={{ 1, 0},{ 1,-1},{ 0,-1},{ 1,-2},{ 0,-2},{ 1, 1},{-1, 0},{ 0, 2},{ 1, 2}}, - [21]={{-1, 0},{-1, 1},{ 0, 1},{-1, 2},{ 0, 2},{-1,-1},{ 1, 0},{ 0,-2},{-1,-2}}, - [32]={{ 0,-1},{-1, 0},{-1, 1},{-1,-1},{ 1, 0},{ 0, 2},{-1, 2},{ 0,-2}}, - [23]={{ 0, 1},{ 1, 0},{ 1,-1},{ 1, 1},{-1, 0},{ 0,-2},{ 1,-2},{ 0, 2}}, - [02]={{ 0,-1},{ 1,-1},{-1, 0},{ 2,-1},{ 0, 1}}, - [20]={{ 0, 1},{-1, 1},{ 1, 0},{-2, 1},{ 0,-1}}, - [13]={{-1, 0},{-1,-1},{ 0, 1},{-1,-2}}, - [31]={{ 1, 0},{ 1, 1},{ 0,-1},{ 1, 2}}, - },--R - {},--Y - { - [01]={{-1, 0},{-1, 1},{ 0, 1},{ 1, 0},{-1, 2},{-2, 0},{ 0,-2}}, - [10]={{ 1, 0},{-1, 0},{ 0,-1},{ 1,-1},{ 1,-2},{ 2, 0},{ 0, 2}}, - [03]={{-1, 0},{ 1,-1},{ 0,-2},{ 0,-3},{ 1, 0},{ 1,-2},{ 1,-3},{ 0, 1},{-1, 1}}, - [30]={{-1, 0},{ 1,-1},{ 1,-2},{ 1, 0},{ 0,-2},{ 1,-3},{-1, 2},{ 0, 3},{-1, 3}}, - [12]={{-1, 0},{ 1,-1},{-1,-1},{ 1,-2},{ 1, 0},{ 0,-2},{ 1,-3},{-1, 2},{ 0, 3},{-1, 3}}, - [21]={{-1, 0},{ 1,-1},{ 1, 1},{ 0,-2},{ 0,-3},{ 1, 0},{ 1,-2},{ 1,-3},{ 0, 1},{-1, 1}}, - [32]={{-1, 0},{ 0,-1},{-1,-2},{ 1,-1},{ 1, 0},{ 1, 1},{ 0, 2},{ 0, 3}}, - [23]={{ 0,-2},{ 0,-3},{ 1, 2},{ 1, 0},{ 0, 1},{-1, 1},{ 0,-1},{ 0, 2}}, - [02]={{-1, 0},{ 0, 2},{ 0,-1}}, - [20]={{ 1, 0},{ 0,-2},{ 0, 1}}, - [13]={{-1, 0},{-1,-1},{ 0, 1},{ 1, 2}}, - [31]={{ 1, 0},{ 1, 1},{ 0,-1},{-1,-2}}, - },--N - {},--H - { - [01]={{ 1,-1},{ 1, 0},{ 1, 1},{ 0, 1},{-1, 1},{-1, 0},{-1,-1},{ 0,-1},{ 0,-2},{-2,-1},{-2,-2},{ 2, 0},{ 2,-1},{ 2,-2},{ 1, 2},{ 2, 2},{-1, 2},{-2, 2}}, - [10]={{-1, 0},{-1,-1},{ 0,-1},{ 1,-1},{-2,-2},{-2,-1},{-2, 0},{-1,-2},{ 0,-2},{ 1,-2},{ 2,-2},{-1, 1},{-2, 1},{-2, 2},{ 1, 0},{ 2, 0},{ 2,-1},{ 0, 1},{ 1,-1},{ 2,-2}}, - [03]={{-1,-1},{-1, 0},{-1, 1},{-0, 1},{ 1, 1},{ 1, 0},{ 1,-1},{-0,-1},{-0,-2},{ 2,-1},{ 2,-2},{-2, 0},{-2,-1},{-2,-2},{-1, 2},{-2, 2},{ 1, 2},{ 2, 2}}, - [30]={{ 1, 0},{ 1,-1},{-0,-1},{-1,-1},{ 2,-2},{ 2,-1},{ 2, 0},{ 1,-2},{-0,-2},{-1,-2},{-2,-2},{ 1, 1},{ 2, 1},{ 2, 2},{-1, 0},{-2, 0},{-2,-1},{ 0, 1},{-1,-1},{-2,-2}}, - },--I5 -} -reflect(TRS[1],TRS[2])--SZ -reflect(TRS[3],TRS[4])--LJ -reflect(TRS[8],TRS[9])--S5Z5 -reflect(TRS[10],TRS[11])--PQ -reflect(TRS[12],TRS[13])--FE -reflect(TRS[19],TRS[20])--L5J5 -reflect(TRS[21],TRS[22])--RY -reflect(TRS[23],TRS[24])--HN -pushZero(TRS) - -C_sym(TRS[8]) -C_sym(TRS[9]) -C_sym(TRS[25]) -for i=1,25 do collect(TRS[i])end - -local AIRS={ - { - [01]={{-1,0},{-1, 1},{ 0,-2},{-1,-2}}, - [10]={{ 1,0},{ 1,-1},{ 0, 2},{ 1, 2}}, - [03]={{ 1,0},{ 1, 1},{ 0,-2},{ 1,-2}}, - [30]={{-1,0},{-1,-1},{ 0, 2},{-1, 2}}, - [12]={{ 1,0},{ 1,-1},{ 0, 2},{ 1, 2}}, - [21]={{-1,0},{-1, 1},{ 0,-2},{-1,-2}}, - [32]={{-1,0},{-1,-1},{ 0, 2},{-1, 2}}, - [23]={{ 1,0},{ 1, 1},{ 0,-2},{ 1,-2}}, - }, - false, - false, - false, - false, - function()end, - { - [01]={{-2, 0},{ 1, 0},{-2,-1},{ 1, 2}}, - [10]={{ 2, 0},{-1, 0},{ 2, 1},{-1,-2}}, - [12]={{-1, 0},{ 2, 0},{-1, 2},{ 2,-1}}, - [21]={{ 1, 0},{-2, 0},{ 1,-2},{-2, 1}}, - [23]={{ 2, 0},{-1, 0},{ 2, 1},{-1,-2}}, - [32]={{-2, 0},{ 1, 0},{-2,-1},{ 1, 2}}, - [30]={{ 1, 0},{-2, 0},{ 1,-2},{-2, 1}}, - [03]={{-1, 0},{ 2, 0},{-1, 2},{ 2,-1}}, + end,--X + { + [01]={{-1, 0},{-1, 1},{ 0,-3},{-1, 1},{-1, 2},{ 0, 1}}, + [10]={{-1, 0},{ 1,-1},{ 0, 3},{ 1,-1},{ 1,-2},{ 0, 1}}, + [03]={{ 0,-1},{ 1,-1},{-1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 0,-3},{ 1,-3},{-1, 1}}, + [30]={{ 0, 1},{-1, 1},{ 1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0, 3},{-1, 3},{ 1,-1}}, + [12]={{ 1, 0},{ 1,-1},{ 0,-1},{ 1,-2},{ 0,-2},{ 1, 1},{-1, 0},{ 0, 2},{ 1, 2}}, + [21]={{-1, 0},{-1, 1},{ 0, 1},{-1, 2},{ 0, 2},{-1,-1},{ 1, 0},{ 0,-2},{-1,-2}}, + [32]={{-1, 0},{-1, 1},{-1,-1},{ 1, 0},{ 0, 2},{-1, 2},{ 0,-2}}, + [23]={{ 1, 0},{ 1,-1},{ 1, 1},{-1, 0},{ 0,-2},{ 1,-2},{ 0, 2}}, + [02]={{ 0,-1},{ 1,-1},{-1, 0},{ 2,-1},{ 0, 1}}, + [20]={{ 0, 1},{-1, 1},{ 1, 0},{-2, 1},{ 0,-1}}, + [13]={{-1, 0},{-1,-1},{ 0, 1},{-1,-2}}, + [31]={{ 1, 0},{ 1, 1},{ 0,-1},{ 1, 2}}, + },--J5 + false,--L5 + { + [01]={{-1, 0},{-1, 0},{-1, 1},{ 1, 0},{-1, 2},{-1,-1},{ 0,-3},{ 0, 1}}, + [10]={{-1, 0},{ 1, 0},{ 1,-1},{ 1, 0},{ 1,-2},{ 1, 1},{ 0, 3},{ 0, 1}}, + [03]={{ 0,-1},{ 1, 0},{ 1,-1},{-1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 0,-3},{ 1,-3},{-1, 1}}, + [30]={{ 0, 1},{-1, 0},{-1, 1},{ 1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0, 3},{-1, 3},{ 1,-1}}, + [12]={{ 1, 0},{ 1,-1},{ 0,-1},{ 1,-2},{ 0,-2},{ 1, 1},{-1, 0},{ 0, 2},{ 1, 2}}, + [21]={{-1, 0},{-1, 1},{ 0, 1},{-1, 2},{ 0, 2},{-1,-1},{ 1, 0},{ 0,-2},{-1,-2}}, + [32]={{ 0,-1},{-1, 0},{-1, 1},{-1,-1},{ 1, 0},{ 0, 2},{-1, 2},{ 0,-2}}, + [23]={{ 0, 1},{ 1, 0},{ 1,-1},{ 1, 1},{-1, 0},{ 0,-2},{ 1,-2},{ 0, 2}}, + [02]={{ 0,-1},{ 1,-1},{-1, 0},{ 2,-1},{ 0, 1}}, + [20]={{ 0, 1},{-1, 1},{ 1, 0},{-2, 1},{ 0,-1}}, + [13]={{-1, 0},{-1,-1},{ 0, 1},{-1,-2}}, + [31]={{ 1, 0},{ 1, 1},{ 0,-1},{ 1, 2}}, + },--R + false,--Y + { + [01]={{-1, 0},{-1, 1},{ 0, 1},{ 1, 0},{-1, 2},{-2, 0},{ 0,-2}}, + [10]={{ 1, 0},{-1, 0},{ 0,-1},{ 1,-1},{ 1,-2},{ 2, 0},{ 0, 2}}, + [03]={{-1, 0},{ 1,-1},{ 0,-2},{ 0,-3},{ 1, 0},{ 1,-2},{ 1,-3},{ 0, 1},{-1, 1}}, + [30]={{-1, 0},{ 1,-1},{ 1,-2},{ 1, 0},{ 0,-2},{ 1,-3},{-1, 2},{ 0, 3},{-1, 3}}, + [12]={{-1, 0},{ 1,-1},{-1,-1},{ 1,-2},{ 1, 0},{ 0,-2},{ 1,-3},{-1, 2},{ 0, 3},{-1, 3}}, + [21]={{-1, 0},{ 1,-1},{ 1, 1},{ 0,-2},{ 0,-3},{ 1, 0},{ 1,-2},{ 1,-3},{ 0, 1},{-1, 1}}, + [32]={{-1, 0},{ 0,-1},{-1,-2},{ 1,-1},{ 1, 0},{ 1, 1},{ 0, 2},{ 0, 3}}, + [23]={{ 0,-2},{ 0,-3},{ 1, 2},{ 1, 0},{ 0, 1},{-1, 1},{ 0,-1},{ 0, 2}}, + [02]={{-1, 0},{ 0, 2},{ 0,-1}}, + [20]={{ 1, 0},{ 0,-2},{ 0, 1}}, + [13]={{-1, 0},{-1,-1},{ 0, 1},{ 1, 2}}, + [31]={{ 1, 0},{ 1, 1},{ 0,-1},{-1,-2}}, + },--N + false,--H + { + [01]={{ 1,-1},{ 1, 0},{ 1, 1},{ 0, 1},{-1, 1},{-1, 0},{-1,-1},{ 0,-1},{ 0,-2},{-2,-1},{-2,-2},{ 2, 0},{ 2,-1},{ 2,-2},{ 1, 2},{ 2, 2},{-1, 2},{-2, 2}}, + [10]={{-1, 0},{-1,-1},{ 0,-1},{ 1,-1},{-2,-2},{-2,-1},{-2, 0},{-1,-2},{ 0,-2},{ 1,-2},{ 2,-2},{-1, 1},{-2, 1},{-2, 2},{ 1, 0},{ 2, 0},{ 2,-1},{ 0, 1},{ 1,-1},{ 2,-2}}, + [03]={{-1,-1},{-1, 0},{-1, 1},{-0, 1},{ 1, 1},{ 1, 0},{ 1,-1},{-0,-1},{-0,-2},{ 2,-1},{ 2,-2},{-2, 0},{-2,-1},{-2,-2},{-1, 2},{-2, 2},{ 1, 2},{ 2, 2}}, + [30]={{ 1, 0},{ 1,-1},{-0,-1},{-1,-1},{ 2,-2},{ 2,-1},{ 2, 0},{ 1,-2},{-0,-2},{-1,-2},{-2,-2},{ 1, 1},{ 2, 1},{ 2, 2},{-1, 0},{-2, 0},{-2,-1},{ 0, 1},{-1,-1},{-2,-2}}, + },--I5 } -} -collect(AIRS[1])collect(AIRS[7]) -pushZero(AIRS) -for i=2,5 do AIRS[i]=AIRS[1]end -for i=8,25 do AIRS[i]=AIRS[1]end + TRS[2]= reflect(TRS[1])--SZ + TRS[4]= reflect(TRS[3])--LJ + TRS[9]= reflect(TRS[8])--S5Z5 + TRS[11]=reflect(TRS[10])--PQ + TRS[13]=reflect(TRS[12])--FE + TRS[20]=reflect(TRS[19])--L5J5 + TRS[22]=reflect(TRS[21])--RY + TRS[24]=reflect(TRS[23])--HN + pushZero(TRS) -local NONE={} -for i=1,25 do NONE[i]=ZERO end + C_sym(TRS[8]) + C_sym(TRS[9]) + C_sym(TRS[25]) + for i=1,25 do collect(TRS[i])end +end + +local AIRS +do + AIRS={ + { + [01]={{-1,0},{-1, 1},{ 0,-2},{-1,-2}}, + [10]={{ 1,0},{ 1,-1},{ 0, 2},{ 1, 2}}, + [03]={{ 1,0},{ 1, 1},{ 0,-2},{ 1,-2}}, + [30]={{-1,0},{-1,-1},{ 0, 2},{-1, 2}}, + [12]={{ 1,0},{ 1,-1},{ 0, 2},{ 1, 2}}, + [21]={{-1,0},{-1, 1},{ 0,-2},{-1,-2}}, + [32]={{-1,0},{-1,-1},{ 0, 2},{-1, 2}}, + [23]={{ 1,0},{ 1, 1},{ 0,-2},{ 1,-2}}, + }, + false, + false, + false, + false, + function()end, + { + [01]={{-2, 0},{ 1, 0},{-2,-1},{ 1, 2}}, + [10]={{ 2, 0},{-1, 0},{ 2, 1},{-1,-2}}, + [12]={{-1, 0},{ 2, 0},{-1, 2},{ 2,-1}}, + [21]={{ 1, 0},{-2, 0},{ 1,-2},{-2, 1}}, + [23]={{ 2, 0},{-1, 0},{ 2, 1},{-1,-2}}, + [32]={{-2, 0},{ 1, 0},{-2,-1},{ 1, 2}}, + [30]={{ 1, 0},{-2, 0},{ 1,-2},{-2, 1}}, + [03]={{-1, 0},{ 2, 0},{-1, 2},{ 2,-1}}, + } + } + collect(AIRS[1]) + collect(AIRS[7]) + pushZero(AIRS) + for i=2,5 do AIRS[i]=AIRS[1]end + for i=8,25 do AIRS[i]=AIRS[1]end + + local NONE={} + for i=1,25 do NONE[i]=ZERO end +end return{ TRS=TRS, diff --git a/parts/list.lua b/parts/list.lua index d08e0557..7ec0e192 100644 --- a/parts/list.lua +++ b/parts/list.lua @@ -214,10 +214,50 @@ drawableText={ custom=T(80),basic=T(35),rule=T(35),field=T(35),mission=T(35), setting_game=T(80),setting_video=T(80),setting_sound=T(80), setting_control=T(70),setting_skin=T(70), + dict=T(70), preview=T(40), keyboard=T(25),joystick=T(25), ctrlSetHelp=T(30), musicRoom=T(80),nowPlaying=T(50), VKTchW=T(30),VKOrgW=T(30),VKCurW=T(30), noScore=T(45),highScore=T(30), -} \ No newline at end of file +} + +do + local N1,N2={0,1},{1,0} + local N3,N4={1,1},{.5,.5} + local I1,I2={-.5,1.5},{1.5,-.5} + local I3,I4={.5,1.5},{1.5,.5} + local V4={1.5,1.5} + local L1,L2={0,2},{2,0} + spinCenters={ + --Tetramino + {[0]=N1,N2,N3,N3},--Z + {[0]=N1,N2,N3,N3},--S + {[0]=N1,N2,N3,N3},--L + {[0]=N1,N2,N3,N3},--J + {[0]=N1,N2,N3,N3},--T + {[0]=N4,N4,N4,N4},--O + {[0]=I1,I2,I3,I4},--I + + --Pentomino + {[0]=N3,N3,N3,N3},--Z + {[0]=N3,N3,N3,N3},--S + {[0]=N1,N2,N3,N3},--P + {[0]=N1,N2,N3,N3},--Q + {[0]=N3,N3,N3,N3},--F + {[0]=N3,N3,N3,N3},--E + {[0]=N3,N3,N3,N3},--T + {[0]=N1,N2,N3,N3},--U + {[0]=I3,N4,I4,V4},--V + {[0]=N3,N3,N3,N3},--W + {[0]=N3,N3,N3,N3},--X + {[0]=I3,I4,I3,I4},--J + {[0]=I3,I4,I3,I4},--L + {[0]=I3,I4,I3,I4},--R + {[0]=I3,I4,I3,I4},--Y + {[0]=I3,I4,I3,I4},--N + {[0]=I3,I4,I3,I4},--H + {[0]=L1,L2,L1,L2},--I + } +end \ No newline at end of file diff --git a/parts/modes.lua b/parts/modes.lua index 5a045db8..985afc2d 100644 --- a/parts/modes.lua +++ b/parts/modes.lua @@ -1,87 +1,88 @@ return{ {name="sprint_10", x=0, y=0, size=35,shape=1,icon="sprint", unlock={"sprint_20","sprint_40"}}, - {name="sprint_20", x=-300, y=0, size=45,shape=1,icon="sprint", unlock={}}, - {name="sprint_40", x=0, y=-400, size=55,shape=1,icon="sprint", unlock={"sprint_100","marathon_normal","custom_clear","custom_puzzle","sprintPenta","sprintMPH"}}, + {name="sprint_20", x=-300, y=0, size=45,shape=1,icon="sprint", }, + {name="sprint_40", x=0, y=-400, size=55,shape=1,icon="sprint", unlock={"sprint_100","marathon_normal","sprintPenta","sprintMPH"}}, {name="sprint_100", x=-200, y=-400, size=45,shape=1,icon="sprint", unlock={"sprint_400","drought_normal"}}, {name="sprint_400", x=-400, y=-400, size=35,shape=1,icon="sprint", unlock={"sprint_1000"}}, - {name="sprint_1000", x=-600, y=-400, size=35,shape=1,icon="sprint", unlock={}}, + {name="sprint_1000", x=-600, y=-400, size=35,shape=1,icon="sprint", }, {name="drought_normal", x=-400, y=-200, size=35,shape=1,icon="noI", unlock={"drought_lunatic"}}, - {name="drought_lunatic", x=-600, y=-200, size=35,shape=1,icon="mess", unlock={}}, + {name="drought_lunatic", x=-600, y=-200, size=35,shape=1,icon="mess", }, {name="marathon_normal", x=0, y=-600, size=55,shape=1,icon="flag", unlock={"marathon_hard","solo_1","round_1","blind_easy","classic_fast","survivor_easy","bigbang","zen"}}, {name="marathon_hard", x=0, y=-800, size=45,shape=1,icon="flag", unlock={"master_beginner"}}, {name="solo_1", x=-300, y=-1000, size=35,shape=1,icon="solo", unlock={"solo_2"}}, {name="solo_2", x=-500, y=-1000, size=35,shape=1,icon="solo", unlock={"solo_3"}}, {name="solo_3", x=-700, y=-1000, size=35,shape=1,icon="solo", unlock={"solo_4","techmino49_easy"}}, {name="solo_4", x=-900, y=-1000, size=35,shape=1,icon="solo", unlock={"solo_5"}}, - {name="solo_5", x=-1100, y=-1000, size=35,shape=1,icon="solo", unlock={}}, + {name="solo_5", x=-1100, y=-1000, size=35,shape=1,icon="solo", }, {name="techmino49_easy", x=-900, y=-1200, size=35,shape=1,icon="royale", unlock={"techmino49_hard","techmino99_easy"}}, {name="techmino49_hard", x=-900, y=-1400, size=35,shape=1,icon="royale", unlock={"techmino49_ultimate"}}, - {name="techmino49_ultimate", x=-900, y=-1600, size=35,shape=1,icon="royale", unlock={}}, + {name="techmino49_ultimate", x=-900, y=-1600, size=35,shape=1,icon="royale", }, {name="techmino99_easy", x=-1100, y=-1400, size=35,shape=1,icon="royale", unlock={"techmino99_hard"}}, {name="techmino99_hard", x=-1100, y=-1600, size=35,shape=1,icon="royale", unlock={"techmino99_ultimate"}}, - {name="techmino99_ultimate", x=-1100, y=-1800, size=35,shape=1,icon="royale", unlock={}}, + {name="techmino99_ultimate", x=-1100, y=-1800, size=35,shape=1,icon="royale", }, {name="round_1", x=-300, y=-800, size=35,shape=1,icon="round", unlock={"round_2"}}, {name="round_2", x=-500, y=-800, size=35,shape=1,icon="round", unlock={"round_3"}}, {name="round_3", x=-700, y=-800, size=35,shape=1,icon="round", unlock={"round_4"}}, {name="round_4", x=-900, y=-800, size=35,shape=1,icon="round", unlock={"round_5"}}, - {name="round_5", x=-1100, y=-800, size=35,shape=1,icon="round", unlock={}}, + {name="round_5", x=-1100, y=-800, size=35,shape=1,icon="round", }, {name="master_beginner", x=0, y=-1000, size=35,shape=1,icon="master", unlock={"master_advance"}}, {name="master_advance", x=0, y=-1200, size=35,shape=1,icon="master", unlock={"master_final","GM"}}, - {name="master_final", x=0, y=-1400, size=40,shape=2,icon="master", unlock={}}, - {name="GM", x=150, y=-1500, size=35,shape=1,icon="master", unlock={}}, + {name="master_final", x=0, y=-1400, size=40,shape=2,icon="master", }, + {name="GM", x=150, y=-1500, size=35,shape=1,icon="master", }, {name="blind_easy", x=150, y=-700, size=35,shape=1,icon="blind", unlock={"blind_normal"}}, {name="blind_normal", x=150, y=-800, size=35,shape=1,icon="blind", unlock={"blind_hard"}}, {name="blind_hard", x=150, y=-900, size=35,shape=1,icon="blind", unlock={"blind_lunatic"}}, {name="blind_lunatic", x=150, y=-1000, size=35,shape=1,icon="blind", unlock={"blind_ultimate"}}, {name="blind_ultimate", x=150, y=-1100, size=35,shape=2,icon="blind", unlock={"blind_wtf"}}, - {name="blind_wtf", x=150, y=-1200, size=35,shape=2,icon="blind", unlock={}}, + {name="blind_wtf", x=150, y=-1200, size=35,shape=2,icon="blind", }, - {name="classic_fast", x=-300, y=-1200, size=40,shape=2,icon="classic", unlock={}}, + {name="classic_fast", x=-300, y=-1200, size=40,shape=2,icon="classic", }, {name="survivor_easy", x=300, y=-600, size=35,shape=1,icon="survivor", unlock={"survivor_normal"}}, {name="survivor_normal", x=500, y=-600, size=35,shape=1,icon="survivor", unlock={"survivor_hard","attacker_hard","defender_normal","dig_hard"}}, {name="survivor_hard", x=700, y=-600, size=35,shape=1,icon="survivor", unlock={"survivor_lunatic"}}, {name="survivor_lunatic", x=900, y=-600, size=35,shape=1,icon="survivor", unlock={"survivor_ultimate"}}, - {name="survivor_ultimate", x=1100, y=-600, size=35,shape=1,icon="survivor", unlock={}}, + {name="survivor_ultimate", x=1100, y=-600, size=35,shape=1,icon="survivor", }, {name="attacker_hard", x=300, y=-800, size=35,shape=1,icon="attacker", unlock={"attacker_ultimate"}}, - {name="attacker_ultimate", x=300, y=-1000, size=35,shape=1,icon="attacker", unlock={}}, + {name="attacker_ultimate", x=300, y=-1000, size=35,shape=1,icon="attacker", }, {name="defender_normal", x=500, y=-800, size=35,shape=1,icon="defender", unlock={"defender_lunatic"}}, - {name="defender_lunatic", x=500, y=-1000, size=35,shape=1,icon="defender", unlock={}}, + {name="defender_lunatic", x=500, y=-1000, size=35,shape=1,icon="defender", }, {name="dig_hard", x=700, y=-800, size=35,shape=1,icon="dig", unlock={"dig_ultimate"}}, - {name="dig_ultimate", x=700, y=-1000, size=35,shape=1,icon="dig", unlock={}}, + {name="dig_ultimate", x=700, y=-1000, size=35,shape=1,icon="dig", }, {name="bigbang", x=400, y=-400, size=55,shape=1,icon="bigbang", unlock={"c4wtrain_normal","pctrain_normal","tech_normal"}}, {name="c4wtrain_normal", x=700, y=-400, size=35,shape=1,icon="c4wtrain", unlock={"c4wtrain_lunatic"}}, - {name="c4wtrain_lunatic", x=900, y=-400, size=35,shape=1,icon="c4wtrain", unlock={}}, + {name="c4wtrain_lunatic", x=900, y=-400, size=35,shape=1,icon="c4wtrain", }, {name="pctrain_normal", x=700, y=-200, size=35,shape=1,icon="pctrain", unlock={"pctrain_lunatic","pcchallenge_normal"}}, - {name="pctrain_lunatic", x=900, y=-200, size=35,shape=1,icon="pctrain", unlock={}}, + {name="pctrain_lunatic", x=900, y=-200, size=35,shape=1,icon="pctrain", }, {name="pcchallenge_normal", x=800, y=-100, size=35,shape=1,icon="pcchallenge", unlock={"pcchallenge_hard"}}, {name="pcchallenge_hard", x=1000, y=-100, size=35,shape=1,icon="pcchallenge", unlock={"pcchallenge_lunatic"}}, - {name="pcchallenge_lunatic",x=1200, y=-100, size=35,shape=1,icon="pcchallenge", unlock={}}, + {name="pcchallenge_lunatic",x=1200, y=-100, size=35,shape=1,icon="pcchallenge", }, {name="tech_normal", x=400, y=-150, size=35,shape=1,icon="tech", unlock={"tech_normal+","tech_hard","tech_finesse"}}, {name="tech_finesse", x=800, y=50, size=35,shape=1,icon="tech", unlock={"tech_finesse+"}}, - {name="tech_finesse+", x=1000, y=50, size=35,shape=1,icon="tech", unlock={}}, + {name="tech_finesse+", x=1000, y=50, size=35,shape=1,icon="tech", }, {name="tech_normal+", x=650, y=150, size=35,shape=1,icon="tech", unlock={"tsd_easy"}}, {name="tsd_easy", x=800, y=250, size=35,shape=1,icon="tsd", unlock={"tsd_hard"}}, {name="tsd_hard", x=1000, y=250, size=35,shape=1,icon="tsd", unlock={"tsd_ultimate"}}, - {name="tsd_ultimate", x=1200, y=250, size=35,shape=1,icon="tsd", unlock={}}, + {name="tsd_ultimate", x=1200, y=250, size=35,shape=1,icon="tsd", }, {name="tech_hard", x=400, y=50, size=35,shape=1,icon="tech", unlock={"tech_hard+","tech_lunatic"}}, - {name="tech_hard+", x=250, y=50, size=35,shape=1,icon="tech", unlock={}}, + {name="tech_hard+", x=250, y=50, size=35,shape=1,icon="tech", }, {name="tech_lunatic", x=400, y=200, size=35,shape=1,icon="tech", unlock={"tech_lunatic+"}}, - {name="tech_lunatic+", x=250, y=200, size=35,shape=1,icon="tech", unlock={}}, + {name="tech_lunatic+", x=250, y=200, size=35,shape=1,icon="tech", }, {name="zen", x=-800, y=-600, size=35,shape=1,icon="zen", unlock={"ultra","infinite","infinite_dig"}}, - {name="ultra", x=-1000, y=-400, size=35,shape=1,icon="ultra", unlock={}}, - {name="infinite", x=-800, y=-400, size=35,shape=1,icon="infinite", unlock={}}, - {name="infinite_dig", x=-1000, y=-600, size=35,shape=1,icon="infinite_dig",unlock={}}, - {name="custom_clear", x=200, y=-350, size=45,shape=3,icon="custom", unlock={}}, - {name="custom_puzzle", x=200, y=-200, size=45,shape=3,icon="puzzle", unlock={}}, - {name="sprintPenta", x=-200, y=-130, size=40,shape=2,icon="sprint", unlock={}}, - {name="sprintMPH", x=-200, y=-270, size=40,shape=2,icon="sprint", unlock={}}, + {name="ultra", x=-1000, y=-400, size=35,shape=1,icon="ultra", }, + {name="infinite", x=-800, y=-400, size=35,shape=1,icon="infinite", }, + {name="infinite_dig", x=-1000, y=-600, size=35,shape=1,icon="infinite_dig",}, + {name="sprintPenta", x=200, y=-150, size=40,shape=2,icon="sprint", }, + {name="sprintMPH", x=200, y=-300, size=40,shape=2,icon="sprint", }, + + {name="custom_clear", x=0, y=2600, size=45,shape=3,icon="custom", }, + {name="custom_puzzle", x=0, y=2600, size=45,shape=3,icon="puzzle", }, } \ No newline at end of file diff --git a/parts/player.lua b/parts/player.lua index e96ec5eb..b97864d4 100644 --- a/parts/player.lua +++ b/parts/player.lua @@ -55,7 +55,7 @@ local gameEnv0={ bg="none",bgm="race" } -local scs=require("parts/spinCenters") +local scs=spinCenters local kickList=require("parts/kickList") local CCblockID={6,5,4,3,2,1,0} local freshPrepare={ @@ -272,9 +272,11 @@ local function Pupdate_alive(P,dt) if P.keyRec then local _=game.frame local v=0 - for i=2,10 do v=v+i*(i-1)*7.2/(_-P.keyTime[i])end P.keySpeed=P.keySpeed*.99+v*.1 + for i=2,10 do v=v+i*(i-1)*7.2/(_-P.keyTime[i])end + P.keySpeed=P.keySpeed*.99+v*.1 v=0 - for i=2,10 do v=v+i*(i-1)*7.2/(_-P.dropTime[i])end P.dropSpeed=P.dropSpeed*.99+v*.1 + for i=2,10 do v=v+i*(i-1)*7.2/(_-P.dropTime[i])end + P.dropSpeed=P.dropSpeed*.99+v*.1 --Update speeds if modeEnv.royaleMode then if P.keyPressing[9]then @@ -517,7 +519,7 @@ local function drawField(P) local start=int((P.fieldBeneath+P.fieldUp)/30+1) local rep=game.replaying if P.falling==-1 then--Blocks only - for j=start,min(start+20,#F)do + for j=start,min(start+21,#F)do for i=1,10 do if F[j][i]>0 then if V[j][i]>0 then @@ -535,7 +537,7 @@ local function drawField(P) local dy,stepY=0,ENV.smooth and(P.falling/(ENV.fall+1))^2.5*30 or 30 local A=P.falling/ENV.fall local h=1 - for j=start,min(start+20,#F)do + for j=start,min(start+21,#F)do while j==P.clearingRow[h]do h=h+1 dy=dy+stepY @@ -1208,7 +1210,7 @@ end local function applyGameEnv(P)--Finish gameEnv processing local ENV=P.gameEnv - if ENV.drop==0 then P._20G=true end + P._20G=ENV.drop==0 P.dropDelay=ENV.drop P.lockDelay=ENV.lock @@ -2108,7 +2110,7 @@ do--player.drop(P)--Place piece local cc,gbcc=0,0--Row/garbage-row cleared,full-part local atk,exblock=0,0--Attack & extra defense local send,off=0,0--Sending lines remain & offset - local cscore,sendTime=0,0--Score & send Time + local cscore,sendTime=10,0--Score & send Time local dospin=0 local mini @@ -2338,39 +2340,38 @@ do--player.drop(P)--Place piece end --PC/HPC bonus - if clear then - if #P.field==0 then - P:showText(text.PC,0,-80,50,"flicker") - atk=atk*.5+min(8+STAT.pc*2,20) - exblock=exblock+2 - sendTime=sendTime+120 - if STAT.row+cc>4 then - P.b2b=1200 - cscore=cscore+300*min(6+STAT.pc,10) - else - cscore=cscore+626 - end - STAT.pc=STAT.pc+1 - if P.human then - SFX.play("clear") - VOC.play("clear",CHN) - end - C.special=true - elseif cc>1 or #P.field==P.garbageBeneath then - P:showText(text.HPC,0,-80,50,"fly") - atk=atk+2 - exblock=exblock+2 - sendTime=sendTime+60 + C.pc,C.hpc=false,false + if clear and #P.field==0 then + P:showText(text.PC,0,-80,50,"flicker") + atk=atk*.5+min(8+STAT.pc*2,20) + exblock=exblock+2 + sendTime=sendTime+120 + if STAT.row+cc>4 then + P.b2b=1200 + cscore=cscore+300*min(6+STAT.pc,10) + else cscore=cscore+626 - STAT.hpc=STAT.hpc+1 - if P.human then - SFX.play("clear") - end - C.special=true + end + STAT.pc=STAT.pc+1 + if P.human then + SFX.play("clear") + VOC.play("perfect_clear",CHN) end C.pc=true - else - C.pc=false + C.special=true + elseif clear and(cc>1 or #P.field==P.garbageBeneath)then + P:showText(text.HPC,0,-80,50,"fly") + atk=atk+2 + exblock=exblock+2 + sendTime=sendTime+60 + cscore=cscore+626 + STAT.hpc=STAT.hpc+1 + if P.human then + SFX.play("clear") + VOC.play("half_clear",CHN) + end + C.hpc=true + C.special=true end --Normal clear, reduce B2B point @@ -2451,11 +2452,11 @@ do--player.drop(P)--Place piece local t=ENV.mission[P.curMission] local success if t<5 then - if C.row==t then + if C.row==t and not C.special then success=true end elseif t<9 then - if C.row==t%10 and C.spin then + if C.row==t-4 and C.spin then success=true end elseif t==9 then @@ -2490,7 +2491,6 @@ do--player.drop(P)--Place piece end else--No lines clear cmb=0 - local dropScore=10 --Spin bonus if dospin then @@ -2500,33 +2500,30 @@ do--player.drop(P)--Place piece SFX.play("spin_0") VOC.play(spinName[CB.name],CHN) end - dropScore=25 + cscore=30 end - --DropSpeed bonus - if P._20G then - dropScore=dropScore*2 - elseif ENV.drop<3 then - dropScore=dropScore*1.5 - end - - --Speed bonus - if P.dropSpeed>60 then - dropScore=dropScore*P.dropSpeed/60 - elseif P.dropSpeed>120 then - dropScore=dropScore*1.2*P.dropSpeed/120 - elseif P.dropSpeed>180 then - dropScore=dropScore*1.5*P.dropSpeed/180 - end - - cscore=cscore+dropScore if P.b2b>1000 then P.b2b=max(P.b2b-40,1000) end P:garbageRelease() end + P.combo=cmb + local mul=1 + --DropSpeed bonus + if P._20G then + cscore=cscore*2 + elseif ENV.drop<3 then + cscore=cscore*1.5 + end + + --Speed bonus + if P.dropSpeed>60 then + cscore=cscore*(.9+P.dropSpeed/600) + end + cscore=int(cscore) if ENV.score then P:showText(cscore,(P.curX+P.sc[2]-5.5)*30,(10-P.curY-P.sc[1])*30+P.fieldBeneath+P.fieldUp,int(40-600/(cscore+20)),"score",2) @@ -2578,18 +2575,21 @@ local function gameOver()--Save record local P=players[1] R=R(P)--New rank if R then + if R>0 then LOG.print(text.getRank..text.ranks[R],color.green)end local r=modeRanks[M.name]--Old rank local _ if R>r then modeRanks[M.name]=R _=true end - for i=1,#M.unlock do - local m=M.unlock[i] - local n=Modes[m].name - if not modeRanks[n]then - modeRanks[n]=Modes[m].score and 0 or 6 - _=true + if M.unlock then + for i=1,#M.unlock do + local m=M.unlock[i] + local n=Modes[m].name + if not modeRanks[n]then + modeRanks[n]=Modes[m].score and 0 or 6 + _=true + end end end if _ then @@ -2624,7 +2624,7 @@ function player.die(P)--Called when win/lose,not really die! P.update=Pupdate_dead P.waiting=1e99 P.b2b=0 - TASK.clear(P) + for i=1,#P.tasks do rem(P.tasks)end for i=1,#P.atkBuffer do P.atkBuffer[i].sent=true P.atkBuffer[i].time=0 @@ -2735,18 +2735,13 @@ function player.lose(P) if P.id==1 or A.id==1 then TASK.new(TICK.throwBadge,{A.ai,P,max(3,P.badge)*4}) end - freshMostBadge() end else P.badge=-1 end + freshMostBadge() freshMostDangerous() - for i=1,#players.alive do - if players.alive[i].atking==P then - players.alive[i]:freshTarget() - end - end if #players.alive==royaleData.stage[game.stage]then royaleLevelup() end @@ -2920,7 +2915,6 @@ function player.act.func(P) end function player.act.restart(P) if game.frame<240 or game.result then - TASK.removeTask_code(TICK.autoPause) resetPartGameData() else LOG.print(text.holdR,20,color.orange) @@ -3057,21 +3051,13 @@ end function PLY.newDemoPlayer(id,x,y,size) local P=newEmptyPlayer(id,x,y,size) - -- rewrite draw arguments + -- rewrite some args P.small=false - P.keyRec=false P.centerX,P.centerY=P.x+300*P.size,P.y+600*P.size P.absFieldX=P.x+150*P.size P.absFieldY=P.y+60*P.size P.draw=Pdraw_demo - P.update=Pupdate_alive - P.control=true - - P.atker={}P.strength=0 - - P.field,P.visTime={},{} - P.atkBuffer={sum=0} P.gameEnv={ drop=1e99,lock=1e99, wait=10,fall=20, @@ -3113,14 +3099,7 @@ function PLY.newDemoPlayer(id,x,y,size) skin=setting.skin, } applyGameEnv(P) - - P.dropDelay,P.lockDelay=1e99,1e99 - P.showTime=1e99 - P.keepVisible=true - - --Always use "bag" - freshPrepare.bag(P) - P.newNext=freshMethod.bag + prepareSequence(P) P.human=false loadAI(P,{ @@ -3130,7 +3109,7 @@ function PLY.newDemoPlayer(id,x,y,size) delay=3, delta=3, bag="bag", - node=80000, + node=100000, }) P:popNext() diff --git a/parts/scenes.lua b/parts/scenes.lua index 355ec42d..5f350805 100644 --- a/parts/scenes.lua +++ b/parts/scenes.lua @@ -108,6 +108,7 @@ do--calculator elseif v==114 then EGG("T114.Flyz") elseif v==127 then EGG("T127.gggf") elseif v==196 then EGG("T196.蕴空之灵") + elseif v==210 then EGG("T210.Naki") elseif v==238 then EGG("T238.模电") elseif v==274 then EGG("T274.ZZZ") elseif v==512 then EGG("T512.tatianyi") @@ -118,6 +119,7 @@ do--calculator elseif v==872 then EGG("T872.DIAO") elseif v==942 then EGG("T942.思竣") elseif v==1905 then EGG("T1905.Rinnya") + elseif v==3182 then EGG("T3182.蓝绿") elseif v==7023 then EGG("T7023.Miya") elseif v==190000+6022 then S.pass,marking=true @@ -239,10 +241,10 @@ do--p15 local S=sceneTemp if S.state<2 then if not key then + x,y=int((x-320)/160)+1,int((y-40)/160)+1 if S.pathVis then sysFX.newRipple(.16,x,y,10) end - x,y=int((x-320)/160)+1,int((y-40)/160)+1 end local b=S.board local moves=0 @@ -272,7 +274,6 @@ do--p15 end end if moves>0 then - SFX.play("move") S.move=S.move+moves if S.state==0 then S.state=1 @@ -294,6 +295,7 @@ do--p15 end SFX.play("win") end + SFX.play("move") end end end @@ -536,11 +538,11 @@ do--schulte_G sysFX.newShade(.3,.6,.8,1,320+640/R*X,40+640/R*Y,640/R,640/R) end else - SFX.play("finesseError") S.error=S.error+1 if S.tapFX then sysFX.newShade(.5,1,.4,.5,320+640/R*X,40+640/R*Y,640/R,640/R) end + SFX.play("finesseError") end end end @@ -671,8 +673,7 @@ do--load if k=="a"then sceneTemp.skip=true elseif k=="s"then - marking=nil - sceneTemp.skip=true + sceneTemp.skip,marking=true elseif k=="escape"then SCN.back() end @@ -769,6 +770,7 @@ end do--intro function sceneInit.intro() BG.set("space") + BGM.play("blank") sceneTemp={ t1=0,--Timer 1 t2=0,--Timer 2 @@ -777,7 +779,20 @@ do--intro for i=1,8 do sceneTemp.r[i]=rnd(5) end - BGM.play("blank") + local notice=HTTPrequest("http://47.103.200.40/api/notice.php") + if notice then + LOG.print(notice,"message") + else + LOG.print(text.getNoticeFail,"warn") + end + local newVersion=HTTPrequest("http://47.103.200.40/api/getNewVersion.php") + if not newVersion then + LOG.print(text.getVersionFail,"warn") + elseif newVersion~=gameVersion then + LOG.print(string.gsub(text.versionIsOld,"$1",newVersion),"warn") + else + LOG.print(text.versionIsNew,"message") + end end function mouseDown.intro(x,y,k) @@ -882,10 +897,12 @@ do--main modeEnv={} --Create demo player destroyPlayers() + game.frame=0 PLY.newDemoPlayer(1,900,35,1.1) end function Tmr.main(dt) + game.frame=game.frame+1 players[1]:update(dt) end @@ -903,6 +920,21 @@ do--main end end do--mode + mapCam={ + sel=nil,--Selected mode ID + + --Basic paragrams + x=0,y=0,k=1,--Camera pos/k + x1=0,y1=0,k1=1,--Camera pos/k shown + + --If controlling with key + keyCtrl=false, + + --For auto zooming when enter/leave scene + zoomMethod=nil, + zoomK=nil, + } + local mapCam=mapCam local touchDist=nil function sceneInit.mode(org) BG.set("space") @@ -965,12 +997,12 @@ do--mode local SEL=onMode(x,y) if _~=SEL then if SEL then - SFX.play("click") cam.moving=true _=Modes[SEL] cam.x=_.x*cam.k+180 cam.y=_.y*cam.k cam.sel=SEL + SFX.play("click") else cam.sel=nil cam.x=cam.x-180 @@ -1008,17 +1040,6 @@ do--mode function keyDown.mode(key) if key=="return"then if mapCam.sel then - if mapCam.sel=="custom_clear"or mapCam.sel=="custom_puzzle"then - if customEnv.opponent>1 then - if customEnv.seq=="fixed"then - LOG.print(text.ai_fixed,"warn") - return - elseif #preBag>0 then - LOG.print(text.ai_prebag,"warn") - return - end - end - end mapCam.keyCtrl=false SCN.push() loadGame(mapCam.sel) @@ -1029,10 +1050,6 @@ do--mode else SCN.back() end - elseif mapCam.sel=="custom_clear" or mapCam.sel=="custom_puzzle" then - if key=="e"then - SCN.go("custom_basic") - end end end @@ -1136,7 +1153,7 @@ do--mode gc.setLineWidth(8) gc.setColor(1,1,1,.2) for name,M in next,Modes do - if R[name]then + if R[name]and M.unlock then for _=1,#M.unlock do local m=Modes[M.unlock[_]] gc.line(M.x,M.y,m.x,m.y) @@ -1254,7 +1271,20 @@ do--custom_basic end function keyDown.custom_basic(key) - if key=="tab"then + if key=="return"or key=="return2"then + if customEnv.opponent>0 then + if customEnv.opponent>5 and customEnv.seq=="fixed"then + LOG.print(text.ai_fixed,"warn") + return + elseif customEnv.opponent>0 and #preBag>0 then + LOG.print(text.ai_prebag,"warn") + return + end + end + SCN.push() + + loadGame(key=="return"and"custom_clear"or"custom_puzzle",true) + elseif key=="tab"then if kb.isDown("lshift","rshift")then SCN.swapTo("custom_mission","swipeR") else @@ -1385,20 +1415,6 @@ do--custom_seq until preBag[p+1]~=preBag[S.cur+1] S.cur=p end - elseif key=="c"and kb.isDown("lctrl","rctrl")or key=="cC"then - if #preBag>0 then - sys.setClipboardText("Techmino SEQ:"..copySequence()) - LOG.print(text.copySuccess,color.green) - end - elseif key=="v"and kb.isDown("lctrl","rctrl")or key=="cV"then - local str=sys.getClipboardText() - local p=string.find(str,":")--ptr* - if p then str=sub(str,p+1)end - if pasteSequence(str)then - LOG.print(text.pasteSuccess,color.green) - else - LOG.print(text.dataCorrupted,color.red) - end elseif key=="backspace"then if S.cur>0 then rem(preBag,S.cur) @@ -1415,6 +1431,20 @@ do--custom_seq else S.sure=50 end + elseif key=="c"and kb.isDown("lctrl","rctrl")or key=="cC"then + if #preBag>0 then + sys.setClipboardText("Techmino SEQ:"..copySequence()) + LOG.print(text.copySuccess,color.green) + end + elseif key=="v"and kb.isDown("lctrl","rctrl")or key=="cV"then + local str=sys.getClipboardText() + local p=string.find(str,":")--ptr* + if p then str=sub(str,p+1)end + if pasteSequence(str)then + LOG.print(text.pasteSuccess,color.green) + else + LOG.print(text.dataCorrupted,color.red) + end elseif key=="tab"then if kb.isDown("lshift","rshift")then SCN.swapTo("custom_rule","swipeR") @@ -1449,7 +1479,7 @@ do--custom_seq --Draw frame gc.setLineWidth(4) gc.rectangle("line",100,110,1080,260) - + --Draw sequence local miniBlock=TEXTURE.miniBlock local libColor=SKIN.libColor @@ -1737,20 +1767,6 @@ do--custom_mission until preMission[p+1]~=preMission[S.cur+1] S.cur=p end - elseif key=="c"and kb.isDown("lctrl","rctrl")or key=="cC"then - if #preMission>0 then - sys.setClipboardText("Techmino Target:"..copyMission()) - LOG.print(text.copySuccess,color.green) - end - elseif key=="v"and kb.isDown("lctrl","rctrl")or key=="cV"then - local str=sys.getClipboardText() - local p=string.find(str,":")--ptr* - if p then str=sub(str,p+1)end - if pasteMission(str)then - LOG.print(text.pasteSuccess,color.green) - else - LOG.print(text.dataCorrupted,color.red) - end elseif key=="backspace"then if S.cur>0 then rem(preMission,S.cur) @@ -1767,6 +1783,20 @@ do--custom_mission else S.sure=50 end + elseif key=="c"and kb.isDown("lctrl","rctrl")or key=="cC"then + if #preMission>0 then + sys.setClipboardText("Techmino Target:"..copyMission()) + LOG.print(text.copySuccess,color.green) + end + elseif key=="v"and kb.isDown("lctrl","rctrl")or key=="cV"then + local str=sys.getClipboardText() + local p=string.find(str,":")--ptr* + if p then str=sub(str,p+1)end + if pasteMission(str)then + LOG.print(text.pasteSuccess,color.green) + else + LOG.print(text.dataCorrupted,color.red) + end elseif key=="tab"then if kb.isDown("lshift","rshift")then SCN.swapTo("custom_draw","swipeR") @@ -1879,10 +1909,11 @@ do--custom_mission end end do--play + local VK=virtualkey local function onVirtualkey(x,y) local dist,nearest=1e10 - for K=1,#virtualkey do - local b=virtualkey[K] + for K=1,#VK do + local b=VK[K] if b.ava then local d1=(x-b.x)^2+(y-b.y)^2 if d10 then SFX.play("virtualKey",setting.VKSFX) end - virtualkey[t].isDown=true - virtualkey[t].pressTime=10 + VK[t].isDown=true + VK[t].pressTime=10 if setting.VKTrack then - local B=virtualkey[t] + local B=VK[t] if setting.VKDodge then--Button collision (not accurate) - for i=1,#virtualkey do - local b=virtualkey[i] + for i=1,#VK do + local b=VK[i] local d=B.r+b.r-((B.x-b.x)^2+(B.y-b.y)^2)^.5--Hit depth(Neg means distance) if d>0 then b.x=b.x+(b.x-B.x)*d*b.r*5e-4 @@ -1950,8 +1981,8 @@ do--play if not setting.VKSwitch or game.replaying then return end local l=tc.getTouches() - for n=1,#virtualkey do - local B=virtualkey[n] + for n=1,#VK do + local B=VK[n] for i=1,#l do local x,y=xOy:inverseTransformPoint(tc.getPosition(l[i])) if(x-B.x)^2+(y-B.y)^2<=B.r^2 then @@ -1963,20 +1994,19 @@ do--play end end function keyDown.play(key) - if key=="escape"then - pauseGame() - return - end if game.replaying then return end + local m=keyMap for k=1,20 do if key==m[1][k]or key==m[2][k]then players[1]:pressKey(k) - virtualkey[k].isDown=true - virtualkey[k].pressTime=10 + VK[k].isDown=true + VK[k].pressTime=10 return end end + + if key=="escape"then pauseGame()end end function keyUp.play(key) if game.replaying then return end @@ -1984,24 +2014,25 @@ do--play for k=1,20 do if key==m[1][k]or key==m[2][k]then players[1]:releaseKey(k) - virtualkey[k].isDown=false + VK[k].isDown=false return end end end function gamepadDown.play(key) - if key=="back"then SCN.back()return end if game.replaying then return end local m=keyMap for k=1,20 do if key==m[3][k]or key==m[4][k]then players[1]:pressKey(k) - virtualkey[k].isDown=true - virtualkey[k].pressTime=10 + VK[k].isDown=true + VK[k].pressTime=10 return end end + + if key=="back"then pauseGame()end end function gamepadUp.play(key) if game.replaying then return end @@ -2010,7 +2041,7 @@ do--play for k=1,20 do if key==m[3][k]or key==m[4][k]then players[1]:releaseKey(k) - virtualkey[k].isDown=false + VK[k].isDown=false return end end @@ -2025,8 +2056,8 @@ do--play --Update virtualkey animation if setting.VKSwitch then - for i=1,#virtualkey do - _=virtualkey[i] + for i=1,#VK do + _=VK[i] if _.pressTime>0 then _.pressTime=_.pressTime-1 end @@ -2041,10 +2072,10 @@ do--play local k=L[_+1] if k>0 then P1:pressKey(k) - virtualkey[k].isDown=true - virtualkey[k].pressTime=10 + VK[k].isDown=true + VK[k].pressTime=10 else - virtualkey[-k].isDown=false + VK[-k].isDown=false P1:releaseKey(-k) end _=_+2 @@ -2074,7 +2105,6 @@ do--play elseif P1.keyPressing[10]then restartCount=restartCount+1 if restartCount>20 then - TASK.clear("play") resetPartGameData() return end @@ -2089,8 +2119,8 @@ do--play end --Fresh royale target - if game.frame%120==0 then - if modeEnv.royaleMode then freshMostDangerous()end + if modeEnv.royaleMode and game.frame%120==0 then + freshMostDangerous() end --Warning check @@ -2131,18 +2161,17 @@ do--play gc.circle("line",x,y,30*(1+a),6) end local function drawVirtualkey() - local V=virtualkey local a=setting.VKAlpha local _ if setting.VKIcon then local icons=TEXTURE.VKIcon - for i=1,#V do - if V[i].ava then - local B=V[i] + for i=1,#VK do + if VK[i].ava then + local B=VK[i] gc.setColor(1,1,1,a) gc.setLineWidth(B.r*.07) gc.circle("line",B.x,B.y,B.r,10)--Button outline - _=V[i].pressTime + _=VK[i].pressTime gc.draw(icons[i],B.x,B.y,nil,B.r*.026+_*.08,nil,18,18)--Icon if _>0 then gc.setColor(1,1,1,a*_*.08) @@ -2152,13 +2181,13 @@ do--play end end else - for i=1,#V do - if V[i].ava then - local B=V[i] + for i=1,#VK do + if VK[i].ava then + local B=VK[i] gc.setColor(1,1,1,a) gc.setLineWidth(B.r*.07) gc.circle("line",B.x,B.y,B.r,10) - _=V[i].pressTime + _=VK[i].pressTime if _>0 then gc.setColor(1,1,1,a*_*.08) gc.circle("fill",B.x,B.y,B.r*.94,10) @@ -2307,7 +2336,6 @@ do--pause mergeStat(stat,players[1].stat) end FILE.saveData() - TASK.clear("play") end function keyDown.pause(key) @@ -2318,11 +2346,9 @@ do--pause elseif key=="s"then SCN.go("setting_sound") elseif key=="r"then - TASK.clear("play") resetGameData() SCN.swapTo("play","none") elseif key=="p"and(game.result or game.replaying)and #players==1 then - TASK.removeTask_code(TICK.autoPause) resetPartGameData(true) SCN.swapTo("play","none") end @@ -2474,7 +2500,7 @@ do--setting_sound S.jump=10 local t=Timer()-S.last if t>1 then - VOC.play((t<1.5 or t>15)and"nya_doubt"or rnd()<.8 and"nya_happy"or"egg") + VOC.play((t<1.5 or t>15)and"doubt"or rnd()<.8 and"happy"or"egg") S.last=Timer() end end @@ -2608,13 +2634,15 @@ do--setting_key SCN.back() end elseif S.kS then - for y=1,20 do - if keyMap[1][y]==key then keyMap[1][y]=""break end - if keyMap[2][y]==key then keyMap[2][y]=""break end + if key~="\\"then + for y=1,20 do + if keyMap[1][y]==key then keyMap[1][y]=""break end + if keyMap[2][y]==key then keyMap[2][y]=""break end + end + keyMap[S.board][S.kb]=key + S.kS=false + SFX.play("reach",.5) end - keyMap[S.board][S.kb]=key - SFX.play("reach",.5) - S.kS=false elseif key=="return"or key=="space"then S.kS=true SFX.play("lock",.5) @@ -2720,7 +2748,7 @@ do--setting_key end end do--setting_skin - local scs=require("parts/spinCenters") + local scs=spinCenters function Pnt.setting_skin() gc.setColor(1,1,1)gc.draw(drawableText.setting_skin,80,50) for N=1,7 do @@ -2951,6 +2979,151 @@ do--help mStr(text.support,1138-sin(Timer()*4)*20,270) end end +do--dict + function sceneInit.dict() + sceneTemp={ + input="", + dict=require("document/dict"), + result={}, + select=nil, + title=nil, + lastSearch=nil, + hideKB=1 or system~="Windows", + } + BG.set("rainbow") + end + + local function search() + local S=sceneTemp + local dict=S.dict + local result=S.result + for i=1,#result do rem(result)end + local first + for i=1,#dict do + local pos=find(dict[i][1],S.input) + if pos==1 and not first then + ins(result,1,dict[i]) + first=true + elseif pos then + ins(result,dict[i]) + end + if first and #result==15 then + break + end + end + if result[1]then + S.select=1 + S.title=result[1][3] + else + S.select=nil + S.title=nil + end + end + + function keyDown.dict(key) + local S=sceneTemp + if #key==1 then + if #S.input<15 then + S.input=S.input..key + end + elseif key=="up"then + if S.select and S.select>1 then + S.select=S.select-1 + end + elseif key=="down"then + if S.select and S.select<#S.result and S.select<15 then + S.select=S.select+1 + end + elseif key=="kb"then + S.hideKB=not S.hideKB + elseif key=="delete"then + if #S.input>0 then + S.input="" + S.select=nil + S.lastSearch=nil + SFX.play("hold") + end + elseif key=="backspace"then + S.input=sub(S.input,1,-2) + if #S.input==0 then + S.select=nil + S.lastSearch=nil + end + elseif key=="escape"then + if #S.input>0 then + S.input="" + S.select=nil + S.lastSearch=nil + else + SCN.back() + end + elseif key=="return"then + if #S.input<2 then + S.input="" + elseif S.input~=S.lastSearch then + search() + if S.result[1]then + SFX.play("reach") + else + SFX.play("finesseError") + end + S.lastSearch=S.input + end + end + end + + local typeColor={ + help=color.lGrey, + other=color.lOrange, + game=color.lCyan, + term=color.lRed, + name=color.lPurple, + } + function Pnt.dict() + local S=sceneTemp + gc.setColor(1,1,1) + gc.draw(drawableText.dict,20,5) + + setFont(40) + gc.print(S.input,35,110) + + gc.setLineWidth(4) + gc.rectangle("line",20,109,726,60) + + if S.select then + gc.rectangle("line",300,180,958,526) + gc.rectangle("line",20,180,280,526) + + gc.setColor(1,1,1) + local text=S.result[S.select][4] + if #text>500 then + setFont(20) + elseif #text>300 then + setFont(24) + else + setFont(28) + end + gc.printf(text,306,180,950) + + setFont(30) + gc.setColor(1,1,1,.4+.2*sin(Timer()*4)) + gc.rectangle("fill",20,143+35*S.select,280,35) + + setFont(30) + for i=1,min(#S.result,15)do + local S=S.result[i] + local y=142+35*i + gc.setColor(0,0,0) + gc.print(S[3],29,y-1) + gc.print(S[3],29,y+1) + gc.print(S[3],31,y-1) + gc.print(S[3],31,y+1) + gc.setColor(typeColor[S[2]]) + gc.print(S[3],30,y) + end + end + end +end do--staff function sceneInit.staff() sceneTemp={ @@ -3109,6 +3282,9 @@ do--debug reset=false, } end + function keyDown.debug(key) + LOG.print("keyPress: ["..key.."]") + end end do--quit function sceneInit.quit() diff --git a/parts/spinCenters.lua b/parts/spinCenters.lua deleted file mode 100644 index afb9ac7f..00000000 --- a/parts/spinCenters.lua +++ /dev/null @@ -1,40 +0,0 @@ -local N1,N2={0,1},{1,0} -local N3,N4={1,1},{.5,.5} -local I1,I2={-.5,1.5},{1.5,-.5} -local I3,I4={.5,1.5},{1.5,.5} -local V4={1.5,1.5} -local L1,L2={0,2},{2,0} -local scs={ - --Tetramino - {[0]=N1,N2,N3,N3},--Z - {[0]=N1,N2,N3,N3},--S - {[0]=N1,N2,N3,N3},--L - {[0]=N1,N2,N3,N3},--J - {[0]=N1,N2,N3,N3},--T - {[0]=N4,N4,N4,N4},--O - {[0]=I1,I2,I3,I4},--I - - --Pentomino - {[0]=N3,N3,N3,N3},--Z - {[0]=N3,N3,N3,N3},--S - {[0]=N1,N2,N3,N3},--P - {[0]=N1,N2,N3,N3},--Q - {[0]=N3,N3,N3,N3},--F - {[0]=N3,N3,N3,N3},--E - {[0]=N3,N3,N3,N3},--T - {[0]=N1,N2,N3,N3},--U - {[0]=I3,N4,I4,V4},--V - {[0]=N3,N3,N3,N3},--W - {[0]=N3,N3,N3,N3},--X - {[0]=I3,I4,I3,I4},--J - {[0]=I3,I4,I3,I4},--L - {[0]=I3,I4,I3,I4},--R - {[0]=I3,I4,I3,I4},--Y - {[0]=I3,I4,I3,I4},--N - {[0]=I3,I4,I3,I4},--H - {[0]=L1,L2,L1,L2},--I -} -N1,N2,N3,N4=nil -I1,I2,I3,I4=nil -L1,L2=nil -return scs \ No newline at end of file diff --git a/parts/updateLog.lua b/parts/updateLog.lua index 2daf1cff..3b9f8a92 100644 --- a/parts/updateLog.lua +++ b/parts/updateLog.lua @@ -1,10 +1,10 @@ local S=[=[ "Patron"(time ordered, may not accurate): <<>> - 那没事了(T6300) 加油啊,钉钉动了的大哥哥(T3228) - 弥佑瑶 Alan 幽灵3383 - 靏鸖龘龘 込余 saki - 模电 吃水榴莲 + 那没事了(T6300) 加油啊,钉钉动了的大哥哥(T3228) + 弥佑瑶 Alan 幽灵3383 + 靏鸖龘龘 込余 saki + 模电 吃水榴莲 世界沃德 八零哥 蕴空之灵 gggf127 dtg ThTsOd Fireboos 金巧 10元 立斐 Deep_Sea @@ -15,11 +15,11 @@ local S=[=[ kagura77 呆喂 GlowingEmbers 轩辕辚 HimuroAki TCV100 tech有养成系统了@7065 HAGE KANOBU 闪电和拐棍 葡萄味的曼妥思 - 世界沃德 蓝绿 天生的魔法师 琳雨空 T8779.易缄 + 蓝绿 天生的魔法师 琳雨空 T8779.易缄 诗情画意 星姐阿夸双推Man暗炎 [*炎] [*Y] aaa222 [**城] cnDD 红桃老给 昭庭玲秋 旋树墩 火花工作室 Cosine 沁音的芝麻王 - SuperJH 天上_飞 uiro 宇酱 + SuperJH 天上_飞 uiro 宇酱 [W*N] Thanks!!! @@ -55,11 +55,19 @@ Future outlook: find difference sodoku link-link + pong + 自定义游戏允许按各种目的复制数据 + 地图增加模式图标 + 物理hold + 多hold + 多方块 + 自定义游戏支持选择旋转系统(C2,DTET,ASC...) + 录像保存/导出 + 热更新 + 新BGM:water 画图智能画笔 健康游戏时间提醒 多语音包系统 - 自定义游戏支持选择旋转系统(C2,DTET,ASC...) - 录像保存/导出 按块回放录像 split判定及效果 工程编译到字节码 @@ -73,6 +81,36 @@ Future outlook: task-Z(新AI) 更多画面效果 & 一些3D小玩意 +0.11.1: 小Z更新 Dictionary Update + 新内容: + 新增:小Z词典 + 自定义模式入口移至主菜单 + 游戏结束时显示评级 + 修改下落/操作速度的加分机制 + 联网公告+版本更新检测 + 新控件:虚拟键盘 + 改动: + 修改分数文字上浮速度曲线 + 主界面demoPlay落块计算速度加分 + PC任务判定修改 + 移除LOG.print消息平滑上拉动画 + 移除debug界面复制日志按钮 + 报错界面可以执行任意代码救急 + 代码: + 控件系统增强 + 旋转中心表从require改为全局 + 修改LOG.print的message模式输出颜色 + TASK模块代码整理,删除老旧代码 + 修复: + 盲打还会显示落块分数 + 游戏结束时不到D评级报错 + TSD模式判定错误 + any1~4任务不能完成 + 粘贴场地有残留 + 修复混战模式目标切换的问题 + 修复场地最上显示不全 + 按键设置使用反斜杠后保存失败 + 0.11.0: 谜题更新 Puzzle Update 新内容: 自定义游戏支持复制所有【题目】信息