Compare commits

...

39 Commits

Author SHA1 Message Date
ParticleG
98ae0f2762 - Fix wrong folder name 2022-12-02 14:42:12 +08:00
ParticleG
963bc80439 - Bump Zframework version
- Fix android CC
2022-12-02 14:28:16 +08:00
Particle_G
4106dc454e Ci fix linux (#796)
* - Try fix linux

* - Try fix linux

* - Fix CC path

* - Try fix CC

* - Try fix CC

* - Remove temporary 'if's
2022-12-02 11:50:54 +08:00
MrZ_26
0ba26aa836 框架跟进 2022-12-02 01:18:37 +08:00
ParticleG
a4c775174b - Try fix Linux shared libs 2022-12-01 22:03:43 +08:00
sakurw
29c40c34fe Update dict_ja.lua (#793) 2022-12-01 10:25:29 +08:00
sakurw
44cb889b91 Update lang_ja.lua (#791) 2022-12-01 10:24:23 +08:00
ParticleG
915d65d2f4 - Update workflow 2022-12-01 10:18:56 +08:00
MrZ_26
8b7c270cf6 版本推进 2022-11-30 01:40:26 +08:00
MrZ_26
a3f07f8ce4 修复单机模式玩家uid问题,解决未登录状态下回合制报错 2022-11-29 01:10:58 +08:00
MrZ_26
91d3252685 删除可能远古留下来的account文件 2022-11-29 01:10:24 +08:00
MrZ_26
f9d9112651 修复第一次启动选择语言后直接就退出了 2022-11-28 23:37:47 +08:00
MrZ_26
477a1acc61 框架跟进,修复require模块在mac系统的崩溃 close #788 2022-11-28 23:31:28 +08:00
MrZ_26
4770366f74 修正dict_ja几处语法错误 2022-11-28 23:02:27 +08:00
sakurw
1c66b4dce1 Update dict_ja.lua (#790) 2022-11-28 23:00:41 +08:00
sakurw
3a19bb534a Update lang_ja.lua (#789) 2022-11-28 22:59:50 +08:00
sakurw
f39b3cfd4a Update lang_ja.lua (#785) 2022-11-26 17:02:43 +08:00
MrZ_26
f0410243c4 攻击竞速模式左侧攻击数字从%.1f改为%d close #780 2022-11-25 10:41:47 +08:00
MrZ_26
8abc40707a 彻底删除rin语音包相关内容(作者说不搞了) 2022-11-20 11:48:33 +08:00
MrZ_26
f91fe34a12 修复两个堆叠模式消除垃圾行的时候没减少内部的垃圾行高计数 2022-11-12 16:44:38 +08:00
MrZ_26
e9bf6c3b58 因为改了srs+踢墙表所以提升房间版本 2022-11-09 19:45:34 +08:00
MrZ_26
17c660b5a2 修正SRS_plus旋转系统的i不对称(原来8个90度的表就是srs的没改) close #772 2022-11-09 19:44:12 +08:00
sakurw
ed46f73987 Update lang_ja.lua (#773) 2022-11-09 19:22:17 +08:00
MrZ_26
e1200b5038 整理代码(修复cc加载失败有时候会报错) 2022-11-07 16:46:24 +08:00
MrZ_26
7f7ea6ac97 整理代码,调整加载顺序 2022-11-06 20:47:28 +08:00
MrZ_26
f70edaac83 移除加载时可能的强制重启(防止ios出问题)
几处love退出改为去quit场景(防止ios出问题)
整理代码
框架跟进
2022-11-06 17:28:54 +08:00
sakurw
d932febe89 Update lang_ja.lua (#770) 2022-11-06 13:39:51 +08:00
MrFaq2018
945a63c51d Update lang_es.lua (#771)
For next ver.
2022-11-06 13:39:29 +08:00
MrZ_26
da716ea5c5 版本推进 2022-11-05 23:07:54 +08:00
MrZ_26
c6f92a3030 略微降低客户端发言频率限制
发言id和文本之间加一个空格
框架跟进,修复textBox控件和listBox控件显示范围问题
2022-11-05 22:59:21 +08:00
MrZ_26
267e2dc544 修复其他玩家进房check是否已存在的时候因为访问不存在的玩家而报错 2022-11-05 22:59:21 +08:00
MrZ_26
cb7d3afdfb 删除服务端的playerManager.noPassword消息 2022-11-05 22:59:21 +08:00
MrZ_26
b57e863c28 联网游戏可以用键盘ctrl+0123456切换队伍 2022-11-05 22:59:21 +08:00
MrZ_26
7aed15fd4f 修正其他玩家的结束游戏消息处理太早导致录像没放完出问题 2022-11-05 22:59:21 +08:00
MrZ_26
6d71b26595 自定义游戏菜单微调 2022-11-05 22:59:21 +08:00
sakurw
1df5406cb3 Update lang_ja.lua (#768) 2022-11-05 15:47:36 +08:00
MrZ_26
a2b762dcbc 添加几个房间内命令
添加房间被解散的语言文本
把一处神秘写法改正常一点
2022-11-05 02:14:51 +08:00
MrZ_26
c2d29c3d6a 联网游戏界面添加选队伍按钮,加一个没卵用的退出房间命令 2022-11-04 17:15:36 +08:00
MrZ_26
da602eb693 两个输入验证码的地方添加粘贴按钮
整理代码
2022-11-04 16:45:51 +08:00
97 changed files with 1403 additions and 1185 deletions

View File

@@ -146,6 +146,7 @@ jobs:
build-android: build-android:
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: [get-info, build-core, auto-test] needs: [get-info, build-core, auto-test]
if: github.event_name != 'pull_request'
env: env:
OUTPUT_FOLDER: ./build OUTPUT_FOLDER: ./build
RELEASE_FOLDER: ./release RELEASE_FOLDER: ./release
@@ -176,14 +177,7 @@ jobs:
uses: ./.github/actions/get-cc uses: ./.github/actions/get-cc
with: with:
platform: Android platform: Android
dir: ./ColdClear dir: ./libAndroid
- name: Process ColdClear
shell: bash
run: |
mkdir -p ./libAndroid/armeabi-v7a/
mkdir -p ./libAndroid/arm64-v8a/
mv ./ColdClear/armeabi-v7a/libCCloader.so ./libAndroid/armeabi-v7a/
mv ./ColdClear/arm64-v8a/libCCloader.so ./libAndroid/arm64-v8a/
- name: Build Android packages - name: Build Android packages
id: build-packages id: build-packages
uses: love-actions/love-actions-android@v1 uses: love-actions/love-actions-android@v1
@@ -197,7 +191,6 @@ jobs:
keystore-store-password: ${{ secrets.ANDROID_KEYSTORE_STOREPASSWORD }} keystore-store-password: ${{ secrets.ANDROID_KEYSTORE_STOREPASSWORD }}
love-package: ${{ env.CORE_LOVE_PACKAGE_PATH }} love-package: ${{ env.CORE_LOVE_PACKAGE_PATH }}
resource-path: ./.github/build/android/${{ env.BUILD_TYPE }}/res resource-path: ./.github/build/android/${{ env.BUILD_TYPE }}/res
libs-path: ./ColdClear/
extra-assets: ./libAndroid/ extra-assets: ./libAndroid/
product-name: ${{ steps.process-app-name.outputs.product-name }} product-name: ${{ steps.process-app-name.outputs.product-name }}
version-string: ${{ needs.get-info.outputs.version-string }} version-string: ${{ needs.get-info.outputs.version-string }}
@@ -232,8 +225,8 @@ jobs:
build-ios: build-ios:
runs-on: macos-latest runs-on: macos-latest
if: github.event_name != 'pull_request'
needs: [get-info, build-core, auto-test] needs: [get-info, build-core, auto-test]
if: github.event_name != 'pull_request'
env: env:
OUTPUT_FOLDER: ./build OUTPUT_FOLDER: ./build
RELEASE_FOLDER: ./release RELEASE_FOLDER: ./release
@@ -352,10 +345,8 @@ jobs:
shell: bash shell: bash
run: | run: |
cd ./ColdClear cd ./ColdClear
mkdir ./libs mkdir -p ./lib/lua/5.1
mv ./x64/libcold_clear.so ./libs mv ./x64/CCloader.so ./lib/lua/5.1
mkdir ./shared
mv ./x64/CCloader.so ./shared
- name: Build Linux packages - name: Build Linux packages
id: build-packages id: build-packages
uses: love-actions/love-actions-linux@v1 uses: love-actions/love-actions-linux@v1
@@ -364,8 +355,7 @@ jobs:
executable-name: app executable-name: app
icon-path: ./.github/build/linux/${{ env.BUILD_TYPE }}/icon.png icon-path: ./.github/build/linux/${{ env.BUILD_TYPE }}/icon.png
love-package: ${{ env.CORE_LOVE_PACKAGE_PATH }} love-package: ${{ env.CORE_LOVE_PACKAGE_PATH }}
libs-path: ./ColdClear/libs/ lib-path: ./ColdClear/lib
shared-path: ./ColdClear/shared/
product-name: ${{ steps.process-app-name.outputs.product-name }} product-name: ${{ steps.process-app-name.outputs.product-name }}
output-folder: ${{ env.OUTPUT_FOLDER }} output-folder: ${{ env.OUTPUT_FOLDER }}
- name: Upload AppImage artifact - name: Upload AppImage artifact
@@ -397,8 +387,8 @@ jobs:
build-macos-appstore: build-macos-appstore:
runs-on: macos-latest runs-on: macos-latest
if: github.event_name != 'pull_request'
needs: [get-info, build-core, auto-test] needs: [get-info, build-core, auto-test]
if: github.event_name != 'pull_request'
env: env:
OUTPUT_FOLDER: ./build OUTPUT_FOLDER: ./build
RELEASE_FOLDER: ./release RELEASE_FOLDER: ./release
@@ -489,8 +479,8 @@ jobs:
build-macos-portable: build-macos-portable:
runs-on: macos-latest runs-on: macos-latest
if: github.event_name != 'pull_request'
needs: [get-info, build-core, auto-test] needs: [get-info, build-core, auto-test]
if: github.event_name != 'pull_request'
env: env:
OUTPUT_FOLDER: ./build OUTPUT_FOLDER: ./build
RELEASE_FOLDER: ./release RELEASE_FOLDER: ./release
@@ -721,6 +711,7 @@ jobs:
if "${{ needs.build-windows.result }}" == "success": if "${{ needs.build-windows.result }}" == "success":
f.write("- Windows packages: [WeTransfer](${{ needs.build-windows.outputs.download-url }})\n") f.write("- Windows packages: [WeTransfer](${{ needs.build-windows.outputs.download-url }})\n")
- name: Send Discord message - name: Send Discord message
if: github.event_name != 'pull_request'
uses: Sniddl/discord-commits@v1.5 uses: Sniddl/discord-commits@v1.5
with: with:
webhook: ${{ secrets.DISCORD_WEBHOOK }} webhook: ${{ secrets.DISCORD_WEBHOOK }}

391
main.lua
View File

@@ -60,7 +60,7 @@ BGM.setMaxSources(5)
VOC.setDiversion(.62) VOC.setDiversion(.62)
WIDGET.setOnChange(function() WIDGET.setOnChange(function()
if SCN.cur~='custom_field' then if SCN.cur~='net_game' and SCN.cur~='custom_field' then
local colorList=THEME.getThemeColor() local colorList=THEME.getThemeColor()
if colorList then if colorList then
for _,W in next,SCN.scenes[SCN.cur].widgetList do for _,W in next,SCN.scenes[SCN.cur].widgetList do
@@ -72,8 +72,6 @@ WIDGET.setOnChange(function()
end end
end) end)
table.insert(_LOADTIMELIST_,("Load Zframework: %.3fs"):format(TIME()-_LOADTIME_))
-- Create shortcuts -- Create shortcuts
setFont=FONT.set setFont=FONT.set
getFont=FONT.get getFont=FONT.get
@@ -98,10 +96,6 @@ for _,v in next,{'conf','record','replay','cache','lib'} do
end end
end end
CHAR=require'parts.char'
require'parts.gameTables'
require'parts.gameFuncs'
-- Load shader files from SOURCE ONLY -- Load shader files from SOURCE ONLY
SHADER={} SHADER={}
for _,v in next,fs.getDirectoryItems('parts/shaders') do for _,v in next,fs.getDirectoryItems('parts/shaders') do
@@ -111,6 +105,11 @@ for _,v in next,fs.getDirectoryItems('parts/shaders') do
end end
end end
-- Load modules
CHAR=require'parts.char'
require'parts.gameTables'
require'parts.gameFuncs'
THEME= require'parts.theme' THEME= require'parts.theme'
LINE= require'parts.line' LINE= require'parts.line'
DATA= require'parts.data' DATA= require'parts.data'
@@ -121,7 +120,7 @@ USERS= require'parts.users'
NET= require'parts.net' NET= require'parts.net'
VK= require'parts.virtualKey' VK= require'parts.virtualKey'
BOT= require'parts.bot' BOT= require'parts.bot'
RSlist= require'parts.RSlist'DSCP=RSlist.TRS.centerPos RSlist= require'parts.RSlist'; DSCP=RSlist.TRS.centerPos
PLY= require'parts.player' PLY= require'parts.player'
NETPLY= require'parts.netPlayer' NETPLY= require'parts.netPlayer'
MODES= require'parts.modes' MODES= require'parts.modes'
@@ -132,9 +131,28 @@ setmetatable(TEXTURE,{__index=function(self,k)
return self[k] return self[k]
end}) end})
table.insert(_LOADTIMELIST_,("Load Parts: %.3fs"):format(TIME()-_LOADTIME_)) -- Load mode files
for i=1,#MODES do
local m=MODES[i]-- Mode template
if FILE.isSafe('parts/modes/'..m.name) then
TABLE.complete(require('parts.modes.'..m.name),MODES[i])
MODES[m.name],MODES[i]=MODES[i]
end
end
for _,v in next,fs.getDirectoryItems('parts/modes') do
if FILE.isSafe('parts/modes/'..v) and not MODES[v:sub(1,-5)] then
local M={name=v:sub(1,-5)}
local modeData=require('parts.modes.'..M.name)
if modeData.env then
TABLE.complete(modeData,M)
MODES[M.name]=M
end
end
end
-- Init Zframework table.insert(_LOADTIMELIST_,("Load Modules: %.3fs"):format(TIME()-_LOADTIME_))
-- Initialize Zframework
do-- Z.setCursor do-- Z.setCursor
local normImg=GC.DO{16,16, local normImg=GC.DO{16,16,
{'fCirc',8,8,4}, {'fCirc',8,8,4},
@@ -239,45 +257,6 @@ Z.setOnQuit(function()
destroyPlayers() destroyPlayers()
end) end)
-- Load settings and statistics
if
not (
pcall(TABLE.cover, loadFile('conf/user', '-json -canSkip') or loadFile('conf/user', '-luaon -canSkip') or{},USER) and
pcall(TABLE.cover, loadFile('conf/unlock', '-json -canSkip') or loadFile('conf/unlock', '-luaon -canSkip') or{},RANKS) and
pcall(TABLE.update,loadFile('conf/settings', '-json -canSkip') or loadFile('conf/settings', '-luaon -canSkip') or{},SETTING) and
pcall(TABLE.coverR,loadFile('conf/data', '-json -canSkip') or loadFile('conf/data', '-luaon -canSkip') or{},STAT) and
pcall(TABLE.cover, loadFile('conf/key', '-json -canSkip') or loadFile('conf/key', '-luaon -canSkip') or{},KEY_MAP) and
pcall(TABLE.cover, loadFile('conf/virtualkey','-json -canSkip') or loadFile('conf/virtualkey','-luaon -canSkip') or{},VK_ORG)
)
then
MES.new('error',"An error occured during loading, and some data was lost.")
end
-- Initialize fields, sequence, missions, gameEnv for cutsom game
local fieldData=loadFile('conf/customBoards','-string -canSkip')
if fieldData then
fieldData=STRING.split(fieldData,"!")
for i=1,#fieldData do
DATA.pasteBoard(fieldData[i],i)
end
else
FIELD[1]=DATA.newBoard()
end
local sequenceData=loadFile('conf/customSequence','-string -canSkip')
if sequenceData then
DATA.pasteSequence(sequenceData)
end
local missionData=loadFile('conf/customMissions','-string -canSkip')
if missionData then
DATA.pasteMission(missionData)
end
local customData=loadFile('conf/customEnv','-canSkip')
if customData and customData['version']==VERSION.code then
TABLE.complete(customData,CUSTOMENV)
end
TABLE.complete(require"parts.customEnv0",CUSTOMENV)
-- Initialize image libs -- Initialize image libs
IMG.init{ IMG.init{
lock='media/image/mess/lock.png', lock='media/image/mess/lock.png',
@@ -299,7 +278,6 @@ IMG.init{
xiaoyaCH='media/image/characters/xiaoya.png', xiaoyaCH='media/image/characters/xiaoya.png',
xiaoyaOmino='media/image/characters/xiaoya_Omino.png', xiaoyaOmino='media/image/characters/xiaoya_Omino.png',
mikuCH='media/image/characters/miku.png', mikuCH='media/image/characters/miku.png',
rinCH='media/image/characters/rin.png',
z={ z={
character='media/image/characters/z_character.png', character='media/image/characters/z_character.png',
screen1='media/image/characters/z_screen1.png', screen1='media/image/characters/z_screen1.png',
@@ -386,6 +364,137 @@ VOC.init{
'welcome', 'welcome',
} }
table.insert(_LOADTIMELIST_,("Initialize Modules: %.3fs"):format(TIME()-_LOADTIME_))
-- Load settings and statistics
if
not (
pcall(TABLE.cover, loadFile('conf/user', '-json -canSkip') or loadFile('conf/user', '-luaon -canSkip') or{},USER) and
pcall(TABLE.cover, loadFile('conf/unlock', '-json -canSkip') or loadFile('conf/unlock', '-luaon -canSkip') or{},RANKS) and
pcall(TABLE.update,loadFile('conf/settings', '-json -canSkip') or loadFile('conf/settings', '-luaon -canSkip') or{},SETTING) and
pcall(TABLE.coverR,loadFile('conf/data', '-json -canSkip') or loadFile('conf/data', '-luaon -canSkip') or{},STAT) and
pcall(TABLE.cover, loadFile('conf/key', '-json -canSkip') or loadFile('conf/key', '-luaon -canSkip') or{},KEY_MAP) and
pcall(TABLE.cover, loadFile('conf/virtualkey','-json -canSkip') or loadFile('conf/virtualkey','-luaon -canSkip') or{},VK_ORG)
)
then
MES.new('error',"An error occured during loading, and some data was lost.")
end
-- Initialize fields, sequence, missions, gameEnv for cutsom game
local fieldData=loadFile('conf/customBoards','-string -canSkip')
if fieldData then
fieldData=STRING.split(fieldData,"!")
for i=1,#fieldData do
DATA.pasteBoard(fieldData[i],i)
end
else
FIELD[1]=DATA.newBoard()
end
local sequenceData=loadFile('conf/customSequence','-string -canSkip')
if sequenceData then
DATA.pasteSequence(sequenceData)
end
local missionData=loadFile('conf/customMissions','-string -canSkip')
if missionData then
DATA.pasteMission(missionData)
end
local customData=loadFile('conf/customEnv','-canSkip')
if customData and customData['version']==VERSION.code then
TABLE.complete(customData,CUSTOMENV)
end
TABLE.complete(require"parts.customEnv0",CUSTOMENV)
-- Update data
do
if type(STAT.version)~='number' then
STAT.version=0
end
if STAT.version<1700 and SETTING.dascut<5 then
SETTING.dascut=SETTING.dascut+1
end
if RANKS.stack_e then
RANKS.stack_e=nil; fs.remove('record/stack_e.rec')
RANKS.stack_h=nil; fs.remove('record/stack_h.rec')
RANKS.stack_u=nil; fs.remove('record/stack_u.rec')
end
if RANKS.stack_20l then
RANKS.stack_20l=nil; fs.remove('record/stack_20l.rec')
RANKS.stack_40l=nil; fs.remove('record/stack_40l.rec')
RANKS.stack_100l=nil; fs.remove('record/stack_100l.rec')
end
if RANKS.rhythm_e then
RANKS.rhythm_e=nil; fs.remove('record/rhythm_e.rec')
RANKS.rhythm_h=nil; fs.remove('record/rhythm_h.rec')
RANKS.rhythm_u=nil; fs.remove('record/rhythm_u.rec')
end
if RANKS.bigbang then fs.remove('record/bigbang.rec') end
if RANKS.clearRush then fs.remove('record/clearRush.rec') end
if STAT.version~=VERSION.code then
for k,v in next,MODE_UPDATE_MAP do
if RANKS[k] then
RANKS[v]=RANKS[k]
RANKS[k]=nil
end
k='record/'..k
if fs.getInfo(k..'.dat') then
fs.write('record/'..v..'.rec',fs.read(k..'.dat'))
fs.remove(k..'.dat')
end
if fs.getInfo(k..'.rec') then
fs.write('record/'..v..'.rec',fs.read(k..'.rec'))
fs.remove(k..'.rec')
end
end
STAT.version=VERSION.code
end
SETTING.appLock,SETTING.dataSaving,SETTING.swap,SETTING.autoLogin=nil
if not SETTING.VKSkin then SETTING.VKSkin=1 end
for _,v in next,SETTING.skin do if v<1 or v>17 then v=17 end end
if not RSlist[SETTING.RS] then SETTING.RS='TRS' end
if SETTING.ghostType=='greyCell' then SETTING.ghostType='grayCell' end
if type(SETTING.skinSet)=='number' then SETTING.skinSet='crystal_scf' end
if not TABLE.find({8,10,13,17,22,29,37,47,62,80,100},SETTING.frameMul) then SETTING.frameMul=100 end
if SETTING.cv then SETTING.vocPack,SETTING.cv=SETTING.cv end
if type(SETTING.bg)~='string' then SETTING.bg='on' end
if SETTING.skin[18]==10 then SETTING.skin[18]=4 end
if SETTING.reTime>3 or SETTING.reTime<.5 then SETTING.reTime=2 end
if SETTING.locale=='zh_full' then SETTING.locale='zh' end
if SETTING.vocPack=='rin' then SETTING.vocPack='miku' end
if RANKS.infinite then RANKS.infinite=0 end
if RANKS.infinite_dig then RANKS.infinite_dig=0 end
if not RANKS.sprint_10l then RANKS.sprint_10l=0 end
if RANKS.master_l then RANKS.master_n,RANKS.master_l=RANKS.master_l end
if RANKS.master_u then RANKS.master_h,RANKS.master_u=RANKS.master_u end
for _,v in next,VK_ORG do v.color=nil end
for name,rank in next,RANKS do
if type(name)=='number' or type(rank)~='number' then
RANKS[name]=nil
else
local M=MODES[name]
if M and M.unlock and rank>0 then
for _,unlockName in next,M.unlock do
if not RANKS[unlockName] then
RANKS[unlockName]=0
end
end
end
if not (M and M.x) then
RANKS[name]=nil
end
end
end
if not MODES[STAT.lastPlay] then
STAT.lastPlay='sprint_10l'
end
fs.remove('conf/account')
saveStats()
saveProgress()
saveSettings()
end
-- Initialize language lib -- Initialize language lib
LANG.init('zh', LANG.init('zh',
{ {
@@ -421,8 +530,6 @@ LANG.init('zh',
end)() end)()
) )
table.insert(_LOADTIMELIST_,("Initialize Parts: %.3fs"):format(TIME()-_LOADTIME_))
-- Load background files from SOURCE ONLY -- Load background files from SOURCE ONLY
for _,v in next,fs.getDirectoryItems('parts/backgrounds') do for _,v in next,fs.getDirectoryItems('parts/backgrounds') do
if FILE.isSafe('parts/backgrounds/'..v) and v:sub(-3)=='lua' then if FILE.isSafe('parts/backgrounds/'..v) and v:sub(-3)=='lua' then
@@ -431,6 +538,7 @@ for _,v in next,fs.getDirectoryItems('parts/backgrounds') do
end end
end end
BG.remList('none')BG.remList('gray')BG.remList('custom') BG.remList('none')BG.remList('gray')BG.remList('custom')
-- Load scene files from SOURCE ONLY -- Load scene files from SOURCE ONLY
for _,v in next,fs.getDirectoryItems('parts/scenes') do for _,v in next,fs.getDirectoryItems('parts/scenes') do
if FILE.isSafe('parts/scenes/'..v) then if FILE.isSafe('parts/scenes/'..v) then
@@ -439,179 +547,9 @@ for _,v in next,fs.getDirectoryItems('parts/scenes') do
LANG.addScene(sceneName) LANG.addScene(sceneName)
end end
end end
-- Load mode files
for i=1,#MODES do
local m=MODES[i]-- Mode template
if FILE.isSafe('parts/modes/'..m.name) then
TABLE.complete(require('parts.modes.'..m.name),MODES[i])
MODES[m.name],MODES[i]=MODES[i]
end
end
for _,v in next,fs.getDirectoryItems('parts/modes') do
if FILE.isSafe('parts/modes/'..v) and not MODES[v:sub(1,-5)] then
local M={name=v:sub(1,-5)}
local modeData=require('parts.modes.'..M.name)
if modeData.env then
TABLE.complete(modeData,M)
MODES[M.name]=M
end
end
end
table.insert(_LOADTIMELIST_,("Load Files: %.3fs"):format(TIME()-_LOADTIME_)) table.insert(_LOADTIMELIST_,("Load Files: %.3fs"):format(TIME()-_LOADTIME_))
-- Update data
do
local needSave
if not fs.getInfo('conf/data') then
needSave=true
end
if type(STAT.version)~='number' then
STAT.version=0
needSave=true
end
if STAT.version<1500 then
FILE.clear_s('')
end
if STAT.version<1505 then
fs.remove('record/bigbang.rec')
fs.remove('conf/replay')
end
if STAT.version==1506 then
local temp1,temp2
if fs.getInfo('record/master_l.rec') then
temp1=fs.read('record/master_l.rec')
end
if fs.getInfo('record/master_u.rec') then
temp2=fs.read('record/master_u.rec')
end
if temp1 then
fs.write('record/master_u.rec',temp1)
end
if temp2 then
fs.write('record/master_l.rec',temp2)
end
RANKS.master_l,RANKS.master_u=RANKS.master_u,RANKS.master_l
if RANKS.tsd_u then
RANKS.tsd_u=0
end
end
if STAT.version==1601 then
RANKS.round_e=nil
RANKS.round_n=nil
RANKS.round_h=nil
RANKS.round_l=nil
RANKS.round_u=nil
fs.remove('record/round_e.rec')
fs.remove('record/round_n.rec')
fs.remove('record/round_h.rec')
fs.remove('record/round_l.rec')
fs.remove('record/round_u.rec')
end
if STAT.version<1700 and SETTING.dascut<5 then
SETTING.dascut=SETTING.dascut+1
needSave=true
end
if RANKS.stack_e then
RANKS.stack_e=nil
RANKS.stack_h=nil
RANKS.stack_u=nil
fs.remove('record/stack_e.rec')
fs.remove('record/stack_h.rec')
fs.remove('record/stack_u.rec')
end
if RANKS.stack_20l then
RANKS.stack_20l=nil
RANKS.stack_40l=nil
RANKS.stack_100l=nil
fs.remove('record/stack_20l.rec')
fs.remove('record/stack_40l.rec')
fs.remove('record/stack_100l.rec')
end
if RANKS.rhythm_e then
RANKS.rhythm_e=nil
RANKS.rhythm_h=nil
RANKS.rhythm_u=nil
fs.remove('record/rhythm_e.rec')
fs.remove('record/rhythm_h.rec')
fs.remove('record/rhythm_u.rec')
end
if RANKS.bigbang or RANKS.clearRush then
fs.remove('record/clearRush.rec')
fs.remove('record/bigbang.rec')
end
if STAT.version~=VERSION.code then
for k,v in next,MODE_UPDATE_MAP do
if RANKS[k] then
RANKS[v]=RANKS[k]
RANKS[k]=nil
end
k='record/'..k
if fs.getInfo(k..'.dat') then
fs.write('record/'..v..'.rec',fs.read(k..'.dat'))
fs.remove(k..'.dat')
end
if fs.getInfo(k..'.rec') then
fs.write('record/'..v..'.rec',fs.read(k..'.rec'))
fs.remove(k..'.rec')
end
end
STAT.version=VERSION.code
needSave=true
end
SETTING.appLock,SETTING.dataSaving,SETTING.swap,SETTING.autoLogin=nil
if not SETTING.VKSkin then SETTING.VKSkin=1 end
for _,v in next,SETTING.skin do if v<1 or v>17 then v=17 end end
if not RSlist[SETTING.RS] then SETTING.RS='TRS' end
if SETTING.ghostType=='greyCell' then SETTING.ghostType='grayCell' end
if type(SETTING.skinSet)=='number' then SETTING.skinSet='crystal_scf' end
if not TABLE.find({8,10,13,17,22,29,37,47,62,80,100},SETTING.frameMul) then SETTING.frameMul=100 end
if SETTING.cv then SETTING.vocPack,SETTING.cv=SETTING.cv end
if type(SETTING.bg)~='string' then SETTING.bg='on' end
if SETTING.skin[18]==10 then SETTING.skin[18]=4 end
if SETTING.reTime>3 or SETTING.reTime<.5 then SETTING.reTime=2 end
if SETTING.locale=='zh_full' then SETTING.locale='zh' end
if SETTING.vocPack=='rin' then SETTING.vocPack='miku' end
if RANKS.infinite then RANKS.infinite=0 end
if RANKS.infinite_dig then RANKS.infinite_dig=0 end
if not RANKS.sprint_10l then RANKS.sprint_10l=0 end
if RANKS.master_l then RANKS.master_n,RANKS.master_l=RANKS.master_l needSave=true end
if RANKS.master_u then RANKS.master_h,RANKS.master_u=RANKS.master_u needSave=true end
for _,v in next,VK_ORG do v.color=nil end
for name,rank in next,RANKS do
if type(name)=='number' or type(rank)~='number' then
RANKS[name]=nil
needSave=true
else
local M=MODES[name]
if M and M.unlock and rank>0 then
for _,unlockName in next,M.unlock do
if not RANKS[unlockName] then
RANKS[unlockName]=0
needSave=true
end
end
end
if not (M and M.x) then
RANKS[name]=nil
needSave=true
end
end
end
if not MODES[STAT.lastPlay] then
STAT.lastPlay='sprint_10l'
needSave=true
end
if needSave then
saveStats()
saveProgress()
saveSettings()
love.event.quit('restart')
end
end
-- First start -- First start
FIRSTLAUNCH=STAT.run==0 FIRSTLAUNCH=STAT.run==0
if FIRSTLAUNCH and MOBILE then if FIRSTLAUNCH and MOBILE then
@@ -669,7 +607,11 @@ for _,fileName in next,fs.getDirectoryItems('replay') do
end end
table.sort(REPLAY,function(a,b) return a.fileName>b.fileName end) table.sort(REPLAY,function(a,b) return a.fileName>b.fileName end)
table.insert(_LOADTIMELIST_,("Initialize Data: %.3fs"):format(TIME()-_LOADTIME_)) WS.switchHost('cafuuchino1.3322.org','10026','/techmino/ws/v1')
HTTP.setHost("cafuuchino1.3322.org:10026")
HTTP.setThreadCount(1)
table.insert(_LOADTIMELIST_,("Load Resources: %.3fs"):format(TIME()-_LOADTIME_))
for i=1,#_LOADTIMELIST_ do LOG(_LOADTIMELIST_[i]) end for i=1,#_LOADTIMELIST_ do LOG(_LOADTIMELIST_[i]) end
@@ -706,6 +648,3 @@ if TABLE.find(arg,'-- test') then
love.event.quit(1) love.event.quit(1)
end) end)
end end
WS.switchHost('cafuuchino1.3322.org','10026','/techmino/ws/v1')
HTTP.setHost("cafuuchino1.3322.org:10026")
HTTP.setThreadCount(1)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

View File

@@ -526,14 +526,14 @@ do
false,-- T false,-- T
noKickSet,-- O noKickSet,-- O
{ {
[01]={'+0+0','-2+0','+1+0','-2-1','+1+2'}, [01]={'+0+0','+1+0','-2+0','+1+2','-2-1'},
[10]={'+0+0','+2+0','-1+0','+2+1','-1-2'}, [10]={'+0+0','-1+0','+2+0','-1-2','+2+1'},
[03]={'+0+0','-1+0','+2+0','-1+2','+2-1'},
[30]={'+0+0','+1+0','-2+0','+1-2','-2+1'},
[12]={'+0+0','-1+0','+2+0','-1+2','+2-1'}, [12]={'+0+0','-1+0','+2+0','-1+2','+2-1'},
[21]={'+0+0','+1+0','-2+0','+1-2','-2+1'}, [21]={'+0+0','+1+0','-2+0','+1-2','-2+1'},
[23]={'+0+0','+2+0','-1+0','+2+1','-1-2'}, [32]={'+0+0','+1+0','-2+0','+1+2','-2-1'},
[32]={'+0+0','-2+0','+1+0','-2-1','+1+2'}, [23]={'+0+0','-1+0','+2+0','-1-2','+2+1'},
[30]={'+0+0','+1+0','-2+0','+1-2','-2+1'},
[03]={'+0+0','-1+0','+2+0','-1+2','+2-1'},
[02]={'+0+0','-1+0','+1+0','+0-1','+0+1'}, [02]={'+0+0','-1+0','+1+0','+0-1','+0+1'},
[20]={'+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','-1+0','+1+0','+0+1'}, [13]={'+0+0','+0-1','-1+0','+1+0','+0+1'},

View File

@@ -1,7 +1,7 @@
return { return {
mesDisp=function(P) mesDisp=function(P)
setFont(45) setFont(45)
GC.mStr(("%.1f"):format(P.stat.atk),63,190) GC.mStr(("%d"):format(P.stat.atk),63,190)
GC.mStr(("%.2f"):format(P.stat.atk/P.stat.row),63,310) GC.mStr(("%.2f"):format(P.stat.atk/P.stat.row),63,310)
mText(TEXTOBJ.atk,63,243) mText(TEXTOBJ.atk,63,243)
mText(TEXTOBJ.eff,63,363) mText(TEXTOBJ.eff,63,363)

View File

@@ -23,6 +23,7 @@ return {
LINE.discard(table.remove(P.field,1)) LINE.discard(table.remove(P.field,1))
LINE.discard(table.remove(P.visTime,1)) LINE.discard(table.remove(P.visTime,1))
end end
P.garbageBeneath=P.garbageBeneath-bonus
end end
end end
end end

View File

@@ -23,6 +23,7 @@ return {
LINE.discard(table.remove(P.field,1)) LINE.discard(table.remove(P.field,1))
LINE.discard(table.remove(P.visTime,1)) LINE.discard(table.remove(P.visTime,1))
end end
P.garbageBeneath=P.garbageBeneath-bonus
end end
end end
end end

View File

@@ -51,7 +51,7 @@ do-- function tryDelete()
end end
end end
do-- function loadFile(name,args), function saveFile(data,name,args) do-- function loadFile(name,args), function saveFile(data,name,args)
local t=setmetatable({},{__index=function() return"'$1' loading failed: $2" end}) local t=setmetatable({},{__index=function() return "'$1' loading failed: $2" end})
function loadFile(name,args) function loadFile(name,args)
local text=text or t local text=text or t
if not args then args='' end if not args then args='' end

View File

@@ -23,8 +23,8 @@ RANK_COLORS={
GROUP_COLORS={ GROUP_COLORS={
[0]=COLOR.Z, [0]=COLOR.Z,
[1]={STRING.hexColor'e57373'}, [1]={STRING.hexColor'e57373'},
[2]={STRING.hexColor'aed581'}, [2]={STRING.hexColor"4caf50"},
[3]={STRING.hexColor'42a5f5'}, [3]={STRING.hexColor'5c6bc0'},
[4]={STRING.hexColor'ffe082'}, [4]={STRING.hexColor'ffe082'},
[5]={STRING.hexColor'ba68c8'}, [5]={STRING.hexColor'ba68c8'},
[6]={STRING.hexColor'80deea'}, [6]={STRING.hexColor'80deea'},

File diff suppressed because it is too large Load Diff

View File

@@ -141,7 +141,6 @@ return {
invalidCode="Invalid code", invalidCode="Invalid code",
invalidEmail="Invalid email", invalidEmail="Invalid email",
playerNotFound="Player not found", playerNotFound="Player not found",
noPassword="No password",
invalidEmailPass="Invalid email or password", invalidEmailPass="Invalid email or password",
emailExists="Email exists", emailExists="Email exists",
emailSendError="Email send error", emailSendError="Email send error",
@@ -186,6 +185,7 @@ return {
started="Playing", started="Playing",
joinRoom="$1 has entered the room.", joinRoom="$1 has entered the room.",
leaveRoom="$1 has left the room.", leaveRoom="$1 has left the room.",
roomRemoved="Room was removed",
ready="Ready", ready="Ready",
spectating="Spectating", spectating="Spectating",

View File

@@ -107,67 +107,66 @@ return {
-- Server's warn/error messages -- Server's warn/error messages
Techrater={ Techrater={
-- internalError="Internal error", internalError="Internal error",
-- databaseError="Database error", databaseError="Database error",
-- invalidFormat="Invalid format", invalidFormat="Formato inválido",
-- invalidArguments="Invalid arguments", invalidArguments="Argumentos inválidos",
-- tooFrequent="Too frequent", tooFrequent="Exceso de requests",
-- notAvailable="Not available", notAvailable="No disponible",
-- noPermission="No permission", noPermission="No hay permisos suficientes",
-- roomNotFound="Room not found", roomNotFound="Sala no encontrada",
-- Controllers -- Controllers
WebSocket={ WebSocket={
-- invalidConnection="Invalid connection", invalidConnection="Conexión inválida",
-- invalidAction="Invalid action", invalidAction="Acción inválida",
-- playerNotFound="Player not found", playerNotFound="Jugador no encontrado",
-- connectionFailed="Connection failed", connectionFailed="Error de conexión",
}, },
-- Filters -- Filters
CheckPermission={ CheckPermission={
-- playerNotFound="Player not found", playerNotFound="Jugador no encontrado",
}, },
-- Plugins -- Plugins
ConnectionManager={ ConnectionManager={
-- playerInvalid="Player invalid", playerInvalid="Jugador inválido",
-- playerNotFound="Player not found", playerNotFound="Jugador no encontrado",
-- connectionReplaced="Connection replaced", connectionReplaced="Conexión reiniciada",
}, },
NoticeManager={ NoticeManager={
-- noticeNotFound="Notice not found", noticeNotFound="Aviso no encontrado",
}, },
PlayerManager={ PlayerManager={
-- invalidCode="Invalid code", invalidCode="Código incorrecto",
-- invalidEmail="Invalid email", invalidEmail="Correo inválido",
-- playerNotFound="Player not found", playerNotFound="Jugador no encontrado",
-- noPassword="No password", invalidEmailPass="Correo o contraseña incorrecta",
-- invalidEmailPass="Invalid email or password", emailExists="Correo ya existente",
-- emailExists="Email exists", emailSendError="Error al enviar solicitud",
-- emailSendError="Email send error",
}, },
-- Strategies -- Strategies
PlayerRole={ PlayerRole={
-- invalidRole="Invalid role", invalidRole="Rol inválido",
-- invalidTarget="Invalid target", invalidTarget="Objetivo inválido",
}, },
PlayerType={ PlayerType={
-- invalidType="Invalid type", invalidType="Clase inválida",
-- roomFull="Room full", roomFull="Esta sala está llena.",
}, },
RoomJoin={ RoomJoin={
-- wrongPassword="Wrong password", wrongPassword="Contraseña incorrecta",
}, },
}, },
-- tooFrequent="Request too frequently", tooFrequent="Requests demasiado frecuentes",
-- roomPasswordChanged="Room password changed", roomPasswordChanged="Contraseña de sala cambiada",
oldVersion="¡Está disponible la nueva versión $1!", oldVersion="¡Está disponible la nueva versión $1!",
versionNotMatch="¡Las versiones no coinciden!", versionNotMatch="¡Las versiones no coinciden!",
notFinished="Próximamente", notFinished="Próximamente",
noUsername="Por favor ingresa un nombre de usuario", noUsername="Por favor ingresa un nombre de usuario",
wrongEmail="Correo electrónico inválido", wrongEmail="Correo electrónico inválido",
-- wrongCode="Invalid verification code", wrongCode="Código de Verif. incorrecto",
noPassword="Por favor ingresa la contraseña", noPassword="Por favor ingresa la contraseña",
diffPassword="Las contraseñas no coinciden", diffPassword="Las contraseñas no coinciden",
checkEmail="Petición de registro enviada con éxito", checkEmail="Petición de registro enviada con éxito",
@@ -175,16 +174,17 @@ return {
wsFailed="WebSocket conexión fallida: $1", wsFailed="WebSocket conexión fallida: $1",
wsClose="WebSocket cerrado: $1", wsClose="WebSocket cerrado: $1",
netTimeout="Tiempo de conexión agotado", netTimeout="Tiempo de conexión agotado",
-- serverDown="Oops! Server is down", serverDown="Server caído, F",
-- requestFailed="Request failed", requestFailed="Error de Request",
onlinePlayerCount="En línea: $1", onlinePlayerCount="En línea: $1",
createRoomSuccessed="¡Sala creada con éxito!", createRoomSuccessed="¡Sala creada con éxito!",
-- playerKicked="$1 removed $2 from room", playerKicked="$2 quitado de la sala por $1",
-- becomeHost="$1 become host", becomeHost="$1 ahora es el host",
started="En juego", started="En juego",
joinRoom="$1 entró a la sala.", joinRoom="$1 entró a la sala.",
leaveRoom="$1 salió de la sala.", leaveRoom="$1 salió de la sala.",
roomRemoved="Sala removida",
ready="LISTO", ready="LISTO",
spectating="Espectando", spectating="Espectando",
@@ -414,7 +414,7 @@ return {
league="Liga Tech", league="Liga Tech",
ffa="FFA", ffa="FFA",
rooms="Salas", rooms="Salas",
-- resetPW="Reset password", resetPW="Restabl. Contraseña",
logout="Desconec.", logout="Desconec.",
}, },
net_league={ net_league={
@@ -735,7 +735,7 @@ return {
}, },
login_pw={ login_pw={
title="Entrar", title="Entrar",
-- login_mail="Login with E-mail/Sign Up", login_mail="Registrarse/Pedir código",
email="Correo Elec.", email="Correo Elec.",
password="Contraseña", password="Contraseña",
showEmail="Mostrar Correo", showEmail="Mostrar Correo",
@@ -743,19 +743,19 @@ return {
}, },
login_mail={ login_mail={
title="Entrar/Registrarse", title="Entrar/Registrarse",
-- login_pw="Password Sign In", login_pw="Ingr. con Contraseña",
email="Correo Elec.", email="Correo Elec.",
-- send="Send code", send="Enviar código",
-- code="Verification Code", code="Código de Verif.",
-- verify="Verify", verify="Verificar",
}, },
reset_password={ reset_password={
-- title="Reset Password", title="Restablecer Contraseña",
-- send="Send code", send="Enviar código",
-- code="Verification Code", code="Código de Verif.",
password="Contraseña", password="Contraseña",
password2="Repetir Contr.", password2="Repetir Contr.",
-- setPW="Set Password", setPW="Establecer",
}, },
account={ account={
title="Cuenta", title="Cuenta",
@@ -829,7 +829,7 @@ return {
['dig_eff_40l']= {"Dig", "Efic. 40L", "¡Limpia 40 líneas de queso con la menor cantidad de piezas posible!"}, ['dig_eff_40l']= {"Dig", "Efic. 40L", "¡Limpia 40 líneas de queso con la menor cantidad de piezas posible!"},
['dig_eff_100l']= {"Dig", "Efic. 100L", "¡Limpia 100 líneas de queso con la menor cantidad de piezas posible!"}, ['dig_eff_100l']= {"Dig", "Efic. 100L", "¡Limpia 100 líneas de queso con la menor cantidad de piezas posible!"},
['dig_eff_400l']= {"Dig", "Efic. 400L", "¡Limpia 400 líneas de queso con la menor cantidad de piezas posible!"}, ['dig_eff_400l']= {"Dig", "Efic. 400L", "¡Limpia 400 líneas de queso con la menor cantidad de piezas posible!"},
--['dig_quad_10l']= {"Dig", "TECHRASH 10L", "Dig 10 garbage lines using only techrash!"}, ['dig_quad_10l']= {"Dig", "TECHRASH 10L", "¡Limpia 10 líneas de queso sólo con Tecrashes!"},
['drought_n']= {"Sequía", "100L", "¡Sin piezas I!"}, ['drought_n']= {"Sequía", "100L", "¡Sin piezas I!"},
['drought_l']= {"Sequía+", "100L", "Qué es esto..."}, ['drought_l']= {"Sequía+", "100L", "Qué es esto..."},
['marathon_n']= {"Maratón", "Normal", "Maratón de 200 líneas con velocidad en aumento."}, ['marathon_n']= {"Maratón", "Normal", "Maratón de 200 líneas con velocidad en aumento."},
@@ -921,5 +921,5 @@ return {
['custom_clear']= {"Personalizado", "Normal"}, ['custom_clear']= {"Personalizado", "Normal"},
['custom_puzzle']= {"Personalizado", "Puzzle"}, ['custom_puzzle']= {"Personalizado", "Puzzle"},
}, },
-- pumpkin="I'm a pumpkin", pumpkin="Todos alaben al rey Calabaza",
} }

View File

@@ -131,7 +131,6 @@ return {
-- invalidCode="Invalid code", -- invalidCode="Invalid code",
-- invalidEmail="Invalid email", -- invalidEmail="Invalid email",
-- playerNotFound="Player not found", -- playerNotFound="Player not found",
-- noPassword="No password",
-- invalidEmailPass="Invalid email or password", -- invalidEmailPass="Invalid email or password",
-- emailExists="Email exists", -- emailExists="Email exists",
-- emailSendError="Email send error", -- emailSendError="Email send error",
@@ -177,9 +176,8 @@ return {
-- started="Playing", -- started="Playing",
joinRoom="$1 a rejoint le salon.", joinRoom="$1 a rejoint le salon.",
leaveRoom="$1 a quitté le salon.", leaveRoom="$1 a quitté le salon.",
-- roomRemoved="Room was removed",
-- ready="READY", -- ready="READY",
-- connStream="CONNECTING",
-- waitStream="WAITING",
-- spectating="Spectating", -- spectating="Spectating",

View File

@@ -142,7 +142,6 @@ return {
-- invalidCode="Invalid code", -- invalidCode="Invalid code",
-- invalidEmail="Invalid email", -- invalidEmail="Invalid email",
-- playerNotFound="Player not found", -- playerNotFound="Player not found",
-- noPassword="No password",
-- invalidEmailPass="Invalid email or password", -- invalidEmailPass="Invalid email or password",
-- emailExists="Email exists", -- emailExists="Email exists",
-- emailSendError="Email send error", -- emailSendError="Email send error",
@@ -187,6 +186,7 @@ return {
started="Bermain", started="Bermain",
joinRoom="$1 telah memasuki ruangan.", joinRoom="$1 telah memasuki ruangan.",
leaveRoom="$1 telah keluar dari ruangan.", leaveRoom="$1 telah keluar dari ruangan.",
-- roomRemoved="Room was removed",
ready="Siap", ready="Siap",
spectating="Menonton", spectating="Menonton",

View File

@@ -42,7 +42,7 @@ return {
missionFailed="失敗…", missionFailed="失敗…",
speedLV="レベル", speedLV="レベル",
piece="ミノ数",line="ライン",atk="火力",eff="効率", piece="ミノ数",line="line",atk="火力",eff="効率",
rpm="RPM",tsd="TSD", rpm="RPM",tsd="TSD",
grade="Grade",techrash="Techrash", grade="Grade",techrash="Techrash",
wave="Wave",nextWave="Next", wave="Wave",nextWave="Next",
@@ -142,7 +142,6 @@ return {
invalidCode="無効なコード", invalidCode="無効なコード",
invalidEmail="無効なEメールアドレス", invalidEmail="無効なEメールアドレス",
playerNotFound="プレイヤーが見つかりませんでした", playerNotFound="プレイヤーが見つかりませんでした",
noPassword="パスワードがありません",
invalidEmailPass="Eメールアドレスもしくはパスワードが違います", invalidEmailPass="Eメールアドレスもしくはパスワードが違います",
emailExists="Eメールアドレスは存在します", emailExists="Eメールアドレスは存在します",
emailSendError="送信できませんでした", emailSendError="送信できませんでした",
@@ -161,7 +160,7 @@ return {
}, },
}, },
tooFrequent="リクエストの頻度が高すぎます", tooFrequent="リクエストが多すぎます",
roomPasswordChanged="部屋のパスワードを変更しました", roomPasswordChanged="部屋のパスワードを変更しました",
oldVersion="バージョン$1のダウンロードが可能になりました", oldVersion="バージョン$1のダウンロードが可能になりました",
versionNotMatch="バージョンが一致しません", versionNotMatch="バージョンが一致しません",
@@ -177,15 +176,17 @@ return {
wsFailed="ウェブソケットとの通信に失敗しました: $1", wsFailed="ウェブソケットとの通信に失敗しました: $1",
wsClose="ウェブソケットとの通信を終了: $1", wsClose="ウェブソケットとの通信を終了: $1",
netTimeout="接続がタイムアウトしました", netTimeout="接続がタイムアウトしました",
serverDown="うわ! サーバーが落ちました", serverDown="うわ! サーバーが落ちています...",
requestFailed="リクエスト失敗", requestFailed="リクエスト失敗",
onlinePlayerCount="オンライン人数: $1", onlinePlayerCount="オンライン人数: $1",
createRoomSuccessed="部屋を建てました", createRoomSuccessed="部屋を建てました",
playerKicked="$1 は、$2 を部屋から追放しました", playerKicked="$1 は、$2 を部屋から追放しました",
becomeHost="$1 がホストになりました",
started="プレイ中", started="プレイ中",
joinRoom="$1 が入室しました", joinRoom="$1 が入室しました",
leaveRoom="$1 が退出しました", leaveRoom="$1 が退出しました",
roomRemoved="部屋が撤去されました",
ready="準備OK", ready="準備OK",
spectating="観戦中", spectating="観戦中",
@@ -195,7 +196,7 @@ return {
customBGhelp="カスタム背景にする画像ファイルをドロップ", customBGhelp="カスタム背景にする画像ファイルをドロップ",
customBGloadFailed="サポートされていないフォーマットのファイルです", customBGloadFailed="サポートされていないフォーマットのファイルです",
errorMsg="問題が発生! ゲームを再起動してください、できるならエラーログを開発者に送ってください", errorMsg="問題が発生! ゲームを再起動しエラーログを開発者に送ってください",
tryAnotherBuild="[Invalid UTF-8]使用しているOSがMicrosoft WindowsであればTechmino-win32かTechmino-win64をダウンロードしてください! (現在使用しているソフトは違うバージョンです)", tryAnotherBuild="[Invalid UTF-8]使用しているOSがMicrosoft WindowsであればTechmino-win32かTechmino-win64をダウンロードしてください! (現在使用しているソフトは違うバージョンです)",
modInstruction="Modを選択してください!\nModはゲームの中身を変えます\nしかしゲームが破損することもあります\nModを使用した場合スコアは保存されません", modInstruction="Modを選択してください!\nModはゲームの中身を変えます\nしかしゲームが破損することもあります\nModを使用した場合スコアは保存されません",
@@ -206,7 +207,7 @@ return {
infHold="InfiniHold\nHOLDできる回数を無限にします", infHold="InfiniHold\nHOLDできる回数を無限にします",
hideBlock="Hide Current Piece:\n現在出現しているピースを隠します", hideBlock="Hide Current Piece:\n現在出現しているピースを隠します",
hideGhost="No Ghost\nゴーストを消します", hideGhost="No Ghost\nゴーストを消します",
hidden="Hide Locked Pieces.\n設置されたピースが時間内に見えなくなります", hidden="Hide Locked Pieces\n設置されたピースが時間内に見えなくなります",
hideBoard="Hide Board\n盤面の一部もしくは、全体を隠します", hideBoard="Hide Board\n盤面の一部もしくは、全体を隠します",
flipBoard="Flip Board\n盤面が回転もしくは滑ります", flipBoard="Flip Board\n盤面が回転もしくは滑ります",
dropDelay="Gravity\n落下速度をフレーム単位で変更します", dropDelay="Gravity\n落下速度をフレーム単位で変更します",
@@ -227,25 +228,25 @@ return {
"時間:", "時間:",
"入力数/回転数/ホールド数:", "入力数/回転数/ホールド数:",
"ミノ数:", "ミノ数:",
"列数/掘った列:", "line数/掘line:",
"火力数/堀からの火力:", "火力数/火力:",
"受けたライン数:", "受けたline数:",
"ライン消去数:", "line消去数:",
"スピン:", "スピン:",
"B2B/B3B/PC/HPC:", "B2B/B3B/PC/HPC:",
"最適化:", "最適化:",
}, },
radar={"DEF","OFF","ATK","SEND","SPD","DIG"}, radar={"DEF","OFF","ATK","SEND","SPD","DIG"},
radarData={"DPM","ADPM","APM","SPM","LPM","DPM"}, radarData={"DPM","ADPM","APM","SPM","L'PM","DPM"},
stat={ stat={
"起動回数:", "起動回数:",
"プレイ回数:", "プレイ回数:",
"プレイ時間:", "プレイ時間:",
"入力数/回転数/ホールド数:", "入力数/回転数/ホールド数:",
"ミノ数/数/火力数:", "ミノ数/line数/火力数:",
"受けたライン数/Res./Asc.:", "送られたline数/相殺/受け:",
"火力/堀からの火力:", "掘line/掘火力:",
"効率/の効率:", "効率/の効率:",
"B2B数/B3B数:", "B2B数/B3B数:",
"PC数/HPC数:", "PC数/HPC数:",
"最適化ミス数/率:", "最適化ミス数/率:",
@@ -413,8 +414,8 @@ return {
}, },
net_menu={ net_menu={
league="テクリーグ", league="テクリーグ",
ffa="自由乱闘戦", ffa="FFA",
rooms="ルーム・プライベート戦", rooms="ルーム",
resetPW="パスワード再設定", resetPW="パスワード再設定",
logout="ログアウト", logout="ログアウト",
}, },
@@ -448,7 +449,7 @@ return {
drop="自然落下時間", drop="自然落下時間",
lock="設置時間", lock="設置時間",
wait="操作硬直時間", wait="操作硬直時間",
fall="ライン消去時間", fall="line消去時間",
hang="死後硬直時間", hang="死後硬直時間",
hurry="AREキャンセル時間", hurry="AREキャンセル時間",
@@ -469,7 +470,7 @@ return {
nextCount="ネクスト数", nextCount="ネクスト数",
holdCount="ホールド数", holdCount="ホールド数",
infHold="無限ホールド", infHold="無限ホールド",
phyHold="ホールド", phyHold="その場ホールド",
}, },
net_game={ net_game={
ready="準備OK", ready="準備OK",
@@ -513,14 +514,14 @@ return {
lockFX="設置演出", lockFX="設置演出",
dropFX="落下演出", dropFX="落下演出",
moveFX="左右移動演出", moveFX="左右移動演出",
clearFX="ライン消去演出", clearFX="line消去演出",
splashFX="消去時の弾ける演出", splashFX="消去時の弾ける演出",
shakeFX="盤面移動演出", shakeFX="盤面移動演出",
atkFX="攻撃演出", atkFX="攻撃演出",
frame="レンダリングフレームレート(%)", frame="レンダリングフレームレート(%)",
text="ライン消去ポップ", text="line消去ポップ",
score="スコアポップ", score="スコアポップ",
bufferWarn="ダメージアラート", bufferWarn="ダメージアラート",
showSpike="スパイクカウンター", showSpike="スパイクカウンター",
@@ -634,7 +635,7 @@ return {
drop="自然落下時間", drop="自然落下時間",
lock="設置時間", lock="設置時間",
wait="操作硬直時間", wait="操作硬直時間",
fall="ライン消去時間", fall="line消去時間",
hang="死後硬直時間", hang="死後硬直時間",
hurry="AREキャンセル時間", hurry="AREキャンセル時間",
@@ -659,7 +660,7 @@ return {
nextCount="ネクスト数", nextCount="ネクスト数",
holdCount="ホールド数", holdCount="ホールド数",
infHold="無限ホールド", infHold="無限ホールド",
phyHold="ホールド", phyHold="その場ホールド",
fieldH="盤面の高さ", fieldH="盤面の高さ",
visible="設置ミノの視認性", visible="設置ミノの視認性",
@@ -821,67 +822,67 @@ return {
}, },
}, },
modes={ modes={
['sprint_10l']= {"スプリント", "10L", "10ライン消せ!"}, ['sprint_10l']= {"スプリント", "10L", "10line消せ!"},
['sprint_20l']= {"スプリント", "20L", "20ライン消せ!"}, ['sprint_20l']= {"スプリント", "20L", "20line消せ!"},
['sprint_40l']= {"スプリント", "40L", "40ライン消せ!"}, ['sprint_40l']= {"スプリント", "40L", "40line消せ!"},
['sprint_100l']= {"スプリント", "100L", "100ライン消せ!"}, ['sprint_100l']= {"スプリント", "100L", "100line消せ!"},
['sprint_400l']= {"スプリント", "400L", "400ライン消せ!"}, ['sprint_400l']= {"スプリント", "400L", "400line消せ!"},
['sprint_1000l']= {"スプリント", "1,000L", "1,000ライン消せ!"}, ['sprint_1000l']= {"スプリント", "1,000L", "1,000line消せ!"},
['sprintPenta']= {"スプリント", "PENTOMINO", "ペントミで40ライン"}, ['sprintPenta']= {"スプリント", "PENTOMINO", "ペントミで40line"},
['sprintMPH']= {"スプリント", "MPH", "ミノ順なし\nネクストなし\nホールドなし!"}, ['sprintMPH']= {"スプリント", "MPH", "ミノ順なし\nネクストなし\nホールドなし!"},
['sprint123']= {"スプリント", "M123", "、ドミ、トリミで40ライン"}, ['sprint123']= {"スプリント", "M123", "、ドミ、トリミで40line"},
['secret_grade']= {"裏GM", "", "ガイドに従ってジグザグに穴を作れ!"}, ['secret_grade']= {"裏GM", "", "ガイドに従ってジグザグに穴を作れ!"},
['dig_10l']= {"掘り", "10L", "10ライン下穴を掘れ!"}, ['dig_10l']= {"掘り", "10L", "10line下穴を掘れ!"},
['dig_40l']= {"掘り", "40L", "40ライン下穴を掘れ!"}, ['dig_40l']= {"掘り", "40L", "40line下穴を掘れ!"},
['dig_100l']= {"掘り", "100L", "100ライン下穴を掘れ!"}, ['dig_100l']= {"掘り", "100L", "100line下穴を掘れ!"},
['dig_400l']= {"掘り", "400L", "400ライン下穴を掘れ!"}, ['dig_400l']= {"掘り", "400L", "400line下穴を掘れ!"},
['dig_eff_10l']= {"", "EFFICIENCY 10L", "最小のミ数で10ライン掘れ!"}, ['dig_eff_10l']= {"", "EFFICIENCY 10L", "最小のミ数で10line掘れ!"},
['dig_eff_40l']= {"", "EFFICIENCY 40L", "最小のミ数で40ライン掘れ!"}, ['dig_eff_40l']= {"", "EFFICIENCY 40L", "最小のミ数で40line掘れ!"},
['dig_eff_100l']= {"", "EFFICIENCY 100L","最小のミ数で100ライン掘れ!"}, ['dig_eff_100l']= {"", "EFFICIENCY 100L","最小のミ数で100line掘れ!"},
['dig_eff_400l']= {"", "EFFICIENCY 400L","最小のミ数で400ライン掘れ!"}, ['dig_eff_400l']= {"", "EFFICIENCY 400L","最小のミ数で400line掘れ!"},
['dig_quad_10l']= {"", "TECHRASH 10L", "techrashだけで10ライン下穴を掘れ!"}, ['dig_quad_10l']= {"", "TECHRASH 10L", "techrashだけで10line下穴を掘れ!"},
['drought_n']= {"ドラウト", "100L", "Iミ一切無し!"}, ['drought_n']= {"ドラウト", "100L", "Iミ一切無し!"},
['drought_l']= {"ドラウト+", "100L", "わったーふ◯っく!"}, ['drought_l']= {"ドラウト+", "100L", "わったーふ◯っく!"},
['marathon_n']= {"マラソン", "NORMAL", "加速する中で200ラインマラソン!"}, ['marathon_n']= {"マラソン", "NORMAL", "加速する中で200lineマラソン!"},
['marathon_h']= {"マラソン", "HARD", "高速の中で200ラインマラソン!"}, ['marathon_h']= {"マラソン", "HARD", "高速の中で200lineマラソン!"},
['solo_e']= {"バトル", "EASY", "低レベルのAIに勝て!"}, ['solo_e']= {"バトル", "EASY", "低レベルのAIに勝て!"},
['solo_n']= {"バトル", "NORMAL", "通常レベルのAIに勝て!"}, ['solo_n']= {"バトル", "NORMAL", "通常レベルのAIに勝て!"},
['solo_h']= {"バトル", "HARD", "高レベルのAIに勝て!"}, ['solo_h']= {"バトル", "HARD", "高レベルのAIに勝て!"},
['solo_l']= {"バトル", "LUNATIC", "プロレベルのAIに勝て!"}, ['solo_l']= {"バトル", "LUNATIC", "プロレベルのAIに勝て!"},
['solo_u']= {"バトル", "ULTIMATE", "神レベルのAIに勝て!"}, ['solo_u']= {"バトル", "ULTIMATE", "神レベルのAIに勝て!"},
['techmino49_e']= {"テック 49", "EASY", "低レベルAIと49人で勝負\n最後の1人まで生き残れ!"}, ['techmino49_e']= {"テック 49", "EASY", "低レベルAIと49人で勝負\n最後の1人まで生き残れ!"},
['techmino49_h']= {"テック 49", "HARD", "高レベルAIと49人で勝負\n最後の1人まで生き残れ!"}, ['techmino49_h']= {"テック 49", "HARD", "高レベルAIと49人で勝負\n最後の1人まで生き残れ!"},
['techmino49_u']= {"テック 49", "ULTIMATE", "神レベAIと49人で勝負\n最後の1人まで生き残れ!"}, ['techmino49_u']= {"テック 49", "ULTIMATE", "神レベAIと49人で勝負\n最後の1人まで生き残れ!"},
['techmino99_e']= {"テック 99", "EASY", "低レベルAIと99人で勝負\n最後の1人まで生き残れ!"}, ['techmino99_e']= {"テック 99", "EASY", "低レベルAIと99人で勝負\n最後の1人まで生き残れ!"},
['techmino99_h']= {"テック 99", "HARD", "高レベルAIと99人で勝負\n最後の1人まで生き残れ!"}, ['techmino99_h']= {"テック 99", "HARD", "高レベルAIと99人で勝負\n最後の1人まで生き残れ!"},
['techmino99_u']= {"テック 99", "ULTIMATE", "神レベルAIと99人で勝負\n最後の1人まで生き残れ!"}, ['techmino99_u']= {"テック 99", "ULTIMATE", "神レベルAIと99人で勝負\n最後の1人まで生き残れ!"},
['round_e']= {"ターン制", "EASY", "ターン制で低レベルAIと勝負!"}, ['round_e']= {"ターン制", "EASY", "ターン制で低レベルAIと勝負!"},
['round_n']= {"ターン制", "NORMAL", "ターン制で通常レベルAIと勝負!"}, ['round_n']= {"ターン制", "NORMAL", "ターン制で通常レベルAIと勝負!"},
['round_h']= {"ターン制", "HARD", "ターン制で高レベルAIと勝負!"}, ['round_h']= {"ターン制", "HARD", "ターン制で高レベルAIと勝負!"},
['round_l']= {"ターン制", "LUNATIC", "ターン制でプロレベルAIと勝負!"}, ['round_l']= {"ターン制", "LUNATIC", "ターン制でプロレベルAIと勝負!"},
['round_u']= {"ターン制", "ULTIMATE", "ターン制で神レベルAIと勝負!"}, ['round_u']= {"ターン制", "ULTIMATE", "ターン制で神レベルAIと勝負!"},
['big_n']= {"ビッグ", "NORMAL", "小さい盤面でプレイ!"}, ['big_n']= {"ビッグ", "NORMAL", "小さい盤面でプレイ!"},
['big_h']= {"ビッグ", "HARD", "小さい盤面でプレイ!"}, ['big_h']= {"ビッグ", "HARD", "小さい盤面でプレイ!"},
['master_n']= {"マスター", "NORMAL", "20G 初心者方へ"}, ['master_n']= {"マスター", "NORMAL", "20G 初心者方へ"},
['master_h']= {"マスター", "HARD", "20G 中級者の方へ"}, ['master_h']= {"マスター", "HARD", "20G 中級者の方へ"},
['master_m']= {"マスター", "M21", "20G 上級者の方へ"}, ['master_m']= {"マスター", "M21", "20G 上級者の方へ"},
['master_final']= {"マスター", "FINAL", "20G その先へ"}, ['master_final']= {"マスター", "FINAL", "20G その先へ"},
['master_ph']= {"マスター", "PHANTASM", "???"}, ['master_ph']= {"マスター", "PHANTASM", "???"},
['master_g']= {"マスター", "GRADED", "最高段位を取れ!"}, ['master_g']= {"マスター", "GRADED", "最高段位を取れ!"},
['master_ex']= {"グランドマスター", "EXTRA", "一瞬よりも短い永遠"}, ['master_ex']= {"グランドマスター", "EXTRA", "一瞬よりも短い永遠"},
['master_instinct']={"マスター", "INSTINCT", "もしミノが一切見えなくなったら?"}, ['master_instinct']={"マスター", "INSTINCT", "もしミノが一切見えなくなったら?"},
['strategy_e']= {"ストラテジー", "EASY", "20Gでの素早い判断"}, ['strategy_e']= {"ストラテジー", "EASY", "20Gでの素早い判断"},
['strategy_h']= {"ストラテジー", "HARD", "20Gでの素早い判断"}, ['strategy_h']= {"ストラテジー", "HARD", "20Gでの素早い判断"},
['strategy_u']= {"ストラテジー", "ULTIMATE", "20Gでの素早い判断"}, ['strategy_u']= {"ストラテジー", "ULTIMATE", "20Gでの素早い判断"},
['strategy_e_plus']={"ストラテジー", "EASY+", "20Gでの素早い判断"}, ['strategy_e_plus']={"ストラテジー", "EASY+", "20Gでの素早い判断"},
['strategy_h_plus']={"ストラテジー", "HARD+", "20Gでの素早い判断"}, ['strategy_h_plus']={"ストラテジー", "HARD+", "20Gでの素早い判断"},
['strategy_u_plus']={"ストラテジー", "ULTIMATE+", "20Gでの素早い判断"}, ['strategy_u_plus']={"ストラテジー", "ULTIMATE+", "20Gでの素早い判断"},
['blind_e']= {"目隠し", "HALF", "初心者用"}, ['blind_e']= {"インビジブル", "HALF", "初心者用"},
['blind_n']= {"目隠し", "ALL", "中級者用"}, ['blind_n']= {"インビジブル", "ALL", "中級者用"},
['blind_h']= {"目隠し", "SUDDEN", "上級者用"}, ['blind_h']= {"インビジブル", "SUDDEN", "上級者用"},
['blind_l']= {"目隠し", "SUDDEN+", "プロフェッショナル用!"}, ['blind_l']= {"インビジブル", "SUDDEN+", "プロフェッショナル用"},
['blind_u']= {"目隠し", "?", "覚悟は良いかい?"}, ['blind_u']= {"インビジブル", "?", "覚悟は良いかい?"},
['blind_wtf']= {"目隠し", "WTF", "まだ覚悟が足りない!"}, ['blind_wtf']= {"インビジブル", "WTF", "まだ覚悟が足りない"},
['classic_e']= {"クラシック", "EASY", "低速クラシック"}, ['classic_e']= {"クラシック", "EASY", "低速クラシック"},
['classic_h']= {"クラシック", "HARD", "通常速度クラシック"}, ['classic_h']= {"クラシック", "HARD", "通常速度クラシック"},
['classic_l']= {"クラシック", "LUNATIC", "中高速度クラシック"}, ['classic_l']= {"クラシック", "LUNATIC", "中高速度クラシック"},
@@ -895,16 +896,16 @@ return {
['attacker_u']= {"火力王", "ULTIMATE", "攻撃力を磨け!"}, ['attacker_u']= {"火力王", "ULTIMATE", "攻撃力を磨け!"},
['defender_n']= {"相殺王", "NORMAL", "防御力を磨け!"}, ['defender_n']= {"相殺王", "NORMAL", "防御力を磨け!"},
['defender_l']= {"相殺王", "LUNATIC", "防御力を磨け!"}, ['defender_l']= {"相殺王", "LUNATIC", "防御力を磨け!"},
['dig_h']= {"", "HARD", "掘りを磨け"}, ['dig_h']= {"", "HARD", "掘りを磨け"},
['dig_u']= {"", "ULTIMATE", "掘りを磨け"}, ['dig_u']= {"", "ULTIMATE", "掘りを磨け"},
['c4wtrain_n']= {"C4Wトレーニング", "NORMAL", "無限中開け"}, ['c4wtrain_n']= {"C4Wトレーニング", "NORMAL", "無限中開け"},
['c4wtrain_l']= {"C4Wトレーニング", "LUNATIC", "無限中開け"}, ['c4wtrain_l']= {"C4Wトレーニング", "LUNATIC", "無限中開け"},
['pctrain_n']= {"パフェトレーニング", "NORMAL", "パフェの練習!"}, ['pctrain_n']= {"パフェトレーニング", "NORMAL", "パフェの練習!"},
['pctrain_l']= {"パフェトレーニング", "LUNATIC", "もっと難しいパフェの練習!"}, ['pctrain_l']= {"パフェトレーニング", "LUNATIC", "もっと難しいパフェの練習!"},
['pc_n']= {"パフェチャレンジ", "NORMAL", "100 Line以内でパフェをできるだけたくさん取れ!"}, ['pc_n']= {"パフェチャレンジ", "NORMAL", "100Line以内で パフェをできるだけたくさん取れ!"},
['pc_h']= {"パフェチャレンジ", "HARD", "100 Line以内でパフェをできるだけたくさん取れ!"}, ['pc_h']= {"パフェチャレンジ", "HARD", "100Line以内で パフェをできるだけたくさん取れ!"},
['pc_l']= {"パフェチャレンジ", "LUNATIC", "100 Line以内でパフェをできるだけたくさん取れ!"}, ['pc_l']= {"パフェチャレンジ", "LUNATIC", "100Line以内で パフェをできるだけたくさん取れ!"},
['pc_inf']= {"無限パフェチャレンジ", "", "できる限りたくさんのパフェを取れ!"}, ['pc_inf']= {"無限パフェチャレンジ", "", "できる限りたくさんのパフェを取れ!"},
['tech_n']= {"テクニック", "NORMAL", "B2Bを繋げ続けよう!"}, ['tech_n']= {"テクニック", "NORMAL", "B2Bを繋げ続けよう!"},
['tech_n_plus']= {"テクニック", "NORMAL+", "回転入れとパフェだけ!"}, ['tech_n_plus']= {"テクニック", "NORMAL+", "回転入れとパフェだけ!"},
['tech_h']= {"テクニック", "HARD", "B2Bを繋げ続けよう!"}, ['tech_h']= {"テクニック", "HARD", "B2Bを繋げ続けよう!"},
@@ -912,7 +913,7 @@ return {
['tech_l']= {"テクニック", "LUNATIC", "回転入れとパフェだけ!"}, ['tech_l']= {"テクニック", "LUNATIC", "回転入れとパフェだけ!"},
['tech_l_plus']= {"テクニック", "LUNATIC+", "回転入れとパフェだけ!"}, ['tech_l_plus']= {"テクニック", "LUNATIC+", "回転入れとパフェだけ!"},
['tech_finesse']= {"テクニック", "FINESSE", "最適化!"}, ['tech_finesse']= {"テクニック", "FINESSE", "最適化!"},
['tech_finesse_f']= {"テクニック", "FINESSE+", "最適化はそのまま、普通のライン消去禁止!"}, ['tech_finesse_f']= {"テクニック", "FINESSE+", "最適化はそのまま、通常line消去禁止!"},
['tsd_e']= {"TSDチャレンジ", "EASY", "TSDだけ!"}, ['tsd_e']= {"TSDチャレンジ", "EASY", "TSDだけ!"},
['tsd_h']= {"TSDチャレンジ", "HARD", "TSDだけ!"}, ['tsd_h']= {"TSDチャレンジ", "HARD", "TSDだけ!"},
['tsd_u']= {"TSDチャレンジ", "ULTIMATE", "TSDだけ!"}, ['tsd_u']= {"TSDチャレンジ", "ULTIMATE", "TSDだけ!"},
@@ -920,13 +921,13 @@ return {
['backfire_h']= {"バックファイヤー", "HARD", "撃った火力が戻ってくる!"}, ['backfire_h']= {"バックファイヤー", "HARD", "撃った火力が戻ってくる!"},
['backfire_l']= {"バックファイヤー", "LUNATIC", "撃った火力が戻ってくる!"}, ['backfire_l']= {"バックファイヤー", "LUNATIC", "撃った火力が戻ってくる!"},
['backfire_u']= {"バックファイヤー", "ULTIMATE", "撃った火力が戻ってくる!"}, ['backfire_u']= {"バックファイヤー", "ULTIMATE", "撃った火力が戻ってくる!"},
['sprintAtk']= {"スプリント", "100 Attack", "100ライン送れ!"}, ['sprintAtk']= {"スプリント", "100 Attack", "100line送れ!"},
['sprintEff']= {"スプリント", "Efficiency", "40ラインの間にできるだけ火力を出せ!"}, ['sprintEff']= {"スプリント", "Efficiency", "40lineの間にできるだけ火力を出せ!"},
['zen']= {'', "200", "時間制限なしで200ライン消去"}, ['zen']= {'zen', "200", "時間制限なしで200line消去"},
['ultra']= {'ウルトラ', "EXTRA", "2分以内にできるだけ多くの点数を取る"}, ['ultra']= {'ウルトラ', "EXTRA", "2分以内にできるだけ多くの点数を取る"},
['infinite']= {"無限", "", "サンドボックス"}, ['infinite']= {"無限", "", "サンドボックス"},
['infinite_dig']= {"無限: 掘り", "", "掘れ掘れ掘れ"}, ['infinite_dig']= {"無限: 掘り", "", "掘れ掘れ掘れ"},
['marathon_inf']= {"マラソン", "INFINITE", "ずっとマラソン"}, ['marathon_inf']= {"マラソン", "INFINITE", "ずっとマラソン"},
['custom_clear']= {"カスタム", "NORMAL"}, ['custom_clear']= {"カスタム", "NORMAL"},
['custom_puzzle']= {"カスタム", "PUZZLE"}, ['custom_puzzle']= {"カスタム", "PUZZLE"},
@@ -1015,7 +1016,7 @@ getTip={refuseCopy=true,
"ゲーム内にはモード選択マップからじゃ入れない隠しモードがいくつかあります!", "ゲーム内にはモード選択マップからじゃ入れない隠しモードがいくつかあります!",
"このゲームでは全てのSpinに火力補正があります!", "このゲームでは全てのSpinに火力補正があります!",
"このゲームのほとんどの楽曲はBeepboxを用いて作曲されました!", "このゲームのほとんどの楽曲はBeepboxを用いて作曲されました!",
"サーバーが不規則にダウンします", "サーバーが不規則に落ちます",
"スタッフロールの背景に流れている名前はスポンサーの名前です!", "スタッフロールの背景に流れている名前はスポンサーの名前です!",
"タブレットやスマホでもキーボードを接続できます!(iOSにはそんな機能ないと思うけど)", "タブレットやスマホでもキーボードを接続できます!(iOSにはそんな機能ないと思うけど)",
"なにかアイデアがありますか? Discordで提案してください!", "なにかアイデアがありますか? Discordで提案してください!",

View File

@@ -129,7 +129,6 @@ return {
-- invalidCode="Invalid code", -- invalidCode="Invalid code",
-- invalidEmail="Invalid email", -- invalidEmail="Invalid email",
-- playerNotFound="Player not found", -- playerNotFound="Player not found",
-- noPassword="No password",
-- invalidEmailPass="Invalid email or password", -- invalidEmailPass="Invalid email or password",
-- emailExists="Email exists", -- emailExists="Email exists",
-- emailSendError="Email send error", -- emailSendError="Email send error",
@@ -174,9 +173,8 @@ return {
-- started="Playing", -- started="Playing",
joinRoom="$1 Entrou a sala.", joinRoom="$1 Entrou a sala.",
leaveRoom="$1 Saiu da sala.", leaveRoom="$1 Saiu da sala.",
-- roomRemoved="Room was removed",
-- ready="READY", -- ready="READY",
-- connStream="CONNECTING",
-- waitStream="WAITING",
-- spectating="Spectating", -- spectating="Spectating",

View File

@@ -141,7 +141,6 @@ return {
invalidCode="无效验证码", invalidCode="无效验证码",
invalidEmail="无效邮箱", invalidEmail="无效邮箱",
playerNotFound="找不到玩家", playerNotFound="找不到玩家",
noPassword="未输入密码",
invalidEmailPass="邮箱或密码无效", invalidEmailPass="邮箱或密码无效",
emailExists="邮箱存在", emailExists="邮箱存在",
emailSendError="邮箱发送错误", emailSendError="邮箱发送错误",
@@ -186,6 +185,7 @@ return {
started="游戏中", started="游戏中",
joinRoom="$1 进入房间", joinRoom="$1 进入房间",
leaveRoom="$1 离开房间", leaveRoom="$1 离开房间",
roomRemoved="房间被解散",
ready="各就各位!", ready="各就各位!",
spectating="观战中", spectating="观战中",

View File

@@ -118,7 +118,6 @@ return {
noUsername="Error.NoUsername();", noUsername="Error.NoUsername();",
wrongEmail="Error.WrongEmail();", wrongEmail="Error.WrongEmail();",
wrongCode="Error.WrongVerificationCode();", wrongCode="Error.WrongVerificationCode();",
noPassword="Error.NoPassword();",
diffPassword="Error.DiffPassword();", diffPassword="Error.DiffPassword();",
checkEmail="register.RequestSent=true", checkEmail="register.RequestSent=true",
@@ -135,6 +134,7 @@ return {
started="Room.Playing();", started="Room.Playing();",
joinRoom="Room.Join($1);", joinRoom="Room.Join($1);",
leaveRoom="Room.Leave($1);", leaveRoom="Room.Leave($1);",
roomRemoved="Room.Removed();",
ready="Ready();", ready="Ready();",
spectating="Room.Spectating();", spectating="Room.Spectating();",

View File

@@ -141,7 +141,6 @@ return {
invalidCode="無效驗證碼", invalidCode="無效驗證碼",
invalidEmail="無效郵箱", invalidEmail="無效郵箱",
playerNotFound="找不到玩家", playerNotFound="找不到玩家",
noPassword="未輸入密碼",
invalidEmailPass="郵箱或密碼無效", invalidEmailPass="郵箱或密碼無效",
emailExists="郵箱存在", emailExists="郵箱存在",
emailSendError="郵箱發送錯誤", emailSendError="郵箱發送錯誤",
@@ -186,6 +185,7 @@ return {
started="遊戲中", started="遊戲中",
joinRoom="$1 進入房間", joinRoom="$1 進入房間",
leaveRoom="$1 離開房間", leaveRoom="$1 離開房間",
roomRemoved="房間被解散",
ready="準備!", ready="準備!",
spectating="旁觀中", spectating="旁觀中",

View File

@@ -40,7 +40,7 @@ return {
end end end end
end, end,
score=function(P) return {P.modeData.place,P.modeData.ko} end, score=function(P) return {P.modeData.place,P.modeData.ko} end,
scoreDisp=function(D) return"NO."..D[1].." KO:"..D[2] end, scoreDisp=function(D) return "NO."..D[1].." KO:"..D[2] end,
comp=function(a,b) return a[1]<b[1] or a[1]==b[1] and a[2]>b[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) getRank=function(P)
local R=P.modeData.place local R=P.modeData.place

View File

@@ -40,7 +40,7 @@ return {
end end end end
end, end,
score=function(P) return {P.modeData.place,P.modeData.ko} end, score=function(P) return {P.modeData.place,P.modeData.ko} end,
scoreDisp=function(D) return"NO."..D[1].." KO:"..D[2] end, scoreDisp=function(D) return "NO."..D[1].." KO:"..D[2] end,
comp=function(a,b) return a[1]<b[1] or a[1]==b[1] and a[2]>b[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) getRank=function(P)
local R=P.modeData.place local R=P.modeData.place

View File

@@ -40,7 +40,7 @@ return {
end end end end
end, end,
score=function(P) return {P.modeData.place,P.modeData.ko} end, score=function(P) return {P.modeData.place,P.modeData.ko} end,
scoreDisp=function(D) return"NO."..D[1].." KO:"..D[2] end, scoreDisp=function(D) return "NO."..D[1].." KO:"..D[2] end,
comp=function(a,b) return a[1]<b[1] or a[1]==b[1] and a[2]>b[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) getRank=function(P)
local R=P.modeData.place local R=P.modeData.place

View File

@@ -40,7 +40,7 @@ return {
end end end end
end, end,
score=function(P) return {P.modeData.place,P.modeData.ko} end, score=function(P) return {P.modeData.place,P.modeData.ko} end,
scoreDisp=function(D) return"NO."..D[1].." KO:"..D[2] end, scoreDisp=function(D) return "NO."..D[1].." KO:"..D[2] end,
comp=function(a,b) return a[1]<b[1] or a[1]==b[1] and a[2]>b[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) getRank=function(P)
local R=P.modeData.place local R=P.modeData.place

View File

@@ -40,7 +40,7 @@ return {
end end end end
end, end,
score=function(P) return {P.modeData.place,P.modeData.ko} end, score=function(P) return {P.modeData.place,P.modeData.ko} end,
scoreDisp=function(D) return"NO."..D[1].." KO:"..D[2] end, scoreDisp=function(D) return "NO."..D[1].." KO:"..D[2] end,
comp=function(a,b) return a[1]<b[1] or a[1]==b[1] and a[2]>b[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) getRank=function(P)
local R=P.modeData.place local R=P.modeData.place

View File

@@ -40,7 +40,7 @@ return {
end end end end
end, end,
score=function(P) return {P.modeData.place,P.modeData.ko} end, score=function(P) return {P.modeData.place,P.modeData.ko} end,
scoreDisp=function(D) return"NO."..D[1].." KO:"..D[2] end, scoreDisp=function(D) return "NO."..D[1].." KO:"..D[2] end,
comp=function(a,b) return a[1]<b[1] or a[1]==b[1] and a[2]>b[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) getRank=function(P)
local R=P.modeData.place local R=P.modeData.place

View File

@@ -474,7 +474,7 @@ end
-- Room -- Room
function NET.room_chat(msg,rid) function NET.room_chat(msg,rid)
if not TASK.lock('chatLimit',1.626) then if not TASK.lock('chatLimit',1.26) then
MES.new('warn',text.tooFrequent) MES.new('warn',text.tooFrequent)
elseif #msg>0 then elseif #msg>0 then
wsSend(1300,{ wsSend(1300,{
@@ -590,7 +590,7 @@ function NET.wsCallBack.room_chat(body)
TASK.unlock('receiveMessage') TASK.unlock('receiveMessage')
TASK.lock('receiveMessage',1) TASK.lock('receiveMessage',1)
NET.textBox:push{ NET.textBox:push{
COLOR.Z,_getFullName(body.data.playerId), COLOR.Z,_getFullName(body.data.playerId).." ",
COLOR.N,body.data.message, COLOR.N,body.data.message,
} }
end end
@@ -650,7 +650,7 @@ function NET.wsCallBack.room_enter(body)
end end
else else
local p=body.data local p=body.data
if NETPLY.map[p.playerId] then _playerLeaveRoom(p.playerId) end if NETPLY.exist(p.playerId) then _playerLeaveRoom(p.playerId) end
NETPLY.add{ NETPLY.add{
uid=p.playerId, uid=p.playerId,
group=p.group, group=p.group,
@@ -704,7 +704,6 @@ function NET.wsCallBack.player_finish(body)
if P.uid==body.data.playerId then if P.uid==body.data.playerId then
NETPLY.setPlace(P.uid,#PLY_ALIVE) NETPLY.setPlace(P.uid,#PLY_ALIVE)
P.loseTimer=26 P.loseTimer=26
P:lose(true)
break break
end end
end end

View File

@@ -138,6 +138,9 @@ function NETPLY.remove(uid)
end end
end end
end end
function NETPLY.exist(uid)
return rawget(PLYmap,uid) and true or false
end
function NETPLY.setPlace(uid,place) PLYmap[uid].place=place end function NETPLY.setPlace(uid,place) PLYmap[uid].place=place end
function NETPLY.setStat(uid,S) function NETPLY.setStat(uid,S)

View File

@@ -445,7 +445,13 @@ function PLY.newPlayer(id,mini,p)
local pData={ local pData={
uid=USER.uid, uid=USER.uid,
group=0, group=0,
} if p then TABLE.coverR(p,pData) end } if p then
TABLE.coverR(p,pData)
else
-- Default pid=1, and empty username
pData.uid=1
P.username=""
end
P.uid=pData.uid P.uid=pData.uid
P.sid=NET.uid_sid[pData.uid] or pData.uid P.sid=NET.uid_sid[pData.uid] or pData.uid
P.group=pData.group P.group=pData.group

View File

@@ -2707,7 +2707,12 @@ function Player:update(dt)
end end
if frameDelta then if frameDelta then
for _=1, for _=1,
self.loseTimer and 6 or self.loseTimer and min(frameDelta,
self.loseTimer>16 and 2 or
self.loseTimer>6.2 and 12 or
self.loseTimer>2.6 and 260 or
2600
) or
frameDelta<26 and 1 or frameDelta<26 and 1 or
frameDelta<50 and 2 or frameDelta<50 and 2 or
frameDelta<80 and 3 or frameDelta<80 and 3 or

View File

@@ -4,7 +4,7 @@ local sin=math.sin
local scene={} local scene={}
function scene.sceneInit() function scene.enter()
BG.set() BG.set()
end end

View File

@@ -2,7 +2,7 @@
local scene={} local scene={}
function scene.sceneInit() function scene.enter()
end end

View File

@@ -14,7 +14,7 @@ local slide,pathVis,revKB
local function ifGaming() return state==1 end local function ifGaming() return state==1 end
local colorSelector=WIDGET.newSelector{name='color',x=150,y=240,w=200,list={'color1','rainbow','color2','gray','black'},color='lY',disp=function() return color end,code=function(v) if state~=1 then color=v end end,hideF=ifGaming} local colorSelector=WIDGET.newSelector{name='color',x=150,y=240,w=200,list={'color1','rainbow','color2','gray','black'},color='lY',disp=function() return color end,code=function(v) if state~=1 then color=v end end,hideF=ifGaming}
function scene.sceneInit() function scene.enter()
BG.set('rainbow2') BG.set('rainbow2')
BGM.play('push') BGM.play('push')
board={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}} board={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}

View File

@@ -225,7 +225,7 @@ local function skip()
end end
end end
function scene.sceneInit() function scene.enter()
BG.set('cubes') BG.set('cubes')
BGM.play('truth') BGM.play('truth')
board={} board={}

View File

@@ -29,7 +29,7 @@ local startTime,time
local state,progress local state,progress
local frameKeyCount,mistake local frameKeyCount,mistake
function scene.sceneInit() function scene.enter()
BG.set('bg2') BG.set('bg2')
BGM.play('way') BGM.play('way')
levelName="A_Z" levelName="A_Z"

View File

@@ -94,7 +94,7 @@ end
local scene={} local scene={}
function scene.sceneInit() function scene.enter()
restart() restart()
BGM.play('truth') BGM.play('truth')
BG.set('rainbow') BG.set('rainbow')

View File

@@ -153,7 +153,7 @@ end
local scene={} local scene={}
function scene.sceneInit() function scene.enter()
reset() reset()
BGM.play('truth') BGM.play('truth')
end end

View File

@@ -24,12 +24,12 @@ local function _autoReturn()
end end
end end
function scene.sceneInit() function scene.enter()
BG.set('none') BG.set('none')
BGM.stop() BGM.stop()
reg,val,sym=false,"0",false reg,val,sym=false,"0",false
end end
function scene.sceneBack() function scene.leave()
BGM.play() BGM.play()
end end

View File

@@ -6,7 +6,7 @@ local state,timer,score,combo
local x,y,vx,vy,ex,ey local x,y,vx,vy,ex,ey
local scene={} local scene={}
function scene.sceneInit() function scene.enter()
pow,ang=0,0 pow,ang=0,0
state=0 state=0
timer=0 timer=0

View File

@@ -711,20 +711,22 @@ local commands={} do
local button=WIDGET.newButton{name='bye',x=640,y=615,w=426,h=100,code=function() local button=WIDGET.newButton{name='bye',x=640,y=615,w=426,h=100,code=function()
TASK.new(function() TASK.new(function()
scene.widgetList.bye.hide=true scene.widgetList.bye.hide=true
for _=1,30 do coroutine.yield() end TEST.yieldN(30)
log{C.R,"Deleting all data in 10..."}SFX.play('ready')SFX.play('clear_1')TEST.yieldN(60) log{C.R,"Deleting all data in 10..."}SFX.play('ready')SFX.play('clear_1')TEST.yieldN(60)
log{C.R,"Deleting all data in 9..."}SFX.play('ready')SFX.play('clear_1')TEST.yieldN(60) log{C.R,"Deleting all data in 9..."} SFX.play('ready')SFX.play('clear_1')TEST.yieldN(60)
log{C.R,"Deleting all data in 8..."}SFX.play('ready')SFX.play('clear_1')TEST.yieldN(60) log{C.R,"Deleting all data in 8..."} SFX.play('ready')SFX.play('clear_1')TEST.yieldN(60)
log{C.R,"Deleting all data in 7..."}SFX.play('ready')SFX.play('clear_2')TEST.yieldN(60) log{C.R,"Deleting all data in 7..."} SFX.play('ready')SFX.play('clear_2')TEST.yieldN(60)
log{C.R,"Deleting all data in 6..."}SFX.play('ready')SFX.play('clear_2')TEST.yieldN(60) log{C.R,"Deleting all data in 6..."} SFX.play('ready')SFX.play('clear_2')TEST.yieldN(60)
log{C.R,"Deleting all data in 5..."}SFX.play('ready')SFX.play('clear_3')TEST.yieldN(60) log{C.R,"Deleting all data in 5..."} SFX.play('ready')SFX.play('clear_3')TEST.yieldN(60)
log{C.R,"Deleting all data in 4..."}SFX.play('ready')SFX.play('clear_3')TEST.yieldN(60) log{C.R,"Deleting all data in 4..."} SFX.play('ready')SFX.play('clear_3')TEST.yieldN(60)
log{C.R,"Deleting all data in 3..."}SFX.play('ready')SFX.play('clear_4')TEST.yieldN(60) log{C.R,"Deleting all data in 3..."} SFX.play('ready')SFX.play('clear_4')TEST.yieldN(60)
log{C.R,"Deleting all data in 2..."}SFX.play('ready')SFX.play('clear_4')TEST.yieldN(60) log{C.R,"Deleting all data in 2..."} SFX.play('ready')SFX.play('clear_4')TEST.yieldN(60)
log{C.R,"Deleting all data in 1..."}SFX.play('ready')SFX.play('clear_5')TEST.yieldN(60) log{C.R,"Deleting all data in 1..."} SFX.play('ready')SFX.play('clear_5')TEST.yieldN(60)
log{C.R,"Deleting all data in 0..."}SFX.play('start')SFX.play('clear_6')TEST.yieldN(60) log{C.R,"Deleting all data in 0..."} SFX.play('start')SFX.play('clear_6')TEST.yieldN(60)
outputBox.hide=true TEST.yieldN(26) outputBox.hide=true
FILE.clear_s('')love.event.quit() TEST.yieldN(26)
FILE.clear_s('')
love.event.quit()
end) end)
end} end}
button:setObject("Techmino is fun. Bye.") button:setObject("Techmino is fun. Bye.")
@@ -1000,7 +1002,7 @@ local fleg={
pw=the_secret, pw=the_secret,
supw=7126, supw=7126,
second_box="Coming soon", second_box="Coming soon",
}setmetatable(fleg,{__tostring=function() return"The fl\97g." end}) }setmetatable(fleg,{__tostring=function() return "The fl\97g." end})
function userG.the_box(k) function userG.the_box(k)
if k~=first_key then if k~=first_key then
log"Usage:"log"*The box is locked*" log"Usage:"log"*The box is locked*"
@@ -1014,7 +1016,7 @@ userG.the_key=first_key
function scene.sceneInit() function scene.enter()
WIDGET.focus(inputBox) WIDGET.focus(inputBox)
BG.set('none') BG.set('none')
end end

View File

@@ -45,7 +45,7 @@ end
local scene={} local scene={}
function scene.sceneInit() function scene.enter()
cubesX={} for i=1,40 do cubesX[i]=rnd()*16-8 end cubesX={} for i=1,40 do cubesX[i]=rnd()*16-8 end
cubesY={} for i=1,40 do cubesY[i]=i/40*9 end cubesY={} for i=1,40 do cubesY[i]=i/40*9 end
lastCube=1 lastCube=1

View File

@@ -33,7 +33,7 @@ local function restart()
end end
end end
function scene.sceneInit() function scene.enter()
restart() restart()
state='menu' state='menu'
BGM.play('hang out') BGM.play('hang out')

View File

@@ -197,7 +197,7 @@ end
local scene={} local scene={}
function scene.sceneInit() function scene.enter()
reset() reset()
BG.set('fixColor',.26,.26,.26) BG.set('fixColor',.26,.26,.26)
BGM.play(bgm) BGM.play(bgm)

View File

@@ -243,7 +243,7 @@ end
local scene={} local scene={}
function scene.sceneInit() function scene.enter()
invis=false invis=false
newGame() newGame()
BGM.play('truth') BGM.play('truth')

View File

@@ -105,7 +105,7 @@ end
local scene={} local scene={}
function scene.sceneInit() function scene.enter()
BG.set('fixColor',.26,.62,.26) BG.set('fixColor',.26,.62,.26)
_newGame() _newGame()
selected=false selected=false

View File

@@ -29,7 +29,7 @@ local function _reset()
freshLevel() freshLevel()
end end
function scene.sceneInit() function scene.enter()
state=1 state=1
timeUsed=0 timeUsed=0
level=0 level=0

View File

@@ -13,7 +13,7 @@ local offset
local scene={} local scene={}
function scene.sceneInit() function scene.enter()
inst='lead' inst='lead'
offset=0 offset=0
end end

View File

@@ -27,7 +27,7 @@ end
local scene={} local scene={}
function scene.sceneInit() function scene.enter()
state=0 state=0
ang,pos=0,-tau/4 ang,pos=0,-tau/4
timer=50 timer=50

View File

@@ -14,7 +14,7 @@ local ry=0-- Rotation Y
local p1,p2-- Player data local p1,p2-- Player data
function scene.sceneInit() function scene.enter()
BG.set('none') BG.set('none')
BGM.play('way') BGM.play('way')
state=0 state=0

View File

@@ -15,7 +15,7 @@ local function reset()
s1,s2=0,0 s1,s2=0,0
end end
function scene.sceneInit() function scene.enter()
reset() reset()
BG.set('none') BG.set('none')
end end

View File

@@ -11,7 +11,7 @@ local startTime,time
local state,progress local state,progress
local tapFX,mistake local tapFX,mistake
function scene.sceneInit() function scene.enter()
BG.set('space') BG.set('space')
BGM.play('way') BGM.play('way')
board={} board={}

View File

@@ -23,7 +23,7 @@ end
local scene={} local scene={}
function scene.sceneInit() function scene.enter()
state=0 state=0
time1=STRING.time(0) time1=STRING.time(0)
time2=STRING.time(0) time2=STRING.time(0)

View File

@@ -8,7 +8,7 @@ local scene={}
local lastKey,keyTime local lastKey,keyTime
local speed,maxSpeed=0,260 local speed,maxSpeed=0,260
function scene.sceneInit() function scene.enter()
lastKey=nil lastKey=nil
speed=0 speed=0
keyTime={} for i=1,40 do keyTime[i]=-1e99 end keyTime={} for i=1,40 do keyTime[i]=-1e99 end

View File

@@ -54,7 +54,7 @@ local function reset()
fallingTimer=false fallingTimer=false
failPos=false failPos=false
end end
function scene.sceneInit() function scene.enter()
BG.set('rainbow2') BG.set('rainbow2')
BGM.play('truth') BGM.play('truth')
preview={} preview={}

View File

@@ -264,7 +264,7 @@ end
local scene={} local scene={}
function scene.sceneInit() function scene.enter()
player:reset() player:reset()
BGM.play('truth') BGM.play('truth')
end end

View File

@@ -24,12 +24,12 @@ local sList={
local scene={} local scene={}
function scene.sceneInit() function scene.enter()
destroyPlayers() destroyPlayers()
BG.set(CUSTOMENV.bg) BG.set(CUSTOMENV.bg)
BGM.play(CUSTOMENV.bgm) BGM.play(CUSTOMENV.bgm)
end end
function scene.sceneBack() function scene.leave()
saveFile(CUSTOMENV,'conf/customEnv') saveFile(CUSTOMENV,'conf/customEnv')
BGM.play() BGM.play()
end end
@@ -216,13 +216,13 @@ scene.widgetList={
WIDGET.newSelector{name='eventSet', x=1050,y=760,w=340,color='H',list=sList.eventSet,disp=CUSval('eventSet'),code=CUSsto('eventSet')}, WIDGET.newSelector{name='eventSet', x=1050,y=760,w=340,color='H',list=sList.eventSet,disp=CUSval('eventSet'),code=CUSsto('eventSet')},
-- Special rules -- Special rules
WIDGET.newSwitch{name='ospin', x=850, y=830, lim=210,disp=CUSval('ospin'), code=CUSrev('ospin')}, WIDGET.newSwitch{name='ospin', x=850, y=850, lim=210,disp=CUSval('ospin'), code=CUSrev('ospin')},
WIDGET.newSwitch{name='fineKill', x=850, y=890, lim=210,disp=CUSval('fineKill'), code=CUSrev('fineKill')}, WIDGET.newSwitch{name='fineKill', x=850, y=910, lim=210,disp=CUSval('fineKill'), code=CUSrev('fineKill')},
WIDGET.newSwitch{name='b2bKill', x=850, y=950, lim=210,disp=CUSval('b2bKill'), code=CUSrev('b2bKill')}, WIDGET.newSwitch{name='b2bKill', x=850, y=970, lim=210,disp=CUSval('b2bKill'), code=CUSrev('b2bKill')},
WIDGET.newSwitch{name='lockout', x=850, y=1010,lim=210,disp=CUSval('lockout'), code=CUSrev('lockout')}, WIDGET.newSwitch{name='lockout', x=850, y=1030,lim=210,disp=CUSval('lockout'), code=CUSrev('lockout')},
WIDGET.newSwitch{name='easyFresh', x=1170,y=830, lim=250,disp=CUSval('easyFresh'),code=CUSrev('easyFresh')}, WIDGET.newSwitch{name='easyFresh', x=1170,y=850, lim=250,disp=CUSval('easyFresh'),code=CUSrev('easyFresh')},
WIDGET.newSwitch{name='deepDrop', x=1170,y=890, lim=250,disp=CUSval('deepDrop'), code=CUSrev('deepDrop')}, WIDGET.newSwitch{name='deepDrop', x=1170,y=910, lim=250,disp=CUSval('deepDrop'), code=CUSrev('deepDrop')},
WIDGET.newSwitch{name='bone', x=1170,y=950, lim=250,disp=CUSval('bone'), code=CUSrev('bone')}, WIDGET.newSwitch{name='bone', x=1170,y=970, lim=250,disp=CUSval('bone'), code=CUSrev('bone')},
-- Next & Hold -- Next & Hold
WIDGET.newSelector{name='holdMode', x=310, y=890, w=300,color='lY',list=sList.holdMode,disp=CUSval('holdMode'),code=CUSsto('holdMode'),hideF=function() return CUSTOMENV.holdCount==0 end}, WIDGET.newSelector{name='holdMode', x=310, y=890, w=300,color='lY',list=sList.holdMode,disp=CUSval('holdMode'),code=CUSsto('holdMode'),hideF=function() return CUSTOMENV.holdCount==0 end},
@@ -232,8 +232,8 @@ scene.widgetList={
WIDGET.newSwitch{name='phyHold', x=560, y=1030,lim=200, disp=CUSval('phyHold'),code=CUSrev('phyHold'),hideF=function() return CUSTOMENV.holdCount==0 end}, WIDGET.newSwitch{name='phyHold', x=560, y=1030,lim=200, disp=CUSval('phyHold'),code=CUSrev('phyHold'),hideF=function() return CUSTOMENV.holdCount==0 end},
-- BG & BGM -- BG & BGM
WIDGET.newSelector{name='bg', x=840, y=1090,w=250,color='Y',list=BG.getList(),disp=CUSval('bg'),code=function(i) CUSTOMENV.bg=i BG.set(i) end}, WIDGET.newSelector{name='bg', x=840, y=1100,w=250,color='Y',list=BG.getList(),disp=CUSval('bg'),code=function(i) CUSTOMENV.bg=i BG.set(i) end},
WIDGET.newSelector{name='bgm', x=1120,y=1090,w=250,color='Y',list=BGM.getList(),disp=CUSval('bgm'),code=function(i) CUSTOMENV.bgm=i BGM.play(i) end}, WIDGET.newSelector{name='bgm', x=1120,y=1100,w=250,color='Y',list=BGM.getList(),disp=CUSval('bgm'),code=function(i) CUSTOMENV.bgm=i BGM.play(i) end},
} }
return scene return scene

View File

@@ -117,14 +117,14 @@ local function _pDraw()
while #F>0 and isEmpty(F[#F]) do rem(F) end while #F>0 and isEmpty(F[#F]) do rem(F) end
end end
function scene.sceneInit() function scene.enter()
curPen=false curPen=false
penMode=0 penMode=0
penX,penY=1,1 penX,penY=1,1
demo=false demo=false
page=1 page=1
end end
function scene.sceneBack() function scene.leave()
saveFile(DATA.copyBoards(),'conf/customBoards') saveFile(DATA.copyBoards(),'conf/customBoards')
end end

View File

@@ -9,11 +9,11 @@ local scene={}
local input-- Input buffer local input-- Input buffer
local cur-- Cursor position local cur-- Cursor position
function scene.sceneInit() function scene.enter()
input="" input=""
cur=#MISSION cur=#MISSION
end end
function scene.sceneBack() function scene.leave()
saveFile(DATA.copyMission(),'conf/customMissions') saveFile(DATA.copyMission(),'conf/customMissions')
end end

View File

@@ -1,18 +1,18 @@
local gc,sys=love.graphics,love.system local sys=love.system
local kb=love.keyboard local kb=love.keyboard
local sin=math.sin local sin=math.sin
local ins,rem=table.insert,table.remove local ins,rem=table.insert,table.remove
local gc_setColor,gc_print=gc.setColor,gc.print local gc_setColor,gc_print=GC.setColor,GC.print
local scene={} local scene={}
local cur-- Cursor position local cur-- Cursor position
function scene.sceneInit() function scene.enter()
cur=#BAG cur=#BAG
end end
function scene.sceneBack() function scene.leave()
saveFile(DATA.copySequence(),'conf/customSequence') saveFile(DATA.copySequence(),'conf/customSequence')
end end
@@ -112,12 +112,12 @@ function scene.keyDown(key)
end end
end end
local blockCharWidth={} for i=1,#BLOCK_CHARS do blockCharWidth[i]=gc.newText(FONT.get(60),BLOCK_CHARS[i]):getWidth() end local blockCharWidth={} for i=1,#BLOCK_CHARS do blockCharWidth[i]=GC.newText(FONT.get(60),BLOCK_CHARS[i]):getWidth() end
function scene.draw() function scene.draw()
-- Draw frame -- Draw frame
gc_setColor(COLOR.Z) gc_setColor(COLOR.Z)
gc.setLineWidth(2) GC.setLineWidth(2)
gc.rectangle('line',100,110,1080,260,5) GC.rectangle('line',100,110,1080,260,5)
-- Draw sequence -- Draw sequence
local BLOCK_COLORS=BLOCK_COLORS local BLOCK_COLORS=BLOCK_COLORS
@@ -166,7 +166,7 @@ function scene.draw()
-- Draw cursor -- Draw cursor
gc_setColor(.5,1,.5,.6+.4*sin(TIME()*6.26)) gc_setColor(.5,1,.5,.6+.4*sin(TIME()*6.26))
gc.line(cx-5,cy-20,cx-5,cy+20) GC.line(cx-5,cy-20,cx-5,cy+20)
end end
scene.widgetList={ scene.widgetList={

View File

@@ -4,7 +4,7 @@ local scene={}
local timer local timer
function scene.sceneInit() function scene.enter()
timer=1 timer=1
scene.widgetList.pause.x= scene.widgetList.pause.x=
SETTING.menuPos=='right' and 1195 or SETTING.menuPos=='right' and 1195 or

View File

@@ -75,7 +75,7 @@ local function _search()
lastSearch=input lastSearch=input
end end
function scene.sceneInit() function scene.enter()
dict=require("parts.language.dict_"..(SETTING.locale:find'zh' and 'zh' or SETTING.locale:find'ja' and 'ja' or 'en')) dict=require("parts.language.dict_"..(SETTING.locale:find'zh' and 'zh' or SETTING.locale:find'ja' and 'ja' or 'en'))
_scanDict(dict) _scanDict(dict)

View File

@@ -4,7 +4,7 @@ local errorShot,errorInfo
local scene={} local scene={}
function scene.sceneInit() function scene.enter()
BGcolor=math.random()>.026 and {.3,.5,.9} or {.62,.3,.926} BGcolor=math.random()>.026 and {.3,.5,.9} or {.62,.3,.926}
sysAndScn=SYSTEM.."-"..VERSION.string.." scene:"..Z.getErr('#').scene sysAndScn=SYSTEM.."-"..VERSION.string.." scene:"..Z.getErr('#').scene
errorText=LOADED and text.errorMsg or "An error has occurred while the game was loading.\nAn error log has been created so you can send it to the author." errorText=LOADED and text.errorMsg or "An error has occurred while the game was loading.\nAn error log has been created so you can send it to the author."
@@ -34,7 +34,7 @@ end
scene.widgetList={ scene.widgetList={
WIDGET.newKey{name='console',x=940,y=640,w=170,h=80,font=65,fText=CHAR.icon.console,code=goScene'app_console'}, WIDGET.newKey{name='console',x=940,y=640,w=170,h=80,font=65,fText=CHAR.icon.console,code=goScene'app_console'},
WIDGET.newKey{name='quit',x=1140,y=640,w=170,h=80,font=40,fText=CHAR.icon.cross_thick,code=love.event.quit}, WIDGET.newKey{name='quit',x=1140,y=640,w=170,h=80,font=40,fText=CHAR.icon.cross_thick,code=goScene('quit','none')},
} }
return scene return scene

View File

@@ -133,7 +133,7 @@ local function _checkGameKeyDown(key)
return true-- No key pressed return true-- No key pressed
end end
function scene.sceneInit() function scene.enter()
if GAME.init then if GAME.init then
resetGameData() resetGameData()
GAME.init=false GAME.init=false

View File

@@ -1,6 +1,6 @@
local scene={} local scene={}
function scene.sceneInit() function scene.enter()
BG.set('cubes') BG.set('cubes')
scene.widgetList.texts:setTexts(require"parts.updateLog":split("\n")) scene.widgetList.texts:setTexts(require"parts.updateLog":split("\n"))
end end

View File

@@ -20,7 +20,7 @@ local curLang=1
local scene={} local scene={}
function scene.sceneBack() function scene.leave()
saveSettings() saveSettings()
end end

View File

@@ -1,5 +1,5 @@
local scene={} local scene={}
function scene.sceneInit() function scene.enter()
BG.set('cubes') BG.set('cubes')
local fileData=love.filesystem.read("legals.md") local fileData=love.filesystem.read("legals.md")
if fileData then if fileData then

View File

@@ -107,25 +107,25 @@ local loadingThread=coroutine.wrap(function()
LOADED=true LOADED=true
saveStats() saveStats()
Z.setPowerInfo(SETTING.powerInfo) Z.setPowerInfo(SETTING.powerInfo)
return'finish' return 'finish'
end) end)
function scene.sceneInit() function scene.enter()
studioLogo=GC.newText(getFont(90),"26F Studio") studioLogo=GC.newText(getFont(90),"26F Studio")
progress=0 progress=0
maxProgress=10 maxProgress=10
t1,t2=0,0-- Timer t1,t2=0,0-- Timer
animeType={} for i=1,#SVG_TITLE_FILL do animeType[i]=math.random(#titleTransform) end-- Random animation type animeType={} for i=1,#SVG_TITLE_FILL do animeType[i]=math.random(#titleTransform) end-- Random animation type
end end
function scene.sceneBack() function scene.leave()
love.event.quit() SCN.go('quit','none')
end end
function scene.mouseDown() function scene.mouseDown()
if LOADED then if LOADED then
if FIRSTLAUNCH then if FIRSTLAUNCH then
SCN.push('main') SCN.push('main')
SCN.swapTo('lang') SCN.go('lang')
else else
SCN.go(SETTING.simpMode and 'main_simple' or 'main') SCN.go(SETTING.simpMode and 'main_simple' or 'main')
end end
@@ -134,7 +134,7 @@ end
scene.touchDown=scene.mouseDown scene.touchDown=scene.mouseDown
function scene.keyDown(key) function scene.keyDown(key)
if key=='escape' then if key=='escape' then
love.event.quit() SCN.go('quit','none')
else else
scene.mouseDown() scene.mouseDown()
end end

View File

@@ -9,7 +9,6 @@ local function _getCode()
NET.getCode(email) NET.getCode(email)
end end
end end
local function _codeLogin() local function _codeLogin()
local code=scene.widgetList.code:getText():upper() local code=scene.widgetList.code:getText():upper()
if #code~=8 then if #code~=8 then
@@ -18,8 +17,19 @@ local function _codeLogin()
NET.codeLogin(USER.email,code) NET.codeLogin(USER.email,code)
end end
end end
local function _paste()
local t=love.system.getClipboardText()
if t then
t=STRING.trim(t)
if #t==8 and t:match("[0-9]+") then
scene.widgetList.code:setText(t)
return
end
end
MES.new('warn',text.wrongCode)
end
function scene.sceneInit() function scene.enter()
scene.widgetList.email:setText(USER.email or "") scene.widgetList.email:setText(USER.email or "")
scene.widgetList.code:clear() scene.widgetList.code:clear()
end end
@@ -33,6 +43,8 @@ function scene.keyDown(key,rep)
else else
_codeLogin() _codeLogin()
end end
elseif key=='v' and love.keyboard.isDown('lctrl','rctrl') then
_paste()
else else
return true return true
end end
@@ -45,8 +57,9 @@ scene.widgetList={
WIDGET.newInputBox{name='email', x=380, y=200,w=626,h=60,limit=128}, WIDGET.newInputBox{name='email', x=380, y=200,w=626,h=60,limit=128},
WIDGET.newKey{name='send', x=640, y=330,w=300,h=80,font=40,code=_getCode}, WIDGET.newKey{name='send', x=640, y=330,w=300,h=80,font=40,code=_getCode},
WIDGET.newInputBox{name='code', x=380, y=400,w=626 ,h=60,limit=8}, WIDGET.newInputBox{name='code', x=380, y=400,w=626,h=60,regex="[0-9a-zA-Z]",limit=8},
WIDGET.newKey{name='verify', x=640, y=530,w=300,h=80,font=40,code=_codeLogin}, WIDGET.newKey{name='verify', x=640, y=530,w=300,h=80,font=40,code=_codeLogin},
WIDGET.newKey{name='paste', x=850, y=530,w=80,font=40,fText=CHAR.icon.import,code=_paste},
WIDGET.newButton{name='back', x=1140,y=640,w=170,h=80,sound='back',font=60,fText=CHAR.icon.back,code=pressKey'escape'}, WIDGET.newButton{name='back', x=1140,y=640,w=170,h=80,sound='back',font=60,fText=CHAR.icon.back,code=pressKey'escape'},
} }

View File

@@ -15,7 +15,7 @@ end
local scene={} local scene={}
function scene.sceneInit() function scene.enter()
showEmail=false showEmail=false
emailBox.secret=true emailBox.secret=true
emailBox:setText(USER.email) emailBox:setText(USER.email)
@@ -23,8 +23,12 @@ function scene.sceneInit()
end end
function scene.keyDown(key,rep) function scene.keyDown(key,rep)
if key~='return' or rep then return true end if rep then return true end
_login() if key=='return' then
_login()
else
return true
end
end end
scene.widgetList={ scene.widgetList={

View File

@@ -18,7 +18,7 @@ local enterConsole=coroutine.wrap(function()
Snd('bell',.6,'A4',.7,'A5',1,'A6')SFX.play('ren_mega')SCN.go('app_console')coroutine.yield() Snd('bell',.6,'A4',.7,'A5',1,'A6')SFX.play('ren_mega')SCN.go('app_console')coroutine.yield()
end end
end) end)
function scene.sceneInit() function scene.enter()
if THEME.cur=='halloween' then if THEME.cur=='halloween' then
TASK.new(function() TASK.new(function()
TEST.yieldT(.26) TEST.yieldT(.26)

View File

@@ -2,7 +2,7 @@ local scene={}
local tip=GC.newText(getFont(30),"") local tip=GC.newText(getFont(30),"")
function scene.sceneInit() function scene.enter()
tip:set(text.getTip()) tip:set(text.getTip())
BG.set() BG.set()
end end

View File

@@ -1,6 +1,6 @@
local scene={} local scene={}
function scene.sceneInit() function scene.enter()
BG.set('cubes') BG.set('cubes')
local fileData=FILE.load('parts/language/manual_'..(SETTING.locale:find'zh' and 'zh' or SETTING.locale:find'ja' and 'ja' or 'en')..'.txt','-string') local fileData=FILE.load('parts/language/manual_'..(SETTING.locale:find'zh' and 'zh' or SETTING.locale:find'ja' and 'ja' or 'en')..'.txt','-string')
if fileData then if fileData then

View File

@@ -38,7 +38,7 @@ local function _toggleMod(M,back)
scene.widgetList.unranked.hide=scoreValid() scene.widgetList.unranked.hide=scoreValid()
end end
function scene.sceneInit() function scene.enter()
selected=false selected=false
scene.widgetList.unranked.hide=scoreValid() scene.widgetList.unranked.hide=scoreValid()
BG.set('tunnel') BG.set('tunnel')

View File

@@ -24,7 +24,7 @@ local touchDist
local scene={} local scene={}
function scene.sceneInit() function scene.enter()
BG.set() BG.set()
mapCam.zoomK=SCN.prev=='main' and 5 or 1 mapCam.zoomK=SCN.prev=='main' and 5 or 1
visibleModes={}-- 1=unlocked, 2=locked but visible visibleModes={}-- 1=unlocked, 2=locked but visible

View File

@@ -23,7 +23,7 @@ local selected-- Music selected
local bgmList=BGM.getList() local bgmList=BGM.getList()
if #bgmList==0 then bgmList={"[NO BGM]"} end if #bgmList==0 then bgmList={"[NO BGM]"} end
function scene.sceneInit() function scene.enter()
playing=BGM.getPlaying()[1] playing=BGM.getPlaying()[1]
selected=TABLE.find(bgmList,playing) or 1 selected=TABLE.find(bgmList,playing) or 1
end end

View File

@@ -59,7 +59,7 @@ end
local scene={} local scene={}
function scene.sceneInit() function scene.enter()
noTouch=not SETTING.VKSwitch noTouch=not SETTING.VKSwitch
playing=false playing=false
lastUpstreamTime=0 lastUpstreamTime=0
@@ -73,7 +73,7 @@ function scene.sceneInit()
GAME.prevBG=false GAME.prevBG=false
end end
end end
function scene.sceneBack() function scene.leave()
TASK.unlock('netPlaying') TASK.unlock('netPlaying')
end end
@@ -127,19 +127,42 @@ function scene.keyDown(key,isRep)
else else
_quit() _quit()
end end
elseif key=='/' then
if inputBox.hide then
_switchChat()
local mes=STRING.trim(inputBox:getText())
if #mes==0 then
inputBox:setText("/")
end
end
elseif key=='return' or key=='kpenter' then elseif key=='return' or key=='kpenter' then
local mes=STRING.trim(inputBox:getText()) local mes=STRING.trim(inputBox:getText())
if not inputBox.hide and #mes>0 then if not inputBox.hide and #mes>0 then
if mes:sub(1,1)=='/' then if mes:sub(1,1)=='/' then
local cmd=STRING.split(mes,' ') local cmd=STRING.split(mes,' ')
-- Common commands
if cmd[1]=='/kick' then if cmd[1]=='/kick' then
if tonumber(cmd[2]) then NET.room_kick(tonumber(cmd[2])) end if tonumber(cmd[2]) then NET.room_kick(tonumber(cmd[2])) end
elseif cmd[1]=='/pw' then
if cmd[2] then NET.room_setPW(cmd[2]) end
elseif cmd[1]=='/host' then elseif cmd[1]=='/host' then
if tonumber(cmd[2]) then NET.player_setHost(tonumber(cmd[2])) end if tonumber(cmd[2]) then NET.player_setHost(tonumber(cmd[2])) end
elseif cmd[1]=='/group' then elseif cmd[1]=='/group' then
if tonumber(cmd[2]) and tonumber(cmd[2])%1==0 and tonumber(cmd[2])>=0 and tonumber(cmd[2])<=6 then if tonumber(cmd[2]) and tonumber(cmd[2])%1==0 and tonumber(cmd[2])>=0 and tonumber(cmd[2])<=6 then
NET.player_joinGroup(tonumber(cmd[2])) NET.player_joinGroup(tonumber(cmd[2]))
end end
elseif cmd[1]=='/exit' or cmd[1]=='/quit' then
_quit()
-- Admin commands
elseif cmd[1]=='/fkick' then
if tonumber(cmd[2]) then NET.room_kick(tonumber(cmd[2]),NET.roomState.roomId) end
elseif cmd[1]=='/fpw' then
if cmd[2] then NET.room_setPW(cmd[2],NET.roomState.roomId) end
elseif cmd[1]=='/fexit' or cmd[1]=='/fquit' then
NET.room_remove(NET.roomState.roomId)
else else
NET.textBox:push{COLOR.R,'Invalid command'} NET.textBox:push{COLOR.R,'Invalid command'}
end end
@@ -150,6 +173,8 @@ function scene.keyDown(key,isRep)
else else
_switchChat() _switchChat()
end end
elseif #key==1 and key:find("^[0-6]$") and kb.isDown('lctrl','rctrl') then
NET.player_joinGroup(tonumber(key))
elseif not inputBox.hide then elseif not inputBox.hide then
WIDGET.focus(inputBox) WIDGET.focus(inputBox)
inputBox:keypress(key) inputBox:keypress(key)
@@ -343,6 +368,15 @@ scene.widgetList={
WIDGET.newKey{name='ready', x=1060,y=510,w=360,h=90,color='lG',font=35, code=_setReady,hideF=_hideF_ready}, WIDGET.newKey{name='ready', x=1060,y=510,w=360,h=90,color='lG',font=35, code=_setReady,hideF=_hideF_ready},
WIDGET.newKey{name='spectate',x=1060,y=610,w=360,h=90,color='lO',font=35, code=_setSpectate,hideF=_hideF_ready}, WIDGET.newKey{name='spectate',x=1060,y=610,w=360,h=90,color='lO',font=35, code=_setSpectate,hideF=_hideF_ready},
WIDGET.newKey{name='cancel', x=1060,y=560,w=360,h=120,color='lH',font=40,code=_setCancel,hideF=_hideF_standby}, WIDGET.newKey{name='cancel', x=1060,y=560,w=360,h=120,color='lH',font=40,code=_setCancel,hideF=_hideF_standby},
WIDGET.newButton{x=320,y=45,w=40,color='Z', fText="",code=function() NET.player_joinGroup(0) end,hideF=_hideF_ready},
WIDGET.newButton{x=190,y=25,w=30,color='lR',fText="",code=function() NET.player_joinGroup(1) end,hideF=_hideF_ready},
WIDGET.newButton{x=230,y=25,w=30,color='lG',fText="",code=function() NET.player_joinGroup(2) end,hideF=_hideF_ready},
WIDGET.newButton{x=270,y=25,w=30,color='lB',fText="",code=function() NET.player_joinGroup(3) end,hideF=_hideF_ready},
WIDGET.newButton{x=190,y=65,w=30,color='lY',fText="",code=function() NET.player_joinGroup(4) end,hideF=_hideF_ready},
WIDGET.newButton{x=230,y=65,w=30,color='lM',fText="",code=function() NET.player_joinGroup(5) end,hideF=_hideF_ready},
WIDGET.newButton{x=270,y=65,w=30,color='lC',fText="",code=function() NET.player_joinGroup(6) end,hideF=_hideF_ready},
WIDGET.newKey{name='chat', x=390,y=45,w=60,fText="···", code=_switchChat}, WIDGET.newKey{name='chat', x=390,y=45,w=60,fText="···", code=_switchChat},
WIDGET.newKey{name='quit', x=890,y=45,w=60,font=30,fText=CHAR.icon.cross_thick,code=_quit}, WIDGET.newKey{name='quit', x=890,y=45,w=60,font=30,fText=CHAR.icon.cross_thick,code=_quit},
} }

View File

@@ -2,7 +2,7 @@ local gc=love.graphics
local scene={} local scene={}
function scene.sceneInit() function scene.enter()
BG.set('league') BG.set('league')
BGM.play('exploration') BGM.play('exploration')
end end

View File

@@ -1,9 +1,9 @@
local scene={} local scene={}
function scene.sceneInit() function scene.enter()
BG.set() BG.set()
end end
function scene.sceneBack() function scene.leave()
NET.ws_close() NET.ws_close()
TASK.removeTask_code(NET.ws_update) TASK.removeTask_code(NET.ws_update)
end end

View File

@@ -50,11 +50,11 @@ local function _createRoom()
end end
end end
function scene.sceneInit() function scene.enter()
sure=0 sure=0
destroyPlayers() destroyPlayers()
end end
function scene.sceneBack() function scene.leave()
BGM.play() BGM.play()
end end

View File

@@ -71,7 +71,7 @@ local function _fetchRoom()
end end
local scene={} local scene={}
function scene.sceneInit() function scene.enter()
BG.set() BG.set()
_fetchRoom() _fetchRoom()
end end

View File

@@ -1,8 +1,6 @@
local gc=love.graphics
local sin,log=math.sin,math.log10
local GAME,SCR=GAME,SCR local GAME,SCR=GAME,SCR
local setFont,mStr=FONT.set,GC.mStr local sin,log=math.sin,math.log10
local GC=GC
local scene={} local scene={}
@@ -17,7 +15,7 @@ local rank-- Current rank
local trophy-- Current trophy local trophy-- Current trophy
local trophyColor-- Current trophy color local trophyColor-- Current trophy color
function scene.sceneInit() function scene.enter()
page=0 page=0
if SCN.prev:find("setting") then if SCN.prev:find("setting") then
TEXT.show(text.needRestart,640,410,50,'fly',.6) TEXT.show(text.needRestart,640,410,50,'fly',.6)
@@ -116,7 +114,7 @@ function scene.sceneInit()
GAME.prevBG=false GAME.prevBG=false
end end
end end
function scene.sceneBack() function scene.leave()
trySave() trySave()
end end
@@ -181,7 +179,7 @@ local hexList={1,0,.5,1.732*.5,-.5,1.732*.5}
for i=1,6 do hexList[i]=hexList[i]*150 end for i=1,6 do hexList[i]=hexList[i]*150 end
local textPos={90,131,-90,131,-200,-25,-90,-181,90,-181,200,-25} local textPos={90,131,-90,131,-200,-25,-90,-181,90,-181,200,-25}
local dataPos={90,143,-90,143,-200,-13,-90,-169,90,-169,200,-13} local dataPos={90,143,-90,143,-200,-13,-90,-169,90,-169,200,-13}
local tasText=gc.newText(getFont(100),"TAS") local tasText=GC.newText(getFont(100),"TAS")
function scene.draw() function scene.draw()
if timer1<1 or GAME.result then if timer1<1 or GAME.result then
SCN.scenes.game.draw() SCN.scenes.game.draw()
@@ -190,157 +188,157 @@ function scene.draw()
-- Dark BG -- Dark BG
local _=timer1 local _=timer1
if GAME.result then _=_*.76 end if GAME.result then _=_*.76 end
gc.setColor(.12,.12,.12,_) GC.setColor(.12,.12,.12,_)
gc.replaceTransform(SCR.origin) GC.replaceTransform(SCR.origin)
gc.rectangle('fill',0,0,SCR.w,SCR.h) GC.rectangle('fill',0,0,SCR.w,SCR.h)
gc.replaceTransform(SCR.xOy) GC.replaceTransform(SCR.xOy)
gc.setColor(.97,.97,.97,timer1) GC.setColor(.97,.97,.97,timer1)
-- Result Text -- Result Text
mDraw(GAME.result and TEXTOBJ[GAME.result] or TEXTOBJ.pause,640,70-10*(5-timer1*5)^1.5) mDraw(GAME.result and TEXTOBJ[GAME.result] or TEXTOBJ.pause,640,70-10*(5-timer1*5)^1.5)
-- Mode Info (outside) -- Mode Info (outside)
gc.draw(TEXTOBJ.modeName,745-TEXTOBJ.modeName:getWidth(),143) GC.draw(TEXTOBJ.modeName,745-TEXTOBJ.modeName:getWidth(),143)
-- Level rank -- Level rank
if RANK_CHARS[GAME.rank] then if RANK_CHARS[GAME.rank] then
gc.push('transform') GC.push('transform')
gc.translate(1050,5) GC.translate(1050,5)
setFont(80) FONT.set(80)
gc.setColor(0,0,0,timer1*.7) GC.setColor(0,0,0,timer1*.7)
gc.print(RANK_CHARS[GAME.rank],-5,-4,nil,1.5) GC.print(RANK_CHARS[GAME.rank],-5,-4,nil,1.5)
local L=RANK_COLORS[GAME.rank] local L=RANK_COLORS[GAME.rank]
gc.setColor(L[1],L[2],L[3],timer1) GC.setColor(L[1],L[2],L[3],timer1)
gc.print(RANK_CHARS[GAME.rank],0,0,nil,1.5) GC.print(RANK_CHARS[GAME.rank],0,0,nil,1.5)
gc.pop() GC.pop()
end end
if GAME.tasUsed then if GAME.tasUsed then
gc.setColor(.97,.97,.97,timer1*.08) GC.setColor(.97,.97,.97,timer1*.08)
mDraw(tasText,870,395,.3,2.6) mDraw(tasText,870,395,.3,2.6)
end end
-- Big info frame -- Big info frame
if PLAYERS[1].frameRun>=180 then if PLAYERS[1].frameRun>=180 then
gc.push('transform') GC.push('transform')
gc.translate(560,205) GC.translate(560,205)
gc.setLineWidth(2) GC.setLineWidth(2)
-- Pause Info (outside) -- Pause Info (outside)
setFont(25) FONT.set(25)
if GAME.pauseCount>0 then if GAME.pauseCount>0 then
gc.setColor(.97,.97,.97,timer1*.06) GC.setColor(.97,.97,.97,timer1*.06)
gc.rectangle('fill',-5,390,620,36,8) GC.rectangle('fill',-5,390,620,36,8)
gc.setColor(.97,.97,.97,timer1) GC.setColor(.97,.97,.97,timer1)
gc.rectangle('line',-5,390,620,36,8) GC.rectangle('line',-5,390,620,36,8)
mStr(("%s:[%d] %.2fs"):format(text.pauseCount,GAME.pauseCount,GAME.pauseTime),305,389) GC.mStr(("%s:[%d] %.2fs"):format(text.pauseCount,GAME.pauseCount,GAME.pauseTime),305,389)
end end
-- Pages -- Pages
if page==0 then if page==0 then
-- Frame -- Frame
gc.setColor(.97,.97,.97,timer2*.06) GC.setColor(.97,.97,.97,timer2*.06)
gc.rectangle('fill',-5,-5,620,380,8) GC.rectangle('fill',-5,-5,620,380,8)
gc.setColor(.97,.97,.97,timer2) GC.setColor(.97,.97,.97,timer2)
gc.rectangle('line',-5,-5,620,380,8) GC.rectangle('line',-5,-5,620,380,8)
-- Game statistics -- Game statistics
gc.push('transform') GC.push('transform')
gc.scale(.85) GC.scale(.85)
gc.setLineWidth(2) GC.setLineWidth(2)
-- Stats -- Stats
_=form _=form
setFont(30) FONT.set(30)
gc.setColor(.97,.97,.97,timer2) GC.setColor(.97,.97,.97,timer2)
for i=1,10 do for i=1,10 do
gc.print(text.pauseStat[i],5,43*(i-1)+2) GC.print(text.pauseStat[i],5,43*(i-1)+2)
gc.printf(_[i],210,43*(i-1)+2,500,'right') GC.printf(_[i],210,43*(i-1)+2,500,'right')
end end
-- Finesse rank & trophy -- Finesse rank & trophy
if rank then if rank then
setFont(40) FONT.set(40)
gc.setColor(.7,.7,.7,timer2) GC.setColor(.7,.7,.7,timer2)
gc.print(rank,405,383) GC.print(rank,405,383)
if trophy then if trophy then
setFont(30) FONT.set(30)
gc.setColor(trophyColor[1],trophyColor[2],trophyColor[3],timer2*2-1) GC.setColor(trophyColor[1],trophyColor[2],trophyColor[3],timer2*2-1)
gc.printf(trophy,95-120*(1-timer2^.5),390,300,'right') GC.printf(trophy,95-120*(1-timer2^.5),390,300,'right')
end end
end end
gc.pop() GC.pop()
elseif page==1 then elseif page==1 then
-- Radar Chart -- Radar Chart
gc.setLineWidth(1) GC.setLineWidth(1)
gc.push('transform') GC.push('transform')
gc.translate(310,185) GC.translate(310,185)
-- Polygon -- Polygon
gc.push('transform') GC.push('transform')
gc.scale((3-2*timer2)*timer2) GC.scale((3-2*timer2)*timer2)
gc.setColor(.97,.97,.97,timer2*(.5+.3*sin(TIME()*6.26))) GC.setColor(.97,.97,.97,timer2*(.5+.3*sin(TIME()*6.26)))
GC.regRoundPolygon('line',0,0,120,6,8) GC.regRoundPolygon('line',0,0,120,6,8)
gc.setColor(chartColor[1],chartColor[2],chartColor[3],timer2*.626) GC.setColor(chartColor[1],chartColor[2],chartColor[3],timer2*.626)
for i=1,9,2 do for i=1,9,2 do
gc.polygon('fill',0,0,val[i],val[i+1],val[i+2],val[i+3]) GC.polygon('fill',0,0,val[i],val[i+1],val[i+2],val[i+3])
end end
gc.polygon('fill',0,0,val[11],val[12],val[1],val[2]) GC.polygon('fill',0,0,val[11],val[12],val[1],val[2])
gc.setColor(.97,.97,.97,timer2) GC.setColor(.97,.97,.97,timer2)
for i=1,9,2 do for i=1,9,2 do
gc.line(val[i],val[i+1],val[i+2],val[i+3]) GC.line(val[i],val[i+1],val[i+2],val[i+3])
end end
gc.line(val[11],val[12],val[1],val[2]) GC.line(val[11],val[12],val[1],val[2])
gc.pop() GC.pop()
-- Texts -- Texts
local C local C
_=TIME()%6.2832 _=TIME()%6.2832
if _>3.142 then if _>3.142 then
gc.setColor(.97,.97,.97,-timer2*sin(_)) GC.setColor(.97,.97,.97,-timer2*sin(_))
setFont(35) FONT.set(35)
C,_=text.radar,textPos C,_=text.radar,textPos
else else
gc.setColor(.97,.97,.97,timer2*sin(_)) GC.setColor(.97,.97,.97,timer2*sin(_))
setFont(20) FONT.set(20)
C,_=radar,dataPos C,_=radar,dataPos
end end
for i=1,6 do for i=1,6 do
mStr(C[i],_[2*i-1],_[2*i]) GC.mStr(C[i],_[2*i-1],_[2*i])
end end
gc.pop() GC.pop()
end end
gc.pop() GC.pop()
end end
-- Mods -- Mods
gc.push('transform') GC.push('transform')
gc.translate(131,600) GC.translate(131,600)
gc.scale(.65) GC.scale(.65)
if #GAME.mod>0 then if #GAME.mod>0 then
gc.setLineWidth(2) GC.setLineWidth(2)
if scoreValid() then if scoreValid() then
gc.setColor(.7,.7,.7,timer1) GC.setColor(.7,.7,.7,timer1)
gc.rectangle('line',-5,-5,500,150,8) GC.rectangle('line',-5,-5,500,150,8)
gc.setColor(.7,.7,.7,timer1*.05) GC.setColor(.7,.7,.7,timer1*.05)
gc.rectangle('fill',-5,-5,500,150,8) GC.rectangle('fill',-5,-5,500,150,8)
else else
gc.setColor(.8,0,0,timer1) GC.setColor(.8,0,0,timer1)
gc.rectangle('line',-5,-5,500,150,8) GC.rectangle('line',-5,-5,500,150,8)
gc.setColor(1,0,0,timer1*.05) GC.setColor(1,0,0,timer1*.05)
gc.rectangle('fill',-5,-5,500,150,8) GC.rectangle('fill',-5,-5,500,150,8)
end end
setFont(35) FONT.set(35)
for _,M in next,MODOPT do for _,M in next,MODOPT do
if M.sel>0 then if M.sel>0 then
_=M.color _=M.color
gc.setColor(_[1],_[2],_[3],timer1) GC.setColor(_[1],_[2],_[3],timer1)
mStr(M.id,35+M.no%8*60,math.floor(M.no/8)*45) GC.mStr(M.id,35+M.no%8*60,math.floor(M.no/8)*45)
end end
end end
end end
gc.pop() GC.pop()
end end
scene.widgetList={ scene.widgetList={

View File

@@ -1,19 +1,19 @@
local scene={} local scene={}
function scene.sceneInit() function scene.enter()
if SYSTEM~="iOS" then if SYSTEM=="iOS" then
MES.update(1e99)
Z.setPowerInfo(false)
Z.setClickFX(false)
VERSION.string=""
MES.new('error',"Please swipe up or press Home button to quit Techmino on iOS",1e99)
else
if math.random()>.0000626 then if math.random()>.0000626 then
love.timer.sleep(.26) love.timer.sleep(.26)
love.event.quit() love.event.quit()
else else
error("So lucky! 0.00626% to get this!! You can quit the game now.") error("So lucky! 0.00626% to get this!! You can quit the game now.")
end end
else
MES.update(1e99)
Z.setPowerInfo(false)
Z.setClickFX(false)
VERSION.string=""
MES.new('error',"Please swipe up or press Home button to quit Techmino on iOS",1e99)
end end
end end

View File

@@ -68,7 +68,7 @@ local function _updateButtonVisibility()
scene.widgetList[i].hide=hide scene.widgetList[i].hide=hide
end end
end end
function scene.sceneInit() function scene.enter()
BG.set() BG.set()
listBox:setList(REPLAY) listBox:setList(REPLAY)
_updateButtonVisibility() _updateButtonVisibility()

View File

@@ -14,6 +14,17 @@ local function _setPW()
NET.setPW(code,password) NET.setPW(code,password)
end end
end end
local function _paste()
local t=love.system.getClipboardText()
if t then
t=STRING.trim(t)
if #t==8 and t:match("[0-9]+") then
scene.widgetList.code:setText(t)
return
end
end
MES.new('warn',text.wrongCode)
end
function scene.enter() function scene.enter()
if SCN.args[1] then if SCN.args[1] then
@@ -29,6 +40,8 @@ function scene.keyDown(key,rep)
else else
_setPW() _setPW()
end end
elseif key=='v' and love.keyboard.isDown('lctrl','rctrl') then
_paste()
else else
return true return true
end end
@@ -37,11 +50,13 @@ end
scene.widgetList={ scene.widgetList={
WIDGET.newText{name='title', x=80, y=50,font=70,align='L'}, WIDGET.newText{name='title', x=80, y=50,font=70,align='L'},
WIDGET.newInputBox{name='code', x=380, y=170,w=626,h=60,regex="[0-9a-zA-Z]",limit=8},
WIDGET.newKey{name='send', x=640, y=300,w=300,h=80,font=40,code=function() NET.getCode(USER.email) end}, WIDGET.newKey{name='send', x=640, y=300,w=300,h=80,font=40,code=function() NET.getCode(USER.email) end},
WIDGET.newInputBox{name='code', x=380, y=170,w=626,h=60,limit=8},
WIDGET.newInputBox{name='password', x=380, y=370,w=626,h=60,secret=true,regex="[ -~]",limit=64}, WIDGET.newInputBox{name='password', x=380, y=370,w=626,h=60,secret=true,regex="[ -~]",limit=64},
WIDGET.newInputBox{name='password2',x=380, y=470,w=626,h=60,secret=true,regex="[ -~]",limit=64}, WIDGET.newInputBox{name='password2',x=380, y=470,w=626,h=60,secret=true,regex="[ -~]",limit=64},
WIDGET.newKey{name='setPW', x=640, y=600,w=350,h=80,font=40,code=_setPW}, WIDGET.newKey{name='setPW', x=640, y=600,w=350,h=80,font=40,code=_setPW},
WIDGET.newKey{name='paste', x=850, y=300,w=80,font=40,fText=CHAR.icon.import,code=_paste},
WIDGET.newButton{name='back', x=1140,y=640,w=170,h=80,sound='back',font=60,fText=CHAR.icon.back,code=pressKey'escape'}, WIDGET.newButton{name='back', x=1140,y=640,w=170,h=80,sound='back',font=60,fText=CHAR.icon.back,code=pressKey'escape'},
} }

View File

@@ -5,7 +5,7 @@ local scene={}
local das,arr local das,arr
local pos,dir,wait local pos,dir,wait
function scene.sceneInit() function scene.enter()
das,arr=SETTING.das,SETTING.arr das,arr=SETTING.das,SETTING.arr
pos,dir,wait=0,1,30 pos,dir,wait=0,1,30
BG.set('bg1') BG.set('bg1')

View File

@@ -2,10 +2,10 @@ local gc=love.graphics
local scene={} local scene={}
function scene.sceneInit() function scene.enter()
BG.set() BG.set()
end end
function scene.sceneBack() function scene.leave()
saveSettings() saveSettings()
end end

View File

@@ -98,12 +98,12 @@ local function _freshKeyList()
end end
end end
function scene.sceneInit() function scene.enter()
selected=false selected=false
_freshKeyList() _freshKeyList()
BG.set('none') BG.set('none')
end end
function scene.sceneBack() function scene.leave()
saveFile(KEY_MAP,'conf/key') saveFile(KEY_MAP,'conf/key')
end end

View File

@@ -11,7 +11,7 @@ local playEgg=WIDGET.newButton{name='playEgg', x=1140,y=540,w=140,h=65,color='l
local scene={} local scene={}
function scene.sceneInit() function scene.enter()
selEggMode=false selEggMode=false
scene.widgetList.playEgg.hide=true scene.widgetList.playEgg.hide=true
BG.set() BG.set()

View File

@@ -8,7 +8,7 @@ local last1,last2-- Last touch/sound time
local sfxPack=SETTING.sfxPack local sfxPack=SETTING.sfxPack
local vocPack=SETTING.vocPack local vocPack=SETTING.vocPack
function scene.sceneInit() function scene.enter()
last1,last2=0,0 last1,last2=0,0
sfxPack=SETTING.sfxPack sfxPack=SETTING.sfxPack
vocPack=SETTING.vocPack vocPack=SETTING.vocPack
@@ -16,7 +16,7 @@ function scene.sceneInit()
scene.widgetList.vocPack:reset() scene.widgetList.vocPack:reset()
BG.set() BG.set()
end end
function scene.sceneBack() function scene.leave()
saveSettings() saveSettings()
end end
@@ -74,9 +74,6 @@ function scene.draw()
elseif vocPack=="miku" then elseif vocPack=="miku" then
gc.translate(700,320+12*sin(TIME()*.5)) gc.translate(700,320+12*sin(TIME()*.5))
gc.draw(IMG.mikuCH,nil,nil,nil,.8) gc.draw(IMG.mikuCH,nil,nil,nil,.8)
elseif vocPack=="rin" then
gc.translate(820,280+12*sin(TIME()*.5))
gc.draw(IMG.rinCH,nil,nil,nil,.8)
end end
gc.pop() gc.pop()
end end

View File

@@ -31,12 +31,12 @@ local function _load2()
end end
end end
function scene.sceneInit() function scene.enter()
BG.set('rainbow') BG.set('rainbow')
defaultSetSelect=1 defaultSetSelect=1
selected=false selected=false
end end
function scene.sceneBack() function scene.leave()
saveFile(VK_ORG,'conf/virtualkey') saveFile(VK_ORG,'conf/virtualkey')
end end

View File

@@ -1,6 +1,6 @@
local scene={} local scene={}
function scene.sceneInit() function scene.enter()
BG.set('matrix') BG.set('matrix')
end end

View File

@@ -2,7 +2,7 @@ local gc=love.graphics
local scene={} local scene={}
function scene.sceneBack() function scene.leave()
saveSettings() saveSettings()
end end

View File

@@ -1,4 +1,3 @@
local gc=love.graphics
local kb,tc=love.keyboard,love.touch local kb,tc=love.keyboard,love.touch
local rnd=math.random local rnd=math.random
local ins,rem=table.insert,table.remove local ins,rem=table.insert,table.remove
@@ -10,7 +9,7 @@ local patron=require"parts.patron"
local names local names
local counter local counter
function scene.sceneInit() function scene.enter()
time=0 time=0
v=22.6 v=22.6
BG.set() BG.set()
@@ -50,7 +49,7 @@ function scene.update(dt)
counter=counter-1 counter=counter-1
if counter==0 then if counter==0 then
local N=patron[rnd(#patron)] local N=patron[rnd(#patron)]
local T=gc.newText(getFont(N.font),N.name) local T=GC.newText(getFont(N.font),N.name)
local r=rnd()<.5 local r=rnd()<.5
ins(names,{ ins(names,{
text=T, text=T,
@@ -71,26 +70,26 @@ function scene.update(dt)
end end
function scene.draw() function scene.draw()
gc.replaceTransform(SCR.origin) GC.replaceTransform(SCR.origin)
gc.setColor(1,1,1,.3) GC.setColor(1,1,1,.3)
for i=1,#names do for i=1,#names do
local N=names[i] local N=names[i]
gc.draw(N.text,N.x,N.y) GC.draw(N.text,N.x,N.y)
end end
gc.replaceTransform(SCR.xOy) GC.replaceTransform(SCR.xOy)
local T=40*math.min(time,185) local T=40*math.min(time,185)
gc.setColor(.97,.97,.97,185-math.min(time,185)) GC.setColor(.97,.97,.97,185-math.min(time,185))
local L=text.staff local L=text.staff
setFont(40) setFont(40)
for i=1,#L do for i=1,#L do
GC.mStr(L[i],640,950+65*i-T) GC.mStr(L[i],640,950+65*i-T)
end end
gc.setColor(1,1,1) GC.setColor(1,1,1)
mDraw(TEXTURE.title_color,640,900-T,nil,.6) mDraw(TEXTURE.title_color,640,900-T,nil,.6)
mDraw(TEXTURE.title,640,7770-T,nil,.6) mDraw(TEXTURE.title,640,7770-T,nil,.6)
if time>190 then if time>190 then
gc.print("CLICK ME →",50,550,-.5) GC.print("CLICK ME →",50,550,-.5)
end end
end end

View File

@@ -3,7 +3,7 @@ local scene={}
local form-- Form of clear & spins local form-- Form of clear & spins
local item-- Detail datas local item-- Detail datas
function scene.sceneInit() function scene.enter()
BG.set() BG.set()
local S=STAT local S=STAT
local X1,X2,Y1,Y2={0,0,0,0},{0,0,0,0},{},{} local X1,X2,Y1,Y2={0,0,0,0},{0,0,0,0},{},{}

View File

@@ -9,7 +9,7 @@ local function _push(mes)
timer=1 timer=1
end end
function scene.sceneInit() function scene.enter()
backCounter=5 backCounter=5
list={} list={}
timer=0 timer=0

View File

@@ -2,6 +2,24 @@ return[=[
未来计划: 未来计划:
正在点亮科技树... 正在点亮科技树...
0.17.9: 暂停 Break
修复:
第一次启动选择语言后直接就退出了
攻击竞速模式左侧攻击数字从%.1f改为%d #780
SRS+旋转系统I的踢墙表不对称之前就是SRS的压根没改 #772
两个堆叠模式消除垃圾行的时候没减少内部的垃圾行高计数
require模块在mac系统下可能崩溃 #788
没登录的时候回合制必定崩溃
0.17.8: 暂停 Break
新增:
联网游戏房间菜单添加选队伍按钮键盘可以用ctrl+数字切换
粘贴验证码按钮
修复:
联网游戏死亡前打出攻击会导致其他人不同步
联网游戏聊天框看不全
其他玩家进房check是否已存在的时候因为访问不存在的玩家而报错
0.17.7: 暂停 Break 0.17.7: 暂停 Break
新增: 新增:
联网能玩了 联网能玩了

View File

@@ -1,7 +1,7 @@
return { return {
["apkCode"]=451, ["apkCode"]=453,
["code"]=1707, ["code"]=1709,
["string"]="V0.17.7", ["string"]="V0.17.9",
["room"]="ver A-7", ["room"]="ver A-9",
["name"]="暂停 Break", ["name"]="暂停 Break",
} }