This commit is contained in:
Aria 2025-03-21 22:23:30 +11:00
commit 9c94d113d3
Signed by untrusted user who does not match committer: aria
GPG key ID: 19AB7AA462B8AB3B
10260 changed files with 1237388 additions and 0 deletions

View file

@ -0,0 +1,158 @@
function init()
self.mode = "none"
self.timer = 0
self.targetPosition = nil
self.energyUsage = config.getParameter("energyUsage")
self.blinkMode = config.getParameter("blinkMode")
self.blinkOutTime = config.getParameter("blinkOutTime")
self.blinkInTime = config.getParameter("blinkInTime")
end
function uninit()
tech.setParentDirectives()
end
function update(args)
local specialActivated = not self.specialLast and args.moves["special1"]
self.specialLast = args.moves["special1"]
if specialActivated and not tech.parentLounging() and self.mode == "none" then
local blinkPosition = nil
if self.blinkMode == "random" then
local randomBlinkAvoidCollision = config.getParameter("randomBlinkAvoidCollision")
local randomBlinkAvoidMidair = config.getParameter("randomBlinkAvoidMidair")
local randomBlinkAvoidLiquid = config.getParameter("randomBlinkAvoidLiquid")
blinkPosition =
findRandomBlinkLocation(randomBlinkAvoidCollision, randomBlinkAvoidMidair, randomBlinkAvoidLiquid) or
findRandomBlinkLocation(randomBlinkAvoidCollision, randomBlinkAvoidMidair, false) or
findRandomBlinkLocation(randomBlinkAvoidCollision, false, false)
elseif self.blinkMode == "cursor" then
blinkPosition = blinkAdjust(tech.aimPosition(), true, true, false, false)
elseif self.blinkMode == "cursorPenetrate" then
blinkPosition = blinkAdjust(tech.aimPosition(), false, true, false, false)
end
if blinkPosition and status.overConsumeResource("energy", self.energyUsage) then
self.targetPosition = blinkPosition
self.mode = "start"
else
-- Make some kind of error noise
end
end
if self.mode == "start" then
mcontroller.setVelocity({0, 0})
self.mode = "out"
self.timer = 0
animator.playSound("activate")
elseif self.mode == "out" then
tech.setParentDirectives("?multiply=00000000")
animator.setAnimationState("blinking", "out")
mcontroller.setVelocity({0, 0})
self.timer = self.timer + args.dt
if self.timer > self.blinkOutTime then
mcontroller.setPosition(self.targetPosition)
self.mode = "in"
self.timer = 0
end
elseif self.mode == "in" then
tech.setParentDirectives()
animator.setAnimationState("blinking", "in")
mcontroller.setVelocity({0, 0})
self.timer = self.timer + args.dt
if self.timer > self.blinkInTime then
self.mode = "none"
end
end
end
function blinkAdjust(position, doPathCheck, doCollisionCheck, doLiquidCheck, doStandCheck)
local blinkCollisionCheckDiameter = config.getParameter("blinkCollisionCheckDiameter")
local blinkVerticalGroundCheck = config.getParameter("blinkVerticalGroundCheck")
local blinkFootOffset = config.getParameter("blinkFootOffset")
local blinkHeadOffset = config.getParameter("blinkHeadOffset")
if doPathCheck then
local collisionBlocks = world.collisionBlocksAlongLine(mcontroller.position(), position, {"Null", "Block", "Dynamic", "Slippery"}, 1)
if #collisionBlocks ~= 0 then
local diff = world.distance(position, mcontroller.position())
diff[1] = diff[1] > 0 and 1 or -1
diff[2] = diff[2] > 0 and 1 or -1
position = {collisionBlocks[1][1] - math.min(diff[1], 0), collisionBlocks[1][2] - math.min(diff[2], 0)}
end
end
if doCollisionCheck then
local diff = world.distance(position, mcontroller.position())
local collisionPoly = mcontroller.collisionPoly()
--Add foot offset if there is ground
if diff[2] < 0 then
local groundBlocks = world.collisionBlocksAlongLine(position, {position[1], position[2] + blinkFootOffset}, {"Null", "Block", "Dynamic", "Slippery"}, 1)
if #groundBlocks > 0 then
position[2] = groundBlocks[1][2] + 1 - blinkFootOffset
end
end
--Add head offset if there is ceiling
if diff[2] > 0 then
local ceilingBlocks = world.collisionBlocksAlongLine(position, {position[1], position[2] + blinkHeadOffset}, {"Null", "Block", "Dynamic", "Slippery"}, 1)
if #ceilingBlocks > 0 then
position[2] = ceilingBlocks[1][2] - blinkHeadOffset
end
end
--Resolve position
position = world.resolvePolyCollision(collisionPoly, position, blinkCollisionCheckDiameter)
if not position or world.lineTileCollision(mcontroller.position(), position, {"Null", "Block", "Dynamic", "Slippery"}) then
return nil
end
end
if doStandCheck then
local groundFound = false
for i = 1, blinkVerticalGroundCheck * 2 do
local checkPosition = {position[1], position[2] - i / 2}
if world.pointTileCollision(checkPosition, {"Null", "Block", "Dynamic", "Platform"}) then
groundFound = true
position = {checkPosition[1], checkPosition[2] + 0.5 - blinkFootOffset}
break
end
end
if not groundFound then
return nil
end
end
if doLiquidCheck and (world.liquidAt(position) or world.liquidAt({position[1], position[2] + blinkFootOffset})) then
return nil
end
return position
end
function findRandomBlinkLocation(doCollisionCheck, doLiquidCheck, doStandCheck)
local randomBlinkTries = config.getParameter("randomBlinkTries")
local randomBlinkDiameter = config.getParameter("randomBlinkDiameter")
for i=1,randomBlinkTries do
local position = mcontroller.position()
position[1] = position[1] + (math.random() * 2 - 1) * randomBlinkDiameter
position[2] = position[2] + (math.random() * 2 - 1) * randomBlinkDiameter
local position = blinkAdjust(position, false, doCollisionCheck, doLiquidCheck, doStandCheck)
if position then
return position
end
end
return nil
end