Add Construct modes
This commit is contained in:
117
parts/eventsets/construct_sg.lua
Normal file
117
parts/eventsets/construct_sg.lua
Normal file
@@ -0,0 +1,117 @@
|
||||
local gc_setColor,gc_draw=love.graphics.setColor,love.graphics.draw
|
||||
local ply_applyField=PLY.draw.applyField
|
||||
|
||||
local targetField={}
|
||||
|
||||
local function getOpenHole(y,mirror)
|
||||
if mirror then y=y+9 end
|
||||
return -math.abs(((y-1) % 18)-9)+10
|
||||
end
|
||||
local function generateGuide(y,mirror)
|
||||
local l=#targetField
|
||||
if l>y then
|
||||
return
|
||||
end
|
||||
for i=l,y do
|
||||
targetField[i] = {}
|
||||
local h=getOpenHole(i,mirror)
|
||||
for j=1,10 do
|
||||
targetField[i][j]=h==j and -1 or 21
|
||||
end
|
||||
end
|
||||
end
|
||||
local function calculateRankPts(P)
|
||||
local points=1
|
||||
for y=1,#P.field do
|
||||
local holePos=getOpenHole(y,P.modeData.mirror)
|
||||
local flag
|
||||
for x=1,10 do
|
||||
if P.field[y][x]>0 and holePos==x then flag=true break end
|
||||
if P.field[y][x]==0 and holePos~=x then flag=true break end
|
||||
end
|
||||
if flag then break end
|
||||
if not P:solid(holePos,y+1) then break end
|
||||
points=points+1
|
||||
end
|
||||
P.modeData.rankPts=points
|
||||
P.modeData.maxRankPts=math.max(points,P.modeData.maxRankPts)
|
||||
end
|
||||
|
||||
return {
|
||||
fkey1=function(P) P.modeData.showGuide=not P.modeData.showGuide end,
|
||||
fkey2=function(P)
|
||||
P.modeData.mirror=not P.modeData.mirror
|
||||
TABLE.cut(targetField)
|
||||
generateGuide(#P.field+10,P.modeData.mirror)
|
||||
calculateRankPts(P)
|
||||
end,
|
||||
mesDisp=function(P)
|
||||
local D=P.modeData
|
||||
mText(TEXTOBJ.grade,63,190)
|
||||
mText(TEXTOBJ.line,63,310)
|
||||
setFont(55)
|
||||
GC.mStr(getConstructGrade(D.rankPts),63,125)
|
||||
GC.mStr(D.rankPts-1,63,245)
|
||||
|
||||
-- Display highest grade
|
||||
if D.maxRankPts>D.rankPts then
|
||||
gc_setColor(COLOR.lX)
|
||||
setFont(20)
|
||||
GC.mStr(text.highest:repD(getConstructGrade(D.maxRankPts)),63,216)
|
||||
GC.mStr(text.highest:repD(D.maxRankPts+1),63,336)
|
||||
end
|
||||
|
||||
ply_applyField(P)
|
||||
local mark=TEXTURE.puzzleMark
|
||||
if D.showGuide then
|
||||
local firstMistake=nil
|
||||
for y=1,D.rankPts+1 do
|
||||
for x=1,10 do
|
||||
local texture=targetField[y][x]
|
||||
-- Missing blocks
|
||||
if not P:solid(x,y) and texture>0 then
|
||||
|
||||
-- Missing block under overhang
|
||||
if P:solid(x,y+1) then
|
||||
firstMistake=firstMistake or y
|
||||
gc_setColor(COLOR.R)
|
||||
else
|
||||
gc_setColor(COLOR.Z)
|
||||
end
|
||||
|
||||
gc_draw(mark[texture],30*x-30,600-30*y)
|
||||
elseif texture<0 then
|
||||
-- X always gets displayed, color changes based on whether there is a block there
|
||||
if P:solid(x,y) then
|
||||
gc_setColor(COLOR.R)
|
||||
firstMistake=firstMistake or y
|
||||
elseif D.rankPts>y then
|
||||
gc_setColor(COLOR.G)
|
||||
else
|
||||
gc_setColor(COLOR.Z)
|
||||
end
|
||||
gc_draw(mark[texture],30*x-30,600-30*y)
|
||||
end
|
||||
end
|
||||
if y==firstMistake then
|
||||
gc_setColor(1,0,0,.2*(math.sin(2*TIME())+1))
|
||||
love.graphics.rectangle("fill",0,600-30*y,300,30)
|
||||
end
|
||||
end
|
||||
end
|
||||
PLY.draw.cancelField()
|
||||
end,
|
||||
task=function(P)
|
||||
local D=P.modeData
|
||||
D.rankPts=1
|
||||
D.showGuide=true
|
||||
D.maxRankPts=1
|
||||
D.mirror=false
|
||||
TABLE.cut(targetField)
|
||||
generateGuide(10,D.mirror)
|
||||
end,
|
||||
hook_drop=function(P)
|
||||
calculateRankPts(P)
|
||||
generateGuide(#P.field+10,P.modeData.mirror)
|
||||
end
|
||||
}
|
||||
Reference in New Issue
Block a user