diff --git a/frontend/assets/plugin_scripts/jsexport.js b/frontend/assets/plugin_scripts/jsexport.js index 16020ca..9401dfb 100644 --- a/frontend/assets/plugin_scripts/jsexport.js +++ b/frontend/assets/plugin_scripts/jsexport.js @@ -4996,7 +4996,7 @@ $packages["jsexport/battle"] = (function() { this.Eles = Eles_; }); SkillMapperType = $pkg.SkillMapperType = $newType(4, $kindFunc, "battle.SkillMapperType", true, "jsexport/battle", true, null); - CharacterConfig = $pkg.CharacterConfig = $newType(0, $kindStruct, "battle.CharacterConfig", true, "jsexport/battle", true, function(SpeciesId_, SpeciesName_, InAirIdleFrameIdxTurningPoint_, InAirIdleFrameIdxTurnedCycle_, LayDownFrames_, LayDownFramesToRecover_, GetUpInvinsibleFrames_, GetUpFramesToRecover_, Speed_, JumpingInitVelY_, SkillMapper_) { + CharacterConfig = $pkg.CharacterConfig = $newType(0, $kindStruct, "battle.CharacterConfig", true, "jsexport/battle", true, function(SpeciesId_, SpeciesName_, InAirIdleFrameIdxTurningPoint_, InAirIdleFrameIdxTurnedCycle_, LayDownFrames_, LayDownFramesToRecover_, GetUpInvinsibleFrames_, GetUpFramesToRecover_, Speed_, JumpingInitVelY_, DashingEnabled_, OnWallEnabled_, WallJumpingInitVelX_, WallJumpingInitVelY_, WallSlidingVelY_, SkillMapper_) { this.$val = this; if (arguments.length === 0) { this.SpeciesId = 0; @@ -5009,6 +5009,11 @@ $packages["jsexport/battle"] = (function() { this.GetUpFramesToRecover = 0; this.Speed = 0; this.JumpingInitVelY = 0; + this.DashingEnabled = false; + this.OnWallEnabled = false; + this.WallJumpingInitVelX = 0; + this.WallJumpingInitVelY = 0; + this.WallSlidingVelY = 0; this.SkillMapper = $throwNilPointerError; return; } @@ -5022,6 +5027,11 @@ $packages["jsexport/battle"] = (function() { this.GetUpFramesToRecover = GetUpFramesToRecover_; this.Speed = Speed_; this.JumpingInitVelY = JumpingInitVelY_; + this.DashingEnabled = DashingEnabled_; + this.OnWallEnabled = OnWallEnabled_; + this.WallJumpingInitVelX = WallJumpingInitVelX_; + this.WallJumpingInitVelY = WallJumpingInitVelY_; + this.WallSlidingVelY = WallSlidingVelY_; this.SkillMapper = SkillMapper_; }); SatResult = $pkg.SatResult = $newType(0, $kindStruct, "battle.SatResult", true, "jsexport/battle", true, function(Overlap_, OverlapX_, OverlapY_, AContainedInB_, BContainedInA_, Axis_) { @@ -5189,10 +5199,10 @@ $packages["jsexport/battle"] = (function() { $pkg.ShouldGenerateInputFrameUpsync = ShouldGenerateInputFrameUpsync; ConvertToDelayedInputFrameId = function(renderFrameId) { var renderFrameId; - if (renderFrameId < 8) { + if (renderFrameId < 4) { return 0; } - return (((renderFrameId - 8 >> 0)) >> 2 >> 0); + return (((renderFrameId - 4 >> 0)) >> 2 >> 0); }; $pkg.ConvertToDelayedInputFrameId = ConvertToDelayedInputFrameId; ConvertToNoDelayInputFrameId = function(renderFrameId) { @@ -5202,12 +5212,12 @@ $packages["jsexport/battle"] = (function() { $pkg.ConvertToNoDelayInputFrameId = ConvertToNoDelayInputFrameId; ConvertToFirstUsedRenderFrameId = function(inputFrameId) { var inputFrameId; - return (((inputFrameId << 2 >> 0)) + 8 >> 0); + return (((inputFrameId << 2 >> 0)) + 4 >> 0); }; $pkg.ConvertToFirstUsedRenderFrameId = ConvertToFirstUsedRenderFrameId; ConvertToLastUsedRenderFrameId = function(inputFrameId) { var inputFrameId; - return (((((inputFrameId << 2 >> 0)) + 8 >> 0) + 4 >> 0) - 1 >> 0); + return (((((inputFrameId << 2 >> 0)) + 4 >> 0) + 4 >> 0) - 1 >> 0); }; $pkg.ConvertToLastUsedRenderFrameId = ConvertToLastUsedRenderFrameId; decodeInput = function(encodedInput) { @@ -5501,6 +5511,8 @@ $packages["jsexport/battle"] = (function() { existent$1 = _tuple$1[1]; if (!existent$1) { jumpedOrNot = true; + } else if (16 === currPlayerDownsync.CharacterState) { + jumpedOrNot = true; } } } @@ -5517,7 +5529,7 @@ $packages["jsexport/battle"] = (function() { return [patternId, jumpedOrNot, effDx, effDy]; }; ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame = function(inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, chConfigsOrderedByJoinIndex) { - var {_1, _2, _entry, _entry$1, _entry$2, _entry$3, _entry$4, _entry$5, _i, _i$1, _i$10, _i$11, _i$12, _i$2, _i$3, _i$4, _i$5, _i$6, _i$7, _i$8, _i$9, _index, _index$1, _index$2, _r, _r$1, _r$2, _r$3, _r$4, _r$5, _r$6, _r$7, _ref, _ref$1, _ref$10, _ref$11, _ref$12, _ref$13, _ref$14, _ref$15, _ref$16, _ref$17, _ref$18, _ref$2, _ref$3, _ref$4, _ref$5, _ref$6, _ref$7, _ref$8, _ref$9, _tmp, _tmp$1, _tmp$10, _tmp$11, _tmp$12, _tmp$13, _tmp$14, _tmp$15, _tmp$16, _tmp$17, _tmp$18, _tmp$19, _tmp$2, _tmp$20, _tmp$21, _tmp$22, _tmp$23, _tmp$24, _tmp$3, _tmp$4, _tmp$5, _tmp$6, _tmp$7, _tmp$8, _tmp$9, _tuple, _tuple$1, _tuple$10, _tuple$11, _tuple$12, _tuple$13, _tuple$14, _tuple$15, _tuple$16, _tuple$17, _tuple$2, _tuple$3, _tuple$4, _tuple$5, _tuple$6, _tuple$7, _tuple$8, _tuple$9, addToNextRenderFrame, atkedPlayerInNextFrame, atkedPlayerInNextFrame$1, bShape, bulletCollider, bulletColliders, bulletLocalId, bulletShape, bulletShape$1, bulletWx, bulletWx$1, bulletWy, bulletWy$1, chConfig, chConfig$1, chConfig$2, chConfigsOrderedByJoinIndex, colliderHeight, colliderWidth, colliderWorldHeight, colliderWorldWidth, collision, collision$1, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currPlayerDownsync, currPlayerDownsync$1, currPlayerDownsync$2, currPlayerDownsync$3, currPlayerDownsync$4, currRenderFrame, defenderShape, defenderShape$1, effDx, effDy, effPushbacks, existent, existent$1, existent$2, existent$3, existent$4, existent$5, fireballBullet, halfColliderHeightDiff, halfColliderWidthDiff, halfColliderWorldHeightDiff, hardPushbackNorm, hardPushbackNorms, hasLockVel, hitboxSizeWx, hitboxSizeWx$1, hitboxSizeWy, hitboxSizeWy$1, i, i$1, i$2, i$3, i$4, inputsBuffer, isAnotherPlayer, isBarrier, isBullet, joinIndex, joinIndex$1, joinIndex$2, joinIndex$3, jumpedOrNot, jumpedOrNotList, landedOnGravityPushback, meleeBullet, newBullet, newBullet$1, newBulletCollider, newBulletCollider$1, newVx, newVy, nextRenderFrameFireballBullets, nextRenderFrameMeleeBullets, nextRenderFramePlayers, normAlignmentWithGravity, obj, obj$1, obj$2, offender, offender$1, offender$2, oldFramesToRecover, oldFramesToRecover$1, oldNextCharacterState, overlapResult, overlapped, overlapped$1, overlapped$2, patternId, playerCollider, playerCollider$1, playerCollider$2, playerCollider$3, playerColliders, playerShape, projectedMagnitude, pushbackVelX, pushbackVelX$1, pushbackVelY, pushbackVelY$1, pushbackX, pushbackY, roomCapacity, skillConfig, skillId, t, t$1, t$2, t$3, thatPlayerInNextFrame, thatPlayerInNextFrame$1, thatPlayerInNextFrame$2, thatPlayerInNextFrame$3, v, v$1, v$2, v$3, v$4, v$5, wx, wy, x, x$1, x$10, x$11, x$12, x$13, x$14, x$15, x$16, x$17, x$18, x$2, x$3, x$4, x$5, x$6, x$7, x$8, x$9, xfac, xfac$1, xfac$2, xfac$3, $s, $r, $c} = $restore(this, {inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, chConfigsOrderedByJoinIndex}); + var {_1, _2, _3, _entry, _entry$1, _entry$2, _entry$3, _entry$4, _entry$5, _i, _i$1, _i$10, _i$11, _i$12, _i$13, _i$2, _i$3, _i$4, _i$5, _i$6, _i$7, _i$8, _i$9, _index, _index$1, _index$2, _r, _r$1, _r$2, _r$3, _r$4, _r$5, _r$6, _r$7, _ref, _ref$1, _ref$10, _ref$11, _ref$12, _ref$13, _ref$14, _ref$15, _ref$16, _ref$17, _ref$18, _ref$19, _ref$2, _ref$3, _ref$4, _ref$5, _ref$6, _ref$7, _ref$8, _ref$9, _tmp, _tmp$1, _tmp$10, _tmp$11, _tmp$12, _tmp$13, _tmp$14, _tmp$15, _tmp$16, _tmp$17, _tmp$18, _tmp$19, _tmp$2, _tmp$20, _tmp$21, _tmp$22, _tmp$23, _tmp$24, _tmp$3, _tmp$4, _tmp$5, _tmp$6, _tmp$7, _tmp$8, _tmp$9, _tuple, _tuple$1, _tuple$10, _tuple$11, _tuple$12, _tuple$13, _tuple$14, _tuple$15, _tuple$16, _tuple$17, _tuple$2, _tuple$3, _tuple$4, _tuple$5, _tuple$6, _tuple$7, _tuple$8, _tuple$9, addToNextRenderFrame, atkedPlayerInNextFrame, atkedPlayerInNextFrame$1, bShape, bulletCollider, bulletColliders, bulletLocalId, bulletShape, bulletShape$1, bulletWx, bulletWx$1, bulletWy, bulletWy$1, chConfig, chConfig$1, chConfig$2, chConfigsOrderedByJoinIndex, colliderHeight, colliderWidth, colliderWorldHeight, colliderWorldWidth, collision, collision$1, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, ctrlAlignmentWithHorizon1, ctrlAlignmentWithHorizon2, currPlayerDownsync, currPlayerDownsync$1, currPlayerDownsync$2, currPlayerDownsync$3, currPlayerDownsync$4, currRenderFrame, defenderShape, defenderShape$1, effDx, effDy, effPushbacks, existent, existent$1, existent$2, existent$3, existent$4, existent$5, fallStopping, fireballBullet, halfColliderHeightDiff, halfColliderWidthDiff, halfColliderWorldHeightDiff, hardPushbackNorm, hardPushbackNorm$1, hardPushbackNorms, hasLockVel, hitboxSizeWx, hitboxSizeWx$1, hitboxSizeWy, hitboxSizeWy$1, i, i$1, i$2, i$3, i$4, inputsBuffer, isAnotherPlayer, isBarrier, isBullet, joinIndex, joinIndex$1, joinIndex$2, joinIndex$3, jumpedOrNot, jumpedOrNotList, landedOnGravityPushback, meleeBullet, newBullet, newBullet$1, newBulletCollider, newBulletCollider$1, newVx, newVy, nextRenderFrameFireballBullets, nextRenderFrameMeleeBullets, nextRenderFramePlayers, normAlignmentWithGravity, normAlignmentWithHorizon1, normAlignmentWithHorizon2, obj, obj$1, obj$2, offender, offender$1, offender$2, oldFramesToRecover, oldFramesToRecover$1, oldNextCharacterState, overlapResult, overlapped, overlapped$1, overlapped$2, patternId, playerCollider, playerCollider$1, playerCollider$2, playerCollider$3, playerColliders, playerShape, projectedMagnitude, pushbackVelX, pushbackVelX$1, pushbackVelY, pushbackVelY$1, pushbackX, pushbackY, roomCapacity, skillConfig, skillId, t, t$1, t$2, t$3, thatPlayerInNextFrame, thatPlayerInNextFrame$1, thatPlayerInNextFrame$2, thatPlayerInNextFrame$3, v, v$1, v$2, v$3, v$4, v$5, wx, wy, x, x$1, x$10, x$11, x$12, x$13, x$14, x$15, x$16, x$17, x$18, x$19, x$2, x$3, x$4, x$5, x$6, x$7, x$8, x$9, xfac, xfac$1, xfac$2, xfac$3, xfac$4, $s, $r, $c} = $restore(this, {inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, chConfigsOrderedByJoinIndex}); /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: roomCapacity = currRenderFrame.PlayersArr.$length; nextRenderFramePlayers = $makeSlice(sliceType$6, roomCapacity); @@ -5550,7 +5562,6 @@ $packages["jsexport/battle"] = (function() { newBullet$1 = [newBullet$1]; i$1 = _i$1; currPlayerDownsync$1 = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); - ((i$1 < 0 || i$1 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$1] = false); chConfig = ((i$1 < 0 || i$1 >= chConfigsOrderedByJoinIndex.$length) ? ($throwRuntimeError("index out of range"), undefined) : chConfigsOrderedByJoinIndex.$array[chConfigsOrderedByJoinIndex.$offset + i$1]); thatPlayerInNextFrame = ((i$1 < 0 || i$1 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$1]); _tuple = deriveOpPattern(currPlayerDownsync$1, thatPlayerInNextFrame, currRenderFrame, inputsBuffer); @@ -5558,10 +5569,7 @@ $packages["jsexport/battle"] = (function() { jumpedOrNot = _tuple[1]; effDx = _tuple[2]; effDy = _tuple[3]; - if (jumpedOrNot) { - thatPlayerInNextFrame.VelY = (chConfig.JumpingInitVelY); - ((i$1 < 0 || i$1 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$1] = true); - } + ((i$1 < 0 || i$1 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$1] = jumpedOrNot); joinIndex = currPlayerDownsync$1.JoinIndex; _r = chConfig.SkillMapper(patternId, currPlayerDownsync$1); /* */ $s = 3; case 3: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } skillId = _r; @@ -5654,13 +5662,27 @@ $packages["jsexport/battle"] = (function() { _tmp$3 = 0; (x$2 = joinIndex$1 - 1 >> 0, ((x$2 < 0 || x$2 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$2])).X = _tmp$2; (x$3 = joinIndex$1 - 1 >> 0, ((x$3 < 0 || x$3 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$3])).Y = _tmp$3; + thatPlayerInNextFrame$1 = ((i$2 < 0 || i$2 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$2]); chConfig$1 = ((i$2 < 0 || i$2 >= chConfigsOrderedByJoinIndex.$length) ? ($throwRuntimeError("index out of range"), undefined) : chConfigsOrderedByJoinIndex.$array[chConfigsOrderedByJoinIndex.$offset + i$2]); _tmp$4 = currPlayerDownsync$2.VirtualGridX + currPlayerDownsync$2.VelX >> 0; _tmp$5 = currPlayerDownsync$2.VirtualGridY + currPlayerDownsync$2.VelY >> 0; newVx = _tmp$4; newVy = _tmp$5; if (((i$2 < 0 || i$2 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$2])) { - newVy = newVy + (chConfig$1.JumpingInitVelY) >> 0; + if (16 === currPlayerDownsync$2.CharacterState) { + newVx = newVx - (currPlayerDownsync$2.VelX) >> 0; + xfac$1 = -1; + if (0 > thatPlayerInNextFrame$1.DirX) { + xfac$1 = -xfac$1; + } + newVx = newVx + (($imul(xfac$1, chConfig$1.WallJumpingInitVelX))) >> 0; + newVy = newVy + (chConfig$1.WallJumpingInitVelY) >> 0; + thatPlayerInNextFrame$1.VelX = (($imul(xfac$1, chConfig$1.WallJumpingInitVelX))); + thatPlayerInNextFrame$1.VelY = (chConfig$1.WallJumpingInitVelY); + } else { + thatPlayerInNextFrame$1.VelY = (chConfig$1.JumpingInitVelY); + newVy = newVy + (chConfig$1.JumpingInitVelY) >> 0; + } } _tuple$2 = VirtualGridToWorldPos(newVx, newVy); wx = _tuple$2[0]; @@ -5675,7 +5697,7 @@ $packages["jsexport/battle"] = (function() { _tmp$9 = $imul(currPlayerDownsync$2.ColliderRadius, 2); colliderWidth = _tmp$8; colliderHeight = _tmp$9; - } else if ((_1 === (8)) || (_1 === (4)) || (_1 === (5))) { + } else if ((_1 === (8)) || (_1 === (4)) || (_1 === (5)) || (_1 === (16))) { _tmp$10 = $imul(currPlayerDownsync$2.ColliderRadius, 2); _tmp$11 = $imul(currPlayerDownsync$2.ColliderRadius, 2); colliderWidth = _tmp$10; @@ -5688,10 +5710,14 @@ $packages["jsexport/battle"] = (function() { playerCollider = _r$1; ((i$2 < 0 || i$2 >= playerColliders.$length) ? ($throwRuntimeError("index out of range"), undefined) : playerColliders.$array[playerColliders.$offset + i$2] = playerCollider); $r = collisionSys.Add(new sliceType$11([playerCollider])); /* */ $s = 7; case 7: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - thatPlayerInNextFrame$1 = ((i$2 < 0 || i$2 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$2]); if (currPlayerDownsync$2.InAir) { - thatPlayerInNextFrame$1.VelX = thatPlayerInNextFrame$1.VelX + (0) >> 0; - thatPlayerInNextFrame$1.VelY = thatPlayerInNextFrame$1.VelY + (-50) >> 0; + if ((16 === currPlayerDownsync$2.CharacterState) && !((i$2 < 0 || i$2 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$2])) { + thatPlayerInNextFrame$1.VelX = thatPlayerInNextFrame$1.VelX + (0) >> 0; + thatPlayerInNextFrame$1.VelY = chConfig$1.WallSlidingVelY; + } else { + thatPlayerInNextFrame$1.VelX = thatPlayerInNextFrame$1.VelX + (0) >> 0; + thatPlayerInNextFrame$1.VelY = thatPlayerInNextFrame$1.VelY + (-50) >> 0; + } } _i$2++; $s = 4; continue; @@ -5707,11 +5733,11 @@ $packages["jsexport/battle"] = (function() { /* */ $s = 12; continue; /* if (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) <= currRenderFrame.Id) && (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) + meleeBullet.Bullet.ActiveFrames >> 0) > currRenderFrame.Id)) { */ case 10: offender = (x$4 = currRenderFrame.PlayersArr, x$5 = meleeBullet.Bullet.OffenderJoinIndex - 1 >> 0, ((x$5 < 0 || x$5 >= x$4.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$4.$array[x$4.$offset + x$5])); - xfac$1 = 1; + xfac$2 = 1; if (0 > offender.DirX) { - xfac$1 = -xfac$1; + xfac$2 = -xfac$2; } - _tuple$4 = VirtualGridToWorldPos(offender.VirtualGridX + ($imul(xfac$1, meleeBullet.Bullet.HitboxOffsetX)) >> 0, offender.VirtualGridY); + _tuple$4 = VirtualGridToWorldPos(offender.VirtualGridX + ($imul(xfac$2, meleeBullet.Bullet.HitboxOffsetX)) >> 0, offender.VirtualGridY); bulletWx = _tuple$4[0]; bulletWy = _tuple$4[1]; _tuple$5 = VirtualGridToWorldPos(meleeBullet.Bullet.HitboxSizeX, meleeBullet.Bullet.HitboxSizeY); @@ -5838,31 +5864,32 @@ $packages["jsexport/battle"] = (function() { /* } */ case 26: if (landedOnGravityPushback) { thatPlayerInNextFrame$2.InAir = false; - if (currPlayerDownsync$3.InAir && 0 >= currPlayerDownsync$3.VelY) { + fallStopping = currPlayerDownsync$3.InAir && 0 >= currPlayerDownsync$3.VelY; + if (fallStopping) { thatPlayerInNextFrame$2.VelY = 0; thatPlayerInNextFrame$2.VelX = 0; - _tuple$9 = (_entry$1 = nonAttackingSet[$Int32.keyFor(thatPlayerInNextFrame$2.CharacterState)], _entry$1 !== undefined ? [_entry$1.v, true] : [false, false]); - existent$1 = _tuple$9[1]; - if (existent$1) { - if (8 === thatPlayerInNextFrame$2.CharacterState) { - thatPlayerInNextFrame$2.CharacterState = 9; - thatPlayerInNextFrame$2.FramesToRecover = chConfig$2.LayDownFramesToRecover; - } else { + if (8 === thatPlayerInNextFrame$2.CharacterState) { + thatPlayerInNextFrame$2.CharacterState = 9; + thatPlayerInNextFrame$2.FramesToRecover = chConfig$2.LayDownFramesToRecover; + } else { + _2 = currPlayerDownsync$3.CharacterState; + if ((_2 === (8)) || (_2 === (4)) || (_2 === (5)) || (_2 === (16))) { _tmp$17 = 0; _tmp$18 = currPlayerDownsync$3.ColliderRadius; halfColliderWidthDiff = _tmp$17; halfColliderHeightDiff = _tmp$18; - _tuple$10 = VirtualGridToWorldPos(halfColliderWidthDiff, halfColliderHeightDiff); - halfColliderWorldHeightDiff = _tuple$10[1]; + _tuple$9 = VirtualGridToWorldPos(halfColliderWidthDiff, halfColliderHeightDiff); + halfColliderWorldHeightDiff = _tuple$9[1]; _index$2 = joinIndex$2 - 1 >> 0; ((_index$2 < 0 || _index$2 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index$2]).Y = ((_index$2 < 0 || _index$2 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index$2]).Y - (halfColliderWorldHeightDiff); - thatPlayerInNextFrame$2.CharacterState = 0; } + thatPlayerInNextFrame$2.CharacterState = 0; + thatPlayerInNextFrame$2.FramesToRecover = 0; } } else { - _tuple$11 = (_entry$2 = nonAttackingSet[$Int32.keyFor(thatPlayerInNextFrame$2.CharacterState)], _entry$2 !== undefined ? [_entry$2.v, true] : [false, false]); - existent$2 = _tuple$11[1]; - if (existent$2) { + _tuple$10 = (_entry$1 = nonAttackingSet[$Int32.keyFor(thatPlayerInNextFrame$2.CharacterState)], _entry$1 !== undefined ? [_entry$1.v, true] : [false, false]); + existent$1 = _tuple$10[1]; + if (existent$1) { if (9 === thatPlayerInNextFrame$2.CharacterState) { if (0 === thatPlayerInNextFrame$2.FramesToRecover) { thatPlayerInNextFrame$2.CharacterState = 10; @@ -5877,70 +5904,96 @@ $packages["jsexport/battle"] = (function() { } } } + if (thatPlayerInNextFrame$2.InAir && chConfig$2.OnWallEnabled) { + _tuple$11 = (_entry$2 = noOpSet[$Int32.keyFor(currPlayerDownsync$3.CharacterState)], _entry$2 !== undefined ? [_entry$2.v, true] : [false, false]); + existent$2 = _tuple$11[1]; + if (!existent$2) { + _ref$10 = (x$9 = joinIndex$2 - 1 >> 0, ((x$9 < 0 || x$9 >= hardPushbackNorms.$length) ? ($throwRuntimeError("index out of range"), undefined) : hardPushbackNorms.$array[hardPushbackNorms.$offset + x$9])).$get(); + _i$8 = 0; + while (true) { + if (!(_i$8 < _ref$10.$length)) { break; } + hardPushbackNorm$1 = $clone(((_i$8 < 0 || _i$8 >= _ref$10.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$10.$array[_ref$10.$offset + _i$8]), Vec2D); + normAlignmentWithHorizon1 = hardPushbackNorm$1.X * 1 + hardPushbackNorm$1.Y * 0; + ctrlAlignmentWithHorizon1 = (thatPlayerInNextFrame$2.DirX) * 1 + (thatPlayerInNextFrame$2.DirY) * 0; + normAlignmentWithHorizon2 = hardPushbackNorm$1.X * -1 + hardPushbackNorm$1.Y * 0; + ctrlAlignmentWithHorizon2 = (thatPlayerInNextFrame$2.DirX) * -1 + (thatPlayerInNextFrame$2.DirY) * 0; + if (0.9 < normAlignmentWithHorizon1 && 0.9 < ctrlAlignmentWithHorizon1) { + thatPlayerInNextFrame$2.OnWall = true; + } + if (0.9 < normAlignmentWithHorizon2 && 0.9 < ctrlAlignmentWithHorizon2) { + thatPlayerInNextFrame$2.OnWall = true; + } + _i$8++; + } + if (!currPlayerDownsync$3.OnWall && thatPlayerInNextFrame$2.OnWall) { + thatPlayerInNextFrame$2.VelY = 0; + } + } + } _i$5++; $s = 22; continue; case 23: - _ref$10 = bulletColliders; - _i$8 = 0; + _ref$11 = bulletColliders; + _i$9 = 0; /* while (true) { */ case 30: - /* if (!(_i$8 < _ref$10.$length)) { break; } */ if(!(_i$8 < _ref$10.$length)) { $s = 31; continue; } - bulletCollider = ((_i$8 < 0 || _i$8 >= _ref$10.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$10.$array[_ref$10.$offset + _i$8]); + /* if (!(_i$9 < _ref$11.$length)) { break; } */ if(!(_i$9 < _ref$11.$length)) { $s = 31; continue; } + bulletCollider = ((_i$9 < 0 || _i$9 >= _ref$11.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$11.$array[_ref$11.$offset + _i$9]); collision$1 = bulletCollider.Check(0, 0, new sliceType$4([])); bulletCollider.Space.Remove(new sliceType$11([bulletCollider])); addToNextRenderFrame = true; /* */ if (!(ptrType$3.nil === collision$1)) { $s = 32; continue; } /* */ $s = 33; continue; /* if (!(ptrType$3.nil === collision$1)) { */ case 32: - _ref$11 = bulletCollider.Data; - /* */ if ($assertType(_ref$11, ptrType$1, true)[1]) { $s = 34; continue; } - /* */ if ($assertType(_ref$11, ptrType$6, true)[1]) { $s = 35; continue; } + _ref$12 = bulletCollider.Data; + /* */ if ($assertType(_ref$12, ptrType$1, true)[1]) { $s = 34; continue; } + /* */ if ($assertType(_ref$12, ptrType$6, true)[1]) { $s = 35; continue; } /* */ $s = 36; continue; - /* if ($assertType(_ref$11, ptrType$1, true)[1]) { */ case 34: - v$2 = _ref$11.$val; + /* if ($assertType(_ref$12, ptrType$1, true)[1]) { */ case 34: + v$2 = _ref$12.$val; bulletShape = $assertType(bulletCollider.Shape, ptrType$7); - offender$1 = (x$9 = currRenderFrame.PlayersArr, x$10 = v$2.Bullet.OffenderJoinIndex - 1 >> 0, ((x$10 < 0 || x$10 >= x$9.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$9.$array[x$9.$offset + x$10])); - _ref$12 = collision$1.Objects; - _i$9 = 0; + offender$1 = (x$10 = currRenderFrame.PlayersArr, x$11 = v$2.Bullet.OffenderJoinIndex - 1 >> 0, ((x$11 < 0 || x$11 >= x$10.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$10.$array[x$10.$offset + x$11])); + _ref$13 = collision$1.Objects; + _i$10 = 0; /* while (true) { */ case 37: - /* if (!(_i$9 < _ref$12.$length)) { break; } */ if(!(_i$9 < _ref$12.$length)) { $s = 38; continue; } - obj$1 = ((_i$9 < 0 || _i$9 >= _ref$12.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$12.$array[_ref$12.$offset + _i$9]); + /* if (!(_i$10 < _ref$13.$length)) { break; } */ if(!(_i$10 < _ref$13.$length)) { $s = 38; continue; } + obj$1 = ((_i$10 < 0 || _i$10 >= _ref$13.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$13.$array[_ref$13.$offset + _i$10]); defenderShape = $assertType(obj$1.Shape, ptrType$7); - _ref$13 = obj$1.Data; - /* */ if ($assertType(_ref$13, ptrType$5, true)[1]) { $s = 39; continue; } + _ref$14 = obj$1.Data; + /* */ if ($assertType(_ref$14, ptrType$5, true)[1]) { $s = 39; continue; } /* */ $s = 40; continue; - /* if ($assertType(_ref$13, ptrType$5, true)[1]) { */ case 39: - t = _ref$13.$val; + /* if ($assertType(_ref$14, ptrType$5, true)[1]) { */ case 39: + t = _ref$14.$val; if (v$2.Bullet.OffenderJoinIndex === t.JoinIndex) { - _i$9++; + _i$10++; /* continue; */ $s = 37; continue; } _r$6 = CalcPushbacks(0, 0, bulletShape, defenderShape); /* */ $s = 42; case 42: if($c) { $c = false; _r$6 = _r$6.$blk(); } if (_r$6 && _r$6.$blk !== undefined) { break s; } _tuple$12 = _r$6; overlapped$1 = _tuple$12[0]; if (!overlapped$1) { - _i$9++; + _i$10++; /* continue; */ $s = 37; continue; } addToNextRenderFrame = false; _tuple$13 = (_entry$3 = invinsibleSet[$Int32.keyFor(t.CharacterState)], _entry$3 !== undefined ? [_entry$3.v, true] : [false, false]); existent$3 = _tuple$13[1]; if (existent$3) { - _i$9++; + _i$10++; /* continue; */ $s = 37; continue; } if (0 < t.FramesInvinsible) { - _i$9++; + _i$10++; /* continue; */ $s = 37; continue; } - xfac$2 = 1; + xfac$3 = 1; if (0 > offender$1.DirX) { - xfac$2 = -xfac$2; + xfac$3 = -xfac$3; } - _tmp$19 = $imul(xfac$2, v$2.Bullet.PushbackVelX); + _tmp$19 = $imul(xfac$3, v$2.Bullet.PushbackVelX); _tmp$20 = v$2.Bullet.PushbackVelY; pushbackVelX = _tmp$19; pushbackVelY = _tmp$20; - atkedPlayerInNextFrame = (x$11 = t.JoinIndex - 1 >> 0, ((x$11 < 0 || x$11 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + x$11])); + atkedPlayerInNextFrame = (x$12 = t.JoinIndex - 1 >> 0, ((x$12 < 0 || x$12 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + x$12])); atkedPlayerInNextFrame.VelX = pushbackVelX; atkedPlayerInNextFrame.VelY = pushbackVelY; if (v$2.Bullet.BlowUp) { @@ -5948,65 +6001,65 @@ $packages["jsexport/battle"] = (function() { } else { atkedPlayerInNextFrame.CharacterState = 3; } - oldFramesToRecover = (x$12 = t.JoinIndex - 1 >> 0, ((x$12 < 0 || x$12 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + x$12])).FramesToRecover; + oldFramesToRecover = (x$13 = t.JoinIndex - 1 >> 0, ((x$13 < 0 || x$13 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + x$13])).FramesToRecover; if (v$2.Bullet.HitStunFrames > oldFramesToRecover) { atkedPlayerInNextFrame.FramesToRecover = v$2.Bullet.HitStunFrames; } $s = 41; continue; /* } else { */ case 40: - t$1 = _ref$13; + t$1 = _ref$14; addToNextRenderFrame = false; /* } */ case 41: - _i$9++; + _i$10++; $s = 37; continue; case 38: $s = 36; continue; - /* } else if ($assertType(_ref$11, ptrType$6, true)[1]) { */ case 35: - v$3 = _ref$11.$val; + /* } else if ($assertType(_ref$12, ptrType$6, true)[1]) { */ case 35: + v$3 = _ref$12.$val; bulletShape$1 = $assertType(bulletCollider.Shape, ptrType$7); - offender$2 = (x$13 = currRenderFrame.PlayersArr, x$14 = v$3.Bullet.OffenderJoinIndex - 1 >> 0, ((x$14 < 0 || x$14 >= x$13.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$13.$array[x$13.$offset + x$14])); - _ref$14 = collision$1.Objects; - _i$10 = 0; + offender$2 = (x$14 = currRenderFrame.PlayersArr, x$15 = v$3.Bullet.OffenderJoinIndex - 1 >> 0, ((x$15 < 0 || x$15 >= x$14.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$14.$array[x$14.$offset + x$15])); + _ref$15 = collision$1.Objects; + _i$11 = 0; /* while (true) { */ case 43: - /* if (!(_i$10 < _ref$14.$length)) { break; } */ if(!(_i$10 < _ref$14.$length)) { $s = 44; continue; } - obj$2 = ((_i$10 < 0 || _i$10 >= _ref$14.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$14.$array[_ref$14.$offset + _i$10]); + /* if (!(_i$11 < _ref$15.$length)) { break; } */ if(!(_i$11 < _ref$15.$length)) { $s = 44; continue; } + obj$2 = ((_i$11 < 0 || _i$11 >= _ref$15.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$15.$array[_ref$15.$offset + _i$11]); defenderShape$1 = $assertType(obj$2.Shape, ptrType$7); - _ref$15 = obj$2.Data; - /* */ if ($assertType(_ref$15, ptrType$5, true)[1]) { $s = 45; continue; } + _ref$16 = obj$2.Data; + /* */ if ($assertType(_ref$16, ptrType$5, true)[1]) { $s = 45; continue; } /* */ $s = 46; continue; - /* if ($assertType(_ref$15, ptrType$5, true)[1]) { */ case 45: - t$2 = _ref$15.$val; + /* if ($assertType(_ref$16, ptrType$5, true)[1]) { */ case 45: + t$2 = _ref$16.$val; if (v$3.Bullet.OffenderJoinIndex === t$2.JoinIndex) { - _i$10++; + _i$11++; /* continue; */ $s = 43; continue; } _r$7 = CalcPushbacks(0, 0, bulletShape$1, defenderShape$1); /* */ $s = 48; case 48: if($c) { $c = false; _r$7 = _r$7.$blk(); } if (_r$7 && _r$7.$blk !== undefined) { break s; } _tuple$14 = _r$7; overlapped$2 = _tuple$14[0]; if (!overlapped$2) { - _i$10++; + _i$11++; /* continue; */ $s = 43; continue; } addToNextRenderFrame = false; _tuple$15 = (_entry$4 = invinsibleSet[$Int32.keyFor(t$2.CharacterState)], _entry$4 !== undefined ? [_entry$4.v, true] : [false, false]); existent$4 = _tuple$15[1]; if (existent$4) { - _i$10++; + _i$11++; /* continue; */ $s = 43; continue; } if (0 < t$2.FramesInvinsible) { - _i$10++; + _i$11++; /* continue; */ $s = 43; continue; } - xfac$3 = 1; + xfac$4 = 1; if (0 > offender$2.DirX) { - xfac$3 = -xfac$3; + xfac$4 = -xfac$4; } - _tmp$21 = $imul(xfac$3, v$3.Bullet.PushbackVelX); + _tmp$21 = $imul(xfac$4, v$3.Bullet.PushbackVelX); _tmp$22 = v$3.Bullet.PushbackVelY; pushbackVelX$1 = _tmp$21; pushbackVelY$1 = _tmp$22; - atkedPlayerInNextFrame$1 = (x$15 = t$2.JoinIndex - 1 >> 0, ((x$15 < 0 || x$15 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + x$15])); + atkedPlayerInNextFrame$1 = (x$16 = t$2.JoinIndex - 1 >> 0, ((x$16 < 0 || x$16 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + x$16])); atkedPlayerInNextFrame$1.VelX = pushbackVelX$1; atkedPlayerInNextFrame$1.VelY = pushbackVelY$1; if (v$3.Bullet.BlowUp) { @@ -6014,27 +6067,27 @@ $packages["jsexport/battle"] = (function() { } else { atkedPlayerInNextFrame$1.CharacterState = 3; } - oldFramesToRecover$1 = (x$16 = t$2.JoinIndex - 1 >> 0, ((x$16 < 0 || x$16 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + x$16])).FramesToRecover; + oldFramesToRecover$1 = (x$17 = t$2.JoinIndex - 1 >> 0, ((x$17 < 0 || x$17 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + x$17])).FramesToRecover; if (v$3.Bullet.HitStunFrames > oldFramesToRecover$1) { atkedPlayerInNextFrame$1.FramesToRecover = v$3.Bullet.HitStunFrames; } $s = 47; continue; /* } else { */ case 46: - t$3 = _ref$15; + t$3 = _ref$16; addToNextRenderFrame = false; /* } */ case 47: - _i$10++; + _i$11++; $s = 43; continue; case 44: /* } */ case 36: /* } */ case 33: if (addToNextRenderFrame) { - _ref$16 = bulletCollider.Data; - if ($assertType(_ref$16, ptrType$1, true)[1]) { - v$4 = _ref$16.$val; + _ref$17 = bulletCollider.Data; + if ($assertType(_ref$17, ptrType$1, true)[1]) { + v$4 = _ref$17.$val; nextRenderFrameMeleeBullets = $append(nextRenderFrameMeleeBullets, v$4); - } else if ($assertType(_ref$16, ptrType$6, true)[1]) { - v$5 = _ref$16.$val; + } else if ($assertType(_ref$17, ptrType$6, true)[1]) { + v$5 = _ref$17.$val; _tmp$23 = v$5.VirtualGridX + v$5.VelX >> 0; _tmp$24 = v$5.VirtualGridY + v$5.VelY >> 0; v$5.VirtualGridX = _tmp$23; @@ -6042,33 +6095,41 @@ $packages["jsexport/battle"] = (function() { nextRenderFrameFireballBullets = $append(nextRenderFrameFireballBullets, v$5); } } - _i$8++; + _i$9++; $s = 30; continue; case 31: - _ref$17 = currRenderFrame.PlayersArr; - _i$11 = 0; + _ref$18 = currRenderFrame.PlayersArr; + _i$12 = 0; while (true) { - if (!(_i$11 < _ref$17.$length)) { break; } - i$4 = _i$11; - currPlayerDownsync$4 = ((_i$11 < 0 || _i$11 >= _ref$17.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$17.$array[_ref$17.$offset + _i$11]); + if (!(_i$12 < _ref$18.$length)) { break; } + i$4 = _i$12; + currPlayerDownsync$4 = ((_i$12 < 0 || _i$12 >= _ref$18.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$18.$array[_ref$18.$offset + _i$12]); joinIndex$3 = currPlayerDownsync$4.JoinIndex; playerCollider$2 = ((i$4 < 0 || i$4 >= playerColliders.$length) ? ($throwRuntimeError("index out of range"), undefined) : playerColliders.$array[playerColliders.$offset + i$4]); thatPlayerInNextFrame$3 = ((i$4 < 0 || i$4 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$4]); - _tuple$16 = PolygonColliderBLToVirtualGridPos(playerCollider$2.X - (x$17 = joinIndex$3 - 1 >> 0, ((x$17 < 0 || x$17 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$17])).X, playerCollider$2.Y - (x$18 = joinIndex$3 - 1 >> 0, ((x$18 < 0 || x$18 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$18])).Y, playerCollider$2.W * 0.5, playerCollider$2.H * 0.5, 0, 0, 0, 0, collisionSpaceOffsetX, collisionSpaceOffsetY); + _tuple$16 = PolygonColliderBLToVirtualGridPos(playerCollider$2.X - (x$18 = joinIndex$3 - 1 >> 0, ((x$18 < 0 || x$18 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$18])).X, playerCollider$2.Y - (x$19 = joinIndex$3 - 1 >> 0, ((x$19 < 0 || x$19 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$19])).Y, playerCollider$2.W * 0.5, playerCollider$2.H * 0.5, 0, 0, 0, 0, collisionSpaceOffsetX, collisionSpaceOffsetY); thatPlayerInNextFrame$3.VirtualGridX = _tuple$16[0]; thatPlayerInNextFrame$3.VirtualGridY = _tuple$16[1]; if (thatPlayerInNextFrame$3.InAir) { oldNextCharacterState = thatPlayerInNextFrame$3.CharacterState; - _2 = oldNextCharacterState; - if ((_2 === (0)) || (_2 === (1))) { + _3 = oldNextCharacterState; + if (_3 === (0)) { if (((i$4 < 0 || i$4 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$4]) || (5 === currPlayerDownsync$4.CharacterState)) { thatPlayerInNextFrame$3.CharacterState = 5; } else { thatPlayerInNextFrame$3.CharacterState = 4; } - } else if (_2 === (2)) { + } else if (_3 === (1)) { + if (thatPlayerInNextFrame$3.OnWall) { + thatPlayerInNextFrame$3.CharacterState = 16; + } else if (((i$4 < 0 || i$4 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$4]) || (5 === currPlayerDownsync$4.CharacterState)) { + thatPlayerInNextFrame$3.CharacterState = 5; + } else { + thatPlayerInNextFrame$3.CharacterState = 4; + } + } else if (_3 === (2)) { thatPlayerInNextFrame$3.CharacterState = 6; - } else if (_2 === (3)) { + } else if (_3 === (3)) { thatPlayerInNextFrame$3.CharacterState = 7; } } @@ -6081,18 +6142,18 @@ $packages["jsexport/battle"] = (function() { thatPlayerInNextFrame$3.ActiveSkillId = -1; thatPlayerInNextFrame$3.ActiveSkillHit = -1; } - _i$11++; - } - _ref$18 = playerColliders; - _i$12 = 0; - while (true) { - if (!(_i$12 < _ref$18.$length)) { break; } - playerCollider$3 = ((_i$12 < 0 || _i$12 >= _ref$18.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$18.$array[_ref$18.$offset + _i$12]); - playerCollider$3.Space.Remove(new sliceType$11([playerCollider$3])); _i$12++; } + _ref$19 = playerColliders; + _i$13 = 0; + while (true) { + if (!(_i$13 < _ref$19.$length)) { break; } + playerCollider$3 = ((_i$13 < 0 || _i$13 >= _ref$19.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$19.$array[_ref$19.$offset + _i$13]); + playerCollider$3.Space.Remove(new sliceType$11([playerCollider$3])); + _i$13++; + } $s = -1; return new RoomDownsyncFrame.ptr(currRenderFrame.Id + 1 >> 0, nextRenderFramePlayers, new $Int64(0, 0), nextRenderFrameMeleeBullets, nextRenderFrameFireballBullets, new $Uint64(0, 0), false, bulletLocalId); - /* */ } return; } var $f = {$blk: ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame, $c: true, $r, _1, _2, _entry, _entry$1, _entry$2, _entry$3, _entry$4, _entry$5, _i, _i$1, _i$10, _i$11, _i$12, _i$2, _i$3, _i$4, _i$5, _i$6, _i$7, _i$8, _i$9, _index, _index$1, _index$2, _r, _r$1, _r$2, _r$3, _r$4, _r$5, _r$6, _r$7, _ref, _ref$1, _ref$10, _ref$11, _ref$12, _ref$13, _ref$14, _ref$15, _ref$16, _ref$17, _ref$18, _ref$2, _ref$3, _ref$4, _ref$5, _ref$6, _ref$7, _ref$8, _ref$9, _tmp, _tmp$1, _tmp$10, _tmp$11, _tmp$12, _tmp$13, _tmp$14, _tmp$15, _tmp$16, _tmp$17, _tmp$18, _tmp$19, _tmp$2, _tmp$20, _tmp$21, _tmp$22, _tmp$23, _tmp$24, _tmp$3, _tmp$4, _tmp$5, _tmp$6, _tmp$7, _tmp$8, _tmp$9, _tuple, _tuple$1, _tuple$10, _tuple$11, _tuple$12, _tuple$13, _tuple$14, _tuple$15, _tuple$16, _tuple$17, _tuple$2, _tuple$3, _tuple$4, _tuple$5, _tuple$6, _tuple$7, _tuple$8, _tuple$9, addToNextRenderFrame, atkedPlayerInNextFrame, atkedPlayerInNextFrame$1, bShape, bulletCollider, bulletColliders, bulletLocalId, bulletShape, bulletShape$1, bulletWx, bulletWx$1, bulletWy, bulletWy$1, chConfig, chConfig$1, chConfig$2, chConfigsOrderedByJoinIndex, colliderHeight, colliderWidth, colliderWorldHeight, colliderWorldWidth, collision, collision$1, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currPlayerDownsync, currPlayerDownsync$1, currPlayerDownsync$2, currPlayerDownsync$3, currPlayerDownsync$4, currRenderFrame, defenderShape, defenderShape$1, effDx, effDy, effPushbacks, existent, existent$1, existent$2, existent$3, existent$4, existent$5, fireballBullet, halfColliderHeightDiff, halfColliderWidthDiff, halfColliderWorldHeightDiff, hardPushbackNorm, hardPushbackNorms, hasLockVel, hitboxSizeWx, hitboxSizeWx$1, hitboxSizeWy, hitboxSizeWy$1, i, i$1, i$2, i$3, i$4, inputsBuffer, isAnotherPlayer, isBarrier, isBullet, joinIndex, joinIndex$1, joinIndex$2, joinIndex$3, jumpedOrNot, jumpedOrNotList, landedOnGravityPushback, meleeBullet, newBullet, newBullet$1, newBulletCollider, newBulletCollider$1, newVx, newVy, nextRenderFrameFireballBullets, nextRenderFrameMeleeBullets, nextRenderFramePlayers, normAlignmentWithGravity, obj, obj$1, obj$2, offender, offender$1, offender$2, oldFramesToRecover, oldFramesToRecover$1, oldNextCharacterState, overlapResult, overlapped, overlapped$1, overlapped$2, patternId, playerCollider, playerCollider$1, playerCollider$2, playerCollider$3, playerColliders, playerShape, projectedMagnitude, pushbackVelX, pushbackVelX$1, pushbackVelY, pushbackVelY$1, pushbackX, pushbackY, roomCapacity, skillConfig, skillId, t, t$1, t$2, t$3, thatPlayerInNextFrame, thatPlayerInNextFrame$1, thatPlayerInNextFrame$2, thatPlayerInNextFrame$3, v, v$1, v$2, v$3, v$4, v$5, wx, wy, x, x$1, x$10, x$11, x$12, x$13, x$14, x$15, x$16, x$17, x$18, x$2, x$3, x$4, x$5, x$6, x$7, x$8, x$9, xfac, xfac$1, xfac$2, xfac$3, $s};return $f; + /* */ } return; } var $f = {$blk: ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame, $c: true, $r, _1, _2, _3, _entry, _entry$1, _entry$2, _entry$3, _entry$4, _entry$5, _i, _i$1, _i$10, _i$11, _i$12, _i$13, _i$2, _i$3, _i$4, _i$5, _i$6, _i$7, _i$8, _i$9, _index, _index$1, _index$2, _r, _r$1, _r$2, _r$3, _r$4, _r$5, _r$6, _r$7, _ref, _ref$1, _ref$10, _ref$11, _ref$12, _ref$13, _ref$14, _ref$15, _ref$16, _ref$17, _ref$18, _ref$19, _ref$2, _ref$3, _ref$4, _ref$5, _ref$6, _ref$7, _ref$8, _ref$9, _tmp, _tmp$1, _tmp$10, _tmp$11, _tmp$12, _tmp$13, _tmp$14, _tmp$15, _tmp$16, _tmp$17, _tmp$18, _tmp$19, _tmp$2, _tmp$20, _tmp$21, _tmp$22, _tmp$23, _tmp$24, _tmp$3, _tmp$4, _tmp$5, _tmp$6, _tmp$7, _tmp$8, _tmp$9, _tuple, _tuple$1, _tuple$10, _tuple$11, _tuple$12, _tuple$13, _tuple$14, _tuple$15, _tuple$16, _tuple$17, _tuple$2, _tuple$3, _tuple$4, _tuple$5, _tuple$6, _tuple$7, _tuple$8, _tuple$9, addToNextRenderFrame, atkedPlayerInNextFrame, atkedPlayerInNextFrame$1, bShape, bulletCollider, bulletColliders, bulletLocalId, bulletShape, bulletShape$1, bulletWx, bulletWx$1, bulletWy, bulletWy$1, chConfig, chConfig$1, chConfig$2, chConfigsOrderedByJoinIndex, colliderHeight, colliderWidth, colliderWorldHeight, colliderWorldWidth, collision, collision$1, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, ctrlAlignmentWithHorizon1, ctrlAlignmentWithHorizon2, currPlayerDownsync, currPlayerDownsync$1, currPlayerDownsync$2, currPlayerDownsync$3, currPlayerDownsync$4, currRenderFrame, defenderShape, defenderShape$1, effDx, effDy, effPushbacks, existent, existent$1, existent$2, existent$3, existent$4, existent$5, fallStopping, fireballBullet, halfColliderHeightDiff, halfColliderWidthDiff, halfColliderWorldHeightDiff, hardPushbackNorm, hardPushbackNorm$1, hardPushbackNorms, hasLockVel, hitboxSizeWx, hitboxSizeWx$1, hitboxSizeWy, hitboxSizeWy$1, i, i$1, i$2, i$3, i$4, inputsBuffer, isAnotherPlayer, isBarrier, isBullet, joinIndex, joinIndex$1, joinIndex$2, joinIndex$3, jumpedOrNot, jumpedOrNotList, landedOnGravityPushback, meleeBullet, newBullet, newBullet$1, newBulletCollider, newBulletCollider$1, newVx, newVy, nextRenderFrameFireballBullets, nextRenderFrameMeleeBullets, nextRenderFramePlayers, normAlignmentWithGravity, normAlignmentWithHorizon1, normAlignmentWithHorizon2, obj, obj$1, obj$2, offender, offender$1, offender$2, oldFramesToRecover, oldFramesToRecover$1, oldNextCharacterState, overlapResult, overlapped, overlapped$1, overlapped$2, patternId, playerCollider, playerCollider$1, playerCollider$2, playerCollider$3, playerColliders, playerShape, projectedMagnitude, pushbackVelX, pushbackVelX$1, pushbackVelY, pushbackVelY$1, pushbackX, pushbackY, roomCapacity, skillConfig, skillId, t, t$1, t$2, t$3, thatPlayerInNextFrame, thatPlayerInNextFrame$1, thatPlayerInNextFrame$2, thatPlayerInNextFrame$3, v, v$1, v$2, v$3, v$4, v$5, wx, wy, x, x$1, x$10, x$11, x$12, x$13, x$14, x$15, x$16, x$17, x$18, x$19, x$2, x$3, x$4, x$5, x$6, x$7, x$8, x$9, xfac, xfac$1, xfac$2, xfac$3, xfac$4, $s};return $f; }; $pkg.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame = ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame; GenerateRectCollider = function(wx, wy, w, h, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, data, tag) { @@ -6210,7 +6271,7 @@ $packages["jsexport/battle"] = (function() { NpcPatrolCue.init("", [{prop: "FlAct", name: "FlAct", embedded: false, exported: true, typ: $Uint64, tag: ""}, {prop: "FrAct", name: "FrAct", embedded: false, exported: true, typ: $Uint64, tag: ""}, {prop: "X", name: "X", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "Y", name: "Y", embedded: false, exported: true, typ: $Float64, tag: ""}]); RingBuffer.init("", [{prop: "Ed", name: "Ed", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "St", name: "St", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "EdFrameId", name: "EdFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "StFrameId", name: "StFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "N", name: "N", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Cnt", name: "Cnt", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Eles", name: "Eles", embedded: false, exported: true, typ: sliceType$2, tag: ""}]); SkillMapperType.init([$Int, ptrType$5], [$Int], false); - CharacterConfig.init("", [{prop: "SpeciesId", name: "SpeciesId", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "SpeciesName", name: "SpeciesName", embedded: false, exported: true, typ: $String, tag: ""}, {prop: "InAirIdleFrameIdxTurningPoint", name: "InAirIdleFrameIdxTurningPoint", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "InAirIdleFrameIdxTurnedCycle", name: "InAirIdleFrameIdxTurnedCycle", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "LayDownFrames", name: "LayDownFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "LayDownFramesToRecover", name: "LayDownFramesToRecover", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "GetUpInvinsibleFrames", name: "GetUpInvinsibleFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "GetUpFramesToRecover", name: "GetUpFramesToRecover", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Speed", name: "Speed", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "JumpingInitVelY", name: "JumpingInitVelY", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "SkillMapper", name: "SkillMapper", embedded: false, exported: true, typ: SkillMapperType, tag: ""}]); + CharacterConfig.init("", [{prop: "SpeciesId", name: "SpeciesId", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "SpeciesName", name: "SpeciesName", embedded: false, exported: true, typ: $String, tag: ""}, {prop: "InAirIdleFrameIdxTurningPoint", name: "InAirIdleFrameIdxTurningPoint", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "InAirIdleFrameIdxTurnedCycle", name: "InAirIdleFrameIdxTurnedCycle", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "LayDownFrames", name: "LayDownFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "LayDownFramesToRecover", name: "LayDownFramesToRecover", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "GetUpInvinsibleFrames", name: "GetUpInvinsibleFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "GetUpFramesToRecover", name: "GetUpFramesToRecover", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Speed", name: "Speed", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "JumpingInitVelY", name: "JumpingInitVelY", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "DashingEnabled", name: "DashingEnabled", embedded: false, exported: true, typ: $Bool, tag: ""}, {prop: "OnWallEnabled", name: "OnWallEnabled", embedded: false, exported: true, typ: $Bool, tag: ""}, {prop: "WallJumpingInitVelX", name: "WallJumpingInitVelX", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "WallJumpingInitVelY", name: "WallJumpingInitVelY", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "WallSlidingVelY", name: "WallSlidingVelY", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "SkillMapper", name: "SkillMapper", embedded: false, exported: true, typ: SkillMapperType, tag: ""}]); SatResult.init("", [{prop: "Overlap", name: "Overlap", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "OverlapX", name: "OverlapX", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "OverlapY", name: "OverlapY", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "AContainedInB", name: "AContainedInB", embedded: false, exported: true, typ: $Bool, tag: ""}, {prop: "BContainedInA", name: "BContainedInA", embedded: false, exported: true, typ: $Bool, tag: ""}, {prop: "Axis", name: "Axis", embedded: false, exported: true, typ: resolv.Vector, tag: ""}]); $init = function() { $pkg.$init = function() {}; @@ -6218,8 +6279,8 @@ $packages["jsexport/battle"] = (function() { $r = math.$init(); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } $r = resolv.$init(); /* */ $s = 2; case 2: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } $pkg.DIRECTION_DECODER = new sliceType$1([new sliceType([0, 0]), new sliceType([0, 2]), new sliceType([0, -2]), new sliceType([2, 0]), new sliceType([-2, 0]), new sliceType([1, 1]), new sliceType([-1, -1]), new sliceType([1, -1]), new sliceType([-1, 1])]); - skills = $makeMap($Int.keyFor, [{ k: 1, v: new Skill.ptr(0, 30, 30, 30, 1, 2, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 0, 7, 13, 30, 22, 13, 9, 50, 0, 5, 5, -1, 1200, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 2 }]), 0))])) }, { k: 2, v: new Skill.ptr(0, 36, 36, 36, 1, 11, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 0, 18, 22, 36, 18, 18, 9, 50, 0, 5, 10, -1, 1800, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 3 }]), 0))])) }, { k: 3, v: new Skill.ptr(0, 50, 50, 50, 1, 12, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 0, 8, 0, 0, 30, 999999999, 9, 200, 700, 10, 50, 500, 1600, 800, 3200, 3200, true, false, 0))])) }, { k: 4, v: new Skill.ptr(0, 30, 30, 30, 1, 2, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 0, 7, 13, 30, 22, 13, 9, 50, 0, 5, 5, -1, 1200, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 5 }]), 0))])) }, { k: 5, v: new Skill.ptr(0, 36, 36, 36, 1, 11, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 0, 18, 22, 36, 18, 18, 9, 50, 0, 5, 10, -1, 1800, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 6 }]), 0))])) }, { k: 6, v: new Skill.ptr(0, 45, 45, 45, 1, 12, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 0, 8, 0, 0, 28, 999999999, 9, 200, -1, 10, -10, -1, 2400, 0, 3200, 3200, true, false, 0))])) }, { k: 7, v: new Skill.ptr(0, 30, 30, 30, 1, 2, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 0, 7, 13, 30, 22, 13, 9, 50, 0, 5, -1, -1, 1200, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 8 }]), 0))])) }, { k: 8, v: new Skill.ptr(0, 36, 36, 36, 1, 11, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 0, 18, 22, 36, 18, 18, 9, 50, 0, 5, 10, -1, 1800, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 9 }]), 0))])) }, { k: 9, v: new Skill.ptr(0, 40, 40, 40, 1, 12, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 0, 7, 0, 0, 30, 999999999, 9, 200, 400, 10, 100, -1, 1000, 0, 3200, 3200, true, false, 0))])) }, { k: 10, v: new Skill.ptr(0, 40, 40, 40, 1, 13, new sliceType$2([new FireballBullet.ptr(0, 0, 0, 0, 0, 0, 800, 1, new Bullet.ptr(0, 0, 0, 15, 0, 0, 999999999, 15, 9, 200, 0, 20, -1, -1, 3200, 500, 4800, 3200, false, false, 0))])) }, { k: 11, v: new Skill.ptr(0, 60, 60, 60, 1, 14, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 0, 3, 0, 0, 25, 999999999, 9, 200, 700, 30, 100, 800, 800, 0, 4000, 6400, true, false, 0))])) }, { k: 255, v: new Skill.ptr(0, 30, 30, 30, 1, 6, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 0, 3, 0, 0, 20, 18, 9, 50, 0, 5, -1, -1, 1200, 0, 3200, 2400, false, false, 0))])) }, { k: 256, v: new Skill.ptr(0, 20, 20, 20, 1, 6, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 0, 3, 0, 0, 10, 15, 9, 50, 0, 5, -1, -1, 1200, 0, 3200, 2400, false, false, 0))])) }, { k: 257, v: new Skill.ptr(0, 30, 30, 30, 1, 6, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 0, 3, 0, 0, 20, 18, 9, 50, 0, 5, -1, -1, 1200, 0, 3200, 2400, false, false, 0))])) }]); - $pkg.Characters = $makeMap($Int.keyFor, [{ k: 0, v: new CharacterConfig.ptr(0, "MonkGirl", 11, 1, 16, 16, 10, 27, 120, 800, (function(patternId, currPlayerDownsync) { + skills = $makeMap($Int.keyFor, [{ k: 1, v: new Skill.ptr(0, 30, 30, 30, 1, 2, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 0, 7, 13, 30, 22, 13, 9, 50, 0, 5, 5, -1, 1200, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 2 }]), 0))])) }, { k: 2, v: new Skill.ptr(0, 36, 36, 36, 1, 11, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 0, 18, 22, 36, 18, 18, 9, 50, 0, 5, 10, -1, 1800, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 3 }]), 0))])) }, { k: 3, v: new Skill.ptr(0, 50, 50, 50, 1, 12, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 0, 8, 0, 0, 30, 999999999, 9, 200, 700, 10, 50, 500, 1600, 800, 3200, 3200, true, false, 0))])) }, { k: 4, v: new Skill.ptr(0, 30, 30, 30, 1, 2, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 0, 7, 13, 30, 22, 13, 9, 50, 0, 5, 5, -1, 1200, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 5 }]), 0))])) }, { k: 5, v: new Skill.ptr(0, 36, 36, 36, 1, 11, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 0, 18, 22, 36, 18, 18, 9, 50, 0, 5, 10, -1, 1800, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 6 }]), 0))])) }, { k: 6, v: new Skill.ptr(0, 45, 45, 45, 1, 12, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 0, 8, 0, 0, 28, 999999999, 9, 200, 300, 10, -1, -1, 2400, 0, 3200, 3200, true, false, 0))])) }, { k: 7, v: new Skill.ptr(0, 30, 30, 30, 1, 2, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 0, 7, 13, 30, 22, 13, 9, 50, 0, 5, -1, -1, 1200, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 8 }]), 0))])) }, { k: 8, v: new Skill.ptr(0, 36, 36, 36, 1, 11, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 0, 18, 22, 36, 18, 18, 9, 50, 0, 5, 10, -1, 1800, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 9 }]), 0))])) }, { k: 9, v: new Skill.ptr(0, 40, 40, 40, 1, 12, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 0, 7, 0, 0, 30, 999999999, 9, 200, 400, 10, 100, -1, 1000, 0, 3200, 3200, true, false, 0))])) }, { k: 10, v: new Skill.ptr(0, 40, 40, 40, 1, 13, new sliceType$2([new FireballBullet.ptr(0, 0, 0, 0, 0, 0, 800, 1, new Bullet.ptr(0, 0, 0, 15, 0, 0, 999999999, 15, 9, 200, 0, 20, -1, -1, 3200, 500, 4800, 3200, false, false, 0))])) }, { k: 11, v: new Skill.ptr(0, 60, 60, 60, 1, 14, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 0, 3, 0, 0, 25, 999999999, 9, 200, 700, 30, 100, 800, 800, 0, 4000, 6400, true, false, 0))])) }, { k: 255, v: new Skill.ptr(0, 30, 30, 30, 1, 6, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 0, 3, 0, 0, 20, 18, 9, 50, 0, 5, -1, -1, 1200, 0, 3200, 2400, false, false, 0))])) }, { k: 256, v: new Skill.ptr(0, 20, 20, 20, 1, 6, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 0, 3, 0, 0, 10, 15, 9, 50, 0, 5, -1, -1, 1200, 0, 3200, 2400, false, false, 0))])) }, { k: 257, v: new Skill.ptr(0, 30, 30, 30, 1, 6, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 0, 3, 0, 0, 20, 18, 9, 50, 0, 5, -1, -1, 1200, 0, 3200, 2400, false, false, 0))])) }]); + $pkg.Characters = $makeMap($Int.keyFor, [{ k: 0, v: new CharacterConfig.ptr(0, "MonkGirl", 11, 1, 16, 16, 10, 27, 120, 800, false, false, 0, 0, 0, (function(patternId, currPlayerDownsync) { var _entry, _entry$1, _ref, _tuple, _tuple$1, currPlayerDownsync, existent1, existent2, nextSkillId, patternId, skillConfig, v, x, x$1; if (1 === patternId) { if (0 === currPlayerDownsync.FramesToRecover) { @@ -6249,7 +6310,7 @@ $packages["jsexport/battle"] = (function() { } } return -1; - })) }, { k: 1, v: new CharacterConfig.ptr(1, "KnifeGirl", 9, 1, 16, 16, 10, 27, 140, 750, (function(patternId, currPlayerDownsync) { + })) }, { k: 1, v: new CharacterConfig.ptr(1, "KnifeGirl", 9, 1, 16, 16, 10, 27, 140, 750, true, true, 700, 700, -100, (function(patternId, currPlayerDownsync) { var _entry, _entry$1, _ref, _tuple, _tuple$1, currPlayerDownsync, existent1, existent2, nextSkillId, patternId, skillConfig, v, x, x$1; if (1 === patternId) { if (0 === currPlayerDownsync.FramesToRecover) { @@ -6279,7 +6340,7 @@ $packages["jsexport/battle"] = (function() { } } return -1; - })) }, { k: 4096, v: new CharacterConfig.ptr(4096, "Monk", 42, 2, 14, 14, 8, 30, 100, 750, (function(patternId, currPlayerDownsync) { + })) }, { k: 4096, v: new CharacterConfig.ptr(4096, "Monk", 42, 2, 14, 14, 8, 30, 100, 750, false, false, 0, 0, 0, (function(patternId, currPlayerDownsync) { var _entry, _entry$1, _ref, _tuple, _tuple$1, currPlayerDownsync, existent1, existent2, nextSkillId, patternId, skillConfig, v, x, x$1; if (1 === patternId) { if (0 === currPlayerDownsync.FramesToRecover) { @@ -6318,7 +6379,7 @@ $packages["jsexport/battle"] = (function() { } return -1; })) }]); - inAirSet = $makeMap($Int32.keyFor, [{ k: 4, v: true }, { k: 5, v: true }, { k: 6, v: true }, { k: 7, v: true }, { k: 8, v: true }]); + inAirSet = $makeMap($Int32.keyFor, [{ k: 4, v: true }, { k: 5, v: true }, { k: 6, v: true }, { k: 7, v: true }, { k: 8, v: true }, { k: 16, v: true }]); noOpSet = $makeMap($Int32.keyFor, [{ k: 3, v: true }, { k: 7, v: true }, { k: 8, v: true }, { k: 9, v: true }]); invinsibleSet = $makeMap($Int32.keyFor, [{ k: 8, v: true }, { k: 9, v: true }, { k: 10, v: true }]); nonAttackingSet = $makeMap($Int32.keyFor, [{ k: 0, v: true }, { k: 1, v: true }, { k: 4, v: true }, { k: 5, v: true }, { k: 3, v: true }, { k: 7, v: true }, { k: 8, v: true }, { k: 9, v: true }, { k: 10, v: true }]); @@ -6348,7 +6409,7 @@ $packages["jsexport"] = (function() { funcType = $funcType([$Float64, $Float64], [ptrType$5], false); funcType$1 = $funcType([ptrType, sliceType$1], [ptrType$5], false); funcType$2 = $funcType([ptrType$1], [ptrType$5], false); - funcType$3 = $funcType([$Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Bool, $Int32, $Int32], [ptrType$5], false); + funcType$3 = $funcType([$Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Bool, $Bool, $Int32, $Int32], [ptrType$5], false); funcType$4 = $funcType([$Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Bool, $Int32], [ptrType$5], false); funcType$5 = $funcType([$Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Bool, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32], [ptrType$5], false); funcType$6 = $funcType([$Uint64, $Uint64, $Float64, $Float64], [ptrType$5], false); @@ -6420,9 +6481,9 @@ $packages["jsexport"] = (function() { return js.MakeWrapper(new battle.Barrier.ptr(boundary)); }; $pkg.NewBarrierJs = NewBarrierJs; - NewPlayerDownsyncJs = function(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, framesToRecover, framesInChState, activeSkillId, activeSkillHit, framesInvinsible, speed, battleState, characterState, joinIndex, hp, maxHp, colliderRadius, inAir, bulletTeamId, chCollisionTeamId) { - var activeSkillHit, activeSkillId, battleState, bulletTeamId, chCollisionTeamId, characterState, colliderRadius, dirX, dirY, framesInChState, framesInvinsible, framesToRecover, hp, id, inAir, joinIndex, maxHp, speed, velX, velY, virtualGridX, virtualGridY; - return js.MakeWrapper(new battle.PlayerDownsync.ptr(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, speed, battleState, joinIndex, colliderRadius, false, 0, 0, framesToRecover, framesInChState, hp, maxHp, characterState, inAir, false, activeSkillId, activeSkillHit, framesInvinsible, bulletTeamId, chCollisionTeamId)); + NewPlayerDownsyncJs = function(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, framesToRecover, framesInChState, activeSkillId, activeSkillHit, framesInvinsible, speed, battleState, characterState, joinIndex, hp, maxHp, colliderRadius, inAir, onWall, bulletTeamId, chCollisionTeamId) { + var activeSkillHit, activeSkillId, battleState, bulletTeamId, chCollisionTeamId, characterState, colliderRadius, dirX, dirY, framesInChState, framesInvinsible, framesToRecover, hp, id, inAir, joinIndex, maxHp, onWall, speed, velX, velY, virtualGridX, virtualGridY; + return js.MakeWrapper(new battle.PlayerDownsync.ptr(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, speed, battleState, joinIndex, colliderRadius, false, 0, 0, framesToRecover, framesInChState, hp, maxHp, characterState, inAir, onWall, activeSkillId, activeSkillHit, framesInvinsible, bulletTeamId, chCollisionTeamId)); }; $pkg.NewPlayerDownsyncJs = NewPlayerDownsyncJs; NewMeleeBulletJs = function(bulletLocalId, originatedRenderFrameId, offenderJoinIndex, startupFrames, cancellableStFrame, cancellableEdFrame, activeFrames, hitStunFrames, blockStunFrames, pushbackVelX, pushbackVelY, damage, selfLockVelX, selfLockVelY, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY, blowUp, teamId) { diff --git a/frontend/assets/resources/animation/KnifeGirl/Dashing.anim b/frontend/assets/resources/animation/KnifeGirl/Dashing.anim new file mode 100644 index 0000000..e64355c --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/Dashing.anim @@ -0,0 +1,61 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "Dashing", + "_objFlags": 0, + "_native": "", + "_duration": 0.35, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "cf396dac-50c9-4389-90c0-55f49fd3276d" + } + }, + { + "frame": 0.05, + "value": { + "__uuid__": "b9e4b5d5-c296-48c8-aa60-d22db0e5a632" + } + }, + { + "frame": 0.11666666666666667, + "value": { + "__uuid__": "e456c710-69f5-4dcc-9f5d-dd486a9198a1" + } + }, + { + "frame": 0.16666666666666666, + "value": { + "__uuid__": "ec6df76f-0004-4216-9b83-449487fe0cda" + } + }, + { + "frame": 0.23333333333333334, + "value": { + "__uuid__": "26032d0f-845c-4b96-89a6-d88113ed7827" + } + }, + { + "frame": 0.2833333333333333, + "value": { + "__uuid__": "e3e0169c-3c56-4206-a20e-35e4d0471873" + } + }, + { + "frame": 0.3333333333333333, + "value": { + "__uuid__": "80b98036-c5de-492b-b0e8-f1703f3a7d20" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/KnifeGirl/Dashing.anim.meta b/frontend/assets/resources/animation/KnifeGirl/Dashing.anim.meta new file mode 100644 index 0000000..fcc25e9 --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/Dashing.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "38b2c892-347b-4009-93f8-65b2ab1614f0", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.plist b/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.plist index fbfe783..31849f7 100644 --- a/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.plist +++ b/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.plist @@ -15,9 +15,9 @@ spriteSourceSize {112,128} textureRect - {{824,544},{112,128}} + {{806,750},{112,128}} textureRotated - + Atk1_1.png @@ -30,9 +30,9 @@ spriteSourceSize {112,128} textureRect - {{0,1200},{112,128}} + {{0,1076},{112,128}} textureRotated - + Atk1_10.png @@ -60,7 +60,7 @@ spriteSourceSize {80,128} textureRect - {{940,0},{80,128}} + {{528,515},{80,128}} textureRotated @@ -75,7 +75,7 @@ spriteSourceSize {80,128} textureRect - {{940,128},{80,128}} + {{934,640},{80,128}} textureRotated @@ -90,9 +90,9 @@ spriteSourceSize {112,128} textureRect - {{0,964},{112,128}} + {{128,1076},{112,128}} textureRotated - + Atk1_4.png @@ -105,9 +105,9 @@ spriteSourceSize {112,128} textureRect - {{112,964},{112,128}} + {{678,862},{112,128}} textureRotated - + Atk1_5.png @@ -120,7 +120,7 @@ spriteSourceSize {96,128} textureRect - {{840,288},{96,128}} + {{512,643},{96,128}} textureRotated @@ -135,7 +135,7 @@ spriteSourceSize {96,128} textureRect - {{840,416},{96,128}} + {{512,771},{96,128}} textureRotated @@ -150,7 +150,7 @@ spriteSourceSize {80,128} textureRect - {{940,256},{80,128}} + {{934,768},{80,128}} textureRotated @@ -165,7 +165,7 @@ spriteSourceSize {80,128} textureRect - {{936,384},{80,128}} + {{934,896},{80,128}} textureRotated @@ -180,9 +180,9 @@ spriteSourceSize {80,128} textureRect - {{936,512},{80,128}} + {{806,958},{80,128}} textureRotated - + Atk2_0.png @@ -195,7 +195,7 @@ spriteSourceSize {80,128} textureRect - {{936,640},{80,128}} + {{934,1024},{80,128}} textureRotated @@ -210,7 +210,7 @@ spriteSourceSize {96,128} textureRect - {{582,531},{96,128}} + {{512,899},{96,128}} textureRotated @@ -225,7 +225,7 @@ spriteSourceSize {128,112} textureRect - {{326,871},{128,112}} + {{128,964},{128,112}} textureRotated @@ -240,7 +240,7 @@ spriteSourceSize {96,96} textureRect - {{696,1200},{96,96}} + {{912,1152},{96,96}} textureRotated @@ -255,7 +255,7 @@ spriteSourceSize {96,112} textureRect - {{416,983},{96,112}} + {{340,1197},{96,112}} textureRotated @@ -270,7 +270,7 @@ spriteSourceSize {96,112} textureRect - {{656,1092},{96,112}} + {{452,1196},{96,112}} textureRotated @@ -285,9 +285,9 @@ spriteSourceSize {96,112} textureRect - {{528,1113},{96,112}} + {{564,1155},{96,112}} textureRotated - + Atk2_5.png @@ -300,9 +300,9 @@ spriteSourceSize {96,112} textureRect - {{392,1207},{96,112}} + {{608,1043},{96,112}} textureRotated - + Atk2_6.png @@ -330,7 +330,7 @@ spriteSourceSize {128,112} textureRect - {{454,871},{128,112}} + {{678,750},{128,112}} textureRotated @@ -525,7 +525,7 @@ spriteSourceSize {96,128} textureRect - {{582,659},{96,128}} + {{512,1027},{96,128}} textureRotated @@ -540,7 +540,7 @@ spriteSourceSize {112,112} textureRect - {{240,1081},{112,112}} + {{448,1293},{112,112}} textureRotated @@ -555,7 +555,7 @@ spriteSourceSize {96,112} textureRect - {{504,1209},{96,112}} + {{660,1155},{96,112}} textureRotated @@ -570,7 +570,7 @@ spriteSourceSize {128,112} textureRect - {{678,980},{128,112}} + {{384,988},{128,112}} textureRotated @@ -634,6 +634,111 @@ textureRotated + Dashing_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {114,112} + spriteSourceSize + {114,112} + textureRect + {{0,1188},{114,112}} + textureRotated + + + Dashing_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {114,112} + spriteSourceSize + {114,112} + textureRect + {{114,1188},{114,112}} + textureRotated + + + Dashing_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {114,112} + spriteSourceSize + {114,112} + textureRect + {{0,1300},{114,112}} + textureRotated + + + Dashing_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {114,112} + spriteSourceSize + {114,112} + textureRect + {{112,1300},{114,112}} + textureRotated + + + Dashing_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {114,112} + spriteSourceSize + {114,112} + textureRect + {{0,1300},{114,112}} + textureRotated + + + Dashing_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {114,112} + spriteSourceSize + {114,112} + textureRect + {{224,1300},{114,112}} + textureRotated + + + Dashing_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {114,112} + spriteSourceSize + {114,112} + textureRect + {{336,1293},{114,112}} + textureRotated + + GetUp1_1.png aliases @@ -645,7 +750,7 @@ spriteSourceSize {128,118} textureRect - {{806,791},{128,118}} + {{384,634},{128,118}} textureRotated @@ -660,7 +765,7 @@ spriteSourceSize {128,118} textureRect - {{0,846},{128,118}} + {{384,752},{128,118}} textureRotated @@ -675,7 +780,7 @@ spriteSourceSize {128,118} textureRect - {{128,846},{128,118}} + {{256,753},{128,118}} textureRotated @@ -690,7 +795,7 @@ spriteSourceSize {128,118} textureRect - {{326,753},{128,118}} + {{128,846},{128,118}} textureRotated @@ -705,7 +810,7 @@ spriteSourceSize {128,118} textureRect - {{454,753},{128,118}} + {{0,958},{128,118}} textureRotated @@ -720,7 +825,7 @@ spriteSourceSize {128,118} textureRect - {{678,862},{128,118}} + {{384,870},{128,118}} textureRotated @@ -735,7 +840,7 @@ spriteSourceSize {128,118} textureRect - {{806,909},{128,118}} + {{256,871},{128,118}} textureRotated @@ -750,7 +855,7 @@ spriteSourceSize {70,128} textureRect - {{256,489},{70,128}} + {{940,0},{70,128}} textureRotated @@ -765,7 +870,7 @@ spriteSourceSize {70,128} textureRect - {{256,617},{70,128}} + {{940,128},{70,128}} textureRotated @@ -780,7 +885,7 @@ spriteSourceSize {70,128} textureRect - {{256,745},{70,128}} + {{940,256},{70,128}} textureRotated @@ -795,7 +900,7 @@ spriteSourceSize {70,128} textureRect - {{256,873},{70,128}} + {{937,384},{70,128}} textureRotated @@ -810,7 +915,7 @@ spriteSourceSize {70,128} textureRect - {{112,1200},{70,128}} + {{936,512},{70,128}} textureRotated @@ -825,7 +930,7 @@ spriteSourceSize {70,128} textureRect - {{182,1200},{70,128}} + {{608,531},{70,128}} textureRotated @@ -840,7 +945,7 @@ spriteSourceSize {70,128} textureRect - {{252,1200},{70,128}} + {{608,659},{70,128}} textureRotated @@ -855,7 +960,7 @@ spriteSourceSize {70,128} textureRect - {{252,1200},{70,128}} + {{608,659},{70,128}} textureRotated @@ -870,7 +975,7 @@ spriteSourceSize {70,128} textureRect - {{182,1200},{70,128}} + {{608,531},{70,128}} textureRotated @@ -885,7 +990,7 @@ spriteSourceSize {70,128} textureRect - {{112,1200},{70,128}} + {{936,512},{70,128}} textureRotated @@ -900,7 +1005,7 @@ spriteSourceSize {70,128} textureRect - {{256,873},{70,128}} + {{937,384},{70,128}} textureRotated @@ -915,7 +1020,7 @@ spriteSourceSize {70,128} textureRect - {{256,745},{70,128}} + {{940,256},{70,128}} textureRotated @@ -930,7 +1035,7 @@ spriteSourceSize {70,128} textureRect - {{256,617},{70,128}} + {{940,128},{70,128}} textureRotated @@ -945,7 +1050,7 @@ spriteSourceSize {70,128} textureRect - {{322,1200},{70,128}} + {{608,787},{70,128}} textureRotated @@ -960,9 +1065,9 @@ spriteSourceSize {70,128} textureRect - {{528,1043},{70,128}} + {{608,915},{70,128}} textureRotated - + InAirAtk1_0.png @@ -975,7 +1080,7 @@ spriteSourceSize {112,96} textureRect - {{128,1092},{112,96}} + {{228,1197},{112,96}} textureRotated @@ -1005,7 +1110,7 @@ spriteSourceSize {144,112} textureRect - {{680,512},{144,112}} + {{0,489},{144,112}} textureRotated @@ -1020,7 +1125,7 @@ spriteSourceSize {128,112} textureRect - {{806,1027},{128,112}} + {{256,989},{128,112}} textureRotated @@ -1035,7 +1140,7 @@ spriteSourceSize {96,96} textureRect - {{792,1139},{96,96}} + {{672,1363},{96,96}} textureRotated @@ -1050,7 +1155,7 @@ spriteSourceSize {80,96} textureRect - {{934,1104},{80,96}} + {{672,1267},{80,96}} textureRotated @@ -1065,7 +1170,7 @@ spriteSourceSize {112,112} textureRect - {{352,1081},{112,112}} + {{560,1292},{112,112}} textureRotated @@ -1080,7 +1185,7 @@ spriteSourceSize {128,96} textureRect - {{0,1092},{128,96}} + {{384,1100},{128,96}} textureRotated @@ -1095,9 +1200,9 @@ spriteSourceSize {80,112} textureRect - {{934,768},{80,112}} + {{800,1038},{80,112}} textureRotated - + InAirIdle1_1.png @@ -1110,9 +1215,9 @@ spriteSourceSize {80,112} textureRect - {{934,880},{80,112}} + {{800,1118},{80,112}} textureRotated - + InAirIdle1_2.png @@ -1125,9 +1230,9 @@ spriteSourceSize {64,128} textureRect - {{464,1079},{64,128}} + {{678,974},{64,128}} textureRotated - + InAirIdle1_3.png @@ -1140,9 +1245,9 @@ spriteSourceSize {80,112} textureRect - {{934,992},{80,112}} + {{756,1198},{80,112}} textureRotated - + InAirIdle1_4.png @@ -1155,7 +1260,7 @@ spriteSourceSize {80,96} textureRect - {{224,1001},{80,96}} + {{752,1278},{80,96}} textureRotated @@ -1170,9 +1275,9 @@ spriteSourceSize {80,96} textureRect - {{320,1001},{80,96}} + {{768,1358},{80,96}} textureRotated - + InAirIdle1_6.png @@ -1185,9 +1290,9 @@ spriteSourceSize {80,96} textureRect - {{792,1235},{80,96}} + {{868,1248},{80,96}} textureRotated - + InAirIdle1_7.png @@ -1200,7 +1305,7 @@ spriteSourceSize {96,112} textureRect - {{600,1209},{96,112}} + {{704,1038},{96,112}} textureRotated @@ -1215,9 +1320,9 @@ spriteSourceSize {96,128} textureRect - {{582,787},{96,128}} + {{256,1101},{96,128}} textureRotated - + InAirIdle1_9.png @@ -1230,9 +1335,9 @@ spriteSourceSize {96,128} textureRect - {{582,915},{96,128}} + {{806,862},{96,128}} textureRotated - + LayDown1_1.png @@ -1264,6 +1369,51 @@ textureRotated + OnWall1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,97} + spriteSourceSize + {112,97} + textureRect + {{840,288},{112,97}} + textureRotated + + + OnWall1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,97} + spriteSourceSize + {112,97} + textureRect + {{840,400},{112,97}} + textureRotated + + + OnWall1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,97} + spriteSourceSize + {112,97} + textureRect + {{840,400},{112,97}} + textureRotated + + Walking_1.png aliases @@ -1275,7 +1425,7 @@ spriteSourceSize {119,128} textureRect - {{0,489},{119,128}} + {{144,489},{119,128}} textureRotated @@ -1290,7 +1440,7 @@ spriteSourceSize {119,128} textureRect - {{128,489},{119,128}} + {{0,601},{119,128}} textureRotated @@ -1305,7 +1455,7 @@ spriteSourceSize {119,128} textureRect - {{0,608},{119,128}} + {{680,512},{119,128}} textureRotated @@ -1320,7 +1470,7 @@ spriteSourceSize {119,128} textureRect - {{128,608},{119,128}} + {{808,512},{119,128}} textureRotated @@ -1335,7 +1485,7 @@ spriteSourceSize {119,128} textureRect - {{326,515},{119,128}} + {{272,515},{119,128}} textureRotated @@ -1350,7 +1500,7 @@ spriteSourceSize {119,128} textureRect - {{454,515},{119,128}} + {{128,608},{119,128}} textureRotated @@ -1365,7 +1515,7 @@ spriteSourceSize {119,128} textureRect - {{678,624},{119,128}} + {{0,720},{119,128}} textureRotated @@ -1380,7 +1530,7 @@ spriteSourceSize {119,128} textureRect - {{806,672},{119,128}} + {{400,515},{119,128}} textureRotated @@ -1395,7 +1545,7 @@ spriteSourceSize {119,128} textureRect - {{0,727},{119,128}} + {{678,631},{119,128}} textureRotated @@ -1410,7 +1560,7 @@ spriteSourceSize {119,128} textureRect - {{128,727},{119,128}} + {{806,631},{119,128}} textureRotated @@ -1425,7 +1575,7 @@ spriteSourceSize {119,128} textureRect - {{326,634},{119,128}} + {{256,634},{119,128}} textureRotated @@ -1440,7 +1590,7 @@ spriteSourceSize {119,128} textureRect - {{454,634},{119,128}} + {{128,727},{119,128}} textureRotated @@ -1455,7 +1605,7 @@ spriteSourceSize {119,128} textureRect - {{678,743},{119,128}} + {{0,839},{119,128}} textureRotated @@ -1471,9 +1621,9 @@ realTextureFileName KnifeGirl.png size - {1020,1331} + {1014,1459} smartupdate - $TexturePacker:SmartUpdate:9514b6b35473e14baf98f68515bcb817:1aae9dd4a8024ce783fdab093a39672a:1ae107e0c6667a1ecb5ed98687517e0e$ + $TexturePacker:SmartUpdate:4ca72309f7dc04bba6be361462471d91:9a48d10caa37a76ff8c43fb72bce6103:1ae107e0c6667a1ecb5ed98687517e0e$ textureFileName KnifeGirl.png diff --git a/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.plist.meta b/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.plist.meta index 199cf90..2041d2d 100644 --- a/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.plist.meta +++ b/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.plist.meta @@ -3,8 +3,8 @@ "uuid": "579bc0c1-f5e2-4a5d-889b-9d567e53b0e6", "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "size": { - "width": 1020, - "height": 1331 + "width": 1014, + "height": 1459 }, "type": "Texture Packer", "subMetas": { @@ -14,11 +14,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 824, - "trimY": 544, + "trimX": 806, + "trimY": 750, "width": 112, "height": 128, "rawWidth": 112, @@ -36,11 +36,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, "trimX": 0, - "trimY": 1200, + "trimY": 1076, "width": 112, "height": 128, "rawWidth": 112, @@ -83,8 +83,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 940, - "trimY": 0, + "trimX": 528, + "trimY": 515, "width": 80, "height": 128, "rawWidth": 80, @@ -105,8 +105,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 940, - "trimY": 128, + "trimX": 934, + "trimY": 640, "width": 80, "height": 128, "rawWidth": 80, @@ -124,11 +124,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 0, - "trimY": 964, + "trimX": 128, + "trimY": 1076, "width": 112, "height": 128, "rawWidth": 112, @@ -146,11 +146,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 112, - "trimY": 964, + "trimX": 678, + "trimY": 862, "width": 112, "height": 128, "rawWidth": 112, @@ -171,8 +171,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 840, - "trimY": 288, + "trimX": 512, + "trimY": 643, "width": 96, "height": 128, "rawWidth": 96, @@ -193,8 +193,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 840, - "trimY": 416, + "trimX": 512, + "trimY": 771, "width": 96, "height": 128, "rawWidth": 96, @@ -215,8 +215,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 940, - "trimY": 256, + "trimX": 934, + "trimY": 768, "width": 80, "height": 128, "rawWidth": 80, @@ -237,8 +237,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 936, - "trimY": 384, + "trimX": 934, + "trimY": 896, "width": 80, "height": 128, "rawWidth": 80, @@ -256,11 +256,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 936, - "trimY": 512, + "trimX": 806, + "trimY": 958, "width": 80, "height": 128, "rawWidth": 80, @@ -281,8 +281,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 936, - "trimY": 640, + "trimX": 934, + "trimY": 1024, "width": 80, "height": 128, "rawWidth": 80, @@ -303,8 +303,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 582, - "trimY": 531, + "trimX": 512, + "trimY": 899, "width": 96, "height": 128, "rawWidth": 96, @@ -325,8 +325,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 326, - "trimY": 871, + "trimX": 128, + "trimY": 964, "width": 128, "height": 112, "rawWidth": 128, @@ -347,8 +347,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 696, - "trimY": 1200, + "trimX": 912, + "trimY": 1152, "width": 96, "height": 96, "rawWidth": 96, @@ -369,8 +369,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 416, - "trimY": 983, + "trimX": 340, + "trimY": 1197, "width": 96, "height": 112, "rawWidth": 96, @@ -391,8 +391,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 656, - "trimY": 1092, + "trimX": 452, + "trimY": 1196, "width": 96, "height": 112, "rawWidth": 96, @@ -410,11 +410,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 528, - "trimY": 1113, + "trimX": 564, + "trimY": 1155, "width": 96, "height": 112, "rawWidth": 96, @@ -432,11 +432,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 392, - "trimY": 1207, + "trimX": 608, + "trimY": 1043, "width": 96, "height": 112, "rawWidth": 96, @@ -479,8 +479,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 454, - "trimY": 871, + "trimX": 678, + "trimY": 750, "width": 128, "height": 112, "rawWidth": 128, @@ -765,8 +765,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 582, - "trimY": 659, + "trimX": 512, + "trimY": 1027, "width": 96, "height": 128, "rawWidth": 96, @@ -787,8 +787,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 240, - "trimY": 1081, + "trimX": 448, + "trimY": 1293, "width": 112, "height": 112, "rawWidth": 112, @@ -809,8 +809,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 504, - "trimY": 1209, + "trimX": 660, + "trimY": 1155, "width": 96, "height": 112, "rawWidth": 96, @@ -831,8 +831,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 678, - "trimY": 980, + "trimX": 384, + "trimY": 988, "width": 128, "height": 112, "rawWidth": 128, @@ -932,6 +932,160 @@ "spriteType": "normal", "subMetas": {} }, + "Dashing_1.png": { + "ver": "1.0.4", + "uuid": "cf396dac-50c9-4389-90c0-55f49fd3276d", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 1188, + "width": 114, + "height": 112, + "rawWidth": 114, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Dashing_2.png": { + "ver": "1.0.4", + "uuid": "b9e4b5d5-c296-48c8-aa60-d22db0e5a632", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 114, + "trimY": 1188, + "width": 114, + "height": 112, + "rawWidth": 114, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Dashing_3.png": { + "ver": "1.0.4", + "uuid": "e456c710-69f5-4dcc-9f5d-dd486a9198a1", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 1300, + "width": 114, + "height": 112, + "rawWidth": 114, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Dashing_4.png": { + "ver": "1.0.4", + "uuid": "ec6df76f-0004-4216-9b83-449487fe0cda", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 112, + "trimY": 1300, + "width": 114, + "height": 112, + "rawWidth": 114, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Dashing_5.png": { + "ver": "1.0.4", + "uuid": "26032d0f-845c-4b96-89a6-d88113ed7827", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 1300, + "width": 114, + "height": 112, + "rawWidth": 114, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Dashing_6.png": { + "ver": "1.0.4", + "uuid": "e3e0169c-3c56-4206-a20e-35e4d0471873", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 224, + "trimY": 1300, + "width": 114, + "height": 112, + "rawWidth": 114, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Dashing_7.png": { + "ver": "1.0.4", + "uuid": "80b98036-c5de-492b-b0e8-f1703f3a7d20", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 336, + "trimY": 1293, + "width": 114, + "height": 112, + "rawWidth": 114, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, "GetUp1_1.png": { "ver": "1.0.4", "uuid": "3f26b0a4-db13-4a14-b885-5a812073eccf", @@ -941,8 +1095,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 806, - "trimY": 791, + "trimX": 384, + "trimY": 634, "width": 128, "height": 118, "rawWidth": 128, @@ -963,8 +1117,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 0, - "trimY": 846, + "trimX": 384, + "trimY": 752, "width": 128, "height": 118, "rawWidth": 128, @@ -985,8 +1139,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 128, - "trimY": 846, + "trimX": 256, + "trimY": 753, "width": 128, "height": 118, "rawWidth": 128, @@ -1007,8 +1161,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 326, - "trimY": 753, + "trimX": 128, + "trimY": 846, "width": 128, "height": 118, "rawWidth": 128, @@ -1029,8 +1183,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 454, - "trimY": 753, + "trimX": 0, + "trimY": 958, "width": 128, "height": 118, "rawWidth": 128, @@ -1051,8 +1205,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 678, - "trimY": 862, + "trimX": 384, + "trimY": 870, "width": 128, "height": 118, "rawWidth": 128, @@ -1073,8 +1227,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 806, - "trimY": 909, + "trimX": 256, + "trimY": 871, "width": 128, "height": 118, "rawWidth": 128, @@ -1095,8 +1249,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 256, - "trimY": 489, + "trimX": 940, + "trimY": 0, "width": 70, "height": 128, "rawWidth": 70, @@ -1117,8 +1271,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 256, - "trimY": 617, + "trimX": 940, + "trimY": 128, "width": 70, "height": 128, "rawWidth": 70, @@ -1139,8 +1293,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 256, - "trimY": 745, + "trimX": 940, + "trimY": 256, "width": 70, "height": 128, "rawWidth": 70, @@ -1161,8 +1315,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 256, - "trimY": 873, + "trimX": 937, + "trimY": 384, "width": 70, "height": 128, "rawWidth": 70, @@ -1183,8 +1337,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 112, - "trimY": 1200, + "trimX": 936, + "trimY": 512, "width": 70, "height": 128, "rawWidth": 70, @@ -1205,8 +1359,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 182, - "trimY": 1200, + "trimX": 608, + "trimY": 531, "width": 70, "height": 128, "rawWidth": 70, @@ -1227,8 +1381,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 252, - "trimY": 1200, + "trimX": 608, + "trimY": 659, "width": 70, "height": 128, "rawWidth": 70, @@ -1249,8 +1403,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 252, - "trimY": 1200, + "trimX": 608, + "trimY": 659, "width": 70, "height": 128, "rawWidth": 70, @@ -1271,8 +1425,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 182, - "trimY": 1200, + "trimX": 608, + "trimY": 531, "width": 70, "height": 128, "rawWidth": 70, @@ -1293,8 +1447,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 112, - "trimY": 1200, + "trimX": 936, + "trimY": 512, "width": 70, "height": 128, "rawWidth": 70, @@ -1315,8 +1469,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 256, - "trimY": 873, + "trimX": 937, + "trimY": 384, "width": 70, "height": 128, "rawWidth": 70, @@ -1337,8 +1491,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 256, - "trimY": 745, + "trimX": 940, + "trimY": 256, "width": 70, "height": 128, "rawWidth": 70, @@ -1359,8 +1513,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 256, - "trimY": 617, + "trimX": 940, + "trimY": 128, "width": 70, "height": 128, "rawWidth": 70, @@ -1381,8 +1535,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 322, - "trimY": 1200, + "trimX": 608, + "trimY": 787, "width": 70, "height": 128, "rawWidth": 70, @@ -1400,11 +1554,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 528, - "trimY": 1043, + "trimX": 608, + "trimY": 915, "width": 70, "height": 128, "rawWidth": 70, @@ -1425,8 +1579,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 128, - "trimY": 1092, + "trimX": 228, + "trimY": 1197, "width": 112, "height": 96, "rawWidth": 112, @@ -1469,8 +1623,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 680, - "trimY": 512, + "trimX": 0, + "trimY": 489, "width": 144, "height": 112, "rawWidth": 144, @@ -1491,8 +1645,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 806, - "trimY": 1027, + "trimX": 256, + "trimY": 989, "width": 128, "height": 112, "rawWidth": 128, @@ -1513,8 +1667,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 792, - "trimY": 1139, + "trimX": 672, + "trimY": 1363, "width": 96, "height": 96, "rawWidth": 96, @@ -1535,8 +1689,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 934, - "trimY": 1104, + "trimX": 672, + "trimY": 1267, "width": 80, "height": 96, "rawWidth": 80, @@ -1557,8 +1711,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 352, - "trimY": 1081, + "trimX": 560, + "trimY": 1292, "width": 112, "height": 112, "rawWidth": 112, @@ -1579,8 +1733,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 0, - "trimY": 1092, + "trimX": 384, + "trimY": 1100, "width": 128, "height": 96, "rawWidth": 128, @@ -1598,11 +1752,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 934, - "trimY": 768, + "trimX": 800, + "trimY": 1038, "width": 80, "height": 112, "rawWidth": 80, @@ -1620,11 +1774,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 934, - "trimY": 880, + "trimX": 800, + "trimY": 1118, "width": 80, "height": 112, "rawWidth": 80, @@ -1642,11 +1796,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 464, - "trimY": 1079, + "trimX": 678, + "trimY": 974, "width": 64, "height": 128, "rawWidth": 64, @@ -1664,11 +1818,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 934, - "trimY": 992, + "trimX": 756, + "trimY": 1198, "width": 80, "height": 112, "rawWidth": 80, @@ -1689,8 +1843,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 224, - "trimY": 1001, + "trimX": 752, + "trimY": 1278, "width": 80, "height": 96, "rawWidth": 80, @@ -1708,11 +1862,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 320, - "trimY": 1001, + "trimX": 768, + "trimY": 1358, "width": 80, "height": 96, "rawWidth": 80, @@ -1730,11 +1884,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 792, - "trimY": 1235, + "trimX": 868, + "trimY": 1248, "width": 80, "height": 96, "rawWidth": 80, @@ -1755,8 +1909,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 600, - "trimY": 1209, + "trimX": 704, + "trimY": 1038, "width": 96, "height": 112, "rawWidth": 96, @@ -1774,11 +1928,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 582, - "trimY": 787, + "trimX": 256, + "trimY": 1101, "width": 96, "height": 128, "rawWidth": 96, @@ -1796,11 +1950,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 582, - "trimY": 915, + "trimX": 806, + "trimY": 862, "width": 96, "height": 128, "rawWidth": 96, @@ -1856,6 +2010,72 @@ "spriteType": "normal", "subMetas": {} }, + "OnWall1_1.png": { + "ver": "1.0.4", + "uuid": "c18886db-8116-4602-84f2-51652a90269a", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 840, + "trimY": 288, + "width": 112, + "height": 97, + "rawWidth": 112, + "rawHeight": 97, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "OnWall1_2.png": { + "ver": "1.0.4", + "uuid": "0d81cbf0-dff8-4672-99b3-2ec8055c6931", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 840, + "trimY": 400, + "width": 112, + "height": 97, + "rawWidth": 112, + "rawHeight": 97, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "OnWall1_3.png": { + "ver": "1.0.4", + "uuid": "a183e740-3c2d-4890-8430-39a00f55f446", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 840, + "trimY": 400, + "width": 112, + "height": 97, + "rawWidth": 112, + "rawHeight": 97, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, "Walking_1.png": { "ver": "1.0.4", "uuid": "9435195e-4560-495e-b1ae-083c0c87e8a0", @@ -1865,7 +2085,7 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 0, + "trimX": 144, "trimY": 489, "width": 119, "height": 128, @@ -1887,8 +2107,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 128, - "trimY": 489, + "trimX": 0, + "trimY": 601, "width": 119, "height": 128, "rawWidth": 119, @@ -1909,8 +2129,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 0, - "trimY": 608, + "trimX": 680, + "trimY": 512, "width": 119, "height": 128, "rawWidth": 119, @@ -1931,8 +2151,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 128, - "trimY": 608, + "trimX": 808, + "trimY": 512, "width": 119, "height": 128, "rawWidth": 119, @@ -1953,7 +2173,7 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 326, + "trimX": 272, "trimY": 515, "width": 119, "height": 128, @@ -1975,8 +2195,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 454, - "trimY": 515, + "trimX": 128, + "trimY": 608, "width": 119, "height": 128, "rawWidth": 119, @@ -1997,8 +2217,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 678, - "trimY": 624, + "trimX": 0, + "trimY": 720, "width": 119, "height": 128, "rawWidth": 119, @@ -2019,8 +2239,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 806, - "trimY": 672, + "trimX": 400, + "trimY": 515, "width": 119, "height": 128, "rawWidth": 119, @@ -2041,8 +2261,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 0, - "trimY": 727, + "trimX": 678, + "trimY": 631, "width": 119, "height": 128, "rawWidth": 119, @@ -2063,8 +2283,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 128, - "trimY": 727, + "trimX": 806, + "trimY": 631, "width": 119, "height": 128, "rawWidth": 119, @@ -2085,7 +2305,7 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 326, + "trimX": 256, "trimY": 634, "width": 119, "height": 128, @@ -2107,8 +2327,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 454, - "trimY": 634, + "trimX": 128, + "trimY": 727, "width": 119, "height": 128, "rawWidth": 119, @@ -2129,8 +2349,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 678, - "trimY": 743, + "trimX": 0, + "trimY": 839, "width": 119, "height": 128, "rawWidth": 119, diff --git a/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.png b/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.png index d4ab89c..e6ef436 100644 Binary files a/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.png and b/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.png differ diff --git a/frontend/assets/resources/animation/KnifeGirl/OnWall.anim b/frontend/assets/resources/animation/KnifeGirl/OnWall.anim new file mode 100644 index 0000000..5e633bd --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/OnWall.anim @@ -0,0 +1,37 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "OnWall", + "_objFlags": 0, + "_native": "", + "_duration": 0.26666666666666666, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "c18886db-8116-4602-84f2-51652a90269a" + } + }, + { + "frame": 0.13333333333333333, + "value": { + "__uuid__": "0d81cbf0-dff8-4672-99b3-2ec8055c6931" + } + }, + { + "frame": 0.25, + "value": { + "__uuid__": "a183e740-3c2d-4890-8430-39a00f55f446" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/KnifeGirl/OnWall.anim.meta b/frontend/assets/resources/animation/KnifeGirl/OnWall.anim.meta new file mode 100644 index 0000000..445bf81 --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/OnWall.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "411f964a-4dd8-424c-b2e2-d92b10474ce2", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/map/dungeon/map.tmx b/frontend/assets/resources/map/dungeon/map.tmx index 2963547..3e7c8e0 100644 --- a/frontend/assets/resources/map/dungeon/map.tmx +++ b/frontend/assets/resources/map/dungeon/map.tmx @@ -1,23 +1,23 @@ - + - + - eJzt3LFu00AcwOEoFUuHigqBBANTByRegrlTWWBj6gsgWGBCqngAFgZ23hNHsiXj5mLncs6dfd/wSVUbWa1/f199VpSLzWZzAQAAAAAAAAAAAAAAAAAAES5buX8Pzue+p+t/X6HcHXL237a6/p8atwHbFdL///4h+q9Pv//tSP/LAlrpP1//ffRft93f/ry179wM14TcrfQ/b/8a6K9/7g45+z+LkLuZ/nn7r2kG9Nc/d4cl9i+J/nX2d/3X3T/FDOi/XK5//fWvt3+KGdA//bntnik+nGjua19//fVfRv+XLf3r6d/v3f9af/31z9f/6YiU/fv0z9t/rPu+/r8bH47U9Xf/V07/qe3vNu7/l2Jq/6ntt/ovylj/fY3fNq4C7Yf9h+6OpH++/vvaX/UMu8/R/0XjRv9i+h9a9/v9U9O/3P4x94jH0v/8/afMwPBcpuw7JmX/bQEtSuyf6hwfEtNe//X0P2ZG5ji2/qfPwN9ELVIdR/90/afMgP7LpL/+JXXL1T93B/31X3L/Xwnpv7z+S6Z/3fSvm/51079u+tdN/7rpXzf966Z/3fSvm/51079u+pfrJkD/MvrP9X7RUPc55kD/cvpfj3gSoP86+uegf3xv/Zet9Ps//dfXP/S/vfv5+4T6xwytT97/Pe5ja7jed9/PfQ2fev3rf9ih//nD/q8LaBqyb43QP2zXMrTn2hnbr12PHD93+65/7g6l9u86vznBqfvzOdvr/3i9Tr1+p3hGM1d7/dM/Twv1zzEDU/YItfefu8Fwts71nGjqHlH/8/bvZmDOz3s55hmB/o+lvJ8/tH8I+REhpr3+4/1OnYOY/jEz8DOS/tPEzsGrTVz/3WcBfA207nxvfG5fq/+8/WM1/d/F9t/5sgn3/9Z73a7ln5b+0/uTvwMAAAAAAAAAAAAAAABwfv8AQJoGWw== + eJzt27tSwzAQRmFNMm7SwQA9z5KhSccL8P6Pwc1uTFaS7ZVWw3+KryAXJ9ojKxXnlNIZAAAAAAAAAAAAADp4w4/oDpH9o79DNOUZKK+dGWivnRlor50ZlNc+OX2O13XoH9//qdK969Tug0en19B/39pzvY70z+0r+sf3r+nk0b+mba5v6Xn6+6y9Zf+aMyCn1wz+s2XtVovJ0ZY9FjEDRaOv/cGgNIOe/aPuxfXnWt1b7AP6j6W2vdc+GHEGkf1LZ8BrxXVrXtNy79B/+9ovM4+2Uf2PzkDN99qvd0zG49e5bQ3r/aNZZhDdIqr/abbc/x9fboaTA+s3vPT8XqXvo37/r/svptXfXv1HQ/9ft/R3D6x5z/6lga1nD/1tF2NmXudvqdee/bSlPf1Tep7lZnbk/s/tgV73f25/0t/u7yF3DvToXzqf1PsjvkNk/3dx9NdGf23010Z/bfTXRn9t9NdGf23010Z/bfTXRn9t9NdGf23010Z/bfTXRn9t9NdGf23010Z/bcv/QEW3oD/96U//3v3Rrv8nrcyzFQ== - + - + - + @@ -26,28 +26,28 @@ - + - + - + - + @@ -59,197 +59,177 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - + diff --git a/frontend/assets/resources/prefabs/ControlledCharacter.prefab b/frontend/assets/resources/prefabs/ControlledCharacter.prefab index 2d0aa61..d5cd5c3 100644 --- a/frontend/assets/resources/prefabs/ControlledCharacter.prefab +++ b/frontend/assets/resources/prefabs/ControlledCharacter.prefab @@ -645,6 +645,14 @@ }, { "__uuid__": "9b500cb0-8048-4715-81db-cc975c914225" + }, + null, + null, + { + "__uuid__": "38b2c892-347b-4009-93f8-65b2ab1614f0" + }, + { + "__uuid__": "411f964a-4dd8-424c-b2e2-d92b10474ce2" } ], "playOnLoad": false, diff --git a/frontend/assets/scenes/offline_map.fire b/frontend/assets/scenes/offline_map.fire index 0e41cfd..989043c 100644 --- a/frontend/assets/scenes/offline_map.fire +++ b/frontend/assets/scenes/offline_map.fire @@ -191,8 +191,8 @@ 0, 0, 1, - 1.5, - 1.5, + 1.2, + 1.2, 1 ] }, @@ -464,7 +464,7 @@ "array": [ 0, 0, - 216.63421096211545, + 209.57814771583418, 0, 0, 0, diff --git a/frontend/assets/scripts/AttackingCharacter.js b/frontend/assets/scripts/AttackingCharacter.js index 269fe0a..66188ac 100644 --- a/frontend/assets/scripts/AttackingCharacter.js +++ b/frontend/assets/scripts/AttackingCharacter.js @@ -12,10 +12,12 @@ window.ATK_CHARACTER_STATE = { BlownUp1: [8, "BlownUp1"], LayDown1: [9, "LayDown1"], // The last frame of "LayDown1" should have a simliar boundingbox with the first frame of "GetUp1", otherwise the animation would seem odd GetUp1: [10, "GetUp1"], - Atk2: [11, "Atk2"], - Atk3: [12, "Atk3"], - Atk4: [13, "Atk4"], - Atk5: [14, "Atk5"], + Atk2: [11, "Atk2"], + Atk3: [12, "Atk3"], + Atk4: [13, "Atk4"], + Atk5: [14, "Atk5"], + Dashing: [15, "Dashing"], + OnWall: [16, "OnWall"], }; window.ATK_CHARACTER_STATE_ARR = []; @@ -31,6 +33,8 @@ window.ATK_CHARACTER_STATE_INTERRUPT_WAIVE_SET.add(window.ATK_CHARACTER_STATE.In window.ATK_CHARACTER_STATE_INTERRUPT_WAIVE_SET.add(window.ATK_CHARACTER_STATE.BlownUp1[0]); window.ATK_CHARACTER_STATE_INTERRUPT_WAIVE_SET.add(window.ATK_CHARACTER_STATE.LayDown1[0]); window.ATK_CHARACTER_STATE_INTERRUPT_WAIVE_SET.add(window.ATK_CHARACTER_STATE.GetUp1[0]); +window.ATK_CHARACTER_STATE_INTERRUPT_WAIVE_SET.add(window.ATK_CHARACTER_STATE.Dashing[0]); +window.ATK_CHARACTER_STATE_INTERRUPT_WAIVE_SET.add(window.ATK_CHARACTER_STATE.OnWall[0]); window.ATK_CHARACTER_STATE_IN_AIR_SET = new Set(); window.ATK_CHARACTER_STATE_IN_AIR_SET.add(window.ATK_CHARACTER_STATE.InAirIdle1NoJump[0]); @@ -38,6 +42,7 @@ window.ATK_CHARACTER_STATE_IN_AIR_SET.add(window.ATK_CHARACTER_STATE.InAirIdle1B window.ATK_CHARACTER_STATE_IN_AIR_SET.add(window.ATK_CHARACTER_STATE.InAirAtk1[0]); window.ATK_CHARACTER_STATE_IN_AIR_SET.add(window.ATK_CHARACTER_STATE.InAirAtked1[0]); window.ATK_CHARACTER_STATE_IN_AIR_SET.add(window.ATK_CHARACTER_STATE.BlownUp1[0]); +window.ATK_CHARACTER_STATE_IN_AIR_SET.add(window.ATK_CHARACTER_STATE.OnWall[0]); /* Kindly note that the use of dragonBones anim is an informed choice for the feasibility of "gotoAndPlayByFrame", which is a required feature by "Map.rollbackAndChase". You might find that "cc.Animation" -- the traditional frame anim -- can also suffice this requirement, yet if we want to develop 3D frontend in the future, working with skeletal anim will make a smoother transition. @@ -79,6 +84,8 @@ cc.Class({ updateCharacterAnim(rdfPlayer, prevRdfPlayer, forceAnimSwitch, chConfig) { // As this function might be called after many frames of a rollback, it's possible that the playing animation was predicted, different from "prevRdfPlayer.CharacterState" but same as "newCharacterState". More granular checks are needed to determine whether we should interrupt the playing animation. + let newCharacterState = rdfPlayer.CharacterState; + // Update directions if (this.animComp && this.animComp.node) { if (0 > rdfPlayer.DirX) { @@ -86,9 +93,11 @@ cc.Class({ } else if (0 < rdfPlayer.DirX) { this.animNode.scaleX = (1.0); } + if (ATK_CHARACTER_STATE.OnWall[0] == newCharacterState) { + this.animNode.scaleX *= (-1.0); + } } - let newCharacterState = rdfPlayer.CharacterState; let newAnimName = window.ATK_CHARACTER_STATE_ARR[newCharacterState][1]; let playingAnimName = null; let underlyingAnimationCtrl = null; @@ -139,7 +148,7 @@ cc.Class({ let frameIdxInAnim = rdfPlayer.FramesInChState; if (window.ATK_CHARACTER_STATE.InAirIdle1ByJump == newCharacterState && null != chConfig) { frameIdxInAnim = chConfig.InAirIdleFrameIdxTurningPoint + (frameIdxInAnim - chConfig.InAirIdleFrameIdxTurningPoint) % chConfig.InAirIdleFrameIdxTurnedCycle; // TODO: Anyway to avoid using division here? - } + } let fromTime = (frameIdxInAnim / targetClip.sample); // TODO: Anyway to avoid using division here? this.animComp.play(newAnimName, fromTime); }, diff --git a/frontend/assets/scripts/Map.js b/frontend/assets/scripts/Map.js index 06aed96..2376b80 100644 --- a/frontend/assets/scripts/Map.js +++ b/frontend/assets/scripts/Map.js @@ -607,13 +607,13 @@ cc.Class({ const jsPlayersArr = new Array(pbRdf.playersArr.length).fill(null); for (let k = 0; k < pbRdf.playersArr.length; ++k) { const pbPlayer = pbRdf.playersArr[k]; - const jsPlayer = gopkgs.NewPlayerDownsyncJs(pbPlayer.id, pbPlayer.virtualGridX, pbPlayer.virtualGridY, pbPlayer.dirX, pbPlayer.dirY, pbPlayer.velX, pbPlayer.velY, pbPlayer.framesToRecover, pbPlayer.framesInChState, pbPlayer.activeSkillId, pbPlayer.activeSkillHit, pbPlayer.framesInvinsible, pbPlayer.speed, pbPlayer.battleState, pbPlayer.characterState, pbPlayer.joinIndex, pbPlayer.hp, pbPlayer.maxHp, pbPlayer.colliderRadius, pbPlayer.inAir); + const jsPlayer = gopkgs.NewPlayerDownsyncJs(pbPlayer.id, pbPlayer.virtualGridX, pbPlayer.virtualGridY, pbPlayer.dirX, pbPlayer.dirY, pbPlayer.velX, pbPlayer.velY, pbPlayer.framesToRecover, pbPlayer.framesInChState, pbPlayer.activeSkillId, pbPlayer.activeSkillHit, pbPlayer.framesInvinsible, pbPlayer.speed, pbPlayer.battleState, pbPlayer.characterState, pbPlayer.joinIndex, pbPlayer.hp, pbPlayer.maxHp, pbPlayer.colliderRadius, pbPlayer.inAir, pbPlayer.onWall, pbPlayer.bulletTeamId, pbPlayer.chCollisionTeamId); jsPlayersArr[k] = jsPlayer; } const jsMeleeBulletsArr = new Array(pbRdf.meleeBullets.length).fill(null); for (let k = 0; k < pbRdf.meleeBullets.length; ++k) { const pbBullet = pbRdf.meleeBullets[k]; - const jsMeleeBullet = gopkgs.NewMeleeBulletJs(pbBullet.bulletLocalId, pbBullet.originatedRenderFrameId, pbBullet.offenderJoinIndex, pbBullet.startupFrames, pbBullet.cancellableStFrame, pbBullet.cancellableEdFrame, pbBullet.activeFrames, pbBullet.hitStunFrames, pbBullet.blockStunFrames, pbBullet.pushbackVelX, pbBullet.pushbackVelY, pbBullet.damage, pbBullet.selfLockVelX, pbBullet.selfLockVelY, pbBullet.hitboxOffsetX, pbBullet.hitboxOffsetY, pbBullet.hitboxSizeX, pbBullet.hitboxSizeY, pbBullet.blowUp); + const jsMeleeBullet = gopkgs.NewMeleeBulletJs(pbBullet.bulletLocalId, pbBullet.originatedRenderFrameId, pbBullet.offenderJoinIndex, pbBullet.startupFrames, pbBullet.cancellableStFrame, pbBullet.cancellableEdFrame, pbBullet.activeFrames, pbBullet.hitStunFrames, pbBullet.blockStunFrames, pbBullet.pushbackVelX, pbBullet.pushbackVelY, pbBullet.damage, pbBullet.selfLockVelX, pbBullet.selfLockVelY, pbBullet.hitboxOffsetX, pbBullet.hitboxOffsetY, pbBullet.hitboxSizeX, pbBullet.hitboxSizeY, pbBullet.blowUp, pbBullet.teamId); jsMeleeBulletsArr[k] = jsMeleeBullet; } const jsFireballBulletsArr = new Array(pbRdf.fireballBullets.length).fill(null); @@ -720,6 +720,8 @@ cc.Class({ equalPlayers(lhs, rhs) { if (null == lhs || null == rhs) return false; + if (null == lhs && null != rhs) return false; + if (null != lhs && null == rhs) return false; if (lhs.VirtualGridX != rhs.VirtualGridX) return false; if (lhs.VirtualGridY != rhs.VirtualGridY) return false; if (lhs.DirX != rhs.DirX) return false; @@ -738,9 +740,30 @@ cc.Class({ equalMeleeBullets(lhs, rhs) { if (null == lhs || null == rhs) return false; - if (lhs.BulletLocalId != rhs.BulletLocalId) return false; - if (lhs.OffenderJoinIndex != rhs.OffenderJoinIndex) return false; - if (lhs.OriginatedRenderFrameId != rhs.OriginatedRenderFrameId) return false; + if (null == lhs && null != rhs) return false; + if (null != lhs && null == rhs) return false; + if (lhs.Bullet.BulletLocalId != rhs.Bullet.BulletLocalId) return false; + if (lhs.Bullet.OffenderJoinIndex != rhs.Bullet.OffenderJoinIndex) return false; + if (lhs.Bullet.OriginatedRenderFrameId != rhs.Bullet.OriginatedRenderFrameId) return false; + return true; + }, + + equalFireballBullets(lhs, rhs) { + if (null == lhs || null == rhs) return false; + if (null == lhs && null != rhs) return false; + if (null != lhs && null == rhs) return false; + if (lhs.Bullet.BulletLocalId != rhs.Bullet.BulletLocalId) return false; + if (lhs.Bullet.OffenderJoinIndex != rhs.Bullet.OffenderJoinIndex) return false; + if (lhs.Bullet.OriginatedRenderFrameId != rhs.Bullet.OriginatedRenderFrameId) return false; + + if (lhs.Bullet.VirtualGridX != rhs.Bullet.VirtualGridX) return false; + if (lhs.Bullet.VirtualGridY != rhs.Bullet.VirtualGridY) return false; + if (lhs.Bullet.DirX != rhs.Bullet.DirX) return false; + if (lhs.Bullet.DirY != rhs.Bullet.DirY) return false; + if (lhs.Bullet.VelX != rhs.Bullet.VelX) return false; + if (lhs.Bullet.VelY != rhs.Bullet.VelY) return false; + if (lhs.Bullet.Speed != rhs.Bullet.Speed) return false; + if (lhs.Bullet.SpeciesId != rhs.Bullet.SpeciesId) return false; return true; }, @@ -752,6 +775,9 @@ cc.Class({ for (let k in lhs.meleeBullets) { if (!this.equalMeleeBullets(lhs.meleeBullets[k], rhs.meleeBullets[k])) return false; } + for (let k in lhs.fireballBullet) { + if (!this.equalMeleeBullets(lhs.meleeBullets[k], rhs.meleeBullets[k])) return false; + } return true; }, @@ -927,17 +953,17 @@ batchInputFrameIdRange=[${batch[0].inputFrameId}, ${batch[batch.length - 1].inpu } */ // [WARNING] Don't try to get "prevRdf(i.e. renderFrameId == latest-1)" by "self.recentRenderCache.getByFrameId(...)" here, as the cache might have been updated by asynchronous "onRoomDownsyncFrame(...)" calls! - if (self.othersForcedDownsyncRenderFrameDict.has(rdf.id)) { - const delayedInputFrameId = gopkgs.ConvertToDelayedInputFrameId(rdf.id); - const othersForcedDownsyncRenderFrame = self.othersForcedDownsyncRenderFrameDict.get(rdf.id); + if (self.othersForcedDownsyncRenderFrameDict.has(rdf.Id)) { + const delayedInputFrameId = gopkgs.ConvertToDelayedInputFrameId(rdf.Id); + const othersForcedDownsyncRenderFrame = self.othersForcedDownsyncRenderFrameDict.get(rdf.Id); if (self.lastAllConfirmedInputFrameId >= delayedInputFrameId && !self.equalRoomDownsyncFrames(othersForcedDownsyncRenderFrame, rdf)) { - console.warn(`Mismatched render frame@rdf.id=${rdf.id} w/ inputFrameId=${delayedInputFrameId}: + console.warn(`Mismatched render frame@rdf.id=${rdf.Id} w/ inputFrameId=${delayedInputFrameId}: rdf=${JSON.stringify(rdf)} othersForcedDownsyncRenderFrame=${JSON.stringify(othersForcedDownsyncRenderFrame)}`); // closeWSConnection(constants.RET_CODE.CLIENT_MISMATCHED_RENDER_FRAME, ""); // self.onManualRejoinRequired("[DEBUG] CLIENT_MISMATCHED_RENDER_FRAME"); rdf = othersForcedDownsyncRenderFrame; - self.othersForcedDownsyncRenderFrameDict.delete(rdf.id); + self.othersForcedDownsyncRenderFrameDict.delete(rdf.Id); } } self.applyRoomDownsyncFrameDynamics(rdf, prevRdf); @@ -1305,6 +1331,7 @@ actuallyUsedinputList:{${self.inputFrameDownsyncStr(actuallyUsedInputClone)}}`); case ATK_CHARACTER_STATE.BlownUp1[0]: case ATK_CHARACTER_STATE.InAirIdle1NoJump[0]: case ATK_CHARACTER_STATE.InAirIdle1ByJump[0]: + case ATK_CHARACTER_STATE.OnWall[0]: [colliderWidth, colliderHeight] = [player.ColliderRadius * 2, player.ColliderRadius * 2]; break; } diff --git a/frontend/assets/scripts/OfflineMap.js b/frontend/assets/scripts/OfflineMap.js index c13b031..4160346 100644 --- a/frontend/assets/scripts/OfflineMap.js +++ b/frontend/assets/scripts/OfflineMap.js @@ -129,7 +129,7 @@ cc.Class({ inAir: true, }), ], - speciesIdList: [4096, 0], + speciesIdList: [1, 4096], }); self.selfPlayerInfo = { diff --git a/frontend/assets/scripts/TouchEventsManager.js b/frontend/assets/scripts/TouchEventsManager.js index 2d0f442..85bd01b 100644 --- a/frontend/assets/scripts/TouchEventsManager.js +++ b/frontend/assets/scripts/TouchEventsManager.js @@ -195,15 +195,31 @@ cc.Class({ cc.systemEvent.on(cc.SystemEvent.EventType.KEY_DOWN, function(evt) { switch (evt.keyCode) { case cc.macro.KEY.w: + self.cachedBtnUpLevel = 0; + self.cachedBtnDownLevel = 0; + self.cachedBtnLeftLevel = 0; + self.cachedBtnRightLevel = 0; self.cachedBtnUpLevel = 1; break; case cc.macro.KEY.s: + self.cachedBtnUpLevel = 0; + self.cachedBtnDownLevel = 0; + self.cachedBtnLeftLevel = 0; + self.cachedBtnRightLevel = 0; self.cachedBtnDownLevel = 1; break; case cc.macro.KEY.a: + self.cachedBtnUpLevel = 0; + self.cachedBtnDownLevel = 0; + self.cachedBtnLeftLevel = 0; + self.cachedBtnRightLevel = 0; self.cachedBtnLeftLevel = 1; break; case cc.macro.KEY.d: + self.cachedBtnUpLevel = 0; + self.cachedBtnDownLevel = 0; + self.cachedBtnLeftLevel = 0; + self.cachedBtnRightLevel = 0; self.cachedBtnRightLevel = 1; break; case cc.macro.KEY.h: diff --git a/jsexport/battle/battle.go b/jsexport/battle/battle.go index 50d7a69..a198c8c 100644 --- a/jsexport/battle/battle.go +++ b/jsexport/battle/battle.go @@ -21,7 +21,7 @@ const ( GRAVITY_X = int32(0) GRAVITY_Y = -int32(float64(0.5) * WORLD_TO_VIRTUAL_GRID_RATIO) // makes all "playerCollider.Y" a multiple of 0.5 in all cases - INPUT_DELAY_FRAMES = int32(8) // in the count of render frames + INPUT_DELAY_FRAMES = int32(4) // in the count of render frames INPUT_SCALE_FRAMES = uint32(2) // inputDelayedAndScaledFrameId = ((originalFrameId - InputDelayFrames) >> InputScaleFrames) NST_DELAY_FRAMES = int32(16) // network-single-trip delay in the count of render frames, proposed to be (InputDelayFrames >> 1) because we expect a round-trip delay to be exactly "InputDelayFrames" @@ -29,6 +29,7 @@ const ( SNAP_INTO_PLATFORM_OVERLAP = float64(0.1) SNAP_INTO_PLATFORM_THRESHOLD = float64(0.5) + VERTICAL_PLATFORM_THRESHOLD = float64(0.9) NO_SKILL = -1 NO_SKILL_HIT = -1 @@ -66,6 +67,9 @@ const ( ATK_CHARACTER_STATE_ATK3 = int32(12) ATK_CHARACTER_STATE_ATK4 = int32(13) ATK_CHARACTER_STATE_ATK5 = int32(14) + + ATK_CHARACTER_STATE_DASHING = int32(15) + ATK_CHARACTER_STATE_ONWALL = int32(16) ) var inAirSet = map[int32]bool{ @@ -74,6 +78,7 @@ var inAirSet = map[int32]bool{ ATK_CHARACTER_STATE_INAIR_ATK1: true, ATK_CHARACTER_STATE_INAIR_ATKED1: true, ATK_CHARACTER_STATE_BLOWN_UP1: true, + ATK_CHARACTER_STATE_ONWALL: true, } var noOpSet = map[int32]bool{ @@ -420,6 +425,8 @@ func deriveOpPattern(currPlayerDownsync, thatPlayerInNextFrame *PlayerDownsync, if decodedInput.BtnBLevel > prevBtnBLevel { if _, existent := inAirSet[currPlayerDownsync.CharacterState]; !existent { jumpedOrNot = true + } else if ATK_CHARACTER_STATE_ONWALL == currPlayerDownsync.CharacterState { + jumpedOrNot = true } } } @@ -455,6 +462,7 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer VelY: currPlayerDownsync.VelY, CharacterState: currPlayerDownsync.CharacterState, InAir: true, + OnWall: false, Speed: currPlayerDownsync.Speed, BattleState: currPlayerDownsync.BattleState, Score: currPlayerDownsync.Score, @@ -486,15 +494,11 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer bulletLocalId := currRenderFrame.BulletLocalIdCounter // 1. Process player inputs for i, currPlayerDownsync := range currRenderFrame.PlayersArr { - jumpedOrNotList[i] = false chConfig := chConfigsOrderedByJoinIndex[i] thatPlayerInNextFrame := nextRenderFramePlayers[i] patternId, jumpedOrNot, effDx, effDy := deriveOpPattern(currPlayerDownsync, thatPlayerInNextFrame, currRenderFrame, inputsBuffer) - if jumpedOrNot { - thatPlayerInNextFrame.VelY = int32(chConfig.JumpingInitVelY) - jumpedOrNotList[i] = true - } + jumpedOrNotList[i] = jumpedOrNot joinIndex := currPlayerDownsync.JoinIndex skillId := chConfig.SkillMapper(patternId, currPlayerDownsync) if skillConfig, existent := skills[skillId]; existent { @@ -573,12 +577,28 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer for i, currPlayerDownsync := range currRenderFrame.PlayersArr { joinIndex := currPlayerDownsync.JoinIndex effPushbacks[joinIndex-1].X, effPushbacks[joinIndex-1].Y = float64(0), float64(0) + thatPlayerInNextFrame := nextRenderFramePlayers[i] chConfig := chConfigsOrderedByJoinIndex[i] // Reset playerCollider position from the "virtual grid position" newVx, newVy := currPlayerDownsync.VirtualGridX+currPlayerDownsync.VelX, currPlayerDownsync.VirtualGridY+currPlayerDownsync.VelY if jumpedOrNotList[i] { - newVy += chConfig.JumpingInitVelY // Immediately gets out of any snapping + // We haven't proceeded with "OnWall" calculation for "thatPlayerInNextFrame", thus use "currPlayerDownsync.OnWall" for checking + if ATK_CHARACTER_STATE_ONWALL == currPlayerDownsync.CharacterState { + newVx -= +currPlayerDownsync.VelX // Cancel the alleged horizontal movement against wall first + xfac := int32(-1) + // "thatPlayerInNextFrame.DirX" already stores information of player input + if 0 > thatPlayerInNextFrame.DirX { + xfac = -xfac + } + newVx += xfac * chConfig.WallJumpingInitVelX + newVy += chConfig.WallJumpingInitVelY + thatPlayerInNextFrame.VelX = int32(xfac * chConfig.WallJumpingInitVelX) + thatPlayerInNextFrame.VelY = int32(chConfig.WallJumpingInitVelY) + } else { + thatPlayerInNextFrame.VelY = int32(chConfig.JumpingInitVelY) + newVy += chConfig.JumpingInitVelY // Immediately gets out of any snapping + } } wx, wy := VirtualGridToWorldPos(newVx, newVy) @@ -586,7 +606,7 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer switch currPlayerDownsync.CharacterState { case ATK_CHARACTER_STATE_LAY_DOWN1: colliderWidth, colliderHeight = currPlayerDownsync.ColliderRadius*4, currPlayerDownsync.ColliderRadius*2 - case ATK_CHARACTER_STATE_BLOWN_UP1, ATK_CHARACTER_STATE_INAIR_IDLE1_NO_JUMP, ATK_CHARACTER_STATE_INAIR_IDLE1_BY_JUMP: + case ATK_CHARACTER_STATE_BLOWN_UP1, ATK_CHARACTER_STATE_INAIR_IDLE1_NO_JUMP, ATK_CHARACTER_STATE_INAIR_IDLE1_BY_JUMP, ATK_CHARACTER_STATE_ONWALL: colliderWidth, colliderHeight = currPlayerDownsync.ColliderRadius*2, currPlayerDownsync.ColliderRadius*2 } @@ -598,10 +618,14 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer // Add to collision system collisionSys.Add(playerCollider) - thatPlayerInNextFrame := nextRenderFramePlayers[i] if currPlayerDownsync.InAir { - thatPlayerInNextFrame.VelX += GRAVITY_X - thatPlayerInNextFrame.VelY += GRAVITY_Y + if ATK_CHARACTER_STATE_ONWALL == currPlayerDownsync.CharacterState && !jumpedOrNotList[i] { + thatPlayerInNextFrame.VelX += GRAVITY_X + thatPlayerInNextFrame.VelY = chConfig.WallSlidingVelY + } else { + thatPlayerInNextFrame.VelX += GRAVITY_X + thatPlayerInNextFrame.VelY += GRAVITY_Y + } } } @@ -692,24 +716,27 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer } if landedOnGravityPushback { thatPlayerInNextFrame.InAir = false - if currPlayerDownsync.InAir && 0 >= currPlayerDownsync.VelY { - // fallStopping + fallStopping := (currPlayerDownsync.InAir && 0 >= currPlayerDownsync.VelY) + if fallStopping { thatPlayerInNextFrame.VelY = 0 thatPlayerInNextFrame.VelX = 0 - if _, existent := nonAttackingSet[thatPlayerInNextFrame.CharacterState]; existent { - if ATK_CHARACTER_STATE_BLOWN_UP1 == thatPlayerInNextFrame.CharacterState { - thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_LAY_DOWN1 - thatPlayerInNextFrame.FramesToRecover = chConfig.LayDownFramesToRecover - } else { + if ATK_CHARACTER_STATE_BLOWN_UP1 == thatPlayerInNextFrame.CharacterState { + thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_LAY_DOWN1 + thatPlayerInNextFrame.FramesToRecover = chConfig.LayDownFramesToRecover + } else { + switch currPlayerDownsync.CharacterState { + case ATK_CHARACTER_STATE_BLOWN_UP1, ATK_CHARACTER_STATE_INAIR_IDLE1_NO_JUMP, ATK_CHARACTER_STATE_INAIR_IDLE1_BY_JUMP, ATK_CHARACTER_STATE_ONWALL: + // [WARNING] To prevent bouncing due to abrupt change of collider shape, it's important that we check "currPlayerDownsync" instead of "thatPlayerInNextFrame" here! halfColliderWidthDiff, halfColliderHeightDiff := int32(0), currPlayerDownsync.ColliderRadius _, halfColliderWorldHeightDiff := VirtualGridToWorldPos(halfColliderWidthDiff, halfColliderHeightDiff) - effPushbacks[joinIndex-1].Y -= halfColliderWorldHeightDiff // To prevent bouncing due to abrupt change of collider shape - thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_IDLE1 + effPushbacks[joinIndex-1].Y -= halfColliderWorldHeightDiff } + thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_IDLE1 + thatPlayerInNextFrame.FramesToRecover = 0 } } else { + // landedOnGravityPushback not fallStopping, could be in LayDown or GetUp if _, existent := nonAttackingSet[thatPlayerInNextFrame.CharacterState]; existent { - // not fallStopping, could be in LayDown or GetUp if ATK_CHARACTER_STATE_LAY_DOWN1 == thatPlayerInNextFrame.CharacterState { if 0 == thatPlayerInNextFrame.FramesToRecover { thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_GET_UP1 @@ -724,6 +751,30 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer } } } + + if thatPlayerInNextFrame.InAir && chConfig.OnWallEnabled { + // [WARNING] Sticking to wall MUST BE based on "InAir", otherwise we would get gravity reduction from ground up incorrectly! + if _, existent := noOpSet[currPlayerDownsync.CharacterState]; !existent { + // [WARNING] Sticking to wall could only be triggered by proactive player input + for _, hardPushbackNorm := range *hardPushbackNorms[joinIndex-1] { + normAlignmentWithHorizon1 := (hardPushbackNorm.X*float64(1.0) + hardPushbackNorm.Y*float64(0.0)) + ctrlAlignmentWithHorizon1 := (float64(thatPlayerInNextFrame.DirX)*float64(1.0) + float64(thatPlayerInNextFrame.DirY)*float64(0.0)) + normAlignmentWithHorizon2 := (hardPushbackNorm.X*float64(-1.0) + hardPushbackNorm.Y*float64(0.0)) + ctrlAlignmentWithHorizon2 := (float64(thatPlayerInNextFrame.DirX)*float64(-1.0) + float64(thatPlayerInNextFrame.DirY)*float64(0.0)) + if VERTICAL_PLATFORM_THRESHOLD < normAlignmentWithHorizon1 && VERTICAL_PLATFORM_THRESHOLD < ctrlAlignmentWithHorizon1 { + thatPlayerInNextFrame.OnWall = true + } + if VERTICAL_PLATFORM_THRESHOLD < normAlignmentWithHorizon2 && VERTICAL_PLATFORM_THRESHOLD < ctrlAlignmentWithHorizon2 { + thatPlayerInNextFrame.OnWall = true + } + } + + if !currPlayerDownsync.OnWall && thatPlayerInNextFrame.OnWall { + // To avoid mysterious climbing up the wall after sticking on it + thatPlayerInNextFrame.VelY = 0 + } + } + } } // 5. Check bullet-anything collisions @@ -842,12 +893,20 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer if thatPlayerInNextFrame.InAir { oldNextCharacterState := thatPlayerInNextFrame.CharacterState switch oldNextCharacterState { - case ATK_CHARACTER_STATE_IDLE1, ATK_CHARACTER_STATE_WALKING: + case ATK_CHARACTER_STATE_IDLE1: if jumpedOrNotList[i] || ATK_CHARACTER_STATE_INAIR_IDLE1_BY_JUMP == currPlayerDownsync.CharacterState { thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_INAIR_IDLE1_BY_JUMP } else { thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_INAIR_IDLE1_NO_JUMP } + case ATK_CHARACTER_STATE_WALKING: + if thatPlayerInNextFrame.OnWall { + thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_ONWALL + } else if jumpedOrNotList[i] || ATK_CHARACTER_STATE_INAIR_IDLE1_BY_JUMP == currPlayerDownsync.CharacterState { + thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_INAIR_IDLE1_BY_JUMP + } else { + thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_INAIR_IDLE1_NO_JUMP + } case ATK_CHARACTER_STATE_ATK1: thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_INAIR_ATK1 // No inAir transition for ATK2/ATK3 for now diff --git a/jsexport/battle/characterConfig.go b/jsexport/battle/characterConfig.go index 73902a9..45ce94e 100644 --- a/jsexport/battle/characterConfig.go +++ b/jsexport/battle/characterConfig.go @@ -18,6 +18,12 @@ type CharacterConfig struct { Speed int32 JumpingInitVelY int32 + DashingEnabled bool + OnWallEnabled bool + WallJumpingInitVelX int32 + WallJumpingInitVelY int32 + WallSlidingVelY int32 + SkillMapper SkillMapperType } @@ -38,6 +44,9 @@ var Characters = map[int]*CharacterConfig{ Speed: int32(float64(1.2) * WORLD_TO_VIRTUAL_GRID_RATIO), JumpingInitVelY: int32(float64(8) * WORLD_TO_VIRTUAL_GRID_RATIO), + DashingEnabled: false, + OnWallEnabled: false, + SkillMapper: func(patternId int, currPlayerDownsync *PlayerDownsync) int { if 1 == patternId { if 0 == currPlayerDownsync.FramesToRecover { @@ -81,6 +90,12 @@ var Characters = map[int]*CharacterConfig{ Speed: int32(float64(1.4) * WORLD_TO_VIRTUAL_GRID_RATIO), JumpingInitVelY: int32(float64(7.5) * WORLD_TO_VIRTUAL_GRID_RATIO), + DashingEnabled: true, + OnWallEnabled: true, + WallJumpingInitVelX: int32(float64(7) * WORLD_TO_VIRTUAL_GRID_RATIO), // Default is "appeared facing right", but actually holding ctrl against left + WallJumpingInitVelY: int32(float64(7) * WORLD_TO_VIRTUAL_GRID_RATIO), + WallSlidingVelY: int32(float64(-1) * WORLD_TO_VIRTUAL_GRID_RATIO), + SkillMapper: func(patternId int, currPlayerDownsync *PlayerDownsync) int { if 1 == patternId { if 0 == currPlayerDownsync.FramesToRecover { @@ -124,6 +139,9 @@ var Characters = map[int]*CharacterConfig{ Speed: int32(float64(1.0) * WORLD_TO_VIRTUAL_GRID_RATIO), JumpingInitVelY: int32(float64(7.5) * WORLD_TO_VIRTUAL_GRID_RATIO), + DashingEnabled: false, + OnWallEnabled: false, + SkillMapper: func(patternId int, currPlayerDownsync *PlayerDownsync) int { if 1 == patternId { if 0 == currPlayerDownsync.FramesToRecover { @@ -331,10 +349,10 @@ var skills = map[int]*Skill{ HitStunFrames: MAX_INT32, BlockStunFrames: int32(9), Damage: int32(10), - SelfLockVelX: int32(float64(-0.1) * WORLD_TO_VIRTUAL_GRID_RATIO), + SelfLockVelX: NO_LOCK_VEL, SelfLockVelY: NO_LOCK_VEL, PushbackVelX: int32(float64(2) * WORLD_TO_VIRTUAL_GRID_RATIO), - PushbackVelY: NO_LOCK_VEL, + PushbackVelY: int32(float64(3) * WORLD_TO_VIRTUAL_GRID_RATIO), HitboxOffsetX: int32(float64(24) * WORLD_TO_VIRTUAL_GRID_RATIO), HitboxOffsetY: int32(0), HitboxSizeX: int32(float64(32) * WORLD_TO_VIRTUAL_GRID_RATIO), diff --git a/jsexport/main.go b/jsexport/main.go index 72c9756..e0d8c2e 100644 --- a/jsexport/main.go +++ b/jsexport/main.go @@ -42,7 +42,7 @@ func NewBarrierJs(boundary *Polygon2D) *js.Object { }) } -func NewPlayerDownsyncJs(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, framesToRecover, framesInChState, activeSkillId, activeSkillHit, framesInvinsible, speed, battleState, characterState, joinIndex, hp, maxHp, colliderRadius int32, inAir bool, bulletTeamId, chCollisionTeamId int32) *js.Object { +func NewPlayerDownsyncJs(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, framesToRecover, framesInChState, activeSkillId, activeSkillHit, framesInvinsible, speed, battleState, characterState, joinIndex, hp, maxHp, colliderRadius int32, inAir, onWall bool, bulletTeamId, chCollisionTeamId int32) *js.Object { return js.MakeWrapper(&PlayerDownsync{ Id: id, VirtualGridX: virtualGridX, @@ -64,6 +64,7 @@ func NewPlayerDownsyncJs(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, MaxHp: maxHp, ColliderRadius: colliderRadius, InAir: inAir, + OnWall: onWall, BulletTeamId: bulletTeamId, ChCollisionTeamId: chCollisionTeamId, })