Compare commits
79 Commits
pre0.16.5-
...
pre0.17.0-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5f7a3fd53f | ||
|
|
8e3e598753 | ||
|
|
2a0a0f60f8 | ||
|
|
6b7d1fdf9f | ||
|
|
65199a40f7 | ||
|
|
f9082a8800 | ||
|
|
1670c6e7d6 | ||
|
|
ff2073ed4d | ||
|
|
f14aaac635 | ||
|
|
c709fa622f | ||
|
|
c752556bf3 | ||
|
|
e7d9703fcc | ||
|
|
1ed52a84b0 | ||
|
|
4fdb278751 | ||
|
|
8318803923 | ||
|
|
42de7e3676 | ||
|
|
3efa646ee3 | ||
|
|
b414c2ab42 | ||
|
|
205dea3db7 | ||
|
|
6cac688555 | ||
|
|
09b1b08c1e | ||
|
|
b61a1270e9 | ||
|
|
b85cee7e1f | ||
|
|
8e674e3e29 | ||
|
|
aa2812c874 | ||
|
|
6f282431c4 | ||
|
|
470e54cdd0 | ||
|
|
da3ef1c2a6 | ||
|
|
9efe0e62d5 | ||
|
|
7038f81b46 | ||
|
|
de972a60df | ||
|
|
6a87787d6f | ||
|
|
6dc9a4b507 | ||
|
|
5b7c888d57 | ||
|
|
a1f761b83e | ||
|
|
c40a6bfaa0 | ||
|
|
441c6f7667 | ||
|
|
a07d57cf71 | ||
|
|
a467f972f9 | ||
|
|
3f455ee360 | ||
|
|
7a0b913768 | ||
|
|
a7b240ade8 | ||
|
|
bb64404821 | ||
|
|
caf92eb3c8 | ||
|
|
6a117a0fab | ||
|
|
26682509f7 | ||
|
|
d85d92fb43 | ||
|
|
c412003cb3 | ||
|
|
e39b5dbd51 | ||
|
|
db162ea66f | ||
|
|
f9f9fde368 | ||
|
|
4b221c2eb5 | ||
|
|
ed45bebfa0 | ||
|
|
fa0bc3805f | ||
|
|
7710f0b70f | ||
|
|
0277ddadb5 | ||
|
|
88e23e32f5 | ||
|
|
8ab5b4a17a | ||
|
|
503dfd69ef | ||
|
|
ae61ec26c0 | ||
|
|
00bc24bd50 | ||
|
|
abd15d6307 | ||
|
|
c01ac546d1 | ||
|
|
af77221ba2 | ||
|
|
204f0938d3 | ||
|
|
ad39d1408c | ||
|
|
ed011173f6 | ||
|
|
491fcb5860 | ||
|
|
c2d5537d8d | ||
|
|
7d5037ae87 | ||
|
|
07d7714317 | ||
|
|
2cab97f37d | ||
|
|
d184778c9a | ||
|
|
9fd3b3008d | ||
|
|
71aa35b214 | ||
|
|
4443dc9d3e | ||
|
|
839e357301 | ||
|
|
ac56c5a415 | ||
|
|
36e3343341 |
7
.github/ISSUE_TEMPLATE/ISSUE_TEMPLATE_1.md
vendored
7
.github/ISSUE_TEMPLATE/ISSUE_TEMPLATE_1.md
vendored
@@ -2,8 +2,7 @@
|
||||
name: Bug report (bluescreen crash) Bug报告 (蓝屏报错)
|
||||
about: Create a report of problems which made the crash with a bluescreen
|
||||
---
|
||||
Screenshot with crash information: (delete this line before submitting)
|
||||
*Image Here*
|
||||
Screenshot with crash information (*Image(s) Here*):
|
||||
|
||||
If you can reproduce it, write the steps here. If you can't, try to describe the exactly time the game crash, like pressing which key or which button: (delete this line before submitting)
|
||||
*Details Here*
|
||||
|
||||
If you can reproduce it, write the steps here. If you can't, try to describe the exactly time the game crash, like pressing which key or which button (*Details Here*)
|
||||
7
.github/ISSUE_TEMPLATE/ISSUE_TEMPLATE_2.md
vendored
7
.github/ISSUE_TEMPLATE/ISSUE_TEMPLATE_2.md
vendored
@@ -2,8 +2,7 @@
|
||||
name: Bug report (unintended behaviors) Bug报告 (奇怪的现象)
|
||||
about: Create a report of unintended behaviors
|
||||
---
|
||||
Screenshot with unintended behaviors: (delete this line before submitting)
|
||||
*Image(s) Here*
|
||||
Screenshot with unintended behaviors (*Image(s) Here*):
|
||||
|
||||
If you can reproduce it, write the steps here. If you can't, try to describe the exactly time the game crash, like pressing which key or which button: (delete this line before submitting)
|
||||
*Details Here*
|
||||
|
||||
If you can reproduce it, write the steps here. If you can't, try to describe the exactly time the game crash, like pressing which key or which button (*Details Here*):
|
||||
|
||||
54
.github/actions/upload-artifact/action.yml
vendored
54
.github/actions/upload-artifact/action.yml
vendored
@@ -1,54 +0,0 @@
|
||||
name: "upload artifact"
|
||||
description: "upload file with webdav"
|
||||
inputs:
|
||||
WEBDAV_USERNAME:
|
||||
required: true
|
||||
description: "webdav username"
|
||||
WEBDAV_PASSWORD:
|
||||
required: true
|
||||
description: "webdav password"
|
||||
ARTIFACT_TYPE:
|
||||
required: true
|
||||
description: "file build type"
|
||||
ARTIFACT_PLATFORM:
|
||||
required: true
|
||||
description: "file platform"
|
||||
ARTIFACT_NAME:
|
||||
required: true
|
||||
description: "file name"
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
- uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: '3.9'
|
||||
- name: Install Webdav 4
|
||||
shell: bash
|
||||
run: |
|
||||
pip install webdav4
|
||||
- name: Update release
|
||||
shell: python
|
||||
run: |
|
||||
import re
|
||||
from webdav4.client import Client
|
||||
|
||||
client = Client(
|
||||
"http://mc.yuhao7370.top:5212/dav",
|
||||
auth=("${{ inputs.WEBDAV_USERNAME }}", "${{ inputs.WEBDAV_PASSWORD }}"),
|
||||
timeout=None,
|
||||
)
|
||||
if '${{ inputs.ARTIFACT_TYPE }}' == 'release':
|
||||
print('Removing previous ${{ inputs.ARTIFACT_PLATFORM }} release file...')
|
||||
for file in client.ls('Techmino distribution'):
|
||||
if re.search(r'(Techmino_a[0-9]+\.[0-9]+\.[0-9]_${{ inputs.ARTIFACT_PLATFORM }}.*)', file['name']):
|
||||
client.remove(file['name'])
|
||||
print('Uploading new ${{ inputs.ARTIFACT_PLATFORM }} release file...')
|
||||
client.upload_file("${{ inputs.ARTIFACT_NAME }}", 'Techmino distribution/${{ inputs.ARTIFACT_NAME }}')
|
||||
|
||||
if '${{ inputs.ARTIFACT_TYPE }}' == 'test':
|
||||
print('Removing previous ${{ inputs.ARTIFACT_PLATFORM }} test file...')
|
||||
for file in client.ls('Techmino Snapshot'):
|
||||
if re.search(r'(Techmino_pre[0-9]+\.[0-9]+\.[0-9]_[0-9a-z]{7}_${{ inputs.ARTIFACT_PLATFORM }}.*)', file['name']):
|
||||
client.remove(file['name'])
|
||||
print('Uploading new ${{ inputs.ARTIFACT_PLATFORM }} test file...')
|
||||
client.upload_file("${{ inputs.ARTIFACT_NAME }}", 'Techmino Snapshot/${{ inputs.ARTIFACT_NAME }}')
|
||||
BIN
.github/build/macOS/backgroundImage.tiff
vendored
BIN
.github/build/macOS/backgroundImage.tiff
vendored
Binary file not shown.
48
.github/workflows/release.yml
vendored
48
.github/workflows/release.yml
vendored
@@ -56,14 +56,6 @@ jobs:
|
||||
with:
|
||||
name: ${{ needs.get-info.outputs.updateTitle }}
|
||||
files: Techmino_a${{ needs.get-info.outputs.release }}_Win64.zip
|
||||
- name: Upload artifact to server
|
||||
uses: ./.github/actions/upload-artifact
|
||||
with:
|
||||
WEBDAV_USERNAME: ${{ secrets.WEBDAV_USERNAME }}
|
||||
WEBDAV_PASSWORD: ${{ secrets.WEBDAV_PASSWORD }}
|
||||
ARTIFACT_TYPE: release
|
||||
ARTIFACT_PLATFORM: Win64
|
||||
ARTIFACT_NAME: Techmino_a${{ needs.get-info.outputs.release }}_Win64.zip
|
||||
|
||||
build-windows-x86:
|
||||
runs-on: windows-latest
|
||||
@@ -85,14 +77,6 @@ jobs:
|
||||
with:
|
||||
name: ${{ needs.get-info.outputs.updateTitle }}
|
||||
files: Techmino_a${{ needs.get-info.outputs.release }}_Win32.zip
|
||||
- name: Upload artifact to server
|
||||
uses: ./.github/actions/upload-artifact
|
||||
with:
|
||||
WEBDAV_USERNAME: ${{ secrets.WEBDAV_USERNAME }}
|
||||
WEBDAV_PASSWORD: ${{ secrets.WEBDAV_PASSWORD }}
|
||||
ARTIFACT_TYPE: release
|
||||
ARTIFACT_PLATFORM: Win32
|
||||
ARTIFACT_NAME: Techmino_a${{ needs.get-info.outputs.release }}_Win32.zip
|
||||
|
||||
build-linux:
|
||||
runs-on: ubuntu-20.04
|
||||
@@ -109,14 +93,6 @@ jobs:
|
||||
with:
|
||||
name: ${{ needs.get-info.outputs.updateTitle }}
|
||||
files: Techmino_a${{ needs.get-info.outputs.release }}_Linux.AppImage
|
||||
- name: Upload artifact to server
|
||||
uses: ./.github/actions/upload-artifact
|
||||
with:
|
||||
WEBDAV_USERNAME: ${{ secrets.WEBDAV_USERNAME }}
|
||||
WEBDAV_PASSWORD: ${{ secrets.WEBDAV_PASSWORD }}
|
||||
ARTIFACT_TYPE: release
|
||||
ARTIFACT_PLATFORM: Linux
|
||||
ARTIFACT_NAME: Techmino_a${{ needs.get-info.outputs.release }}_Linux.AppImage
|
||||
|
||||
build-android:
|
||||
runs-on: ubuntu-20.04
|
||||
@@ -139,14 +115,6 @@ jobs:
|
||||
with:
|
||||
name: ${{ needs.get-info.outputs.updateTitle }}
|
||||
files: Techmino_a${{ needs.get-info.outputs.release }}_Android.apk
|
||||
- name: Upload artifact to server
|
||||
uses: ./.github/actions/upload-artifact
|
||||
with:
|
||||
WEBDAV_USERNAME: ${{ secrets.WEBDAV_USERNAME }}
|
||||
WEBDAV_PASSWORD: ${{ secrets.WEBDAV_PASSWORD }}
|
||||
ARTIFACT_TYPE: release
|
||||
ARTIFACT_PLATFORM: Android
|
||||
ARTIFACT_NAME: Techmino_a${{ needs.get-info.outputs.release }}_Android.apk
|
||||
|
||||
build-macOS:
|
||||
runs-on: macos-10.15
|
||||
@@ -174,14 +142,6 @@ jobs:
|
||||
with:
|
||||
name: ${{ needs.get-info.outputs.updateTitle }}
|
||||
files: Techmino_a${{ needs.get-info.outputs.release }}_MacOS.dmg
|
||||
- name: Upload artifact to server
|
||||
uses: ./.github/actions/upload-artifact
|
||||
with:
|
||||
WEBDAV_USERNAME: ${{ secrets.WEBDAV_USERNAME }}
|
||||
WEBDAV_PASSWORD: ${{ secrets.WEBDAV_PASSWORD }}
|
||||
ARTIFACT_TYPE: release
|
||||
ARTIFACT_PLATFORM: MacOS
|
||||
ARTIFACT_NAME: Techmino_a${{ needs.get-info.outputs.release }}_MacOS.dmg
|
||||
|
||||
build-iOS:
|
||||
runs-on: macos-latest
|
||||
@@ -216,14 +176,6 @@ jobs:
|
||||
with:
|
||||
name: ${{ needs.get-info.outputs.updateTitle }}
|
||||
files: Techmino_a${{ needs.get-info.outputs.release }}_iOS.ipa
|
||||
- name: Upload artifact to server
|
||||
uses: ./.github/actions/upload-artifact
|
||||
with:
|
||||
WEBDAV_USERNAME: ${{ secrets.WEBDAV_USERNAME }}
|
||||
WEBDAV_PASSWORD: ${{ secrets.WEBDAV_PASSWORD }}
|
||||
ARTIFACT_TYPE: release
|
||||
ARTIFACT_PLATFORM: iOS
|
||||
ARTIFACT_NAME: Techmino_a${{ needs.get-info.outputs.release }}_iOS.ipa
|
||||
|
||||
Add-Release-note:
|
||||
runs-on: ubuntu-20.04
|
||||
|
||||
55
.github/workflows/test.yml
vendored
55
.github/workflows/test.yml
vendored
@@ -49,20 +49,7 @@ jobs:
|
||||
with:
|
||||
name: Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_Windows
|
||||
path: love
|
||||
- name: Pack Techmino
|
||||
run: 7z a -tzip .\Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_Windows.zip .\love
|
||||
- name: Upload artifact to server
|
||||
uses: ./.github/actions/upload-artifact
|
||||
with:
|
||||
WEBDAV_USERNAME: ${{ secrets.WEBDAV_USERNAME }}
|
||||
WEBDAV_PASSWORD: ${{ secrets.WEBDAV_PASSWORD }}
|
||||
ARTIFACT_TYPE: test
|
||||
ARTIFACT_PLATFORM: Windows
|
||||
ARTIFACT_NAME: Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_Windows.zip
|
||||
# - name: Upload artifact to server
|
||||
# run: |
|
||||
# curl --user "${{ secrets.WEBDAV_USERNAME }}:${{ secrets.WEBDAV_PASSWORD }}" -T Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_Windows.zip http://mc.yuhao7370.top:5212/dav/Techmino%20Snapshots/ -v
|
||||
|
||||
|
||||
build-linux:
|
||||
runs-on: ubuntu-20.04
|
||||
needs: get-info
|
||||
@@ -80,16 +67,6 @@ jobs:
|
||||
with:
|
||||
name: Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_Linux
|
||||
path: Techmino.AppImage
|
||||
- name: Pack Techmino
|
||||
run: mv Techmino.AppImage Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_Linux.AppImage
|
||||
- name: Upload artifact to server
|
||||
uses: ./.github/actions/upload-artifact
|
||||
with:
|
||||
WEBDAV_USERNAME: ${{ secrets.WEBDAV_USERNAME }}
|
||||
WEBDAV_PASSWORD: ${{ secrets.WEBDAV_PASSWORD }}
|
||||
ARTIFACT_TYPE: test
|
||||
ARTIFACT_PLATFORM: Linux
|
||||
ARTIFACT_NAME: Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_Linux.AppImage
|
||||
|
||||
build-android:
|
||||
runs-on: ubuntu-20.04
|
||||
@@ -115,16 +92,6 @@ jobs:
|
||||
with:
|
||||
name: Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_Android
|
||||
path: Techmino_Snapshot.apk
|
||||
- name: Pack Techmino
|
||||
run: mv Techmino_Snapshot.apk Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_Android.apk
|
||||
- name: Upload artifact to server
|
||||
uses: ./.github/actions/upload-artifact
|
||||
with:
|
||||
WEBDAV_USERNAME: ${{ secrets.WEBDAV_USERNAME }}
|
||||
WEBDAV_PASSWORD: ${{ secrets.WEBDAV_PASSWORD }}
|
||||
ARTIFACT_TYPE: test
|
||||
ARTIFACT_PLATFORM: Android
|
||||
ARTIFACT_NAME: Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_Android.apk
|
||||
|
||||
build-macOS:
|
||||
runs-on: macos-10.15
|
||||
@@ -152,16 +119,6 @@ jobs:
|
||||
with:
|
||||
name: Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_MacOS
|
||||
path: Techmino.dmg
|
||||
- name: Pack Techmino
|
||||
run: mv Techmino.dmg Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_MacOS.dmg
|
||||
- name: Upload artifact to server
|
||||
uses: ./.github/actions/upload-artifact
|
||||
with:
|
||||
WEBDAV_USERNAME: ${{ secrets.WEBDAV_USERNAME }}
|
||||
WEBDAV_PASSWORD: ${{ secrets.WEBDAV_PASSWORD }}
|
||||
ARTIFACT_TYPE: test
|
||||
ARTIFACT_PLATFORM: MacOS
|
||||
ARTIFACT_NAME: Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_MacOS.dmg
|
||||
|
||||
build-iOS:
|
||||
runs-on: macos-latest
|
||||
@@ -195,13 +152,3 @@ jobs:
|
||||
with:
|
||||
name: Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_iOS
|
||||
path: Techmino.ipa
|
||||
- name: Pack Techmino
|
||||
run: mv Techmino.ipa Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_iOS.ipa
|
||||
- name: Upload artifact to server
|
||||
uses: ./.github/actions/upload-artifact
|
||||
with:
|
||||
WEBDAV_USERNAME: ${{ secrets.WEBDAV_USERNAME }}
|
||||
WEBDAV_PASSWORD: ${{ secrets.WEBDAV_PASSWORD }}
|
||||
ARTIFACT_TYPE: test
|
||||
ARTIFACT_PLATFORM: iOS
|
||||
ARTIFACT_NAME: Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_iOS.ipa
|
||||
|
||||
@@ -4,6 +4,7 @@ LOADED=false
|
||||
ERRDATA={}
|
||||
|
||||
--Pure lua modules (basic)
|
||||
MATH= require'Zframework.mathExtend'
|
||||
COLOR= require'Zframework.color'
|
||||
TABLE= require'Zframework.tableExtend'
|
||||
STRING= require'Zframework.stringExtend'
|
||||
|
||||
23
Zframework/mathExtend.lua
Normal file
23
Zframework/mathExtend.lua
Normal file
@@ -0,0 +1,23 @@
|
||||
local MATH={}for k,v in next,math do MATH[k]=v end
|
||||
|
||||
local rnd=math.random
|
||||
|
||||
MATH.tau=2*math.pi
|
||||
|
||||
function MATH.sign(a)
|
||||
return a>0 and 1 or a<0 and -1 or 0
|
||||
end
|
||||
|
||||
function MATH.roll(chance)
|
||||
return rnd()<(chance or .5)
|
||||
end
|
||||
|
||||
function MATH.coin(a,b)
|
||||
if rnd()<.5 then
|
||||
return a
|
||||
else
|
||||
return b
|
||||
end
|
||||
end
|
||||
|
||||
return MATH
|
||||
@@ -1,5 +1,5 @@
|
||||
local type,rem=type,table.remove
|
||||
local rnd=math.random
|
||||
local int,rnd=math.floor,math.random
|
||||
|
||||
local sfxList={}
|
||||
local packSetting={}
|
||||
@@ -7,7 +7,7 @@ local Sources={}
|
||||
local volume=1
|
||||
local stereo=1
|
||||
|
||||
local noteName={
|
||||
local noteVal={
|
||||
C=1,c=1,
|
||||
D=3,d=3,
|
||||
E=5,e=5,
|
||||
@@ -16,10 +16,11 @@ local noteName={
|
||||
A=10,a=10,
|
||||
B=12,b=12,
|
||||
}
|
||||
local noteName={'C','C#','D','D#','E','F','F#','G','G#','A','A#','B'}
|
||||
local function _getTuneHeight(tune)
|
||||
local octave=tonumber(tune:sub(-1,-1))
|
||||
if octave then
|
||||
local tuneHeight=noteName[tune:sub(1,1)]
|
||||
local tuneHeight=noteVal[tune:sub(1,1)]
|
||||
if tuneHeight then
|
||||
tuneHeight=tuneHeight+(octave-1)*12
|
||||
local s=tune:sub(2,2)
|
||||
@@ -79,21 +80,30 @@ function SFX.setStereo(v)
|
||||
stereo=v
|
||||
end
|
||||
|
||||
function SFX.playSample(pack,...)--vol-2, sampSet1, vol-3, sampSet2, vol-1
|
||||
function SFX.getNoteName(note)
|
||||
if note<1 then
|
||||
return'---'
|
||||
else
|
||||
note=note-1
|
||||
local octave=int(note/12)+1
|
||||
return noteName[note%12+1]..octave
|
||||
end
|
||||
end
|
||||
function SFX.playSample(pack,...)--vol-1, sampSet1, vol-2, sampSet2
|
||||
if ... then
|
||||
local arg={...}
|
||||
local vol
|
||||
if type(arg[#arg])=='number'then vol=rem(arg)end
|
||||
for i=1,#arg do
|
||||
if type(arg[i])=='number'then
|
||||
vol=arg[i]
|
||||
local a=arg[i]
|
||||
if type(a)=='number'and a<=1 then
|
||||
vol=a
|
||||
else
|
||||
local base=packSetting[pack].base
|
||||
local top=packSetting[pack].top
|
||||
local tune=_getTuneHeight(arg[i])--Absolute tune in number
|
||||
local tune=type(a)=='string'and _getTuneHeight(a)or a--Absolute tune in number
|
||||
local playTune=tune+rnd(-2,2)
|
||||
if playTune<base then--Too low notes
|
||||
playTune=base
|
||||
if playTune<=base then--Too low notes
|
||||
playTune=base+1
|
||||
elseif playTune>top then--Too high notes
|
||||
playTune=top
|
||||
end
|
||||
|
||||
@@ -63,9 +63,9 @@ function STRING.time(t)
|
||||
if t<60 then
|
||||
return format("%.3f\"",t)
|
||||
elseif t<3600 then
|
||||
return format("%d'%05.2f\"",int(t/60),t%60)
|
||||
return format("%d'%05.2f\"",int(t/60),int(t%60*100)/100)
|
||||
else
|
||||
return format("%d:%.2d'%05.2f\"",int(t/3600),int(t/60%60),t%60)
|
||||
return format("%d:%.2d'%05.2f\"",int(t/3600),int(t/60%60),int(t%60*100)/100)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -46,6 +46,18 @@ function TABLE.cover(new,old)
|
||||
end
|
||||
end
|
||||
|
||||
--For all things in new, push to old
|
||||
function TABLE.coverR(new,old)
|
||||
for k,v in next,new do
|
||||
if type(v)=='table'and type(old[k])=='table'then
|
||||
TABLE.coverR(v,old[k])
|
||||
else
|
||||
old[k]=v
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
--For all things in new if same type in old, push to old
|
||||
function TABLE.update(new,old)
|
||||
for k,v in next,new do
|
||||
@@ -90,6 +102,11 @@ function TABLE.find(t,val)
|
||||
for i=1,#t do if t[i]==val then return i end end
|
||||
end
|
||||
|
||||
--Retuen next value of [1~#]
|
||||
function TABLE.next(t,val)
|
||||
for i=1,#t do if t[i]==val then return t[i%#t+1]end end
|
||||
end
|
||||
|
||||
--Find value in whole table
|
||||
function TABLE.search(t,val)
|
||||
for k,v in next,t do if v==val then return k end end
|
||||
|
||||
@@ -17,7 +17,7 @@ The Apple logo, "Apple Inc.," iOS, iPadOS, macOS, iPhone, and Mac are registered
|
||||
"Windows", the Windows logo, "Xbox", Xbox logo, and "Microsoft" are registered trademarks of Microsoft Corporation in the United States of America and other countries or regions.
|
||||
|
||||
|
||||
Source Han Sans is copyrighted by Adobe Inc. Source Han Sans and Abode are registered trademarks of Adobe Inc. in United States and other countries or regions. Source Han Sans is licensed under the SIL Open Font License.
|
||||
Source Han Sans is copyrighted by Adobe Inc. Source Han Sans and Adobe are registered trademarks of Adobe Inc. in United States and other countries or regions. Source Han Sans is licensed under the SIL Open Font License.
|
||||
|
||||
|
||||
IBM Plex is copyrighted by the International Business Machines Corporation. IBM and IBM Plex are trademarks of IBM Corp, registered in many jurisdictions worldwide. IBM Plex is licensed under the SIL Open Font License.
|
||||
|
||||
3
main.lua
3
main.lua
@@ -24,6 +24,7 @@ VERSION=require"version"
|
||||
TIME=love.timer.getTime
|
||||
YIELD=coroutine.yield
|
||||
SYSTEM=love.system.getOS()
|
||||
FNSF=SYSTEM:find'\79\83'--What does FNSF stand for? IDK so don't ask me lol
|
||||
MOBILE=SYSTEM=='Android'or SYSTEM=='iOS'
|
||||
SAVEDIR=fs.getSaveDirectory()
|
||||
|
||||
@@ -205,7 +206,7 @@ Z.setOnQuit(destroyPlayers)
|
||||
TABLE.cover (FILE.load('conf/user')or{},USER)
|
||||
TABLE.cover (FILE.load('conf/unlock')or{},RANKS)
|
||||
TABLE.update(FILE.load('conf/settings')or{},SETTING)
|
||||
TABLE.update(FILE.load('conf/data')or{},STAT)
|
||||
TABLE.coverR(FILE.load('conf/data')or{},STAT)
|
||||
TABLE.cover (FILE.load('conf/key')or{},KEY_MAP)
|
||||
TABLE.cover (FILE.load('conf/virtualkey')or{},VK_ORG)
|
||||
|
||||
|
||||
@@ -129,10 +129,10 @@ do
|
||||
[10]={'+0+0','+1+0','+1-1','+0+2','+1-2','+1-2'},
|
||||
[03]={'+0+0','+1+0','+1+1','+0-2','+1-1','+1-2'},
|
||||
[30]={'+0+0','-1+0','-1-1','+0+2','-1+2','+0-1'},
|
||||
[12]={'+0+0','+1+0','+1-1','+0+2','+1+2'},
|
||||
[21]={'+0+0','-1+0','-1+1','+0-2','-1-2'},
|
||||
[32]={'+0+0','-1+0','-1-1','+0+2','-1+2'},
|
||||
[23]={'+0+0','+1+0','+1+1','+0-2','+1-2'},
|
||||
[12]={'+0+0','+1+0','+1-1','+0+2','+1+2','+1+1'},
|
||||
[21]={'+0+0','-1+0','-1+1','+0-2','-1-2','-1-1'},
|
||||
[32]={'+0+0','-1+0','-1-1','+0+2','-1+2','+0-1'},
|
||||
[23]={'+0+0','+1+0','+1+1','+0-2','+1-2','+0+1'},
|
||||
[02]={'+0+0','+1+0','-1+0','+0-1','+0+1'},
|
||||
[20]={'+0+0','-1+0','+1+0','+0+1','+0-1'},
|
||||
[13]={'+0+0','+0-1','+0+1','+0-2'},
|
||||
@@ -353,8 +353,8 @@ do
|
||||
[21]={'+0+0','-1+0','-1+1','+0+1','-1+2','+0+2','-1-1','+1+0','+0-2','-1-2'},
|
||||
[32]={'+0+0','-1+0','-1+1','-1-1','+1+0','+0+2','-1+2','+0-2'},
|
||||
[23]={'+0+0','+1+0','+1-1','+1+1','-1+0','+0-2','+1-2','+0+2'},
|
||||
[02]={'+0+0','+0-1','+1-1','-1+0','+2-1'},
|
||||
[20]={'+0+0','+0+1','-1+1','+1+0','-2+1'},
|
||||
[02]={'+0+0','+0-1','-1-1','+1-1','-1+0','+2-1'},
|
||||
[20]={'+0+0','+0+1','+1+1','-1+1','+1+0','-2+1'},
|
||||
[13]={'+0+0','-1+0','-1-1','+0+1','-1-2'},
|
||||
[31]={'+0+0','+1+0','+1+1','+0-1','+1+2'},
|
||||
},--J5
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
--Blackhole
|
||||
--blockhole
|
||||
local gc=love.graphics
|
||||
local gc_clear,gc_replaceTransform=gc.clear,gc.replaceTransform
|
||||
local gc_setColor,gc_setLineWidth=gc.setColor,gc.setLineWidth
|
||||
@@ -51,7 +51,7 @@ function back.draw()
|
||||
gc_draw(S.texture,S.d*cos(S.ang),S.d*sin(S.ang),S.rotate,S.size*.026,nil,15,15)
|
||||
end
|
||||
|
||||
--Blackhole
|
||||
--blockhole
|
||||
gc_setColor(.07,.07,.07)
|
||||
gc_circle('fill',0,0,157)
|
||||
gc_setLineWidth(6)
|
||||
@@ -13,6 +13,7 @@ return{
|
||||
holdCount=1,
|
||||
infHold=true,
|
||||
phyHold=false,
|
||||
hang=0,
|
||||
|
||||
--Visual
|
||||
bone=false,
|
||||
|
||||
35
parts/eventsets/bigbang.lua
Normal file
35
parts/eventsets/bigbang.lua
Normal file
@@ -0,0 +1,35 @@
|
||||
local function task_newBoard(P,init)
|
||||
local F,L={},{1}
|
||||
--TODO
|
||||
P:pushNextList(L)
|
||||
|
||||
P.control=false
|
||||
if not init then for _=1,26 do YIELD()end end
|
||||
P.control=true
|
||||
|
||||
P.gameEnv.heightLimit=#F
|
||||
P:pushLineList(F)
|
||||
end
|
||||
local function _check(P)
|
||||
P.gameEnv.heightLimit=P.gameEnv.heightLimit-P.lastPiece.row
|
||||
if P.gameEnv.heightLimit==0 then
|
||||
P.modeData.stage=P.modeData.stage+1
|
||||
if P.modeData.stage>=100 then
|
||||
P:win('finish')
|
||||
else
|
||||
P:newTask(task_newBoard)
|
||||
end
|
||||
end
|
||||
end
|
||||
return{
|
||||
sequence='none',
|
||||
RS="SRS",
|
||||
pushSpeed=5,
|
||||
mesDisp=function(P)
|
||||
setFont(60)
|
||||
mStr(P.modeData.stage,63,280)
|
||||
mText(TEXTOBJ.wave,63,350)
|
||||
end,
|
||||
hook_drop=_check,
|
||||
task=function(P)task_newBoard(P,true)P.fieldBeneath=0 end,--Just run one time at first to start first level
|
||||
}
|
||||
@@ -1,3 +1,4 @@
|
||||
local gc_setColor=love.graphics.setColor
|
||||
return{
|
||||
das=16,arr=6,
|
||||
sddas=6,sdarr=6,
|
||||
@@ -18,12 +19,24 @@ return{
|
||||
mStr(r<10 and 9 or r<30 and r or("%02x"):format(r*10-300),63,210)
|
||||
mText(TEXTOBJ.speedLV,63,290)
|
||||
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
|
||||
if P.modeData.drought>7 then
|
||||
if P.modeData.drought<=14 then
|
||||
gc_setColor(1,1,1,P.modeData.drought/7-1)
|
||||
else
|
||||
local gb=P.modeData.drought<=21 and 2-P.modeData.drought/14 or .5
|
||||
gc_setColor(1,gb,gb)
|
||||
end
|
||||
setFont(50)
|
||||
mStr(P.modeData.drought,63,130)
|
||||
mDraw(MODES.drought_l.icon,63,200,nil,.5)
|
||||
end
|
||||
end,
|
||||
task=function(P)
|
||||
P.modeData.target=10
|
||||
end,
|
||||
hook_drop=function(P)
|
||||
local D=P.modeData
|
||||
D.drought=P.lastPiece.id==7 and 0 or D.drought+1
|
||||
if P.stat.row>=D.target then
|
||||
if D.target==110 then
|
||||
P.gameEnv.drop,P.gameEnv.lock=5,5
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
local gc_setColor=love.graphics.setColor
|
||||
return{
|
||||
das=16,arr=6,
|
||||
sddas=3,sdarr=3,
|
||||
@@ -18,6 +19,17 @@ return{
|
||||
mStr(r<11 and 18 or r<22 and r+8 or("%02x"):format(r*10-220),63,210)
|
||||
mText(TEXTOBJ.speedLV,63,290)
|
||||
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
|
||||
if P.modeData.drought>7 then
|
||||
if P.modeData.drought<=14 then
|
||||
gc_setColor(1,1,1,P.modeData.drought/7-1)
|
||||
else
|
||||
local gb=P.modeData.drought<=21 and 2-P.modeData.drought/14 or .5
|
||||
gc_setColor(1,gb,gb)
|
||||
end
|
||||
setFont(50)
|
||||
mStr(P.modeData.drought,63,130)
|
||||
mDraw(MODES.drought_l.icon,63,200,nil,.5)
|
||||
end
|
||||
end,
|
||||
task=function(P)
|
||||
P.modeData.target=10
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
local gc_setColor=love.graphics.setColor
|
||||
return{
|
||||
das=16,arr=6,
|
||||
sddas=1,sdarr=1,
|
||||
@@ -18,6 +19,17 @@ return{
|
||||
mStr(r==1 and 29 or("%02x"):format(r*10-20),63,210)
|
||||
mText(TEXTOBJ.speedLV,63,290)
|
||||
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
|
||||
if P.modeData.drought>7 then
|
||||
if P.modeData.drought<=14 then
|
||||
gc_setColor(1,1,1,P.modeData.drought/7-1)
|
||||
else
|
||||
local gb=P.modeData.drought<=21 and 2-P.modeData.drought/14 or .5
|
||||
gc_setColor(1,gb,gb)
|
||||
end
|
||||
setFont(50)
|
||||
mStr(P.modeData.drought,63,130)
|
||||
mDraw(MODES.drought_l.icon,63,200,nil,.5)
|
||||
end
|
||||
end,
|
||||
task=function(P)
|
||||
P.modeData.target=10
|
||||
|
||||
@@ -1,51 +1,54 @@
|
||||
local pc_drop={50,45,40,35,30,26,22,18,15,12}
|
||||
local pc_lock={55,50,46,42,39,36,33,31,29,27}
|
||||
local pc_lock={55,50,46,42,40,38,36,34,32,30}
|
||||
local pc_fall={18,16,14,12,10,9,8,7,6,5}
|
||||
local PCbase=require"parts.modes.PCbase"
|
||||
local PClist=require"parts.modes.PClist"
|
||||
|
||||
local function task_PC(P)
|
||||
if P.frameRun>180 then
|
||||
P.control=false
|
||||
for _=1,26 do YIELD()end
|
||||
P.control=true
|
||||
end
|
||||
local base=PCbase[P.modeData.type]
|
||||
P:pushLineList(base[P.holeRND:random(#base)],P.modeData.symmetry)
|
||||
local difficulty=P.stat.pc<10 and 4 or 5
|
||||
local L=PClist[difficulty][P.holeRND:random(#PClist[difficulty])]
|
||||
local symmetry=P.holeRND:random()>.5
|
||||
P:pushNextList(L,symmetry)
|
||||
|
||||
P.control=false
|
||||
if P.frameRun>180 then for _=1,26 do YIELD()end end
|
||||
P.control=true
|
||||
|
||||
local base=PCbase[difficulty]
|
||||
P:pushLineList(base[P.holeRND:random(#base)],symmetry)
|
||||
end
|
||||
local function check(P)
|
||||
local f=P.field
|
||||
if #f>0 then
|
||||
if #f+P.stat.row%4>4 then
|
||||
local function _check(P)
|
||||
if #P.field>0 then
|
||||
if #P.field+P.stat.row%4>4 then
|
||||
P:lose()
|
||||
end
|
||||
else
|
||||
local type=P.stat.pc<10 and 4 or 5
|
||||
local L=PClist[type][P.holeRND:random(#PClist[type])]
|
||||
local symmetry=P.holeRND:random()>.5
|
||||
P.modeData.type=type
|
||||
P.modeData.symmetry=symmetry
|
||||
P:pushNextList(L,symmetry)
|
||||
P.modeData.counter=P.stat.piece==0 and 20 or 0
|
||||
P:newTask(task_PC)
|
||||
if P.stat.pc>=100 then
|
||||
P:win('finish')
|
||||
else
|
||||
P:newTask(task_PC)
|
||||
if P.frameRun<180 then P.fieldBeneath=0 end
|
||||
|
||||
local s=P.stat.pc*.25
|
||||
if math.floor(s)==s and s>0 then
|
||||
P.gameEnv.drop=pc_drop[s]or 10
|
||||
P.gameEnv.lock=pc_lock[s]or 25
|
||||
P.gameEnv.fall=pc_fall[s]or 4
|
||||
if s==10 then
|
||||
P:_showText(text.maxspeed,0,-140,100,'appear',.6)
|
||||
if P.stat.pc%4==0 and P.stat.pc>0 and P.stat.pc<=40 then
|
||||
local s=P.stat.pc/4
|
||||
P.gameEnv.drop=pc_drop[s]or 10
|
||||
P.gameEnv.lock=pc_lock[s]or 25
|
||||
P.gameEnv.fall=pc_fall[s]or 4
|
||||
if s==10 then
|
||||
P:_showText(text.maxspeed,0,-140,100,'appear',.6)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
return{
|
||||
sequence='none',
|
||||
RS="SRS",
|
||||
mesDisp=function(P)
|
||||
setFont(60)
|
||||
mStr(P.stat.pc,63,340)
|
||||
mText(TEXTOBJ.pc,63,410)
|
||||
mStr(P.stat.pc,63,260)
|
||||
mText(TEXTOBJ.pc,63,330)
|
||||
end,
|
||||
hook_drop=check,
|
||||
task=check,
|
||||
hook_drop=_check,
|
||||
task=_check,--Just run one time at first to start first level
|
||||
}
|
||||
|
||||
@@ -8,35 +8,40 @@ local PCtype={
|
||||
1,2,3,
|
||||
}
|
||||
local function task_PC(P)
|
||||
local difficulty=PCtype[P.stat.pc+1]or 3
|
||||
local L=PClist[difficulty][P.holeRND:random(#PClist[difficulty])]
|
||||
local symmetry=P.holeRND:random()>.5
|
||||
P:pushNextList(L,symmetry)
|
||||
|
||||
P.control=false
|
||||
for _=1,26 do YIELD()end
|
||||
if P.frameRun>180 then for _=1,26 do YIELD()end end
|
||||
P.control=true
|
||||
local base=PCbase[P.modeData.type]
|
||||
P:pushLineList(base[P.holeRND:random(#base)],P.modeData.symmetry)
|
||||
|
||||
local base=PCbase[difficulty]
|
||||
P:pushLineList(base[P.holeRND:random(#base)],symmetry)
|
||||
end
|
||||
local function check(P)
|
||||
local r=P.field
|
||||
if #r>0 then
|
||||
if #r+P.stat.row%4>4 then
|
||||
local function _check(P)
|
||||
if #P.field>0 then
|
||||
if #P.field+P.stat.row%4>4 then
|
||||
P:lose()
|
||||
end
|
||||
else
|
||||
local type=PCtype[P.stat.pc+1]or 3
|
||||
local L=PClist[type][P.holeRND:random(#PClist[type])]
|
||||
local symmetry=P.holeRND:random()>.5
|
||||
P.modeData.type=type
|
||||
P.modeData.symmetry=symmetry
|
||||
P:pushNextList(L,symmetry)
|
||||
P.modeData.counter=P.stat.piece==0 and 20 or 0
|
||||
P:newTask(task_PC)
|
||||
if P.stat.pc>=60 then
|
||||
P:win('finish')
|
||||
else
|
||||
P:newTask(task_PC)
|
||||
if P.frameRun<180 then P.fieldBeneath=0 end
|
||||
end
|
||||
end
|
||||
end
|
||||
return{
|
||||
sequence='none',
|
||||
RS="SRS",
|
||||
mesDisp=function(P)
|
||||
setFont(60)
|
||||
mStr(P.stat.pc,63,340)
|
||||
mText(TEXTOBJ.pc,63,410)
|
||||
mStr(P.stat.pc,63,260)
|
||||
mText(TEXTOBJ.pc,63,330)
|
||||
end,
|
||||
hook_drop=check,
|
||||
task=check,
|
||||
hook_drop=_check,
|
||||
task=_check,--Just run one time at first to start first level
|
||||
}
|
||||
|
||||
20
parts/eventsets/sprintEff_40.lua
Normal file
20
parts/eventsets/sprintEff_40.lua
Normal file
@@ -0,0 +1,20 @@
|
||||
return{
|
||||
mesDisp=function(P)
|
||||
setFont(45)
|
||||
mStr(("%.1f"):format(P.stat.atk),63,270)
|
||||
mText(TEXTOBJ.atk,63,323)
|
||||
mStr(("%.2f"):format(P.stat.atk/P.stat.row),63,370)
|
||||
mText(TEXTOBJ.eff,63,423)
|
||||
|
||||
setFont(55)
|
||||
local r=40-P.stat.row
|
||||
if r<0 then r=0 end
|
||||
mStr(r,63,170)
|
||||
PLY.draw.drawTargetLine(P,r)
|
||||
end,
|
||||
hook_drop=function(P)
|
||||
if P.stat.row>=40 then
|
||||
P:win('finish')
|
||||
end
|
||||
end
|
||||
}
|
||||
30
parts/eventsets/strategy_e.lua
Normal file
30
parts/eventsets/strategy_e.lua
Normal file
@@ -0,0 +1,30 @@
|
||||
local waitSpeed={60,59,58,57,56,55,54,52,50,48,46,44,42,40,38,36,34,32,30}
|
||||
|
||||
return
|
||||
{
|
||||
das=5,arr=1,
|
||||
drop=0,lock=7,
|
||||
wait=60,fall=0,
|
||||
freshLimit=12,
|
||||
mesDisp=function(P)
|
||||
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
|
||||
PLY.draw.drawTargetLine(P,200-P.stat.row)
|
||||
end,
|
||||
task=function(P)
|
||||
P.modeData.target=10
|
||||
end,
|
||||
hook_drop=function(P)
|
||||
if P.stat.row>=P.modeData.target then
|
||||
if P.modeData.target==200 then
|
||||
P:win('finish')
|
||||
else
|
||||
if P.modeData.target==100 then
|
||||
P.modeData.lock=6
|
||||
end
|
||||
P.gameEnv.wait=waitSpeed[P.modeData.target/10]
|
||||
P.modeData.target=P.modeData.target+10
|
||||
SFX.play('reach')
|
||||
end
|
||||
end
|
||||
end
|
||||
}
|
||||
30
parts/eventsets/strategy_h.lua
Normal file
30
parts/eventsets/strategy_h.lua
Normal file
@@ -0,0 +1,30 @@
|
||||
local waitSpeed={30,29,28,27,26,25,24,23,22,21,20,19,18,18,17,17,16,16,15}
|
||||
|
||||
return
|
||||
{
|
||||
das=4,arr=1,
|
||||
drop=0,lock=6,
|
||||
wait=30,fall=0,
|
||||
freshLimit=12,
|
||||
mesDisp=function(P)
|
||||
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
|
||||
PLY.draw.drawTargetLine(P,200-P.stat.row)
|
||||
end,
|
||||
task=function(P)
|
||||
P.modeData.target=10
|
||||
end,
|
||||
hook_drop=function(P)
|
||||
if P.stat.row>=P.modeData.target then
|
||||
if P.modeData.target==200 then
|
||||
P:win('finish')
|
||||
else
|
||||
if P.modeData.target==100 then
|
||||
P.modeData.lock=5
|
||||
end
|
||||
P.gameEnv.wait=waitSpeed[P.modeData.target/10]
|
||||
P.modeData.target=P.modeData.target+10
|
||||
SFX.play('reach')
|
||||
end
|
||||
end
|
||||
end
|
||||
}
|
||||
30
parts/eventsets/strategy_u.lua
Normal file
30
parts/eventsets/strategy_u.lua
Normal file
@@ -0,0 +1,30 @@
|
||||
local waitSpeed={15,15,14,14,13,13,12,12,11,11,10,10,9,9,8,8,7,7,7}
|
||||
|
||||
return
|
||||
{
|
||||
das=3,arr=1,
|
||||
drop=0,lock=5,
|
||||
wait=15,fall=0,
|
||||
freshLimit=12,
|
||||
mesDisp=function(P)
|
||||
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
|
||||
PLY.draw.drawTargetLine(P,200-P.stat.row)
|
||||
end,
|
||||
task=function(P)
|
||||
P.modeData.target=10
|
||||
end,
|
||||
hook_drop=function(P)
|
||||
if P.stat.row>=P.modeData.target then
|
||||
if P.modeData.target==200 then
|
||||
P:win('finish')
|
||||
else
|
||||
if P.modeData.target==100 then
|
||||
P.modeData.lock=4
|
||||
end
|
||||
P.gameEnv.wait=waitSpeed[P.modeData.target/10]
|
||||
P.modeData.target=P.modeData.target+10
|
||||
SFX.play('reach')
|
||||
end
|
||||
end
|
||||
end
|
||||
}
|
||||
@@ -16,9 +16,9 @@ return{
|
||||
if P.stat.frame/60>=warnTime[P.modeData.stage]then
|
||||
if P.modeData.stage<9 then
|
||||
P.modeData.stage=P.modeData.stage+1
|
||||
SFX.play('ready',.7+P.modeData.stage*.03)
|
||||
playReadySFX(3,.7+P.modeData.stage*.03)
|
||||
else
|
||||
SFX.play('start')
|
||||
playReadySFX(0,.7+P.modeData.stage*.03)
|
||||
P:win('finish')
|
||||
return
|
||||
end
|
||||
|
||||
Binary file not shown.
@@ -206,34 +206,30 @@ function playClearSFX(cc)
|
||||
end
|
||||
end
|
||||
end
|
||||
function playReadySFX(i)
|
||||
function playReadySFX(i,vol)
|
||||
if i==3 then
|
||||
Snd('bass','A3')
|
||||
Snd('lead','A4')
|
||||
Snd('bass','A3',vol)
|
||||
Snd('lead','A4',vol)
|
||||
elseif i==2 then
|
||||
Snd('bass','F3')
|
||||
Snd('lead','A4')
|
||||
Snd('lead','D5')
|
||||
Snd('bass','F3',vol)
|
||||
Snd('lead','A4',vol)
|
||||
Snd('lead','D5',vol)
|
||||
elseif i==1 then
|
||||
Snd('bass','G3')
|
||||
Snd('lead','B4')
|
||||
Snd('lead','E5')
|
||||
Snd('bass','G3',vol)
|
||||
Snd('lead','B4',vol)
|
||||
Snd('lead','E5',vol)
|
||||
elseif i==0 then
|
||||
Snd('bass','A3')
|
||||
Snd('lead','A4')
|
||||
Snd('lead','E5')
|
||||
Snd('lead','A5')
|
||||
Snd('bass','A3',vol)
|
||||
Snd('lead','A4',vol)
|
||||
Snd('lead','E5',vol)
|
||||
Snd('lead','A5',vol)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
--Game
|
||||
function coin(a,b)
|
||||
if rnd()<.5 then
|
||||
return a
|
||||
else
|
||||
return b
|
||||
end
|
||||
function getItem(itemName,amount)
|
||||
STAT.item[itemName]=STAT.item[itemName]+(amount or 1)
|
||||
end
|
||||
function generateLine(hole)
|
||||
return 1023-2^(hole-1)
|
||||
@@ -275,9 +271,11 @@ function freshDate(mode)
|
||||
if STAT.date~=date then
|
||||
STAT.date=date
|
||||
STAT.todayTime=0
|
||||
getItem('zTicket',1)
|
||||
if not mode:find'q'then
|
||||
MES.new('info',text.newDay)
|
||||
end
|
||||
saveStats()
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
@@ -726,6 +726,10 @@ do--Userdata tables
|
||||
spin=(function()local L={}for i=1,29 do L[i]={0,0,0,0,0,0,0}end return L end)(),
|
||||
pc=0,hpc=0,b2b=0,b3b=0,score=0,
|
||||
lastPlay='sprint_10l',--Last played mode ID
|
||||
item=setmetatable({},{__index=function(self,k)
|
||||
self[k]=0
|
||||
return 0
|
||||
end}),
|
||||
date=false,
|
||||
todayTime=0,
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ return{
|
||||
{"Translator Note 1",
|
||||
"",
|
||||
"help",
|
||||
"This translation of the TetroDictionary is provided by me, User670 (Discord: User670#9501).\n\nThe translation may not completely reflect the contents of the original Chinese text.\n\nCorrected by C₂₉H₂₅N₃O₅.\n\nTo view the list of contributors or make contributions, feel free to visit the GitHub page.",
|
||||
"This translation of the TetroDictionary is provided by me, User670 (Discord: User670#9501).\n\nThe translation may not completely reflect the contents of the original Chinese text.\n\nCorrected by C₂₉H₂₅N₃O₅ (Discord: C29H25N3O5#1606).\n\nTo view the list of contributors or make contributions, feel free to visit the GitHub page.",
|
||||
"https://github.com/26F-Studio/Techmino/blob/main/parts/language/dict_en.lua",
|
||||
},
|
||||
{"Official Website",
|
||||
@@ -16,7 +16,7 @@ return{
|
||||
{"To New Players",
|
||||
"guide newbie noob",
|
||||
"help",
|
||||
"To new players that want to get better at the game:\n\tTwo principles:\n\t1. find a version with good controls (e.g. Techmino, Tetr.io, Tetris Online, Jstris, Tetr.js). Do not use those version used for programming practice.\n\t2. Build foundations in your skills (stable Techrashes using next queue to aid decisions), don't go for fancy T-Spins from the start.\n\n\tTwo main techniques:\n\t1. familiarize yourself with spawn locations of pieces, and the controls to move the piece into each location\n\t2. Plan ahead of where to put the pieces\nWe recommend that you read this article titled \"Words to newbies from a Tetris Pro\" (Click \"Open URL\". In Simplified Chinese)",
|
||||
"To new players that want to get better at the game:\n\tTwo principles:\n\t1. find a version with good controls (e.g. Techmino, Tetr.io, Tetris Online, Jstris, Tetr.js). Do not use those version used for programming practice.\n\t2. Build foundations in your skills (stable Techrashes using next queue to aid decisions), don't go for fancy T-Spins from the start.\n\n\tTwo main techniques:\n\t1. familiarize yourself with spawn locations of pieces, and the controls to move the piece into each location\n\t2. Plan ahead of where to put the pieces\nHere is a article written by a well-known player in Chinese Tetris community talking about advices to new players. Click the globe if you can read simplified Chinese.",
|
||||
"https://bilibili.com/read/cv2352939",
|
||||
},
|
||||
{"Learning T-spins",
|
||||
@@ -55,7 +55,7 @@ return{
|
||||
"https://tetris.huijiwiki.com",
|
||||
},
|
||||
|
||||
--Organizations
|
||||
--Webpages / Organizations
|
||||
{"Github Repository",
|
||||
"githubrepository sourcecode",
|
||||
"org",
|
||||
@@ -65,7 +65,7 @@ return{
|
||||
{"Communities",
|
||||
"community communities",
|
||||
"org",
|
||||
"Join Tetris communities and talk with other players!\n\nChina: [QQ] Tetris Research: 112897780\nGlobal: [Discord] Hard Drop: discord.gg/harddrop (click \"Open URL\").",
|
||||
"Join Tetris communities and talk with other players!\n\nChina: [QQ] Tetris Research: 112897780\nGlobal: [Discord] Hard Drop: discord.gg/harddrop (click the globe icon to open).",
|
||||
"https://discord.gg/harddrop"
|
||||
},
|
||||
{"Mew",
|
||||
@@ -77,10 +77,15 @@ return{
|
||||
{"Tetris OL Servers",
|
||||
"tetrisonline servers",
|
||||
"org",
|
||||
"Google \"Tetris Online Poland\" for the Poland server.\nClick \"Open URL\" for information about the Tetris Online Study server.",
|
||||
"Google \"Tetris Online Poland\" for the Poland server.\nClick on the globe icon for information about the Tetris Online Study server.",
|
||||
"http://teatube.ltd/tos",
|
||||
},
|
||||
|
||||
{"P\97\116\114\101\111\110",
|
||||
"p\97\116\114\101\111\110 support",
|
||||
"org",
|
||||
"Techmino's P\97\116\114\101\111\110 Page",
|
||||
FNSF and"https://www.youtube.com/watch?v=DVl0IiUKX_g"or"https://www.p\97\116\114\101\111\110.com/techmino",
|
||||
},
|
||||
--Games
|
||||
{"TTT",
|
||||
"ttt tetris trainer tres bien",
|
||||
@@ -190,6 +195,11 @@ return{
|
||||
"game",
|
||||
"*Windows | Single-player*\nA game with all modes from TGM which you can use to practice. Has better controls than actual TGM. The world rule is slightly different, however (eg, instant-lock soft drops, and slightly different kick tables)",
|
||||
},
|
||||
{"Cambridge",
|
||||
"cambridge",
|
||||
"game",
|
||||
"*Windows, macOS, Linux | Single-player*\nA Lua-based game engine dedicated to creating a robust, easily customizable platform for creating new, custom game modes. It was originally made by Joe Zeng, and starting with version 0.1.5 on October 8, 2020, Milla took over development of the game.\n--Tetris Wiki",
|
||||
},
|
||||
|
||||
{"Tetris99",
|
||||
"t99 tetris99",
|
||||
@@ -256,7 +266,7 @@ return{
|
||||
"game",
|
||||
"Another mobile Tetris game by EA. It has two control modes – Swipe and One-Touch. It also has a Galaxy Mode besides the Marathon Mode (with gravity mechanism), and the goal of this mode is to clear all Galaxy minoes before the sequence runs out.\n\nThis game is no longer available since April 2020."
|
||||
},
|
||||
{"Tetris(N3TWORK)",
|
||||
{"Tetris (N3TWORK)",
|
||||
"tetris n3twork mobile phone",
|
||||
"game",
|
||||
"The latest mobile Tetris from N3TWORK Inc. It has a 3-minute ultra mode, a marathon mode and a Royale mode. The UI is great but its controls are not so good.",
|
||||
@@ -302,7 +312,7 @@ return{
|
||||
{"BPM",
|
||||
"bpm blocksperminute piecesperminute speed",
|
||||
"term",
|
||||
"Blocks per minute\n\tReflects playing speed of a player.\nAlso MrZ forgot that it can be called PPM to avoid confusing with the music term.",
|
||||
"Blocks per minute\n\tReflects playing speed of a player.\nAlso called PPM (to avoid confusing with the musical term).",
|
||||
},
|
||||
{"KPM",
|
||||
"kpm keysperminute keypressesperminute",
|
||||
@@ -535,7 +545,7 @@ return{
|
||||
{"IMS",
|
||||
"ims initialmovesystem",
|
||||
"term",
|
||||
"*Techmino-exclusive*\nInitial Movement System\nHolding a sideways movement key during spawn delay to spawn the piece one block off to the side. Sometimes prevents death.",
|
||||
"*Techmino-exclusive*\nInitial Movement System\nHolding a sideways movement key during spawn delay to spawn the piece one block off to the side. Sometimes prevents death.\nNote that DAS need to be full charged when new piece appear",
|
||||
},
|
||||
{"Next",
|
||||
"nextpreview",
|
||||
@@ -582,7 +592,7 @@ return{
|
||||
"term",
|
||||
"A terminology used in the Chinese Tetris community. A \"debt\" refers to a situation where one must first finish constructing a specific setup before he or she can perform one or more T-spins with real attacks. When constructing a setup where one or multiple debts are created, it is important to observe the opponent carefully to ensure your safety; otherwise, there is a high probability of topping out before the construction is finished.\n\nThis term is frequently used to describe setups such as TST tower. No real attacks can be made before the setup is constructed completely.",
|
||||
},
|
||||
{"Attacking & Defending",
|
||||
{"Attack & Defend",
|
||||
"attacking defending",
|
||||
"term",
|
||||
"Attacking: send garbage lines to your opponent by clearing lines.\nDefending: after your opponent send you lines, you offset this garbage by clearing lines.\nCounter attack: Send attack back at your opponent after offsetting incoming garbage, or taking the hit then attack back.\nIn most games, garbage offsetting is 1:1, i.e. one attack offsets one incoming garbage.",
|
||||
@@ -660,7 +670,18 @@ return{
|
||||
{"Topping out",
|
||||
"die death topout toppingout",
|
||||
"term",
|
||||
"Modern Tetris games have three different conditions in which the player tops out:\n1. Block out: when a piece spawned overlaps with the existing blocks in the field;\n2. Lock out: when a piece locks entirely above the skyline;\n3. Garbage out: when the stack exceeds 40 lines in height (often due to incoming garbage).\nTechmino does not check for locking out and garbage out.",
|
||||
"Modern Tetris games have three different conditions in which the player tops out:\n1. Block out: when a piece spawned overlaps with the existing blocks in the field;\n2. Lock out: when a piece locks entirely above the skyline;\n3. Top out: when the stack exceeds 40 lines in height (often due to incoming garbage).\nTechmino does not check for locking out and topping out.",
|
||||
},
|
||||
{"Buffer zone",
|
||||
"buffer zone above super invisible disappear",
|
||||
"term",
|
||||
"Refers to 21st-40th lines above the visible field. Because the blocks in the field could go over the visible field (this usually happens when multiple garbage lines come in) so the buffer zone was created so those blocks could go back to the field when garbage lines are cleared. Also, the buffer zone is usually located at 21st-40th lines because this is sufficient for most cases. Refer to \"Vanish Zone\" to learn more.",
|
||||
},
|
||||
{"Vanish zone",
|
||||
"vanish zone disappear gone cut die",
|
||||
"term",
|
||||
"Refers to the area located above the 40th line. This is usually realised by combining c4w and multiple garbage lines. In many games, when any block reaches the vanish zone, the game is terminated immediately.\nHowever, this area can have different behaviours in different games. Some games are flawed because the game could crash when the blocks enter the vanish zone (e.g. Tetris Online). Wierd behaviours could also happen when the blocks enter the vanish zone (you can refer to this video, click on the globe icon to open the link).\n\nFurthermore, the vanish zone in Jstris is located above the 22nd line, and any blocks locked above the 21st line will disappear. ",
|
||||
"https://youtu.be/z4WtWISkrdU",
|
||||
},
|
||||
{"Falling speed",
|
||||
"fallingspeed",
|
||||
@@ -677,11 +698,16 @@ return{
|
||||
"term",
|
||||
"Sometimes called the Entry Delay. ARE refers to the delay between the lockdown of one piece and the spawn of another piece.",
|
||||
},
|
||||
{"line ARE",
|
||||
{"Line ARE",
|
||||
"line are appearance delay",
|
||||
"term",
|
||||
"The delay between the start of a line clear animation to the spawn of the next piece.",
|
||||
},
|
||||
{"Death ARE",
|
||||
"death are die delay",
|
||||
"term",
|
||||
"(Techmino exclusive) When the spawn location of the next piece is blocked by an existing block in the field, a delay will be added in addition to the spawn ARE, and this delay is referred to as the death ARE. This mechanism can be used along with IHS and IRS to prevent death. \nOriginal idea by NOT_A_ROBOT",
|
||||
},
|
||||
{"Finesse",
|
||||
"finesse",
|
||||
"term",
|
||||
@@ -802,6 +828,16 @@ return{
|
||||
"term",
|
||||
"The block skin used by the earliest version of Tetris.\nIn the early times, computers were all using Command Line Interface instead of Graphical User Interface, so at that time a single mino in the game of Tetris is represented using two enclosing square brackets [ ]. It looks kinds of like bones so it is sometimes called the bone blocks.\nIn Techmino, bone blocks are defined as \"A single, fancy block skin that all of the blocks use.\". Different block skins may have different types of bone block styles.",
|
||||
},
|
||||
{"Semi-invisible",
|
||||
"half invisible",
|
||||
"term",
|
||||
"Refers to a rule where the tetrominoes will become invisible after a period of time.\nThis time interval is not definite and it is acceptable to describe it as \"disappear after a few seconds\".",
|
||||
},
|
||||
{"Invisible",
|
||||
"invisible",
|
||||
"term",
|
||||
"Refers to a rule where blocks will disappear instantly when locked onto the field. \nN.B. It is also acceptable to refer to an invisible mode where a disappearing animation is shown. However, this makes the game a lot easier, so in this game, the invisible mode without such animations is referred to as \"Sudden Invisible\".",
|
||||
},
|
||||
{"MPH mode",
|
||||
"mph",
|
||||
"term",
|
||||
|
||||
@@ -4,7 +4,7 @@ return{
|
||||
{"新人须知",
|
||||
"新人须知 xinren new noob readme",
|
||||
"help",
|
||||
"致想深入玩下去的新人:\n\n\t两大根本原则:\n\t\t1. 选手感好的版本(Tech/Tetr.io/Jstris/TOP/Tetr.js),别用编程练习渣版本\n\t\t2. 踏实打好基础(预判next稳定消四等),别总想着炫酷T旋,对未来发展没好处。\n\t两大主要技巧:\n\t\t1. 熟悉初始位置以及到各个位置的初始操作;\n\t\t2. 提前计算好下一块能放哪。\n\n推荐阅读专栏《给TOP新人的几点建议》\n\n[点击右下角按钮打开链接]",
|
||||
"致想深入玩下去的新人:\n\n\t两大根本原则:\n\t\t1. 选手感好的版本(Tech/Tetr.io/Jstris/TOP/Tetr.js),别用编程练习渣版本\n\t\t2. 踏实打好基础(预判next稳定消四等),别总想着炫酷T旋,对未来发展没好处。\n\t两大主要技巧:\n\t\t1. 熟悉初始位置以及到各个位置的初始操作;\n\t\t2. 提前计算好下一块能放哪。\n\n推荐阅读专栏《给TOP新人的几点建议》\n\n[点击右下角地球按钮打开链接]",
|
||||
"https://bilibili.com/read/cv2352939",
|
||||
},
|
||||
{"关于T-spin学习",
|
||||
@@ -15,7 +15,7 @@ return{
|
||||
{"游戏官网",
|
||||
"official website homepage guanwang",
|
||||
"help",
|
||||
"Techmino的官网!\n可以在上面修改头像和个人信息。",
|
||||
"Techmino的官网!\n可以在上面下载游戏本体,或者修改头像以及个人信息。\n\n游戏作者的一些话:强烈不建议在任何公开场合提及甚至宣传本游戏,更不要随便就对外公布我们的官网链接!请务必只在私下里向有基础或真的很有兴趣入坑认真玩的玩家推荐,不然很容易拉低社群质量破坏交流氛围,非常难处理,甚至有可能影响游戏的未来发展。为了保证游戏未来会变得越来越好玩,千万慎重考虑您对游戏的推广方式!感谢您对Techmino的支持!!感谢配合!!!",
|
||||
"http://home.techmino.org",
|
||||
},
|
||||
{"灰机Wiki",
|
||||
@@ -49,7 +49,7 @@ return{
|
||||
"https://four.lol",
|
||||
},
|
||||
|
||||
--相关组织
|
||||
--相关网页/组织
|
||||
{"GitHub仓库",
|
||||
"源代码 github git sourcecode yuandaima",
|
||||
"org",
|
||||
@@ -73,6 +73,12 @@ return{
|
||||
"TO-S的添加方法、说明等关于茶服的一切",
|
||||
"http://teatube.ltd/tos",
|
||||
},
|
||||
{"P\97\116\114\101\111\110",
|
||||
"赞助 p\97\116\114\101\111\110 support zanzhu daqian",
|
||||
"org",
|
||||
"Techmino的P\97\116\114\101\111\110",
|
||||
FNSF and"https://www.youtube.com/watch?v=DVl0IiUKX_g"or"https://www.p\97\116\114\101\111\110.com/techmino",
|
||||
},
|
||||
|
||||
--游戏(题库)
|
||||
{"TTT",
|
||||
@@ -167,7 +173,7 @@ return{
|
||||
|
||||
--游戏(街机/类街机)
|
||||
{"TGM",
|
||||
"俄罗斯方块大师 tgm tetrisgrandmaster",
|
||||
"俄罗斯方块大师 tgm3 tetrisgrandmaster",
|
||||
"game",
|
||||
"全称Tetris The Grand Master,一个街机平台方块系列,S13/GM等称号出自该系列,可以在Windows平台运行。\n\n其中TGM3目前玩得最普遍,部分模式说明:\n\nMaster:大师模式,有段位评价,拿到更高段位点的要求:非消一的连击和消四,字幕战中消除和通关,每100的前70小于【标准时间,上一个0~70秒数+2】中小的一个,每100总用时不能超过限定值(不然取消上一个方法的加分并反扣点数);到500若没有进标准时间会强制结束游戏(称为铁门);字幕战有两个难度,半隐和全隐,后者必须拿到几乎全部的段位点才能进,消除奖励的段位点也更多。\n\nShirase:死亡模式,类似于techmino中的20G-极限,开局就是高速20G,500和1000有铁门,500开始底下开始涨垃圾行,1000开始出现骨块,1300通关进入大方块字幕战;段位结算:每通100加1段从S1到S13,如果通关了字幕战就会有金色的S13\n\n更多内容详见链接",
|
||||
"http://teatube.ltd/TGMGUIDE/",
|
||||
@@ -187,6 +193,11 @@ return{
|
||||
"game",
|
||||
"简称Tex,一个Windows平台方块,包含TGM的所有模式,可以用来练习TGM,手感比真版较好,不足的是World规则不完全一样(如软降到底无锁延,踢墙表有细节不同等)。",
|
||||
},
|
||||
{"Cambridge",
|
||||
"剑桥 cambridge",
|
||||
"game",
|
||||
"一个Windows/macOS/Linux平台方块,是基于Lua的方块游戏引擎,致力于创建一个轻松高度自定义新模式的方块平台。最初由Joe Zeng开发,于2020.10.8日的0.1.5版开始Milla接管了开发。\n--Tetris Wiki",
|
||||
},
|
||||
|
||||
--游戏(PC/主机/手机)
|
||||
{"Techmino",
|
||||
@@ -217,7 +228,7 @@ return{
|
||||
{"Tetris Effect",
|
||||
"效应 tec tetriseffectconnect",
|
||||
"game",
|
||||
"简称TE(C),一个Windows/PS/Xbox/Oculus Quest 平台方块, 特效方块游戏,只有单机模式,手感不算太好,想看特效的可以一试, 只是去玩方块的不是很建议。\n\n有一个拓展版本 Tetris Effect: Connected 增加了联网对战, 包含普通对战, Zone 对战,经典对战和Boss战四个模式。",
|
||||
"简称TE(C),一个Windows/PS/Xbox/Oculus Quest 平台方块, 特效方块游戏,只有单机模式,手感不算太好,想看特效的可以一试, 只是去玩方块的不是很建议。\n\n有一个拓展版本 Tetris Effect: Connected 增加了联网对战, 包含普通对战, Zone 对战,经典对战和Boss战四个模式。",
|
||||
},
|
||||
{"Cultris II",
|
||||
"文艺方块 c2 cultris2 cultrisii",
|
||||
@@ -289,57 +300,57 @@ return{
|
||||
{"LPM",
|
||||
"lpm sudu",
|
||||
"term",
|
||||
"Line per Minute\n行每分,体现玩家下块速度。\n\n注:不同游戏中显示的LPM算法可能不一样,例如TO中的LPM是用PPS换算的,每1PPS=24LPM,忽略掉了垃圾行的影响,不再是字面意思,本游戏中使用L'PM代表这种换算后LPM",
|
||||
"Line Per Minute\n行每分,体现玩家下块速度。\n\n注:不同游戏中显示的LPM算法可能不一样,例如TO中的LPM是用PPS换算的,每1PPS=24LPM,忽略掉了垃圾行的影响,不再是字面意思,本游戏中使用L'PM代表这种换算后LPM",
|
||||
},
|
||||
{"PPS",
|
||||
"pps sudu",
|
||||
"term",
|
||||
"Piece per Second\n块每秒,体现玩家下块速度。",
|
||||
"Piece Per Second\n块每秒,体现玩家下块速度。",
|
||||
},
|
||||
{"BPM",
|
||||
"bpm sudu",
|
||||
"term",
|
||||
"Block per Minute\n块每分,体现玩家下块速度\n别问为什么不是PPM,问就是不知道(",
|
||||
"Block Per Minute\n块每分,体现玩家下块速度\n又称PPM(Piece Per Minute)",
|
||||
},
|
||||
{"KPM",
|
||||
"kpm sudu",
|
||||
"term",
|
||||
"Key per Minute\n按键每分,体现玩家按键速度。",
|
||||
"Key Per Minute\n按键每分,体现玩家按键速度。",
|
||||
},
|
||||
{"KPP",
|
||||
"kpp anjian",
|
||||
"term",
|
||||
"Key per Piece\n按键每块,体现玩家操作是否繁琐。\n学会极简提升操作效率以减少此数字。",
|
||||
"Key Per Piece\n按键每块,体现玩家操作是否繁琐。\n学会极简提升操作效率以减少此数字。",
|
||||
},
|
||||
{"APM",
|
||||
"apm attack gongji",
|
||||
"term",
|
||||
"Attack per Minute\n攻击每分,即玩家每分钟能打出的垃圾行数。\n一定程度体现玩家攻击力。",
|
||||
"Attack Per Minute\n攻击每分,即玩家每分钟能打出的垃圾行数。\n一定程度体现玩家攻击力。",
|
||||
},
|
||||
{"SPM",
|
||||
"spm send gongji",
|
||||
"term",
|
||||
"Send per Minute\n送出每分,即玩家每分钟实际打出去给对手的垃圾行数。\n一定程度体现玩家给对手实际造成的攻击力。",
|
||||
"Send Per Minute\n送出每分,即玩家每分钟实际打出去给对手的垃圾行数。\n一定程度体现玩家给对手实际造成的攻击力。",
|
||||
},
|
||||
{"DPM",
|
||||
"dpm dig defend",
|
||||
"term",
|
||||
"Dig/Defend per Minute\n挖掘每分,即玩家每分钟向下挖掘的垃圾行数。\n某些时候可以体现玩家生存能力。\n\n或:防御(抵消+挖掘)每分。",
|
||||
"Dig/Defend Per Minute\n挖掘每分,即玩家每分钟向下挖掘的垃圾行数。\n某些时候可以体现玩家生存能力。\n\n或:防御(抵消+挖掘)每分。",
|
||||
},
|
||||
{"RPM",
|
||||
"rpm receive jieshou",
|
||||
"term",
|
||||
"Receive per Minute\n接收每分,即玩家每分钟收到来自对手的垃圾行数。\n一定程度体现玩家被对手施加的压力。",
|
||||
"Receive Per Minute\n接收每分,即玩家每分钟收到来自对手的垃圾行数。\n一定程度体现玩家被对手施加的压力。",
|
||||
},
|
||||
{"ADPM",
|
||||
"adpm attack defend vs",
|
||||
"term",
|
||||
"Atk+Dig per Minute\n攻击+挖掘每分,用于在同一局游戏内对比玩家间水平差距,比APM更准确一些。在TETR.IO中叫VS的数据就是ADPM(调整过比例,具体是Atk + Dig per 100s)",
|
||||
"Atk+Dig Per Minute\n攻击+挖掘每分,用于在同一局游戏内对比玩家间水平差距,比APM更准确一些。在TETR.IO中叫VS的数据就是ADPM(调整过比例,具体是Atk + Dig per 100s)",
|
||||
},
|
||||
{"APL",
|
||||
"apl xiaolv",
|
||||
"term",
|
||||
"Attack per Line\n攻击每行,也叫效率,体现玩家攻击的行利用率。",
|
||||
"Attack Per Line\n攻击每行,也叫效率,体现玩家攻击的行利用率。",
|
||||
},
|
||||
|
||||
--术语(消除名)
|
||||
@@ -438,7 +449,7 @@ return{
|
||||
{"方块朝向",
|
||||
"旋转 朝向 xuanzhuan chaoxiang orientation direction 0r2l 02 20 rl lr",
|
||||
"term",
|
||||
"在SRS或者类SRS的旋转系统中需要说明方块朝向的时候,“朝下”“竖着”等词描述太模糊。\nSRS中每种方块的初始状态固定,所以我们使用0(原位)、R(右,即顺时针转一次)、2(转两下,即180°)、L(左,即逆时针转一次)四个字符表示方块的四种状态,从原位(0)开始顺时针转一圈四个状态是0R2L。\n最早见于SRS踢墙表的行首,0→L表示原位逆时针转一次到L状态,0→R表示原位顺时针转一次到R状态,2→R代表从180°状态逆时针转一次到R状态。",
|
||||
"在SRS或者类SRS的旋转系统中需要说明方块朝向的时候,“朝下”“竖着”等词描述太模糊。\nSRS中每种方块的初始状态固定,所以我们使用0(原位)、R(右,即顺时针转一次)、2(转两下,即180°)、L(左,即逆时针转一次)四个字符表示方块的四种状态,从原位(0)开始顺时针转一圈四个状态是0R2L。\n最早见于SRS踢墙表的行首,0→L表示原位逆时针转一次到L状态,0→R表示原位顺时针转一次到R状态,2→R代表从180°状态逆时针转一次到R状态。",
|
||||
},
|
||||
{"ARS",
|
||||
"旋转系统 ars rotate",
|
||||
@@ -550,7 +561,7 @@ return{
|
||||
{"IMS",
|
||||
"提前 ims initialmovesystem",
|
||||
"term",
|
||||
"Initial Move System\n提前移动系统,方块出现前提前按住移动后,出现时会朝移动方向偏一格,有时可以避免死亡(Techmino限定)。",
|
||||
"Initial Move System\n提前移动系统,方块出现前提前按住移动后,出现时会朝移动方向偏一格,有时可以避免死亡(Techmino限定)。\n注:需要块出现时das已充满",
|
||||
},
|
||||
{"Next",
|
||||
"预览 下一个 next yulan xiayige",
|
||||
@@ -600,7 +611,7 @@ return{
|
||||
{"欠债",
|
||||
"欠债 qianzhai",
|
||||
"term",
|
||||
"欠债\n指必须完全堆好才能开始转下T旋打出攻击,堆完之前T下不去的形状。对战实战中如果要做此类(中局)定式时一定要观察对手情况确保自己安全,不然可能被半途打死\n\n一般只用来描述类似双T3/T3塔的大型组合炮,堆完之前完全不能打出攻击。",
|
||||
"欠债\n指必须完全堆好才能开始转下T旋打出攻击,堆完之前T下不去的形状。对战实战中如果要做此类(中局)定式时一定要观察对手情况确保自己安全,不然可能被半途打死\n\n一般只用来描述类似双T3/T3塔的大型组合炮,堆完之前完全不能打出攻击。",
|
||||
},
|
||||
{"攻守",
|
||||
"攻守 gong shou",
|
||||
@@ -685,7 +696,18 @@ return{
|
||||
{"死亡判定",
|
||||
"死亡判定 die death siwang",
|
||||
"term",
|
||||
"现代方块普遍使用的死亡判定:\n1. 新出现的方块和场地方块有重叠(窒息,Top Out)(c4w比s4w强的原因,因为被打进18行都不会窒息);\n2. 方块锁定时完全在场地的外面(Block Out);\n3. 场地内现存方块总高度大于40。部分游戏可能没有这条判定,而是会自动“切除”场地内所有高度大于40的部分(Vanish Zone)。\n\n注:本游戏使用的死亡判定不包含上述的第二条和第三条。",
|
||||
"现代方块普遍使用的死亡判定:\n1. 新出现的方块和场地方块有重叠(窒息,Block Out)(c4w比s4w强的原因,因为被打进18行都不会窒息);\n2. 方块锁定时完全在场地的外面(Lock Out);\n3. 场地内现存方块总高度大于40。(超高,Top Out)\n\n注:本游戏使用的死亡判定不包含上述的第二条和第三条。",
|
||||
},
|
||||
{"缓冲区",
|
||||
"缓冲区 buffer zone huanchongqu",
|
||||
"term",
|
||||
"(不是所有游戏都有这个概念)指10×20可见场地之上的21~40行。因为垃圾行顶起后两边堆高的方块可能会超出屏幕,消行后这些方块要重新回到场地内所以需要保存下来,由于程序上要求场地尺寸有限(部分游戏可以无限),故设定为40,一般都够用。\n\n另见“消失区”词条。",
|
||||
},
|
||||
{"消失区",
|
||||
"消失区 vanish zone xiaoshiqu",
|
||||
"term",
|
||||
"在缓冲区的基础上,指比40行缓冲区还高的区域。\n标准的死亡判定涉及了这个概念,在垃圾行升起后如果场地上有任何方块超出了40高的缓冲区(也就是达到了消失区)时游戏直接结束。\n但事实上这块区域在不同游戏中表现不同,甚至有设计者考虑不周导致方块挪到40行以上,但是程序没考虑导致方块接触消失区直接报错闪退的游戏。通常出现在玩家堆了c4w然后被打入大量垃圾行时才会考虑这个概念。其他游戏中方块进入消失区可能直接导致游戏结束,也有可能会出现一些奇怪的bug(附带链接是ppt的复制40行无限ren视频)。\n\n另,Jstris中22行及以上可以理解为消失区,锁定在21行之外的格子会消失。",
|
||||
"https://www.bilibili.com/video/BV1ZE411Y7GD",
|
||||
},
|
||||
{"下落速度",
|
||||
"下落速度 重力 drop speed zhongli gravity",
|
||||
@@ -707,6 +729,11 @@ return{
|
||||
"term",
|
||||
"方块<锁定完成能消行时的消行动画>占据的时间,英文是line ARE。",
|
||||
},
|
||||
{"窒息延迟",
|
||||
"窒息延迟 choke are delay zhixiyanchi",
|
||||
"term",
|
||||
"当前方块锁定后如果下一块的生成位置被阻挡,那么下一块的出块延迟会被再额外加上这个延迟的值,方便使用提前系统来避免死亡\n想法来自NOT_A_ROBOT",
|
||||
},
|
||||
{"Finesse",
|
||||
"极简操作 最简操作 finesse jijiancaozuo zuijiancaozuo",
|
||||
"term",
|
||||
@@ -720,7 +747,7 @@ return{
|
||||
{"手感",
|
||||
"手感 feel shougan",
|
||||
"term",
|
||||
"决定手感的几个主要因素:\n(1) 输入延迟受设备配置或者设备状况影响。可以重启/换设备解决\n(2) 程序运行稳定性程序设计(或者实现)得不好,时不时会卡一下。把设置画面效果拉低可能可以缓解\n(3) 游戏设计故意的。自己适应\n(4) 参数设置设置不当。去改设置\n(5) 游玩姿势姿势不当。不便用力,换个姿势\n(6) 换键位或者换设备后不适应,操作不习惯。多习惯习惯,改改设置\n(7) 肌肉疲劳反应和协调能力下降。睡一觉或者做点体育运动,过段时间(也可能要几天)再来玩",
|
||||
"决定手感的几个主要因素:\n(1) 输入延迟受设备配置或者设备状况影响。可以重启/换设备解决\n(2) 程序运行稳定性程序设计(或者实现)得不好,时不时会卡一下。把设置画面效果拉低可能可以缓解\n(3) 游戏设计故意的。自己适应\n(4) 参数设置设置不当。去改设置\n(5) 游玩姿势姿势不当。不便用力,换个姿势\n(6) 换键位或者换设备后不适应,操作不习惯。多习惯习惯,改改设置\n(7) 肌肉疲劳反应和协调能力下降。睡一觉或者做点体育运动,过段时间(也可能要几天)再来玩",
|
||||
},
|
||||
{"DAS通俗",
|
||||
"das arr simple",
|
||||
@@ -760,7 +787,7 @@ return{
|
||||
{"His出块",
|
||||
"his出块 history",
|
||||
"term",
|
||||
"一种的出块方式,例如His4 Roll6 (h4r6)就是在随机生成新的 Next 的时候,随机一个跟最后4次生成的Next中有一样的,就重新随机,直到已经尝试6次或和那4个都不一样。\n本游戏的His序列模式中最大Roll次数为序列长度的一半(向上取整)\n\n是纯随机出块的一大改进,大大减小了连续出几个SZ(洪水)的概率。",
|
||||
"一种的出块方式,例如His4 Roll6 (h4r6)就是在随机生成新的 Next 的时候,随机一个跟最后4次生成的Next中有一样的,就重新随机,直到已经尝试6次或和那4个都不一样。\n本游戏的His序列模式中最大Roll次数为序列长度的一半(向上取整)\n\n是纯随机出块的一大改进,大大减小了连续出几个SZ(洪水)的概率。",
|
||||
},
|
||||
{"HisPool出块",
|
||||
"hisPool出块 history pool",
|
||||
@@ -823,12 +850,22 @@ return{
|
||||
"经典块术语,指长时间不来I方块(长条)。现代方块使用的Bag7出块规则下干旱几乎不可能,平均7块就会有一个I,理论极限两个I最远中间隔12块。",
|
||||
},
|
||||
{"骨块",
|
||||
"gukuai bone tgm",
|
||||
"骨块 gukuai bone tgm",
|
||||
"term",
|
||||
"最早的方块游戏使用的方块样式。\n很久以前的电脑没有可以显示复杂图案的屏幕,只能往上打字,所以一格方块用两个方括号[ ]表示,长得像骨头所以叫骨块。\n基于骨块的特点,本游戏把骨块重新定义为,“所有形状使用的同一个比较花眼的贴图”,不同的皮肤有不同的骨块样式。",
|
||||
},
|
||||
{"半隐",
|
||||
"半隐 banyin half semi invisible",
|
||||
"term",
|
||||
"指方块锁定经过一段时间后会变隐形的规则\n注:从锁定开始到消失的具体时长不定,可以描述为“过几秒种后消失”",
|
||||
},
|
||||
{"全隐",
|
||||
"全隐 quanyin invisible",
|
||||
"term",
|
||||
"指方块锁定后会马上完全隐藏\n注:锁定时有消失动画的话也可以叫全隐,但其实难度会小一点,故本游戏中没有动画的隐形模式叫瞬隐",
|
||||
},
|
||||
{"场地重力",
|
||||
"zhongli liansuo cascade chain",
|
||||
"重力 zhongli liansuo cascade chain",
|
||||
"term",
|
||||
"(由于“重力”有歧义所以本词典里称为场地重力,也有重力连锁等叫法。)\n部分游戏的部分模式可能包含此规则。此规则下玩家的四格方块四个方向有连接关系,连起来的几个格整体会受到重力影响,悬空了会往下落。在这个规则下可以构造复杂的连锁消除,一个主打连锁消除对战的游戏是Qudra(老游戏,现在基本没人玩)",
|
||||
},
|
||||
@@ -1121,7 +1158,7 @@ return{
|
||||
{"Jonas",
|
||||
"jonas",
|
||||
"name",
|
||||
"经典块一流玩家,曾经的经典块第一,CTWC4连冠\n(1981-2021)",
|
||||
"经典块一流玩家,曾经的经典块第一,CTWC4连冠\n(1981-2021)",
|
||||
},
|
||||
{"Joseph",
|
||||
"joseph",
|
||||
@@ -1131,7 +1168,7 @@ return{
|
||||
{"Kazu",
|
||||
"kazu mdking",
|
||||
"name",
|
||||
"(也叫“GAMEOVER” “GAMAOVER” “GAME_OVER_RETRY”)\n一流玩家,以熟练md转捐赠闻名(雾)。",
|
||||
"(也叫“GAMEOVER” “GAMAOVER” “GAME_OVER_RETRY”)\n一流玩家,以熟练md转捐赠闻名(雾)。",
|
||||
},
|
||||
{"Microblizz",
|
||||
"microblizz",
|
||||
|
||||
@@ -194,7 +194,9 @@ return{
|
||||
"Make sure to get the game only from official sources,",
|
||||
"as we can't make sure you're safe if you got it elsewhere.",
|
||||
"The author is not responsible for any modifications.",
|
||||
"While the game is free, donations are appreciated."
|
||||
FNSF and"/"or"While the game is free, donations are appreciated.",
|
||||
FNSF and"/"or"If you are unable to use both WeChat Pay and AliPay,",
|
||||
FNSF and"/"or"you can go to our P\97\116\114\101\111\110 page (Link in Zictionary) to support us!",
|
||||
},
|
||||
staff={
|
||||
"Author: MrZ Email: 1046101471@qq.com",
|
||||
@@ -208,7 +210,7 @@ return{
|
||||
"Translations: User670, MattMayuga, Mizu, Mr.Faq, ScF, C₂₉H₂₅N₃O₅",
|
||||
"",
|
||||
"Special Thanks:",
|
||||
"Flyz, Big_True, NOT-A-ROBOT, 思竣, yuhao7370",
|
||||
"Flyz, Big_True, NOT_A_ROBOT, 思竣, yuhao7370",
|
||||
"Farter, Teatube, 蕴空之灵, T9972, [All test staff]",
|
||||
},
|
||||
used=[[
|
||||
@@ -224,7 +226,6 @@ return{
|
||||
simple-love-lights [dylhunn]
|
||||
]],
|
||||
support="Support the author",
|
||||
group="Join our Discord: discord.gg/f9pUvkh",
|
||||
WidgetText={
|
||||
main={
|
||||
offline="Single Player",
|
||||
@@ -308,6 +309,7 @@ return{
|
||||
|
||||
eventSet="Rule Set",
|
||||
|
||||
holdMode="Hold Mode",
|
||||
nextCount="Next",
|
||||
holdCount="Hold",
|
||||
infHold="Infinite Hold",
|
||||
@@ -367,7 +369,7 @@ return{
|
||||
score="Score Pop-Ups",
|
||||
bufferWarn="Buffer Alerts",
|
||||
showSpike="Spike Counter",
|
||||
nextPos="Next Preview",
|
||||
nextPos="Spawn Preview",
|
||||
highCam="Screen Scrolling",
|
||||
warn="Danger Alerts",
|
||||
|
||||
@@ -476,6 +478,7 @@ return{
|
||||
lock="Lock Delay",
|
||||
wait="Entry Delay",
|
||||
fall="Line Delay",
|
||||
hang="Death Delay",
|
||||
|
||||
bg="Background",
|
||||
bgm="Music",
|
||||
@@ -701,6 +704,9 @@ return{
|
||||
['master_final']= {"Master", "FINAL", "20G and beyond"},
|
||||
['master_ph']= {"Master", "PHANTASM", "???"},
|
||||
['master_ex']= {"GrandMaster", "EXTRA", "An eternity shorter than an instant"},
|
||||
['strategy_e']= {"Strategy", "EASY", "Fast 20G decision"},
|
||||
['strategy_h']= {"Strategy", "HARD", "Fast 20G decision"},
|
||||
['strategy_u']= {"Strategy", "ULTIMATE", "Fast 20G decision"},
|
||||
['blind_e']= {"Invisible", "HALF", "For novices"},
|
||||
['blind_n']= {"Invisible", "ALL", "For intermediates"},
|
||||
['blind_h']= {"Invisible", "SUDDEN", "For the experienced"},
|
||||
@@ -749,7 +755,7 @@ return{
|
||||
['sprintEff']= {"Sprint", "Efficiency", "Send more attack in 40lines!"},
|
||||
['zen']= {'Zen', "200", "A 200-line run without a time limit"},
|
||||
['ultra']= {'Ultra', "EXTRA", "A 2-minute score attack"},
|
||||
['infinite']= {'infinite', "", "Just a sandbox"},
|
||||
['infinite']= {"Infinite", "", "Just a sandbox"},
|
||||
['infinite_dig']= {"Infinite: Dig", "", "Dig-diggin'-dug"},
|
||||
['marathon_inf']= {"Marathon", "INFINITE", "Infinite marathon."},
|
||||
|
||||
|
||||
@@ -160,7 +160,9 @@ return{
|
||||
"Descarga disponible únicamente vía el grupo de testeo y discord.gg/f9pUvkh",
|
||||
"Descargas desde otros sitios pueden contener malware/viruses, y en smartphones sólo requiere permisos de internet y vibración.",
|
||||
"El autor no se responabiliza por daños ocasionados debido a modificaciones del juego.",
|
||||
"Por favor descarga las últimas versiones desde los sitios oficiales. El juego es gratuito",
|
||||
FNSF and"/"or"Por favor descarga las últimas versiones desde los sitios oficiales. El juego es gratuito",
|
||||
FNSF and"/"or"Si no puede usar WeChat Pay y AliPay,",
|
||||
FNSF and"/"or"puede ir a nuestra página de P\97\116\114\101\111\110 para apoyarnos.",
|
||||
},
|
||||
staff={
|
||||
"Autor:MrZ Email: 1046101471@qq.com",
|
||||
@@ -174,7 +176,7 @@ return{
|
||||
"Traducción: User670, MattMayuga, Mizu, Mr.Faq, ScF, C₂₉H₂₅N₃O₅",
|
||||
"",
|
||||
"Agradecimientos:",
|
||||
"Flyz, Big_True, NOT-A-ROBOT, 思竣, yuhao7370",
|
||||
"Flyz, Big_True, NOT_A_ROBOT, 思竣, yuhao7370",
|
||||
"Farter, Teatube, 蕴空之灵, T9972, [Todo el Staff de Testeo]",
|
||||
},
|
||||
used=[[
|
||||
@@ -190,7 +192,6 @@ return{
|
||||
simple-love-lights [dylhunn]
|
||||
]],
|
||||
support="Apoyen al Autor",
|
||||
group="Grupo Oficial de QQ (si no lo hackean) : 913154753",
|
||||
WidgetText={
|
||||
main={
|
||||
offline="1 Jugador",
|
||||
@@ -334,7 +335,7 @@ return{
|
||||
score="Puntaje en Pantalla",
|
||||
bufferWarn="Alerta de Búfer",
|
||||
showSpike="Contador de Spike",
|
||||
nextPos="Ver Spawn de Pza. Sig.",
|
||||
-- nextPos="Spawn Preview",
|
||||
highCam="Cám. Vista Aérea",
|
||||
warn="Alerta de Peligro",
|
||||
|
||||
@@ -442,6 +443,7 @@ return{
|
||||
lock="Retraso de Bloqueo",
|
||||
wait="Retraso de Spawneo",
|
||||
fall="Retraso de Línea",
|
||||
-- hang="Death Delay",
|
||||
|
||||
bg="Fondo",
|
||||
bgm="Música",
|
||||
@@ -659,6 +661,9 @@ return{
|
||||
-- ['master_m']= {"Master", "M21", "For 20G Masters."},
|
||||
['master_final']= {"Master", "FINAL", "El verdadero 20G Supremo: el final es inalcanzable."},
|
||||
['master_ex']= {"GrandMaster", "EXTRA", "Para ser un gran maestro, acepta este desafío"},
|
||||
-- ['strategy_e']= {"Strategy", "EASY", "Fast 20G decision"},
|
||||
-- ['strategy_h']= {"Strategy", "HARD", "Fast 20G decision"},
|
||||
-- ['strategy_u']= {"Strategy", "ULTIMATE", "Fast 20G decision"},
|
||||
['blind_e']= {"A Ciegas", "Parcial", "Para novatos."},
|
||||
['blind_n']= {"A Ciegas", "Total", "Para jugadores intermedios."},
|
||||
['blind_h']= {"A Ciegas", "Inmediato", "Para jugadores experimentados"},
|
||||
|
||||
@@ -160,7 +160,9 @@ return{
|
||||
"Ce jeu est gratuit et est uniquement disponible via discord.gg/f9pUvkh",
|
||||
"Ne téléchargez pas ce jeu depuis une autre source au risque d'avoir des virus,",
|
||||
"et vous n'avez besoin que des permissions de vibration et de communication réseau pour les versions mobiles !",
|
||||
"Le créateur n'est pas responsable pour n'importe quel type de perte de données suite à une modification du jeu.",
|
||||
FNSF and"/"or"Le créateur n'est pas responsable pour n'importe quel type de perte de données suite à une modification du jeu.",
|
||||
FNSF and"/"or"Si vous ne parvenez pas à utiliser à la fois WeChat Pay et AliPay,",
|
||||
FNSF and"/"or"vous pouvez vous rendre sur notre page P\97\116\114\101\111\110 pour nous soutenir !",
|
||||
},
|
||||
staff={
|
||||
"Author: MrZ E-mail: 1046101471@qq.com",
|
||||
@@ -174,7 +176,7 @@ return{
|
||||
"Traduction: User670, MattMayuga, Mizu, Mr.Faq, ScF, C₂₉H₂₅N₃O₅",
|
||||
"",
|
||||
"Merci à:",
|
||||
"Flyz, Big_True, NOT-A-ROBOT, 思竣, yuhao7370",
|
||||
"Flyz, Big_True, NOT_A_ROBOT, 思竣, yuhao7370",
|
||||
"Farter, Teatube, 蕴空之灵, T9972, [All test staff]",
|
||||
},
|
||||
used=[[
|
||||
@@ -190,7 +192,6 @@ return{
|
||||
simple-love-lights [dylhunn]
|
||||
]],
|
||||
support="Aider le créateur",
|
||||
group="Groupe QQ officiel : 913154753",
|
||||
WidgetText={
|
||||
main={
|
||||
-- offline="Solo",
|
||||
@@ -332,7 +333,7 @@ return{
|
||||
score="Pop-up de score",
|
||||
-- bufferWarn="Buffer Alert",
|
||||
-- showSpike="Spike Counter",
|
||||
nextPos="Prévisualisation de position",
|
||||
-- nextPos="Spawn Preview",
|
||||
highCam="Vue d'oiseau",
|
||||
warn="Alerte de danger",
|
||||
|
||||
@@ -443,6 +444,7 @@ return{
|
||||
lock="Délai de verrouillage",
|
||||
wait="Délai d'apparition",
|
||||
fall="Délai de ligne",
|
||||
-- hang="Death Delay",
|
||||
|
||||
bg="Arrière-plan",
|
||||
bgm="Musique",
|
||||
@@ -663,6 +665,9 @@ return{
|
||||
['master_final']= {"Master", "FINAL", "20G : Un point final impossible à atteindre !"},
|
||||
-- ['master_ph']= {"Mester", "FANTASMA", "20G: ???"},
|
||||
['master_ex']= {"GrandMaster", "EXTRA", "Tentez de devenir un Grandmaster."},
|
||||
-- ['strategy_e']= {"Strategy", "EASY", "Fast 20G decision"},
|
||||
-- ['strategy_h']= {"Strategy", "HARD", "Fast 20G decision"},
|
||||
-- ['strategy_u']= {"Strategy", "ULTIMATE", "Fast 20G decision"},
|
||||
['blind_e']= {"Aveugle", "MOITIE", "Pour les novices."},
|
||||
['blind_n']= {"Aveugle", "TOUT", "Pour les joueurs intermédiaires."},
|
||||
['blind_h']= {"Aveugle", "SOUDAIN", "Pour les bons jooeurs."},
|
||||
|
||||
@@ -177,12 +177,14 @@ return{
|
||||
"Isso é apenas um jogo de blocos, nada de especial.",
|
||||
"Joga como C2/IO/JS/WWC/KOS e outros.",
|
||||
"",
|
||||
"Feito na Love 2D Engine",
|
||||
"Feito na LÖVE 2D Engine",
|
||||
"Por favor mande bugs ou sugestões para o autor.",
|
||||
"certifique-se de pegar o jogo de fontes oficiais;",
|
||||
"binários obtidos em outros lugares pode conter malware.",
|
||||
"O autor não é responsável por qualquer binários modificados",
|
||||
"O jogo é gratis, mas doações são apreciadas."
|
||||
FNSF and"/"or"O jogo é gratis, mas doações são apreciadas.",
|
||||
FNSF and"/"or"Se você não conseguir usar o WeChat Pay e o AliPay,",
|
||||
FNSF and"/"or"pode acessar a página do P\97\116\114\101\111\110 para nos ajudar!",
|
||||
},
|
||||
staff={
|
||||
"Author: MrZ E-mail: 1046101471@qq.com",
|
||||
@@ -196,7 +198,7 @@ return{
|
||||
"Traduzir: User670, MattMayuga, Mizu, Mr.Faq, ScF, C₂₉H₂₅N₃O₅",
|
||||
"",
|
||||
"Special Thanks:",
|
||||
"Flyz, Big_True, NOT-A-ROBOT, 思竣, yuhao7370",
|
||||
"Flyz, Big_True, NOT_A_ROBOT, 思竣, yuhao7370",
|
||||
"Farter, Teatube, 蕴空之灵, T9972, [All test staff]",
|
||||
},
|
||||
used=[[
|
||||
@@ -212,7 +214,6 @@ return{
|
||||
simple-love-lights [dylhunn]
|
||||
]],
|
||||
support="Support author",
|
||||
group="Junte-se ao nosso Discord: discord.gg/f9pUvkh",
|
||||
WidgetText={
|
||||
main={
|
||||
offline="Solo",
|
||||
@@ -356,7 +357,7 @@ return{
|
||||
score="Pop-up de pontos",
|
||||
-- bufferWarn="Buffer Alert",
|
||||
-- showSpike="Spike Counter",
|
||||
nextPos="Próxima Pos.",
|
||||
-- nextPos="Spawn Preview",
|
||||
highCam="Vista Olho-de-pássaro",
|
||||
warn="Alerta de perigo",
|
||||
|
||||
@@ -465,6 +466,7 @@ return{
|
||||
lock="Delay Trava",
|
||||
wait="Delay Entrada",
|
||||
fall="Delay Linha",
|
||||
-- hang="Death Delay",
|
||||
|
||||
bg="Fundo",
|
||||
bgm="Música",
|
||||
@@ -693,6 +695,9 @@ return{
|
||||
['master_final']= {"Mestre", "FINAL", "20G: Final inalcançável!"},
|
||||
['master_ph']= {"Mestre", "FANTASMA", "20G: ???"},
|
||||
['master_ex']= {"GrandMaster", "EXTRA", "Para ser um Grand Master, aceite \nesse desafio."},
|
||||
-- ['strategy_e']= {"Strategy", "EASY", "Fast 20G decision"},
|
||||
-- ['strategy_h']= {"Strategy", "HARD", "Fast 20G decision"},
|
||||
-- ['strategy_u']= {"Strategy", "ULTIMATE", "Fast 20G decision"},
|
||||
['blind_e']= {"Cego", "METADE", "Para novatos."},
|
||||
['blind_n']= {"Cego", "TUDO", "Para intermediários."},
|
||||
['blind_h']= {"Cego", "DE REPENTE", "Para experientes."},
|
||||
|
||||
@@ -1,6 +1,23 @@
|
||||
return{
|
||||
fallback='en',
|
||||
|
||||
loadText={
|
||||
loadSFX="#!#",
|
||||
loadSample="#~#",
|
||||
loadVoice="#<()==)#",
|
||||
loadFont="#Aa#",
|
||||
loadModeIcon="#[ ]#",
|
||||
loadMode="#[…]#",
|
||||
loadOther="#…#",
|
||||
finish="&",
|
||||
},
|
||||
|
||||
sureQuit="X?",
|
||||
sureReset="R?",
|
||||
newDay="→→!→→",
|
||||
playedLong="→→→→!, XX□XX!",
|
||||
playedTooMuch="→→→→→→→→→→→!, XX□XX!!!!!!!",
|
||||
|
||||
atkModeName={"?","( )","!","←→"},
|
||||
royale_remain="$1 ~",
|
||||
cmb={nil,"!","!!","!!!","!!!!","!!!!!","!!!!!!","!!!!!!!","!!!!!!!!","!!!!!!!!!","!!!!!!!!!!","!!!!!!!!!!!","!!!!!!!!!!!!","!!!!!!!!!!!!!","!!!!!!!!!!!!!!","!!!!!!!!!!!!!!!","!!!!!!!!!!!!!!!!","!!!!!!!!!!!!!!!!!","!!!!!!!!!!!!!!!!!!","!!!!!!!!!!!!!!!!!!!","!!!!!!!!!!!!!!!!!!!!",},
|
||||
@@ -97,12 +114,15 @@ return{
|
||||
"□!!~~~,□□□□X",
|
||||
"□!!==*/*/*/*/*~",
|
||||
"",
|
||||
"Powered by LÖVE",
|
||||
"Any suggestions or bug reports are appreciated!",
|
||||
"Make sure to only obtain the game from official sources;",
|
||||
"We can't make sure you're safe if you got it elsewhere.",
|
||||
"The author is not responsible for any modified binaries.",
|
||||
"While the game is free, donations are appreciated."
|
||||
"\\LÖVE/",
|
||||
"(≡≡≡)/(XXX↑↑) : )",
|
||||
"↓↓[=]↓↓ OK!",
|
||||
"↓↓……↓↓(!!!)",
|
||||
"MrZ XXX A→B",
|
||||
"",
|
||||
"□$X, ↑$↑ XD!",
|
||||
"C0, 支 XXX,",
|
||||
"|^O : )",
|
||||
},
|
||||
WidgetText={
|
||||
main={
|
||||
@@ -351,6 +371,7 @@ return{
|
||||
lock="↓_",
|
||||
wait="→=",
|
||||
fall="↓=",
|
||||
hang=":(=",
|
||||
|
||||
bg="{~}",
|
||||
bgm="(~)",
|
||||
|
||||
@@ -226,10 +226,13 @@ return{fallback='zh',
|
||||
['round_u']= {"回合制", "极限", "下棋"},
|
||||
['master_n']= {"大师", "普通", "无脑20G"},
|
||||
['master_h']= {"大师", "困难", "简单20G"},
|
||||
['master_m']= {"大师", "M21", "一般20G"},
|
||||
['master_m']= {"大师", "M21", "一般20G"},
|
||||
['master_final']= {"大师", "终点", "真正的20G"},
|
||||
['master_ph']= {"大师", "虚幻", "好玩的20G"},
|
||||
['master_ex']= {"宗师", "EX", "考试20G"},
|
||||
['master_ex']= {"宗师", "EX", "考试20G"},
|
||||
['strategy_e']= {"策略堆叠", "简单", "有区别吗"},
|
||||
['strategy_h']= {"策略堆叠", "困难", "没区别吧"},
|
||||
['strategy_u']= {"策略堆叠", "极限", "没区别"},
|
||||
['blind_e']= {"隐形", "半隐", "谁都能玩"},
|
||||
['blind_n']= {"隐形", "全隐", "稍加练习即可"},
|
||||
['blind_h']= {"隐形", "瞬隐", "和上一个一样"},
|
||||
|
||||
@@ -191,10 +191,12 @@ return{
|
||||
"",
|
||||
"使用LÖVE引擎",
|
||||
"错误或者建议请附带截图发送到内测群或者作者邮箱~",
|
||||
"仅通过内测qq群/discord群进行免费下载/更新",
|
||||
"仅通过官网 home.techmino.org 免费下载/更新",
|
||||
"其他渠道获得游戏皆有被修改/加广告/植入病毒的风险,程序只申请了振动&联网权限!",
|
||||
"若由于被修改的本游戏产生的各种损失作者不负责(我怎么负责啊跟我有啥关系)",
|
||||
"请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~记得备注id,方便记录!",
|
||||
"若由于被修改的本游戏产生的各种损失作者不负责(怎么负责啊我又没法管)",
|
||||
FNSF and"/"or"请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
|
||||
FNSF and"/"or"记得备注id备注id备注id,不然可能会没法记录到赞助列表!",
|
||||
FNSF and"/"or"你也可以去我们的P\97\116\114\101\111\110页面(链接见小Z词典)来支持我们!",
|
||||
},
|
||||
staff={
|
||||
"作者:MrZ 邮箱:1046101471@qq.com",
|
||||
@@ -208,7 +210,7 @@ return{
|
||||
"翻译: User670,MattMayuga,Mizu,Mr.Faq,ScF,C₂₉H₂₅N₃O₅",
|
||||
"",
|
||||
"特别感谢:",
|
||||
"Flyz,Big_True,NOT-A-ROBOT,思竣,yuhao7370",
|
||||
"Flyz,Big_True,NOT_A_ROBOT,思竣,yuhao7370",
|
||||
"Farter,Teatube,蕴空之灵,T9972,[All test staff]",
|
||||
},
|
||||
used=[[
|
||||
@@ -224,7 +226,6 @@ return{
|
||||
simple-love-lights [dylhunn]
|
||||
]],
|
||||
support="支持作者",
|
||||
group="官方QQ群:913154753",
|
||||
WidgetText={
|
||||
main={
|
||||
offline="单机游戏",
|
||||
@@ -476,6 +477,7 @@ return{
|
||||
lock="锁定延迟",
|
||||
wait="出块等待",
|
||||
fall="消行延迟",
|
||||
hang="窒息延迟",
|
||||
|
||||
bg="背景",
|
||||
bgm="音乐",
|
||||
@@ -705,6 +707,9 @@ return{
|
||||
['master_final']= {"大师", "终点", "究极20G:无法触及的终点"},
|
||||
['master_ph']= {"大师", "虚幻", "虚幻20G:???"},
|
||||
['master_ex']= {"宗师", "EX", "成为方块大师"},
|
||||
['strategy_e']= {"策略堆叠", "简单", "20G堆叠中速决策练习"},
|
||||
['strategy_h']= {"策略堆叠", "困难", "20G堆叠快速决策练习"},
|
||||
['strategy_u']= {"策略堆叠", "极限", "20G堆叠极速决策练习"},
|
||||
['blind_e']= {"隐形", "半隐", "不强大脑"},
|
||||
['blind_n']= {"隐形", "全隐", "挺强大脑"},
|
||||
['blind_h']= {"隐形", "瞬隐", "很强大脑"},
|
||||
@@ -810,7 +815,7 @@ return{
|
||||
"别看攻击效率不高,其实消四还是很强的",
|
||||
"别问游戏名怎么取的,问就是随便想的",
|
||||
"不同人打40行最合适的方式不一样,s1w/63/散消/s2w……",
|
||||
"不同游戏(甚至不同模式)中不同战术的能力都不一样,并没有绝对的强弱之分",
|
||||
"不同游戏(甚至不同模式)中不同战术的强度都不一样,并不能简单的按顺序排名",
|
||||
"不希望激烈的零和竞争充斥整个游戏",
|
||||
"不要悲伤,不要心急",
|
||||
"不要大力拍打或滑动哦",
|
||||
@@ -826,8 +831,8 @@ return{
|
||||
"触发游戏报错后日志文件会越来越大(不过顶多几百K)",
|
||||
"触摸板打osu也很好!",
|
||||
"凑数tip什么时候能站起来!",
|
||||
"打对战前请确认自己有一定的水平,不然会毫无游戏体验的",
|
||||
"打好块跟学习一样没有捷径,多练。",
|
||||
"打网络对战前请确认自己有一定的水平,不然会毫无游戏体验的",
|
||||
"大概还是有人会看tip的",
|
||||
"大量使用开局定式的数据是不准的",
|
||||
"大陆的方块社区起步晚,所以世界级高手很少……下一个会是你吗?",
|
||||
@@ -839,7 +844,7 @@ return{
|
||||
"电脑游玩自带按键显示~",
|
||||
"对编程有真·兴趣推荐Lua,安装无脑 语法简单 执行速度快 远离枯燥学校编程(雾",
|
||||
"对战模式跟单机模式有本质区别,timing等能力需要专门练习",
|
||||
"多年小游戏玩家表示痛恨假加载,启动动画主要是在加载资源",
|
||||
"多年小游戏玩家表示痛恨故意拖时间的假加载",
|
||||
"多hold现代块又回来了!",
|
||||
"俄罗斯方块完全可以作为电竞游戏",
|
||||
"发现有个“隐形”皮肤了吗",
|
||||
@@ -847,14 +852,14 @@ return{
|
||||
"方块不能吃",
|
||||
"方块不是你生活的全部,适当走出去看看",
|
||||
"方块教会我们,合群了就会消失,……",
|
||||
"方块默认出现的方向都是重心在下哦",
|
||||
"方块默认出现的方向都是重心在下哦(如果你没乱动设置",
|
||||
"方块能吃吗",
|
||||
"分数一般只是好看的没有实际用途,建议只关心关卡要求",
|
||||
"服务器随时爆炸",
|
||||
"感觉明明按键了但是没反应?你真的按到了吗?",
|
||||
"感觉自己速度到上限了?试着把das调低一点",
|
||||
"感谢群友帮忙想tip",
|
||||
"感谢Orzmic为这个tip显示框提出意见",
|
||||
"感谢Orzmic为这个tip框提供修改意见",
|
||||
"感谢Phigros提供部分tip模板",
|
||||
"刚接触方块的话多玩玩就行,40行两分钟以外没啥好针对性练习的",
|
||||
"刚开始练全隐形可以尽量堆平,留一列消四",
|
||||
@@ -895,8 +900,9 @@ return{
|
||||
"快去打一把100%极简看看会怎样",
|
||||
"锟斤拷锟斤拷锟斤拷",
|
||||
"来学编程,好玩的",
|
||||
"老牌益智游戏了属于是",
|
||||
"连续pc有大量知识要背,不过背出来后随手10连pc不是问题",
|
||||
"六连块总共有……?那不重要,不会做的",
|
||||
"六连块总共有……?那不重要,不会做的(大概",
|
||||
"论如何正确使用Unicode私用区定制字体",
|
||||
"卖弱和谦虚不是一回事,发言前三思呀",
|
||||
"卖弱禁言警告",
|
||||
|
||||
@@ -119,6 +119,9 @@ return{
|
||||
['master_final']= {"大师", "终点", "究极20G:无法触及的终点"},
|
||||
['master_ph']= {"大师", "虚幻", "虚幻20G:???"},
|
||||
['master_ex']= {"宗师", "EX", "成为方块大师"},
|
||||
['strategy_e']= {"策略堆叠", "简单", "20G堆叠中速决策练习"},
|
||||
['strategy_h']= {"策略堆叠", "困难", "20G堆叠快速决策练习"},
|
||||
['strategy_u']= {"策略堆叠", "极限", "20G堆叠极速决策练习"},
|
||||
['blind_e']= {"隐形", "半隐", "不强大脑"},
|
||||
['blind_n']= {"隐形", "全隐", "挺强大脑"},
|
||||
['blind_h']= {"隐形", "瞬隐", "很强大脑"},
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
local C=COLOR
|
||||
return{
|
||||
fallback='zh',
|
||||
loadText={
|
||||
@@ -23,7 +22,7 @@ return{
|
||||
cmb={nil,"1连击","2连击","3连击","4连击","5连击","6连击","7连击","8连击","9连击","10连击!","11连击!","12连击!","13连击!","14连击!","15连击!","16连击!","17连击!","18连击!","19连击!","巨大连击"},
|
||||
spin="-旋转",
|
||||
clear={"单身的","双重的","三倍的","技术崩溃","五角碰撞","六面体碎裂","七冲击","八度碰撞","非碰撞","十点崩溃","不祥","十二面体碰撞","三十年代的崩溃","十四烷","十五烷碰撞","十六进制","七烷酸","十八进制崩溃","非十进制碰撞","超级崩溃","冒牌货"},
|
||||
cleared="",
|
||||
cleared="$1 线",
|
||||
mini="迷你",b2b="背靠背",b3b="背靠背靠背",
|
||||
PC="清清楚楚",HPC="半完美清晰",
|
||||
replaying="[重播]",
|
||||
@@ -193,7 +192,9 @@ return{
|
||||
"确保只从官方渠道获得游戏,",
|
||||
"因为如果你在别处找到它,我们无法确保你的安全",
|
||||
"作者不对任何修改负责",
|
||||
"虽然游戏是免费的,但我们会感谢捐赠.",
|
||||
FNSF and"/"or"虽然游戏是免费的,但我们会感谢捐赠.",
|
||||
FNSF and"/"or"如果您无法同时使用我们的聊天支付和阿里支付,",
|
||||
FNSF and"/"or"你可以去我们的P\97\116\114\111\110页面(连接到四联词典)支持我们!",
|
||||
},
|
||||
staff={
|
||||
"作者:Z先生 邮箱:1046101471@qq.com",
|
||||
@@ -223,7 +224,6 @@ return{
|
||||
simple-love-lights [dylhunn]
|
||||
]],
|
||||
support="供养作者!",
|
||||
group="加入我们的不谐和:不谐和.gg/f9pUvkh",
|
||||
WidgetText={
|
||||
main={
|
||||
offline="单人",
|
||||
@@ -367,7 +367,7 @@ return{
|
||||
score="分数弹出",
|
||||
bufferWarn="缓冲区警报",
|
||||
showSpike="尖峰计数器",
|
||||
nextPos="下次预览",
|
||||
nextPos="繁殖预览",
|
||||
highCam="屏幕滚动",
|
||||
warn="危险警报",
|
||||
|
||||
@@ -476,6 +476,7 @@ return{
|
||||
lock="锁定延迟",
|
||||
wait="进入延迟",
|
||||
fall="线路延迟",
|
||||
hang="毁灭延迟",
|
||||
|
||||
bg="背景",
|
||||
bgm="音乐",
|
||||
@@ -702,6 +703,9 @@ return{
|
||||
['master_final']= {"主人", "最终", "20G及以上"},
|
||||
['master_ph']= {"主人", "幻觉", "???"},
|
||||
['master_ex']= {"大师", "额外的", "比瞬间还短的永恒"},
|
||||
['strategy_e']= {"策略堆叠", "简单", "20G堆叠中速决策练习"},
|
||||
['strategy_h']= {"策略堆叠", "困难", "20G堆叠快速决策练习"},
|
||||
['strategy_u']= {"策略堆叠", "极限", "20G堆叠极速决策练习"},
|
||||
['blind_e']= {"看不见的", "一半", "对于新手来说"},
|
||||
['blind_n']= {"看不见的", "全部", "对于中间产品"},
|
||||
['blind_h']= {"看不见的", "突然", "对于有经验的人"},
|
||||
|
||||
@@ -194,7 +194,8 @@ return{
|
||||
"僅透過內測QQ群/discord伺服器進行免費下載/更新",
|
||||
"從其他渠道獲得遊戲皆有被修改/加入廣告/植入病毒的風險,程序只申請了振動&網路權限!",
|
||||
"若由於被修改的本遊戲產生的各種損失作者概不負責(我怎麼負責啊跟我有什麼關係)",
|
||||
"請從正規途徑獲得最新版,遊戲現為免費,不過有讚賞當然感謝啦~ 記得備註用戶名,方便記錄!",
|
||||
FNSF and"/"or"請從正規途徑獲得最新版,遊戲現為免費,不過有讚賞當然感謝啦~ 記得備註用戶名,方便記錄!",
|
||||
FNSF and"/"or"如果你不使用微信或支付寶,你可以前往我們的P\97\116\114\101\111\110頁面來贊助我們!"
|
||||
},
|
||||
staff={
|
||||
"作者:MrZ 電郵:1046101471@qq.com",
|
||||
@@ -208,7 +209,7 @@ return{
|
||||
"翻譯: User670,MattMayuga,Mizu,Mr.Faq,ScF,C₂₉H₂₅N₃O₅",
|
||||
"",
|
||||
"特別感謝:",
|
||||
"Flyz,Big_True,NOT-A-ROBOT,思竣,yuhao7370",
|
||||
"Flyz,Big_True,NOT_A_ROBOT,思竣,yuhao7370",
|
||||
"Farter,Teatube,蕴空之灵,T9972,[All test staff]",
|
||||
},
|
||||
used=[[
|
||||
@@ -224,7 +225,6 @@ return{
|
||||
simple-love-lights [dylhunn]
|
||||
]],
|
||||
support="支持作者",
|
||||
group="官方QQ群:913154753",
|
||||
WidgetText={
|
||||
main={
|
||||
offline="單人遊戲",
|
||||
@@ -476,6 +476,7 @@ return{
|
||||
lock="鎖定延遲",
|
||||
wait="方塊生成等待",
|
||||
fall="行清除延遲",
|
||||
hang="死亡延遲",
|
||||
|
||||
bg="背景",
|
||||
bgm="音樂",
|
||||
@@ -705,6 +706,9 @@ return{
|
||||
['master_final']= {"大師", "究極", "究極20G:無法觸及的終點"},
|
||||
['master_ph']= {"大師", "虛幻", "虛幻20G:???"},
|
||||
['master_ex']= {"宗師", "EX", "成為方塊大師"},
|
||||
['strategy_e']= {"策略堆疊", "簡單", "20G堆疊中速決策練習"},
|
||||
['strategy_h']= {"策略堆疊", "困難", "20G堆疊快速決策練習"},
|
||||
['strategy_u']= {"策略堆疊", "極限", "20G堆疊極速決策練習"},
|
||||
['blind_e']= {"隱形", "半隱", "不強大腦"},
|
||||
['blind_n']= {"隱形", "全隱", "挺強大腦"},
|
||||
['blind_h']= {"隱形", "瞬隱", "很強大腦"},
|
||||
|
||||
@@ -39,13 +39,17 @@ return{
|
||||
{name='round_l', x=-1200, y=-800, size=40,shape=1,icon="round", unlock={'round_u'}},
|
||||
{name='round_u', x=-1400, y=-800, size=40,shape=1,icon="round"},
|
||||
|
||||
{name='master_n', x=0, y=-1000, size=40,shape=1,icon="master", unlock={'master_h'}},
|
||||
{name='master_n', x=0, y=-1000, size=40,shape=1,icon="master", unlock={'master_h','strategy_e'}},
|
||||
{name='master_h', x=0, y=-1200, size=40,shape=3,icon="master", unlock={'master_final','master_ex','master_ph','master_m'}},
|
||||
{name='master_m', x=150, y=-1320, size=30,shape=3,icon="master"},
|
||||
{name='master_final', x=0, y=-1600, size=40,shape=2,icon="master"},
|
||||
{name='master_ph', x=-150, y=-1500, size=40,shape=2,icon="master"},
|
||||
{name='master_ex', x=150, y=-1500, size=40,shape=2,icon="master_ex"},
|
||||
|
||||
{name='strategy_e', x=-150, y=-1100, size=40,shape=3,icon="master", unlock={'strategy_h'}},
|
||||
{name='strategy_h', x=-250, y=-1200, size=35,shape=3,icon="master", unlock={'strategy_u'}},
|
||||
{name='strategy_u', x=-350, y=-1300, size=30,shape=3,icon="master"},
|
||||
|
||||
{name='blind_e', x=150, y=-700, size=40,shape=1,icon="hidden", unlock={'blind_n'}},
|
||||
{name='blind_n', x=150, y=-800, size=40,shape=1,icon="hidden", unlock={'blind_h'}},
|
||||
{name='blind_h', x=150, y=-900, size=35,shape=1,icon="hidden", unlock={'blind_l'}},
|
||||
@@ -53,9 +57,9 @@ return{
|
||||
{name='blind_u', x=150, y=-1100, size=30,shape=3,icon="hidden", unlock={'blind_wtf'}},
|
||||
{name='blind_wtf', x=150, y=-1200, size=25,shape=2,icon="hidden"},
|
||||
|
||||
{name='classic_e', x=-170, y=-850, size=40,shape=1,icon="classic", unlock={'classic_h'}},
|
||||
{name='classic_h', x=-180, y=-1000, size=35,shape=2,icon="classic", unlock={'classic_u'}},
|
||||
{name='classic_u', x=-190, y=-1150, size=30,shape=2,icon="classic"},
|
||||
{name='classic_e', x=-150, y=-850, size=40,shape=1,icon="classic", unlock={'classic_h'}},
|
||||
{name='classic_h', x=-300, y=-950, size=35,shape=2,icon="classic", unlock={'classic_u'}},
|
||||
{name='classic_u', x=-450, y=-1050, size=30,shape=2,icon="classic"},
|
||||
|
||||
{name='survivor_e', x=300, y=-600, size=40,shape=1,icon="survivor", unlock={'survivor_n'}},
|
||||
{name='survivor_n', x=500, y=-600, size=40,shape=1,icon="survivor", unlock={'survivor_h','attacker_h','defender_n','dig_h'}},
|
||||
|
||||
@@ -11,7 +11,7 @@ return{
|
||||
mStr(P.stat.atk,63,280)
|
||||
mText(TEXTOBJ.atk,63,350)
|
||||
end,
|
||||
bg='blackhole',bgm='echo',
|
||||
bg='blockhole',bgm='echo',
|
||||
},
|
||||
score=function(P)return{math.min(math.floor(P.stat.atk),100),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Attack "..STRING.time(D[2])end,
|
||||
|
||||
@@ -11,7 +11,7 @@ return{
|
||||
mStr(P.stat.atk,63,280)
|
||||
mText(TEXTOBJ.atk,63,350)
|
||||
end,
|
||||
bg='blackhole',bgm='echo',
|
||||
bg='blockhole',bgm='echo',
|
||||
},
|
||||
score=function(P)return{math.min(math.floor(P.stat.atk),100),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Attack "..STRING.time(D[2])end,
|
||||
|
||||
@@ -1,18 +1,23 @@
|
||||
return{
|
||||
env={
|
||||
drop=1e99,lock=1e99,
|
||||
das=8,arr=1,
|
||||
drop=30,lock=30,
|
||||
holdCount=0,
|
||||
task=function(P)
|
||||
while not P.control do YIELD()end
|
||||
P:pressKey(6)
|
||||
P:lose()
|
||||
end,
|
||||
bg='bg1',bgm='new era',
|
||||
eventSet='bigbang',
|
||||
bg='blockhole',bgm='peak',
|
||||
},
|
||||
score=function(P)return{P.modeData.event,P.stat.finesseRate*.2/P.stat.piece}end,
|
||||
scoreDisp=function(D)return("%d Stage %.2f%%"):format(D[1],D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]>b[2]end,
|
||||
getRank=function()
|
||||
return 1
|
||||
score=function(P)return{P.modeData.stage,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Stage "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
do return 1 end
|
||||
local L=P.modeData.stage
|
||||
return
|
||||
L>=100 and 5 or
|
||||
L>=70 and 4 or
|
||||
L>=40 and 3 or
|
||||
L>=20 and 2 or
|
||||
L>=10 and 1 or
|
||||
L>=3 and 0
|
||||
end,
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ return{
|
||||
smooth=false,
|
||||
face={0,0,2,2,2,0,0},
|
||||
eventSet='classic_e',
|
||||
bg='rgb',bgm='1989',
|
||||
bg='rgb',bgm='1980s',
|
||||
},
|
||||
slowMark=true,
|
||||
score=function(P)return{P.stat.score,P.stat.row}end,
|
||||
|
||||
@@ -4,7 +4,7 @@ return{
|
||||
smooth=false,
|
||||
face={0,0,2,2,2,0,0},
|
||||
eventSet='classic_h',
|
||||
bg='rgb',bgm='1989',
|
||||
bg='rgb',bgm='1980s',
|
||||
},
|
||||
slowMark=true,
|
||||
score=function(P)return{P.stat.score,P.stat.row}end,
|
||||
|
||||
@@ -4,7 +4,7 @@ return{
|
||||
smooth=false,
|
||||
face={0,0,2,2,2,0,0},
|
||||
eventSet='classic_u',
|
||||
bg='rgb',bgm='1989',
|
||||
bg='rgb',bgm='1980s',
|
||||
},
|
||||
slowMark=true,
|
||||
score=function(P)return{P.stat.score,P.stat.row}end,
|
||||
|
||||
@@ -8,7 +8,7 @@ local function marginTask(P)
|
||||
end
|
||||
return{
|
||||
env={
|
||||
bg={'bg1','bg2','blackhole','blockfall','blockrain','blockspace','cubes','fan','flink','glow','matrix','rainbow','rainbow2','tunnel'},
|
||||
bg={'bg1','bg2','blockhole','blockfall','blockrain','blockspace','cubes','fan','flink','glow','matrix','rainbow','rainbow2','tunnel'},
|
||||
bgm={'battle','beat5th','cruelty','distortion','echo','far','final','here','hope','memory','moonbeam','push','rectification','secret7th remix','secret7th','secret8th remix','secret8th','shift','shining terminal','storm','super7th','there','truth','vapor','waterfall'},
|
||||
},
|
||||
load=function()
|
||||
|
||||
@@ -4,9 +4,7 @@ return{
|
||||
holdCount=0,
|
||||
drop=60,lock=60,
|
||||
fall=20,
|
||||
sequence='none',
|
||||
freshLimit=15,
|
||||
RS="SRS",
|
||||
eventSet='pctrain_l',
|
||||
bg='rgb',bgm='memory',
|
||||
},
|
||||
|
||||
@@ -4,8 +4,6 @@ return{
|
||||
holdCount=0,
|
||||
drop=120,lock=180,
|
||||
fall=20,
|
||||
sequence='none',
|
||||
RS="SRS",
|
||||
eventSet='pctrain_n',
|
||||
bg='rgb',bgm='memory',
|
||||
},
|
||||
@@ -15,7 +13,7 @@ return{
|
||||
getRank=function(P)
|
||||
local L=P.stat.pc
|
||||
return
|
||||
L>=62 and 5 or
|
||||
L>=60 and 5 or
|
||||
L>=42 and 4 or
|
||||
L>=26 and 3 or
|
||||
L>=18 and 2 or
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
return{
|
||||
env={
|
||||
drop=60,lock=60,
|
||||
eventSet='checkLine_40',
|
||||
eventSet='sprintEff_40',
|
||||
bg='bg2',bgm='race',
|
||||
},
|
||||
score=function(P)return{P.stat.atk/P.stat.row,P.stat.time}end,
|
||||
|
||||
@@ -2,6 +2,7 @@ return{
|
||||
env={
|
||||
drop=60,lock=60,
|
||||
wait=0,fall=50,
|
||||
hang=15,
|
||||
garbageSpeed=30,
|
||||
seqData={1,2,3,4,5,6,7},
|
||||
eventSet='stack_e',
|
||||
|
||||
@@ -2,6 +2,7 @@ return{
|
||||
env={
|
||||
drop=60,lock=60,
|
||||
wait=0,fall=50,
|
||||
hang=15,
|
||||
garbageSpeed=30,
|
||||
seqData={8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25},
|
||||
eventSet='stack_u',
|
||||
|
||||
21
parts/modes/strategy_e.lua
Normal file
21
parts/modes/strategy_e.lua
Normal file
@@ -0,0 +1,21 @@
|
||||
return{
|
||||
env={
|
||||
sequence="bagES",
|
||||
eventSet='strategy_e',
|
||||
bg='bg2',bgm='push',
|
||||
},
|
||||
slowMark=true,
|
||||
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
return
|
||||
L>=200 and 5 or
|
||||
L>=170 and 4 or
|
||||
L>=150 and 3 or
|
||||
L>=120 and 2 or
|
||||
L>=60 and 1 or
|
||||
L>=26 and 0
|
||||
end,
|
||||
}
|
||||
21
parts/modes/strategy_h.lua
Normal file
21
parts/modes/strategy_h.lua
Normal file
@@ -0,0 +1,21 @@
|
||||
return{
|
||||
env={
|
||||
sequence="bagES",
|
||||
eventSet='strategy_h',
|
||||
bg='bg2',bgm='secret8th',
|
||||
},
|
||||
slowMark=true,
|
||||
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
return
|
||||
L>=200 and 5 or
|
||||
L>=160 and 4 or
|
||||
L>=120 and 3 or
|
||||
L>=70 and 2 or
|
||||
L>=40 and 1 or
|
||||
L>=26 and 0
|
||||
end,
|
||||
}
|
||||
21
parts/modes/strategy_u.lua
Normal file
21
parts/modes/strategy_u.lua
Normal file
@@ -0,0 +1,21 @@
|
||||
return{
|
||||
env={
|
||||
sequence="bagES",
|
||||
eventSet='strategy_u',
|
||||
bg='bg2',bgm='secret7th',
|
||||
},
|
||||
slowMark=true,
|
||||
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
return
|
||||
L>=200 and 5 or
|
||||
L>=150 and 4 or
|
||||
L>=80 and 3 or
|
||||
L>=40 and 2 or
|
||||
L>=20 and 1 or
|
||||
L>=26 and 0
|
||||
end,
|
||||
}
|
||||
@@ -119,6 +119,6 @@ return{
|
||||
{font=25,name="[w*o]"},
|
||||
{font=25,name="蚂蚁"},
|
||||
{font=25,name="小丘"},
|
||||
{font=25,name="[*)]"},
|
||||
{font=25,name="Techtris"},
|
||||
{font=25,name="费尔特林"},
|
||||
}
|
||||
|
||||
@@ -360,6 +360,18 @@ local function _drawNextPreview(B,fieldH,fieldBeneath)
|
||||
end
|
||||
end end
|
||||
end
|
||||
local function _drawHoldPreview(B,fieldH,fieldBeneath)
|
||||
gc_setColor(1,1,1,.3)
|
||||
local y=int(fieldH+1-modf(B.RS.centerPos[B.id][B.dir][1]))+ceil(fieldBeneath/30)+.14
|
||||
B=B.bk
|
||||
local x=int(6-#B[1]*.5)
|
||||
local cross=TEXTURE.puzzleMark[-1]
|
||||
for i=1,#B do for j=1,#B[1]do
|
||||
if B[i][j]then
|
||||
gc_draw(cross,30*(x+j-2),30*(1-y-i))
|
||||
end
|
||||
end end
|
||||
end
|
||||
local function _drawBuffer(atkBuffer,bufferWarn,atkBufferSum1,atkBufferSum)
|
||||
local h=0
|
||||
for i=1,#atkBuffer do
|
||||
@@ -807,8 +819,9 @@ function draw.norm(P,repMode)
|
||||
end
|
||||
|
||||
--Draw next preview
|
||||
if ENV.nextPos and P.nextQueue[1]then
|
||||
_drawNextPreview(P.nextQueue[1],ENV.fieldH,P.fieldBeneath)
|
||||
if ENV.nextPos then
|
||||
if P.nextQueue[1]then _drawNextPreview(P.nextQueue[1],ENV.fieldH,P.fieldBeneath)end
|
||||
if P.holdQueue[1]then _drawHoldPreview(P.holdQueue[1],ENV.fieldH,P.fieldBeneath)end
|
||||
end
|
||||
|
||||
--Draw AI's drop destination
|
||||
|
||||
@@ -3,7 +3,7 @@ return{
|
||||
dascut=0,dropcut=0,
|
||||
sddas=2,sdarr=2,
|
||||
ihs=true,irs=true,ims=true,
|
||||
FTLock=true,
|
||||
hang=0,FTLock=true,
|
||||
|
||||
ghostType='gray',
|
||||
block=true,ghost=.3,center=1,
|
||||
|
||||
@@ -418,8 +418,10 @@ function Player:pushLineList(L,mir)--Push some lines to field
|
||||
ins(self.visTime,1,FREEROW.new(20))
|
||||
end
|
||||
self.fieldBeneath=self.fieldBeneath+30*l
|
||||
self.curY=self.curY+l
|
||||
self.ghoY=self.ghoY+l
|
||||
if self.cur then
|
||||
self.curY=self.curY+l
|
||||
self.ghoY=self.ghoY+l
|
||||
end
|
||||
self:freshBlock('push')
|
||||
end
|
||||
function Player:pushNextList(L,mir)--Push some nexts to nextQueue
|
||||
@@ -578,7 +580,7 @@ function Player:changeAtk(R)
|
||||
self.atking=false
|
||||
end
|
||||
end
|
||||
function Player:freshBlock(mode)--string mode: push/move/fresh/newBlock
|
||||
function Player:freshBlock(mode,ifTele)--string mode: push/move/fresh/newBlock
|
||||
local ENV=self.gameEnv
|
||||
--Fresh ghost
|
||||
if(mode=='move'or mode=='newBlock'or mode=='push')and self.cur then
|
||||
@@ -643,7 +645,7 @@ function Player:freshBlock(mode)--string mode: push/move/fresh/newBlock
|
||||
end
|
||||
|
||||
--Play sound if touch ground
|
||||
if mode=='move'then
|
||||
if mode=='move'and not ifTele then
|
||||
self:checkTouchSound()
|
||||
end
|
||||
end
|
||||
@@ -1256,6 +1258,7 @@ do
|
||||
piece.curX,piece.curY,piece.dir=self.curX,self.curY,C.dir
|
||||
piece.centX,piece.centY=self.curX+sc[2],self.curY+sc[1]
|
||||
piece.frame,piece.autoLock=self.frameRun,autoLock
|
||||
|
||||
self.waiting=ENV.wait
|
||||
|
||||
--Tri-corner spin check
|
||||
@@ -1642,6 +1645,14 @@ do
|
||||
end
|
||||
end
|
||||
|
||||
--Prevent sudden death if hang>0
|
||||
if ENV.hang>ENV.wait and self.nextQueue[1]then
|
||||
local B=self.nextQueue[1]
|
||||
if self:ifoverlap(B.bk,int(6-#B.bk[1]*.5),int(ENV.fieldH+1-modf(B.RS.centerPos[B.id][B.dir][1]))+ceil(self.fieldBeneath/30))then
|
||||
self.waiting=self.waiting+ENV.hang
|
||||
end
|
||||
end
|
||||
|
||||
--Check bot things
|
||||
if self.bot then
|
||||
self.bot:checkDest()
|
||||
@@ -2600,10 +2611,11 @@ function Player:act_insLeft(auto)
|
||||
while not self:ifoverlap(self.cur.bk,self.curX-1,self.curY)do
|
||||
self:createMoveFX('left')
|
||||
self.curX=self.curX-1
|
||||
self:freshBlock('move')
|
||||
self:freshBlock('move',true)
|
||||
end
|
||||
if self.curX~=x0 then
|
||||
self.spinLast=false
|
||||
self:checkTouchSound()
|
||||
end
|
||||
if self.gameEnv.shakeFX then
|
||||
self.swingOffset.vx=-1.5
|
||||
@@ -2624,10 +2636,11 @@ function Player:act_insRight(auto)
|
||||
while not self:ifoverlap(self.cur.bk,self.curX+1,self.curY)do
|
||||
self:createMoveFX('right')
|
||||
self.curX=self.curX+1
|
||||
self:freshBlock('move')
|
||||
self:freshBlock('move',true)
|
||||
end
|
||||
if self.curX~=x0 then
|
||||
self.spinLast=false
|
||||
self:checkTouchSound()
|
||||
end
|
||||
if self.gameEnv.shakeFX then
|
||||
self.swingOffset.vx=1.5
|
||||
|
||||
@@ -31,10 +31,6 @@ function scene.draw()
|
||||
gc.printf(text.aboutTexts[i],150,35*i+50,1000,'center')
|
||||
end
|
||||
|
||||
--Group
|
||||
setFont(20)
|
||||
mStr(text.group,640,480)
|
||||
|
||||
--Lib used
|
||||
setFont(15)
|
||||
gc.print(text.used,50,325)
|
||||
|
||||
@@ -90,7 +90,7 @@ local function newTile()
|
||||
if nextCD>0 then
|
||||
nextTile=1
|
||||
else
|
||||
nextTile=rnd()>.1 and 2 or rnd()>.1 and 3 or 4
|
||||
nextTile=MATH.roll(.9)and 2 or MATH.roll(.9)and 3 or 4
|
||||
nextCD=rnd(8,12)
|
||||
end
|
||||
|
||||
|
||||
@@ -611,6 +611,16 @@ local commands={}do
|
||||
scene='app_arithmetic',
|
||||
description="Arithmetic"
|
||||
},
|
||||
{
|
||||
code="piano",
|
||||
scene='app_piano',
|
||||
description="A simple keyboard piano"
|
||||
},
|
||||
{
|
||||
code="spin",
|
||||
scene='app_spin',
|
||||
description="???"
|
||||
},
|
||||
}
|
||||
commands.app={
|
||||
code=function(name)
|
||||
@@ -969,7 +979,7 @@ function scene.wheelMoved(_,y)
|
||||
end
|
||||
|
||||
function scene.keyDown(key)
|
||||
if key=="return"then
|
||||
if key=="return" or key=="kpenter"then
|
||||
local input=STRING.trim(inputBox:getText())
|
||||
if input==""then return end
|
||||
|
||||
|
||||
@@ -7,7 +7,6 @@ local setFont,mStr=FONT.set,GC.mStr
|
||||
local int,rnd,abs=math.floor,math.random,math.abs
|
||||
local max,min=math.max,math.min
|
||||
local ins,rem=table.insert,table.remove
|
||||
local function sign(a)return a>0 and 1 or a<0 and -1 or 0 end
|
||||
|
||||
local levels={
|
||||
{c=6,r=3,color=3},
|
||||
@@ -289,7 +288,7 @@ function scene.update(dt)
|
||||
if state==1 then
|
||||
time=TIME()-startTime
|
||||
comboTime=max(comboTime-dt,0)
|
||||
score1=score1+sign(score-score1)+int((score-score1)*.1+.5)
|
||||
score1=score1+MATH.sign(score-score1)+int((score-score1)*.1+.5)
|
||||
end
|
||||
|
||||
if sure>0 then sure=sure-dt end
|
||||
|
||||
53
parts/scenes/app_piano.lua
Normal file
53
parts/scenes/app_piano.lua
Normal file
@@ -0,0 +1,53 @@
|
||||
local gc=love.graphics
|
||||
local kb=love.keyboard
|
||||
|
||||
local instList={'lead','bell','bass'}
|
||||
local keys={
|
||||
['1']=61,['2']=63,['3']=65,['4']=66,['5']=68,['6']=70,['7']=72,['8']=73,['9']=75,['0']=77,['-']=78,['=']=80,['backspace']=82,
|
||||
['q']=49,['w']=51,['e']=53,['r']=54,['t']=56,['y']=58,['u']=60,['i']=61,['o']=63,['p']=65,['[']=66,[']']=68,['\\']=70,
|
||||
['a']=37,['s']=39,['d']=41,['f']=42,['g']=44,['h']=46,['j']=48,['k']=49,['l']=51,[';']=53,["'"]=54,['return']=56,
|
||||
['z']=25,['x']=27,['c']=29,['v']=30,['b']=32,['n']=34,['m']=36,[',']=37,['.']=39,['/']=41,
|
||||
}
|
||||
local inst
|
||||
local offset
|
||||
|
||||
local scene={}
|
||||
|
||||
function scene.sceneInit()
|
||||
inst='lead'
|
||||
offset=0
|
||||
end
|
||||
|
||||
function scene.touchDown(x,y,k)
|
||||
--TODO
|
||||
end
|
||||
scene.mouseDown=scene.touchDown
|
||||
|
||||
function scene.keyDown(key,isRep)
|
||||
if not isRep and keys[key]then
|
||||
local note=keys[key]+offset
|
||||
if kb.isDown('lshift','rshift')then note=note+1 end
|
||||
if kb.isDown('lctrl','rctrl')then note=note-1 end
|
||||
SFX.playSample(inst,note)
|
||||
TEXT.show(SFX.getNoteName(note),math.random(150,1130),math.random(140,500),60,'score',.8)
|
||||
elseif key=='tab'then
|
||||
inst=TABLE.next(instList,inst)
|
||||
elseif key=='lalt'then
|
||||
offset=math.max(offset-1,-12)
|
||||
elseif key=='ralt'then
|
||||
offset=math.min(offset+1,12)
|
||||
elseif key=='escape'then
|
||||
SCN.back()
|
||||
end
|
||||
end
|
||||
|
||||
function scene.draw()
|
||||
setFont(30)
|
||||
gc.print(inst,40,60)
|
||||
gc.print(offset,40,100)
|
||||
end
|
||||
|
||||
scene.widgetList={
|
||||
WIDGET.newButton{name="back", x=1140,y=640,w=170,h=80,font=60,fText=CHAR.icon.back,code=backScene},
|
||||
}
|
||||
return scene
|
||||
@@ -39,7 +39,7 @@ end
|
||||
|
||||
local function start()
|
||||
state=1
|
||||
vx=rnd()>.5 and 6 or -6
|
||||
vx=MATH.coin(6,-6)
|
||||
vy=rnd()*6-3
|
||||
end
|
||||
function scene.keyDown(key,isRep)
|
||||
|
||||
48
parts/scenes/app_spin.lua
Normal file
48
parts/scenes/app_spin.lua
Normal file
@@ -0,0 +1,48 @@
|
||||
|
||||
local spinner=require'parts/spinner'.new({
|
||||
{font=45,disp=CHAR.icon.retry_spin,item='zTicket',amount=1,freq=30},
|
||||
{font=60,disp=CHAR.mino.Z,item='Zfrag',amount=1,freq=10},
|
||||
{font=60,disp=CHAR.mino.S,item='Sfrag',amount=1,freq=10},
|
||||
{font=60,disp=CHAR.mino.J,item='Jfrag',amount=1,freq=10},
|
||||
{font=60,disp=CHAR.mino.L,item='Lfrag',amount=1,freq=10},
|
||||
{font=60,disp=CHAR.mino.T,item='Tfrag',amount=1,freq=10},
|
||||
{font=60,disp=CHAR.mino.O,item='Ofrag',amount=1,freq=10},
|
||||
{font=60,disp=CHAR.mino.I,item='Ifrag',amount=1,freq=10},
|
||||
},function(item,amount)
|
||||
getItem(item,amount)
|
||||
saveStats()
|
||||
end)
|
||||
|
||||
local scene={}
|
||||
|
||||
function scene.keyDown(key,isRep)
|
||||
if isRep then return end
|
||||
if key=='space'or key=='return'then
|
||||
if STAT.item.zTicket>0 then
|
||||
if spinner:start()then
|
||||
STAT.item.zTicket=STAT.item.zTicket-1
|
||||
saveStats()
|
||||
end
|
||||
else
|
||||
MES.new('info',"Not enough zTicket")
|
||||
end
|
||||
elseif key=='escape'then
|
||||
SCN.back()
|
||||
end
|
||||
end
|
||||
|
||||
function scene.update(dt)
|
||||
spinner:update(dt)
|
||||
end
|
||||
|
||||
function scene.draw()
|
||||
setFont(40)
|
||||
love.graphics.print("zTickets: "..STAT.item.zTicket,90,80)
|
||||
spinner:draw(640,360)
|
||||
end
|
||||
|
||||
scene.widgetList={
|
||||
WIDGET.newButton{name="spin", x=1140,y=360,w=120,font=60,fText=CHAR.icon.retry_spin,code=pressKey"space"},
|
||||
WIDGET.newButton{name="back", x=1140,y=640,w=170,h=80,font=60,fText=CHAR.icon.back,code=backScene},
|
||||
}
|
||||
return scene
|
||||
@@ -16,6 +16,7 @@ local sList={
|
||||
lock={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99},
|
||||
wait={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
|
||||
fall={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
|
||||
hang={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
|
||||
eventSet=EVENTSETS,
|
||||
holdMode={'hold','swap'},
|
||||
}
|
||||
@@ -211,6 +212,7 @@ scene.widgetList={
|
||||
WIDGET.newSelector{name='lock', x=730,y=410,w=260,color='O',list=sList.lock,disp=CUSval('lock'),code=CUSsto('lock')},
|
||||
WIDGET.newSelector{name='wait', x=730,y=520,w=260,color='G',list=sList.wait,disp=CUSval('wait'),code=CUSsto('wait')},
|
||||
WIDGET.newSelector{name='fall', x=730,y=600,w=260,color='G',list=sList.fall,disp=CUSval('fall'),code=CUSsto('fall')},
|
||||
WIDGET.newSelector{name='hang', x=730,y=680,w=260,color='G',list=sList.hang,disp=CUSval('hang'),code=CUSsto('hang')},
|
||||
|
||||
--Copy / Paste / Start
|
||||
WIDGET.newButton{name='copy', x=1070,y=300,w=310,h=70,color='lR',font=25,code=pressKey"cC"},
|
||||
@@ -220,7 +222,7 @@ scene.widgetList={
|
||||
WIDGET.newButton{name='back', x=1140,y=640,w=170,h=80,font=60,fText=CHAR.icon.back,code=pressKey"escape"},
|
||||
|
||||
--Rule set
|
||||
WIDGET.newSelector{name='eventSet', x=930, y=740,w=360,color='H',list=sList.eventSet,disp=CUSval('eventSet'),code=CUSsto('eventSet')},
|
||||
WIDGET.newSelector{name='eventSet', x=1050,y=740,w=340,color='H',list=sList.eventSet,disp=CUSval('eventSet'),code=CUSsto('eventSet')},
|
||||
|
||||
--Special rules
|
||||
WIDGET.newSwitch{name='ospin', x=850, y=810,lim=210,disp=CUSval('ospin'), code=CUSrev('ospin')},
|
||||
|
||||
@@ -29,16 +29,21 @@ local typeColor={
|
||||
english=COLOR.B,
|
||||
name=COLOR.lV,
|
||||
}
|
||||
local function _filter(word_org)
|
||||
local word=word_org
|
||||
word=word:gsub("[Tt]etris",CHAR.zChan.thinking)
|
||||
if FNSF then word=word:gsub("[Pp]\97\116\114\101\111\110",CHAR.zChan.qualified)end
|
||||
return word,word_org
|
||||
end
|
||||
local function _scanDict(D)
|
||||
if not D[1][1]then return end
|
||||
local c=CHAR.zChan.thinking
|
||||
local cut=TABLE.cut
|
||||
for i=1,#D do
|
||||
local O=D[i]
|
||||
O.title,O.title_Org=O[1]:gsub("[Tt]etris",c),O[1]
|
||||
O.title,O.title_Org=_filter(O[1])
|
||||
O.keywords=O[2]
|
||||
O.type=O[3]
|
||||
O.content,O.content_Org=O[4]:gsub("[Tt]etris",c),O[4]
|
||||
O.content,O.content_Org=_filter(O[4])
|
||||
O.url=O[5]
|
||||
cut(O)
|
||||
end
|
||||
|
||||
@@ -14,9 +14,9 @@ local widgetX0={
|
||||
}
|
||||
local enterConsole=coroutine.wrap(function()
|
||||
while true do
|
||||
Snd('bell',.6,'A4',.7,'E5',1,coin('A5','B5'))YIELD()
|
||||
Snd('bell',.6,'A4',.7,'F5',1,coin('C6','D6'))YIELD()
|
||||
Snd('bell',.6,'A4',.7,'G5',1,coin('E6','G6'))YIELD()
|
||||
Snd('bell',.6,'A4',.7,'E5',1,MATH.coin('A5','B5'))YIELD()
|
||||
Snd('bell',.6,'A4',.7,'F5',1,MATH.coin('C6','D6'))YIELD()
|
||||
Snd('bell',.6,'A4',.7,'G5',1,MATH.coin('E6','G6'))YIELD()
|
||||
Snd('bell',.6,'A4',.7,'A5',1,'A6')SFX.play('ren_mega')SCN.go('app_console')YIELD()
|
||||
end
|
||||
end)
|
||||
|
||||
@@ -21,7 +21,7 @@ local author={
|
||||
["jazz nihilism"]="Trebor",
|
||||
["race remix"]="柒栎流星",
|
||||
["sakura"]="ZUN & C₂₉H₂₅N₃O₅",
|
||||
["1989"]="C₂₉H₂₅N₃O₅",
|
||||
["1980s"]="C₂₉H₂₅N₃O₅",
|
||||
}
|
||||
|
||||
local scene={}
|
||||
@@ -63,6 +63,11 @@ function scene.keyDown(key,isRep)
|
||||
SCN.swapTo('launchpad','none')
|
||||
elseif key=="escape"then
|
||||
SCN.back()
|
||||
elseif #key==1 and key:find'[0-9a-z]'then
|
||||
for _=1,#bgmList do
|
||||
selected=selected%#bgmList+1
|
||||
if bgmList[selected]:sub(1,1)==key then break end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -79,15 +79,16 @@ function scene.draw()
|
||||
end
|
||||
|
||||
gc.replaceTransform(SCR.xOy)
|
||||
gc.setColor(COLOR.Z)
|
||||
local T=40*math.min(time,45)
|
||||
gc.setColor(.97,.97,.97,45-math.min(time,45))
|
||||
local L=text.staff
|
||||
setFont(40)
|
||||
for i=1,#L do
|
||||
mStr(L[i],640,800+70*i-T)
|
||||
end
|
||||
gc.setColor(1,1,1)
|
||||
mDraw(TEXTURE.title_color,640,800-T,nil,.6)
|
||||
mDraw(TEXTURE.title_color,640,2160-T,nil,.6)
|
||||
mDraw(TEXTURE.title,640,2160-T,nil,.6)
|
||||
if time>50 then
|
||||
gc.print("CLICK ME →",50,550,-.5)
|
||||
end
|
||||
|
||||
112
parts/spinner.lua
Normal file
112
parts/spinner.lua
Normal file
@@ -0,0 +1,112 @@
|
||||
local gc=love.graphics
|
||||
|
||||
local Spinner={
|
||||
data={},
|
||||
totalFreq=0,
|
||||
|
||||
spinning=false,
|
||||
angle=0,
|
||||
angV=0,
|
||||
|
||||
chosen=false,
|
||||
light=0,
|
||||
}
|
||||
Spinner.__index=Spinner
|
||||
function Spinner:start()
|
||||
if not self.spinning then
|
||||
self.spinning=true
|
||||
self.angle=MATH.tau*math.random()
|
||||
self.angV=.62+.26*math.random()
|
||||
return true
|
||||
end
|
||||
end
|
||||
function Spinner:update(dt)
|
||||
if self.spinning then
|
||||
self.angle=(self.angle+self.angV*dt*60)%MATH.tau
|
||||
local dV=
|
||||
self.angV>.26 and .0026 or
|
||||
self.angV>.12 and .0012 or
|
||||
self.angV>.04 and .0004 or
|
||||
.0001
|
||||
self.angV=self.angV-dV*dt*60
|
||||
if self.angV<=0 then
|
||||
self.angV=0
|
||||
self.spinning=false
|
||||
local freq=self.angle%MATH.tau/MATH.tau*self.totalFreq
|
||||
for i=1,#self.data do
|
||||
local D=self.data[i]
|
||||
freq=freq-D.freq
|
||||
if freq<=0 then
|
||||
self.chosen=D
|
||||
self.light=1
|
||||
if D.item then
|
||||
self.hook_stop(D.item,D.amount)
|
||||
end
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
if self.light>0 then
|
||||
self.light=self.light-dt
|
||||
end
|
||||
end
|
||||
end
|
||||
function Spinner:draw(x,y)
|
||||
gc.push('transform')
|
||||
gc.translate(x,y)
|
||||
|
||||
--Draw circle
|
||||
gc.setColor(1,1,1)
|
||||
gc.setLineWidth(3)
|
||||
gc.circle('line',0,0,300)
|
||||
|
||||
--Draw areas
|
||||
gc.setLineWidth(1)
|
||||
local freq=0
|
||||
for i=1,#self.data do
|
||||
gc.line(10,0,290,0)
|
||||
local D=self.data[i]
|
||||
freq=freq+D.freq
|
||||
if D==self.chosen then
|
||||
gc.setColor(1,1,1,.5*self.light)
|
||||
gc.arc('fill','pie',0,0,300,0,-D.freq*MATH.tau/self.totalFreq)
|
||||
gc.setColor(1,1,1)
|
||||
end
|
||||
local dAng=-MATH.tau*D.freq/self.totalFreq
|
||||
gc.rotate(dAng*.5)
|
||||
if D.amount>0 then
|
||||
setFont(D.font)
|
||||
if D.amount==1 then
|
||||
mStr(D.disp,170,-D.font*.7)
|
||||
else
|
||||
mStr(D.disp.."x"..D.amount,170,-D.font*.7)
|
||||
end
|
||||
end
|
||||
gc.rotate(dAng*.5)
|
||||
end
|
||||
|
||||
gc.pop()
|
||||
|
||||
--Draw target pin
|
||||
gc.setLineWidth(2)
|
||||
gc.setColor(1,.3,.3)
|
||||
gc.line(x,y,x+200*math.cos(self.angle),y-200*math.sin(self.angle))
|
||||
end
|
||||
function Spinner.new(data,hook_stop)
|
||||
local self={}
|
||||
setmetatable(self,Spinner)
|
||||
|
||||
local sum=0
|
||||
for i=1,#data do
|
||||
sum=sum+data[i].freq
|
||||
if not data[i].font then data[i].font=30 end
|
||||
end
|
||||
self.data=data
|
||||
self.totalFreq=sum
|
||||
self.hook_stop=hook_stop
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
return Spinner
|
||||
@@ -1,18 +1,28 @@
|
||||
return[=[
|
||||
未来模式:
|
||||
任务树; 大爆炸; 拼方形; 限高无尽挖掘; 连击练习; 极简教程/考试
|
||||
未来小游戏:
|
||||
Tetro-1010(四/五连块, 2C2N, 若干回合改变重力方向); Tetra-link(桌游)
|
||||
噗哟; 泡泡龙; 求合体; 坦克大战; 扫雷; 接水管; 数字记忆; 听声记忆
|
||||
Tetro-1010(2C2N, 重力); Tetra-link(桌游)
|
||||
噗哟; 泡泡龙; 求合体; 坦克大战; 扫雷; 接水管; 记忆
|
||||
其他未来内容:
|
||||
组队战; 实时统计数据可视化; 教学关; 从录像继续
|
||||
重做模式选择UI; 重做模组UI; 加速下落; spike相关统计数据
|
||||
支持更多手柄; 场地格边缘线; 模式数据分析; 高级自定义序列
|
||||
等级系统; 成就系统; Domain状态; 手势操作; C2连击; 特殊控件(虚拟摇杆等)
|
||||
方块位移/旋转动画; 更细节的DAS选项; 拓展主题系统; 无用货币
|
||||
等级系统; 成就系统; 手势操作; C2连击; 特殊控件(虚拟摇杆等)
|
||||
方块位移/旋转动画; 更细节的DAS选项; 拓展主题系统
|
||||
可调攻击系统; 更多消除方式; 可调场地宽度; 新联网游戏场景切换逻辑
|
||||
工程编译到字节码; task-Z(新AI)
|
||||
收集向抽奖; 自适应UI; 多方块
|
||||
工程编译到字节码; task-Z(新AI); 自适应UI; 多方块
|
||||
|
||||
0.17.0: 硬着陆 Hard Landing
|
||||
新增:
|
||||
新模式:大爆炸
|
||||
新模式:策略堆叠(原版设计来自Cambridge游戏, by NOT_A_ROBOT)
|
||||
改动:
|
||||
TRS的S/Z添加四个踢墙防止在一些地方卡死
|
||||
生成位置预览开启后hold的生成位置也可见 #453
|
||||
优化pc训练模式体验,添加胜利条件,不再无尽
|
||||
堆积模式添加15帧的窒息延迟 #465
|
||||
修复:
|
||||
机翻语言超级消除无行数显示 #462
|
||||
竞速-效率左侧信息颜色问题
|
||||
|
||||
0.16.5: 新世界 New World
|
||||
新增:
|
||||
@@ -21,23 +31,32 @@ return[=[
|
||||
新增场地抖动特效
|
||||
新增繁中语言,新语言设置菜单布局
|
||||
新BGM:peak(暂未使用)
|
||||
新BGM:1989(用于经典模式,by C₂₉H₂₅N₃O₅)
|
||||
新BGM:1980s(用于经典模式, by C₂₉H₂₅N₃O₅)
|
||||
删除节奏模式(之后会有全新音游模式)
|
||||
音乐室输入首字母自动跳转
|
||||
新增窒息延迟(by NOT_A_ROBOT) #459
|
||||
移除模式标题的颜色
|
||||
改动:
|
||||
移动音效改为触地音效,在方块因重力或旋转触地时也会播放
|
||||
新增piano小程序(目前只支持键盘操作)
|
||||
再调整场地晃动的阻力,看起来更舒服
|
||||
TRS的J5和L5新增一个180度踢墙
|
||||
重做全局颜色表(by C₂₉H₂₅N₃O₅)
|
||||
经典模式添加干旱计数器 #452
|
||||
重新安排一些模式的BGM
|
||||
堆积模式移出地图,修改规则可以消超过20行
|
||||
堆积模式移出地图,修改规则可以消超过20行 #449
|
||||
只在更新后触发自动转换以旧版本模式名存储的数据
|
||||
再次更换字体
|
||||
代码:
|
||||
播放乐器采样更自然并允许超过音源范围
|
||||
添加数学扩展模块
|
||||
添加死亡事件触发器
|
||||
修复:
|
||||
堆积模式超级消除有时报错
|
||||
词典导出词条保留了替换敏感词的特殊字符
|
||||
修改准备音效后ultra倒计时声音不见了
|
||||
0arr时自动移动时声音特别响
|
||||
时间转换函数可能输出1分60 #451
|
||||
堆积模式超级消除有时报错
|
||||
|
||||
0.16.4: 虫洞 Wormhole
|
||||
新增:
|
||||
@@ -78,16 +97,16 @@ return[=[
|
||||
新增:
|
||||
新系统:规则包,自定义游戏和联网对战可以有更多玩法了
|
||||
新系统:音效包(暂无其他可选,正在制作)
|
||||
新模式:更多难度的经典模式(by not-a-normal-bot) #285
|
||||
新模式:更多难度的经典模式(by NOT_A_ROBOT) #285
|
||||
新模式:大师-M
|
||||
新序列模式:bagES(easy start)开局第一个不会出难受的块
|
||||
新机制:逻辑追帧(单机可关闭),联网强制启用防止低帧率设备影响其他玩家游戏体验
|
||||
新旋转系统:ARS_Z,简化复杂的测试逻辑,统一使用{右,左}(i块为{上,上2},五连块风格模仿)
|
||||
新旋转系统:SRS_X,基于SRS,I块和除了PQ的非四连块使用TRS的表
|
||||
新语音包:miku(by vocaloidvictory)
|
||||
新BGM:Jazz nihilism(用于节日主题,by Trebor)
|
||||
新BGM:Race remix(用于大师-ph,by 柒栎流星)
|
||||
新BGM:Sakura(用于限时打分,by C₂₉H₂₅N₃O₅)
|
||||
新BGM:Jazz nihilism(用于节日主题, by Trebor)
|
||||
新BGM:Race remix(用于大师-ph, by 柒栎流星)
|
||||
新BGM:Sakura(用于限时打分, by C₂₉H₂₅N₃O₅)
|
||||
新BGM:Null(用于节日主题)
|
||||
新音效:单次消5/6行
|
||||
新机制:swap(hold的另一种实现)
|
||||
@@ -261,7 +280,7 @@ return[=[
|
||||
0.15.6: 强化装甲 Reinforced Armor
|
||||
新增:
|
||||
新BGM:Nil(用于主菜单)
|
||||
新BGM:Secret7th Remix(用于master-ultimate,by 柒栎流星)
|
||||
新BGM:Secret7th Remix(用于master-ultimate, by 柒栎流星)
|
||||
新模式:Attack竞速
|
||||
master-ultimate模式新增500~1000
|
||||
支持调整录像回放速度和逐帧播放
|
||||
@@ -534,8 +553,8 @@ return[=[
|
||||
|
||||
0.14.5: 晨 Morn
|
||||
新增:
|
||||
新增BGM:Empty(用于节日主题,by ERM)
|
||||
新增BGM:Battle(用于单挑L/U难度,by Aether)
|
||||
新增BGM:Empty(用于节日主题, by ERM)
|
||||
新增BGM:Battle(用于单挑L/U难度, by Aether)
|
||||
增加玩家个人信息显示框
|
||||
音乐室显示音乐作者
|
||||
新增开5人房的按钮
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
return{
|
||||
["apkCode"]=398,
|
||||
["code"]=1605,
|
||||
["string"]="V0.16.5",
|
||||
["apkCode"]=404,
|
||||
["code"]=1700,
|
||||
["string"]="V0.17.0",
|
||||
["room"]="ver A-0",
|
||||
["name"]="新世界 New World",
|
||||
["name"]="硬着陆 Hard Landing",
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user