Compare commits

..

39 Commits

Author SHA1 Message Date
MrZ626
230d67492e 测试场景左上文本从最晚的开始显示 close #437 2021-11-09 16:04:08 +08:00
MrZ626
4f9d5b282c 修正一个开发者id写法问题 2021-11-09 16:04:08 +08:00
ParticleG
a2955e8722 - Fix wrong action name 2021-11-09 16:04:07 +08:00
MrZ626
df892671d5 修改更新历史和build号 2021-11-09 16:04:07 +08:00
MrZ626
7fa96eee1a 被攻击时场地会抖动 2021-11-09 16:04:07 +08:00
MrZ626
a1030906c7 场地晃动改名swing
添加场地抖动特效(跟场地晃动使用同一个设置值)
2021-11-09 16:04:07 +08:00
MrZ626
e6a9a4f4be 微调wine颜色,dark颜色更dark 2021-11-09 16:04:07 +08:00
MrZ626
efa1247596 颜色表的灰色饱和度更低并改为偏暖 2021-11-09 16:04:07 +08:00
MrZ626
069fcee721 整理代码
移除旧的切换攻击模式代码
旋转导致场地倾斜封装成玩家方法
调整瞬移到左右的场地晃动程度
调整场地平移晃动的恢复速度
软降触地时也会播放触地音效
2021-11-09 16:04:07 +08:00
C₂₉H₂₅N₃O₅
66621404f1 Changed the colours and the fonts in the game (#435)
* 微调字体

* 调整配色, 微调字体
2021-11-09 16:04:06 +08:00
ParticleG
e09609ea21 - Use Python 3.9 2021-11-09 16:04:06 +08:00
ParticleG
d02ae67bc0 - Add logs to upload-artifact 2021-11-09 16:04:06 +08:00
ParticleG
27327d57c4 - Test Windows with curl 2021-11-09 16:04:06 +08:00
MrZ626
cce93b6df9 整理代码 2021-11-09 16:04:06 +08:00
ParticleG
546104ba5b - Add Upload Action 2021-11-09 16:04:06 +08:00
MrZ626
ca5816ba14 进入newRoom菜单时不会试图修改背景和bgm 2021-11-09 16:04:06 +08:00
MrZ626
e5bd16476e 修改更新历史和build号 2021-11-09 16:04:05 +08:00
MrZ626
94431d4c2e 只在更新后触发自动转换以旧版本模式名存储的数据文件 2021-11-09 16:04:05 +08:00
MrZ626
f98d6892f1 颜色表改用hsv生成 2021-11-09 16:04:05 +08:00
MrZ626
1fe436cbe3 微调词典
微调两个小程序
整理代码
2021-11-09 16:04:05 +08:00
MrZ626
c5a37a9920 微调中文词典两个词条 2021-11-09 16:04:05 +08:00
MrZ626
eed7e96096 无尽马拉松的are每300行减小一次,line are每100行减小一次 2021-11-09 16:04:05 +08:00
MrZ626
a7f36a4162 无尽马拉松添加1700行的终点 2021-11-09 16:04:05 +08:00
MrZ626
8ba872d45d 微调排行榜字体大小 2021-11-09 16:04:04 +08:00
MrZ626
7a55451faa 无尽马拉松添加排行榜 2021-11-09 16:04:04 +08:00
MrZ626
372571bd80 修改更新历史
整理代码
2021-11-09 16:04:04 +08:00
MrZ626
77120c0b90 调整无尽马拉松的难度曲线 2021-11-09 16:04:04 +08:00
Not-A-Normal-Robot
01d1e44644 Decrease lock delay when level up above lvl20 2021-11-09 16:04:04 +08:00
Not-A-Normal-Robot
0ad8cddefe Added Infinite Marathon 2021-11-09 16:04:03 +08:00
MrZ626
ce67253502 修改更新历史 2021-11-09 16:04:03 +08:00
MrZ626
cb9f2c0617 修改mph模式的bgm 2021-11-09 16:04:03 +08:00
MrZ626
635d9407ed 新模式:竞速-效率 2021-11-09 16:04:03 +08:00
MrZ626
0f9f6565f1 修复超级消除结算时分数计算变量写错导致报错 2021-11-09 16:04:03 +08:00
MrZ626
a45b6ad57e move音效在方块因重力或旋转触地时也会播放,而不只是移动后
move音效名改为touch
2021-11-09 16:04:03 +08:00
MrZ626
a5de06dedb 修改更新历史 2021-11-09 16:04:03 +08:00
MrZ626
fbfbd1ed98 修正pr的一个符号错误 2021-11-09 16:04:02 +08:00
C₂₉H₂₅N₃O₅
8f06b3bd1a Changed the font and CN tips (#433)
* 补全英文词典翻译

* 大改字体

- 西文部分采用IBM Plex
- 全角标点样式采用西文样式
- 添加类Plex的IPA符号

* 微调中文tips

* 更新 Legals

* 修正一个语法错误
2021-11-09 16:04:02 +08:00
C₂₉H₂₅N₃O₅
7e0dbceefc 补全英文词典翻译 (#431) 2021-11-09 16:04:02 +08:00
MrZ626
7e3db1de17 新BGM:1989(用于几个经典模式)
重新安排一些模式的BGM
2021-11-09 16:04:02 +08:00
23 changed files with 172 additions and 158 deletions

View File

@@ -19,6 +19,9 @@ inputs:
runs: runs:
using: "composite" using: "composite"
steps: steps:
- uses: actions/setup-python@v2
with:
python-version: '3.9'
- name: Install Webdav 4 - name: Install Webdav 4
shell: bash shell: bash
run: | run: |
@@ -34,7 +37,7 @@ runs:
auth=("${{ inputs.WEBDAV_USERNAME }}", "${{ inputs.WEBDAV_PASSWORD }}"), auth=("${{ inputs.WEBDAV_USERNAME }}", "${{ inputs.WEBDAV_PASSWORD }}"),
timeout=None, timeout=None,
) )
if '${{ inputs.ARTIFACT_TYPE }}' == 'release' if '${{ inputs.ARTIFACT_TYPE }}' == 'release':
print('Removing previous ${{ inputs.ARTIFACT_PLATFORM }} release file...') print('Removing previous ${{ inputs.ARTIFACT_PLATFORM }} release file...')
for file in client.ls('Techmino distribution'): for file in client.ls('Techmino distribution'):
if re.search(r'(Techmino_a[0-9]+\.[0-9]+\.[0-9]_${{ inputs.ARTIFACT_PLATFORM }}.*)', file['name']): if re.search(r'(Techmino_a[0-9]+\.[0-9]+\.[0-9]_${{ inputs.ARTIFACT_PLATFORM }}.*)', file['name']):

View File

@@ -198,7 +198,7 @@ jobs:
- name: Pack Techmino - name: Pack Techmino
run: mv Techmino.ipa Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_iOS.ipa run: mv Techmino.ipa Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_iOS.ipa
- name: Upload artifact to server - name: Upload artifact to server
uses: ./.github/actions/upload-artifacts uses: ./.github/actions/upload-artifact
with: with:
WEBDAV_USERNAME: ${{ secrets.WEBDAV_USERNAME }} WEBDAV_USERNAME: ${{ secrets.WEBDAV_USERNAME }}
WEBDAV_PASSWORD: ${{ secrets.WEBDAV_PASSWORD }} WEBDAV_PASSWORD: ${{ secrets.WEBDAV_PASSWORD }}

View File

@@ -16,62 +16,62 @@ end
local COLOR={ local COLOR={
hsv=hsv, hsv=hsv,
red= {hsv(0, .85,.85)}, red= {hsv(0.00, 0.89, 0.91)},
fire= {hsv(0.0625,.85,.85)}, fire= {hsv(0.04, 0.93, 0.94)},
orange= {hsv(0.125, .85,.85)}, orange= {hsv(0.09, 0.99, 0.96)},
yellow= {hsv(0.1875,.85,.85)}, yellow= {hsv(0.16, 0.82, 0.90)},
lime= {hsv(0.25, .85,.85)}, lime= {hsv(0.18, 0.89, 0.88)},
jade= {hsv(0.3125,.85,.85)}, jade= {hsv(0.23, 1.00, 0.82)},
green= {hsv(0.375, .85,.85)}, green= {hsv(0.33, 1.00, 0.81)},
aqua= {hsv(0.4375,.85,.85)}, aqua= {hsv(0.48, 1.00, 0.74)},
cyan= {hsv(0.5, .85,.85)}, cyan= {hsv(0.53, 1.00, 0.88)},
navy= {hsv(0.5625,.85,.85)}, navy= {hsv(0.56, 1.00, 1.00)},
sea= {hsv(0.625, .85,.85)}, sea= {hsv(0.61, 1.00, 1.00)},
blue= {hsv(0.6875,.85,.85)}, blue= {hsv(0.64, 1.00, 0.95)},
violet= {hsv(0.75, .85,.85)}, violet= {hsv(0.73, 1.00, 0.91)},
purple= {hsv(0.8125,.85,.85)}, purple= {hsv(0.80, 1.00, 0.81)},
magenta= {hsv(0.875, .85,.85)}, magenta= {hsv(0.86, 1.00, 0.78)},
wine= {hsv(0.9375,.85,.85)}, wine= {hsv(0.94, 0.96, 0.91)},
lRed= {hsv(0, .5,.95)}, lRed= {hsv(0.00, 0.38, 0.93)},
lFire= {hsv(0.0625,.5,.95)}, lFire= {hsv(0.04, 0.45, 0.91)},
lOrange= {hsv(0.125, .5,.95)}, lOrange= {hsv(0.10, 0.53, 0.92)},
lYellow= {hsv(0.1875,.5,.95)}, lYellow= {hsv(0.15, 0.61, 0.95)},
lLime= {hsv(0.25, .5,.95)}, lLime= {hsv(0.19, 0.66, 0.92)},
lJade= {hsv(0.3125,.5,.95)}, lJade= {hsv(0.24, 0.56, 0.90)},
lGreen= {hsv(0.375, .5,.95)}, lGreen= {hsv(0.34, 0.49, 0.89)},
lAqua= {hsv(0.4375,.5,.95)}, lAqua= {hsv(0.49, 0.59, 0.85)},
lCyan= {hsv(0.5, .5,.95)}, lCyan= {hsv(0.51, 0.77, 0.88)},
lNavy= {hsv(0.5625,.5,.95)}, lNavy= {hsv(0.54, 0.80, 0.95)},
lSea= {hsv(0.625, .5,.95)}, lSea= {hsv(0.56, 0.72, 0.97)},
lBlue= {hsv(0.6875,.5,.95)}, lBlue= {hsv(0.64, 0.44, 0.96)},
lViolet= {hsv(0.75, .5,.95)}, lViolet= {hsv(0.73, 0.47, 0.95)},
lPurple= {hsv(0.8125,.5,.95)}, lPurple= {hsv(0.80, 0.62, 0.89)},
lMagenta={hsv(0.875, .5,.95)}, lMagenta= {hsv(0.86, 0.61, 0.89)},
lWine= {hsv(0.9375,.5,.95)}, lWine= {hsv(0.93, 0.57, 0.92)},
dRed= {hsv(0, .9,.5)}, dRed= {hsv(0.00, 0.80, 0.48)},
dFire= {hsv(0.0625,.9,.5)}, dFire= {hsv(0.04, 0.80, 0.34)},
dOrange= {hsv(0.125, .9,.5)}, dOrange= {hsv(0.07, 0.80, 0.39)},
dYellow= {hsv(0.1875,.9,.5)}, dYellow= {hsv(0.11, 0.80, 0.37)},
dLime= {hsv(0.25, .9,.5)}, dLime= {hsv(0.17, 0.80, 0.26)},
dJade= {hsv(0.3125,.9,.5)}, dJade= {hsv(0.31, 0.80, 0.27)},
dGreen= {hsv(0.375, .9,.5)}, dGreen= {hsv(0.33, 0.80, 0.26)},
dAqua= {hsv(0.4375,.9,.5)}, dAqua= {hsv(0.47, 0.80, 0.23)},
dCyan= {hsv(0.5, .9,.5)}, dCyan= {hsv(0.50, 0.80, 0.30)},
dNavy= {hsv(0.5625,.9,.5)}, dNavy= {hsv(0.59, 0.80, 0.42)},
dSea= {hsv(0.625, .9,.5)}, dSea= {hsv(0.64, 0.80, 0.40)},
dBlue= {hsv(0.6875,.9,.5)}, dBlue= {hsv(0.67, 0.80, 0.34)},
dViolet= {hsv(0.75, .9,.5)}, dViolet= {hsv(0.71, 0.80, 0.35)},
dPurple= {hsv(0.8125,.9,.5)}, dPurple= {hsv(0.76, 0.80, 0.32)},
dMagenta={hsv(0.875, .9,.5)}, dMagenta= {hsv(0.87, 0.80, 0.28)},
dWine= {hsv(0.9375,.9,.5)}, dWine= {hsv(0.92, 0.80, 0.28)},
black= {hsv(0,0,.05)}, black= {hsv(0.04, 0.04, 0.14)},
dGray= {hsv(0,0,0.3)}, dGray= {hsv(0.02, 0.05, 0.44)},
gray= {hsv(0,0,0.6)}, gray= {hsv(0.02, 0.05, 0.65)},
lGray= {hsv(0,0,0.8)}, lGray= {hsv(0.02, 0.06, 0.86)},
white= {hsv(0,0,.97)}, white= {hsv(0.01, 0.02, 0.99)},
} }
for k,v in next,{ for k,v in next,{
R='red', F='fire', O='orange', Y='yellow', L='lime', J='jade', G='green', A='aqua', C='cyan', N='navy', S='sea', B='blue', V='violet', P='purple', M='magenta', W='wine', R='red', F='fire', O='orange', Y='yellow', L='lime', J='jade', G='green', A='aqua', C='cyan', N='navy', S='sea', B='blue', V='violet', P='purple', M='magenta', W='wine',

Binary file not shown.

View File

@@ -686,13 +686,7 @@ do
sfx='prerotate' sfx='prerotate'
elseif P:ifoverlap(icb,x,y+1)and P:ifoverlap(icb,x-1,y)and P:ifoverlap(icb,x+1,y)then elseif P:ifoverlap(icb,x,y+1)and P:ifoverlap(icb,x-1,y)and P:ifoverlap(icb,x+1,y)then
sfx='rotatekick' sfx='rotatekick'
if P.gameEnv.shakeFX then P:_rotateField(d)
if d==1 or d==3 then
P.fieldOff.va=P.fieldOff.va+(2-d)*6e-3
else
P.fieldOff.va=P.fieldOff.va+P:getCenterX()*3e-3
end
end
else else
sfx='rotate' sfx='rotate'
end end

View File

@@ -33,6 +33,7 @@ return{
P:_showText(text.maxspeed,0,-140,100,'appear',.6) P:_showText(text.maxspeed,0,-140,100,'appear',.6)
end end
end end
P:shakeField(9)
D.wave=D.wave+1 D.wave=D.wave+1
end end
end end

View File

@@ -42,6 +42,7 @@ return{
P:_showText(text.maxspeed,0,-140,100,'appear',.6) P:_showText(text.maxspeed,0,-140,100,'appear',.6)
end end
end end
P:shakeField(10)
D.wave=D.wave+1 D.wave=D.wave+1
end end
end end

View File

@@ -40,6 +40,7 @@ return{
P:_showText(text.maxspeed,0,-140,100,'appear',.6) P:_showText(text.maxspeed,0,-140,100,'appear',.6)
P.dropDelay,P.gameEnv.drop=2,2 P.dropDelay,P.gameEnv.drop=2,2
end end
P:shakeField(3)
end end
end end
end end

View File

@@ -40,6 +40,7 @@ return{
P.dropDelay,P.gameEnv.drop=5,5 P.dropDelay,P.gameEnv.drop=5,5
P:_showText(text.maxspeed,0,-140,100,'appear',.6) P:_showText(text.maxspeed,0,-140,100,'appear',.6)
end end
P:shakeField(3)
end end
end end
end end

View File

@@ -89,6 +89,7 @@ return
ENV.bone=true ENV.bone=true
P.modeData.target=62 P.modeData.target=62
SFX.play('reach')
else else
p=41 p=41
end end
@@ -112,6 +113,7 @@ return
ENV.fall=4 ENV.fall=4
P.modeData.target=162 P.modeData.target=162
SFX.play('reach')
elseif T==162 then--Stage 7: speed up+++ elseif T==162 then--Stage 7: speed up+++
P:stageComplete(7) P:stageComplete(7)
P.life=P.life+1 P.life=P.life+1
@@ -146,6 +148,7 @@ return
P.modeData.target=260 P.modeData.target=260
p=260 p=260
SFX.play('blip_2') SFX.play('blip_2')
SFX.play('reach')
else else
p=260 p=260
end end

View File

@@ -21,6 +21,7 @@ return{
if D.wave==60 then if D.wave==60 then
P:_showText(text.maxspeed,0,-140,100,'appear',.6) P:_showText(text.maxspeed,0,-140,100,'appear',.6)
end end
P:shakeField(3)
D.timer=0 D.timer=0
D.wave=D.wave+1 D.wave=D.wave+1
end end

View File

@@ -24,6 +24,7 @@ return{
if D.wave==30 then if D.wave==30 then
P:_showText(text.maxspeed,0,-140,100,'appear',.6) P:_showText(text.maxspeed,0,-140,100,'appear',.6)
end end
P:shakeField(9)
D.timer=0 D.timer=0
D.wave=D.wave+1 D.wave=D.wave+1
end end

Binary file not shown.

Binary file not shown.

View File

@@ -4,7 +4,7 @@ return{
{"Translator Note 1", {"Translator Note 1",
"", "",
"help", "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 C29H25N3O5.\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₅.\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", "https://github.com/26F-Studio/Techmino/blob/main/parts/language/dict_en.lua",
}, },
{"Official Website", {"Official Website",

View File

@@ -119,8 +119,15 @@ local function _stencilBoard()gc_rectangle('fill',0,-10,300,610)end
local function _applyField(P) local function _applyField(P)
gc_push('transform') gc_push('transform')
--Apply fieldOffset --Apply shaking
local O=P.fieldOff if P.shakeTimer>0 then
local dx=int(P.shakeTimer/2)
local dy=int(P.shakeTimer/3)
gc_translate(dx^1.6*(dx%2*2-1)*(P.gameEnv.shakeFX+1)/30,dy^1.4*(dy%2*2-1)*(P.gameEnv.shakeFX+1)/30)
end
--Apply swingOffset
local O=P.swingOffset
if P.gameEnv.shakeFX then if P.gameEnv.shakeFX then
local k=P.gameEnv.shakeFX local k=P.gameEnv.shakeFX
gc_translate(O.x*k+150+150,O.y*k+300) gc_translate(O.x*k+150+150,O.y*k+300)

View File

@@ -102,11 +102,12 @@ local function _newEmptyPlayer(id,mini)
end end
--Field position --Field position
P.fieldOff={--Shake FX P.swingOffset={--Shake FX
x=0,y=0, x=0,y=0,
vx=0,vy=0, vx=0,vy=0,
a=0,va=0, a=0,va=0,
} }
P.shakeTimer=0
P.x,P.y,P.size=0,0,1 P.x,P.y,P.size=0,0,1
P.frameColor=COLOR.Z P.frameColor=COLOR.Z

View File

@@ -30,6 +30,25 @@ end
function Player:_createClearingFX(y,spd)--Not used function Player:_createClearingFX(y,spd)--Not used
ins(self.clearFX,{y,0,spd}) ins(self.clearFX,{y,0,spd})
end end
function Player:_rotateField(dir)
if self.gameEnv.shakeFX then
if dir==1 or dir==3 then
self.swingOffset.va=self.swingOffset.va+(2-dir)*6e-3
else
self.swingOffset.va=self.swingOffset.va+self:getCenterX()*3e-3
end
end
end
function Player:shakeField(strength)--Range: 1~10
if self.gameEnv.shakeFX then
self.shakeTimer=max(self.shakeTimer,3*self.gameEnv.shakeFX+int(4*min(max(strength,1),10)))
end
end
function Player:checkTouchSound()
if self.sound and self.curY==self.ghoY then
SFX.play('touch')
end
end
function Player:showText(text,dx,dy,font,style,spd,stop) function Player:showText(text,dx,dy,font,style,spd,stop)
if self.gameEnv.text then if self.gameEnv.text then
ins(self.bonus,TEXT.getText(text,150+dx,300+dy,font,style,spd,stop)) ins(self.bonus,TEXT.getText(text,150+dx,300+dy,font,style,spd,stop))
@@ -139,7 +158,7 @@ function Player:createSplashFX(h)
if self.gameEnv.splashFX then if self.gameEnv.splashFX then
local L=self.field[h] local L=self.field[h]
local size=self.size local size=self.size
local y=self.fieldY+size*(self.fieldOff.y+self.fieldBeneath+self.fieldUp+615)-30*h*size local y=self.fieldY+size*(self.swingOffset.y+self.fieldBeneath+self.fieldUp+615)-30*h*size
for x=1,10 do for x=1,10 do
local c=L[x] local c=L[x]
if c>0 then if c>0 then
@@ -481,6 +500,9 @@ function Player:receive(A,send,time,line)
if self.sound then if self.sound then
SFX.play(send<4 and'blip_1'or'blip_2',min(send+1,5)*.1) SFX.play(send<4 and'blip_1'or'blip_2',min(send+1,5)*.1)
end end
if send>=2 then
self:shakeField(send/2)
end
end end
end end
function Player:clearAttackBuffer() function Player:clearAttackBuffer()
@@ -563,7 +585,7 @@ function Player:freshBlock(mode)--string mode: push/move/fresh/newBlock
if self.curY>self.ghoY then if self.curY>self.ghoY then
self:createDropFX() self:createDropFX()
if ENV.shakeFX then if ENV.shakeFX then
self.fieldOff.vy=.5 self.swingOffset.vy=.5
end end
self.curY=self.ghoY self.curY=self.ghoY
end end
@@ -605,10 +627,9 @@ function Player:freshBlock(mode)--string mode: push/move/fresh/newBlock
end end
--Play sound if touch ground --Play sound if touch ground
if mode=='move'and self.sound and self.curY==self.ghoY then if mode=='move'then
SFX.play('touch') self:checkTouchSound()
end end
end end
function Player:lock() function Player:lock()
local CB=self.cur.bk local CB=self.cur.bk
@@ -797,19 +818,13 @@ function Player:spin(d,ifpre)
self.freshTime=self.freshTime-1 self.freshTime=self.freshTime-1
end end
--Sound & Field shaking --Sound & Field swinging
local sfx local sfx
if ifpre then if ifpre then
sfx='prerotate' sfx='prerotate'
elseif self:ifoverlap(icb,ix,iy+1)and self:ifoverlap(icb,ix-1,iy)and self:ifoverlap(icb,ix+1,iy)then elseif self:ifoverlap(icb,ix,iy+1)and self:ifoverlap(icb,ix-1,iy)and self:ifoverlap(icb,ix+1,iy)then
sfx='rotatekick' sfx='rotatekick'
if self.gameEnv.shakeFX then self:_rotateField(d)
if d==1 or d==3 then
self.fieldOff.va=self.fieldOff.va+(2-d)*6e-3
else
self.fieldOff.va=self.fieldOff.va+self:getCenterX()*3e-3
end
end
else else
sfx='rotate' sfx='rotate'
end end
@@ -1846,10 +1861,10 @@ local function _updateMisc(P)
end end
end end
--Field shaking --Field swinging
if P.gameEnv.shakeFX then if P.gameEnv.shakeFX then
local O=P.fieldOff local O=P.swingOffset
O.vx=O.vx*.7-abs(O.x)^1.3*(O.x>0 and .1 or -.1) O.vx=O.vx*.6-abs(O.x)^1.3*(O.x>0 and .1 or -.1)
O.x=O.x+O.vx O.x=O.x+O.vx
O.vy=O.vy*.7-abs(O.y)^1.2*(O.y>0 and .1 or -.1) O.vy=O.vy*.7-abs(O.y)^1.2*(O.y>0 and .1 or -.1)
@@ -1862,6 +1877,11 @@ local function _updateMisc(P)
end end
end end
--Field Shaking
if P.shakeTimer>0 then
P.shakeTimer=P.shakeTimer-1
end
--Update texts --Update texts
if P.bonus then if P.bonus then
TEXT.update(1/60,P.bonus) TEXT.update(1/60,P.bonus)
@@ -1950,13 +1970,9 @@ local function update_alive(P)
if GAME.modeEnv.royaleMode then if GAME.modeEnv.royaleMode then
local v=P.swappingAtkMode local v=P.swappingAtkMode
if P.keyPressing[9]then local tar=#P.field>15 and 4 or 8
P.swappingAtkMode=min(v+2,30) if v~=tar then
else P.swappingAtkMode=v+(v<tar and 1 or -1)
local tar=#P.field>15 and 4 or 8
if v~=tar then
P.swappingAtkMode=v+(v<tar and 1 or -1)
end
end end
end end
@@ -1998,7 +2014,7 @@ local function update_alive(P)
end end
end end
if mov>=das and ENV.shakeFX and P.cur and P:ifoverlap(P.cur.bk,P.curX+1,P.curY)then if mov>=das and ENV.shakeFX and P.cur and P:ifoverlap(P.cur.bk,P.curX+1,P.curY)then
P.fieldOff.vx=.5 P.swingOffset.vx=.5
end end
else else
P.movDir=0 P.movDir=0
@@ -2023,7 +2039,7 @@ local function update_alive(P)
end end
end end
if mov>=das and ENV.shakeFX and P.cur and P:ifoverlap(P.cur.bk,P.curX-1,P.curY)then if mov>=das and ENV.shakeFX and P.cur and P:ifoverlap(P.cur.bk,P.curX-1,P.curY)then
P.fieldOff.vx=-.5 P.swingOffset.vx=-.5
end end
else else
P.movDir=0 P.movDir=0
@@ -2042,7 +2058,7 @@ local function update_alive(P)
end end
--Drop pressed --Drop pressed
if P.keyPressing[7]and not P.keyPressing[9]then if P.keyPressing[7]then
P.downing=P.downing+1 P.downing=P.downing+1
local d=P.downing-ENV.sddas local d=P.downing-ENV.sddas
if d>1 then if d>1 then
@@ -2054,7 +2070,7 @@ local function update_alive(P)
P:act_insDown() P:act_insDown()
end end
if ENV.shakeFX then if ENV.shakeFX then
P.fieldOff.vy=.2 P.swingOffset.vy=.2
end end
end end
else else
@@ -2116,9 +2132,8 @@ local function update_alive(P)
if P.ghoY~=P.curY then if P.ghoY~=P.curY then
P.dropDelay=ENV.drop P.dropDelay=ENV.drop
elseif P.sound then
SFX.play('touch')
end end
P:checkTouchSound()
else else
P.lockDelay=P.lockDelay-1 P.lockDelay=P.lockDelay-1
if P.lockDelay>=0 then if P.lockDelay>=0 then
@@ -2435,12 +2450,7 @@ function Player:act_moveLeft(auto)
self.ctrlCount=self.ctrlCount+1 self.ctrlCount=self.ctrlCount+1
end end
self.movDir=-1 self.movDir=-1
if self.keyPressing[9]then if self.control and self.waiting==-1 then
if self.gameEnv.swap then
self:changeAtkMode(1)
self.keyPressing[1]=false
end
elseif self.control and self.waiting==-1 then
if self.cur and not self:ifoverlap(self.cur.bk,self.curX-1,self.curY)then if self.cur and not self:ifoverlap(self.cur.bk,self.curX-1,self.curY)then
self:createMoveFX('left') self:createMoveFX('left')
self.curX=self.curX-1 self.curX=self.curX-1
@@ -2461,12 +2471,7 @@ function Player:act_moveRight(auto)
self.ctrlCount=self.ctrlCount+1 self.ctrlCount=self.ctrlCount+1
end end
self.movDir=1 self.movDir=1
if self.keyPressing[9]then if self.control and self.waiting==-1 then
if self.gameEnv.swap then
self:changeAtkMode(2)
self.keyPressing[2]=false
end
elseif self.control and self.waiting==-1 then
if self.cur and not self:ifoverlap(self.cur.bk,self.curX+1,self.curY)then if self.cur and not self:ifoverlap(self.cur.bk,self.curX+1,self.curY)then
self:createMoveFX('right') self:createMoveFX('right')
self.curX=self.curX+1 self.curX=self.curX+1
@@ -2505,12 +2510,7 @@ function Player:act_rot180()
end end
function Player:act_hardDrop() function Player:act_hardDrop()
local ENV=self.gameEnv local ENV=self.gameEnv
if self.keyPressing[9]then if self.control and self.waiting==-1 and self.cur then
if ENV.swap then
self:changeAtkMode(3)
end
self.keyPressing[6]=false
elseif self.control and self.waiting==-1 and self.cur then
if self.lastPiece.autoLock and self.frameRun-self.lastPiece.frame<ENV.dropcut then if self.lastPiece.autoLock and self.frameRun-self.lastPiece.frame<ENV.dropcut then
SFX.play('drop_cancel',.3) SFX.play('drop_cancel',.3)
else else
@@ -2524,8 +2524,8 @@ function Player:act_hardDrop()
end end
end end
if ENV.shakeFX then if ENV.shakeFX then
self.fieldOff.vy=.6 self.swingOffset.vy=.6
self.fieldOff.va=self.fieldOff.va+self:getCenterX()*6e-4 self.swingOffset.va=self.swingOffset.va+self:getCenterX()*6e-4
end end
self.lockDelay=-1 self.lockDelay=-1
self:drop() self:drop()
@@ -2535,30 +2535,25 @@ function Player:act_hardDrop()
end end
function Player:act_softDrop() function Player:act_softDrop()
local ENV=self.gameEnv local ENV=self.gameEnv
if self.keyPressing[9]then self.downing=1
if ENV.swap then if self.control and self.waiting==-1 and self.cur then
self:changeAtkMode(4) if self.curY>self.ghoY then
end self.curY=self.curY-1
else self:freshBlock('fresh')
self.downing=1 self.spinLast=false
if self.control and self.waiting==-1 and self.cur then self:checkTouchSound()
if self.curY>self.ghoY then elseif ENV.deepDrop then
self.curY=self.curY-1 local CB=self.cur.bk
self:freshBlock('fresh') local y=self.curY-1
self.spinLast=false while self:ifoverlap(CB,self.curX,y)and y>0 do
elseif ENV.deepDrop then y=y-1
local CB=self.cur.bk end
local y=self.curY-1 if y>0 then
while self:ifoverlap(CB,self.curX,y)and y>0 do self.ghoY=y
y=y-1 self:createDropFX()
end self.curY=y
if y>0 then self:freshBlock('move')
self.ghoY=y SFX.play('swipe')
self:createDropFX()
self.curY=y
self:freshBlock('move')
SFX.play('swipe')
end
end end
end end
end end
@@ -2592,7 +2587,7 @@ function Player:act_insLeft(auto)
self.spinLast=false self.spinLast=false
end end
if self.gameEnv.shakeFX then if self.gameEnv.shakeFX then
self.fieldOff.vx=-.5 self.swingOffset.vx=-1.5
end end
if auto then if auto then
if self.ctrlCount==0 then if self.ctrlCount==0 then
@@ -2616,7 +2611,7 @@ function Player:act_insRight(auto)
self.spinLast=false self.spinLast=false
end end
if self.gameEnv.shakeFX then if self.gameEnv.shakeFX then
self.fieldOff.vx=.5 self.swingOffset.vx=1.5
end end
if auto then if auto then
if self.ctrlCount==0 then if self.ctrlCount==0 then
@@ -2631,12 +2626,13 @@ function Player:act_insDown()
local ENV=self.gameEnv local ENV=self.gameEnv
self:createDropFX() self:createDropFX()
if ENV.shakeFX then if ENV.shakeFX then
self.fieldOff.vy=.5 self.swingOffset.vy=.5
end end
self.curY=self.ghoY self.curY=self.ghoY
self.lockDelay=ENV.lock self.lockDelay=ENV.lock
self.spinLast=false self.spinLast=false
self:freshBlock('fresh') self:freshBlock('fresh')
self:checkTouchSound()
end end
end end
function Player:act_down1() function Player:act_down1()

View File

@@ -25,15 +25,16 @@ local function _setLang(lid)
TEXT.show(langList[lid],640,360,100,'appear',.626) TEXT.show(langList[lid],640,360,100,'appear',.626)
collectgarbage() collectgarbage()
end end
scene.widgetList={ scene.widgetList={
WIDGET.newButton{x=271,y=190,w=346,h=120,font=40, fText=langList.zh, color='O',code=function()_setLang('zh')end}, WIDGET.newButton{x=271,y=190,w=346,h=120,font=40, fText=langList.zh, color='O',code=function()_setLang('zh')end},
WIDGET.newButton{x=637,y=190,w=346,h=120,font=40, fText=langList.zh_trad, color='F',code=function()_setLang('zh_trad')end}, WIDGET.newButton{x=637,y=190,w=346,h=120,font=40, fText=langList.zh_trad, color='F',code=function()_setLang('zh_trad')end},
WIDGET.newButton{x=1003,y=190,w=346,h=120,font=40, fText=langList.zh_full, color='R',code=function()_setLang('zh_full')end}, WIDGET.newButton{x=1003,y=190,w=346,h=120,font=40, fText=langList.zh_full, color='R',code=function()_setLang('zh_full')end},
WIDGET.newButton{x=225,y=331,w=255,h=120,font=40, fText=langList.en, color='Y',code=function()_setLang('en')end}, WIDGET.newButton{x=225,y=331,w=255,h=120,font=40, fText=langList.en, color='L',code=function()_setLang('en')end},
WIDGET.newButton{x=500,y=331,w=255,h=120,font=40, fText=langList.fr, color='L',code=function()_setLang('fr')end}, WIDGET.newButton{x=500,y=331,w=255,h=120,font=40, fText=langList.fr, color='J',code=function()_setLang('fr')end},
WIDGET.newButton{x=775,y=331,w=255,h=120,font=40, fText=langList.es, color='J',code=function()_setLang('es')end}, WIDGET.newButton{x=775,y=331,w=255,h=120,font=40, fText=langList.es, color='G',code=function()_setLang('es')end},
WIDGET.newButton{x=1050,y=331,w=255,h=120,font=40, fText=langList.pt, color='G',code=function()_setLang('pt')end}, WIDGET.newButton{x=1050,y=331,w=255,h=120,font=40, fText=langList.pt, color='dG',code=function()_setLang('pt')end},
WIDGET.newButton{x=271,y=472,w=346,h=120,font=45, fText=langList.zh_grass,color='N',code=function()_setLang('zh_grass')end}, WIDGET.newButton{x=271,y=472,w=346,h=120,font=45, fText=langList.zh_grass,color='N',code=function()_setLang('zh_grass')end},
WIDGET.newButton{x=637,y=472,w=346,h=120,font=45, fText=langList.zh_yygq, color='S',code=function()_setLang('zh_yygq')end}, WIDGET.newButton{x=637,y=472,w=346,h=120,font=45, fText=langList.zh_yygq, color='S',code=function()_setLang('zh_yygq')end},

View File

@@ -20,8 +20,8 @@ local author={
["secret7th remix"]="柒栎流星", ["secret7th remix"]="柒栎流星",
["jazz nihilism"]="Trebor", ["jazz nihilism"]="Trebor",
["race remix"]="柒栎流星", ["race remix"]="柒栎流星",
["sakura"]="ZUN & C29H25N3O5", ["sakura"]="ZUN & C₂₉H₂₅N₃O₅",
["1989"]="C29H25N3O5", ["1989"]="C₂₉H₂₅N₃O₅",
} }
local scene={} local scene={}

View File

@@ -91,9 +91,10 @@ end
function scene.draw() function scene.draw()
setFont(15) setFont(15)
for i=1,#list do local l=#list
for i=1,l do
gc.setColor(1,1,1,list[i][2]/30) gc.setColor(1,1,1,list[i][2]/30)
gc.print(list[i][1],20,20*i) gc.print(list[i][1],20,20*(l-i+1))
end end
end end

View File

@@ -18,12 +18,14 @@ return[=[
新增: 新增:
新模式:竞速-效率 新模式:竞速-效率
新模式:无尽马拉松 新模式:无尽马拉松
新增场地抖动特效
新增繁中语言,新语言设置菜单布局 新增繁中语言,新语言设置菜单布局
新BGM:1989(用于经典模式,by C29H25N3O5) 新BGM:1989(用于经典模式,by C₂₉H₂₅N₃O₅)
改动: 改动:
移动音效改为触地音效,在方块因重力或旋转触地时也会播放 移动音效改为触地音效,在方块因重力或旋转触地时也会播放
再调整场地晃动的阻力,看起来更舒服
更换数字和英文字符的字体 更换数字和英文字符的字体
游戏颜色表改用hsv生成 重做全局颜色表(by C₂₉H₂₅N₃O₅)
重新安排一些模式的BGM 重新安排一些模式的BGM
只在更新后触发自动转换以旧版本模式名存储的数据 只在更新后触发自动转换以旧版本模式名存储的数据
修复: 修复:
@@ -77,16 +79,16 @@ return[=[
新语音包:miku(by vocaloidvictory) 新语音包:miku(by vocaloidvictory)
新BGM:Jazz nihilism(用于节日主题,by Trebor) 新BGM:Jazz nihilism(用于节日主题,by Trebor)
新BGM:Race remix(用于大师-ph,by 柒栎流星) 新BGM:Race remix(用于大师-ph,by 柒栎流星)
新BGM:Sakura(用于限时打分,by C29H25N3O5) 新BGM:Sakura(用于限时打分,by C₂₉H₂₅N₃O₅)
新BGM:Null(用于节日主题) 新BGM:Null(用于节日主题)
新音效:单次消5/6行 新音效:单次消5/6行
新机制:swap(hold的另一种实现) 新机制:swap(hold的另一种实现)
新皮肤:shiny(by C29H25N3O5) 新皮肤:shiny(by C₂₉H₂₅N₃O₅)
新语言:机翻 新语言:机翻
新小程序:Link,Arithmeic 新小程序:Link,Arithmeic
新音效室UI(idea by Trebor) 新音效室UI(idea by Trebor)
新虚拟按键贴图(by C29H25N3O5) 新虚拟按键贴图(by C₂₉H₂₅N₃O₅)
新功能图标(by C29H25N3O5) 新功能图标(by C₂₉H₂₅N₃O₅)
添加失去焦点后自动静音的设置 #281 添加失去焦点后自动静音的设置 #281
添加启动时是否联网的开关 #377 添加启动时是否联网的开关 #377
添加总音量滑条,移除静音按钮 添加总音量滑条,移除静音按钮
@@ -99,7 +101,7 @@ return[=[
回合制模式改为7块一个回合与两条命 回合制模式改为7块一个回合与两条命
优化master-ex/ph的信息显示 优化master-ex/ph的信息显示
节奏模式不再禁止瞬移 #287 节奏模式不再禁止瞬移 #287
字体文件裁剪整理,补充Tech定制字符(by C29H25N3O5) 字体文件裁剪整理,补充Tech定制字符(by C₂₉H₂₅N₃O₅)
可以收到不同语言的公告了(目前仅支持中英 其他不会写) 可以收到不同语言的公告了(目前仅支持中英 其他不会写)
降低触发防沉迷的两个时间点为2/4小时 降低触发防沉迷的两个时间点为2/4小时
微调键位设置逻辑,添加文本说明 微调键位设置逻辑,添加文本说明

View File

@@ -1,5 +1,5 @@
return{ return{
["apkCode"]=394, ["apkCode"]=395,
["code"]=1605, ["code"]=1605,
["string"]="V0.16.5", ["string"]="V0.16.5",
["room"]="ver A-0", ["room"]="ver A-0",