Compare commits

...

43 Commits

Author SHA1 Message Date
MrZ626
937eed1ee6 0.12.5: 漏洞修复 2020-12-14 23:26:31 +08:00
MrZ626
0cd9d11d4e 修复防守模式垃圾行增速爆炸的问题 2020-12-14 23:26:31 +08:00
MrZ626
4809afe287 字典微调 2020-12-14 23:26:31 +08:00
MrZ626
681802d030 SKIN模块升级,其他多媒体模块微调 2020-12-14 23:26:31 +08:00
MrZ626
ddbe1d9c97 几个多媒体模块支持重载资源 2020-12-14 23:26:31 +08:00
MrZ626
aa3826ed8d 整理代码 2020-12-14 23:26:31 +08:00
MrZ626
c2333982fa 两个干旱和400L/1000L评级标准调整 2020-12-14 23:26:31 +08:00
MrZ626
5d963ce7ae 闪退彩蛋 2020-12-14 23:26:31 +08:00
MrZ626
8e1c53b1e7 多媒体库再完善,未初始化时调用不会报错了 2020-12-14 23:26:31 +08:00
MrZ626
5c073257b7 微调mod挡位显示 2020-12-14 23:26:31 +08:00
MrZ626
35e09b3acd 使用安全区域显示系统时间 2020-12-14 23:26:31 +08:00
MrZ626
7ed0248032 计算器添加两个影响画面的的彩蛋 2020-12-14 23:26:31 +08:00
MrZ626
c7a813e8d5 修复多媒体库更新后两个用到bgm库的地方没有跟上 2020-12-14 23:26:31 +08:00
MrZ626
b97b87bfb0 修复staff场景按esc不能返回 2020-12-14 23:26:31 +08:00
MrZ626
106a22eb27 整理代码 2020-12-14 23:26:31 +08:00
MrZ626
0439a3e73d 修复两个防守模式波数封顶后不动 2020-12-14 23:26:31 +08:00
MrZ626
3fb6cfb1be 多媒体模块全体高度封装大型升级 2020-12-14 23:26:31 +08:00
MrZ626
4eba28fa96 网格从开关改为可调透明度 2020-12-14 23:26:30 +08:00
MrZ626
0443d5baf7 微调初始音量设置 2020-12-14 23:26:30 +08:00
MrZ626
19c393a8d9 更新中文词典,新增das打断说明,微调几个词条 2020-12-14 23:26:30 +08:00
MrZ626
f63db4dd19 新增das打断设置 2020-12-14 23:26:30 +08:00
MrZ626
106b2a7a98 SYSFX模块新增newLine方法 2020-12-14 23:26:30 +08:00
MrZ626
876461e8d2 修改SYSFX.newShade用法 2020-12-14 23:26:30 +08:00
MrZ626
2f359025f2 主菜单小彩蛋 2020-12-14 23:26:30 +08:00
MrZ626
d5fd82e8d6 微调中文tips 2020-12-14 23:26:30 +08:00
MrZ626
123e453bd2 整理代码,lang模块功能特化 2020-12-14 23:26:30 +08:00
MrZ626
d4075c6fa9 修复开局提前hold+硬降会死的问题(魔幻修法) 2020-12-14 23:26:30 +08:00
MrZ626
dd1189c5ff 给录像流编码和其他游戏相关全局函数加注释 2020-12-14 23:26:30 +08:00
MrZ626
e5af9f53e6 language模块完全排除外部数据 2020-12-14 23:26:30 +08:00
MrZ626
80eb2e8371 修复从无移动和无旋转模式返回后目标场景不对 2020-12-14 23:26:30 +08:00
MrZ626
284d02d172 key缺少文本时也会像按钮一样显示内部名称 2020-12-14 23:26:30 +08:00
MrZ626
2124b24f61 虚拟按键触摸权重取值调整到0~1 2020-12-14 23:26:30 +08:00
MrZ626
fc39239be1 玩家ui场地坐标原点向下移动70单位 2020-12-14 23:26:30 +08:00
MrZ626
d018265175 提取自定义游戏加载用函数 2020-12-14 23:26:29 +08:00
MrZ626
62a039b672 播放录像时暂停不会计暂停时间 2020-12-14 23:26:29 +08:00
MrZ626
9e1df8b804 新增玩家排版函数,不再需要生成玩家同时指定坐标,添加动画位移方法;玩家task升级为同task模块 2020-12-14 23:26:29 +08:00
MrZ626
fcac817f11 Task库细节修正 2020-12-14 23:26:29 +08:00
MrZ626
7d89676df6 修复场景不存在socketRead事件时报错 2020-12-14 23:26:29 +08:00
MrZ626
96987add7b 聊天室不会按一次esc就退出 2020-12-14 23:26:29 +08:00
MrZ626
88a5e50256 由于不使用游戏内注册,所以暂时关闭注册入口 2020-12-14 23:26:29 +08:00
MrZ626
7bc3f83e7b 修复游戏中途进入设置界面返回后的背景错误 2020-12-14 23:26:29 +08:00
MrZ626
6bb6fb64d8 修复两个无尽模式无条件解锁 2020-12-14 23:26:29 +08:00
MrZ626
e7b737cba2 修复聊天室清空按钮出现时机错误 2020-12-14 23:26:29 +08:00
132 changed files with 1438 additions and 1225 deletions

View File

@@ -1,86 +1,96 @@
local min=math.min
local function fadeOut(src)
while true do
coroutine.yield()
local v=src:getVolume()-.025*SETTING.bgm
src:setVolume(v>0 and v or 0)
if v<=0 then
src:stop()
return true
end
end
end
local function fadeIn(src)
while true do
coroutine.yield()
local v=SETTING.bgm
v=min(v,src:getVolume()+.025*v)
src:setVolume(v)
if v>=SETTING.bgm then
return true
end
end
end
local function removeCurFadeOut(task,code,src)
return task.code==code and task.args[1]==src
end
local BGM={
getList={},
getCount=function()return 0 end,
play=NULL,
freshVolume=NULL,
stop=NULL,
reload=NULL,
--nowPlay=[str:playing ID]
--playing=[src:playing SRC]
}
function BGM.set(L)
BGM.list=L
BGM.len=#L
end
function BGM.loadOne(N)
N=BGM.list[N]
local file="media/BGM/"..N..".ogg"
if love.filesystem.getInfo(file)then
BGM.list[N]=love.audio.newSource(file,"stream")
BGM.list[N]:setLooping(true)
BGM.list[N]:setVolume(0)
else
LOG.print("No BGM file: "..N,5,COLOR.orange)
end
end
function BGM.loadAll()
for i=1,#BGM.list do
BGM.loadOne(i)
end
end
function BGM.play(s)
if SETTING.bgm==0 then
BGM.nowPlay=s
BGM.playing=BGM.list[s]
return
end
if s and BGM.list[s]and BGM.nowPlay~=s then
if BGM.nowPlay then TASK.new(fadeOut,BGM.playing)end
TASK.removeTask_iterate(removeCurFadeOut,fadeOut,BGM.list[s])
TASK.removeTask_code(fadeIn)
function BGM.init(list)
BGM.init=nil
local min=math.min
local Sources={}function BGM.getList()return list end
TASK.new(fadeIn,BGM.list[s])
BGM.nowPlay=s
BGM.playing=BGM.list[s]
BGM.playing:play()
end
end
function BGM.freshVolume()
if BGM.playing then
local v=SETTING.bgm
if v>0 then
BGM.playing:setVolume(v)
BGM.playing:play()
elseif BGM.nowPlay then
BGM.playing:pause()
local count=#list function BGM.getCount()return count end
local function fadeOut(src)
while true do
coroutine.yield()
local v=src:getVolume()-.025*SETTING.bgm
src:setVolume(v>0 and v or 0)
if v<=0 then
src:stop()
return true
end
end
end
end
function BGM.stop()
TASK.removeTask_code(fadeIn)
if BGM.nowPlay then TASK.new(fadeOut,BGM.playing)end
BGM.nowPlay,BGM.playing=nil
local function fadeIn(src)
while true do
coroutine.yield()
local v=SETTING.bgm
v=min(v,src:getVolume()+.025*v)
src:setVolume(v)
if v>=SETTING.bgm then
return true
end
end
end
local function removeCurFadeOut(task,code,src)
return task.code==code and task.args[1]==src
end
local function load(skip)
for i=1,count do
local file="media/BGM/"..list[i]..".ogg"
if love.filesystem.getInfo(file)then
Sources[list[i]]=love.audio.newSource(file,"stream")
Sources[list[i]]:setLooping(true)
Sources[list[i]]:setVolume(0)
else
LOG.print("No BGM file: "..list[i],5,COLOR.orange)
end
if not skip and i~=count then
coroutine.yield()
end
end
BGM.loadOne=nil
function BGM.play(s)
if SETTING.bgm==0 then
BGM.nowPlay=s
BGM.playing=Sources[s]
return
end
if s and Sources[s]and BGM.nowPlay~=s then
if BGM.nowPlay then TASK.new(fadeOut,BGM.playing)end
TASK.removeTask_iterate(removeCurFadeOut,fadeOut,Sources[s])
TASK.removeTask_code(fadeIn)
TASK.new(fadeIn,Sources[s])
BGM.nowPlay=s
BGM.playing=Sources[s]
BGM.playing:play()
end
end
function BGM.freshVolume()
if BGM.playing then
local v=SETTING.bgm
if v>0 then
BGM.playing:setVolume(v)
BGM.playing:play()
elseif BGM.nowPlay then
BGM.playing:pause()
end
end
end
function BGM.stop()
TASK.removeTask_code(fadeIn)
if BGM.nowPlay then TASK.new(fadeOut,BGM.playing)end
BGM.nowPlay,BGM.playing=nil
end
end
BGM.loadOne=coroutine.wrap(load)
function BGM.loadAll()load(true)end
end
return BGM

View File

@@ -1,42 +1,25 @@
local IMG={
batteryImage="/mess/power.png",
title="mess/title.png",
title_color="mess/title_colored.png",
dialCircle="mess/dialCircle.png",
dialNeedle="mess/dialNeedle.png",
lifeIcon="mess/life.png",
badgeIcon="mess/badge.png",
spinCenter="mess/spinCenter.png",
ctrlSpeedLimit="mess/ctrlSpeedLimit.png",
speedLimit="mess/speedLimit.png",
pay1="mess/pay1.png",
pay2="mess/pay2.png",
miyaCH="miya/ch.png",
miyaF1="miya/f1.png",
miyaF2="miya/f2.png",
miyaF3="miya/f3.png",
miyaF4="miya/f4.png",
electric="mess/electric.png",
hbm="mess/hbm.png",
getCount=function()return 0 end,
}
local list={}
local count=0
for k,_ in next,IMG do
count=count+1
list[count]=k
end
function IMG.getCount()
return count
end
function IMG.loadOne(_)
local N=list[_]
IMG[N]=love.graphics.newImage("media/image/"..IMG[N])
end
function IMG.loadAll()
for i=1,count do
IMG.loadOne(i)
function IMG.init(list)
IMG.init=nil
local count=0
for k,v in next,list do
count=count+1
IMG[k]=v
end
function IMG.getCount()return count end
local function load(skip)
for k,v in next,list do
IMG[k]=love.graphics.newImage("media/image/"..v)
if not skip and i~=count then
coroutine.yield()
end
end
IMG.loadOne=nil
end
IMG.loadOne=coroutine.wrap(load)
function IMG.loadAll()load(true)end
end
return IMG

View File

