From bd002d0115a54afe12d3ed489f9c075280944dcb Mon Sep 17 00:00:00 2001 From: MrZ_26 <1046101471@qq.com> Date: Fri, 19 Jul 2024 18:07:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0task=E6=9C=BA=E5=88=B6?= =?UTF-8?q?=E5=8C=85=EF=BC=8C=E7=BB=99=E6=9C=89submode=E7=9A=84=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E5=8A=A0=E4=B8=8Asubmode=E9=80=89=E6=8B=A9=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6=E5=8F=AF=E8=A7=86=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/game/mechanicLib/common/task.lua | 144 ++++++++++++++++++ assets/game/mechanicLib/init.lua | 1 + assets/game/mode/brik/exterior/backfire.lua | 20 +++ assets/game/mode/brik/exterior/excavate.lua | 9 ++ assets/game/mode/brik/exterior/hypersonic.lua | 14 ++ assets/game/mode/brik/exterior/sequence.lua | 22 ++- assets/game/mode/brik/exterior/survivor.lua | 14 +- assets/language/lang_en.lua | 65 +++++--- assets/language/lang_zh.lua | 65 +++++--- 9 files changed, 318 insertions(+), 36 deletions(-) create mode 100644 assets/game/mechanicLib/common/task.lua diff --git a/assets/game/mechanicLib/common/task.lua b/assets/game/mechanicLib/common/task.lua new file mode 100644 index 00000000..e9ac8b73 --- /dev/null +++ b/assets/game/mechanicLib/common/task.lua @@ -0,0 +1,144 @@ +local pIndex=TABLE.pathIndex + +local task={} + +---@class Techmino.PlayerModeData.TaskObj +---@field id string +---@field title string +---@field desc string? +---@field progress string? progress text, like "1/10" +---@field value number 0-1 +---@field valueShow number 0-1 +---@field changing boolean +---@field achieved boolean +---@field achievedTimer integer + +---@type Techmino.Event +function task.install(P) + P.modeData.task={} + P:addEvent('always',task.event_always) + P:addEvent('drawOnPlayer',task.event_drawOnPlayer) +end + +---@param P Techmino.Player +---@param id string +---@param title string +---@param desc string +---@param progress? string +---@param value? number|true +function task.add(P,id,title,desc,progress,value) + table.insert(P.modeData.task,{ + id=id, + title=title, + desc=desc, + value=value or 0, + valueShow=value or 0, + progress=progress, + changing=false, + achieved=value==true, + achievedTimer=0, + }) +end + +---@param P Techmino.Player +---@param id string +---@param value number|true +---@param progress? string +function task.set(P,id,value,progress) + ---@type Techmino.PlayerModeData.TaskObj + local opt + for _,o in next,P.modeData.task do + if o.id==id then + opt=o + break + end + end + if not opt then return end + if value==true then + opt.value=1 + opt.valueShow=1 + opt.changing=false + opt.achieved=true + opt.achievedTimer=0 + -- for _,o in next,P.modeData.task do + -- if o~=opt then + -- task.set(P,o.id,0) + -- end + -- end + else + opt.value=MATH.clamp(value,0,1) + opt.changing=opt.valueShow~=opt.value + end + if progress then + opt.progress=progress + end +end + +---@type Techmino.Event +function task.event_always(P) + local L=P.modeData.task + for i=1,#L do + local opt=L[i] + if opt.changing then + opt.valueShow=MATH.expApproach(opt.valueShow,opt.value,0.0626) + if math.abs(opt.valueShow-opt.value)<.001 then + opt.valueShow=opt.value + opt.changing=false + end + end + if opt.achieved then + opt.achievedTimer=opt.achievedTimer%100+1 + end + end +end + +local w,dh,r=355,60,15 +local gc=love.graphics +---@type Techmino.Event +function task.event_drawOnPlayer(P) + ---@type Techmino.PlayerModeData.TaskObj[] + local L=P.modeData.task + local h=#L*dh + local y=-h/2 + gc.push('transform') + gc.translate(-760,y) + GC.stc_reset() + GC.stc_rect(0,0,w,h,r) + gc.setColor(0,0,0,.42) + gc.rectangle('fill',0,0,w,h) + for i=1,#L do + local opt=L[i] + if opt.achieved and opt.achievedTimer<=50 then + gc.setColor(.26,.62,.7023,.7023) + else + gc.setColor(.26,.62,.7023,.872) + end + gc.rectangle('fill',0,0,w*opt.valueShow,dh) + + gc.setColor(COLOR.L) + FONT.set(25,'bold') + gc.print(Text[opt.title] or opt.title,20,12) + + FONT.set(20) + gc.printf(Text[opt.desc] or opt.title,10,5,w-20,'right') + + if opt.progress then + FONT.set(15) + gc.printf(opt.progress,10,dh-30,w-20,'right') + end + + gc.translate(0,dh) + end + + gc.setColor(COLOR.L) + for i=1,#L-1 do + gc.line(0,-dh*i,w,-dh*i) + end + + GC.stc_stop() + gc.setColor(COLOR.L) + gc.rectangle('line',0,-h,w,h,r) + gc.pop() +end + +return task diff --git a/assets/game/mechanicLib/init.lua b/assets/game/mechanicLib/init.lua index a6e857c4..2b6a62de 100644 --- a/assets/game/mechanicLib/init.lua +++ b/assets/game/mechanicLib/init.lua @@ -5,6 +5,7 @@ local require=simpRequire(function(path) return 'assets/game/mechanicLib/'..path local mechLib={ common={ -- Tool + task=require'common/task', timer=require'common/timer', music=require'common/music', characterAnim=require'common/characterAnim', diff --git a/assets/game/mode/brik/exterior/backfire.lua b/assets/game/mode/brik/exterior/backfire.lua index 0be4a846..6caeb106 100644 --- a/assets/game/mode/brik/exterior/backfire.lua +++ b/assets/game/mode/brik/exterior/backfire.lua @@ -16,6 +16,11 @@ return { playerInit=function(P) P.modeData.target.line=100 mechLib.common.music.set(P,{path='stat.line',s=40,e=75},'afterClear') + local T=mechLib.common.task + T.install(P) + T.add(P,'backfire_cheese','modeTask_backfire_cheese_title','modeTask_backfire_cheese_desc','(0/8)') + T.add(P,'backfire_normal','modeTask_backfire_normal_title','modeTask_backfire_normal_desc','(0/7)') + T.add(P,'backfire_amplify','modeTask_backfire_amplify_title','modeTask_backfire_amplify_desc','(0/8)') end, gameStart=function(P) P.timing=false end, beforeSend=function(P,atk) @@ -23,7 +28,20 @@ return { P:receive(atk) end, beforeDiscard=function(P) + local T=mechLib.common.task + T.set(P,'backfire_cheese',P.stat.line/8,("($1/8)"):repD(P.stat.line)) + if P.stat.line<=6 then + T.set(P,'backfire_normal',P.stat.line/7,("($1/7)"):repD(P.stat.atk)) + else + T.set(P,'backfire_normal',0,"---") + end + if P.stat.line<=4 then + T.set(P,'backfire_amplify',P.stat.line/8,("($1/8)"):repD(P.stat.atk)) + else + T.set(P,'backfire_amplify',0,"---") + end if P.stat.atk>=8 and P.stat.line<=4 then + T.set(P,'backfire_amplify',true) P.modeData.subMode='amplify' P.settings.dropDelay=260 P.settings.maxFreshChance=10 @@ -32,6 +50,7 @@ return { P:addEvent('beforeSend',mechLib.brik.survivor.backfire_easy_event_beforeSend) playBgm('supercritical') elseif P.stat.atk>=7 and P.stat.line<=6 then + T.set(P,'backfire_normal',true) P.modeData.subMode='normal' P.settings.dropDelay=620 P.settings.maxFreshChance=12 @@ -40,6 +59,7 @@ return { P:addEvent('beforeSend',mechLib.brik.survivor.backfire_normal_event_beforeSend) playBgm('storm') elseif P.stat.line>=8 then + T.set(P,'backfire_cheese',true) P.modeData.subMode='cheese' P.settings.dropDelay=1000 P.settings.maxFreshChance=15 diff --git a/assets/game/mode/brik/exterior/excavate.lua b/assets/game/mode/brik/exterior/excavate.lua index 5f6ea69f..36ea9ca4 100644 --- a/assets/game/mode/brik/exterior/excavate.lua +++ b/assets/game/mode/brik/exterior/excavate.lua @@ -16,6 +16,11 @@ return { P.modeData.lineStay=0 mechLib.brik.dig.event_playerInit(P) P:riseGarbage(math.floor(P.settings.fieldW*.5+1+P:rand(-2,2))) + local T=mechLib.common.task + T.install(P) + T.add(P,'excavate_shale', 'modeTask_excavate_shale_title', 'modeTask_excavate_shale_desc') + T.add(P,'excavate_volcanics', 'modeTask_excavate_volcanics_title', 'modeTask_excavate_volcanics_desc') + T.add(P,'excavate_checker', 'modeTask_excavate_checker_title', 'modeTask_excavate_checker_desc') end, gameStart=function(P) P.timing=false end, afterClear={ @@ -31,17 +36,21 @@ return { end end end + local T=mechLib.common.task if split then + T.set(P,'excavate_checker',true) P.modeData.digMode='checker' P.modeData.target.lineDig=8 P.modeData.lineStay=8 mechLib.common.music.set(P,{path='.lineDig',s=2,e=6},'afterClear') elseif clear.line<=2 then + T.set(P,'excavate_shale',true) P.modeData.digMode='shale' P.modeData.target.lineDig=40 P.modeData.lineStay=6 mechLib.common.music.set(P,{path='.lineDig',s=10,e=30},'afterClear') else + T.set(P,'excavate_volcanics',true) P.modeData.digMode='volcanics' P.modeData.target.lineDig=20 P.modeData.lineStay=5 diff --git a/assets/game/mode/brik/exterior/hypersonic.lua b/assets/game/mode/brik/exterior/hypersonic.lua index c2af68a5..e7f4a1ae 100644 --- a/assets/game/mode/brik/exterior/hypersonic.lua +++ b/assets/game/mode/brik/exterior/hypersonic.lua @@ -15,19 +15,31 @@ return { P.settings.dropDelay=0 P.settings.lockDelay=1e99 P.settings.spawnDelay=260 + local T=mechLib.common.task + T.install(P) + T.add(P,'hypersonic_low','modeTask_hypersonic_low_title','modeTask_hypersonic_low_desc','(0/4)') + T.add(P,'hypersonic_high','modeTask_hypersonic_high_title','modeTask_hypersonic_high_desc') + T.add(P,'hypersonic_hidden','modeTask_hypersonic_hidden_title','modeTask_hypersonic_hidden_desc') + T.add(P,'hypersonic_titanium','modeTask_hypersonic_titanium_title','modeTask_hypersonic_titanium_desc') end, afterClear=function(P,clear) local initFunc + local T=mechLib.common.task + if P.stat.line<4 then + T.set(P,'hypersonic_low',P.stat.line/4,('($1/4)'):repD(P.stat.line)) + end if clear.line>=4 then if #P.holdQueue==0 and P.gameTime<=8e3 then -- Titanium: Techrash in 8s without hold + T.set(P,'hypersonic_titanium',true) P.modeData.subMode='titanium' initFunc=mechLib.brik.marathon.hypersonic_titanium_event_playerInit playBgm('secret7th remix_hypersonic_titanium') elseif P.gameTime<=6e3 then -- Hidden: Techrash in 6s + T.set(P,'hypersonic_hidden',true) P.modeData.subMode='hidden' initFunc=mechLib.brik.marathon.hypersonic_hidden_event_playerInit playBgm('secret7th_hypersonic_hidden') @@ -36,6 +48,7 @@ return { else -- High: Techrash + T.set(P,'hypersonic_high',true) P.modeData.subMode='high' initFunc=mechLib.brik.marathon.hypersonic_high_event_playerInit playBgm('secret7th') @@ -45,6 +58,7 @@ return { elseif P.stat.line>=4 then -- Low: 4 Lines P.modeData.subMode='low' + T.set(P,'hypersonic_low',true,'(4/4)') initFunc=mechLib.brik.marathon.hypersonic_low_event_playerInit playBgm('secret8th') mechLib.common.music.set(P,{path='.point',s=100,e=300},'afterSpawn') diff --git a/assets/game/mode/brik/exterior/sequence.lua b/assets/game/mode/brik/exterior/sequence.lua index 6d155918..cf544921 100644 --- a/assets/game/mode/brik/exterior/sequence.lua +++ b/assets/game/mode/brik/exterior/sequence.lua @@ -72,12 +72,26 @@ return { holdSlot=0, seqType=sequence_weird, event={ - playerInit=function(P) P.modeData.target.line=40 end, + playerInit=function(P) + P.modeData.target.line=40 + local T=mechLib.common.task + T.install(P) + T.add(P,'sequence_mph', 'modeTask_sequence_mph_title', 'modeTask_sequence_mph_desc') + T.add(P,'sequence_flood', 'modeTask_sequence_flood_title', 'modeTask_sequence_flood_desc') + T.add(P,'sequence_drought', 'modeTask_sequence_drought_title', 'modeTask_sequence_drought_desc') + T.add(P,'sequence_saw', 'modeTask_sequence_saw_title', 'modeTask_sequence_saw_desc') + T.add(P,'sequence_rect', 'modeTask_sequence_rect_title', 'modeTask_sequence_rect_desc') + T.add(P,'sequence_rain', 'modeTask_sequence_rain_title', 'modeTask_sequence_rain_desc') + T.add(P,'sequence_pento', 'modeTask_sequence_pento_title', 'modeTask_sequence_pento_desc') + end, gameStart=function(P) P.timing=false end, afterClear={ function(P) + local T=mechLib.common.task + -- MPH if P.stat.piece<=4 then + T.set(P,'sequence_mph',true) P.modeData.subMode='mph' playBgm('blox') P:setSequenceGen('messy','-clearData') @@ -85,30 +99,36 @@ return { -- Bag elseif P.hand.name=='S' or P.hand.name=='Z' then + T.set(P,'sequence_flood',true) P.modeData.subMode='flood' playBgm('reason') P:setSequenceGen('bag7p6_flood','-clearData') elseif P.hand.name=='J' or P.hand.name=='L' then + T.set(P,'sequence_drought',true) P.modeData.subMode='drought' playBgm('reason') P:setSequenceGen('bag7p7m2_drought','-clearData') elseif P.hand.name=='T' then + T.set(P,'sequence_saw',true) P.modeData.subMode='saw' playBgm('reason') P:setSequenceGen('bag3_saw','-clearData') elseif P.hand.name=='O' then + T.set(P,'sequence_rect',true) P.modeData.subMode='rect' playBgm('reason') P:setSequenceGen('bag4_rect','-clearData') -- ? elseif P.hand.name=='I' then + T.set(P,'sequence_rain',true) P.modeData.subMode='rain' playBgm('race') P:setSequenceGen('bag3_sea','-clearData') -- Pento elseif MATH.between(P.hand.id,8,25) then + T.set(P,'sequence_pento',true) P.modeData.subMode='pento' playBgm('beat5th') P:setSequenceGen(sequence_pento_arc,'-clearData -clearNext') diff --git a/assets/game/mode/brik/exterior/survivor.lua b/assets/game/mode/brik/exterior/survivor.lua index 66499366..d7948b2a 100644 --- a/assets/game/mode/brik/exterior/survivor.lua +++ b/assets/game/mode/brik/exterior/survivor.lua @@ -26,11 +26,16 @@ return { atkSys='modern', event={ playerInit={ + mechLib.brik.survivor.event_playerInit, function(P) P.modeData.idleTime=0 P.modeData.lastPieceWave={-1,-1,-1,-1} + local T=mechLib.common.task + T.install(P) + T.add(P,'survivor_cheese','modeTask_survivor_cheese_title','modeTask_survivor_cheese_desc') + T.add(P,'survivor_power','modeTask_survivor_power_title','modeTask_survivor_power_desc') + T.add(P,'survivor_spike','modeTask_survivor_spike_title','modeTask_survivor_spike_desc') end, - mechLib.brik.survivor.event_playerInit, }, gameStart=function(P) P.timing=false end, afterLock=function(P) @@ -44,9 +49,14 @@ return { end end, beforeCancel=function(P) + local T=mechLib.common.task + T.set(P,'survivor_cheese',P.stat.atk/8,("($1/8)"):repD(P.stat.atk)) + T.set(P,'survivor_power',P.stat.atk/8,("($1/8)"):repD(P.stat.atk)) + T.set(P,'survivor_spike',P.stat.atk/8,("($1/8)"):repD(P.stat.atk)) if P.stat.atk>=8 then local eff=P.stat.atk/P.stat.line if eff>=2 then + T.set(P,'survivor_spike',true) P.modeData.subMode='spike' P.settings.dropDelay=260 P.settings.maxFreshChance=10 @@ -56,6 +66,7 @@ return { playBgm('there') mechLib.common.music.set(P,{path='.wave',s=10,e=30},'afterClear') elseif eff>=1 then + T.set(P,'survivor_power',true) P.modeData.subMode='power' P.settings.dropDelay=620 P.settings.maxFreshChance=12 @@ -64,6 +75,7 @@ return { playBgm('here') mechLib.common.music.set(P,{path='.wave',s=20,e=50},'afterClear') else + T.set(P,'survivor_cheese',true) P.modeData.subMode='cheese' P.settings.dropDelay=1000 P.settings.maxFreshChance=15 diff --git a/assets/language/lang_en.lua b/assets/language/lang_en.lua index ce75fdc2..ebae2a45 100644 --- a/assets/language/lang_en.lua +++ b/assets/language/lang_en.lua @@ -225,23 +225,54 @@ local L={ action= {"Action","Use both keyboard & mouse"}, }, - -- Mode Task Texts - exteriorModeTasks={ - sequence_mph_title="MPH", - sequence_mph_desc="Any clear in 4 pieces", - sequence_flood_title="Flood", - sequence_flood_desc="Clear with S or Z", - sequence_drought_title="Drought", - sequence_drought_desc="Clear with J or L", - sequence_saw_title="Saw", - sequence_saw_desc="Clear with T", - sequence_rect_title="Rect", - sequence_rect_desc="Clear with O", - sequence_rain_title="Rain", - sequence_rain_desc="Clear with I", - sequence_pento_title="Pento", - sequence_pento_desc="Clear with a Pento", - }, + -- Submode Task Texts + modeTask_question_title="???", + modeTask_question_desc="??????", + + modeTask_sequence_mph_title="MPH", + modeTask_sequence_mph_desc="Any clear in 4 pieces", + modeTask_sequence_flood_title="Flood", + modeTask_sequence_flood_desc="Clear with S or Z", + modeTask_sequence_drought_title="Drought", + modeTask_sequence_drought_desc="Clear with J or L", + modeTask_sequence_saw_title="Saw", + modeTask_sequence_saw_desc="Clear with T", + modeTask_sequence_rect_title="Rect", + modeTask_sequence_rect_desc="Clear with O", + modeTask_sequence_rain_title="Rain", + modeTask_sequence_rain_desc="Clear with I", + modeTask_sequence_pento_title="Pento", + modeTask_sequence_pento_desc="Clear with a Pento", + + modeTask_hypersonic_low_title="Low", + modeTask_hypersonic_low_desc="Clear 4 lines", + modeTask_hypersonic_high_title="High", + modeTask_hypersonic_high_desc="Clear a Techrash", + modeTask_hypersonic_hidden_title="Hidden", + modeTask_hypersonic_hidden_desc="Techrash in 6s", + modeTask_hypersonic_titanium_title="Titanium", + modeTask_hypersonic_titanium_desc="no-hold Techrash in 8s ", + + modeTask_excavate_shale_title="Shale", + modeTask_excavate_shale_desc="Dig with Triple-", + modeTask_excavate_volcanics_title="Volcanics", + modeTask_excavate_volcanics_desc="Dig with Triple+", + modeTask_excavate_checker_title="Checker", + modeTask_excavate_checker_desc="Dig with Split", + + modeTask_backfire_cheese_title="Cheese", + modeTask_backfire_cheese_desc="Clear 8 lines", + modeTask_backfire_normal_title="Normal", + modeTask_backfire_normal_desc="Send 7 lines in 6 lines", + modeTask_backfire_amplify_title="Amplify", + modeTask_backfire_amplify_desc="Send 8 lines in 4 lines", + + modeTask_survivor_cheese_title="Cheese", + modeTask_survivor_cheese_desc="Send 8 lines", + modeTask_survivor_power_title="Power", + modeTask_survivor_power_desc="Send 8 lines with 1 Eff", + modeTask_survivor_spike_title="Spike", + modeTask_survivor_spike_desc="Send 8 lines with 2 Eff", -- Achievement ---@enum (key) Techmino.Text.Achievement diff --git a/assets/language/lang_zh.lua b/assets/language/lang_zh.lua index e4851089..80ee13bd 100644 --- a/assets/language/lang_zh.lua +++ b/assets/language/lang_zh.lua @@ -225,23 +225,54 @@ local L={ action= {"动作","键鼠搭配更佳"}, }, - -- Mode Task Texts - exteriorModeTasks={ - sequence_mph_title="MPH", - sequence_mph_desc="4块内消除", - sequence_flood_title="Flood", - sequence_flood_desc="用S/Z消除", - sequence_drought_title="Drought", - sequence_drought_desc="用J/L消除", - sequence_saw_title="Saw", - sequence_saw_desc="用T消除", - sequence_rect_title="Rect", - sequence_rect_desc="用O消除", - sequence_rain_title="Rain", - sequence_rain_desc="用I消除", - sequence_pento_title="Pento", - sequence_pento_desc="用五连块消除", - }, + -- Submode Task Texts + modeTask_question_title="???", + modeTask_question_desc="??????", + + modeTask_sequence_mph_title="MPH", + modeTask_sequence_mph_desc="4块内消除", + modeTask_sequence_flood_title="Flood", + modeTask_sequence_flood_desc="用S/Z消除", + modeTask_sequence_drought_title="Drought", + modeTask_sequence_drought_desc="用J/L消除", + modeTask_sequence_saw_title="Saw", + modeTask_sequence_saw_desc="用T消除", + modeTask_sequence_rect_title="Rect", + modeTask_sequence_rect_desc="用O消除", + modeTask_sequence_rain_title="Rain", + modeTask_sequence_rain_desc="用I消除", + modeTask_sequence_pento_title="Pento", + modeTask_sequence_pento_desc="用五连块消除", + + modeTask_hypersonic_low_title="Low", + modeTask_hypersonic_low_desc="消除四行", + modeTask_hypersonic_high_title="High", + modeTask_hypersonic_high_desc="消四", + modeTask_hypersonic_hidden_title="Hidden", + modeTask_hypersonic_hidden_desc="6秒内消四", + modeTask_hypersonic_titanium_title="Titanium", + modeTask_hypersonic_titanium_desc="8秒内消四 且 不使用暂存", + + modeTask_excavate_shale_title="Shale", + modeTask_excavate_shale_desc="挖掘", + modeTask_excavate_volcanics_title="Volcanics", + modeTask_excavate_volcanics_desc="用消三+挖掘", + modeTask_excavate_checker_title="Checker", + modeTask_excavate_checker_desc="用隔断消除挖掘", + + modeTask_backfire_cheese_title="Cheese", + modeTask_backfire_cheese_desc="消除8行", + modeTask_backfire_normal_title="Normal", + modeTask_backfire_normal_desc="在消除6行内打出7行攻击", + modeTask_backfire_amplify_title="Amplify", + modeTask_backfire_amplify_desc="在消除4行内打出8行攻击", + + modeTask_survivor_cheese_title="Cheese", + modeTask_survivor_cheese_desc="打出8行攻击", + modeTask_survivor_power_title="Power", + modeTask_survivor_power_desc="打出8行攻击 且 效率达到1", + modeTask_survivor_spike_title="Spike", + modeTask_survivor_spike_desc="打出8行攻击 且 效率达到2", -- Achievement achievementMessage={