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

391
main.lua
View File

@@ -60,7 +60,7 @@ BGM.setMaxSources(5)
VOC.setDiversion(.62)
WIDGET.setOnChange(function()
if SCN.cur~='custom_field' then
if SCN.cur~='net_game' and SCN.cur~='custom_field' then
local colorList=THEME.getThemeColor()
if colorList then
for _,W in next,SCN.scenes[SCN.cur].widgetList do
@@ -72,8 +72,6 @@ WIDGET.setOnChange(function()
end
end)
table.insert(_LOADTIMELIST_,("Load Zframework: %.3fs"):format(TIME()-_LOADTIME_))
-- Create shortcuts
setFont=FONT.set
getFont=FONT.get
@@ -98,10 +96,6 @@ for _,v in next,{'conf','record','replay','cache','lib'} do
end
end
CHAR=require'parts.char'
require'parts.gameTables'
require'parts.gameFuncs'
-- Load shader files from SOURCE ONLY
SHADER={}
for _,v in next,fs.getDirectoryItems('parts/shaders') do
@@ -111,6 +105,11 @@ for _,v in next,fs.getDirectoryItems('parts/shaders') do
end
end
-- Load modules
CHAR=require'parts.char'
require'parts.gameTables'
require'parts.gameFuncs'
THEME= require'parts.theme'
LINE= require'parts.line'
DATA= require'parts.data'
@@ -121,7 +120,7 @@ USERS= require'parts.users'
NET= require'parts.net'
VK= require'parts.virtualKey'
BOT= require'parts.bot'
RSlist= require'parts.RSlist'DSCP=RSlist.TRS.centerPos
RSlist= require'parts.RSlist'; DSCP=RSlist.TRS.centerPos
PLY= require'parts.player'
NETPLY= require'parts.netPlayer'
MODES= require'parts.modes'
@@ -132,9 +131,28 @@ setmetatable(TEXTURE,{__index=function(self,k)
return self[k]
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
local normImg=GC.DO{16,16,
{'fCirc',8,8,4},
@@ -239,45 +257,6 @@ Z.setOnQuit(function()
destroyPlayers()
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
IMG.init{
lock='media/image/mess/lock.png',
@@ -299,7 +278,6 @@ IMG.init{
xiaoyaCH='media/image/characters/xiaoya.png',
xiaoyaOmino='media/image/characters/xiaoya_Omino.png',
mikuCH='media/image/characters/miku.png',
rinCH='media/image/characters/rin.png',
z={
character='media/image/characters/z_character.png',
screen1='media/image/characters/z_screen1.png',
@@ -386,6 +364,137 @@ VOC.init{
'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
LANG.init('zh',
{
@@ -421,8 +530,6 @@ LANG.init('zh',
end)()
)
table.insert(_LOADTIMELIST_,("Initialize Parts: %.3fs"):format(TIME()-_LOADTIME_))
-- Load background files from SOURCE ONLY
for _,v in next,fs.getDirectoryItems('parts/backgrounds') do
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
BG.remList('none')BG.remList('gray')BG.remList('custom')
-- Load scene files from SOURCE ONLY
for _,v in next,fs.getDirectoryItems('parts/scenes') do
if FILE.isSafe('parts/scenes/'..v) then
@@ -439,179 +547,9 @@ for _,v in next,fs.getDirectoryItems('parts/scenes') do
LANG.addScene(sceneName)
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_))
-- 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
FIRSTLAUNCH=STAT.run==0
if FIRSTLAUNCH and MOBILE then
@@ -669,7 +607,11 @@ for _,fileName in next,fs.getDirectoryItems('replay') do
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
@@ -706,6 +648,3 @@ if TABLE.find(arg,'-- test') then
love.event.quit(1)
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
noKickSet,-- O
{
[01]={'+0+0','-2+0','+1+0','-2-1','+1+2'},
[10]={'+0+0','+2+0','-1+0','+2+1','-1-2'},
[01]={'+0+0','+1+0','-2+0','+1+2','-2-1'},
[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'},
[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','-2+0','+1+0','-2-1','+1+2'},
[30]={'+0+0','+1+0','-2+0','+1-2','-2+1'},
[03]={'+0+0','-1+0','+2+0','-1+2','+2-1'},
[32]={'+0+0','+1+0','-2+0','+1+2','-2-1'},
[23]={'+0+0','-1+0','+2+0','-1-2','+2+1'},
[02]={'+0+0','-1+0','+1+0','+0-1','+0+1'},
[20]={'+0+0','+1+0','-1+0','+0+1','+0-1'},
[13]={'+0+0','+0-1','-1+0','+1+0','+0+1'},

View File

@@ -1,7 +1,7 @@
return {
mesDisp=function(P)
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)
mText(TEXTOBJ.atk,63,243)
mText(TEXTOBJ.eff,63,363)

View File

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

View File

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

View File

@@ -51,7 +51,7 @@ do-- function tryDelete()
end
end
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)
local text=text or t
if not args then args='' end

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

@@ -131,7 +131,6 @@ return {
-- invalidCode="Invalid code",
-- invalidEmail="Invalid email",
-- playerNotFound="Player not found",
-- noPassword="No password",
-- invalidEmailPass="Invalid email or password",
-- emailExists="Email exists",
-- emailSendError="Email send error",
@@ -177,13 +176,12 @@ return {
-- started="Playing",
joinRoom="$1 a rejoint le salon.",
leaveRoom="$1 a quitté le salon.",
-- roomRemoved="Room was removed",
-- ready="READY",
-- connStream="CONNECTING",
-- waitStream="WAITING",
-- spectating="Spectating",
-- keySettingInstruction="Press to bind key\nescape: cancel\nbackspace: delete",
-- customBGhelp="Drop image file here to apply custom background",
-- customBGloadFailed="Unsupport image format for custom background",

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -40,7 +40,7 @@ return {
end end
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,
getRank=function(P)
local R=P.modeData.place

View File

@@ -40,7 +40,7 @@ return {
end end
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,
getRank=function(P)
local R=P.modeData.place

View File

@@ -40,7 +40,7 @@ return {
end end
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,
getRank=function(P)
local R=P.modeData.place

View File

@@ -40,7 +40,7 @@ return {
end end
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,
getRank=function(P)
local R=P.modeData.place

View File

@@ -40,7 +40,7 @@ return {
end end
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,
getRank=function(P)
local R=P.modeData.place

View File

@@ -40,7 +40,7 @@ return {
end end
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,
getRank=function(P)
local R=P.modeData.place

View File

@@ -474,7 +474,7 @@ end
-- Room
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)
elseif #msg>0 then
wsSend(1300,{
@@ -590,7 +590,7 @@ function NET.wsCallBack.room_chat(body)
TASK.unlock('receiveMessage')
TASK.lock('receiveMessage',1)
NET.textBox:push{
COLOR.Z,_getFullName(body.data.playerId),
COLOR.Z,_getFullName(body.data.playerId).." ",
COLOR.N,body.data.message,
}
end
@@ -650,7 +650,7 @@ function NET.wsCallBack.room_enter(body)
end
else
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{
uid=p.playerId,
group=p.group,
@@ -704,7 +704,6 @@ function NET.wsCallBack.player_finish(body)
if P.uid==body.data.playerId then
NETPLY.setPlace(P.uid,#PLY_ALIVE)
P.loseTimer=26
P:lose(true)
break
end
end

View File

@@ -138,6 +138,9 @@ function NETPLY.remove(uid)
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.setStat(uid,S)

View File

@@ -445,7 +445,13 @@ function PLY.newPlayer(id,mini,p)
local pData={
uid=USER.uid,
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.sid=NET.uid_sid[pData.uid] or pData.uid
P.group=pData.group

View File

@@ -2707,7 +2707,12 @@ function Player:update(dt)
end
if frameDelta then
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<50 and 2 or
frameDelta<80 and 3 or

View File

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

View File

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

View File

@@ -14,7 +14,7 @@ local slide,pathVis,revKB
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}
function scene.sceneInit()
function scene.enter()
BG.set('rainbow2')
BGM.play('push')
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
function scene.sceneInit()
function scene.enter()
BG.set('cubes')
BGM.play('truth')
board={}

View File

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

View File

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

View File

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

View File

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

View File

@@ -6,7 +6,7 @@ local state,timer,score,combo
local x,y,vx,vy,ex,ey
local scene={}
function scene.sceneInit()
function scene.enter()
pow,ang=0,0
state=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()
TASK.new(function()
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 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 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 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 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 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)
outputBox.hide=true TEST.yieldN(26)
FILE.clear_s('')love.event.quit()
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 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 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 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 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)
outputBox.hide=true
TEST.yieldN(26)
FILE.clear_s('')
love.event.quit()
end)
end}
button:setObject("Techmino is fun. Bye.")
@@ -1000,7 +1002,7 @@ local fleg={
pw=the_secret,
supw=7126,
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)
if k~=first_key then
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)
BG.set('none')
end

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -24,12 +24,12 @@ local sList={
local scene={}
function scene.sceneInit()
function scene.enter()
destroyPlayers()
BG.set(CUSTOMENV.bg)
BGM.play(CUSTOMENV.bgm)
end
function scene.sceneBack()
function scene.leave()
saveFile(CUSTOMENV,'conf/customEnv')
BGM.play()
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')},
-- Special rules
WIDGET.newSwitch{name='ospin', x=850, y=830, 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='b2bKill', x=850, y=950, 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='easyFresh', x=1170,y=830, 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='bone', x=1170,y=950, lim=250,disp=CUSval('bone'), code=CUSrev('bone')},
WIDGET.newSwitch{name='ospin', x=850, y=850, lim=210,disp=CUSval('ospin'), code=CUSrev('ospin')},
WIDGET.newSwitch{name='fineKill', x=850, y=910, lim=210,disp=CUSval('fineKill'), code=CUSrev('fineKill')},
WIDGET.newSwitch{name='b2bKill', x=850, y=970, lim=210,disp=CUSval('b2bKill'), code=CUSrev('b2bKill')},
WIDGET.newSwitch{name='lockout', x=850, y=1030,lim=210,disp=CUSval('lockout'), code=CUSrev('lockout')},
WIDGET.newSwitch{name='easyFresh', x=1170,y=850, lim=250,disp=CUSval('easyFresh'),code=CUSrev('easyFresh')},
WIDGET.newSwitch{name='deepDrop', x=1170,y=910, lim=250,disp=CUSval('deepDrop'), code=CUSrev('deepDrop')},
WIDGET.newSwitch{name='bone', x=1170,y=970, lim=250,disp=CUSval('bone'), code=CUSrev('bone')},
-- 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},
@@ -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},
-- 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='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='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=1100,w=250,color='Y',list=BGM.getList(),disp=CUSval('bgm'),code=function(i) CUSTOMENV.bgm=i BGM.play(i) end},
}
return scene

View File

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

View File

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

View File

@@ -1,18 +1,18 @@
local gc,sys=love.graphics,love.system
local sys=love.system
local kb=love.keyboard
local sin=math.sin
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 cur-- Cursor position
function scene.sceneInit()
function scene.enter()
cur=#BAG
end
function scene.sceneBack()
function scene.leave()
saveFile(DATA.copySequence(),'conf/customSequence')
end
@@ -112,12 +112,12 @@ function scene.keyDown(key)
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()
-- Draw frame
gc_setColor(COLOR.Z)
gc.setLineWidth(2)
gc.rectangle('line',100,110,1080,260,5)
GC.setLineWidth(2)
GC.rectangle('line',100,110,1080,260,5)
-- Draw sequence
local BLOCK_COLORS=BLOCK_COLORS
@@ -166,7 +166,7 @@ function scene.draw()
-- Draw cursor
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
scene.widgetList={

View File

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

View File

@@ -75,7 +75,7 @@ local function _search()
lastSearch=input
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'))
_scanDict(dict)

View File

@@ -4,7 +4,7 @@ local errorShot,errorInfo
local scene={}
function scene.sceneInit()
function scene.enter()
BGcolor=math.random()>.026 and {.3,.5,.9} or {.62,.3,.926}
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."
@@ -34,7 +34,7 @@ end
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='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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -9,7 +9,6 @@ local function _getCode()
NET.getCode(email)
end
end
local function _codeLogin()
local code=scene.widgetList.code:getText():upper()
if #code~=8 then
@@ -18,8 +17,19 @@ local function _codeLogin()
NET.codeLogin(USER.email,code)
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.code:clear()
end
@@ -33,6 +43,8 @@ function scene.keyDown(key,rep)
else
_codeLogin()
end
elseif key=='v' and love.keyboard.isDown('lctrl','rctrl') then
_paste()
else
return true
end
@@ -45,8 +57,9 @@ scene.widgetList={
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.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='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'},
}

View File

@@ -15,7 +15,7 @@ end
local scene={}
function scene.sceneInit()
function scene.enter()
showEmail=false
emailBox.secret=true
emailBox:setText(USER.email)
@@ -23,8 +23,12 @@ function scene.sceneInit()
end
function scene.keyDown(key,rep)
if key~='return' or rep then return true end
_login()
if rep then return true end
if key=='return' then
_login()
else
return true
end
end
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()
end
end)
function scene.sceneInit()
function scene.enter()
if THEME.cur=='halloween' then
TASK.new(function()
TEST.yieldT(.26)

View File

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

View File

@@ -1,6 +1,6 @@
local scene={}
function scene.sceneInit()
function scene.enter()
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')
if fileData then

View File

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

View File

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

View File

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

View File

@@ -59,7 +59,7 @@ end
local scene={}
function scene.sceneInit()
function scene.enter()
noTouch=not SETTING.VKSwitch
playing=false
lastUpstreamTime=0
@@ -73,7 +73,7 @@ function scene.sceneInit()
GAME.prevBG=false
end
end
function scene.sceneBack()
function scene.leave()
TASK.unlock('netPlaying')
end
@@ -127,19 +127,42 @@ function scene.keyDown(key,isRep)
else
_quit()
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
local mes=STRING.trim(inputBox:getText())
if not inputBox.hide and #mes>0 then
if mes:sub(1,1)=='/' then
local cmd=STRING.split(mes,' ')
-- Common commands
if cmd[1]=='/kick' then
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
if tonumber(cmd[2]) then NET.player_setHost(tonumber(cmd[2])) end
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
NET.player_joinGroup(tonumber(cmd[2]))
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
NET.textBox:push{COLOR.R,'Invalid command'}
end
@@ -150,6 +173,8 @@ function scene.keyDown(key,isRep)
else
_switchChat()
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
WIDGET.focus(inputBox)
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='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.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='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={}
function scene.sceneInit()
function scene.enter()
BG.set('league')
BGM.play('exploration')
end

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,19 +1,19 @@
local scene={}
function scene.sceneInit()
if SYSTEM~="iOS" then
function scene.enter()
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
love.timer.sleep(.26)
love.event.quit()
else
error("So lucky! 0.00626% to get this!! You can quit the game now.")
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

View File

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

View File

@@ -14,6 +14,17 @@ local function _setPW()
NET.setPW(code,password)
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()
if SCN.args[1] then
@@ -29,6 +40,8 @@ function scene.keyDown(key,rep)
else
_setPW()
end
elseif key=='v' and love.keyboard.isDown('lctrl','rctrl') then
_paste()
else
return true
end
@@ -37,11 +50,13 @@ end
scene.widgetList={
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.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='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='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'},
}

View File

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

View File

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

View File

@@ -98,12 +98,12 @@ local function _freshKeyList()
end
end
function scene.sceneInit()
function scene.enter()
selected=false
_freshKeyList()
BG.set('none')
end
function scene.sceneBack()
function scene.leave()
saveFile(KEY_MAP,'conf/key')
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={}
function scene.sceneInit()
function scene.enter()
selEggMode=false
scene.widgetList.playEgg.hide=true
BG.set()

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -3,7 +3,7 @@ local scene={}
local form-- Form of clear & spins
local item-- Detail datas
function scene.sceneInit()
function scene.enter()
BG.set()
local S=STAT
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
end
function scene.sceneInit()
function scene.enter()
backCounter=5
list={}
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
新增:
联网能玩了

View File

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