@@ -48,7 +48,7 @@ local function updatePowerInfo()
if state=="nobattery"then
gc.setColor(1,1,1)
gc.setLineWidth(2)
gc.line(74,5,100,22)
gc.line(74,SCR.safeX+5,100,22)
elseif pow then
if charging then gc.setColor(0,1,0)
elseif pow>50 then gc.setColor(1,1,1)
@@ -177,9 +177,6 @@ function love.keypressed(i)
LOG.print("luaVer:".._VERSION)
LOG.print("jitVer:"..jit.version)
LOG.print("jitVerNum:"..jit.version_num)
local r=rnd()<.5
love._setGammaCorrect(r)
LOG.print("GammaCorrect: "..(r and"on"or"off"),"warn")
elseif i=="f3"then
for _=1,8 do
local P=PLAYERS.alive[rnd(#PLAYERS.alive)]
@@ -313,19 +310,7 @@ function love.lowmemory()
collectgarbage()
end
function love.resize(w,h)
SCR.w,SCR.h,SCR.dpi=w,h,gc.getDPIScale()
SCR.W,SCR.H=SCR.w*SCR.dpi,SCR.h*SCR.dpi
SCR.r=h/w
SCR.rad=(w^2+h^2)^.5
if SCR.r>=SCR.h0/SCR.w0 then
SCR.k=w/SCR.w0
SCR.x,SCR.y=0,(h-w*SCR.h0/SCR.w0)/2
else
SCR.k=h/SCR.h0
SCR.x,SCR.y=(w-h*SCR.w0/SCR.h0)/2,0
end
xOy:setTransformation(w/2,h/2,nil,SCR.k,nil,SCR.w0/2,SCR.h0/2)
SCR.resize(w,h)
if BG.resize then BG.resize(w,h)end
SHADER.warning:send("w",w*SCR.dpi)
@@ -518,7 +503,7 @@ function love.run()
--Draw power info.
gc.setColor(1,1,1)
if SETTING.powerInfo then
gc.draw(infoCanvas,0,0,0,SCR.k)
gc.draw(infoCanvas,SCR.safeX,0,0,SCR.k)
end
--Draw scene swapping animation
@@ -538,16 +523,16 @@ function love.run()
gc.setColor(1,1,1)
setFont(15)
_=SCR.h
gc.print(FPS(),5,_-20)
gc.print(FPS(),SCR.safeX+5,_-20)
--Debug info.
if devMode then
gc.setColor(devColor[devMode])
gc.print("Memory:"..gcinfo(),5,_-40)
gc.print("Lines:"..FREEROW.getCount(),5,_-60)
gc.print("Cursor:"..int(mx+.5).." "..int(my+.5),5,_-80)
gc.print("Voices:"..VOC.getCount(),5,_-100)
gc.print("Tasks:"..TASK.getCount(),5,_-120)
gc.print("Memory:"..gcinfo(),SCR.safeX+5,_-40)
gc.print("Lines:"..FREEROW.getCount(),SCR.safeX+5,_-60)
gc.print("Cursor:"..int(mx+.5).." "..int(my+.5),SCR.safeX+5,_-80)
gc.print("Voices:"..VOC.getQueueCount(),SCR.safeX+5,_-100)
gc.print("Tasks:"..TASK.getCount(),SCR.safeX+5,_-120)
ins(frameTimeList,1,dt)rem(frameTimeList,126)
gc.setColor(1,1,1,.3)
for i=1,#frameTimeList do

View File

@@ -1,52 +1,3 @@
local langList={
require"parts/language/lang_zh",
require"parts/language/lang_zh2",
require"parts/language/lang_en",
require"parts/language/lang_fr",
require"parts/language/lang_sp",
require"parts/language/lang_symbol",
require"parts/language/lang_yygq",
--Add new language file to LANG folder. Attention, new language won't show in-game when you add language
}
local publicText={
block={
"Z","S","J","L","T","O","I",
"Z5","S5","Q","P","F","E",
"T5","U","V","W","X",
"J5","L5","R","Y","N","H","I5"
},
}
local publicWidgetText={
calculator={
_1="1",_2="2",_3="3",
_4="4",_5="5",_6="6",
_7="7",_8="8",_9="9",
_0="0",["."]=".",e="e",
["+"]="+",["-"]="-",["*"]="*",["/"]="/",
["<"]="<",["="]="=",
play="-->",
},
staff={},
history={
prev="",
next="",
},
lang={
zh="中文",
zh2="全中文",
en="English",
fr="Français",
sp="Español",
symbol="?????",
yygq="就这?",
},
custom_field={
b0="",b1="",b2="",b3="",b4="",b5="",b6="",b7="",
b8="",b9="",b10="",b11="",b12="",b13="",b14="",b15="",b16="",
b17="[ ]",b18="N",b19="B",b20="_",b21="_",b22="_",b23="_",b24="_",
},
mg_cubefield={},
}
local function langFallback(T0,T)
for k,v in next,T0 do
if type(v)=="table"and not v.refuseCopy then--refuseCopy: just copy pointer, not contents
@@ -58,48 +9,59 @@ local function langFallback(T0,T)
end
end
local tipMeta={__call=function(L)return L[math.random(#L)]end}
for i=1,#langList do
local L=langList[i]
--Set public text
for key,list in next,publicText do
L[key]=list
end
--Set public widget text
for key,list in next,publicWidgetText do
local WT=L.WidgetText
if not WT[key]then WT[key]={}end
for k,v in next,list do
WT[key][k]=v
end
end
--Fallback to other language, default zh
if i>1 then
langFallback(langList[L.fallback or 1],L)
end
--Metatable:__call for table:getTip
if type(L.getTip)=="table"then
setmetatable(L.getTip,tipMeta)
end
--set global name for all back button
for _,v in next,L.WidgetText do
v.back=L.back
end
end
local LANG={}
function LANG.getLen()
return #langList
end
function LANG.set(l)
local langList={}
local publicText,publicWidgetText={},{}
local function lang_set(l)
text=langList[l]
WIDGET.setLang(text.WidgetText)
for _,s in next,drawableTextLoad do
drawableText[s]:set(text[s])
end
end
local LANG={}
--Call these before call LANG.init()
function LANG.setLangList(list)langList=list end
function LANG.setPublicText(L)publicText=L end
function LANG.setPublicWidgetText(L)publicWidgetText=L end
function LANG.init()--Attention, calling this will DESTORY ALL METHODS, only left LANG.set()!
for i=1,#langList do
local L=langList[i]
--Set public text
for key,list in next,publicText do
L[key]=list
end
--Set public widget text
for key,list in next,publicWidgetText do
local WT=L.WidgetText
if not WT[key]then WT[key]={}end
for k,v in next,list do
WT[key][k]=v
end
end
--Fallback to other language, default zh
if i>1 then
langFallback(langList[L.fallback or 1],L)
end
--Metatable:__call for table:getTip
if type(rawget(L,"getTip"))=="table"then
setmetatable(L.getTip,tipMeta)
end
--set global name for all back button
for _,v in next,L.WidgetText do
v.back=L.back
end
end
LANG.init,LANG.setLangList,LANG.setPublicText,LANG.setPublicWidgetText=nil
LANG.set=lang_set
end
return LANG

View File

@@ -39,6 +39,8 @@ local SCN={
function SCN.add(name,scene)
scenes[name]=scene
if not scene.widgetList then scene.widgetList={}end
setmetatable(scene.widgetList,WIDGET.indexMeta)
end
function SCN.swapUpdate()
@@ -76,7 +78,7 @@ function SCN.init(s,org)
SCN.gamepadUp=S.gamepadUp
SCN.socketRead=S.socketRead
if S.sceneInit then S.sceneInit(org)end
WIDGET.set(s)
WIDGET.set(S.widgetList)
end
function SCN.push(tar,style)
if not SCN.swapping then

View File

@@ -1,14 +1,32 @@
local SCR={
w0=1280,h0=720,--Default Screen Size
x=0,y=0,--Up-left Coord on screen
w=0,h=0,--Fullscreen w/h in gc
W=0,H=0,--Fullscreen w/h in shader
rad=0,--Radius
k=1,--Scale size
dpi=1,--DPI from gc.getDPIScale()
w0=1280,h0=720, --Default Screen Size
x=0,y=0, --Up-left Coord on screen
w=0,h=0, --Fullscreen w/h in gc
W=0,H=0, --Fullscreen w/h in shader
safeX=0,safeY=0,--Safe area
safeW=0,safeH=0,--Safe area
rad=0, --Radius
k=1, --Scale size
dpi=1, --DPI from gc.getDPIScale()
xOy=love.math.newTransform(),--Screen transformation object
}
function SCR.setSize(w,h)
SCR.w0,SCR.h0=w,h
end
function SCR.resize(w,h)
SCR.w,SCR.h,SCR.dpi=w,h,love.graphics.getDPIScale()
SCR.W,SCR.H=SCR.w*SCR.dpi,SCR.h*SCR.dpi
SCR.r=h/w
SCR.rad=(w^2+h^2)^.5
if SCR.r>=SCR.h0/SCR.w0 then
SCR.k=w/SCR.w0
SCR.x,SCR.y=0,(h-w*SCR.h0/SCR.w0)/2
else
SCR.k=h/SCR.h0
SCR.x,SCR.y=(w-h*SCR.w0/SCR.h0)/2,0
end
SCR.safeX,SCR.safeY,SCR.safeW,SCR.safeH=love.window.getSafeArea()
SCR.xOy:setTransformation(w/2,h/2,nil,SCR.k,nil,SCR.w0/2,SCR.h0/2)
end
return SCR

View File

@@ -1,85 +1,97 @@
local rem=table.remove
local SFX={
getCount=function()return 0 end,
fieldPlay=NULL,
play=NULL,
fplay=NULL,
reset=NULL,
reload=NULL,
}
function SFX.init(list)
SFX.init=nil
local rem=table.remove
local Sources={}
local SFX={}
function SFX.set(L)
SFX.list=L
SFX.len=#L
end
function SFX.loadOne(_)
_,SFX.list[_]=SFX.list[_]
local N="media/SFX/".._..".ogg"
if love.filesystem.getInfo(N)then
SFX.list[_]={love.audio.newSource(N,"static")}
else
LOG.print("No SFX file: "..N,5,COLOR.orange)
end
end
function SFX.loadAll()
for i=1,#SFX.list do
SFX.loadOne(i)
end
end
function SFX.fieldPlay(s,v,P)
SFX.play(s,v,(P.curX+P.sc[2]-5.5)*.15)
end
function SFX.play(s,vol,pos)
if SETTING.sfx==0 then return end
local S=SFX.list[s]--Source list
if not S then return end
local n=1
while S[n]:isPlaying()do
n=n+1
if not S[n]then
S[n]=S[1]:clone()
S[n]:seek(0)
break
local count=#list function SFX.getCount()return count end
local function load(skip)
for i=1,count do
local N="media/SFX/"..list[i]..".ogg"
if love.filesystem.getInfo(N)then
Sources[list[i]]={love.audio.newSource(N,"static")}
else
LOG.print("No SFX file: "..N,5,COLOR.orange)
end
if not skip and i~=count then
coroutine.yield()
end
end
end
S=S[n]--AU_SRC
if S:getChannelCount()==1 then
if pos then
pos=pos*SETTING.stereo
S:setPosition(pos,1-pos^2,0)
else
S:setPosition(0,0,0)
SFX.loadOne=nil
function SFX.fieldPlay(s,v,P)
SFX.play(s,v,(P.curX+P.sc[2]-5.5)*.15)
end
end
S:setVolume(((vol or 1)*SETTING.sfx)^1.626)
S:play()
end
function SFX.fplay(s,vol,pos)
local S=SFX.list[s]--Source list
if not S then return end
local n=1
while S[n]:isPlaying()do
n=n+1
if not S[n]then
S[n]=S[1]:clone()
S[n]:seek(0)
break
function SFX.play(s,vol,pos)
if SETTING.sfx==0 then return end
local S=Sources[s]--Source list
if not S then return end
local n=1
while S[n]:isPlaying()do
n=n+1
if not S[n]then
S[n]=S[1]:clone()
S[n]:seek(0)
break
end
end
S=S[n]--AU_SRC
if S:getChannelCount()==1 then
if pos then
pos=pos*SETTING.stereo
S:setPosition(pos,1-pos^2,0)
else
S:setPosition(0,0,0)
end
end
S:setVolume(((vol or 1)*SETTING.sfx)^1.626)
S:play()
end
end
S=S[n]--AU_SRC
if S:getChannelCount()==1 then
if pos then
pos=pos*SETTING.stereo
S:setPosition(pos,1-pos^2,0)
else
S:setPosition(0,0,0)
function SFX.fplay(s,vol,pos)
local S=Sources[s]--Source list
if not S then return end
local n=1
while S[n]:isPlaying()do
n=n+1
if not S[n]then
S[n]=S[1]:clone()
S[n]:seek(0)
break
end
end
S=S[n]--AU_SRC
if S:getChannelCount()==1 then
if pos then
pos=pos*SETTING.stereo
S:setPosition(pos,1-pos^2,0)
else
S:setPosition(0,0,0)
end
end
S:setVolume(vol^1.626)
S:play()
end
end
S:setVolume(vol^1.626)
S:play()
end
function SFX.reset()
for _,L in next,SFX.list do
if type(L)=="table"then
for i=#L,1,-1 do
if not L[i]:isPlaying()then
rem(L,i)
function SFX.reset()
for _,L in next,Sources do
if type(L)=="table"then
for i=#L,1,-1 do
if not L[i]:isPlaying()then
rem(L,i)
end
end
end
end
end
end
SFX.loadOne=coroutine.wrap(load)
function SFX.loadAll()load(true)end
end
return SFX

View File

@@ -41,6 +41,7 @@ function FXupdate.cell(S,dt)
S.t=S.t+dt*S.rate
return S.t>1
end
FXupdate.line=normUpdate
local FXdraw={}
function FXdraw.badge(S)
@@ -88,6 +89,10 @@ function FXdraw.cell(S)
setColor(1,1,1,1-S.t)
gc.draw(S.image,S.x,S.y,nil,S.size,nil,S.cx,S.cy)
end
function FXdraw.line(S)
setColor(1,1,1,S.a*(1-S.t))
gc.line(S.x1,S.y1,S.x2,S.y2)
end
local SYSFX={}
function SYSFX.update(dt)
@@ -143,14 +148,14 @@ function SYSFX.newRectRipple(rate,x,y,w,h)
x=x,y=y,w=w,h=h,
}
end
function SYSFX.newShade(rate,r,g,b,x,y,w,h)
function SYSFX.newShade(rate,x,y,w,h,r,g,b)
fx[#fx+1]={
update=FXupdate.shade,
draw=FXdraw.shade,
t=0,
rate=rate,
r=r,g=g,b=b,
x=x,y=y,w=w,h=h,
r=r or 1,g=g or 1,b=b or 1,
}
end
function SYSFX.newCell(rate,image,size,x,y,vx,vy,ax,ay)
@@ -166,4 +171,15 @@ function SYSFX.newCell(rate,image,size,x,y,vx,vy,ax,ay)
ax=ax,ay=ay,
}
end
function SYSFX.newLine(rate,x1,y1,x2,y2,r,g,b,a)
fx[#fx+1]={
update=FXupdate.line,
draw=FXdraw.line,
t=0,
rate=rate,
x1=x1 or 0,y1=y1 or 0,
x2=x2 or x1 or 1280,y2=y2 or y1 or 720,
r=r or 1,g=g or 1,b=b or 1,a=a or 1,
}
end
return SYSFX

View File

@@ -23,7 +23,7 @@ function TASK.update()
end
function TASK.new(code,...)
local thread=ct.create(code)
if ...~=nil then ct.resume(thread,...)end
ct.resume(thread,...)
if ct.status(thread)~="dead"then
tasks[#tasks+1]={
thread=thread,
@@ -34,7 +34,7 @@ function TASK.new(code,...)
end
function TASK.newNet(code,...)
local thread=ct.create(code)
if ...~=nil then ct.resume(thread,...)end
ct.resume(thread,...)
if ct.status(thread)~="dead"then
tasks[#tasks+1]={
thread=thread,

View File

@@ -1,6 +1,5 @@
local gc=love.graphics
local rnd=math.random
local rem=table.remove
local rnd,rem=math.random,table.remove
local setFont,mStr=setFont,mStr
local texts={}
@@ -74,18 +73,6 @@ local TEXT={}
function TEXT.clear()
texts={}
end
function TEXT.getText(text,x,y,font,style,spd,stop)--Another version of TEXT()
return{
c=0,
text=text,
x=x or 0,
y=y or 0,
font=font or 40,
spd=(spd or 1)/60,
stop=stop,
draw=textFX[style]or assert(false,"unavailable type:"..style),
}
end
function TEXT.show(text,x,y,font,style,spd,stop)
texts[#texts+1]={
c=0, --Timer
@@ -95,7 +82,19 @@ function TEXT.show(text,x,y,font,style,spd,stop)
font=font or 40, --Font
spd=(spd or 1)/60, --Timing speed(1=last 1 sec)
stop=stop, --Stop time(sustained text)
draw=textFX[style]or assert(false,"unavailable type:"..style), --Draw method
draw=textFX[style]or error("unavailable type:"..style), --Draw method
}
end
function TEXT.getText(text,x,y,font,style,spd,stop)--Another version of TEXT.show(), but only return text object, need manual management
return{
c=0,
text=text,
x=x or 0,
y=y or 0,
font=font or 40,
spd=(spd or 1)/60,
stop=stop,
draw=textFX[style]or error("unavailable type:"..style),
}
end
function TEXT.update(list)

View File

@@ -152,14 +152,14 @@ do--dumpTable
k=k.."="
end
elseif T=="boolean"then k="["..k.."]="
else assert(false,"Error key type!")
else error("Error key type!")
end
T=type(v)
if T=="number"then v=tostring(v)
elseif T=="string"then v="\""..v.."\""
elseif T=="table"then v=dumpTable(v,t+1)
elseif T=="boolean"then v=tostring(v)
else assert(false,"Error data type!")
else error("Error data type!")
end
s=s..tabs[t]..k..v..",\n"
end
@@ -167,21 +167,21 @@ do--dumpTable
end
end
do--json
--
-- json.lua
--
-- Copyright (c) 2020 rxi
--
-- Permission is hereby granted, free of charge, to any person obtaining a copy of
-- this software and associated documentation files (the "Software"), to deal in
-- the Software without restriction, including without limitation the rights to
-- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-- of the Software, and to permit persons to whom the Software is furnished to do
-- so, subject to the following conditions:
--
-- The above copyright notice and this permission notice shall be included in all
-- copies or substantial portions of the Software.
--
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@@ -189,7 +189,7 @@ do--json
-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-- SOFTWARE.
--
local char=string.char
json = {}
@@ -588,7 +588,7 @@ do--httpRequest & wsConnect
end
else
local function noNetLib()
LOG.print("[NO NETlib]",5,COLOR.yellow)
LOG.print("[NO NETlib for "..SYSTEM.."]",5,COLOR.yellow)
end
httpRequest=noNetLib
wsConnect=noNetLib

View File

@@ -1,117 +1,125 @@
local rnd=math.random
local rem=table.remove
local voiceQueue={free=0}
local bank={}--{vocName1={SRC1s},vocName2={SRC2s},...}
local VOC={}
VOC.list={}
local VOC={
getCount=function()return 0 end,
getQueueCount=NULL,
getFreeChannel=NULL,
play=NULL,
update=NULL,
reload=NULL,
}
function VOC.init(list)
VOC.init=nil
local rnd=math.random
local rem=table.remove
local voiceQueue={free=0}
local bank={}--{vocName1={SRC1s},vocName2={SRC2s},...}
local Source={}
local function loadVoiceFile(N,vocName)
local fileName="media/VOICE/"..SETTING.cv.."/"..vocName..".ogg"
if love.filesystem.getInfo(fileName)then
bank[vocName]={love.audio.newSource(fileName,"static")}
table.insert(VOC.list[N],vocName)
return true
end
end
function VOC.set(L)
VOC.name=L
VOC.len=#L
end
function VOC.loadOne(name)
local N=VOC.name[name]
VOC.list[N]={}
local i=0
repeat i=i+1 until not loadVoiceFile(N,N.."_"..i)
if i==1 then
if not loadVoiceFile(N,N)then
LOG.print("No VOICE file: "..N,5,COLOR.orange)
local count=#list function VOC.getCount()return count end
local function loadVoiceFile(N,vocName)
local fileName="media/VOICE/"..SETTING.cv.."/"..vocName..".ogg"
if love.filesystem.getInfo(fileName)then
bank[vocName]={love.audio.newSource(fileName,"static")}
table.insert(Source[N],vocName)
return true
end
end
if not VOC.list[N][1]then VOC.list[N]=nil end
end
function VOC.loadAll()
for i=1,#VOC.name do
VOC.loadOne(i)
end
collectgarbage()
end
function VOC.getFreeChannel()
local l=#voiceQueue
for i=1,l do
if #voiceQueue[i]==0 then return i end
end
voiceQueue[l+1]={s=0}
return l+1
end
function VOC.getCount()
return #voiceQueue
end
local function getVoice(str)
local L=bank[str]
local n=1
while L[n]:isPlaying()do
n=n+1
if not L[n]then
L[n]=L[1]:clone()
L[n]:seek(0)
break
local function getVoice(str)
local L=bank[str]
local n=1
while L[n]:isPlaying()do
n=n+1
if not L[n]then
L[n]=L[1]:clone()
L[n]:seek(0)
break
end
end
return L[n]
--Load voice with string
end
return L[n]
--Load voice with string
end
function VOC.update()
for i=#voiceQueue,1,-1 do
local Q=voiceQueue[i]
if Q.s==0 then--Free channel, auto delete when >3
if i>3 then
rem(voiceQueue,i)
end
elseif Q.s==1 then--Waiting load source
Q[1]=getVoice(Q[1])
Q[1]:setVolume(SETTING.voc)
Q[1]:play()
Q.s=Q[2]and 2 or 4
elseif Q.s==2 then--Playing 1,ready 2
if Q[1]:getDuration()-Q[1]:tell()<.08 then
Q[2]=getVoice(Q[2])
Q[2]:setVolume(SETTING.voc)
Q[2]:play()
Q.s=3
end
elseif Q.s==3 then--Playing 12 same time
if not Q[1]:isPlaying()then
for j=1,#Q do
Q[j]=Q[j+1]
local function load(skip)
for i=1,count do
Source[list[i]]={}
local n=0
repeat n=n+1 until not loadVoiceFile(list[i],list[i].."_"..n)
if n==1 then
if not loadVoiceFile(list[i],list[i])then
LOG.print("No VOICE file: "..list[i],5,COLOR.orange)
end
Q.s=Q[2]and 2 or 4
end
elseif Q.s==4 then--Playing last
if not Q[1].isPlaying(Q[1])then
Q[1]=nil
Q.s=0
if not Source[list[i]][1]then Source[list[i]]=nil end
if not skip and i~=count then
coroutine.yield()
end
end
VOC.loadOne=nil
function VOC.getQueueCount()
return #voiceQueue
end
function VOC.getFreeChannel()
local l=#voiceQueue
for i=1,l do
if #voiceQueue[i]==0 then return i end
end
voiceQueue[l+1]={s=0}
return l+1
end
function VOC.play(s,chn)
if SETTING.voc>0 then
local _=Source[s]
if not _ then return end
if chn then
local L=voiceQueue[chn]
L[#L+1]=_[rnd(#_)]
L.s=1
--Add to queue[chn]
else
voiceQueue[VOC.getFreeChannel()]={s=1,_[rnd(#_)]}
--Create new channel & play
end
end
end
function VOC.update()
for i=#voiceQueue,1,-1 do
local Q=voiceQueue[i]
if Q.s==0 then--Free channel, auto delete when >3
if i>3 then
rem(voiceQueue,i)
end
elseif Q.s==1 then--Waiting load source
Q[1]=getVoice(Q[1])
Q[1]:setVolume(SETTING.voc)
Q[1]:play()
Q.s=Q[2]and 2 or 4
elseif Q.s==2 then--Playing 1,ready 2
if Q[1]:getDuration()-Q[1]:tell()<.08 then
Q[2]=getVoice(Q[2])
Q[2]:setVolume(SETTING.voc)
Q[2]:play()
Q.s=3
end
elseif Q.s==3 then--Playing 12 same time
if not Q[1]:isPlaying()then
for j=1,#Q do
Q[j]=Q[j+1]
end
Q.s=Q[2]and 2 or 4
end
elseif Q.s==4 then--Playing last
if not Q[1].isPlaying(Q[1])then
Q[1]=nil
Q.s=0
end
end
end
end
end
end
function VOC.play(s,chn)
if SETTING.voc>0 then
local _=VOC.list[s]
if not _ then return end
if chn then
local L=voiceQueue[chn]
L[#L+1]=_[rnd(#_)]
L.s=1
--Add to queue[chn]
else
voiceQueue[VOC.getFreeChannel()]={s=1,_[rnd(#_)]}
--Create new channel & play
end
end
VOC.loadOne=coroutine.wrap(load)
function VOC.loadAll()load(true)end
end
return VOC

View File

@@ -3,12 +3,10 @@ local kb=love.keyboard
local int,abs=math.floor,math.abs
local max,min=math.max,math.min
local sub,format=string.sub,string.format
local ins=table.insert
local Timer=love.timer.getTime
local setFont,mStr=setFont,mStr
local widgetList={}
local WIDGET={}
local widgetMetatable={
__tostring=function(self)
@@ -236,6 +234,9 @@ function key:draw()
setFont(self.font)
gc.setColor(r,g,b,1.2)
gc.printf(t,x,y+h*.5-self.font*.7,w,"center")
else
self.text=self.name or"NONAME"
self.color=COLOR.dPurple
end
end
function key:getInfo()
@@ -619,12 +620,12 @@ function selector:press(x)
if x<self.x+self.w*.5 then
if s>1 then
s=s-1
SYSFX.newShade(3,1,1,1,self.x,self.y,self.w*.5,60)
SYSFX.newShade(3,self.x,self.y,self.w*.5,60)
end
else
if s<#self.list then
s=s+1
SYSFX.newShade(3,1,1,1,self.x+self.w*.5,self.y,self.w*.5,60)
SYSFX.newShade(3,self.x+self.w*.5,self.y,self.w*.5,60)
end
end
if self.select~=s then
@@ -640,10 +641,10 @@ function selector:arrowKey(isLeft)
if isLeft and s==1 or not isLeft and s==#self.list then return end
if isLeft then
s=s-1
SYSFX.newShade(3,1,1,1,self.x,self.y,self.w*.5,60)
SYSFX.newShade(3,self.x,self.y,self.w*.5,60)
else
s=s+1
SYSFX.newShade(3,1,1,1,self.x+self.w*.5,self.y,self.w*.5,60)
SYSFX.newShade(3,self.x+self.w*.5,self.y,self.w*.5,60)
end
self.code(self.list[s])
self.select=s
@@ -807,7 +808,7 @@ function WIDGET.lnk_pressKey(k) return function() love.keypressed(k) end end
function WIDGET.lnk_goScene(t,s) return function() SCN.go(t,s) end end
function WIDGET.lnk_swapScene(t,s) return function() SCN.swapTo(t,s) end end
local indexMeta={
WIDGET.indexMeta={
__index=function(L,k)
for i=1,#L do
if L[i].name==k then
@@ -816,16 +817,7 @@ local indexMeta={
end
end
}
function WIDGET.init(sceneName,list)
local L={}
for i=1,#list do
ins(L,list[i])
end
setmetatable(L,indexMeta)
widgetList[sceneName]=L
end
function WIDGET.set(sceneName)
local list=widgetList[sceneName]
function WIDGET.set(list)
kb.setTextInput(false)
WIDGET.sel=nil
WIDGET.active=list or NONE
@@ -837,10 +829,12 @@ function WIDGET.set(sceneName)
end
end
end
function WIDGET.setLang(lang)
for S,L in next,widgetList do
for _,W in next,L do
W.text=lang[S][W.name]
function WIDGET.setLang(widgetText)
for S,L in next,SCN.scenes do
if widgetText[S]then
for _,W in next,L.widgetList do
W.text=widgetText[S][W.name]
end
end
end
end

View File

@@ -1,5 +1,5 @@
VERSION_CODE=1204
VERSION_NAME="Alpha V0.12.4"
VERSION_CODE=1205
VERSION_NAME="Alpha V0.12.5"
love.setDeprecationOutput(false)
function love.conf(t)
t.identity="Techmino"--Saving folder

View File

@@ -118,13 +118,13 @@ return{--返回一个table你也可以在之前定义一些常量或者函数
bg="bg2",bgm="race",
},
load=function()--生成玩家
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)--1是玩家编号默认用户控制1号玩家
end,
mesDisp=function(P)--40行模式需要显示的信息
setFont(55)
local r=40-P.stat.row
if r<0 then r=0 end
mStr(r,69,335)--把计算出来的剩余行数r显示出来
mStr(r,69,265)--把计算出来的剩余行数r显示出来
PLY.draw.drawTargetLine(P,r)--使用自带的境界高度线绘制函数
end,
score=function(P)return{P.stat.frame/60,P.stat.piece}end,--游戏结束时需要保存的本局关键信息

120
main.lua
View File

@@ -51,8 +51,56 @@ AIFUNC= require"parts/ai"
MODES= require"parts/modes"
TICK= require"parts/tick"
--Initialize image libs
IMG.init{
batteryImage="/mess/power.png",
title="mess/title.png",
title_color="mess/title_colored.png",
dialCircle="mess/dialCircle.png",
dialNeedle="mess/dialNeedle.png",
lifeIcon="mess/life.png",
badgeIcon="mess/badge.png",
spinCenter="mess/spinCenter.png",
ctrlSpeedLimit="mess/ctrlSpeedLimit.png",
speedLimit="mess/speedLimit.png",
pay1="mess/pay1.png",
pay2="mess/pay2.png",
miyaCH="miya/ch.png",
miyaF1="miya/f1.png",
miyaF2="miya/f2.png",
miyaF3="miya/f3.png",
miyaF4="miya/f4.png",
electric="mess/electric.png",
hbm="mess/hbm.png",
}
SKIN.init{
"normal(mrz)",
"smooth(mrz)",
"contrast(mrz)",
"glow(mrz)",
"plastic(mrz)",
"jelly(miya)",
"steel(kulumi)",
"pure(mrz)",
"ball(shaw)",
"paper(mrz)",
"gem(notypey)",
"classic(_)",
"brick(notypey)",
"brick_light(notypey)",
"cartoon_cup(earety)",
"crack(earety)",
"retro(notypey)",
"retro_grey(notypey)",
"text_bone(mrz)",
"colored_bone(mrz)",
"white_bone(mrz)",
"WTF",
}
--Initialize sound libs
SFX.set{
SFX.init{
--Stereo sfxs(cannot set position)
"welcome_sfx",
"click","enter",
@@ -74,7 +122,7 @@ SFX.set{
"clear",
"error",
}
BGM.set{
BGM.init{
"blank",--menu
"race",--sprint, solo
"infinite",--infinite norm/dig, ultra, zen, tech-finesse
@@ -99,7 +147,7 @@ BGM.set{
"rockblock",--classic, 49/99
"cruelty","final","8-bit happiness","end","how feeling",--49/99
}
VOC.set{
VOC.init{
"zspin","sspin","lspin","jspin","tspin","ospin","ispin",
"single","double","triple","techrash",
"mini","b2b","b3b",
@@ -109,6 +157,58 @@ VOC.set{
"welcome_voc",
}
--Initialize language lib
LANG.setLangList{
require"parts/language/lang_zh",
require"parts/language/lang_zh2",
require"parts/language/lang_en",
require"parts/language/lang_fr",
require"parts/language/lang_sp",
require"parts/language/lang_symbol",
require"parts/language/lang_yygq",
--Add new language file to LANG folder. Attention, new language won't show in-game when you add language
}
LANG.setPublicText{
block={
"Z","S","J","L","T","O","I",
"Z5","S5","Q","P","F","E",
"T5","U","V","W","X",
"J5","L5","R","Y","N","H","I5"
},
}
LANG.setPublicWidgetText{
calculator={
_1="1",_2="2",_3="3",
_4="4",_5="5",_6="6",
_7="7",_8="8",_9="9",
_0="0",["."]=".",e="e",
["+"]="+",["-"]="-",["*"]="*",["/"]="/",
["<"]="<",["="]="=",
play="-->",
},
custom_field={
b0="",b1="",b2="",b3="",b4="",b5="",b6="",b7="",
b8="",b9="",b10="",b11="",b12="",b13="",b14="",b15="",b16="",
b17="[ ]",b18="N",b19="B",b20="_",b21="_",b22="_",b23="_",b24="_",
},
lang={
zh="中文",
zh2="全中文",
en="English",
fr="Français",
sp="Español",
symbol="?????",
yygq="就这?",
},
staff={},
history={
prev="",
next="",
},
mg_cubefield={},
}
LANG.init()
--Load shader files from SOURCE ONLY
SHADER={}
for _,v in next,love.filesystem.getDirectoryItems("parts/shaders")do
@@ -134,9 +234,7 @@ end
for _,v in next,fs.getDirectoryItems("parts/scenes")do
if fs.getRealDirectory("parts/scenes/"..v)~=SAVEDIR then
local sceneName=v:sub(1,-5)
local scene=require("parts/scenes/"..sceneName)
SCN.add(sceneName,scene)
if scene.widgetList then WIDGET.init(sceneName,scene.widgetList)end
SCN.add(sceneName,require("parts/scenes/"..sceneName))
else
LOG.print("Dangerous file : %SAVE%/parts/scenes/"..v)
end
@@ -190,6 +288,7 @@ do
type(S.spawn)~="number"or
type(S.ghost)~="number"or
type(S.center)~="number"or
type(S.grid)~="number"or
S.bgm>1 or S.sfx>1 or S.voc>1 or
S.stereo>1 or S.VKSFX>1 or S.VKAlpha>1
then
@@ -210,7 +309,10 @@ do
S.finesseRate=5*(S.piece-S.extraRate)
end
if S.version~=VERSION_CODE then
if(tonumber(S.version)or 0)<1204 then
if type(S.version)~="number"then
S.version=0
end
if S.version<1204 then
STAT.frame=math.floor(STAT.time*60)
STAT.lastPlay="sprint_10"
RANKS.sprintFix=nil
@@ -218,6 +320,10 @@ do
fs.remove("sprintFix.dat")
fs.remove("sprintLock.dat")
end
if S.version<1205 then
SETTING.VKCurW=SETTING.VKCurW*.1
SETTING.VKTchW=SETTING.VKTchW*.1
end
newVersionLaunch=true
--Try unlock modes which should be unlocked

View File

@@ -142,7 +142,7 @@ function pasteSequence(str)
return true
end
function newBoard(f)
function newBoard(f)--Generate a new board
if f then
return copyList(f)
else
@@ -151,7 +151,7 @@ function newBoard(f)
return F
end
end
function copyBoard(page)
function copyBoard(page)--Copy the [page] board
local F=FIELD[page or 1]
local str=""
local H=0
@@ -177,7 +177,7 @@ function copyBoard(page)
end
return data.encode("string","base64",data.compress("string","zlib",str))
end
function pasteBoard(str,page)
function pasteBoard(str,page)--Paste [str] data to [page] board
local F=FIELD[page or 1]
local _,__
@@ -339,6 +339,7 @@ function mergeStat(stat,delta)
end
end
--Functions for royale mode
function randomTarget(P)--Return a random opponent for P
if #PLAYERS.alive>1 then
local R
@@ -430,9 +431,6 @@ end
function pauseGame()
if not SCN.swapping then
GAME.restartCount=0--Avoid strange darkness
if not GAME.result then
GAME.pauseCount=GAME.pauseCount+1
end
if not GAME.replaying then
for i=1,#PLAYERS do
local l=PLAYERS[i].keyPressing
@@ -449,7 +447,22 @@ end
function resumeGame()
SCN.swapTo("play","none")
end
function loadGame(M,ifQuickPlay)
function applyCustomGame()
for k,v in next,CUSTOMENV do
GAME.modeEnv[k]=v
end
if BAG[1]then
GAME.modeEnv.bag=BAG
else
GAME.modeEnv.bag=nil
end
if MISSION[1]then
GAME.modeEnv.mission=MISSION
else
GAME.modeEnv.mission=nil
end
end
function loadGame(M,ifQuickPlay)--Load a mode and go to game scene
freshDate()
if legalGameTime()then
if MODES[M].score then STAT.lastPlay=M end
@@ -462,6 +475,36 @@ function loadGame(M,ifQuickPlay)
SFX.play("enter")
end
end
function resetPlayerPosition()--Set position & size for every players
local L=PLAYERS.alive
L[1]:setPosition(340,75)
if #L<=5 then
if L[2]then L[2]:setPosition(965,390,.5)end
if L[3]then L[3]:setPosition(965,30,.5)end
if L[4]then L[4]:setPosition(20,390,.5)end
if L[5]then L[5]:setPosition(20,30,.5)end
elseif #L==49 then
local n=2
for i=1,4 do for j=1,6 do
L[n]:setPosition(78*i-54,115*j-98,.09)
n=n+1
end end
for i=9,12 do for j=1,6 do
L[n]:setPosition(78*i+267,115*j-98,.09)
n=n+1
end end
elseif #L==99 then
local n=2
for i=1,7 do for j=1,7 do
L[n]:setPosition(46*i-36,97*j-72,.068)
n=n+1
end end
for i=15,21 do for j=1,7 do
L[n]:setPosition(46*i+264,97*j-72,.068)
n=n+1
end end
end
end
local function tick_showMods()
local time=0
while true do
@@ -506,6 +549,7 @@ function resetGameData(replaying)
destroyPlayers()
GAME.curMode.load()
resetPlayerPosition()
restoreVirtualKey()
if GAME.modeEnv.task then
for i=1,#PLAYERS do
@@ -544,7 +588,7 @@ function gameStart()
P:popNext()
end
end
function scoreValid()
function scoreValid()--Check if any unranked mods are activated
for _,M in next,GAME.mod do
if M.unranked then
return false
@@ -552,6 +596,22 @@ function scoreValid()
end
return true
end
--[[
Byte data format: (1 byte each period)
KeyID, dt, KeyID, dt, ......
KeyID range from 1 to 20, negative when release key
dt from 0 to infinity, 0~254 when 0~254, read next byte as dt(if there is an 255, add next byte to dt as well)
Example:
1,6, -1,20, 2,0, -2,255,0, 4,255,255,255,62, ......
This means:
Press key1 at 6f
Release key1 at 26f (6+20)
Press key2 at the same time(26+0)
Release key 2 after 255+0 frame
Press key 4 after 255+255+255+62 frame
......
]]
function dumpRecording(list)
local out=""
local buffer=""

View File

@@ -223,7 +223,7 @@ RANKS={sprint_10=0}
SETTING={
--Game
das=10,arr=2,
das=10,arr=2,dascut=0,
sddas=0,sdarr=2,
ihs=true,irs=true,ims=true,
maxNext=6,
@@ -242,7 +242,7 @@ SETTING={
--Graphic
block=true,ghost=.3,center=1,
smooth=true,grid=false,
smooth=true,grid=.16,
bagLine=false,
lockFX=2,
dropFX=2,
@@ -264,9 +264,9 @@ SETTING={
--Sound
sfx=1,
spawn=0,
spawn=.3,
bgm=.7,
stereo=.6,
stereo=.7,
vib=0,
voc=0,
cv="miya",
@@ -277,8 +277,8 @@ SETTING={
VKSwitch=false,--If disp
VKTrack=false,--If tracked
VKDodge=false,--If dodge
VKTchW=3,--Touch-Pos Weight
VKCurW=4,--Cur-Pos Weight
VKTchW=.3,--Touch-Pos Weight
VKCurW=.4,--Cur-Pos Weight
VKIcon=true,--If disp icon
VKAlpha=.3,
}

View File

@@ -4,7 +4,7 @@ return{
{"新人须知",
"xinren new noob readme",
"help",
"致想深入玩下去的新人:\n\t两大根本原则:\n\t\t1.选手感好的版本(top/jstris/tetrjs/tech),别用编程练习渣版本\n\t\t2.踏实打好基础(next预判稳定消四)别只想着炫酷T旋\n\t两大主要技巧:\n\t\t1.熟悉初始位置以及到各个位置的初始操作\n\t\t2.提前计算好下一块能放哪\n(推荐阅读专栏)一位块圈dalao给新人的话\n\n[点击右下角的按钮打开链接]",
"致想深入玩下去的新人:\n\t两大根本原则:\n\t\t1.选手感好的版本(tetrio/jstris/top/tetrjs/tech),别用编程练习渣版本\n\t\t2.踏实打好基础(next预判稳定消四)别只想着炫酷T旋\n\t两大主要技巧:\n\t\t1.熟悉初始位置以及到各个位置的初始操作\n\t\t2.提前计算好下一块能放哪\n(推荐阅读专栏)一位块圈dalao给新人的话\n\n[点击右下角的按钮打开链接]",
"http://bilibili.com/read/cv2352939",
},
{"HardDrop wiki",
@@ -90,7 +90,7 @@ return{
{"TGM",
"tgm tetrisgrandmaster",
"game",
"一个街机平台方块系列S13/GM等称号出自该系列可以在win平台运行\n\n其中TGM3目前玩得最普遍部分模式说明:\nMaster:大师模式有段位评价拿到更高段位点的要求非消一的连击和消四字幕战中消除和通关每100的前70小于【标准时间上一个0~70秒数+2】中小的一个每100总用时不能超过限定值不然取消上一个方法的加分并反扣点数;到500若没有进标准时间会强制结束游戏(称为铁门);字幕战有两个难度,半隐和全隐,后者必须拿到几乎全部的段位点才能进,消除奖励的段位点也更多。\nShirase:死亡模式类似于techmino中的20G-极限开局就是高速20G500和1000有铁门500开始底下开始涨垃圾行1000开始出现骨块1300通关进入大方块字幕战;段位结算:每通100加1段从S1到S13如果通关了字幕战就会有金色的S13\n\n更多内容详见链接",
"一个街机平台方块系列S13/GM等称号出自该系列可以在win平台运行\n\n其中TGM3目前玩得最普遍部分模式说明:\nMaster:大师模式有段位评价拿到更高段位点的要求非消一的连击和消四字幕战中消除和通关每100的前70小于【标准时间上一个0~70秒数+2】中小的一个每100总用时不能超过限定值(不然取消上一个方法的加分并反扣点数);到500若没有进标准时间会强制结束游戏(称为铁门);字幕战有两个难度,半隐和全隐,后者必须拿到几乎全部的段位点才能进,消除奖励的段位点也更多。\nShirase:死亡模式类似于techmino中的20G-极限开局就是高速20G500和1000有铁门500开始底下开始涨垃圾行1000开始出现骨块1300通关进入大方块字幕战;段位结算:每通100加1段从S1到S13如果通关了字幕战就会有金色的S13\n\n更多内容详见链接",
"http://139.199.75.237/TGMGUIDE/",
},
{"DTET",
@@ -602,7 +602,7 @@ return{
{"死亡判定",
"die death siwang",
"term",
"现代方块的死亡判定:\n1.新出现的方块和场地方块有重叠(窒息)(c4w比s4w强的原因因为被打进18行都不会窒息)\n2.方块锁定时完全在场地的外面\n3.所有东西的总高度超出40。\n\n注:本游戏使用的死亡判定没有上述的第二条第三条的40改成42",
"现代方块普遍使用的死亡判定:\n1.新出现的方块和场地方块有重叠(窒息)(c4w比s4w强的原因因为被打进18行都不会窒息)\n2.方块锁定时完全在场地的外面\n3.所有东西的总高度超出40。\n\n注:本游戏使用的死亡判定不包含上述的第二条,并且第三条的40改成42",
},
{"下落速度",
"drop speed",
@@ -634,6 +634,11 @@ return{
"term",
"打字时按住o你会看到:Ooooooooooo\n在时间轴上:O-----------o-o-o-o-o-o-o-o-o-o\n-----------就是das长度-就是arr长度",
},
{"DAS打断",
"dascut",
"term",
"在放了一个方块后会取消/重置/减小das计时器让自动移动不会立刻生效减少移动键松开晚了导致下一块一出现就立即开始移动的情况",
},
{"bag7",
"bag7bag",
"term",
@@ -657,7 +662,7 @@ return{
{"Hypertap",
"hypertap",
"term",
"快速震动手指,实现比长按更快速+灵活的高速单点移动",
"快速震动手指,实现比长按更快速+灵活的高速单点移动,主要在经典块的高难度下(因为das不可调而且特别慢高速下很容易md导致失败此时手动连点就比自动移动更快)或者受特殊情况限制不适合用自动移动时使用。会使用这个技术的人被称为Hypertapper",
},
{"TOP攻击表",
"top attack",
@@ -699,7 +704,7 @@ return{
"term",
"指长时间不来i方块(长条)但在现代方块使用的bag7出块规则下干旱几乎不可能平均7块就会有一个i理论极限两个i最远中间隔12块",
},
{"MPH mode",
{"MPH模式",
"mph",
"term",
"一个游戏模式:\nMemoryless Previewless Holdless\n纯随机+无next+无hold一个非常考验玩家反应速度的模式",
@@ -717,13 +722,13 @@ return{
{"ZZZbot",
"zzzbot",
"term",
"一个ai的名字(就跟alphaGo一样)\n由研究群群友奏之章开发,在各游戏表现都很不错",
"一个ai的名字(就跟alphaGo一样)\n由研究群群友奏之章开发,重新调参后在各游戏平台上的表现都很不错",
},
{"研究群",
{"研究群",
"yanjiu study",
"other",
"俄罗斯方块·[研究]群号112897780“中国俄罗斯方块群”",
"俄罗斯方块·[研究]群号112897780“中国俄罗斯方块群”",
},
{"茶服",
"chafu study",
@@ -910,7 +915,7 @@ return{
{"吴淞昊",
"electric modian zhunbei 283",
"name",
"【研究群】「T283」\n国内一流高端隐形方块玩家,上过最强大脑",
"【研究群】「T283」\n国内一流隐形方块玩家,上过最强大脑",
"https://space.bilibili.com/17583394",
},
{"他天一",

View File

@@ -96,6 +96,7 @@ return{
-- chatRemain="人数:",
-- chatStart="------消息的开头------",
-- chatHistory="------以上是历史消息------",
-- chatQuit="再按一次退出",
errorMsg="An error has occurred and Techmino needs to restart.\nError info has been created, and you can send it to the author.",
@@ -294,7 +295,7 @@ return{
title="Control Settings",
preview="Preview",
das="DAS",arr="ARR",
das="DAS",arr="ARR",dascut="DAS cut",
sddas="Soft Drop DAS",sdarr="Soft Drop ARR",
ihs="Initial Hold",
irs="Initial Rotation",

View File

@@ -99,6 +99,7 @@ return{
-- chatRemain="人数:",
-- chatStart="------消息的开头------",
-- chatHistory="------以上是历史消息------",
-- chatQuit="再按一次退出",
errorMsg="Une erreur est survenue et Techmino doit redémarrer.\nDes informations concernant l'erreur ont été créées, et vous pouvez les envoyer au créateur.",
@@ -254,13 +255,13 @@ return{
game="Jeu→",
block="Dessiner le bloc",
ghost="Pièce fantôme",
center="Centre",
smooth="Chute fluide",
grid="Grille",
bagLine="Ligne du Sac",
ghost="Pièce fantôme",
grid="Grille",
center="Centre",
lockFX="Effets de verrouillage",
dropFX="Effets de chute",
moveFX="Effets de déplacement",
@@ -296,7 +297,7 @@ return{
title="Paramètres de contrôle",
preview="Aperçu",
das="DAS",arr="ARR",
das="DAS",arr="ARR",-- dascut="DAS cut",
sddas="DAS de chute rapide",sdarr="ARR de chute rapide",
ihs="Réserve Initiale",
irs="Rotation Initiale",

View File

@@ -100,6 +100,7 @@ return{
-- chatRemain="人数:",
-- chatStart="------消息的开头------",
-- chatHistory="------以上是历史消息------",
-- chatQuit="再按一次退出",
errorMsg="Ha ocurrido un error y Techmino necesita reiniciarse.\nSe creó un registro de error, puedes enviarlo al autor.",
@@ -256,13 +257,13 @@ return{
game="Juego→",
block="Dibujar Bloques",
ghost="Fantasma",
center="Centrar",
smooth="Caída Fluida",
grid="Grilla",
bagLine="Línea de Bag de Pzas.",
ghost="Fantasma",
grid="Grilla",
center="Centrar",
lockFX="FX Vis. de Bloqueo",
dropFX="FX Vis. de Caída",
moveFX="FX Vis. de Movim.",
@@ -297,7 +298,7 @@ return{
title="Ajustes de Controles",
preview="Ejemplo",
das="DAS",arr="ARR",
das="DAS",arr="ARR",-- dascut="DAS cut",
sddas="DAS de C. Ráp.",sdarr="ARR de C. Rápida",
ihs="Resv. Inicial",
irs="Rot. Inicial",

View File

@@ -161,13 +161,13 @@ return{
game="Game→",
block="==↓==",
ghost="__↓__",
center="+",
smooth="~~↓~~",
grid="#",
bagLine="123|123",
ghost="__↓__",
grid="#",
center="+",
lockFX="↓_~",
dropFX="↓~",
moveFX="←→~",
@@ -203,7 +203,7 @@ return{
title="[~~]",
preview="?:",
das="x---x x x",arr="x x-x-x",
das="x---x x x",arr="x x-x-x",dascut="x x ↓___x x",
sddas="↓---↓ ↓ ↓",sdarr="↓ ↓-↓-↓",
ihs="![ ]",
irs="!''",

View File

@@ -97,6 +97,7 @@ return{
chatRemain="人数:",
chatStart="------消息的开头------",
chatHistory="------以上是历史消息------",
chatQuit="再按一次退出",
errorMsg="Techmino遭受了雷击,需要重新启动.\n我们已收集了一些错误信息,你可以向作者进行反馈.",
@@ -276,13 +277,13 @@ return{
game="游戏设置→",
block="方块可见",
ghost="阴影透明度",
center="旋转中心透明度",
smooth="平滑下落",
grid="网格",
bagLine="包分界线",
ghost="阴影透明度",
grid="网格",
center="旋转中心透明度",
lockFX="锁定特效",
dropFX="下落特效",
moveFX="移动特效",
@@ -319,7 +320,7 @@ return{
title="控制设置",
preview="预览",
das="DAS",arr="ARR",
das="DAS",arr="ARR",dascut="DAS打断",
sddas="软降DAS",sdarr="软降ARR",
ihs="提前Hold",
irs="提前旋转",
@@ -743,7 +744,12 @@ return{
"3.1415926535897932384",
"40行世界纪录:15.654s",
"626r/s",
"0next 0hold.",
"1next 0hold",
"1next 1hold!",
"3next 1hold?",
"6next 1hold!",
"6next 6hold?!",
"7宽三SZ架空捐了解一下",
"把手机调到特殊的日期也不会发生什么的(真的",
"报时机器人:新的一天开始了",
@@ -804,7 +810,6 @@ return{
"请不要一直看主页机器人玩,可能比较费电",
"请勿大力敲打设备!敲坏了就没有Techmino玩了",
"去玩别的方块的时候记得没有Ospin!",
"如果有不认识的术语,可以去 帮助-词典 自行查询",
"扫雷好玩!",
"少女祈祷中",
"适度游戏益脑,沉迷游戏伤身,合理安排时间,享受健康生活",
@@ -870,7 +875,7 @@ return{
"Z块等身抱枕来一个(x",
{COLOR.B,"COLOR.blue"},
{COLOR.C,"Xspin",COLOR.W,"是个啥玩意"},
{COLOR.cyan,"PU",COLOR.grape,"RE♦"},
{COLOR.cyan,"PURE ",COLOR.grape,"MEMORY□"},
{COLOR.cyan,"COLOR.cyan"},
{COLOR.cyan,"VVVVVV好玩!"},
{COLOR.fire,"COLOR.fire"},
@@ -899,7 +904,7 @@ return{
{COLOR.lGrey,"你有一个好"},
{COLOR.lR,"Z ",COLOR.lG,"S ",COLOR.lSea,"J ",COLOR.lOrange,"L ",COLOR.lGrape,"T ",COLOR.lY,"O ",COLOR.lC,"I"},
{COLOR.lSea,"茶娘",COLOR.W," 可爱!"},
{COLOR.lSky,"Naki",COLOR.W," 可爱!"},
{COLOR.lGrape,"Naki",COLOR.W," 可爱!"},
{COLOR.lY,"暂定段位:GM"},
{COLOR.lY,"暂定段位:MM"},
{COLOR.lY,"COOL!!"},

View File

@@ -200,7 +200,6 @@ do--drawableTextLoad, drawableText
"combo","maxcmb",
"pc","ko",
"VKTchW","VKOrgW","VKCurW",
"noScore","highScore",
}
drawableText={
@@ -224,7 +223,6 @@ do--drawableTextLoad, drawableText
win=T(120),finish=T(120),
gameover=T(100),pause=T(120),
VKTchW=T(30),VKOrgW=T(30),VKCurW=T(30),
noScore=T(45),highScore=T(30),
}
end

View File

@@ -37,18 +37,18 @@ return{
},
slowMark=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
PLAYERS[1].modeData.event="M7"
end,
mesDisp=function(P)
mText(drawableText.line,69,370)
mText(drawableText.techrash,69,490)
mText(drawableText.grade,69,240)
mText(drawableText.line,69,300)
mText(drawableText.techrash,69,420)
mText(drawableText.grade,69,170)
setFont(55)
mStr(P.modeData.event,69,180)
mStr(P.modeData.event,69,110)
setFont(75)
mStr(P.stat.row,69,290)
mStr(P.stat.clears[4],69,410)
mStr(P.stat.row,69,220)
mStr(P.stat.clears[4],69,340)
end,
score=function(P)return{P.modeData.point,P.stat.score}end,
scoreDisp=function(D)return sectionName[int(D[1]*.1)+1].." "..D[2]end,

View File

@@ -39,14 +39,14 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(55)
mStr(P.modeData.event,69,270)
mStr("22",69,390)
mText(drawableText.wave,69,330)
mText(drawableText.nextWave,69,450)
mStr(P.modeData.event,69,200)
mStr("22",69,320)
mText(drawableText.wave,69,260)
mText(drawableText.nextWave,69,380)
end,
score=function(P)return{P.modeData.event,P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(D[2])end,

View File

@@ -46,18 +46,18 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(55)
mStr(P.modeData.event,69,270)
mStr(P.modeData.event,69,200)
mStr(
P.modeData.event<10 and 20
or P.modeData.event<20 and 24
or 28
,69,390)
mText(drawableText.wave,69,330)
mText(drawableText.nextWave,69,450)
,69,320)
mText(drawableText.wave,69,260)
mText(drawableText.nextWave,69,380)
end,
score=function(P)return{P.modeData.event,P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(D[2])end,

View File

@@ -10,7 +10,7 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
score=function(P)return{P.modeData.event,P.stat.finesseRate*25/P.stat.piece}end,
scoreDisp=function(D)return D[1].."Stage "..format("%.2f",D[2]).."%"end,

View File

@@ -11,14 +11,14 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
mText(drawableText.line,69,370)
mText(drawableText.techrash,69,490)
mText(drawableText.line,69,300)
mText(drawableText.techrash,69,420)
setFont(75)
mStr(P.stat.row,69,290)
mStr(P.stat.clears[4],69,410)
mStr(P.stat.row,69,220)
mStr(P.stat.clears[4],69,340)
end,
score=function(P)return{min(P.stat.row,200),P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,

View File

@@ -15,16 +15,16 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
mText(drawableText.line,69,370)
mText(drawableText.techrash,69,490)
mText(drawableText.line,69,300)
mText(drawableText.techrash,69,420)
setFont(75)
mStr(P.stat.row,69,290)
mStr(P.stat.clears[4],69,410)
mStr(P.stat.row,69,220)
mStr(P.stat.clears[4],69,340)
gc.setColor(1,1,1,.2)
gc.draw(IMG.electric,124,176,0,2.6)
gc.draw(IMG.electric,124,106,0,2.6)
end,
score=function(P)return{min(P.stat.row,200),P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,

View File

@@ -16,16 +16,16 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
mText(drawableText.line,69,370)
mText(drawableText.techrash,69,490)
mText(drawableText.line,69,300)
mText(drawableText.techrash,69,420)
setFont(75)
mStr(P.stat.row,69,290)
mStr(P.stat.clears[4],69,410)
mStr(P.stat.row,69,220)
mStr(P.stat.clears[4],69,340)
gc.setColor(1,1,1,.2)
gc.draw(IMG.electric,124,176,0,2.6)
gc.draw(IMG.electric,124,106,0,2.6)
end,
score=function(P)return{min(P.stat.row,200),P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,

View File

@@ -12,16 +12,16 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
mText(drawableText.line,69,370)
mText(drawableText.techrash,69,490)
mText(drawableText.line,69,300)
mText(drawableText.techrash,69,420)
setFont(75)
mStr(P.stat.row,69,290)
mStr(P.stat.clears[4],69,410)
mStr(P.stat.row,69,220)
mStr(P.stat.clears[4],69,340)
gc.setColor(1,1,1,.2)
gc.draw(IMG.electric,124,176,0,2.6)
gc.draw(IMG.electric,124,106,0,2.6)
end,
score=function(P)return{min(P.stat.row,200),P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,

View File

@@ -15,16 +15,16 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
mText(drawableText.line,69,370)
mText(drawableText.techrash,69,490)
mText(drawableText.line,69,300)
mText(drawableText.techrash,69,420)
setFont(75)
mStr(P.stat.row,69,290)
mStr(P.stat.clears[4],69,410)
mStr(P.stat.row,69,220)
mStr(P.stat.clears[4],69,340)
gc.setColor(1,1,1,.2)
gc.draw(IMG.electric,124,176,0,2.6)
gc.draw(IMG.electric,124,106,0,2.6)
end,
score=function(P)return{min(P.stat.row,100),P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,

View File

@@ -16,7 +16,7 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
if SETTING.spawn==0 then
LOG.print(text.switchSpawnSFX,COLOR.yellow)
end
@@ -34,7 +34,7 @@ return{
--Frame
gc.setColor(.5,.5,.5)
gc.push("transform")
gc.translate(150,70)
gc.translate(150,0)
gc.rectangle("line",-1,-11,302,612)--Boarder
gc.rectangle("line",301,-3,15,604)--AtkBuffer boarder
gc.rectangle("line",-16,-3,15,604)--B2b bar boarder
@@ -45,16 +45,16 @@ return{
--Figures
local t=Timer()
gc.setColor(1,1,1,.5+.2*sin(t))
gc.draw(IMG.hbm,-276,-16,0,1.5)
gc.draw(IMG.electric,476,212,0,2.6)
gc.draw(IMG.hbm,-276,-86,0,1.5)
gc.draw(IMG.electric,476,142,0,2.6)
--Texts
gc.setColor(.8,.8,.8)
mText(drawableText.line,69,370)
mText(drawableText.techrash,69,490)
mText(drawableText.line,69,300)
mText(drawableText.techrash,69,420)
setFont(75)
mStr(P.stat.row,69,290)
mStr(P.stat.clears[4],69,410)
mStr(P.stat.row,69,220)
mStr(P.stat.clears[4],69,340)
end,
score=function(P)return{min(P.stat.row,40),P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,

View File

@@ -27,7 +27,7 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
local P=PLAYERS[1]
local F=P.field
for i=1,24 do
@@ -46,10 +46,10 @@ return{
end,
mesDisp=function(P)
setFont(45)
mStr(P.combo,69,380)
mStr(P.modeData.point,69,470)
mText(drawableText.combo,69,428)
mText(drawableText.maxcmb,69,520)
mStr(P.combo,69,310)
mStr(P.modeData.point,69,400)
mText(drawableText.combo,69,358)
mText(drawableText.maxcmb,69,450)
end,
score=function(P)return{min(P.modeData.point,100),P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." Combo "..toTime(D[2])end,

View File

@@ -25,7 +25,7 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
local P=PLAYERS[1]
local F=P.field
for i=1,24 do
@@ -44,10 +44,10 @@ return{
end,
mesDisp=function(P)
setFont(45)
mStr(P.combo,69,380)
mStr(P.modeData.point,69,470)
mText(drawableText.combo,69,428)
mText(drawableText.maxcmb,69,520)
mStr(P.combo,69,310)
mStr(P.modeData.point,69,400)
mText(drawableText.combo,69,358)
mText(drawableText.maxcmb,69,450)
end,
score=function(P)return{min(P.modeData.point,100),P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." Combo "..toTime(D[2])end,

View File

@@ -34,17 +34,17 @@ return{
},
slowMark=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(75)
local r=P.gameEnv.target*.1
mStr(r<11 and 18 or r<22 and r+8 or r==22 and"00"or r==23 and"0a"or format("%x",r*10-220),69,280)
mText(drawableText.speedLV,69,360)
mStr(r<11 and 18 or r<22 and r+8 or r==22 and"00"or r==23 and"0a"or format("%x",r*10-220),69,210)
mText(drawableText.speedLV,69,290)
setFont(45)
mStr(P.stat.row,69,390)
mStr(P.gameEnv.target,69,440)
gc.rectangle("fill",25,445,90,4)
mStr(P.stat.row,69,320)
mStr(P.gameEnv.target,69,370)
gc.rectangle("fill",25,375,90,4)
end,
score=function(P)return{P.stat.score,P.stat.row}end,
scoreDisp=function(D)return D[1].." "..D[2].." Lines"end,

View File

@@ -38,7 +38,7 @@ local function checkClear(P)
P.field[_],P.visTime[_]=nil
end
setField(P,P.modeData.point+1)
SYSFX.newShade(1.4,.6,.8,.6,P.x+150*P.size,P.y+60*P.size,300*P.size,610*P.size)
SYSFX.newShade(1.4,P.absFieldX,P.absFieldY,300*P.size,610*P.size,.6,.8,.6)
SFX.play("blip_1")
else
P:win("finish")
@@ -49,51 +49,37 @@ return{
color=COLOR.white,
env={},
load=function()
for k,v in next,CUSTOMENV do
GAME.modeEnv[k]=v
end
if BAG[1]then
GAME.modeEnv.bag=BAG
else
GAME.modeEnv.bag=nil
end
if MISSION[1]then
GAME.modeEnv.mission=MISSION
else
GAME.modeEnv.mission=nil
end
applyCustomGame()
GAME.modeEnv.dropPiece=PLY.check_lineReach
for y=1,20 do
if notAir(FIELD[1][y])then
--Switch clear mode on
--Switch clear sprint mode on
GAME.modeEnv.dropPiece=checkClear
break
end
end
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
local L=GAME.modeEnv.opponent
if L~=0 then
GAME.modeEnv.target=nil
if L<6 then
PLY.newAIPlayer(2,965,360,.5,AIBUILDER("9S",2*L))
PLY.newAIPlayer(2,AIBUILDER("9S",2*L))
else
PLY.newAIPlayer(2,965,360,.5,AIBUILDER("CC",2*L-11,int(L*.5-1.5),true,4000*L))
PLY.newAIPlayer(2,AIBUILDER("CC",2*L-11,int(L*.5-1.5),true,4000*L))
end
end
for _,P in next,PLAYERS.alive do
setField(P,1)
end
GAME.modeEnv.bg=CUSTOMENV.bg
GAME.modeEnv.bgm=CUSTOMENV.bgm
end,
mesDisp=function(P)
setFont(55)
if P.gameEnv.target>1e10 then
mStr(P.stat.row,69,295)
mText(drawableText.line,69,360)
mStr(P.stat.row,69,225)
mText(drawableText.line,69,290)
else
local R=P.gameEnv.target-P.stat.row
mStr(R>=0 and R or 0,69,310)
mStr(R>=0 and R or 0,69,240)
end
end,
}

View File

@@ -22,7 +22,7 @@ local function puzzleCheck(P)
FREEROW.discard(P.visTime[_])
P.field[_],P.visTime[_]=nil
end
SYSFX.newShade(1.4,.3,1,.3,P.x+150*P.size,P.y+60*P.size,300*P.size,610*P.size)
SYSFX.newShade(1.4,P.absFieldX,P.absFieldY,300*P.size,610*P.size,.3,1,.3)
SFX.play("reach")
P.modeData.event=0
else
@@ -38,44 +38,30 @@ return{
dropPiece=puzzleCheck,
},
load=function()
for k,v in next,CUSTOMENV do
GAME.modeEnv[k]=v
end
if BAG[1]then
GAME.modeEnv.bag=BAG
else
GAME.modeEnv.bag=nil
end
if MISSION[1]then
GAME.modeEnv.mission=MISSION
else
GAME.modeEnv.mission=nil
end
PLY.newPlayer(1,340,15)
applyCustomGame()
PLY.newPlayer(1)
local L=GAME.modeEnv.opponent
if L~=0 then
GAME.modeEnv.target=nil
if L<6 then
PLY.newAIPlayer(2,965,360,.5,AIBUILDER("9S",2*L))
PLY.newAIPlayer(2,AIBUILDER("9S",2*L))
else
PLY.newAIPlayer(2,965,360,.5,AIBUILDER("CC",2*L-11,int(L*.5-1.5),true,4000*L))
PLY.newAIPlayer(2,AIBUILDER("CC",2*L-11,int(L*.5-1.5),true,4000*L))
end
end
GAME.modeEnv.bg=CUSTOMENV.bg
GAME.modeEnv.bgm=CUSTOMENV.bgm
end,
mesDisp=function(P)
local dx,dy=P.fieldOff.x,P.fieldOff.y
setFont(55)
mStr(P.stat.row,69,295)
mText(drawableText.line,69,360)
mStr(P.stat.row,69,225)
mText(drawableText.line,69,290)
if P.modeData.event==0 then
local m=puzzleMark
local F=FIELD[P.modeData.point+1]
for y=1,20 do for x=1,10 do
local T=F[y][x]
if T~=0 then
gc.draw(m[T],150+30*x-30+dx,70+600-30*y+dy)
gc.draw(m[T],150+30*x-30+dx,600-30*y+dy)
end
end end
end

View File

@@ -11,19 +11,19 @@ return{
while true do
coroutine.yield()
if P.control and SCN.cur=="play"then
P.modeData.counter=P.modeData.counter+1
local t=240-2*P.modeData.event
if P.modeData.counter>=t then
P.modeData.counter=0
local D=P.modeData
D.counter=D.counter+1
local t=math.max(240-2*D.event,40)
if D.counter>=t then
D.counter=0
for _=1,4 do
P.atkBuffer[#P.atkBuffer+1]={pos=P:RND(10),amount=1,countdown=5*t,cd0=5*t,time=0,sent=false,lv=2}
end
P.atkBuffer.sum=P.atkBuffer.sum+4
P.stat.recv=P.stat.recv+4
local D=P.modeData
if D.event<75 then
D.event=D.event+1
D.point=int(144e3/(240-2*D.event))*.1
D.event=D.event+1
if D.event<=75 then
D.point=int(144e3/t)*.1
if D.event==25 then
P:showTextF(text.great,0,-140,100,"appear",.6)
P.gameEnv.pushSpeed=3
@@ -45,14 +45,14 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(55)
mStr(P.modeData.event,69,270)
mStr(P.modeData.point,69,390)
mText(drawableText.wave,69,330)
mText(drawableText.rpm,69,450)
mStr(P.modeData.event,69,200)
mStr(P.modeData.point,69,320)
mText(drawableText.wave,69,260)
mText(drawableText.rpm,69,380)
end,
score=function(P)return{P.modeData.event,P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(D[2])end,

View File

@@ -11,19 +11,19 @@ return{
while true do
coroutine.yield()
if P.control and SCN.cur=="play"then
P.modeData.counter=P.modeData.counter+1
local t=360-P.modeData.event*2
if P.modeData.counter>=t then
P.modeData.counter=0
local D=P.modeData
D.counter=D.counter+1
local t=math.max(360-D.event*2,60)
if D.counter>=t then
D.counter=0
for _=1,3 do
P.atkBuffer[#P.atkBuffer+1]={pos=P:RND(2,9),amount=1,countdown=2*t,cd0=2*t,time=0,sent=false,lv=1}
end
P.atkBuffer.sum=P.atkBuffer.sum+3
P.stat.recv=P.stat.recv+3
local D=P.modeData
if D.event<90 then
D.event=D.event+1
D.point=int(108e3/(360-D.event*2))*.1
D.event=D.event+1
if D.event<=90 then
D.point=int(108e3/t)*.1
if D.event==25 then
P:showTextF(text.great,0,-140,100,"appear",.6)
P.gameEnv.pushSpeed=2
@@ -45,14 +45,14 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(55)
mStr(P.modeData.event,69,270)
mStr(P.modeData.point,69,390)
mText(drawableText.wave,69,330)
mText(drawableText.rpm,69,450)
mStr(P.modeData.event,69,200)
mStr(P.modeData.point,69,320)
mText(drawableText.wave,69,260)
mText(drawableText.rpm,69,380)
end,
score=function(P)return{P.modeData.event,P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(D[2])end,

View File

@@ -12,7 +12,7 @@ return{
bg="bg1",bgm="way",
},
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
local P=PLAYERS[1]
for _=1,10 do
P:garbageRise(21,1,P:getHolePos())
@@ -21,7 +21,7 @@ return{
end,
mesDisp=function(P)
setFont(55)
mStr(10-P.stat.dig,69,335)
mStr(10-P.stat.dig,69,265)
end,
score=function(P)return{P.stat.frame/60,P.stat.piece}end,
scoreDisp=function(D)return toTime(D[1]).." "..D[2].." Pieces"end,

View File

@@ -15,7 +15,7 @@ return{
bg="bg2",bgm="way",
},
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
local P=PLAYERS[1]
for _=1,10 do
P:garbageRise(21,1,P:getHolePos())
@@ -24,7 +24,7 @@ return{
end,
mesDisp=function(P)
setFont(55)
mStr(100-P.stat.dig,69,335)
mStr(100-P.stat.dig,69,265)
end,
score=function(P)return{P.stat.frame/60,P.stat.piece}end,
scoreDisp=function(D)return toTime(D[1]).." "..D[2].." Pieces"end,

View File

@@ -15,7 +15,7 @@ return{
bg="bg1",bgm="way",
},
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
local P=PLAYERS[1]
for _=1,10 do
P:garbageRise(21,1,P:getHolePos())
@@ -24,7 +24,7 @@ return{
end,
mesDisp=function(P)
setFont(55)
mStr(40-P.stat.dig,69,335)
mStr(40-P.stat.dig,69,265)
end,
score=function(P)return{P.stat.frame/60,P.stat.piece}end,
scoreDisp=function(D)return toTime(D[1]).." "..D[2].." Pieces"end,

View File

@@ -15,7 +15,7 @@ return{
bg="bg2",bgm="way",
},
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
local P=PLAYERS[1]
for _=1,10 do
P:garbageRise(21,1,P:getHolePos())
@@ -24,7 +24,7 @@ return{
end,
mesDisp=function(P)
setFont(55)
mStr(400-P.stat.dig,69,335)
mStr(400-P.stat.dig,69,265)
end,
score=function(P)return{P.stat.frame/60,P.stat.piece}end,
scoreDisp=function(D)return toTime(D[1]).." "..D[2].." Pieces"end,

View File

@@ -23,12 +23,12 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(65)
mStr(P.modeData.event,69,380)
mText(drawableText.wave,69,445)
mStr(P.modeData.event,69,310)
mText(drawableText.wave,69,375)
end,
score=function(P)return{P.modeData.event,P.stat.row}end,
scoreDisp=function(D)return D[1].." Waves "..D[2].." Lines"end,

View File

@@ -22,12 +22,12 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(65)
mStr(P.modeData.event,69,380)
mText(drawableText.wave,69,445)
mStr(P.modeData.event,69,310)
mText(drawableText.wave,69,375)
end,
score=function(P)return{P.modeData.event,P.stat.row}end,
scoreDisp=function(D)return D[1].." Waves "..D[2].." Lines"end,

View File

@@ -99,12 +99,12 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(70)
local R=100-P.stat.row
mStr(R>=0 and R or 0,69,335)
mStr(R>=0 and R or 0,69,265)
end,
score=function(P)return{min(P.stat.row,100),P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,
@@ -114,8 +114,8 @@ return{
if L>=100 then
local T=P.stat.frame/60
return
T<=90 and 5 or
T<=105 and 4 or
T<=100 and 5 or
T<=120 and 4 or
T<=160 and 3 or
T<=240 and 2 or
1

View File

@@ -13,12 +13,12 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(70)
local R=100-P.stat.row
mStr(R>=0 and R or 0,69,335)
mStr(R>=0 and R or 0,69,265)
end,
score=function(P)return{min(P.stat.row,100),P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,
@@ -28,10 +28,10 @@ return{
if L>=100 then
local T=P.stat.frame/60
return
T<=65 and 5 or
T<=80 and 5 or
T<=100 and 4 or
T<=145 and 3 or
T<=220 and 2 or
T<=150 and 3 or
T<=210 and 2 or
1
else
return

View File

@@ -7,13 +7,13 @@ return{
bg="glow",bgm="infinite",
},
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(45)
mStr(format("%.1f",P.stat.atk),69,260)
mStr(format("%.2f",P.stat.atk/P.stat.row),69,380)
mText(drawableText.atk,69,313)
mText(drawableText.eff,69,433)
mStr(format("%.1f",P.stat.atk),69,190)
mStr(format("%.2f",P.stat.atk/P.stat.row),69,310)
mText(drawableText.atk,69,243)
mText(drawableText.eff,69,363)
end,
}

View File

@@ -36,7 +36,7 @@ return{
bg="wing",bgm="infinite",
},
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
local P=PLAYERS[1]
for _=1,8 do
P:garbageRise(13,1,P:RND(10))
@@ -45,11 +45,11 @@ return{
end,
mesDisp=function(P)
setFont(45)
mStr(P.stat.dig,69,260)
mStr(P.stat.atk,69,380)
mStr(format("%.2f",P.stat.atk/P.stat.row),69,490)
mText(drawableText.line,69,313)
mText(drawableText.atk,69,433)
mText(drawableText.eff,69,545)
mStr(P.stat.dig,69,190)
mStr(P.stat.atk,69,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),69,420)
mText(drawableText.line,69,243)
mText(drawableText.atk,69,363)
mText(drawableText.eff,69,475)
end,
}

View File

@@ -28,13 +28,13 @@ return{
pauseLimit=true,
slowMark=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(45)
mStr(P.stat.row,69,390)
mStr(P.gameEnv.target,69,440)
gc.rectangle("fill",25,445,90,4)
mStr(P.stat.row,69,320)
mStr(P.gameEnv.target,69,370)
gc.rectangle("fill",25,375,90,4)
end,
score=function(P)return{math.min(P.stat.row,200),P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,

View File

@@ -25,13 +25,13 @@ return{
pauseLimit=true,
slowMark=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(45)
mStr(P.stat.row,69,390)
mStr(P.modeData.point+10,69,440)
gc.rectangle("fill",25,445,90,4)
mStr(P.stat.row,69,320)
mStr(P.modeData.point+10,69,370)
gc.rectangle("fill",25,375,90,4)
end,
score=function(P)return{math.min(P.stat.row,200),P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,

View File

@@ -32,13 +32,13 @@ return{
pauseLimit=true,
slowMark=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(45)
mStr(P.stat.row,69,390)
mStr(P.modeData.point+10,69,440)
gc.rectangle("fill",25,445,90,4)
mStr(P.stat.row,69,320)
mStr(P.modeData.point+10,69,370)
gc.rectangle("fill",25,375,90,4)
end,
score=function(P)return{math.min(P.stat.row,200),P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,

View File

@@ -54,13 +54,13 @@ return{
},
slowMark=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(45)
mStr(P.modeData.point,69,390)
mStr((P.modeData.event+1)*100,69,440)
gc.rectangle("fill",25,445,90,4)
mStr(P.modeData.point,69,320)
mStr((P.modeData.event+1)*100,69,370)
gc.rectangle("fill",25,375,90,4)
end,
score=function(P)return{P.modeData.point,P.stat.frame/60}end,
scoreDisp=function(D)return D[1].."P "..toTime(D[2])end,

View File

@@ -56,13 +56,13 @@ return{
},
slowMark=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(45)
mStr(P.modeData.point,69,390)
mStr((P.modeData.event+1)*100,69,440)
gc.rectangle("fill",25,445,90,4)
mStr(P.modeData.point,69,320)
mStr((P.modeData.event+1)*100,69,370)
gc.rectangle("fill",25,375,90,4)
end,
score=function(P)return{P.modeData.point,P.stat.frame/60}end,
scoreDisp=function(D)return D[1].."P "..toTime(D[2])end,

View File

@@ -53,13 +53,13 @@ return{
},
slowMark=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(45)
mStr(P.modeData.point,69,390)
mStr((P.modeData.event+1)*100,69,440)
gc.rectangle("fill",25,445,90,4)
mStr(P.modeData.point,69,320)
mStr((P.modeData.event+1)*100,69,370)
gc.rectangle("fill",25,375,90,4)
end,
score=function(P)return{P.modeData.point,P.stat.frame/60}end,
scoreDisp=function(D)return D[1].."P "..toTime(D[2])end,

View File

@@ -52,7 +52,7 @@ local function check_LVup(P)
for i=1,10 do
P:createClearingFX(i,1.5)
end
SYSFX.newShade(2.5,1,1,1,P.x+150*P.size,P.y+370*P.size,300*P.size,300*P.size)
SYSFX.newShade(2.5,P.absFieldX,P.y+300*P.size,300*P.size,300*P.size)
ENV.lock=13
ENV.wait=6
@@ -146,13 +146,13 @@ return{
},
slowMark=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(45)
mStr(P.modeData.point,69,390)
mStr(P.gameEnv.target,69,440)
gc.rectangle("fill",25,445,90,4)
mStr(P.modeData.point,69,320)
mStr(P.gameEnv.target,69,370)
gc.rectangle("fill",25,375,90,4)
end,
score=function(P)return{P.result=="WIN"and 260 or P.modeData.point,P.stat.frame/60}end,
scoreDisp=function(D)return D[1].."P "..toTime(D[2])end,

View File

@@ -10,16 +10,16 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(45)
local R=100-P.stat.row
mStr(R>=0 and R or 0,69,320)
mStr(R>=0 and R or 0,69,250)
setFont(75)
mStr(P.stat.pc,69,420)
mText(drawableText.pc,69,502)
mStr(P.stat.pc,69,350)
mText(drawableText.pc,69,432)
end,
score=function(P)return{P.stat.pc,P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." PCs "..toTime(D[2])end,

View File

@@ -10,16 +10,16 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(45)
local R=100-P.stat.row
mStr(R>=0 and R or 0,69,320)
mStr(R>=0 and R or 0,69,250)
setFont(75)
mStr(P.stat.pc,69,420)
mText(drawableText.pc,69,502)
mStr(P.stat.pc,69,350)
mText(drawableText.pc,69,432)
end,
score=function(P)return{P.stat.pc,P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." PCs "..toTime(D[2])end,

View File

@@ -8,16 +8,16 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(45)
local R=100-P.stat.row
mStr(R>=0 and R or 0,69,320)
mStr(R>=0 and R or 0,69,250)
setFont(75)
mStr(P.stat.pc,69,420)
mText(drawableText.pc,69,502)
mStr(P.stat.pc,69,350)
mText(drawableText.pc,69,432)
end,
score=function(P)return{P.stat.pc,P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." PCs "..toTime(D[2])end,

View File

@@ -65,13 +65,13 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
check(PLAYERS[1])
end,
mesDisp=function(P)
setFont(75)
mStr(P.stat.pc,69,400)
mText(drawableText.pc,69,482)
mStr(P.stat.pc,69,330)
mText(drawableText.pc,69,412)
end,
score=function(P)return{P.stat.pc,P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." PCs "..toTime(D[2])end,

View File

@@ -57,13 +57,13 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
check(PLAYERS[1])
end,
mesDisp=function(P)
setFont(75)
mStr(P.stat.pc,69,400)
mText(drawableText.pc,69,482)
mStr(P.stat.pc,69,330)
mText(drawableText.pc,69,412)
end,
score=function(P)return{P.stat.pc,P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." PCs "..toTime(D[2])end,

View File

@@ -19,8 +19,8 @@ return{
bg="rainbow",bgm="push",
},
load=function()
PLY.newPlayer(1,340,15)
PLY.newAIPlayer(2,965,360,.5,AIBUILDER("CC",10,1,true,10000))
PLY.newPlayer(1)
PLY.newAIPlayer(2,AIBUILDER("CC",10,1,true,10000))
GAME.garbageSpeed=1e99
end,
score=function(P)return{P.stat.piece,P.stat.frame/60}end,

View File

@@ -19,8 +19,8 @@ return{
bg="rainbow",bgm="push",
},
load=function()
PLY.newPlayer(1,340,15)
PLY.newAIPlayer(2,965,360,.5,AIBUILDER("CC",10,1,true,13000))
PLY.newPlayer(1)
PLY.newAIPlayer(2,AIBUILDER("CC",10,1,true,13000))
GAME.garbageSpeed=1e99
end,
score=function(P)return{P.stat.piece,P.stat.frame/60}end,

View File

@@ -19,8 +19,8 @@ return{
bg="rainbow",bgm="push",
},
load=function()
PLY.newPlayer(1,340,15)
PLY.newAIPlayer(2,965,360,.5,AIBUILDER("CC",10,2,true,16000))
PLY.newPlayer(1)
PLY.newAIPlayer(2,AIBUILDER("CC",10,2,true,16000))
GAME.garbageSpeed=1e99
end,
score=function(P)return{P.stat.piece,P.stat.frame/60}end,

View File

@@ -19,8 +19,8 @@ return{
bg="rainbow",bgm="push",
},
load=function()
PLY.newPlayer(1,340,15)
PLY.newAIPlayer(2,965,360,.5,AIBUILDER("CC",10,3,true,26000))
PLY.newPlayer(1)
PLY.newAIPlayer(2,AIBUILDER("CC",10,3,true,26000))
GAME.garbageSpeed=1e99
end,
score=function(P)return{P.stat.piece,P.stat.frame/60}end,

View File

@@ -19,8 +19,8 @@ return{
bg="rainbow",bgm="push",
},
load=function()
PLY.newPlayer(1,340,15)
PLY.newAIPlayer(2,965,360,.5,AIBUILDER("CC",10,3,true,40000))
PLY.newPlayer(1)
PLY.newAIPlayer(2,AIBUILDER("CC",10,3,true,40000))
GAME.garbageSpeed=1e99
end,
score=function(P)return{P.stat.piece,P.stat.frame/60}end,

View File

@@ -8,8 +8,8 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newAIPlayer(2,965,360,.5,AIBUILDER("9S",4))
PLY.newPlayer(1)
PLY.newAIPlayer(2,AIBUILDER("9S",4))
end,
score=function(P)return{P.stat.frame/60}end,
scoreDisp=function(D)return toTime(D[1])end,

View File

@@ -8,8 +8,8 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newAIPlayer(2,965,360,.5,AIBUILDER("9S",5))
PLY.newPlayer(1)
PLY.newAIPlayer(2,AIBUILDER("9S",5))
end,
score=function(P)return{P.stat.frame/60}end,
scoreDisp=function(D)return toTime(D[1])end,

View File

@@ -8,8 +8,8 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newAIPlayer(2,965,360,.5,AIBUILDER("9S",6))
PLY.newPlayer(1)
PLY.newAIPlayer(2,AIBUILDER("9S",6))
end,
score=function(P)return{P.stat.frame/60}end,
scoreDisp=function(D)return toTime(D[1])end,

View File

@@ -8,8 +8,8 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newAIPlayer(2,965,360,.5,AIBUILDER("CC",6,2,true,30000))
PLY.newPlayer(1)
PLY.newAIPlayer(2,AIBUILDER("CC",6,2,true,30000))
end,
score=function(P)return{P.stat.frame/60}end,
scoreDisp=function(D)return toTime(D[1])end,

View File

@@ -8,8 +8,8 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newAIPlayer(2,965,360,.5,AIBUILDER("CC",7,3,true,50000))
PLY.newPlayer(1)
PLY.newAIPlayer(2,AIBUILDER("CC",7,3,true,50000))
end,
score=function(P)return{P.stat.frame/60}end,
scoreDisp=function(D)return toTime(D[1])end,

View File

@@ -8,13 +8,13 @@ return{
bg="aura",bgm="waterfall",
},
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(55)
local r=40-P.stat.row
if r<0 then r=0 end
mStr(r,69,335)
mStr(r,69,265)
PLY.draw.drawTargetLine(P,r)
end,
getRank=function(P)

View File

@@ -7,13 +7,13 @@ return{
bg="aura",bgm="waterfall",
},
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(55)
local r=40-P.stat.row
if r<0 then r=0 end
mStr(r,69,335)
mStr(r,69,265)
PLY.draw.drawTargetLine(P,r)
end,
getRank=function(P)

View File

@@ -8,13 +8,13 @@ return{
bg="aura",bgm="waterfall",
},
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(55)
local r=40-P.stat.row
if r<0 then r=0 end
mStr(r,69,335)
mStr(r,69,265)
PLY.draw.drawTargetLine(P,r)
end,
score=function(P)return{P.stat.frame/60,P.stat.piece}end,

View File

@@ -7,13 +7,13 @@ return{
bg="aura",bgm="waterfall",
},
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(55)
local r=40-P.stat.row
if r<0 then r=0 end
mStr(r,69,335)
mStr(r,69,265)
PLY.draw.drawTargetLine(P,r)
end,
score=function(P)return{P.stat.frame/60,P.stat.piece}end,

View File

@@ -6,13 +6,13 @@ return{
bg="bg2",bgm="race",
},
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(55)
local r=10-P.stat.row
if r<0 then r=0 end
mStr(r,69,335)
mStr(r,69,265)
PLY.draw.drawTargetLine(P,r)
end,
score=function(P)return{P.stat.frame/60,P.stat.piece}end,

View File

@@ -6,13 +6,13 @@ return{
bg="bg2",bgm="race",
},
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(55)
local r=100-P.stat.row
if r<0 then r=0 end
mStr(r,69,335)
mStr(r,69,265)
PLY.draw.drawTargetLine(P,r)
end,
score=function(P)return{P.stat.frame/60,P.stat.piece}end,

View File

@@ -6,13 +6,13 @@ return{
bg="rainbow",bgm="push",
},
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(55)
local r=1000-P.stat.row
if r<0 then r=0 end
mStr(r,69,335)
mStr(r,69,265)
PLY.draw.drawTargetLine(P,r)
end,
score=function(P)return{P.stat.frame/60,P.stat.piece}end,
@@ -22,11 +22,11 @@ return{
if P.stat.row<1000 then return end
local T=P.stat.frame/60
return
T<=626 and 5 or
T<=800 and 4 or
T<=900 and 3 or
T<=1050 and 2 or
T<=1200 and 1 or
T<=750 and 5 or
T<=950 and 4 or
T<=1100 and 3 or
T<=1260 and 2 or
T<=1600 and 1 or
0
end,
}

View File

@@ -6,13 +6,13 @@ return{
bg="bg2",bgm="race",
},
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(55)
local r=20-P.stat.row
if r<0 then r=0 end
mStr(r,69,335)
mStr(r,69,265)
PLY.draw.drawTargetLine(P,r)
end,
score=function(P)return{P.stat.frame/60,P.stat.piece}end,

View File

@@ -6,13 +6,13 @@ return{
bg="bg2",bgm="race",
},
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(55)
local r=40-P.stat.row
if r<0 then r=0 end
mStr(r,69,335)
mStr(r,69,265)
PLY.draw.drawTargetLine(P,r)
end,
score=function(P)return{P.stat.frame/60,P.stat.piece}end,

View File

@@ -6,13 +6,13 @@ return{
bg="rainbow",bgm="push",
},
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(55)
local r=400-P.stat.row
if r<0 then r=0 end
mStr(r,69,335)
mStr(r,69,265)
PLY.draw.drawTargetLine(P,r)
end,
score=function(P)return{P.stat.frame/60,P.stat.piece}end,
@@ -23,10 +23,10 @@ return{
local T=P.stat.frame/60
return
T<=300 and 5 or
T<=330 and 4 or
T<=360 and 3 or
T<=390 and 2 or
T<=420 and 1 or
T<=380 and 4 or
T<=440 and 3 or
T<=500 and 2 or
T<=640 and 1 or
0
end,
}

View File

@@ -23,12 +23,12 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(65)
mStr(P.modeData.event,69,380)
mText(drawableText.wave,69,445)
mStr(P.modeData.event,69,310)
mText(drawableText.wave,69,375)
end,
score=function(P)return{P.modeData.event,P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(D[2])end,

View File

@@ -29,12 +29,12 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(65)
mStr(P.modeData.event,69,380)
mText(drawableText.wave,69,445)
mStr(P.modeData.event,69,310)
mText(drawableText.wave,69,375)
end,
score=function(P)return{P.modeData.event,P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(D[2])end,

View File

@@ -24,12 +24,12 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(65)
mStr(P.modeData.event,69,380)
mText(drawableText.wave,69,445)
mStr(P.modeData.event,69,310)
mText(drawableText.wave,69,375)
end,
score=function(P)return{P.modeData.event,P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(D[2])end,

View File

@@ -28,12 +28,12 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(65)
mStr(P.modeData.event,69,380)
mText(drawableText.wave,69,445)
mStr(P.modeData.event,69,310)
mText(drawableText.wave,69,375)
end,
score=function(P)return{P.modeData.event,P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(D[2])end,

View File

@@ -30,12 +30,12 @@ return{
},
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(65)
mStr(P.modeData.event,69,380)
mText(drawableText.wave,69,445)
mStr(P.modeData.event,69,310)
mText(drawableText.wave,69,375)
end,
score=function(P)return{P.modeData.event,P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(D[2])end,

View File

@@ -13,14 +13,14 @@ return{
},
slowMark=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(45)
mStr(format("%.1f",P.stat.atk),69,260)
mStr(format("%.2f",P.stat.atk/P.stat.row),69,380)
mText(drawableText.atk,69,313)
mText(drawableText.eff,69,433)
mStr(format("%.1f",P.stat.atk),69,190)
mStr(format("%.2f",P.stat.atk/P.stat.row),69,310)
mText(drawableText.atk,69,243)
mText(drawableText.eff,69,363)
end,
score=function(P)return{P.stat.atk<=200 and int(P.stat.atk)or 200,P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." Attack "..toTime(D[2])end,

View File

@@ -25,14 +25,14 @@ return{
},
slowMark=true,
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(45)
mStr(format("%.1f",P.stat.atk),69,260)
mStr(format("%.2f",P.stat.atk/P.stat.row),69,380)
mText(drawableText.atk,69,313)
mText(drawableText.eff,69,433)
mStr(format("%.1f",P.stat.atk),69,190)
mStr(format("%.2f",P.stat.atk/P.stat.row),69,310)
mText(drawableText.atk,69,243)
mText(drawableText.eff,69,363)
end,
score=function(P)return{P.stat.atk<=200 and int(P.stat.atk)or 200,P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." Attack "..toTime(D[2])end,

View File

@@ -12,14 +12,14 @@ return{
bg="matrix",bgm="down",
},
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(45)
mStr(format("%.1f",P.stat.atk),69,260)
mStr(format("%.2f",P.stat.atk/P.stat.row),69,380)
mText(drawableText.atk,69,313)
mText(drawableText.eff,69,433)
mStr(format("%.1f",P.stat.atk),69,190)
mStr(format("%.2f",P.stat.atk/P.stat.row),69,310)
mText(drawableText.atk,69,243)
mText(drawableText.eff,69,363)
end,
score=function(P)return{P.stat.atk<=200 and int(P.stat.atk)or 200,P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." Attack "..toTime(D[2])end,

View File

@@ -22,14 +22,14 @@ return{
bg="matrix",bgm="down",
},
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(45)
mStr(format("%.1f",P.stat.atk),69,260)
mStr(format("%.2f",P.stat.atk/P.stat.row),69,380)
mText(drawableText.atk,69,313)
mText(drawableText.eff,69,433)
mStr(format("%.1f",P.stat.atk),69,190)
mStr(format("%.2f",P.stat.atk/P.stat.row),69,310)
mText(drawableText.atk,69,243)
mText(drawableText.eff,69,363)
end,
score=function(P)return{P.stat.atk<=200 and int(P.stat.atk)or 200,P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." Attack "..toTime(D[2])end,

View File

@@ -12,14 +12,14 @@ return{
bg="matrix",bgm="down",
},
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(45)
mStr(format("%.1f",P.stat.atk),69,260)
mStr(format("%.2f",P.stat.atk/P.stat.row),69,380)
mText(drawableText.atk,69,313)
mText(drawableText.eff,69,433)
mStr(format("%.1f",P.stat.atk),69,190)
mStr(format("%.2f",P.stat.atk/P.stat.row),69,310)
mText(drawableText.atk,69,243)
mText(drawableText.eff,69,363)
end,
score=function(P)return{P.stat.atk<=200 and int(P.stat.atk)or 200,P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." Attack "..toTime(D[2])end,

View File

@@ -22,14 +22,14 @@ return{
bg="matrix",bgm="down",
},
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(45)
mStr(format("%.1f",P.stat.atk),69,260)
mStr(format("%.2f",P.stat.atk/P.stat.row),69,380)
mText(drawableText.atk,69,313)
mText(drawableText.eff,69,433)
mStr(format("%.1f",P.stat.atk),69,190)
mStr(format("%.2f",P.stat.atk/P.stat.row),69,310)
mText(drawableText.atk,69,243)
mText(drawableText.eff,69,363)
end,
score=function(P)return{P.stat.atk<=200 and int(P.stat.atk)or 200,P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." Attack "..toTime(D[2])end,

View File

@@ -12,14 +12,14 @@ return{
bg="matrix",bgm="new era",
},
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(45)
mStr(format("%.1f",P.stat.atk),69,260)
mStr(format("%.2f",P.stat.atk/P.stat.row),69,380)
mText(drawableText.atk,69,313)
mText(drawableText.eff,69,433)
mStr(format("%.1f",P.stat.atk),69,190)
mStr(format("%.2f",P.stat.atk/P.stat.row),69,310)
mText(drawableText.atk,69,243)
mText(drawableText.eff,69,363)
end,
score=function(P)return{P.stat.atk<=200 and int(P.stat.atk)or 200,P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." Attack "..toTime(D[2])end,

View File

@@ -22,14 +22,14 @@ return{
bg="matrix",bgm="new era",
},
load=function()
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
end,
mesDisp=function(P)
setFont(45)
mStr(format("%.1f",P.stat.atk),69,260)
mStr(format("%.2f",P.stat.atk/P.stat.row),69,380)
mText(drawableText.atk,69,313)
mText(drawableText.eff,69,433)
mStr(format("%.1f",P.stat.atk),69,190)
mStr(format("%.2f",P.stat.atk/P.stat.row),69,310)
mText(drawableText.atk,69,243)
mText(drawableText.eff,69,363)
end,
score=function(P)return{P.stat.atk<=200 and int(P.stat.atk)or 200,P.stat.frame/60}end,
scoreDisp=function(D)return D[1].." Attack "..toTime(D[2])end,

View File

@@ -31,7 +31,7 @@ return{
powerUp={2,5,10,20},
stage={30,20,15,10,5},
}
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
local L={}for i=1,49 do L[i]=true end
local t=CC and 2 or 0
while t>0 do
@@ -39,36 +39,36 @@ return{
if L[r]then L[r],t=false,t-1 end
end
local n=2
for i=1,4 do for j=1,6 do
for _=1,4 do for _=1,6 do
if L[n]then
PLY.newAIPlayer(n,78*i-54,115*j-98,.09,AIBUILDER("9S",rnd(4,6)))
PLY.newAIPlayer(n,AIBUILDER("9S",rnd(4,6)),true)
else
PLY.newAIPlayer(n,78*i-54,115*j-98,.09,AIBUILDER("CC",rnd(2,4),2,true,20000))
PLY.newAIPlayer(n,AIBUILDER("CC",rnd(2,4),2,true,20000),true)
end
n=n+1
end end
for i=9,12 do for j=1,6 do
for _=9,12 do for _=1,6 do
if L[n]then
PLY.newAIPlayer(n,78*i+267,115*j-98,.09,AIBUILDER("9S",rnd(4,5)))
PLY.newAIPlayer(n,AIBUILDER("9S",rnd(4,5)),true)
else
PLY.newAIPlayer(n,78*i+267,115*j-98,.09,AIBUILDER("CC",rnd(3,5),2,true,20000))
PLY.newAIPlayer(n,AIBUILDER("CC",rnd(3,5),2,true,20000),true)
end
n=n+1
end end
end,
mesDisp=function(P)
setFont(35)
mStr(#PLAYERS.alive.."/49",69,245)
mStr(P.modeData.point,80,285)
gc.draw(drawableText.ko,23,295)
mStr(#PLAYERS.alive.."/49",69,175)
mStr(P.modeData.point,80,215)
gc.draw(drawableText.ko,23,225)
setFont(20)
gc.setColor(1,.5,0,.6)
gc.print(P.badge,103,297)
gc.print(P.badge,103,227)
gc.setColor(1,1,1)
setFont(25)
gc.print(powerUp[P.strength],18,360)
gc.print(powerUp[P.strength],18,290)
for i=1,P.strength do
gc.draw(IMG.badgeIcon,16*i+12,330)
gc.draw(IMG.badgeIcon,16*i+12,260)
end
end,
score=function(P)return{P.modeData.event,P.modeData.point}end,

View File

@@ -31,7 +31,7 @@ return{
powerUp={2,5,10,20},
stage={30,20,15,10,5},
}
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
local L={}for i=1,49 do L[i]=true end
local t=CC and 4 or 0
while t>0 do
@@ -39,36 +39,36 @@ return{
if L[r]then L[r],t=false,t-1 end
end
local n=2
for i=1,4 do for j=1,6 do
for _=1,4 do for _=1,6 do
if L[n]then
PLY.newAIPlayer(n,78*i-54,115*j-98,.09,AIBUILDER("9S",rnd(4,8)))
PLY.newAIPlayer(n,AIBUILDER("9S",rnd(4,8)),true)
else
PLY.newAIPlayer(n,78*i-54,115*j-98,.09,AIBUILDER("CC",rnd(3,6),3,true,30000))
PLY.newAIPlayer(n,AIBUILDER("CC",rnd(3,6),3,true,30000),true)
end
n=n+1
end end
for i=9,12 do for j=1,6 do
for _=9,12 do for _=1,6 do
if L[n]then
PLY.newAIPlayer(n,78*i+267,115*j-98,.09,AIBUILDER("9S",rnd(4,7)))
PLY.newAIPlayer(n,AIBUILDER("9S",rnd(4,7)),true)
else
PLY.newAIPlayer(n,78*i+267,115*j-98,.09,AIBUILDER("CC",rnd(4,6),3,true,30000))
PLY.newAIPlayer(n,AIBUILDER("CC",rnd(4,6),3,true,30000),true)
end
n=n+1
end end
end,
mesDisp=function(P)
setFont(35)
mStr(#PLAYERS.alive.."/49",69,245)
mStr(P.modeData.point,80,285)
gc.draw(drawableText.ko,23,295)
mStr(#PLAYERS.alive.."/49",69,175)
mStr(P.modeData.point,80,215)
gc.draw(drawableText.ko,23,225)
setFont(20)
gc.setColor(1,.5,0,.6)
gc.print(P.badge,103,297)
gc.print(P.badge,103,227)
gc.setColor(1,1,1)
setFont(25)
gc.print(powerUp[P.strength],18,360)
gc.print(powerUp[P.strength],18,290)
for i=1,P.strength do
gc.draw(IMG.badgeIcon,16*i+12,330)
gc.draw(IMG.badgeIcon,16*i+12,260)
end
end,
score=function(P)return{P.modeData.event,P.modeData.point}end,

View File

@@ -31,7 +31,7 @@ return{
powerUp={2,5,10,20},
stage={30,20,15,10,5},
}
PLY.newPlayer(1,340,15)
PLY.newPlayer(1)
local L={}for i=1,49 do L[i]=true end
local t=CC and 6 or 0
while t>0 do
@@ -39,36 +39,36 @@ return{
if L[r]then L[r],t=false,t-1 end
end
local n=2
for i=1,4 do for j=1,6 do
for _=1,4 do for _=1,6 do
if L[n]then
PLY.newAIPlayer(n,78*i-54,115*j-98,.09,AIBUILDER("9S",rnd(8,10)))
PLY.newAIPlayer(n,AIBUILDER("9S",rnd(8,10)),true)
else
PLY.newAIPlayer(n,78*i-54,115*j-98,.09,AIBUILDER("CC",rnd(4,7),3,true,40000))
PLY.newAIPlayer(n,AIBUILDER("CC",rnd(4,7),3,true,40000),true)
end
n=n+1
end end
for i=9,12 do for j=1,6 do
for _=9,12 do for _=1,6 do
if L[n]then
PLY.newAIPlayer(n,78*i+267,115*j-98,.09,AIBUILDER("9S",rnd(8,9)))
PLY.newAIPlayer(n,AIBUILDER("9S",rnd(8,9)),true)
else
PLY.newAIPlayer(n,78*i+267,115*j-98,.09,AIBUILDER("CC",rnd(5,8),3,true,40000))
PLY.newAIPlayer(n,AIBUILDER("CC",rnd(5,8),3,true,40000),true)
end
n=n+1
end end
end,
mesDisp=function(P)
setFont(35)
mStr(#PLAYERS.alive.."/49",69,245)
mStr(P.modeData.point,80,285)
gc.draw(drawableText.ko,23,295)
mStr(#PLAYERS.alive.."/49",69,175)
mStr(P.modeData.point,80,215)
gc.draw(drawableText.ko,23,225)
setFont(20)
gc.setColor(1,.5,0,.6)
gc.print(P.badge,103,297)
gc.print(P.badge,103,227)
gc.setColor(1,1,1)
setFont(25)
gc.print(powerUp[P.strength],18,360)
gc.print(powerUp[P.strength],18,290)
for i=1,P.strength do
gc.draw(IMG.badgeIcon,16*i+12,330)
gc.draw(IMG.badgeIcon,16*i+12,260)
end
end,
score=function(P)return{P.modeData.event,P.modeData.point}end,

Some files were not shown because too many files have changed in this diff Show More