diff --git a/MULTIHIT_ROADMAP.md b/MULTIHIT_ROADMAP.md new file mode 100644 index 0000000..890fac0 --- /dev/null +++ b/MULTIHIT_ROADMAP.md @@ -0,0 +1,7 @@ +Major goals +- Create several skills that can be chained by pressing "btnA" 3 times, while the 2nd skill cancels the last hit of 1st skill before the latters' FramesToRecover is over, same goes with 2nd->3rd transition. +- Note that each skill can contain "multihit". + +Minor goals +- Split jumping anim into "once" part and "keep" part, depending on "character.framesElapsedInChState" we should play the corresponding part +- Add new "chState = STUNNED", which is applicable to both on ground and in air, while "inAir && STUNNED", "character.FramesToRecover" is regarded as infinite. If implemented, make the last hit of the aforementioned 3rd skill "pushback opponent to air". diff --git a/battle_srv/models/pb_type_convert.go b/battle_srv/models/pb_type_convert.go index b24bb48..f005607 100644 --- a/battle_srv/models/pb_type_convert.go +++ b/battle_srv/models/pb_type_convert.go @@ -10,69 +10,71 @@ func toPbRoomDownsyncFrame(rdf *battle.RoomDownsyncFrame) *pb.RoomDownsyncFrame return nil } ret := &pb.RoomDownsyncFrame{ - Id: rdf.Id, - PlayersArr: make([]*pb.PlayerDownsync, len(rdf.PlayersArr), len(rdf.PlayersArr)), - MeleeBullets: make([]*pb.MeleeBullet, len(rdf.MeleeBullets), len(rdf.MeleeBullets)), - CountdownNanos: rdf.CountdownNanos, - BackendUnconfirmedMask: rdf.BackendUnconfirmedMask, - ShouldForceResync: rdf.ShouldForceResync, - PlayerOpPatternToSkillId: make(map[int32]int32), + Id: rdf.Id, + PlayersArr: make([]*pb.PlayerDownsync, len(rdf.PlayersArr), len(rdf.PlayersArr)), + MeleeBullets: make([]*pb.MeleeBullet, len(rdf.MeleeBullets), len(rdf.MeleeBullets)), + CountdownNanos: rdf.CountdownNanos, + BackendUnconfirmedMask: rdf.BackendUnconfirmedMask, + ShouldForceResync: rdf.ShouldForceResync, } for i, last := range rdf.PlayersArr { pbPlayer := &pb.PlayerDownsync{ - Id: last.Id, - VirtualGridX: last.VirtualGridX, - VirtualGridY: last.VirtualGridY, - DirX: last.DirX, - DirY: last.DirY, - VelX: last.VelX, - VelY: last.VelY, - Speed: last.Speed, - BattleState: last.BattleState, - CharacterState: last.CharacterState, - InAir: last.InAir, - JoinIndex: last.JoinIndex, - ColliderRadius: last.ColliderRadius, - Score: last.Score, - FramesToRecover: last.FramesToRecover, - Hp: last.Hp, - MaxHp: last.MaxHp, - Removed: last.Removed, + Id: last.Id, + VirtualGridX: last.VirtualGridX, + VirtualGridY: last.VirtualGridY, + DirX: last.DirX, + DirY: last.DirY, + VelX: last.VelX, + VelY: last.VelY, + FramesToRecover: last.FramesToRecover, + FramesInChState: last.FramesInChState, + ActiveSkillId: last.ActiveSkillId, + ActiveSkillHit: last.ActiveSkillHit, + FramesInvinsible: last.FramesInvinsible, + Speed: last.Speed, + BattleState: last.BattleState, + CharacterState: last.CharacterState, + InAir: last.InAir, + JoinIndex: last.JoinIndex, + Hp: last.Hp, + MaxHp: last.MaxHp, + ColliderRadius: last.ColliderRadius, + Score: last.Score, + Removed: last.Removed, } ret.PlayersArr[i] = pbPlayer } for i, last := range rdf.MeleeBullets { pbBullet := &pb.MeleeBullet{ - BattleLocalId: last.BattleLocalId, - StartupFrames: last.StartupFrames, - ActiveFrames: last.ActiveFrames, - RecoveryFrames: last.RecoveryFrames, - RecoveryFramesOnBlock: last.RecoveryFramesOnBlock, - RecoveryFramesOnHit: last.RecoveryFramesOnHit, - HitboxOffset: last.HitboxOffset, - HitStunFrames: last.HitStunFrames, - BlockStunFrames: last.BlockStunFrames, - Pushback: last.Pushback, - ReleaseTriggerType: last.ReleaseTriggerType, - Damage: last.Damage, + OriginatedRenderFrameId: last.OriginatedRenderFrameId, + OffenderJoinIndex: last.OffenderJoinIndex, - SelfMoveforwardX: last.SelfMoveforwardX, - SelfMoveforwardY: last.SelfMoveforwardY, - HitboxSizeX: last.HitboxSizeX, - HitboxSizeY: last.HitboxSizeY, + StartupFrames: last.StartupFrames, + CancellableStFrame: last.CancellableStFrame, + CancellableEdFrame: last.CancellableEdFrame, + ActiveFrames: last.ActiveFrames, - OffenderJoinIndex: last.OffenderJoinIndex, - OffenderPlayerId: last.OffenderPlayerId, + HitStunFrames: last.HitStunFrames, + BlockStunFrames: last.BlockStunFrames, + PushbackVelX: last.PushbackVelX, + PushbackVelY: last.PushbackVelY, + Damage: last.Damage, + + SelfLockVelX: last.SelfLockVelX, + SelfLockVelY: last.SelfLockVelY, + + HitboxOffsetX: last.HitboxOffsetX, + HitboxOffsetY: last.HitboxOffsetY, + HitboxSizeX: last.HitboxSizeX, + HitboxSizeY: last.HitboxSizeY, + + BlowUp: last.BlowUp, } ret.MeleeBullets[i] = pbBullet } - for i, last := range rdf.PlayerOpPatternToSkillId { - ret.PlayerOpPatternToSkillId[int32(i)] = int32(last) - } - return ret } @@ -84,22 +86,26 @@ func toPbPlayers(modelInstances map[int32]*Player, withMetaInfo bool) []*pb.Play for _, last := range modelInstances { pbPlayer := &pb.PlayerDownsync{ - Id: last.Id, - VirtualGridX: last.VirtualGridX, - VirtualGridY: last.VirtualGridY, - DirX: last.DirX, - DirY: last.DirY, - VelX: last.VelX, - VelY: last.VelY, - Speed: last.Speed, - BattleState: last.BattleState, - CharacterState: last.CharacterState, - InAir: last.InAir, - JoinIndex: last.JoinIndex, - ColliderRadius: last.ColliderRadius, - Score: last.Score, - Removed: last.Removed, - FramesToRecover: last.FramesToRecover, + Id: last.Id, + VirtualGridX: last.VirtualGridX, + VirtualGridY: last.VirtualGridY, + DirX: last.DirX, + DirY: last.DirY, + VelX: last.VelX, + VelY: last.VelY, + FramesToRecover: last.FramesToRecover, + FramesInChState: last.FramesInChState, + ActiveSkillId: last.ActiveSkillId, + ActiveSkillHit: last.ActiveSkillHit, + FramesInvinsible: last.FramesInvinsible, + Speed: last.Speed, + BattleState: last.BattleState, + CharacterState: last.CharacterState, + InAir: last.InAir, + JoinIndex: last.JoinIndex, + ColliderRadius: last.ColliderRadius, + Score: last.Score, + Removed: last.Removed, } if withMetaInfo { pbPlayer.Name = last.Name @@ -120,21 +126,28 @@ func toJsPlayers(modelInstances map[int32]*Player) []*battle.PlayerDownsync { for _, last := range modelInstances { toRet[last.JoinIndex-1] = &battle.PlayerDownsync{ - Id: last.Id, - VirtualGridX: last.VirtualGridX, - VirtualGridY: last.VirtualGridY, - DirX: last.DirX, - DirY: last.DirY, - VelX: last.VelX, - VelY: last.VelY, - Speed: last.Speed, - BattleState: last.BattleState, - CharacterState: last.CharacterState, - InAir: last.InAir, - JoinIndex: last.JoinIndex, - ColliderRadius: last.ColliderRadius, - Score: last.Score, - Removed: last.Removed, + Id: last.Id, + VirtualGridX: last.VirtualGridX, + VirtualGridY: last.VirtualGridY, + DirX: last.DirX, + DirY: last.DirY, + VelX: last.VelX, + VelY: last.VelY, + FramesToRecover: last.FramesToRecover, + FramesInChState: last.FramesInChState, + ActiveSkillId: last.ActiveSkillId, + ActiveSkillHit: last.ActiveSkillHit, + FramesInvinsible: last.FramesInvinsible, + Speed: last.Speed, + BattleState: last.BattleState, + CharacterState: last.CharacterState, + JoinIndex: last.JoinIndex, + Hp: last.Hp, + MaxHp: last.MaxHp, + ColliderRadius: last.ColliderRadius, + InAir: last.InAir, + Score: last.Score, + Removed: last.Removed, } } diff --git a/battle_srv/models/room.go b/battle_srv/models/room.go index 8370e58..0cc7ac3 100644 --- a/battle_srv/models/room.go +++ b/battle_srv/models/room.go @@ -49,7 +49,7 @@ const ( ) const ( - DEFAULT_PLAYER_RADIUS = float64(12) + DEFAULT_PLAYER_RADIUS = int32(float64(12) * battle.WORLD_TO_VIRTUAL_GRID_RATIO) ) type RoomBattleState struct { @@ -88,15 +88,16 @@ func calRoomScore(inRoomPlayerCount int32, roomPlayerCnt int, currentRoomBattleS } type Room struct { - Id int32 - Capacity int - collisionSpaceOffsetX float64 - collisionSpaceOffsetY float64 - playerOpPatternToSkillId map[int]int - Players map[int32]*Player - PlayersArr []*Player // ordered by joinIndex - Space *resolv.Space - CollisionSysMap map[int32]*resolv.Object + Id int32 + Capacity int + BattleDurationFrames int32 + NstDelayFrames int32 + Players map[int32]*Player + PlayersArr []*Player // ordered by joinIndex + SpeciesIdList []int32 // ordered by joinIndex + CharacterConfigsArr []*battle.CharacterConfig // ordered by joinIndex + Space *resolv.Space + CollisionSysMap map[int32]*resolv.Object /** * The following `PlayerDownsyncSessionDict` is NOT individually put * under `type Player struct` for a reason. @@ -138,7 +139,6 @@ type Room struct { BackendDynamicsEnabled bool ForceAllResyncOnAnyActiveSlowTicker bool LastRenderFrameIdTriggeredAt int64 - PlayerDefaultSpeed int32 BulletBattleLocalIdCounter int32 dilutedRollbackEstimatedDtNanos int64 @@ -168,11 +168,12 @@ func (pR *Room) AddPlayerIfPossible(pPlayerFromDbInit *Player, session *websocke } defer pR.onPlayerAdded(playerId) + pPlayerFromDbInit.AckingFrameId = -1 pPlayerFromDbInit.AckingInputFrameId = -1 pPlayerFromDbInit.LastSentInputFrameId = MAGIC_LAST_SENT_INPUT_FRAME_ID_NORMAL_ADDED pPlayerFromDbInit.BattleState = PlayerBattleStateIns.ADDED_PENDING_BATTLE_COLLIDER_ACK - pPlayerFromDbInit.Speed = pR.PlayerDefaultSpeed // Hardcoded + pPlayerFromDbInit.ColliderRadius = DEFAULT_PLAYER_RADIUS // Hardcoded pPlayerFromDbInit.InAir = true // Hardcoded @@ -210,7 +211,7 @@ func (pR *Room) ReAddPlayerIfPossible(pTmpPlayerInstance *Player, session *webso pEffectiveInRoomPlayerInstance.AckingInputFrameId = -1 pEffectiveInRoomPlayerInstance.LastSentInputFrameId = MAGIC_LAST_SENT_INPUT_FRAME_ID_READDED pEffectiveInRoomPlayerInstance.BattleState = PlayerBattleStateIns.READDED_PENDING_BATTLE_COLLIDER_ACK - pEffectiveInRoomPlayerInstance.Speed = pR.PlayerDefaultSpeed // Hardcoded + pEffectiveInRoomPlayerInstance.ColliderRadius = DEFAULT_PLAYER_RADIUS // Hardcoded pEffectiveInRoomPlayerInstance.InAir = true // Hardcoded @@ -289,35 +290,14 @@ func (pR *Room) ChooseStage() error { //Logger.Info("parsed tmx:", zap.Any("stageDiscreteW", stageDiscreteW), zap.Any("strToVec2DListMap", strToVec2DListMap), zap.Any("strToPolygon2DListMap", strToPolygon2DListMap)) - pR.StageDiscreteW = stageDiscreteW - pR.StageDiscreteH = stageDiscreteH - pR.StageTileW = stageTileW - pR.StageTileH = stageTileH + pR.SpaceOffsetX = float64((stageDiscreteW * stageTileW) >> 1) + pR.SpaceOffsetY = float64((stageDiscreteH * stageTileH) >> 1) pR.TmxPointsMap = strToVec2DListMap pR.TmxPolygonsMap = strToPolygon2DListMap return nil } -func (pR *Room) ConvertToInputFrameId(renderFrameId int32, inputDelayFrames int32) int32 { - if renderFrameId < inputDelayFrames { - return 0 - } - return ((renderFrameId - inputDelayFrames) >> pR.InputScaleFrames) -} - -func (pR *Room) ConvertToGeneratingRenderFrameId(inputFrameId int32) int32 { - return (inputFrameId << pR.InputScaleFrames) -} - -func (pR *Room) ConvertToFirstUsedRenderFrameId(inputFrameId int32, inputDelayFrames int32) int32 { - return ((inputFrameId << pR.InputScaleFrames) + inputDelayFrames) -} - -func (pR *Room) ConvertToLastUsedRenderFrameId(inputFrameId int32, inputDelayFrames int32) int32 { - return ((inputFrameId << pR.InputScaleFrames) + inputDelayFrames + (1 << pR.InputScaleFrames) - 1) -} - func (pR *Room) RenderFrameBufferString() string { return fmt.Sprintf("{renderFrameId: %d, stRenderFrameId: %d, edRenderFrameId: %d, curDynamicsRenderFrameId: %d}", pR.RenderFrameId, pR.RenderFrameBuffer.StFrameId, pR.RenderFrameBuffer.EdFrameId, pR.CurDynamicsRenderFrameId) } @@ -353,7 +333,7 @@ func (pR *Room) playerDownsyncStr(player *battle.PlayerDownsync) string { if player.InAir { inAirInt = 1 } - s := fmt.Sprintf("{%d,%d,%d,%d,%d,%d,%d}", player.JoinIndex, player.VirtualGridX, player.VirtualGridY, player.VelX, player.VelY, player.FramesToRecover,inAirInt) + s := fmt.Sprintf("{%d,%d,%d,%d,%d,%d,%d}", player.JoinIndex, player.VirtualGridX, player.VirtualGridY, player.VelX, player.VelY, player.FramesToRecover, inAirInt) return s } @@ -397,28 +377,25 @@ func (pR *Room) StartBattle() { pR.RenderFrameId = 0 - // [WARNING] Only since battle starts do we have all players bound to certain joinIndexes. for _, player := range pR.Players { - opJoinIndexPrefix := (int(player.JoinIndex) << uint(8)) - pR.playerOpPatternToSkillId[opJoinIndexPrefix+0] = 1 // Hardcoded for now + speciesId := int(player.JoinIndex - 1) // FIXME: Hardcoded the values for now + chosenCh := battle.Characters[speciesId] + pR.CharacterConfigsArr[player.JoinIndex-1] = chosenCh + pR.SpeciesIdList[player.JoinIndex-1] = int32(speciesId) } + Logger.Info("[StartBattle] ", zap.Any("roomId", pR.Id), zap.Any("roomState", pR.State), zap.Any("SpeciesIdList", pR.SpeciesIdList)) // Initialize the "collisionSys" as well as "RenderFrameBuffer" pR.CurDynamicsRenderFrameId = 0 kickoffFrameJs := &battle.RoomDownsyncFrame{ - Id: pR.RenderFrameId, - PlayersArr: toJsPlayers(pR.Players), - PlayerOpPatternToSkillId: pR.playerOpPatternToSkillId, - CountdownNanos: pR.BattleDurationNanos, + Id: pR.RenderFrameId, + PlayersArr: toJsPlayers(pR.Players), + CountdownNanos: pR.BattleDurationNanos, } pR.RenderFrameBuffer.Put(kickoffFrameJs) // Refresh "Colliders" - spaceW := pR.StageDiscreteW * pR.StageTileW - spaceH := pR.StageDiscreteH * pR.StageTileH - - pR.collisionSpaceOffsetX, pR.collisionSpaceOffsetY = float64(spaceW)*0.5, float64(spaceH)*0.5 - pR.refreshColliders(spaceW, spaceH) + pR.refreshColliders() /* Will be triggered from a goroutine which executes the critical `Room.AddPlayerIfPossible`, thus the `battleMainLoop` should be detached. @@ -432,7 +409,7 @@ func (pR *Room) StartBattle() { Logger.Error("battleMainLoop, recovery spot#1, recovered from: ", zap.Any("roomId", pR.Id), zap.Any("panic", r)) } pR.StopBattleForSettlement() - Logger.Info(fmt.Sprintf("The `battleMainLoop` for roomId=%v is stopped@renderFrameId=%v, with battleDurationFrames=%v:\n%v", pR.Id, pR.RenderFrameId, pR.BattleDurationFrames, pR.InputsBufferString(false))) // This takes sometime to print + Logger.Info(fmt.Sprintf("The `battleMainLoop` for roomId=%v is stopped@renderFrameId=%v:\n%v", pR.Id, pR.RenderFrameId, pR.InputsBufferString(false))) // This takes sometime to print if pR.FrameDataLoggingEnabled { rdfIdToActuallyUsedInputDump := pR.rdfIdToActuallyUsedInputString() os.WriteFile(fmt.Sprintf("room_%d.txt", pR.Id), []byte(rdfIdToActuallyUsedInputDump), 0644) // DEBUG ONLY @@ -481,7 +458,9 @@ func (pR *Room) StartBattle() { continue } kickoffFrameJs := pR.RenderFrameBuffer.GetByFrameId(0).(*battle.RoomDownsyncFrame) - pR.sendSafely(toPbRoomDownsyncFrame(kickoffFrameJs), nil, DOWNSYNC_MSG_ACT_BATTLE_START, playerId, true) + pbKickOffRenderFrame := toPbRoomDownsyncFrame(kickoffFrameJs) + pbKickOffRenderFrame.SpeciesIdList = pR.SpeciesIdList + pR.sendSafely(pbKickOffRenderFrame, nil, DOWNSYNC_MSG_ACT_BATTLE_START, playerId, true) } Logger.Info(fmt.Sprintf("In `battleMainLoop` for roomId=%v sent out kickoffFrame", pR.Id)) } @@ -550,10 +529,6 @@ func (pR *Room) StartBattle() { }) } -func (pR *Room) toDiscreteInputsBufferIndex(inputFrameId int32, joinIndex int32) int32 { - return (inputFrameId << 2) + joinIndex // allowing joinIndex upto 15 -} - func (pR *Room) OnBattleCmdReceived(pReq *pb.WsReq) { /* [WARNING] This function "OnBattleCmdReceived" could be called by different ws sessions and thus from different threads! @@ -744,14 +719,11 @@ func (pR *Room) OnDismissed() { // Always instantiates new HeapRAM blocks and let the old blocks die out due to not being retained by any root reference. pR.BulletBattleLocalIdCounter = 0 - pR.WorldToVirtualGridRatio = float64(100) - pR.VirtualGridToWorldRatio = float64(1.0) / pR.WorldToVirtualGridRatio // this is a one-off computation, should avoid division in iterations - pR.SpAtkLookupFrames = 5 - pR.PlayerDefaultSpeed = int32(float64(1) * pR.WorldToVirtualGridRatio) // in virtual grids per frame - pR.CollisionMinStep = (int32(float64(pR.PlayerDefaultSpeed)*pR.VirtualGridToWorldRatio) << 3) // the approx minimum distance a player can move per frame in world coordinate - pR.playerOpPatternToSkillId = make(map[int]int) + pR.CollisionMinStep = 8 // the approx minimum distance a player can move per frame in world coordinate pR.Players = make(map[int32]*Player) pR.PlayersArr = make([]*Player, pR.Capacity) + pR.SpeciesIdList = make([]int32, pR.Capacity) + pR.CharacterConfigsArr = make([]*battle.CharacterConfig, pR.Capacity) pR.CollisionSysMap = make(map[int32]*resolv.Object) pR.PlayerDownsyncSessionDict = make(map[int32]*websocket.Conn) for _, oldWatchdog := range pR.PlayerActiveWatchdogDict { @@ -776,26 +748,20 @@ func (pR *Room) OnDismissed() { pR.RenderFrameId = 0 pR.CurDynamicsRenderFrameId = 0 - pR.InputDelayFrames = 8 pR.NstDelayFrames = 16 - pR.InputScaleFrames = uint32(2) - pR.ServerFps = 60 + + serverFps := 60 pR.RollbackEstimatedDtMillis = 16.667 // Use fixed-and-low-precision to mitigate the inconsistent floating-point-number issue between Golang and JavaScript pR.RollbackEstimatedDtNanos = 16666666 // A little smaller than the actual per frame time, just for logging FAST FRAME dilutedServerFps := float64(58.0) // Don't set this value too small, otherwise we might miss force confirmation needs for slow tickers! - pR.dilutedRollbackEstimatedDtNanos = int64(float64(pR.RollbackEstimatedDtNanos) * float64(pR.ServerFps) / dilutedServerFps) - pR.BattleDurationFrames = 60 * pR.ServerFps + pR.dilutedRollbackEstimatedDtNanos = int64(float64(pR.RollbackEstimatedDtNanos) * float64(serverFps) / dilutedServerFps) + pR.BattleDurationFrames = int32(60 * serverFps) pR.BattleDurationNanos = int64(pR.BattleDurationFrames) * (pR.RollbackEstimatedDtNanos + 1) - pR.InputFrameUpsyncDelayTolerance = (pR.NstDelayFrames >> pR.InputScaleFrames) - 1 // this value should be strictly smaller than (NstDelayFrames >> InputScaleFrames), otherwise "type#1 forceConfirmation" might become a lag avalanche - pR.MaxChasingRenderFramesPerUpdate = 12 // Don't set this value too high to avoid exhausting frontend CPU within a single frame + pR.InputFrameUpsyncDelayTolerance = battle.ConvertToNoDelayInputFrameId(pR.NstDelayFrames) - 1 // this value should be strictly smaller than (NstDelayFrames >> InputScaleFrames), otherwise "type#1 forceConfirmation" might become a lag avalanche + pR.MaxChasingRenderFramesPerUpdate = 12 // Don't set this value too high to avoid exhausting frontend CPU within a single frame pR.BackendDynamicsEnabled = true // [WARNING] When "false", recovery upon reconnection wouldn't work! pR.ForceAllResyncOnAnyActiveSlowTicker = true // See tradeoff discussion in "downsyncToAllPlayers" - pR.SnapIntoPlatformOverlap = float64(0.1) - pR.SnapIntoPlatformThreshold = float64(0.5) - pR.JumpingInitVelY = int32(float64(7) * pR.WorldToVirtualGridRatio) - pR.GravityX = 0 - pR.GravityY = -int32(float64(0.5) * pR.WorldToVirtualGridRatio) // makes all "playerCollider.Y" a multiple of 0.5 in all cases pR.FrameDataLoggingEnabled = false // [WARNING] DON'T ENABLE ON LONG BATTLE DURATION! It consumes A LOT OF MEMORY! @@ -914,6 +880,10 @@ func (pR *Room) onPlayerAdded(playerId int32) { pR.Players[playerId].JoinIndex = int32(index) + 1 pR.JoinIndexBooleanArr[index] = true + speciesId := index // FIXME + chosenCh := battle.Characters[speciesId] + pR.Players[playerId].Speed = chosenCh.Speed + // Lazily assign the initial position of "Player" for "RoomDownsyncFrame". playerPosList := *pR.TmxPointsMap["PlayerStartingPos"] if index > len(playerPosList) { @@ -924,7 +894,7 @@ func (pR *Room) onPlayerAdded(playerId int32) { if nil == playerPos { panic(fmt.Sprintf("onPlayerAdded error, nil == playerPos, roomId=%v, playerId=%v, roomState=%v, roomEffectivePlayerCount=%v", pR.Id, playerId, pR.State, pR.EffectivePlayerCount)) } - pR.Players[playerId].VirtualGridX, pR.Players[playerId].VirtualGridY = battle.WorldToVirtualGridPos(playerPos.X, playerPos.Y, pR.WorldToVirtualGridRatio) + pR.Players[playerId].VirtualGridX, pR.Players[playerId].VirtualGridY = battle.WorldToVirtualGridPos(playerPos.X, playerPos.Y) // Hardcoded initial character orientation/facing if 0 == (pR.Players[playerId].JoinIndex % 2) { pR.Players[playerId].DirX = -2 @@ -1043,15 +1013,6 @@ func (pR *Room) sendSafely(roomDownsyncFrame *pb.RoomDownsyncFrame, toSendInputF } } -func (pR *Room) shouldPrefabInputFrameDownsync(prevRenderFrameId int32, renderFrameId int32) (bool, int32) { - for i := prevRenderFrameId + 1; i <= renderFrameId; i++ { - if (0 <= i) && (0 == (i & ((1 << pR.InputScaleFrames) - 1))) { - return true, i - } - } - return false, -1 -} - func (pR *Room) getOrPrefabInputFrameDownsync(inputFrameId int32) *battle.InputFrameDownsync { /* [WARNING] This function MUST BE called while "pR.InputsBufferLock" is locked. @@ -1170,7 +1131,7 @@ func (pR *Room) markConfirmationIfApplicable(inputFrameUpsyncBatch []*pb.InputFr */ snapshotStFrameId := (pR.LastAllConfirmedInputFrameId - newAllConfirmedCount) refRenderFrameIdIfNeeded := pR.CurDynamicsRenderFrameId - 1 - refSnapshotStFrameId := pR.ConvertToInputFrameId(refRenderFrameIdIfNeeded, pR.InputDelayFrames) + refSnapshotStFrameId := battle.ConvertToDelayedInputFrameId(refRenderFrameIdIfNeeded) if refSnapshotStFrameId < snapshotStFrameId { snapshotStFrameId = refSnapshotStFrameId } @@ -1186,7 +1147,7 @@ func (pR *Room) forceConfirmationIfApplicable(prevRenderFrameId int32) uint64 { totPlayerCnt := uint32(pR.Capacity) allConfirmedMask := uint64((1 << totPlayerCnt) - 1) unconfirmedMask := uint64(0) - if pR.LatestPlayerUpsyncedInputFrameId > (pR.LastAllConfirmedInputFrameId + (pR.NstDelayFrames >> pR.InputScaleFrames)) { + if pR.LatestPlayerUpsyncedInputFrameId > (pR.LastAllConfirmedInputFrameId + pR.InputFrameUpsyncDelayTolerance + 1) { // Type#1 check whether there's a significantly slow ticker among players oldLastAllConfirmedInputFrameId := pR.LastAllConfirmedInputFrameId for j := pR.LastAllConfirmedInputFrameId + 1; j <= pR.LatestPlayerUpsyncedInputFrameId; j++ { @@ -1200,7 +1161,7 @@ func (pR *Room) forceConfirmationIfApplicable(prevRenderFrameId int32) uint64 { pR.onInputFrameDownsyncAllConfirmed(inputFrameDownsync, -1) } if 0 < unconfirmedMask { - Logger.Info(fmt.Sprintf("[type#1 forceConfirmation] For roomId=%d@renderFrameId=%d, curDynamicsRenderFrameId=%d, LatestPlayerUpsyncedInputFrameId:%d, oldLastAllConfirmedInputFrameId:%d, newLastAllConfirmedInputFrameId:%d, (pR.NstDelayFrames >> pR.InputScaleFrames):%d, InputFrameUpsyncDelayTolerance:%d, unconfirmedMask=%d; there's a slow ticker suspect, forcing all-confirmation", pR.Id, pR.RenderFrameId, pR.CurDynamicsRenderFrameId, pR.LatestPlayerUpsyncedInputFrameId, oldLastAllConfirmedInputFrameId, pR.LastAllConfirmedInputFrameId, (pR.NstDelayFrames >> pR.InputScaleFrames), pR.InputFrameUpsyncDelayTolerance, unconfirmedMask)) + Logger.Info(fmt.Sprintf("[type#1 forceConfirmation] For roomId=%d@renderFrameId=%d, curDynamicsRenderFrameId=%d, LatestPlayerUpsyncedInputFrameId:%d, oldLastAllConfirmedInputFrameId:%d, newLastAllConfirmedInputFrameId:%d, InputFrameUpsyncDelayTolerance:%d, unconfirmedMask=%d; there's a slow ticker suspect, forcing all-confirmation", pR.Id, pR.RenderFrameId, pR.CurDynamicsRenderFrameId, pR.LatestPlayerUpsyncedInputFrameId, oldLastAllConfirmedInputFrameId, pR.LastAllConfirmedInputFrameId, pR.InputFrameUpsyncDelayTolerance, unconfirmedMask)) } } else { // Type#2 helps resolve the edge case when all players are disconnected temporarily @@ -1237,7 +1198,7 @@ func (pR *Room) produceInputsBufferSnapshotWithCurDynamicsRenderFrameAsRef(uncon } } -func (pR *Room) applyInputFrameDownsyncDynamics(fromRenderFrameId int32, toRenderFrameId int32, spaceOffsetX, spaceOffsetY float64) { +func (pR *Room) applyInputFrameDownsyncDynamics(fromRenderFrameId int32, toRenderFrameId int32) { // [WARNING] This function MUST BE called while "pR.InputsBufferLock" is locked! if fromRenderFrameId >= toRenderFrameId { return @@ -1251,7 +1212,7 @@ func (pR *Room) applyInputFrameDownsyncDynamics(fromRenderFrameId int32, toRende panic(fmt.Sprintf("collisionSysRenderFrameId=%v doesn't exist for roomId=%v, this is abnormal because it's to be used for applying dynamics to [fromRenderFrameId:%v, toRenderFrameId:%v)! RenderFrameBuffer=%v", collisionSysRenderFrameId, pR.Id, fromRenderFrameId, toRenderFrameId, pR.RenderFrameBufferString())) } currRenderFrame := currRenderFrameTmp.(*battle.RoomDownsyncFrame) - delayedInputFrameId := pR.ConvertToInputFrameId(collisionSysRenderFrameId, pR.InputDelayFrames) + delayedInputFrameId := battle.ConvertToDelayedInputFrameId(collisionSysRenderFrameId) if 0 <= delayedInputFrameId { if delayedInputFrameId > pR.LastAllConfirmedInputFrameId { panic(fmt.Sprintf("delayedInputFrameId=%v is not yet all-confirmed for roomId=%v, this is abnormal because it's to be used for applying dynamics to [fromRenderFrameId:%v, toRenderFrameId:%v) @ collisionSysRenderFrameId=%v! InputsBuffer=%v", delayedInputFrameId, pR.Id, fromRenderFrameId, toRenderFrameId, collisionSysRenderFrameId, pR.InputsBufferString(false))) @@ -1275,29 +1236,16 @@ func (pR *Room) applyInputFrameDownsyncDynamics(fromRenderFrameId int32, toRende } } - nextRenderFrame := battle.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(pR.InputsBuffer, currRenderFrame, pR.Space, pR.CollisionSysMap, pR.GravityX, pR.GravityY, pR.JumpingInitVelY, pR.InputDelayFrames, pR.InputScaleFrames, pR.collisionSpaceOffsetX, pR.collisionSpaceOffsetY, pR.SnapIntoPlatformOverlap, pR.SnapIntoPlatformThreshold, pR.WorldToVirtualGridRatio, pR.VirtualGridToWorldRatio, pR.playerOpPatternToSkillId) + nextRenderFrame := battle.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(pR.InputsBuffer, currRenderFrame, pR.Space, pR.CollisionSysMap, pR.SpaceOffsetX, pR.SpaceOffsetY, pR.CharacterConfigsArr) pR.RenderFrameBuffer.Put(nextRenderFrame) pR.CurDynamicsRenderFrameId++ } } -func (pR *Room) refreshColliders(spaceW, spaceH int32) { +func (pR *Room) refreshColliders() { // Kindly note that by now, we've already got all the shapes in the tmx file into "pR.(Players | Barriers)" from "ParseTmxLayersAndGroups" - topPadding, bottomPadding, leftPadding, rightPadding := pR.SnapIntoPlatformOverlap, pR.SnapIntoPlatformOverlap, pR.SnapIntoPlatformOverlap, pR.SnapIntoPlatformOverlap - - pR.Space = resolv.NewSpace(int(spaceW), int(spaceH), int(pR.CollisionMinStep), int(pR.CollisionMinStep)) // allocate a new collision space everytime after a battle is settled - jsPlayers := toJsPlayers(pR.Players) - for _, player := range jsPlayers { - wx, wy := battle.VirtualGridToWorldPos(player.VirtualGridX, player.VirtualGridY, pR.VirtualGridToWorldRatio) - colliderWidth, colliderHeight := player.ColliderRadius*2, player.ColliderRadius*4 - playerCollider := battle.GenerateRectCollider(wx, wy, colliderWidth, colliderHeight, topPadding, bottomPadding, leftPadding, rightPadding, pR.collisionSpaceOffsetX, pR.collisionSpaceOffsetY, player, "Player") // the coords of all barrier boundaries are multiples of tileWidth(i.e. 16), by adding snapping y-padding when "landedOnGravityPushback" all "playerCollider.Y" would be a multiple of 1.0 - pR.Space.Add(playerCollider) - // Keep track of the collider in "pR.CollisionSysMap" - joinIndex := player.JoinIndex - collisionPlayerIndex := battle.COLLISION_PLAYER_INDEX_PREFIX + joinIndex - pR.CollisionSysMap[collisionPlayerIndex] = playerCollider - } + pR.Space = resolv.NewSpace(int(pR.SpaceOffsetX*2), int(pR.SpaceOffsetY*2), int(pR.CollisionMinStep), int(pR.CollisionMinStep)) // allocate a new collision space everytime after a battle is settled for _, player := range pR.Players { joinIndex := player.JoinIndex @@ -1310,7 +1258,7 @@ func (pR *Room) refreshColliders(spaceW, spaceH int32) { // For debug-printing only. Logger.Info("ChooseStage printing polygon2D for barrierPolygon2DList", zap.Any("barrierLocalIdInBattle", barrierLocalIdInBattle), zap.Any("polygon2D.Anchor", polygon2D.Anchor), zap.Any("polygon2D.Points", polygon2D.Points)) */ - barrierCollider := battle.GenerateConvexPolygonCollider(polygon2DUnaligned, pR.collisionSpaceOffsetX, pR.collisionSpaceOffsetY, nil, "Barrier") + barrierCollider := battle.GenerateConvexPolygonCollider(polygon2DUnaligned, pR.SpaceOffsetX, pR.SpaceOffsetY, nil, "Barrier") pR.Space.Add(barrierCollider) } } @@ -1329,8 +1277,8 @@ func (pR *Room) doBattleMainLoopPerTickBackendDynamicsWithProperLocking(prevRend Logger.Debug(fmt.Sprintf("doBattleMainLoopPerTickBackendDynamicsWithProperLocking-InputsBufferLock unlocked: roomId=%v", pR.Id)) }() - if ok, thatRenderFrameId := pR.shouldPrefabInputFrameDownsync(prevRenderFrameId, pR.RenderFrameId); ok { - noDelayInputFrameId := pR.ConvertToInputFrameId(thatRenderFrameId, 0) + if ok, thatRenderFrameId := battle.ShouldPrefabInputFrameDownsync(prevRenderFrameId, pR.RenderFrameId); ok { + noDelayInputFrameId := battle.ConvertToNoDelayInputFrameId(thatRenderFrameId) pR.getOrPrefabInputFrameDownsync(noDelayInputFrameId) } @@ -1341,9 +1289,9 @@ func (pR *Room) doBattleMainLoopPerTickBackendDynamicsWithProperLocking(prevRend if 0 <= pR.LastAllConfirmedInputFrameId { dynamicsStartedAt := utils.UnixtimeNano() // Apply "all-confirmed inputFrames" to move forward "pR.CurDynamicsRenderFrameId" - nextDynamicsRenderFrameId := pR.ConvertToLastUsedRenderFrameId(pR.LastAllConfirmedInputFrameId, pR.InputDelayFrames) + 1 - Logger.Debug(fmt.Sprintf("roomId=%v, room.RenderFrameId=%v, room.CurDynamicsRenderFrameId=%v, LastAllConfirmedInputFrameId=%v, InputDelayFrames=%v, nextDynamicsRenderFrameId=%v", pR.Id, pR.RenderFrameId, pR.CurDynamicsRenderFrameId, pR.LastAllConfirmedInputFrameId, pR.InputDelayFrames, nextDynamicsRenderFrameId)) - pR.applyInputFrameDownsyncDynamics(pR.CurDynamicsRenderFrameId, nextDynamicsRenderFrameId, pR.collisionSpaceOffsetX, pR.collisionSpaceOffsetY) + nextDynamicsRenderFrameId := battle.ConvertToLastUsedRenderFrameId(pR.LastAllConfirmedInputFrameId) + 1 + Logger.Debug(fmt.Sprintf("roomId=%v, room.RenderFrameId=%v, room.CurDynamicsRenderFrameId=%v, LastAllConfirmedInputFrameId=%v, nextDynamicsRenderFrameId=%v", pR.Id, pR.RenderFrameId, pR.CurDynamicsRenderFrameId, pR.LastAllConfirmedInputFrameId, nextDynamicsRenderFrameId)) + pR.applyInputFrameDownsyncDynamics(pR.CurDynamicsRenderFrameId, nextDynamicsRenderFrameId) *pDynamicsDuration = utils.UnixtimeNano() - dynamicsStartedAt } @@ -1360,7 +1308,7 @@ func (pR *Room) doBattleMainLoopPerTickBackendDynamicsWithProperLocking(prevRend if 0 < unconfirmedMask { // [WARNING] As "pR.CurDynamicsRenderFrameId" was just incremented above, "refSnapshotStFrameId" is most possibly larger than "oldLastAllConfirmedInputFrameId + 1", therefore this initial assignment is critical for `ACTIVE NORMAL TICKER`s to receive consecutive ids of inputFrameDownsync. snapshotStFrameId := oldLastAllConfirmedInputFrameId + 1 - refSnapshotStFrameId := pR.ConvertToInputFrameId(pR.CurDynamicsRenderFrameId-1, pR.InputDelayFrames) + refSnapshotStFrameId := battle.ConvertToDelayedInputFrameId(pR.CurDynamicsRenderFrameId - 1) if refSnapshotStFrameId < snapshotStFrameId { snapshotStFrameId = refSnapshotStFrameId } @@ -1472,15 +1420,13 @@ func (pR *Room) downsyncToSinglePlayer(playerId int32, player *Player, refRender } refRenderFrame := tmp.(*battle.RoomDownsyncFrame) - refRenderFrame.PlayerOpPatternToSkillId = pR.playerOpPatternToSkillId - for i, player := range pR.PlayersArr { - refRenderFrame.PlayersArr[i].ColliderRadius = player.ColliderRadius // hardcoded for now - } if shouldResync3 { refRenderFrame.ShouldForceResync = true } refRenderFrame.BackendUnconfirmedMask = unconfirmedMask - pR.sendSafely(toPbRoomDownsyncFrame(refRenderFrame), toSendInputFrameDownsyncsSnapshot, DOWNSYNC_MSG_ACT_FORCED_RESYNC, playerId, false) + pbRefRenderFrame := toPbRoomDownsyncFrame(refRenderFrame) + pbRefRenderFrame.SpeciesIdList = pR.SpeciesIdList + pR.sendSafely(pbRefRenderFrame, toSendInputFrameDownsyncsSnapshot, DOWNSYNC_MSG_ACT_FORCED_RESYNC, playerId, false) //Logger.Warn(fmt.Sprintf("Sent refRenderFrameId=%v & inputFrameIds [%d, %d), for roomId=%v, playerId=%d, playerJoinIndex=%d, renderFrameId=%d, curDynamicsRenderFrameId=%d, playerLastSentInputFrameId=%d: InputsBuffer=%v", refRenderFrameId, toSendInputFrameIdSt, toSendInputFrameIdEd, pR.Id, playerId, player.JoinIndex, pR.RenderFrameId, pR.CurDynamicsRenderFrameId, player.LastSentInputFrameId, pR.InputsBufferString(false))) if shouldResync1 { Logger.Warn(fmt.Sprintf("Sent refRenderFrameId=%v & inputFrameIds [%d, %d), for roomId=%v, playerId=%d, playerJoinIndex=%d, renderFrameId=%d, curDynamicsRenderFrameId=%d, playerLastSentInputFrameId=%d: shouldResync1=%v, shouldResync2=%v, shouldResync3=%v, playerBattleState=%d", refRenderFrameId, toSendInputFrameIdSt, toSendInputFrameIdEd, pR.Id, playerId, player.JoinIndex, pR.RenderFrameId, pR.CurDynamicsRenderFrameId, player.LastSentInputFrameId, shouldResync1, shouldResync2, shouldResync3, playerBattleState)) diff --git a/battle_srv/protos/room_downsync_frame.pb.go b/battle_srv/protos/room_downsync_frame.pb.go index bab51dc..083e557 100644 --- a/battle_srv/protos/room_downsync_frame.pb.go +++ b/battle_srv/protos/room_downsync_frame.pb.go @@ -26,28 +26,32 @@ type PlayerDownsync struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` - VirtualGridX int32 `protobuf:"varint,2,opt,name=virtualGridX,proto3" json:"virtualGridX,omitempty"` - VirtualGridY int32 `protobuf:"varint,3,opt,name=virtualGridY,proto3" json:"virtualGridY,omitempty"` - DirX int32 `protobuf:"varint,4,opt,name=dirX,proto3" json:"dirX,omitempty"` - DirY int32 `protobuf:"varint,5,opt,name=dirY,proto3" json:"dirY,omitempty"` // "dirX" and "dirY" determines character facing - VelX int32 `protobuf:"varint,6,opt,name=velX,proto3" json:"velX,omitempty"` - VelY int32 `protobuf:"varint,7,opt,name=velY,proto3" json:"velY,omitempty"` // "velX" and "velY" is used to record the accumulated effect by accelerations (including gravity) - Speed int32 `protobuf:"varint,8,opt,name=speed,proto3" json:"speed,omitempty"` // this is the instantaneous scalar attribute of a character, different from but will be accounted in "velX" and "velY" - BattleState int32 `protobuf:"varint,9,opt,name=battleState,proto3" json:"battleState,omitempty"` - JoinIndex int32 `protobuf:"varint,10,opt,name=joinIndex,proto3" json:"joinIndex,omitempty"` - ColliderRadius float64 `protobuf:"fixed64,11,opt,name=colliderRadius,proto3" json:"colliderRadius,omitempty"` - Removed bool `protobuf:"varint,12,opt,name=removed,proto3" json:"removed,omitempty"` - Score int32 `protobuf:"varint,13,opt,name=score,proto3" json:"score,omitempty"` - LastMoveGmtMillis int32 `protobuf:"varint,14,opt,name=lastMoveGmtMillis,proto3" json:"lastMoveGmtMillis,omitempty"` - FramesToRecover int32 `protobuf:"varint,15,opt,name=framesToRecover,proto3" json:"framesToRecover,omitempty"` - Hp int32 `protobuf:"varint,16,opt,name=hp,proto3" json:"hp,omitempty"` - MaxHp int32 `protobuf:"varint,17,opt,name=maxHp,proto3" json:"maxHp,omitempty"` - CharacterState int32 `protobuf:"varint,18,opt,name=characterState,proto3" json:"characterState,omitempty"` - InAir bool `protobuf:"varint,19,opt,name=inAir,proto3" json:"inAir,omitempty"` // by design a standalone field only inferred by the collision result of "applyInputFrameDownsyncDynamicsOnSingleRenderFrame" instead of "characterState", because we need check the transition for "characterState" from this field, i.e. "inAir (prev -> curr)" - Name string `protobuf:"bytes,20,opt,name=name,proto3" json:"name,omitempty"` - DisplayName string `protobuf:"bytes,21,opt,name=displayName,proto3" json:"displayName,omitempty"` - Avatar string `protobuf:"bytes,22,opt,name=avatar,proto3" json:"avatar,omitempty"` + Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + VirtualGridX int32 `protobuf:"varint,2,opt,name=virtualGridX,proto3" json:"virtualGridX,omitempty"` + VirtualGridY int32 `protobuf:"varint,3,opt,name=virtualGridY,proto3" json:"virtualGridY,omitempty"` + DirX int32 `protobuf:"varint,4,opt,name=dirX,proto3" json:"dirX,omitempty"` + DirY int32 `protobuf:"varint,5,opt,name=dirY,proto3" json:"dirY,omitempty"` // "dirX" and "dirY" determines character facing + VelX int32 `protobuf:"varint,6,opt,name=velX,proto3" json:"velX,omitempty"` + VelY int32 `protobuf:"varint,7,opt,name=velY,proto3" json:"velY,omitempty"` // "velX" and "velY" is used to record the accumulated effect by accelerations (including gravity) + Speed int32 `protobuf:"varint,8,opt,name=speed,proto3" json:"speed,omitempty"` // this is the instantaneous scalar attribute of a character, different from but will be accounted in "velX" and "velY" + BattleState int32 `protobuf:"varint,9,opt,name=battleState,proto3" json:"battleState,omitempty"` + JoinIndex int32 `protobuf:"varint,10,opt,name=joinIndex,proto3" json:"joinIndex,omitempty"` + ColliderRadius int32 `protobuf:"varint,11,opt,name=colliderRadius,proto3" json:"colliderRadius,omitempty"` + Removed bool `protobuf:"varint,12,opt,name=removed,proto3" json:"removed,omitempty"` + Score int32 `protobuf:"varint,13,opt,name=score,proto3" json:"score,omitempty"` + LastMoveGmtMillis int32 `protobuf:"varint,14,opt,name=lastMoveGmtMillis,proto3" json:"lastMoveGmtMillis,omitempty"` + FramesToRecover int32 `protobuf:"varint,15,opt,name=framesToRecover,proto3" json:"framesToRecover,omitempty"` + Hp int32 `protobuf:"varint,16,opt,name=hp,proto3" json:"hp,omitempty"` + MaxHp int32 `protobuf:"varint,17,opt,name=maxHp,proto3" json:"maxHp,omitempty"` + CharacterState int32 `protobuf:"varint,18,opt,name=characterState,proto3" json:"characterState,omitempty"` + InAir bool `protobuf:"varint,19,opt,name=inAir,proto3" json:"inAir,omitempty"` // by design a standalone field only inferred by the collision result of "applyInputFrameDownsyncDynamicsOnSingleRenderFrame" instead of "characterState", because we need check the transition for "characterState" from this field, i.e. "inAir (prev -> curr)" + FramesInChState int32 `protobuf:"varint,20,opt,name=framesInChState,proto3" json:"framesInChState,omitempty"` // number of frames elapsed in the current character state + ActiveSkillId int32 `protobuf:"varint,21,opt,name=activeSkillId,proto3" json:"activeSkillId,omitempty"` + ActiveSkillHit int32 `protobuf:"varint,22,opt,name=activeSkillHit,proto3" json:"activeSkillHit,omitempty"` + FramesInvinsible int32 `protobuf:"varint,23,opt,name=framesInvinsible,proto3" json:"framesInvinsible,omitempty"` + Name string `protobuf:"bytes,997,opt,name=name,proto3" json:"name,omitempty"` + DisplayName string `protobuf:"bytes,998,opt,name=displayName,proto3" json:"displayName,omitempty"` + Avatar string `protobuf:"bytes,999,opt,name=avatar,proto3" json:"avatar,omitempty"` } func (x *PlayerDownsync) Reset() { @@ -152,7 +156,7 @@ func (x *PlayerDownsync) GetJoinIndex() int32 { return 0 } -func (x *PlayerDownsync) GetColliderRadius() float64 { +func (x *PlayerDownsync) GetColliderRadius() int32 { if x != nil { return x.ColliderRadius } @@ -215,6 +219,34 @@ func (x *PlayerDownsync) GetInAir() bool { return false } +func (x *PlayerDownsync) GetFramesInChState() int32 { + if x != nil { + return x.FramesInChState + } + return 0 +} + +func (x *PlayerDownsync) GetActiveSkillId() int32 { + if x != nil { + return x.ActiveSkillId + } + return 0 +} + +func (x *PlayerDownsync) GetActiveSkillHit() int32 { + if x != nil { + return x.ActiveSkillHit + } + return 0 +} + +func (x *PlayerDownsync) GetFramesInvinsible() int32 { + if x != nil { + return x.FramesInvinsible + } + return 0 +} + func (x *PlayerDownsync) GetName() string { if x != nil { return x.Name @@ -739,26 +771,24 @@ type MeleeBullet struct { unknownFields protoimpl.UnknownFields // for offender - BattleLocalId int32 `protobuf:"varint,1,opt,name=battleLocalId,proto3" json:"battleLocalId,omitempty"` - StartupFrames int32 `protobuf:"varint,2,opt,name=startupFrames,proto3" json:"startupFrames,omitempty"` - ActiveFrames int32 `protobuf:"varint,3,opt,name=activeFrames,proto3" json:"activeFrames,omitempty"` - RecoveryFrames int32 `protobuf:"varint,4,opt,name=recoveryFrames,proto3" json:"recoveryFrames,omitempty"` - RecoveryFramesOnBlock int32 `protobuf:"varint,5,opt,name=recoveryFramesOnBlock,proto3" json:"recoveryFramesOnBlock,omitempty"` - RecoveryFramesOnHit int32 `protobuf:"varint,6,opt,name=recoveryFramesOnHit,proto3" json:"recoveryFramesOnHit,omitempty"` - HitboxOffset float64 `protobuf:"fixed64,7,opt,name=hitboxOffset,proto3" json:"hitboxOffset,omitempty"` - OriginatedRenderFrameId int32 `protobuf:"varint,8,opt,name=originatedRenderFrameId,proto3" json:"originatedRenderFrameId,omitempty"` - // for defender - HitStunFrames int32 `protobuf:"varint,9,opt,name=hitStunFrames,proto3" json:"hitStunFrames,omitempty"` - BlockStunFrames int32 `protobuf:"varint,10,opt,name=blockStunFrames,proto3" json:"blockStunFrames,omitempty"` - Pushback float64 `protobuf:"fixed64,11,opt,name=pushback,proto3" json:"pushback,omitempty"` - ReleaseTriggerType int32 `protobuf:"varint,12,opt,name=releaseTriggerType,proto3" json:"releaseTriggerType,omitempty"` // 1: rising-edge, 2: falling-edge - Damage int32 `protobuf:"varint,13,opt,name=damage,proto3" json:"damage,omitempty"` - OffenderJoinIndex int32 `protobuf:"varint,14,opt,name=offenderJoinIndex,proto3" json:"offenderJoinIndex,omitempty"` - OffenderPlayerId int32 `protobuf:"varint,15,opt,name=offenderPlayerId,proto3" json:"offenderPlayerId,omitempty"` - HitboxSizeX float64 `protobuf:"fixed64,16,opt,name=hitboxSizeX,proto3" json:"hitboxSizeX,omitempty"` - HitboxSizeY float64 `protobuf:"fixed64,17,opt,name=hitboxSizeY,proto3" json:"hitboxSizeY,omitempty"` - SelfMoveforwardX float64 `protobuf:"fixed64,18,opt,name=selfMoveforwardX,proto3" json:"selfMoveforwardX,omitempty"` - SelfMoveforwardY float64 `protobuf:"fixed64,19,opt,name=selfMoveforwardY,proto3" json:"selfMoveforwardY,omitempty"` + OriginatedRenderFrameId int32 `protobuf:"varint,1,opt,name=originatedRenderFrameId,proto3" json:"originatedRenderFrameId,omitempty"` + OffenderJoinIndex int32 `protobuf:"varint,2,opt,name=offenderJoinIndex,proto3" json:"offenderJoinIndex,omitempty"` + StartupFrames int32 `protobuf:"varint,3,opt,name=startupFrames,proto3" json:"startupFrames,omitempty"` + CancellableStFrame int32 `protobuf:"varint,4,opt,name=cancellableStFrame,proto3" json:"cancellableStFrame,omitempty"` + CancellableEdFrame int32 `protobuf:"varint,5,opt,name=cancellableEdFrame,proto3" json:"cancellableEdFrame,omitempty"` + ActiveFrames int32 `protobuf:"varint,6,opt,name=activeFrames,proto3" json:"activeFrames,omitempty"` + HitStunFrames int32 `protobuf:"varint,7,opt,name=hitStunFrames,proto3" json:"hitStunFrames,omitempty"` + BlockStunFrames int32 `protobuf:"varint,8,opt,name=blockStunFrames,proto3" json:"blockStunFrames,omitempty"` + PushbackVelX int32 `protobuf:"varint,9,opt,name=pushbackVelX,proto3" json:"pushbackVelX,omitempty"` + PushbackVelY int32 `protobuf:"varint,10,opt,name=pushbackVelY,proto3" json:"pushbackVelY,omitempty"` + Damage int32 `protobuf:"varint,11,opt,name=damage,proto3" json:"damage,omitempty"` + SelfLockVelX int32 `protobuf:"varint,12,opt,name=selfLockVelX,proto3" json:"selfLockVelX,omitempty"` + SelfLockVelY int32 `protobuf:"varint,13,opt,name=selfLockVelY,proto3" json:"selfLockVelY,omitempty"` + HitboxOffsetX int32 `protobuf:"varint,14,opt,name=hitboxOffsetX,proto3" json:"hitboxOffsetX,omitempty"` + HitboxOffsetY int32 `protobuf:"varint,15,opt,name=hitboxOffsetY,proto3" json:"hitboxOffsetY,omitempty"` + HitboxSizeX int32 `protobuf:"varint,16,opt,name=hitboxSizeX,proto3" json:"hitboxSizeX,omitempty"` + HitboxSizeY int32 `protobuf:"varint,17,opt,name=hitboxSizeY,proto3" json:"hitboxSizeY,omitempty"` + BlowUp bool `protobuf:"varint,18,opt,name=blowUp,proto3" json:"blowUp,omitempty"` } func (x *MeleeBullet) Reset() { @@ -793,9 +823,16 @@ func (*MeleeBullet) Descriptor() ([]byte, []int) { return file_room_downsync_frame_proto_rawDescGZIP(), []int{8} } -func (x *MeleeBullet) GetBattleLocalId() int32 { +func (x *MeleeBullet) GetOriginatedRenderFrameId() int32 { if x != nil { - return x.BattleLocalId + return x.OriginatedRenderFrameId + } + return 0 +} + +func (x *MeleeBullet) GetOffenderJoinIndex() int32 { + if x != nil { + return x.OffenderJoinIndex } return 0 } @@ -807,6 +844,20 @@ func (x *MeleeBullet) GetStartupFrames() int32 { return 0 } +func (x *MeleeBullet) GetCancellableStFrame() int32 { + if x != nil { + return x.CancellableStFrame + } + return 0 +} + +func (x *MeleeBullet) GetCancellableEdFrame() int32 { + if x != nil { + return x.CancellableEdFrame + } + return 0 +} + func (x *MeleeBullet) GetActiveFrames() int32 { if x != nil { return x.ActiveFrames @@ -814,41 +865,6 @@ func (x *MeleeBullet) GetActiveFrames() int32 { return 0 } -func (x *MeleeBullet) GetRecoveryFrames() int32 { - if x != nil { - return x.RecoveryFrames - } - return 0 -} - -func (x *MeleeBullet) GetRecoveryFramesOnBlock() int32 { - if x != nil { - return x.RecoveryFramesOnBlock - } - return 0 -} - -func (x *MeleeBullet) GetRecoveryFramesOnHit() int32 { - if x != nil { - return x.RecoveryFramesOnHit - } - return 0 -} - -func (x *MeleeBullet) GetHitboxOffset() float64 { - if x != nil { - return x.HitboxOffset - } - return 0 -} - -func (x *MeleeBullet) GetOriginatedRenderFrameId() int32 { - if x != nil { - return x.OriginatedRenderFrameId - } - return 0 -} - func (x *MeleeBullet) GetHitStunFrames() int32 { if x != nil { return x.HitStunFrames @@ -863,16 +879,16 @@ func (x *MeleeBullet) GetBlockStunFrames() int32 { return 0 } -func (x *MeleeBullet) GetPushback() float64 { +func (x *MeleeBullet) GetPushbackVelX() int32 { if x != nil { - return x.Pushback + return x.PushbackVelX } return 0 } -func (x *MeleeBullet) GetReleaseTriggerType() int32 { +func (x *MeleeBullet) GetPushbackVelY() int32 { if x != nil { - return x.ReleaseTriggerType + return x.PushbackVelY } return 0 } @@ -884,46 +900,53 @@ func (x *MeleeBullet) GetDamage() int32 { return 0 } -func (x *MeleeBullet) GetOffenderJoinIndex() int32 { +func (x *MeleeBullet) GetSelfLockVelX() int32 { if x != nil { - return x.OffenderJoinIndex + return x.SelfLockVelX } return 0 } -func (x *MeleeBullet) GetOffenderPlayerId() int32 { +func (x *MeleeBullet) GetSelfLockVelY() int32 { if x != nil { - return x.OffenderPlayerId + return x.SelfLockVelY } return 0 } -func (x *MeleeBullet) GetHitboxSizeX() float64 { +func (x *MeleeBullet) GetHitboxOffsetX() int32 { + if x != nil { + return x.HitboxOffsetX + } + return 0 +} + +func (x *MeleeBullet) GetHitboxOffsetY() int32 { + if x != nil { + return x.HitboxOffsetY + } + return 0 +} + +func (x *MeleeBullet) GetHitboxSizeX() int32 { if x != nil { return x.HitboxSizeX } return 0 } -func (x *MeleeBullet) GetHitboxSizeY() float64 { +func (x *MeleeBullet) GetHitboxSizeY() int32 { if x != nil { return x.HitboxSizeY } return 0 } -func (x *MeleeBullet) GetSelfMoveforwardX() float64 { +func (x *MeleeBullet) GetBlowUp() bool { if x != nil { - return x.SelfMoveforwardX + return x.BlowUp } - return 0 -} - -func (x *MeleeBullet) GetSelfMoveforwardY() float64 { - if x != nil { - return x.SelfMoveforwardY - } - return 0 + return false } type BattleColliderInfo struct { @@ -932,34 +955,18 @@ type BattleColliderInfo struct { unknownFields protoimpl.UnknownFields StageName string `protobuf:"bytes,1,opt,name=stageName,proto3" json:"stageName,omitempty"` - StageDiscreteW int32 `protobuf:"varint,2,opt,name=stageDiscreteW,proto3" json:"stageDiscreteW,omitempty"` - StageDiscreteH int32 `protobuf:"varint,3,opt,name=stageDiscreteH,proto3" json:"stageDiscreteH,omitempty"` - StageTileW int32 `protobuf:"varint,4,opt,name=stageTileW,proto3" json:"stageTileW,omitempty"` - StageTileH int32 `protobuf:"varint,5,opt,name=stageTileH,proto3" json:"stageTileH,omitempty"` - IntervalToPing int32 `protobuf:"varint,6,opt,name=intervalToPing,proto3" json:"intervalToPing,omitempty"` - WillKickIfInactiveFor int32 `protobuf:"varint,7,opt,name=willKickIfInactiveFor,proto3" json:"willKickIfInactiveFor,omitempty"` - BoundRoomId int32 `protobuf:"varint,8,opt,name=boundRoomId,proto3" json:"boundRoomId,omitempty"` - BattleDurationFrames int32 `protobuf:"varint,9,opt,name=battleDurationFrames,proto3" json:"battleDurationFrames,omitempty"` - BattleDurationNanos int64 `protobuf:"varint,10,opt,name=battleDurationNanos,proto3" json:"battleDurationNanos,omitempty"` - ServerFps int32 `protobuf:"varint,11,opt,name=serverFps,proto3" json:"serverFps,omitempty"` - InputDelayFrames int32 `protobuf:"varint,12,opt,name=inputDelayFrames,proto3" json:"inputDelayFrames,omitempty"` // in the count of render frames - InputScaleFrames uint32 `protobuf:"varint,13,opt,name=inputScaleFrames,proto3" json:"inputScaleFrames,omitempty"` // inputDelayedAndScaledFrameId = ((originalFrameId - InputDelayFrames) >> InputScaleFrames) - NstDelayFrames int32 `protobuf:"varint,14,opt,name=nstDelayFrames,proto3" json:"nstDelayFrames,omitempty"` // 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" - InputFrameUpsyncDelayTolerance int32 `protobuf:"varint,15,opt,name=inputFrameUpsyncDelayTolerance,proto3" json:"inputFrameUpsyncDelayTolerance,omitempty"` - MaxChasingRenderFramesPerUpdate int32 `protobuf:"varint,16,opt,name=maxChasingRenderFramesPerUpdate,proto3" json:"maxChasingRenderFramesPerUpdate,omitempty"` - PlayerBattleState int32 `protobuf:"varint,17,opt,name=playerBattleState,proto3" json:"playerBattleState,omitempty"` - RollbackEstimatedDtMillis float64 `protobuf:"fixed64,18,opt,name=rollbackEstimatedDtMillis,proto3" json:"rollbackEstimatedDtMillis,omitempty"` - RollbackEstimatedDtNanos int64 `protobuf:"varint,19,opt,name=rollbackEstimatedDtNanos,proto3" json:"rollbackEstimatedDtNanos,omitempty"` - WorldToVirtualGridRatio float64 `protobuf:"fixed64,20,opt,name=worldToVirtualGridRatio,proto3" json:"worldToVirtualGridRatio,omitempty"` - VirtualGridToWorldRatio float64 `protobuf:"fixed64,21,opt,name=virtualGridToWorldRatio,proto3" json:"virtualGridToWorldRatio,omitempty"` - SpAtkLookupFrames int32 `protobuf:"varint,22,opt,name=spAtkLookupFrames,proto3" json:"spAtkLookupFrames,omitempty"` - RenderCacheSize int32 `protobuf:"varint,23,opt,name=renderCacheSize,proto3" json:"renderCacheSize,omitempty"` - SnapIntoPlatformOverlap float64 `protobuf:"fixed64,24,opt,name=snapIntoPlatformOverlap,proto3" json:"snapIntoPlatformOverlap,omitempty"` - SnapIntoPlatformThreshold float64 `protobuf:"fixed64,25,opt,name=snapIntoPlatformThreshold,proto3" json:"snapIntoPlatformThreshold,omitempty"` - JumpingInitVelY int32 `protobuf:"varint,26,opt,name=jumpingInitVelY,proto3" json:"jumpingInitVelY,omitempty"` - GravityX int32 `protobuf:"varint,27,opt,name=gravityX,proto3" json:"gravityX,omitempty"` - GravityY int32 `protobuf:"varint,28,opt,name=gravityY,proto3" json:"gravityY,omitempty"` - CollisionMinStep int32 `protobuf:"varint,29,opt,name=collisionMinStep,proto3" json:"collisionMinStep,omitempty"` + IntervalToPing int32 `protobuf:"varint,2,opt,name=intervalToPing,proto3" json:"intervalToPing,omitempty"` + WillKickIfInactiveFor int32 `protobuf:"varint,3,opt,name=willKickIfInactiveFor,proto3" json:"willKickIfInactiveFor,omitempty"` + BoundRoomId int32 `protobuf:"varint,4,opt,name=boundRoomId,proto3" json:"boundRoomId,omitempty"` + BattleDurationNanos int64 `protobuf:"varint,5,opt,name=battleDurationNanos,proto3" json:"battleDurationNanos,omitempty"` + InputFrameUpsyncDelayTolerance int32 `protobuf:"varint,6,opt,name=inputFrameUpsyncDelayTolerance,proto3" json:"inputFrameUpsyncDelayTolerance,omitempty"` + MaxChasingRenderFramesPerUpdate int32 `protobuf:"varint,7,opt,name=maxChasingRenderFramesPerUpdate,proto3" json:"maxChasingRenderFramesPerUpdate,omitempty"` + RollbackEstimatedDtMillis float64 `protobuf:"fixed64,8,opt,name=rollbackEstimatedDtMillis,proto3" json:"rollbackEstimatedDtMillis,omitempty"` + RollbackEstimatedDtNanos int64 `protobuf:"varint,9,opt,name=rollbackEstimatedDtNanos,proto3" json:"rollbackEstimatedDtNanos,omitempty"` + RenderCacheSize int32 `protobuf:"varint,10,opt,name=renderCacheSize,proto3" json:"renderCacheSize,omitempty"` + SpaceOffsetX float64 `protobuf:"fixed64,11,opt,name=spaceOffsetX,proto3" json:"spaceOffsetX,omitempty"` + SpaceOffsetY float64 `protobuf:"fixed64,12,opt,name=spaceOffsetY,proto3" json:"spaceOffsetY,omitempty"` + CollisionMinStep int32 `protobuf:"varint,13,opt,name=collisionMinStep,proto3" json:"collisionMinStep,omitempty"` FrameDataLoggingEnabled bool `protobuf:"varint,999,opt,name=frameDataLoggingEnabled,proto3" json:"frameDataLoggingEnabled,omitempty"` } @@ -1002,34 +1009,6 @@ func (x *BattleColliderInfo) GetStageName() string { return "" } -func (x *BattleColliderInfo) GetStageDiscreteW() int32 { - if x != nil { - return x.StageDiscreteW - } - return 0 -} - -func (x *BattleColliderInfo) GetStageDiscreteH() int32 { - if x != nil { - return x.StageDiscreteH - } - return 0 -} - -func (x *BattleColliderInfo) GetStageTileW() int32 { - if x != nil { - return x.StageTileW - } - return 0 -} - -func (x *BattleColliderInfo) GetStageTileH() int32 { - if x != nil { - return x.StageTileH - } - return 0 -} - func (x *BattleColliderInfo) GetIntervalToPing() int32 { if x != nil { return x.IntervalToPing @@ -1051,13 +1030,6 @@ func (x *BattleColliderInfo) GetBoundRoomId() int32 { return 0 } -func (x *BattleColliderInfo) GetBattleDurationFrames() int32 { - if x != nil { - return x.BattleDurationFrames - } - return 0 -} - func (x *BattleColliderInfo) GetBattleDurationNanos() int64 { if x != nil { return x.BattleDurationNanos @@ -1065,34 +1037,6 @@ func (x *BattleColliderInfo) GetBattleDurationNanos() int64 { return 0 } -func (x *BattleColliderInfo) GetServerFps() int32 { - if x != nil { - return x.ServerFps - } - return 0 -} - -func (x *BattleColliderInfo) GetInputDelayFrames() int32 { - if x != nil { - return x.InputDelayFrames - } - return 0 -} - -func (x *BattleColliderInfo) GetInputScaleFrames() uint32 { - if x != nil { - return x.InputScaleFrames - } - return 0 -} - -func (x *BattleColliderInfo) GetNstDelayFrames() int32 { - if x != nil { - return x.NstDelayFrames - } - return 0 -} - func (x *BattleColliderInfo) GetInputFrameUpsyncDelayTolerance() int32 { if x != nil { return x.InputFrameUpsyncDelayTolerance @@ -1107,13 +1051,6 @@ func (x *BattleColliderInfo) GetMaxChasingRenderFramesPerUpdate() int32 { return 0 } -func (x *BattleColliderInfo) GetPlayerBattleState() int32 { - if x != nil { - return x.PlayerBattleState - } - return 0 -} - func (x *BattleColliderInfo) GetRollbackEstimatedDtMillis() float64 { if x != nil { return x.RollbackEstimatedDtMillis @@ -1128,27 +1065,6 @@ func (x *BattleColliderInfo) GetRollbackEstimatedDtNanos() int64 { return 0 } -func (x *BattleColliderInfo) GetWorldToVirtualGridRatio() float64 { - if x != nil { - return x.WorldToVirtualGridRatio - } - return 0 -} - -func (x *BattleColliderInfo) GetVirtualGridToWorldRatio() float64 { - if x != nil { - return x.VirtualGridToWorldRatio - } - return 0 -} - -func (x *BattleColliderInfo) GetSpAtkLookupFrames() int32 { - if x != nil { - return x.SpAtkLookupFrames - } - return 0 -} - func (x *BattleColliderInfo) GetRenderCacheSize() int32 { if x != nil { return x.RenderCacheSize @@ -1156,37 +1072,16 @@ func (x *BattleColliderInfo) GetRenderCacheSize() int32 { return 0 } -func (x *BattleColliderInfo) GetSnapIntoPlatformOverlap() float64 { +func (x *BattleColliderInfo) GetSpaceOffsetX() float64 { if x != nil { - return x.SnapIntoPlatformOverlap + return x.SpaceOffsetX } return 0 } -func (x *BattleColliderInfo) GetSnapIntoPlatformThreshold() float64 { +func (x *BattleColliderInfo) GetSpaceOffsetY() float64 { if x != nil { - return x.SnapIntoPlatformThreshold - } - return 0 -} - -func (x *BattleColliderInfo) GetJumpingInitVelY() int32 { - if x != nil { - return x.JumpingInitVelY - } - return 0 -} - -func (x *BattleColliderInfo) GetGravityX() int32 { - if x != nil { - return x.GravityX - } - return 0 -} - -func (x *BattleColliderInfo) GetGravityY() int32 { - if x != nil { - return x.GravityY + return x.SpaceOffsetY } return 0 } @@ -1210,13 +1105,13 @@ type RoomDownsyncFrame struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` - PlayersArr []*PlayerDownsync `protobuf:"bytes,2,rep,name=playersArr,proto3" json:"playersArr,omitempty"` - CountdownNanos int64 `protobuf:"varint,3,opt,name=countdownNanos,proto3" json:"countdownNanos,omitempty"` - MeleeBullets []*MeleeBullet `protobuf:"bytes,4,rep,name=meleeBullets,proto3" json:"meleeBullets,omitempty"` // I don't know how to mimic inheritance/composition in protobuf by far, thus using an array for each type of bullet as a compromise - BackendUnconfirmedMask uint64 `protobuf:"varint,5,opt,name=backendUnconfirmedMask,proto3" json:"backendUnconfirmedMask,omitempty"` // Indexed by "joinIndex", same compression concern as stated in InputFrameDownsync - ShouldForceResync bool `protobuf:"varint,6,opt,name=shouldForceResync,proto3" json:"shouldForceResync,omitempty"` - PlayerOpPatternToSkillId map[int32]int32 `protobuf:"bytes,7,rep,name=playerOpPatternToSkillId,proto3" json:"playerOpPatternToSkillId,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` + Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + PlayersArr []*PlayerDownsync `protobuf:"bytes,2,rep,name=playersArr,proto3" json:"playersArr,omitempty"` + CountdownNanos int64 `protobuf:"varint,3,opt,name=countdownNanos,proto3" json:"countdownNanos,omitempty"` + MeleeBullets []*MeleeBullet `protobuf:"bytes,4,rep,name=meleeBullets,proto3" json:"meleeBullets,omitempty"` // I don't know how to mimic inheritance/composition in protobuf by far, thus using an array for each type of bullet as a compromise + BackendUnconfirmedMask uint64 `protobuf:"varint,5,opt,name=backendUnconfirmedMask,proto3" json:"backendUnconfirmedMask,omitempty"` // Indexed by "joinIndex", same compression concern as stated in InputFrameDownsync + ShouldForceResync bool `protobuf:"varint,6,opt,name=shouldForceResync,proto3" json:"shouldForceResync,omitempty"` + SpeciesIdList []int32 `protobuf:"varint,7,rep,packed,name=speciesIdList,proto3" json:"speciesIdList,omitempty"` } func (x *RoomDownsyncFrame) Reset() { @@ -1293,9 +1188,9 @@ func (x *RoomDownsyncFrame) GetShouldForceResync() bool { return false } -func (x *RoomDownsyncFrame) GetPlayerOpPatternToSkillId() map[int32]int32 { +func (x *RoomDownsyncFrame) GetSpeciesIdList() []int32 { if x != nil { - return x.PlayerOpPatternToSkillId + return x.SpeciesIdList } return nil } @@ -1306,7 +1201,7 @@ var file_room_downsync_frame_proto_rawDesc = []byte{ 0x0a, 0x19, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x1a, 0x0e, 0x67, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x22, 0xf0, 0x04, 0x0a, 0x0e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x44, 0x6f, + 0x6f, 0x74, 0x6f, 0x22, 0x97, 0x06, 0x0a, 0x0e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x58, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x76, 0x69, @@ -1324,7 +1219,7 @@ var file_room_downsync_frame_proto_rawDesc = []byte{ 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, - 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0e, 0x63, 0x6f, + 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, @@ -1340,258 +1235,209 @@ var file_room_downsync_frame_proto_rawDesc = []byte{ 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x41, 0x69, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x05, 0x69, 0x6e, 0x41, 0x69, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x22, 0x6f, 0x0a, 0x11, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x64, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x64, 0x78, 0x12, 0x0e, 0x0a, 0x02, 0x64, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x64, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x62, - 0x74, 0x6e, 0x41, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, - 0x62, 0x74, 0x6e, 0x41, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x62, 0x74, 0x6e, - 0x42, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x62, 0x74, - 0x6e, 0x42, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x50, 0x0a, 0x10, 0x49, 0x6e, 0x70, 0x75, 0x74, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x69, - 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, - 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x22, 0x7c, 0x0a, 0x12, 0x49, 0x6e, 0x70, - 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x12, - 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x4c, 0x69, 0x73, 0x74, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x04, 0x52, 0x09, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x4c, 0x69, 0x73, - 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4c, 0x69, - 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, - 0x6d, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0f, 0x48, 0x65, 0x61, 0x72, 0x74, - 0x62, 0x65, 0x61, 0x74, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x22, 0xb8, 0x02, 0x0a, 0x05, 0x57, 0x73, 0x52, 0x65, 0x71, 0x12, 0x14, - 0x0a, 0x05, 0x6d, 0x73, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, - 0x73, 0x67, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x61, - 0x63, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, - 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x12, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x12, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x4e, 0x0a, 0x15, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x18, - 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x52, + 0x08, 0x52, 0x05, 0x69, 0x6e, 0x41, 0x69, 0x72, 0x12, 0x28, 0x0a, 0x0f, 0x66, 0x72, 0x61, 0x6d, + 0x65, 0x73, 0x49, 0x6e, 0x43, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x49, 0x6e, 0x43, 0x68, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6b, 0x69, 0x6c, + 0x6c, 0x49, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x53, 0x6b, 0x69, 0x6c, 0x6c, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x53, 0x6b, 0x69, 0x6c, 0x6c, 0x48, 0x69, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x6b, 0x69, 0x6c, 0x6c, 0x48, 0x69, 0x74, + 0x12, 0x2a, 0x0a, 0x10, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x49, 0x6e, 0x76, 0x69, 0x6e, 0x73, + 0x69, 0x62, 0x6c, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x66, 0x72, 0x61, 0x6d, + 0x65, 0x73, 0x49, 0x6e, 0x76, 0x69, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x13, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0xe5, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0xe6, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x18, 0xe7, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x22, 0x6f, 0x0a, + 0x11, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x63, 0x6f, 0x64, + 0x65, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x64, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, + 0x64, 0x78, 0x12, 0x0e, 0x0a, 0x02, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, + 0x64, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x62, 0x74, 0x6e, 0x41, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x62, 0x74, 0x6e, 0x41, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x12, 0x1c, 0x0a, 0x09, 0x62, 0x74, 0x6e, 0x42, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x09, 0x62, 0x74, 0x6e, 0x42, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x50, + 0x0a, 0x10, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, + 0x6e, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, + 0x22, 0x7c, 0x0a, 0x12, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, + 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x04, 0x52, 0x09, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x3b, + 0x0a, 0x0f, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x55, 0x70, 0x73, 0x79, 0x6e, + 0x63, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xb8, 0x02, 0x0a, 0x05, + 0x57, 0x73, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x73, 0x67, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x73, 0x67, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, + 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, + 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x61, 0x63, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6a, 0x6f, 0x69, + 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6a, 0x6f, + 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x63, 0x6b, 0x69, 0x6e, + 0x67, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, + 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x2e, 0x0a, + 0x12, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x61, 0x63, 0x6b, 0x69, 0x6e, + 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x4e, 0x0a, 0x15, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, - 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x27, 0x0a, 0x02, 0x68, 0x62, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x48, 0x65, 0x61, 0x72, - 0x74, 0x62, 0x65, 0x61, 0x74, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x02, 0x68, 0x62, 0x22, - 0x89, 0x02, 0x0a, 0x06, 0x57, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x72, 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0b, - 0x65, 0x63, 0x68, 0x6f, 0x65, 0x64, 0x4d, 0x73, 0x67, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0b, 0x65, 0x63, 0x68, 0x6f, 0x65, 0x64, 0x4d, 0x73, 0x67, 0x49, 0x64, 0x12, 0x10, - 0x0a, 0x03, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x61, 0x63, 0x74, - 0x12, 0x2b, 0x0a, 0x03, 0x72, 0x64, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x44, 0x6f, 0x77, 0x6e, 0x73, - 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x03, 0x72, 0x64, 0x66, 0x12, 0x54, 0x0a, - 0x17, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, - 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x17, 0x69, 0x6e, 0x70, 0x75, - 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, - 0x74, 0x63, 0x68, 0x12, 0x36, 0x0a, 0x08, 0x62, 0x63, 0x69, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x42, - 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x08, 0x62, 0x63, 0x69, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x22, 0xf4, 0x01, 0x0a, 0x14, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x72, 0x65, 0x66, 0x52, 0x65, 0x6e, 0x64, 0x65, - 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, - 0x72, 0x65, 0x66, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, - 0x12, 0x28, 0x0a, 0x0f, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4d, - 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x75, 0x6e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x12, 0x58, 0x0a, 0x19, 0x74, 0x6f, - 0x53, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, - 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x19, 0x74, 0x6f, 0x53, 0x65, 0x6e, - 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, - 0x79, 0x6e, 0x63, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x46, 0x6f, - 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x11, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x79, - 0x6e, 0x63, 0x22, 0x95, 0x06, 0x0a, 0x0b, 0x4d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, - 0x65, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x4c, 0x6f, 0x63, 0x61, - 0x6c, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x62, 0x61, 0x74, 0x74, 0x6c, - 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x22, - 0x0a, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, - 0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, - 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x72, 0x65, - 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x72, 0x65, 0x63, 0x6f, 0x76, - 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x12, 0x30, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x73, 0x4f, 0x6e, 0x48, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x72, - 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x48, - 0x69, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, - 0x65, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, - 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x38, 0x0a, 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, - 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, - 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, - 0x74, 0x65, 0x64, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, - 0x12, 0x24, 0x0a, 0x0d, 0x68, 0x69, 0x74, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x68, 0x69, 0x74, 0x53, 0x74, 0x75, 0x6e, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, - 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, - 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x75, 0x73, 0x68, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x08, 0x70, 0x75, 0x73, 0x68, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x2e, 0x0a, 0x12, - 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x54, 0x79, - 0x70, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, - 0x65, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x64, 0x61, - 0x6d, 0x61, 0x67, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, - 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x11, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x12, 0x2a, 0x0a, 0x10, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x50, 0x6c, - 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6f, 0x66, - 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0x12, 0x20, - 0x0a, 0x0b, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x58, 0x18, 0x10, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x0b, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x58, - 0x12, 0x20, 0x0a, 0x0b, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x59, 0x18, - 0x11, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x53, 0x69, 0x7a, - 0x65, 0x59, 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x65, 0x6c, 0x66, 0x4d, 0x6f, 0x76, 0x65, 0x66, 0x6f, - 0x72, 0x77, 0x61, 0x72, 0x64, 0x58, 0x18, 0x12, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x73, 0x65, - 0x6c, 0x66, 0x4d, 0x6f, 0x76, 0x65, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x58, 0x12, 0x2a, - 0x0a, 0x10, 0x73, 0x65, 0x6c, 0x66, 0x4d, 0x6f, 0x76, 0x65, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, - 0x64, 0x59, 0x18, 0x13, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x73, 0x65, 0x6c, 0x66, 0x4d, 0x6f, - 0x76, 0x65, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x59, 0x22, 0x8d, 0x0b, 0x0a, 0x12, 0x42, - 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x26, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x67, 0x65, 0x44, 0x69, 0x73, 0x63, 0x72, 0x65, 0x74, 0x65, - 0x57, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x67, 0x65, 0x44, 0x69, - 0x73, 0x63, 0x72, 0x65, 0x74, 0x65, 0x57, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x67, 0x65, - 0x44, 0x69, 0x73, 0x63, 0x72, 0x65, 0x74, 0x65, 0x48, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0e, 0x73, 0x74, 0x61, 0x67, 0x65, 0x44, 0x69, 0x73, 0x63, 0x72, 0x65, 0x74, 0x65, 0x48, 0x12, - 0x1e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x57, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x57, 0x12, - 0x1e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x48, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x48, 0x12, - 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x54, 0x6f, 0x50, 0x69, 0x6e, - 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, - 0x6c, 0x54, 0x6f, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x34, 0x0a, 0x15, 0x77, 0x69, 0x6c, 0x6c, 0x4b, - 0x69, 0x63, 0x6b, 0x49, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x6f, 0x72, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x77, 0x69, 0x6c, 0x6c, 0x4b, 0x69, 0x63, 0x6b, - 0x49, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x6f, 0x72, 0x12, 0x20, 0x0a, - 0x0b, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0b, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, - 0x32, 0x0a, 0x14, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x62, - 0x61, 0x74, 0x74, 0x6c, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x44, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x13, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x46, - 0x70, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x46, 0x70, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x44, 0x65, 0x6c, 0x61, - 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x69, - 0x6e, 0x70, 0x75, 0x74, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, - 0x2a, 0x0a, 0x10, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x69, 0x6e, 0x70, 0x75, 0x74, - 0x53, 0x63, 0x61, 0x6c, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x6e, - 0x73, 0x74, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x73, 0x74, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x1e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x54, 0x6f, 0x6c, 0x65, - 0x72, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1e, 0x69, 0x6e, 0x70, - 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x44, 0x65, 0x6c, - 0x61, 0x79, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x48, 0x0a, 0x1f, 0x6d, - 0x61, 0x78, 0x43, 0x68, 0x61, 0x73, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x73, 0x50, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x1f, 0x6d, 0x61, 0x78, 0x43, 0x68, 0x61, 0x73, 0x69, 0x6e, 0x67, - 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x50, 0x65, 0x72, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x42, - 0x61, 0x74, 0x74, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x11, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x3c, 0x0a, 0x19, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x45, - 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, - 0x18, 0x12, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, + 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x15, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x27, 0x0a, + 0x02, 0x68, 0x62, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x73, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x55, 0x70, 0x73, 0x79, + 0x6e, 0x63, 0x52, 0x02, 0x68, 0x62, 0x22, 0x89, 0x02, 0x0a, 0x06, 0x57, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, + 0x72, 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x63, 0x68, 0x6f, 0x65, 0x64, 0x4d, 0x73, 0x67, + 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x65, 0x63, 0x68, 0x6f, 0x65, 0x64, + 0x4d, 0x73, 0x67, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x03, 0x61, 0x63, 0x74, 0x12, 0x2b, 0x0a, 0x03, 0x72, 0x64, 0x66, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, 0x6f, + 0x6f, 0x6d, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, + 0x03, 0x72, 0x64, 0x66, 0x12, 0x54, 0x0a, 0x17, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, + 0x63, 0x52, 0x17, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, + 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x36, 0x0a, 0x08, 0x62, 0x63, + 0x69, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, + 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x62, 0x63, 0x69, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x22, 0xf4, 0x01, 0x0a, 0x14, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x42, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x72, + 0x65, 0x66, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x72, 0x65, 0x66, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x75, 0x6e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0f, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4d, 0x61, 0x73, + 0x6b, 0x12, 0x58, 0x0a, 0x19, 0x74, 0x6f, 0x53, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, + 0x52, 0x19, 0x74, 0x6f, 0x53, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x73, + 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x46, 0x6f, + 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x22, 0xbf, 0x05, 0x0a, 0x0b, 0x4d, 0x65, + 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x38, 0x0a, 0x17, 0x6f, 0x72, 0x69, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x17, 0x6f, 0x72, 0x69, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x11, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4a, + 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, + 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, + 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x63, 0x61, 0x6e, 0x63, 0x65, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x12, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x63, 0x61, 0x6e, 0x63, 0x65, + 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x64, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x12, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x45, 0x64, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x68, + 0x69, 0x74, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0d, 0x68, 0x69, 0x74, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x70, + 0x75, 0x73, 0x68, 0x62, 0x61, 0x63, 0x6b, 0x56, 0x65, 0x6c, 0x58, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x62, 0x61, 0x63, 0x6b, 0x56, 0x65, 0x6c, 0x58, 0x12, + 0x22, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x62, 0x61, 0x63, 0x6b, 0x56, 0x65, 0x6c, 0x59, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x62, 0x61, 0x63, 0x6b, 0x56, + 0x65, 0x6c, 0x59, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x06, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x73, + 0x65, 0x6c, 0x66, 0x4c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x6c, 0x58, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0c, 0x73, 0x65, 0x6c, 0x66, 0x4c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x6c, 0x58, 0x12, + 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x6c, 0x66, 0x4c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x6c, 0x59, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x73, 0x65, 0x6c, 0x66, 0x4c, 0x6f, 0x63, 0x6b, 0x56, + 0x65, 0x6c, 0x59, 0x12, 0x24, 0x0a, 0x0d, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x58, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x68, 0x69, 0x74, 0x62, + 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x58, 0x12, 0x24, 0x0a, 0x0d, 0x68, 0x69, 0x74, + 0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x59, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0d, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x59, 0x12, + 0x20, 0x0a, 0x0b, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x58, 0x18, 0x10, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x53, 0x69, 0x7a, 0x65, + 0x58, 0x12, 0x20, 0x0a, 0x0b, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x59, + 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x53, 0x69, + 0x7a, 0x65, 0x59, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x62, 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x22, 0xc9, 0x05, 0x0a, 0x12, + 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x54, 0x6f, 0x50, 0x69, + 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, + 0x61, 0x6c, 0x54, 0x6f, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x34, 0x0a, 0x15, 0x77, 0x69, 0x6c, 0x6c, + 0x4b, 0x69, 0x63, 0x6b, 0x49, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x6f, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x77, 0x69, 0x6c, 0x6c, 0x4b, 0x69, 0x63, + 0x6b, 0x49, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x6f, 0x72, 0x12, 0x20, + 0x0a, 0x0b, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0b, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x64, + 0x12, 0x30, 0x0a, 0x13, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x62, + 0x61, 0x74, 0x74, 0x6c, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6e, + 0x6f, 0x73, 0x12, 0x46, 0x0a, 0x1e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x54, 0x6f, 0x6c, 0x65, 0x72, + 0x61, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1e, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x44, 0x65, 0x6c, 0x61, + 0x79, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x48, 0x0a, 0x1f, 0x6d, 0x61, + 0x78, 0x43, 0x68, 0x61, 0x73, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x73, 0x50, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x1f, 0x6d, 0x61, 0x78, 0x43, 0x68, 0x61, 0x73, 0x69, 0x6e, 0x67, 0x52, + 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x50, 0x65, 0x72, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x12, 0x3c, 0x0a, 0x19, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, - 0x73, 0x12, 0x3a, 0x0a, 0x18, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x45, 0x73, 0x74, - 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x18, 0x13, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x18, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x45, 0x73, 0x74, - 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x12, 0x38, 0x0a, - 0x17, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x54, 0x6f, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, - 0x72, 0x69, 0x64, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x14, 0x20, 0x01, 0x28, 0x01, 0x52, 0x17, - 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x54, 0x6f, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, - 0x69, 0x64, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x38, 0x0a, 0x17, 0x76, 0x69, 0x72, 0x74, 0x75, - 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x54, 0x6f, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x52, 0x61, 0x74, - 0x69, 0x6f, 0x18, 0x15, 0x20, 0x01, 0x28, 0x01, 0x52, 0x17, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, - 0x6c, 0x47, 0x72, 0x69, 0x64, 0x54, 0x6f, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x52, 0x61, 0x74, 0x69, - 0x6f, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x70, 0x41, 0x74, 0x6b, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x73, 0x70, - 0x41, 0x74, 0x6b, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, - 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, - 0x7a, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, - 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x38, 0x0a, 0x17, 0x73, 0x6e, 0x61, - 0x70, 0x49, 0x6e, 0x74, 0x6f, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x4f, 0x76, 0x65, - 0x72, 0x6c, 0x61, 0x70, 0x18, 0x18, 0x20, 0x01, 0x28, 0x01, 0x52, 0x17, 0x73, 0x6e, 0x61, 0x70, - 0x49, 0x6e, 0x74, 0x6f, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x4f, 0x76, 0x65, 0x72, - 0x6c, 0x61, 0x70, 0x12, 0x3c, 0x0a, 0x19, 0x73, 0x6e, 0x61, 0x70, 0x49, 0x6e, 0x74, 0x6f, 0x50, - 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, - 0x18, 0x19, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x73, 0x6e, 0x61, 0x70, 0x49, 0x6e, 0x74, 0x6f, - 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, - 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x6a, 0x75, 0x6d, 0x70, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x69, 0x74, - 0x56, 0x65, 0x6c, 0x59, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x6a, 0x75, 0x6d, 0x70, - 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x69, 0x74, 0x56, 0x65, 0x6c, 0x59, 0x12, 0x1a, 0x0a, 0x08, 0x67, - 0x72, 0x61, 0x76, 0x69, 0x74, 0x79, 0x58, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x67, - 0x72, 0x61, 0x76, 0x69, 0x74, 0x79, 0x58, 0x12, 0x1a, 0x0a, 0x08, 0x67, 0x72, 0x61, 0x76, 0x69, - 0x74, 0x79, 0x59, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x67, 0x72, 0x61, 0x76, 0x69, - 0x74, 0x79, 0x59, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x6f, 0x6c, 0x6c, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x4d, 0x69, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x63, - 0x6f, 0x6c, 0x6c, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x69, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x12, - 0x39, 0x0a, 0x17, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x61, 0x74, 0x61, 0x4c, 0x6f, 0x67, 0x67, - 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0xe7, 0x07, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x17, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x61, 0x74, 0x61, 0x4c, 0x6f, 0x67, 0x67, - 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0xe4, 0x03, 0x0a, 0x11, 0x52, - 0x6f, 0x6f, 0x6d, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x36, 0x0a, 0x0a, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x41, 0x72, 0x72, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x50, 0x6c, - 0x61, 0x79, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x0a, 0x70, 0x6c, - 0x61, 0x79, 0x65, 0x72, 0x73, 0x41, 0x72, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, - 0x12, 0x37, 0x0a, 0x0c, 0x6d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, - 0x4d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x0c, 0x6d, 0x65, 0x6c, - 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x36, 0x0a, 0x16, 0x62, 0x61, 0x63, - 0x6b, 0x65, 0x6e, 0x64, 0x55, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4d, - 0x61, 0x73, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x16, 0x62, 0x61, 0x63, 0x6b, 0x65, - 0x6e, 0x64, 0x55, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4d, 0x61, 0x73, - 0x6b, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x46, 0x6f, 0x72, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x73, 0x68, - 0x6f, 0x75, 0x6c, 0x64, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x12, - 0x73, 0x0a, 0x18, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4f, 0x70, 0x50, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x54, 0x6f, 0x53, 0x6b, 0x69, 0x6c, 0x6c, 0x49, 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x37, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x44, - 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x2e, 0x50, 0x6c, 0x61, - 0x79, 0x65, 0x72, 0x4f, 0x70, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x54, 0x6f, 0x53, 0x6b, - 0x69, 0x6c, 0x6c, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x18, 0x70, 0x6c, 0x61, 0x79, - 0x65, 0x72, 0x4f, 0x70, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x54, 0x6f, 0x53, 0x6b, 0x69, - 0x6c, 0x6c, 0x49, 0x64, 0x1a, 0x4b, 0x0a, 0x1d, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4f, 0x70, - 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x54, 0x6f, 0x53, 0x6b, 0x69, 0x6c, 0x6c, 0x49, 0x64, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x42, 0x13, 0x5a, 0x11, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x73, 0x72, 0x76, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, + 0x6b, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4d, 0x69, 0x6c, 0x6c, + 0x69, 0x73, 0x12, 0x3a, 0x0a, 0x18, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x45, 0x73, + 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x45, 0x73, + 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x12, 0x28, + 0x0a, 0x0f, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, + 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x58, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x58, 0x12, 0x22, 0x0a, 0x0c, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x59, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x0c, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x59, + 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x6f, 0x6c, 0x6c, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x69, 0x6e, + 0x53, 0x74, 0x65, 0x70, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x63, 0x6f, 0x6c, 0x6c, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x69, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x12, 0x39, 0x0a, 0x17, + 0x66, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x61, 0x74, 0x61, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, + 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0xe7, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, + 0x66, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x61, 0x74, 0x61, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, + 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0xc8, 0x02, 0x0a, 0x11, 0x52, 0x6f, 0x6f, 0x6d, + 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x36, 0x0a, + 0x0a, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x41, 0x72, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x65, + 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x0a, 0x70, 0x6c, 0x61, 0x79, 0x65, + 0x72, 0x73, 0x41, 0x72, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x64, 0x6f, + 0x77, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x12, 0x37, 0x0a, + 0x0c, 0x6d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4d, 0x65, 0x6c, + 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x0c, 0x6d, 0x65, 0x6c, 0x65, 0x65, 0x42, + 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x36, 0x0a, 0x16, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x55, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4d, 0x61, 0x73, 0x6b, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x16, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x55, + 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x12, 0x2c, + 0x0a, 0x11, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, + 0x79, 0x6e, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x73, 0x68, 0x6f, 0x75, 0x6c, + 0x64, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x24, 0x0a, 0x0d, + 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x49, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x05, 0x52, 0x0d, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x49, 0x64, 0x4c, 0x69, + 0x73, 0x74, 0x42, 0x13, 0x5a, 0x11, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x73, 0x72, 0x76, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1606,7 +1452,7 @@ func file_room_downsync_frame_proto_rawDescGZIP() []byte { return file_room_downsync_frame_proto_rawDescData } -var file_room_downsync_frame_proto_msgTypes = make([]protoimpl.MessageInfo, 12) +var file_room_downsync_frame_proto_msgTypes = make([]protoimpl.MessageInfo, 11) var file_room_downsync_frame_proto_goTypes = []interface{}{ (*PlayerDownsync)(nil), // 0: protos.PlayerDownsync (*InputFrameDecoded)(nil), // 1: protos.InputFrameDecoded @@ -1619,7 +1465,6 @@ var file_room_downsync_frame_proto_goTypes = []interface{}{ (*MeleeBullet)(nil), // 8: protos.MeleeBullet (*BattleColliderInfo)(nil), // 9: protos.BattleColliderInfo (*RoomDownsyncFrame)(nil), // 10: protos.RoomDownsyncFrame - nil, // 11: protos.RoomDownsyncFrame.PlayerOpPatternToSkillIdEntry } var file_room_downsync_frame_proto_depIdxs = []int32{ 2, // 0: protos.WsReq.inputFrameUpsyncBatch:type_name -> protos.InputFrameUpsync @@ -1630,12 +1475,11 @@ var file_room_downsync_frame_proto_depIdxs = []int32{ 3, // 5: protos.InputsBufferSnapshot.toSendInputFrameDownsyncs:type_name -> protos.InputFrameDownsync 0, // 6: protos.RoomDownsyncFrame.playersArr:type_name -> protos.PlayerDownsync 8, // 7: protos.RoomDownsyncFrame.meleeBullets:type_name -> protos.MeleeBullet - 11, // 8: protos.RoomDownsyncFrame.playerOpPatternToSkillId:type_name -> protos.RoomDownsyncFrame.PlayerOpPatternToSkillIdEntry - 9, // [9:9] is the sub-list for method output_type - 9, // [9:9] is the sub-list for method input_type - 9, // [9:9] is the sub-list for extension type_name - 9, // [9:9] is the sub-list for extension extendee - 0, // [0:9] is the sub-list for field type_name + 8, // [8:8] is the sub-list for method output_type + 8, // [8:8] is the sub-list for method input_type + 8, // [8:8] is the sub-list for extension type_name + 8, // [8:8] is the sub-list for extension extendee + 0, // [0:8] is the sub-list for field type_name } func init() { file_room_downsync_frame_proto_init() } @@ -1783,7 +1627,7 @@ func file_room_downsync_frame_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_room_downsync_frame_proto_rawDesc, NumEnums: 0, - NumMessages: 12, + NumMessages: 11, NumExtensions: 0, NumServices: 0, }, diff --git a/battle_srv/ws/serve.go b/battle_srv/ws/serve.go index b6f6215..a98f52c 100644 --- a/battle_srv/ws/serve.go +++ b/battle_srv/ws/serve.go @@ -240,37 +240,23 @@ func Serve(c *gin.Context) { // Construct "battleColliderInfo" to downsync bciFrame := &pb.BattleColliderInfo{ - BoundRoomId: pRoom.Id, - StageName: pRoom.StageName, - StageDiscreteW: pRoom.StageDiscreteW, - StageDiscreteH: pRoom.StageDiscreteH, - StageTileW: pRoom.StageTileW, - StageTileH: pRoom.StageTileH, + BoundRoomId: pRoom.Id, + StageName: pRoom.StageName, + + IntervalToPing: int32(Constants.Ws.IntervalToPing), + WillKickIfInactiveFor: int32(Constants.Ws.WillKickIfInactiveFor), + BattleDurationNanos: pRoom.BattleDurationNanos, - IntervalToPing: int32(Constants.Ws.IntervalToPing), - WillKickIfInactiveFor: int32(Constants.Ws.WillKickIfInactiveFor), - BattleDurationNanos: pRoom.BattleDurationNanos, - ServerFps: pRoom.ServerFps, - InputDelayFrames: pRoom.InputDelayFrames, - InputScaleFrames: pRoom.InputScaleFrames, - NstDelayFrames: pRoom.NstDelayFrames, InputFrameUpsyncDelayTolerance: pRoom.InputFrameUpsyncDelayTolerance, MaxChasingRenderFramesPerUpdate: pRoom.MaxChasingRenderFramesPerUpdate, - PlayerBattleState: pThePlayer.BattleState, // For frontend to know whether it's rejoining RollbackEstimatedDtMillis: pRoom.RollbackEstimatedDtMillis, RollbackEstimatedDtNanos: pRoom.RollbackEstimatedDtNanos, - WorldToVirtualGridRatio: pRoom.WorldToVirtualGridRatio, - VirtualGridToWorldRatio: pRoom.VirtualGridToWorldRatio, + SpaceOffsetX: pRoom.SpaceOffsetX, + SpaceOffsetY: pRoom.SpaceOffsetY, - SpAtkLookupFrames: pRoom.SpAtkLookupFrames, - RenderCacheSize: pRoom.RenderCacheSize, - SnapIntoPlatformOverlap: pRoom.SnapIntoPlatformOverlap, - SnapIntoPlatformThreshold: pRoom.SnapIntoPlatformThreshold, - JumpingInitVelY: pRoom.JumpingInitVelY, - GravityX: pRoom.GravityX, - GravityY: pRoom.GravityY, - CollisionMinStep: pRoom.CollisionMinStep, + RenderCacheSize: pRoom.RenderCacheSize, + CollisionMinStep: pRoom.CollisionMinStep, FrameDataLoggingEnabled: pRoom.FrameDataLoggingEnabled, } diff --git a/charts/README.md b/charts/README.md index cd6fc7d..43276b3 100644 --- a/charts/README.md +++ b/charts/README.md @@ -14,3 +14,15 @@ ffmpeg -vsync vfr -i input.gif output%d.png ``` The `-vsync vfr` tells ffmpeg to disrespect the original delays set within the GIF file, otherwise many duplicate frame will be extracted by the default 60FPS. + +More complicated transparent padding example (used when alignment in image source is much more preferred than aligning in codes) +``` +ffmpeg -vsync vfr -i LayDown1.gif -vf "scale=iw:188:force_original_aspect_ratio=decrease,pad=iw:188:0:(oh-ih):color=#00000000,format=rgba" pngs/LayDown1_%d.png +``` + +The command above uses same input-output width, but pads the output height with a top transparent section such that the output height is fixed to 188px. + +Similarly to crop a gif into pngs. +``` +ffmpeg -vsync vfr -i Idle1.gif -vf "crop=70:ih:(iw-ow-10):0" pngs/Idle1_%d.png +``` diff --git a/collider_visualizer/README.md b/collider_visualizer/README.md new file mode 100644 index 0000000..bdb3a91 --- /dev/null +++ b/collider_visualizer/README.md @@ -0,0 +1 @@ +This module is no longer useful, as we can now use GopherJs+OfflineMap to visualize experimental game dynamics. diff --git a/frontend/assets/plugin_scripts/jsexport.js b/frontend/assets/plugin_scripts/jsexport.js index 5b4e520..8b7380f 100644 --- a/frontend/assets/plugin_scripts/jsexport.js +++ b/frontend/assets/plugin_scripts/jsexport.js @@ -9,8 +9,8 @@ $packages["runtime"]=(function(){var $pkg={},$init,A,C,D,AT,AZ,BD,AM,E,AU;A=$pac $packages["math/bits"]=(function(){var $pkg={},$init;$init=function(){$pkg.$init=function(){};var $f,$c=false,$s=0,$r;if(this!==undefined&&this.$blk!==undefined){$f=this;$c=true;$s=$f.$s;$r=$f.$r;}s:while(true){switch($s){case 0:}return;}if($f===undefined){$f={$blk:$init};}$f.$s=$s;$f.$r=$r;return $f;};$pkg.$init=$init;return $pkg;})(); $packages["math"]=(function(){var $pkg={},$init,B,A,IT,IU,IV,IW,FL,FM,FN,FO,FP,HH,EX,EY,FK,GA,GH,GK,GL,GM,GS,GT,GW,GX,GZ,HA,HD,HI,HL,HM;B=$packages["github.com/gopherjs/gopherjs/js"];A=$packages["math/bits"];IT=$arrayType($Uint32,2);IU=$arrayType($Float32,2);IV=$arrayType($Float64,1);IW=$structType("math",[{prop:"uint32array",name:"uint32array",embedded:false,exported:false,typ:IT,tag:""},{prop:"float32array",name:"float32array",embedded:false,exported:false,typ:IU,tag:""},{prop:"float64array",name:"float64array",embedded:false,exported:false,typ:IV,tag:""}]);EX=function(av,aw){var av,aw;if(GL(av,1)||GL(aw,1)){return GK(1);}else if(GM(av)||GM(aw)){return GW();}else if((av===0)&&(av===aw)){if(GZ(av)){return aw;}return av;}if(av>aw){return av;}return aw;};EY=function(av,aw){var av,aw;if(GL(av,-1)||GL(aw,-1)){return GK(-1);}else if(GM(av)||GM(aw)){return GW();}else if((av===0)&&(av===aw)){if(GZ(av)){return av;}return aw;}if(av>>0)));};$pkg.Abs=FK;GA=function(av){var av;return $parseFloat(FL.cos(av));};$pkg.Cos=GA;GH=function(av){var av;return $parseFloat(FL.floor(av));};$pkg.Floor=GH;GK=function(av){var av;if(av>=0){return FN;}else{return FO;}};$pkg.Inf=GK;GL=function(av,aw){var av,aw;if(av===FN){return aw>=0;}if(av===FO){return aw<=0;}return false;};$pkg.IsInf=GL;GM=function(av){var av,aw;aw=false;aw=!((av===av));return aw;};$pkg.IsNaN=GM;GS=function(av,aw){var av,aw;return EX(av,aw);};$pkg.Max=GS;GT=function(av,aw){var av,aw;return EY(av,aw);};$pkg.Min=GT;GW=function(){return FP;};$pkg.NaN=GW;GX=function(av,aw){var av,aw;if((av===1)||((av===-1)&&((aw===FN)||(aw===FO)))){return 1;}return $parseFloat(FL.pow(av,aw));};$pkg.Pow=GX;GZ=function(av){var av;return av<0||(1/av===FO);};$pkg.Signbit=GZ;HA=function(av){var av;return $parseFloat(FL.sin(av));};$pkg.Sin=HA;HD=function(av){var av;return $parseFloat(FL.sqrt(av));};$pkg.Sqrt=HD;HI=function(){var av;av=new($global.ArrayBuffer)(8);HH.uint32array=new($global.Uint32Array)(av);HH.float32array=new($global.Float32Array)(av);HH.float64array=new($global.Float64Array)(av);};HL=function(av){var av,aw,ax;HH.float64array[0]=av;return(aw=$shiftLeft64((new $Uint64(0,HH.uint32array[1])),32),ax=(new $Uint64(0,HH.uint32array[0])),new $Uint64(aw.$high+ax.$high,aw.$low+ax.$low));};$pkg.Float64bits=HL;HM=function(av){var av;HH.uint32array[0]=((av.$low>>>0));HH.uint32array[1]=(($shiftRightUint64(av,32).$low>>>0));return HH.float64array[0];};$pkg.Float64frombits=HM;$init=function(){$pkg.$init=function(){};var $f,$c=false,$s=0,$r;if(this!==undefined&&this.$blk!==undefined){$f=this;$c=true;$s=$f.$s;$r=$f.$r;}s:while(true){switch($s){case 0:$r=B.$init();$s=1;case 1:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}$r=A.$init();$s=2;case 2:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}HH=new IW.ptr(IT.zero(),IU.zero(),IV.zero());FL=$global.Math;FM=0;FN=1/FM;FO=-1/FM;FP=$parseFloat($NaN);HI();}return;}if($f===undefined){$f={$blk:$init};}$f.$s=$s;$f.$r=$r;return $f;};$pkg.$init=$init;return $pkg;})(); $packages["resolv"]=(function(){var $pkg={},$init,A,B,C,N,P,Q,S,U,X,Z,AA,AE,AG,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR,AS,AT,AU,AV,AW,AX,AY,K,O,R,T,V,W,Y,AB,AC,AD,AF,AH;A=$packages["math"];B=$pkg.Vector=$newType(12,$kindSlice,"resolv.Vector",true,"resolv",true,null);C=$pkg.Axis=$newType(4,$kindInt,"resolv.Axis",true,"resolv",true,null);N=$pkg.Space=$newType(0,$kindStruct,"resolv.Space",true,"resolv",true,function(Cells_,CellWidth_,CellHeight_){this.$val=this;if(arguments.length===0){this.Cells=AL.nil;this.CellWidth=0;this.CellHeight=0;return;}this.Cells=Cells_;this.CellWidth=CellWidth_;this.CellHeight=CellHeight_;});P=$pkg.Shape=$newType(8,$kindInterface,"resolv.Shape",true,"resolv",true,null);Q=$pkg.Line=$newType(0,$kindStruct,"resolv.Line",true,"resolv",true,function(Start_,End_){this.$val=this;if(arguments.length===0){this.Start=B.nil;this.End=B.nil;return;}this.Start=Start_;this.End=End_;});S=$pkg.ConvexPolygon=$newType(0,$kindStruct,"resolv.ConvexPolygon",true,"resolv",true,function(Points_,X_,Y_,Closed_){this.$val=this;if(arguments.length===0){this.Points=AP.nil;this.X=0;this.Y=0;this.Closed=false;return;}this.Points=Points_;this.X=X_;this.Y=Y_;this.Closed=Closed_;});U=$pkg.ContactSet=$newType(0,$kindStruct,"resolv.ContactSet",true,"resolv",true,function(Points_,MTV_,Center_){this.$val=this;if(arguments.length===0){this.Points=AP.nil;this.MTV=B.nil;this.Center=B.nil;return;}this.Points=Points_;this.MTV=MTV_;this.Center=Center_;});X=$pkg.Circle=$newType(0,$kindStruct,"resolv.Circle",true,"resolv",true,function(X_,Y_,Radius_){this.$val=this;if(arguments.length===0){this.X=0;this.Y=0;this.Radius=0;return;}this.X=X_;this.Y=Y_;this.Radius=Radius_;});Z=$pkg.Projection=$newType(0,$kindStruct,"resolv.Projection",true,"resolv",true,function(Min_,Max_){this.$val=this;if(arguments.length===0){this.Min=0;this.Max=0;return;}this.Min=Min_;this.Max=Max_;});AA=$pkg.Object=$newType(0,$kindStruct,"resolv.Object",true,"resolv",true,function(Shape_,Space_,X_,Y_,W_,H_,TouchingCells_,Data_,ignoreList_,tags_){this.$val=this;if(arguments.length===0){this.Shape=$ifaceNil;this.Space=AM.nil;this.X=0;this.Y=0;this.W=0;this.H=0;this.TouchingCells=AK.nil;this.Data=$ifaceNil;this.ignoreList=false;this.tags=AV.nil;return;}this.Shape=Shape_;this.Space=Space_;this.X=X_;this.Y=Y_;this.W=W_;this.H=H_;this.TouchingCells=TouchingCells_;this.Data=Data_;this.ignoreList=ignoreList_;this.tags=tags_;});AE=$pkg.Collision=$newType(0,$kindStruct,"resolv.Collision",true,"resolv",true,function(checkingObject_,dx_,dy_,Objects_,Cells_){this.$val=this;if(arguments.length===0){this.checkingObject=AN.nil;this.dx=0;this.dy=0;this.Objects=AO.nil;this.Cells=AK.nil;return;}this.checkingObject=checkingObject_;this.dx=dx_;this.dy=dy_;this.Objects=Objects_;this.Cells=Cells_;});AG=$pkg.Cell=$newType(0,$kindStruct,"resolv.Cell",true,"resolv",true,function(X_,Y_,Objects_){this.$val=this;if(arguments.length===0){this.X=0;this.Y=0;this.Objects=AO.nil;return;}this.X=X_;this.Y=Y_;this.Objects=Objects_;});AI=$sliceType($Float64);AJ=$ptrType(AG);AK=$sliceType(AJ);AL=$sliceType(AK);AM=$ptrType(N);AN=$ptrType(AA);AO=$sliceType(AN);AP=$sliceType(B);AQ=$ptrType(Q);AR=$sliceType(AQ);AS=$ptrType(X);AT=$ptrType(S);AU=$ptrType(U);AV=$sliceType($String);AW=$ptrType(AE);AX=$sliceType(C);AY=$mapType(AN,$Bool);B.prototype.Clone=function(){var a,b;a=this;b=$makeSlice(B,a.$length);$copySlice(b,a);return b;};$ptrType(B).prototype.Clone=function(){return this.$get().Clone();};B.prototype.Add=function(a){var a,b,c,d,e,f;b=this;c=b.$length;d=a;e=0;while(true){if(!(e=a.$length)?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+f]).$length>c){AC($convertSliceType(b,AI),1,$convertSliceType(b,AI),$convertSliceType($subslice(((f<0||f>=a.$length)?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+f]),0,c),AI));}else{AC($convertSliceType(b,AI),1,$convertSliceType(b,AI),$convertSliceType(((f<0||f>=a.$length)?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+f]),AI));}e++;}return b;};$ptrType(B).prototype.Add=function(a){return this.$get().Add(a);};B.prototype.Sub=function(a){var a,b,c,d,e,f;b=this;c=b.$length;d=a;e=0;while(true){if(!(e=a.$length)?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+f]).$length>c){AC($convertSliceType(b,AI),-1,$convertSliceType($subslice(((f<0||f>=a.$length)?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+f]),0,c),AI),$convertSliceType(b,AI));}else{AC($convertSliceType(b,AI),-1,$convertSliceType(((f<0||f>=a.$length)?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+f]),AI),$convertSliceType(b,AI));}e++;}return b;};$ptrType(B).prototype.Sub=function(a){return this.$get().Sub(a);};B.prototype.Scale=function(a){var a,b;b=this;AD($convertSliceType(b,AI),a,$convertSliceType(b,AI));return b;};$ptrType(B).prototype.Scale=function(a){return this.$get().Scale(a);};B.prototype.Equal=function(a){var a,b,c,d,e;b=this;if(!((b.$length===a.$length))){return false;}c=b;d=0;while(true){if(!(d=b.$length)?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+e])-((e<0||e>=a.$length)?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+e]))>1e-08){return false;}d++;}return true;};$ptrType(B).prototype.Equal=function(a){return this.$get().Equal(a);};B.prototype.Magnitude=function(){var a;a=this;return A.Sqrt(a.Magnitude2());};$ptrType(B).prototype.Magnitude=function(){return this.$get().Magnitude();};B.prototype.Magnitude2=function(){var a,b,c,d,e;a=this;b=0;c=a;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);b=b+(e*e);d++;}return b;};$ptrType(B).prototype.Magnitude2=function(){return this.$get().Magnitude2();};B.prototype.Unit=function(){var a,b,c,d,e;a=this;b=a.Magnitude();if(b<1e-08){return a;}c=a;d=0;while(true){if(!(d=a.$length)?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+e]=((e<0||e>=a.$length)?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+e])/b);d++;}return a;};$ptrType(B).prototype.Unit=function(){return this.$get().Unit();};K=function(a,b){var a,b,c,d,e,f,g,h,i,j,k;c=0;d=a.$length;e=b.$length;f=c;g=d;h=e;if(g>h){b=$appendSlice(b,$convertSliceType($makeSlice(B,(g-h>>0)),AI));}if(g>0)),AI));}i=a;j=0;while(true){if(!(j=a.$length)?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+k])*((k<0||k>=b.$length)?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+k]));j++;}return f;};$pkg.Dot=K;B.prototype.Dot=function(a){var a,b;b=this;return K(b,a);};$ptrType(B).prototype.Dot=function(a){return this.$get().Dot(a);};B.prototype.Cross=function(a){var a,b;b=this;if(!((b.$length===3))||!((a.$length===3))){return B.nil;}return new B([(1>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+1])*(2>=a.$length?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+2])-(2>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+2])*(1>=a.$length?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+1]),(2>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+2])*(0>=a.$length?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+0])-(0>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+0])*(2>=a.$length?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+2]),(0>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+0])*(2>=a.$length?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+2])-(2>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+2])*(0>=a.$length?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+0])]);};$ptrType(B).prototype.Cross=function(a){return this.$get().Cross(a);};B.prototype.Rotate=function(a,b){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;c=this;d=2;e=c.$length;f=d;g=e;if(g===0){return c;}if(b.$length>0){f=(0>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+0]);}if((g===1)&&!((f===2))){c=$append(c,0,0);}if((g<2&&(f===2))||((g===2)&&!((f===2)))){c=$append(c,0);}h=(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0]);i=(1>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+1]);j=h;k=i;l=A.Cos(a);m=A.Sin(a);n=l;o=m;p=f;if(p===(0)){q=(2>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+2]);(1>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+1]=k*n-q*o);(2>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+2]=k*o+q*n);}else if(p===(1)){r=(2>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+2]);(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0]=j*n+r*o);(2>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+2]=-j*o+r*n);}else if(p===(2)){(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0]=j*n-k*o);(1>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+1]=j*o+k*n);}if(g>3){return $subslice(c,0,3);}return c;};$ptrType(B).prototype.Rotate=function(a,b){return this.$get().Rotate(a,b);};B.prototype.X=function(){var a;a=this;if(a.$length<1){return 0;}return(0>=a.$length?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+0]);};$ptrType(B).prototype.X=function(){return this.$get().X();};B.prototype.Y=function(){var a;a=this;if(a.$length<2){return 0;}return(1>=a.$length?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+1]);};$ptrType(B).prototype.Y=function(){return this.$get().Y();};B.prototype.Z=function(){var a;a=this;if(a.$length<3){return 0;}return(2>=a.$length?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+2]);};$ptrType(B).prototype.Z=function(){return this.$get().Z();};O=function(a,b,c,d){var a,b,c,d,e,f,g;e=new N.ptr(AL.nil,c,d);e.Resize((f=a/c,(f===f&&f!==1/0&&f!==-1/0)?f>>0:$throwRuntimeError("integer divide by zero")),(g=b/d,(g===g&&g!==1/0&&g!==-1/0)?g>>0:$throwRuntimeError("integer divide by zero")));return e;};$pkg.NewSpace=O;N.ptr.prototype.Add=function(a){var{a,b,c,d,e,$s,$r,$c}=$restore(this,{a});$s=$s||0;s:while(true){switch($s){case 0:b=this;if(b===AM.nil){$panic(new $String("ERROR: space is nil"));}c=a;d=0;case 1:if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);e.Space=b;$r=e.Update();$s=3;case 3:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}d++;$s=1;continue;case 2:$s=-1;return;}return;}var $f={$blk:N.ptr.prototype.Add,$c:true,$r,a,b,c,d,e,$s};return $f;};N.prototype.Add=function(a){return this.$val.Add(a);};N.ptr.prototype.Remove=function(a){var a,b,c,d,e,f,g,h;b=this;if(b===AM.nil){$panic(new $String("ERROR: space is nil"));}c=a;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);f=e.TouchingCells;g=0;while(true){if(!(g=f.$length)?($throwRuntimeError("index out of range"),undefined):f.$array[f.$offset+g]);h.unregister(e);g++;}e.TouchingCells=new AK([]);e.Space=AM.nil;d++;}};N.prototype.Remove=function(a){return this.$val.Remove(a);};N.ptr.prototype.Objects=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s;a=this;b=$makeMap(AN.keyFor,[]);c=new AO([]);d=a.Cells;e=0;while(true){if(!(e=h.$length)?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+f]));i=0;while(true){if(!(i=m.$length)?($throwRuntimeError("index out of range"),undefined):m.$array[m.$offset+f])),((j<0||j>=l.$length)?($throwRuntimeError("index out of range"),undefined):l.$array[l.$offset+j])).Objects;n=0;while(true){if(!(n=k.$length)?($throwRuntimeError("index out of range"),undefined):k.$array[k.$offset+n]);p=(q=b[AN.keyFor(o)],q!==undefined?[q.v,true]:[false,false]);r=p[1];if(!r){c=$append(c,o);s=o;(b||$throwRuntimeError("assignment to entry in nil map"))[AN.keyFor(s)]={k:s,v:true};}n++;}i++;}e++;}return c;};N.prototype.Objects=function(){return this.$val.Objects();};N.ptr.prototype.Resize=function(a,b){var a,b,c,d,e,f,g;c=this;c.Cells=new AL([]);d=0;while(true){if(!(d=g.$length)?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+d]=$append((f=c.Cells,((d<0||d>=f.$length)?($throwRuntimeError("index out of range"),undefined):f.$array[f.$offset+d])),AH(e,d))));e=e+(1)>>0;}d=d+(1)>>0;}};N.prototype.Resize=function(a,b){return this.$val.Resize(a,b);};N.ptr.prototype.Cell=function(a,b){var a,b,c,d,e,f;c=this;if(b>=0&&b=0&&a<(d=c.Cells,((b<0||b>=d.$length)?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+b])).$length){return(e=(f=c.Cells,((b<0||b>=f.$length)?($throwRuntimeError("index out of range"),undefined):f.$array[f.$offset+b])),((a<0||a>=e.$length)?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+a]));}return AJ.nil;};N.prototype.Cell=function(a,b){return this.$val.Cell(a,b);};N.ptr.prototype.CheckCells=function(a,b,c,d,e){var a,b,c,d,e,f,g,h,i,j,k,l,m;f=this;g=a;while(true){if(!(g<(a+c>>0))){break;}h=b;while(true){if(!(h<(b+d>>0))){break;}i=f.Cell(g,h);if(!(i===AJ.nil)){if(e.$length>0){if(i.ContainsTags(e)){j=i.Objects;k=0;while(true){if(!(k=j.$length)?($throwRuntimeError("index out of range"),undefined):j.$array[j.$offset+k]);if(l.HasTags(e)){return l;}k++;}}}else if(i.Occupied()){return(m=i.Objects,(0>=m.$length?($throwRuntimeError("index out of range"),undefined):m.$array[m.$offset+0]));}}h=h+(1)>>0;}g=g+(1)>>0;}return AN.nil;};N.prototype.CheckCells=function(a,b,c,d,e){return this.$val.CheckCells(a,b,c,d,e);};N.ptr.prototype.CheckCellsWorld=function(a,b,c,d,e){var a,b,c,d,e,f,g,h,i,j,k,l;f=this;g=f.WorldToSpace(a,b);h=g[0];i=g[1];j=f.WorldToSpace(c,d);k=j[0];l=j[1];return f.CheckCells(h,i,k,l,e);};N.prototype.CheckCellsWorld=function(a,b,c,d,e){return this.$val.CheckCellsWorld(a,b,c,d,e);};N.ptr.prototype.UnregisterAllObjects=function(){var a,b,c,d,e,f,g;a=this;b=0;while(true){if(!(b=d.$length)?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+b])).$length)){break;}g=(e=(f=a.Cells,((b<0||b>=f.$length)?($throwRuntimeError("index out of range"),undefined):f.$array[f.$offset+b])),((c<0||c>=e.$length)?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+c]));a.Remove(g.Objects);c=c+(1)>>0;}b=b+(1)>>0;}};N.prototype.UnregisterAllObjects=function(){return this.$val.UnregisterAllObjects();};N.ptr.prototype.WorldToSpace=function(a,b){var a,b,c,d,e;c=this;d=((A.Floor(a/(c.CellWidth))>>0));e=((A.Floor(b/(c.CellHeight))>>0));return[d,e];};N.prototype.WorldToSpace=function(a,b){return this.$val.WorldToSpace(a,b);};N.ptr.prototype.SpaceToWorld=function(a,b){var a,b,c,d,e;c=this;d=(($imul(a,c.CellWidth)));e=(($imul(b,c.CellHeight)));return[d,e];};N.prototype.SpaceToWorld=function(a,b){return this.$val.SpaceToWorld(a,b);};N.ptr.prototype.Height=function(){var a;a=this;return a.Cells.$length;};N.prototype.Height=function(){return this.$val.Height();};N.ptr.prototype.Width=function(){var a,b;a=this;if(a.Cells.$length>0){return(b=a.Cells,(0>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+0])).$length;}return 0;};N.prototype.Width=function(){return this.$val.Width();};N.ptr.prototype.CellsInLine=function(a,b,c,d){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v;e=this;f=new AK([]);g=e.Cell(a,b);h=e.Cell(c,d);if(!(g===AJ.nil)&&!(h===AJ.nil)){i=new B([((c-a>>0)),((d-b>>0))]).Unit();(0>=i.$length?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+0]=(0>=i.$length?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+0])*(((j=e.CellWidth/2,(j===j&&j!==1/0&&j!==-1/0)?j>>0:$throwRuntimeError("integer divide by zero")))));(1>=i.$length?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+1]=(1>=i.$length?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+1])*(((k=e.CellHeight/2,(k===k&&k!==1/0&&k!==-1/0)?k>>0:$throwRuntimeError("integer divide by zero")))));l=e.SpaceToWorld(a,b);m=l[0];n=l[1];q=new B([m+((o=e.CellWidth/2,(o===o&&o!==1/0&&o!==-1/0)?o>>0:$throwRuntimeError("integer divide by zero"))),n+((p=e.CellHeight/2,(p===p&&p!==1/0&&p!==-1/0)?p>>0:$throwRuntimeError("integer divide by zero")))]);r=false;while(true){if(!(!(g===AJ.nil))){break;}if(g===h){f=$append(f,g);break;}f=$append(f,g);if(r){(1>=q.$length?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+1]=(1>=q.$length?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+1])+((1>=i.$length?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+1])));}else{(0>=q.$length?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+0]=(0>=q.$length?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+0])+((0>=i.$length?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+0])));}s=e.WorldToSpace((0>=q.$length?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+0]),(1>=q.$length?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+1]));t=s[0];u=s[1];v=e.Cell(t,u);if(!(v===g)){g=v;}r=!r;}}return f;};N.prototype.CellsInLine=function(a,b,c,d){return this.$val.CellsInLine(a,b,c,d);};R=function(a,b,c,d){var a,b,c,d;return new Q.ptr(new B([a,b]),new B([c,d]));};$pkg.NewLine=R;Q.ptr.prototype.Project=function(a){var a,b;b=this;return b.Vector().Scale(a.Dot(b.Start.Sub(new AP([b.End]))));};Q.prototype.Project=function(a){return this.$val.Project(a);};Q.ptr.prototype.Normal=function(){var a,b;a=this;b=a.Vector();return new B([(1>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+1]),-(0>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+0])]).Unit();};Q.prototype.Normal=function(){return this.$val.Normal();};Q.ptr.prototype.Vector=function(){var a;a=this;return a.End.Clone().Sub(new AP([a.Start])).Unit();};Q.prototype.Vector=function(){return this.$val.Vector();};Q.ptr.prototype.IntersectionPointsLine=function(a){var a,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z;b=this;k=((c=b.End,(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0]))-(d=b.Start,(0>=d.$length?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+0])))*((e=a.End,(1>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+1]))-(f=a.Start,(1>=f.$length?($throwRuntimeError("index out of range"),undefined):f.$array[f.$offset+1])))-((g=a.End,(0>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+0]))-(h=a.Start,(0>=h.$length?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+0])))*((i=b.End,(1>=i.$length?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+1]))-(j=b.Start,(1>=j.$length?($throwRuntimeError("index out of range"),undefined):j.$array[j.$offset+1])));if(!((k===0))){t=((((l=b.Start,(1>=l.$length?($throwRuntimeError("index out of range"),undefined):l.$array[l.$offset+1]))-(m=a.Start,(1>=m.$length?($throwRuntimeError("index out of range"),undefined):m.$array[m.$offset+1])))*((n=a.End,(0>=n.$length?($throwRuntimeError("index out of range"),undefined):n.$array[n.$offset+0]))-(o=a.Start,(0>=o.$length?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+0]))))-(((p=b.Start,(0>=p.$length?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+0]))-(q=a.Start,(0>=q.$length?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+0])))*((r=a.End,(1>=r.$length?($throwRuntimeError("index out of range"),undefined):r.$array[r.$offset+1]))-(s=a.Start,(1>=s.$length?($throwRuntimeError("index out of range"),undefined):s.$array[s.$offset+1]))))+1)/k;ac=((((u=b.Start,(1>=u.$length?($throwRuntimeError("index out of range"),undefined):u.$array[u.$offset+1]))-(v=a.Start,(1>=v.$length?($throwRuntimeError("index out of range"),undefined):v.$array[v.$offset+1])))*((w=b.End,(0>=w.$length?($throwRuntimeError("index out of range"),undefined):w.$array[w.$offset+0]))-(x=b.Start,(0>=x.$length?($throwRuntimeError("index out of range"),undefined):x.$array[x.$offset+0]))))-(((y=b.Start,(0>=y.$length?($throwRuntimeError("index out of range"),undefined):y.$array[y.$offset+0]))-(z=a.Start,(0>=z.$length?($throwRuntimeError("index out of range"),undefined):z.$array[z.$offset+0])))*((aa=b.End,(1>=aa.$length?($throwRuntimeError("index out of range"),undefined):aa.$array[aa.$offset+1]))-(ab=b.Start,(1>=ab.$length?($throwRuntimeError("index out of range"),undefined):ab.$array[ab.$offset+1]))))+1)/k;if((0=ad.$length?($throwRuntimeError("index out of range"),undefined):ad.$array[ad.$offset+0]))-(ae=b.Start,(0>=ae.$length?($throwRuntimeError("index out of range"),undefined):ae.$array[ae.$offset+0]));ai=(ag=b.End,(1>=ag.$length?($throwRuntimeError("index out of range"),undefined):ag.$array[ag.$offset+1]))-(ah=b.Start,(1>=ah.$length?($throwRuntimeError("index out of range"),undefined):ah.$array[ah.$offset+1]));return new B([(aj=b.Start,(0>=aj.$length?($throwRuntimeError("index out of range"),undefined):aj.$array[aj.$offset+0]))+(t*af),(ak=b.Start,(1>=ak.$length?($throwRuntimeError("index out of range"),undefined):ak.$array[ak.$offset+1]))+(t*ai)]);}}return B.nil;};Q.prototype.IntersectionPointsLine=function(a){return this.$val.IntersectionPointsLine(a);};Q.ptr.prototype.IntersectionPointsCircle=function(a){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s;b=this;c=new AP([]);d=new B([a.X,a.Y]);e=b.Start.Sub(new AP([d]));f=b.End.Sub(new AP([d]));g=f.Sub(new AP([e]));h=(0>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+0])*(0>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+0])+(1>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+1])*(1>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+1]);i=2*(((0>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+0])*(0>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+0]))+((1>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+1])*(1>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+1])));j=((0>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+0])*(0>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+0]))+((1>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+1])*(1>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+1]))-(a.Radius*a.Radius);k=i*i-(4*h*j);if(k<0){}else if(k===0){l=-i/(2*h);if(l>=0&&l<=1){c=$append(c,new B([(m=b.Start,(0>=m.$length?($throwRuntimeError("index out of range"),undefined):m.$array[m.$offset+0]))+l*(0>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+0]),(n=b.Start,(1>=n.$length?($throwRuntimeError("index out of range"),undefined):n.$array[n.$offset+1]))+l*(1>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+1])]));}}else{o=(-i+A.Sqrt(k))/(2*h);if(o>=0&&o<=1){c=$append(c,new B([(p=b.Start,(0>=p.$length?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+0]))+o*(0>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+0]),(q=b.Start,(1>=q.$length?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+1]))+o*(1>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+1])]));}o=(-i-A.Sqrt(k))/(2*h);if(o>=0&&o<=1){c=$append(c,new B([(r=b.Start,(0>=r.$length?($throwRuntimeError("index out of range"),undefined):r.$array[r.$offset+0]))+o*(0>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+0]),(s=b.Start,(1>=s.$length?($throwRuntimeError("index out of range"),undefined):s.$array[s.$offset+1]))+o*(1>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+1])]));}}return c;};Q.prototype.IntersectionPointsCircle=function(a){return this.$val.IntersectionPointsCircle(a);};T=function(a){var a,b;b=new S.ptr(new AP([]),0,0,true);b.AddPoints(a);return b;};$pkg.NewConvexPolygon=T;S.ptr.prototype.Clone=function(){var a,b,c,d,e,f;a=this;b=new AP([]);c=a.Points;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);b=$append(b,e.Clone());d++;}f=T(AI.nil);f.X=a.X;f.Y=a.Y;f.AddPointsVec(b);f.Closed=a.Closed;return f;};S.prototype.Clone=function(){return this.$val.Clone();};S.ptr.prototype.AddPointsVec=function(a){var a,b;b=this;b.Points=$appendSlice(b.Points,a);};S.prototype.AddPointsVec=function(a){return this.$val.AddPointsVec(a);};S.ptr.prototype.AddPoints=function(a){var a,b,c,d;b=this;c=0;while(true){if(!(c=a.$length)?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+c]),(d=c+1>>0,((d<0||d>=a.$length)?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+d]))]));c=c+(2)>>0;}};S.prototype.AddPoints=function(a){return this.$val.AddPoints(a);};S.ptr.prototype.Lines=function(){var a,b,c,d,e,f,g,h,i,j;a=this;b=new AR([]);c=a.Transformed();d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);f=(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0]);g=e;h=f;if(d<(c.$length-1>>0)){h=(i=d+1>>0,((i<0||i>=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+i]));}else if(!a.Closed){break;}j=R((0>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+0]),(1>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+1]),(0>=h.$length?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+0]),(1>=h.$length?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+1]));b=$append(b,j);d=d+(1)>>0;}return b;};S.prototype.Lines=function(){return this.$val.Lines();};S.ptr.prototype.Transformed=function(){var a,b,c,d,e;a=this;b=new AP([]);c=a.Points;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);b=$append(b,new B([(0>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+0])+a.X,(1>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+1])+a.Y]));d++;}return b;};S.prototype.Transformed=function(){return this.$val.Transformed();};S.ptr.prototype.Bounds=function(){var a,b,c,d,e,f,g,h;a=this;b=a.Transformed();e=new B([(c=(0>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+0]),(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0])),(d=(0>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+0]),(1>=d.$length?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+1]))]);f=e.Clone();g=0;while(true){if(!(g=b.$length)?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+g]);if((0>=h.$length?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+0])<(0>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+0])){(0>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+0]=(0>=h.$length?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+0]));}else if((0>=h.$length?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+0])>(0>=f.$length?($throwRuntimeError("index out of range"),undefined):f.$array[f.$offset+0])){(0>=f.$length?($throwRuntimeError("index out of range"),undefined):f.$array[f.$offset+0]=(0>=h.$length?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+0]));}if((1>=h.$length?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+1])<(1>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+1])){(1>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+1]=(1>=h.$length?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+1]));}else if((1>=h.$length?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+1])>(1>=f.$length?($throwRuntimeError("index out of range"),undefined):f.$array[f.$offset+1])){(1>=f.$length?($throwRuntimeError("index out of range"),undefined):f.$array[f.$offset+1]=(1>=h.$length?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+1]));}g=g+(1)>>0;}return[e,f];};S.prototype.Bounds=function(){return this.$val.Bounds();};S.ptr.prototype.Position=function(){var a;a=this;return[a.X,a.Y];};S.prototype.Position=function(){return this.$val.Position();};S.ptr.prototype.SetPosition=function(a,b){var a,b,c;c=this;c.X=a;c.Y=b;};S.prototype.SetPosition=function(a,b){return this.$val.SetPosition(a,b);};S.ptr.prototype.SetPositionVec=function(a){var a,b;b=this;b.X=a.X();b.Y=a.Y();};S.prototype.SetPositionVec=function(a){return this.$val.SetPositionVec(a);};S.ptr.prototype.Move=function(a,b){var a,b,c;c=this;c.X=c.X+(a);c.Y=c.Y+(b);};S.prototype.Move=function(a,b){return this.$val.Move(a,b);};S.ptr.prototype.MoveVec=function(a){var a,b;b=this;b.X=b.X+(a.X());b.Y=b.Y+(a.Y());};S.prototype.MoveVec=function(a){return this.$val.MoveVec(a);};S.ptr.prototype.Center=function(){var a,b,c,d,e;a=this;b=new B([0,0]);c=a.Transformed();d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);b.Add(new AP([e]));d++;}(0>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+0]=(0>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+0])/((a.Transformed().$length)));(1>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+1]=(1>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+1])/((a.Transformed().$length)));return b;};S.prototype.Center=function(){return this.$val.Center();};S.ptr.prototype.Project=function(a){var a,b,c,d,e,f,g,h,i,j,k;b=this;a=a.Unit();c=b.Transformed();f=a.Dot(new B([(d=(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0]),(0>=d.$length?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+0])),(e=(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0]),(1>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+1]))]));g=f;h=1;while(true){if(!(h=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+h]),(0>=i.$length?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+0])),(j=((h<0||h>=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+h]),(1>=j.$length?($throwRuntimeError("index out of range"),undefined):j.$array[j.$offset+1]))]));if(kg){g=k;}h=h+(1)>>0;}return new Z.ptr(f,g);};S.prototype.Project=function(a){return this.$val.Project(a);};S.ptr.prototype.SATAxes=function(){var a,b,c,d,e;a=this;b=new AP([]);c=a.Lines();d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);b=$append(b,e.Normal());d++;}return b;};S.prototype.SATAxes=function(){return this.$val.SATAxes();};S.ptr.prototype.PointInside=function(a){var a,b,c,d,e,f,g;b=this;c=R((0>=a.$length?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+0]),(1>=a.$length?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+1]),(0>=a.$length?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+0])+9.99999999999e+11,(1>=a.$length?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+1]));d=0;e=b.Lines();f=0;while(true){if(!(f=e.$length)?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+f]);if(!(g.IntersectionPointsLine(c)===B.nil)){d=d+(1)>>0;}f++;}return d===1;};S.prototype.PointInside=function(a){return this.$val.PointInside(a);};V=function(){return new U.ptr(new AP([]),new B([0,0]),new B([0,0]));};$pkg.NewContactSet=V;U.ptr.prototype.LeftmostPoint=function(){var a,b,c,d,e;a=this;b=B.nil;c=a.Points;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);if(b===B.nil||(0>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+0])<(0>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+0])){b=e;}d++;}return b;};U.prototype.LeftmostPoint=function(){return this.$val.LeftmostPoint();};U.ptr.prototype.RightmostPoint=function(){var a,b,c,d,e;a=this;b=B.nil;c=a.Points;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);if(b===B.nil||(0>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+0])>(0>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+0])){b=e;}d++;}return b;};U.prototype.RightmostPoint=function(){return this.$val.RightmostPoint();};U.ptr.prototype.TopmostPoint=function(){var a,b,c,d,e;a=this;b=B.nil;c=a.Points;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);if(b===B.nil||(1>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+1])<(1>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+1])){b=e;}d++;}return b;};U.prototype.TopmostPoint=function(){return this.$val.TopmostPoint();};U.ptr.prototype.BottommostPoint=function(){var a,b,c,d,e;a=this;b=B.nil;c=a.Points;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);if(b===B.nil||(1>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+1])>(1>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+1])){b=e;}d++;}return b;};U.prototype.BottommostPoint=function(){return this.$val.BottommostPoint();};S.ptr.prototype.Intersection=function(a,b,c){var a,aa,ab,ac,ad,ae,af,ag,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z;d=this;e=V();f=d.X;g=d.Y;d.X=d.X+(a);d.Y=d.Y+(b);h=$assertType(c,AS,true);i=h[0];j=h[1];if(j){k=d.Lines();l=0;while(true){if(!(l=k.$length)?($throwRuntimeError("index out of range"),undefined):k.$array[k.$offset+l]);e.Points=$appendSlice(e.Points,m.IntersectionPointsCircle(i));l++;}}else{n=$assertType(c,AT,true);o=n[0];p=n[1];if(p){q=d.Lines();r=0;while(true){if(!(r=q.$length)?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+r]);t=o.Lines();u=0;while(true){if(!(u=t.$length)?($throwRuntimeError("index out of range"),undefined):t.$array[t.$offset+u]);w=s.IntersectionPointsLine(v);if(!(w===B.nil)){e.Points=$append(e.Points,w);}u++;}r++;}}}if(e.Points.$length>0){x=e.Points;y=0;while(true){if(!(y=x.$length)?($throwRuntimeError("index out of range"),undefined):x.$array[x.$offset+y]);e.Center=e.Center.Add(new AP([z]));y++;}(ab=e.Center,(0>=ab.$length?($throwRuntimeError("index out of range"),undefined):ab.$array[ab.$offset+0]=(aa=e.Center,(0>=aa.$length?($throwRuntimeError("index out of range"),undefined):aa.$array[aa.$offset+0]))/((e.Points.$length))));(ad=e.Center,(1>=ad.$length?($throwRuntimeError("index out of range"),undefined):ad.$array[ad.$offset+1]=(ac=e.Center,(1>=ac.$length?($throwRuntimeError("index out of range"),undefined):ac.$array[ac.$offset+1]))/((e.Points.$length))));ae=d.calculateMTV(e,c);if(!(ae===B.nil)){e.MTV=ae;}}else{e=AU.nil;}if(!(e===AU.nil)&&(!((a===0))||!((b===0)))){af=new B([a,b]).Magnitude();ag=e.MTV.Magnitude();e.MTV=e.MTV.Unit().Scale(ag-af);}d.X=f;d.Y=g;return e;};S.prototype.Intersection=function(a,b,c){return this.$val.Intersection(a,b,c);};S.ptr.prototype.calculateMTV=function(a,b){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o;c=this;d=new B([0,0]);e=new B([1.7976931348623157e+308,0]);f=b;if($assertType(f,AT,true)[1]){g=f.$val;h=c.SATAxes();i=0;while(true){if(!(i=h.$length)?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+i]);if(!$clone(c.Project(j),Z).Overlapping($clone(g.Project(j),Z))){return B.nil;}k=$clone(c.Project(j),Z).Overlap($clone(g.Project(j),Z));if(e.Magnitude()>k){e=j.Scale(k);}i++;}l=g.SATAxes();m=0;while(true){if(!(m=l.$length)?($throwRuntimeError("index out of range"),undefined):l.$array[l.$offset+m]);if(!$clone(c.Project(n),Z).Overlapping($clone(g.Project(n),Z))){return B.nil;}o=$clone(c.Project(n),Z).Overlap($clone(g.Project(n),Z));if(e.Magnitude()>o){e=n.Scale(o);}m++;}}(0>=d.$length?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+0]=(0>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+0]));(1>=d.$length?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+1]=(1>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+1]));return d;};S.prototype.calculateMTV=function(a,b){return this.$val.calculateMTV(a,b);};S.ptr.prototype.ContainedBy=function(a){var a,b,c,d,e,f,g,h,i,j;b=this;c=a;if($assertType(c,AT,true)[1]){d=c.$val;e=b.SATAxes();f=0;while(true){if(!(f=e.$length)?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+f]);if(!$clone(b.Project(g),Z).IsInside($clone(d.Project(g),Z))){return false;}f++;}h=d.SATAxes();i=0;while(true){if(!(i=h.$length)?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+i]);if(!$clone(b.Project(j),Z).IsInside($clone(d.Project(j),Z))){return false;}i++;}}return true;};S.prototype.ContainedBy=function(a){return this.$val.ContainedBy(a);};S.ptr.prototype.FlipH=function(){var a,b,c,d;a=this;b=a.Points;c=0;while(true){if(!(c=b.$length)?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+c]);(0>=d.$length?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+0]=-(0>=d.$length?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+0]));c++;}a.ReverseVertexOrder();};S.prototype.FlipH=function(){return this.$val.FlipH();};S.ptr.prototype.FlipV=function(){var a,b,c,d;a=this;b=a.Points;c=0;while(true){if(!(c=b.$length)?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+c]);(1>=d.$length?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+1]=-(1>=d.$length?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+1]));c++;}a.ReverseVertexOrder();};S.prototype.FlipV=function(){return this.$val.FlipV();};S.ptr.prototype.ReverseVertexOrder=function(){var a,b,c,d,e;a=this;c=new AP([(b=a.Points,(0>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+0]))]);d=a.Points.$length-1>>0;while(true){if(!(d>=1)){break;}c=$append(c,(e=a.Points,((d<0||d>=e.$length)?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+d])));d=d-(1)>>0;}a.Points=c;};S.prototype.ReverseVertexOrder=function(){return this.$val.ReverseVertexOrder();};W=function(a,b,c,d){var a,b,c,d;return T(new AI([a,b,a+c,b,a+c,b+d,a,b+d]));};$pkg.NewRectangle=W;Y=function(a,b,c){var a,b,c,d;d=new X.ptr(a,b,c);return d;};$pkg.NewCircle=Y;X.ptr.prototype.Clone=function(){var a;a=this;return Y(a.X,a.Y,a.Radius);};X.prototype.Clone=function(){return this.$val.Clone();};X.ptr.prototype.Bounds=function(){var a;a=this;return[new B([a.X-a.Radius,a.Y-a.Radius]),new B([a.X+a.Radius,a.Y+a.Radius])];};X.prototype.Bounds=function(){return this.$val.Bounds();};X.ptr.prototype.Intersection=function(a,b,c){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;d=this;e=AU.nil;f=d.X;g=d.Y;d.X=d.X+(a);d.Y=d.Y+(b);h=c;if($assertType(h,AT,true)[1]){i=h.$val;e=i.Intersection(-a,-b,d);if(!(e===AU.nil)){e.MTV=e.MTV.Scale(-1);}}else if($assertType(h,AS,true)[1]){j=h.$val;e=V();e.Points=d.IntersectionPointsCircle(j);if(e.Points.$length===0){return AU.nil;}e.MTV=new B([d.X-j.X,d.Y-j.Y]);k=e.MTV.Magnitude();e.MTV=e.MTV.Unit().Scale(d.Radius+j.Radius-k);l=e.Points;m=0;while(true){if(!(m=l.$length)?($throwRuntimeError("index out of range"),undefined):l.$array[l.$offset+m]);e.Center=e.Center.Add(new AP([n]));m++;}(p=e.Center,(0>=p.$length?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+0]=(o=e.Center,(0>=o.$length?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+0]))/((e.Points.$length))));(r=e.Center,(1>=r.$length?($throwRuntimeError("index out of range"),undefined):r.$array[r.$offset+1]=(q=e.Center,(1>=q.$length?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+1]))/((e.Points.$length))));}d.X=f;d.Y=g;return e;};X.prototype.Intersection=function(a,b,c){return this.$val.Intersection(a,b,c);};X.ptr.prototype.Move=function(a,b){var a,b,c;c=this;c.X=c.X+(a);c.Y=c.Y+(b);};X.prototype.Move=function(a,b){return this.$val.Move(a,b);};X.ptr.prototype.MoveVec=function(a){var a,b;b=this;b.X=b.X+(a.X());b.Y=b.Y+(a.Y());};X.prototype.MoveVec=function(a){return this.$val.MoveVec(a);};X.ptr.prototype.SetPosition=function(a,b){var a,b,c;c=this;c.X=a;c.Y=b;};X.prototype.SetPosition=function(a,b){return this.$val.SetPosition(a,b);};X.ptr.prototype.SetPositionVec=function(a){var a,b;b=this;b.X=a.X();b.Y=a.Y();};X.prototype.SetPositionVec=function(a){return this.$val.SetPositionVec(a);};X.ptr.prototype.Position=function(){var a;a=this;return[a.X,a.Y];};X.prototype.Position=function(){return this.$val.Position();};X.ptr.prototype.PointInside=function(a){var a,b;b=this;return a.Sub(new AP([new B([b.X,b.Y])])).Magnitude()<=b.Radius;};X.prototype.PointInside=function(a){return this.$val.PointInside(a);};X.ptr.prototype.IntersectionPointsCircle=function(a){var a,b,c,d,e,f,g;b=this;c=A.Sqrt(A.Pow(a.X-b.X,2)+A.Pow(a.Y-b.Y,2));if(c>b.Radius+a.Radius||c0;};Z.prototype.Overlapping=function(a){return this.$val.Overlapping(a);};Z.ptr.prototype.Overlap=function(a){var a,b;b=this;return A.Min(b.Max,a.Max)-A.Max(b.Min,a.Min);};Z.prototype.Overlap=function(a){return this.$val.Overlap(a);};Z.ptr.prototype.IsInside=function(a){var a,b;b=this;return b.Min>=a.Min&&b.Max<=a.Max;};Z.prototype.IsInside=function(a){return this.$val.IsInside(a);};AB=function(a,b,c,d,e){var a,b,c,d,e,f;f=new AA.ptr($ifaceNil,AM.nil,a,b,c,d,AK.nil,$ifaceNil,$makeMap(AN.keyFor,[]),new AV([]));if(e.$length>0){f.AddTags(e);}return f;};$pkg.NewObject=AB;AA.ptr.prototype.Clone=function(){var{a,b,c,d,e,f,g,h,$s,$r,$c}=$restore(this,{});$s=$s||0;s:while(true){switch($s){case 0:a=this;b=AB(a.X,a.Y,a.W,a.H,a.Tags());b.Data=a.Data;if(!($interfaceIsEqual(a.Shape,$ifaceNil))){$s=1;continue;}$s=2;continue;case 1:c=a.Shape.Clone();$s=3;case 3:if($c){$c=false;c=c.$blk();}if(c&&c.$blk!==undefined){break s;}$r=b.SetShape(c);$s=4;case 4:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}case 2:d=a.ignoreList;e=0;f=$keys(d);while(true){if(!(e>0;}h=h+(1)>>0;}}if(!($interfaceIsEqual(a.Shape,$ifaceNil))){$s=1;continue;}$s=2;continue;case 1:$r=a.Shape.SetPosition(a.X,a.Y);$s=3;case 3:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}case 2:$s=-1;return;}return;}var $f={$blk:AA.ptr.prototype.Update,$c:true,$r,a,b,c,d,e,f,g,h,i,j,$s};return $f;};AA.prototype.Update=function(){return this.$val.Update();};AA.ptr.prototype.AddTags=function(a){var a,b;b=this;b.tags=$appendSlice(b.tags,a);};AA.prototype.AddTags=function(a){return this.$val.AddTags(a);};AA.ptr.prototype.RemoveTags=function(a){var a,b,c,d,e,f,g,h,i;b=this;c=a;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);f=b.tags;g=0;while(true){if(!(g=f.$length)?($throwRuntimeError("index out of range"),undefined):f.$array[f.$offset+g]);if(i===e){b.tags=$appendSlice($subslice(b.tags,0,h),$subslice(b.tags,(h+1>>0)));break;}g++;}d++;}};AA.prototype.RemoveTags=function(a){return this.$val.RemoveTags(a);};AA.ptr.prototype.HasTags=function(a){var a,b,c,d,e,f,g,h;b=this;c=a;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);f=b.tags;g=0;while(true){if(!(g=f.$length)?($throwRuntimeError("index out of range"),undefined):f.$array[f.$offset+g]);if(h===e){return true;}g++;}d++;}return false;};AA.prototype.HasTags=function(a){return this.$val.HasTags(a);};AA.ptr.prototype.Tags=function(){var a;a=this;return $appendSlice(new AV([]),a.tags);};AA.prototype.Tags=function(){return this.$val.Tags();};AA.ptr.prototype.SetShape=function(a){var{a,b,$s,$r,$c}=$restore(this,{a});$s=$s||0;s:while(true){switch($s){case 0:b=this;if(!($interfaceIsEqual(b.Shape,a))){$s=1;continue;}$s=2;continue;case 1:b.Shape=a;$r=b.Update();$s=3;case 3:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}case 2:$s=-1;return;}return;}var $f={$blk:AA.ptr.prototype.SetShape,$c:true,$r,a,b,$s};return $f;};AA.prototype.SetShape=function(a){return this.$val.SetShape(a);};AA.ptr.prototype.BoundsToSpace=function(a,b){var a,b,c,d,e,f,g,h,i;c=this;d=c.Space.WorldToSpace(c.X+a,c.Y+b);e=d[0];f=d[1];g=c.Space.WorldToSpace(c.X+c.W+a-1,c.Y+c.H+b-1);h=g[0];i=g[1];return[e,f,h,i];};AA.prototype.BoundsToSpace=function(a,b){return this.$val.BoundsToSpace(a,b);};AA.ptr.prototype.SharesCells=function(a){var a,b,c,d,e;b=this;c=b.TouchingCells;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);if(e.Contains(a)){return true;}d++;}return false;};AA.prototype.SharesCells=function(a){return this.$val.SharesCells(a);};AA.ptr.prototype.SharesCellsTags=function(a){var a,b,c,d,e;b=this;c=b.TouchingCells;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);if(e.ContainsTags(a)){return true;}d++;}return false;};AA.prototype.SharesCellsTags=function(a){return this.$val.SharesCellsTags(a);};AA.ptr.prototype.Center=function(){var a;a=this;return[a.X+(a.W/2),a.Y+(a.H/2)];};AA.prototype.Center=function(){return this.$val.Center();};AA.ptr.prototype.SetCenter=function(a,b){var a,b,c;c=this;c.X=a-(c.W/2);c.Y=b-(c.H/2);};AA.prototype.SetCenter=function(a,b){return this.$val.SetCenter(a,b);};AA.ptr.prototype.CellPosition=function(){var a,b;a=this;b=a.Center();return a.Space.WorldToSpace(b[0],b[1]);};AA.prototype.CellPosition=function(){return this.$val.CellPosition();};AA.ptr.prototype.SetRight=function(a){var a,b;b=this;b.X=a-b.W;};AA.prototype.SetRight=function(a){return this.$val.SetRight(a);};AA.ptr.prototype.SetBottom=function(a){var a,b;b=this;b.Y=a-b.H;};AA.prototype.SetBottom=function(a){return this.$val.SetBottom(a);};AA.ptr.prototype.Bottom=function(){var a;a=this;return a.Y+a.H;};AA.prototype.Bottom=function(){return this.$val.Bottom();};AA.ptr.prototype.Right=function(){var a;a=this;return a.X+a.W;};AA.prototype.Right=function(){return this.$val.Right();};AA.ptr.prototype.SetBounds=function(a,b){var a,b,c;c=this;c.X=(0>=a.$length?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+0]);c.Y=(1>=a.$length?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+1]);c.W=(0>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+0])-c.X;c.H=(1>=b.$length?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+1])-c.Y;};AA.prototype.SetBounds=function(a,b){return this.$val.SetBounds(a,b);};AA.ptr.prototype.Check=function(a,b,c){var a,aa,ab,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z;d=this;if(d.Space===AM.nil){return AW.nil;}e=AF();e.checkingObject=d;if(a<0){a=A.Min(a,-1);}else if(a>0){a=A.Max(a,1);}if(b<0){b=A.Min(b,-1);}else if(b>0){b=A.Max(b,1);}e.dx=a;e.dy=b;f=d.BoundsToSpace(a,b);g=f[0];h=f[1];i=f[2];j=f[3];k=$makeMap(AN.keyFor,[]);l=$makeMap(AJ.keyFor,[]);m=h;while(true){if(!(m<=j)){break;}n=g;while(true){if(!(n<=i)){break;}o=d.Space.Cell(n,m);if(!(o===AJ.nil)){p=o.Objects;q=0;while(true){if(!(q=p.$length)?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+q]);t=(s=d.ignoreList[AN.keyFor(r)],s!==undefined?s.v:false);if(r===d||t){q++;continue;}u=(v=k[AN.keyFor(r)],v!==undefined?[v.v,true]:[false,false]);w=u[1];if(((c.$length===0)||r.HasTags(c))&&!w){e.Objects=$append(e.Objects,r);x=r;(k||$throwRuntimeError("assignment to entry in nil map"))[AN.keyFor(x)]={k:x,v:true};y=(z=l[AJ.keyFor(o)],z!==undefined?[z.v,true]:[false,false]);aa=y[1];if(!aa){e.Cells=$append(e.Cells,o);ab=o;(l||$throwRuntimeError("assignment to entry in nil map"))[AJ.keyFor(ab)]={k:ab,v:true};}q++;continue;}q++;}}n=n+(1)>>0;}m=m+(1)>>0;}if(e.Objects.$length===0){return AW.nil;}return e;};AA.prototype.Check=function(a,b,c){return this.$val.Check(a,b,c);};AA.ptr.prototype.Overlaps=function(a){var a,b;b=this;return a.X<=b.X+b.W&&a.X+a.W>=b.X&&a.Y<=b.Y+b.H&&a.Y+a.H>=b.Y;};AA.prototype.Overlaps=function(a){return this.$val.Overlaps(a);};AA.ptr.prototype.AddToIgnoreList=function(a){var a,b,c;b=this;c=a;(b.ignoreList||$throwRuntimeError("assignment to entry in nil map"))[AN.keyFor(c)]={k:c,v:true};};AA.prototype.AddToIgnoreList=function(a){return this.$val.AddToIgnoreList(a);};AA.ptr.prototype.RemoveFromIgnoreList=function(a){var a,b;b=this;delete b.ignoreList[AN.keyFor(a)];};AA.prototype.RemoveFromIgnoreList=function(a){return this.$val.RemoveFromIgnoreList(a);};AC=function(a,b,c,d){var a,b,c,d,e,f,g,h,i;e=d.$length;f=c;g=0;while(true){if(!(g=f.$length)?($throwRuntimeError("index out of range"),undefined):f.$array[f.$offset+g]);if(h===e){return;}((h<0||h>=a.$length)?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+h]=b*i+((h<0||h>=d.$length)?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+h]));g++;}};AD=function(a,b,c){var a,b,c,d,e,f;d=c;e=0;while(true){if(!(e=a.$length)?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+f]=((f<0||f>=a.$length)?($throwRuntimeError("index out of range"),undefined):a.$array[a.$offset+f])*(b));e++;}};AF=function(){return new AE.ptr(AN.nil,0,0,new AO([]),AK.nil);};$pkg.NewCollision=AF;AE.ptr.prototype.HasTags=function(a){var a,b,c,d,e;b=this;c=b.Objects;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);if(e===b.checkingObject){d++;continue;}if(e.HasTags(a)){return true;}d++;}return false;};AE.prototype.HasTags=function(a){return this.$val.HasTags(a);};AE.ptr.prototype.ObjectsByTags=function(a){var a,b,c,d,e,f;b=this;c=new AO([]);d=b.Objects;e=0;while(true){if(!(e=d.$length)?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+e]);if(f===b.checkingObject){e++;continue;}if(f.HasTags(a)){c=$append(c,f);}e++;}return c;};AE.prototype.ObjectsByTags=function(a){return this.$val.ObjectsByTags(a);};AE.ptr.prototype.ContactWithObject=function(a){var a,b,c;b=this;c=new B([0,0]);if(b.dx<0){(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0]=a.X+a.W-b.checkingObject.X);}else if(b.dx>0){(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0]=a.X-b.checkingObject.W-b.checkingObject.X);}if(b.dy<0){(1>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+1]=a.Y+a.H-b.checkingObject.Y);}else if(b.dy>0){(1>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+1]=a.Y-b.checkingObject.H-b.checkingObject.Y);}return c;};AE.prototype.ContactWithObject=function(a){return this.$val.ContactWithObject(a);};AE.ptr.prototype.ContactWithCell=function(a){var a,b,c,d,e;b=this;c=new B([0,0]);d=(($imul(a.X,b.checkingObject.Space.CellWidth)));e=(($imul(a.Y,b.checkingObject.Space.CellHeight)));if(b.dx<0){(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0]=d+(b.checkingObject.Space.CellWidth)-b.checkingObject.X);}else if(b.dx>0){(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0]=d-b.checkingObject.W-b.checkingObject.X);}if(b.dy<0){(1>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+1]=e+(b.checkingObject.Space.CellHeight)-b.checkingObject.Y);}else if(b.dy>0){(1>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+1]=e-b.checkingObject.H-b.checkingObject.Y);}return c;};AE.prototype.ContactWithCell=function(a){return this.$val.ContactWithCell(a);};AE.ptr.prototype.SlideAgainstCell=function(a,b){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;c=this;d=c.checkingObject.Space;f=(e=c.Cells,(0>=e.$length?($throwRuntimeError("index out of range"),undefined):e.$array[e.$offset+0]));g=d.SpaceToWorld(f.X,f.Y);h=g[0];i=g[1];j=(d.CellWidth)/2;k=(d.CellHeight)/2;h=h+(j);i=i+(k);l=c.checkingObject.Center();m=l[0];n=l[1];o=m-h;p=n-i;q=d.Cell(f.X-1>>0,f.Y);r=d.Cell(f.X+1>>0,f.Y);s=d.Cell(f.X,f.Y-1>>0);t=d.Cell(f.X,f.Y+1>>0);u=new B([0,0]);if(!((c.dy===0))){if(o>0&&(r===AJ.nil||!r.ContainsTags(b))){(0>=u.$length?($throwRuntimeError("index out of range"),undefined):u.$array[u.$offset+0]=h+j-c.checkingObject.X);}else if(o<0&&(q===AJ.nil||!q.ContainsTags(b))){(0>=u.$length?($throwRuntimeError("index out of range"),undefined):u.$array[u.$offset+0]=h-j-(c.checkingObject.X+c.checkingObject.W));}else{return B.nil;}}if(!((c.dx===0))){if(p>0&&(t===AJ.nil||!t.ContainsTags(b))){(1>=u.$length?($throwRuntimeError("index out of range"),undefined):u.$array[u.$offset+1]=i+k-c.checkingObject.Y);}else if(p<0&&(s===AJ.nil||!s.ContainsTags(b))){(1>=u.$length?($throwRuntimeError("index out of range"),undefined):u.$array[u.$offset+1]=i-k-(c.checkingObject.Y+c.checkingObject.H));}else{return B.nil;}}return u;};AE.prototype.SlideAgainstCell=function(a,b){return this.$val.SlideAgainstCell(a,b);};AH=function(a,b){var a,b;return new AG.ptr(a,b,new AO([]));};AG.ptr.prototype.register=function(a){var a,b;b=this;if(!b.Contains(a)){b.Objects=$append(b.Objects,a);}};AG.prototype.register=function(a){return this.$val.register(a);};AG.ptr.prototype.unregister=function(a){var a,b,c,d,e,f,g,h,i;b=this;c=b.Objects;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);if(f===a){(i=b.Objects,((e<0||e>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+e]=(g=b.Objects,h=b.Objects.$length-1>>0,((h<0||h>=g.$length)?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+h]))));b.Objects=$subslice(b.Objects,0,(b.Objects.$length-1>>0));break;}d++;}};AG.prototype.unregister=function(a){return this.$val.unregister(a);};AG.ptr.prototype.Contains=function(a){var a,b,c,d,e;b=this;c=b.Objects;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);if(e===a){return true;}d++;}return false;};AG.prototype.Contains=function(a){return this.$val.Contains(a);};AG.ptr.prototype.ContainsTags=function(a){var a,b,c,d,e;b=this;c=b.Objects;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);if(e.HasTags(a)){return true;}d++;}return false;};AG.prototype.ContainsTags=function(a){return this.$val.ContainsTags(a);};AG.ptr.prototype.Occupied=function(){var a;a=this;return a.Objects.$length>0;};AG.prototype.Occupied=function(){return this.$val.Occupied();};B.methods=[{prop:"Clone",name:"Clone",pkg:"",typ:$funcType([],[B],false)},{prop:"Add",name:"Add",pkg:"",typ:$funcType([AP],[B],true)},{prop:"Sub",name:"Sub",pkg:"",typ:$funcType([AP],[B],true)},{prop:"Scale",name:"Scale",pkg:"",typ:$funcType([$Float64],[B],false)},{prop:"Equal",name:"Equal",pkg:"",typ:$funcType([B],[$Bool],false)},{prop:"Magnitude",name:"Magnitude",pkg:"",typ:$funcType([],[$Float64],false)},{prop:"Magnitude2",name:"Magnitude2",pkg:"",typ:$funcType([],[$Float64],false)},{prop:"Unit",name:"Unit",pkg:"",typ:$funcType([],[B],false)},{prop:"Dot",name:"Dot",pkg:"",typ:$funcType([B],[$Float64],false)},{prop:"Cross",name:"Cross",pkg:"",typ:$funcType([B],[B],false)},{prop:"Rotate",name:"Rotate",pkg:"",typ:$funcType([$Float64,AX],[B],true)},{prop:"X",name:"X",pkg:"",typ:$funcType([],[$Float64],false)},{prop:"Y",name:"Y",pkg:"",typ:$funcType([],[$Float64],false)},{prop:"Z",name:"Z",pkg:"",typ:$funcType([],[$Float64],false)}];AM.methods=[{prop:"Add",name:"Add",pkg:"",typ:$funcType([AO],[],true)},{prop:"Remove",name:"Remove",pkg:"",typ:$funcType([AO],[],true)},{prop:"Objects",name:"Objects",pkg:"",typ:$funcType([],[AO],false)},{prop:"Resize",name:"Resize",pkg:"",typ:$funcType([$Int,$Int],[],false)},{prop:"Cell",name:"Cell",pkg:"",typ:$funcType([$Int,$Int],[AJ],false)},{prop:"CheckCells",name:"CheckCells",pkg:"",typ:$funcType([$Int,$Int,$Int,$Int,AV],[AN],true)},{prop:"CheckCellsWorld",name:"CheckCellsWorld",pkg:"",typ:$funcType([$Float64,$Float64,$Float64,$Float64,AV],[AN],true)},{prop:"UnregisterAllObjects",name:"UnregisterAllObjects",pkg:"",typ:$funcType([],[],false)},{prop:"WorldToSpace",name:"WorldToSpace",pkg:"",typ:$funcType([$Float64,$Float64],[$Int,$Int],false)},{prop:"SpaceToWorld",name:"SpaceToWorld",pkg:"",typ:$funcType([$Int,$Int],[$Float64,$Float64],false)},{prop:"Height",name:"Height",pkg:"",typ:$funcType([],[$Int],false)},{prop:"Width",name:"Width",pkg:"",typ:$funcType([],[$Int],false)},{prop:"CellsInLine",name:"CellsInLine",pkg:"",typ:$funcType([$Int,$Int,$Int,$Int],[AK],false)}];AQ.methods=[{prop:"Project",name:"Project",pkg:"",typ:$funcType([B],[B],false)},{prop:"Normal",name:"Normal",pkg:"",typ:$funcType([],[B],false)},{prop:"Vector",name:"Vector",pkg:"",typ:$funcType([],[B],false)},{prop:"IntersectionPointsLine",name:"IntersectionPointsLine",pkg:"",typ:$funcType([AQ],[B],false)},{prop:"IntersectionPointsCircle",name:"IntersectionPointsCircle",pkg:"",typ:$funcType([AS],[AP],false)}];AT.methods=[{prop:"Clone",name:"Clone",pkg:"",typ:$funcType([],[P],false)},{prop:"AddPointsVec",name:"AddPointsVec",pkg:"",typ:$funcType([AP],[],true)},{prop:"AddPoints",name:"AddPoints",pkg:"",typ:$funcType([AI],[],true)},{prop:"Lines",name:"Lines",pkg:"",typ:$funcType([],[AR],false)},{prop:"Transformed",name:"Transformed",pkg:"",typ:$funcType([],[AP],false)},{prop:"Bounds",name:"Bounds",pkg:"",typ:$funcType([],[B,B],false)},{prop:"Position",name:"Position",pkg:"",typ:$funcType([],[$Float64,$Float64],false)},{prop:"SetPosition",name:"SetPosition",pkg:"",typ:$funcType([$Float64,$Float64],[],false)},{prop:"SetPositionVec",name:"SetPositionVec",pkg:"",typ:$funcType([B],[],false)},{prop:"Move",name:"Move",pkg:"",typ:$funcType([$Float64,$Float64],[],false)},{prop:"MoveVec",name:"MoveVec",pkg:"",typ:$funcType([B],[],false)},{prop:"Center",name:"Center",pkg:"",typ:$funcType([],[B],false)},{prop:"Project",name:"Project",pkg:"",typ:$funcType([B],[Z],false)},{prop:"SATAxes",name:"SATAxes",pkg:"",typ:$funcType([],[AP],false)},{prop:"PointInside",name:"PointInside",pkg:"",typ:$funcType([B],[$Bool],false)},{prop:"Intersection",name:"Intersection",pkg:"",typ:$funcType([$Float64,$Float64,P],[AU],false)},{prop:"calculateMTV",name:"calculateMTV",pkg:"resolv",typ:$funcType([AU,P],[B],false)},{prop:"ContainedBy",name:"ContainedBy",pkg:"",typ:$funcType([P],[$Bool],false)},{prop:"FlipH",name:"FlipH",pkg:"",typ:$funcType([],[],false)},{prop:"FlipV",name:"FlipV",pkg:"",typ:$funcType([],[],false)},{prop:"ReverseVertexOrder",name:"ReverseVertexOrder",pkg:"",typ:$funcType([],[],false)}];AU.methods=[{prop:"LeftmostPoint",name:"LeftmostPoint",pkg:"",typ:$funcType([],[B],false)},{prop:"RightmostPoint",name:"RightmostPoint",pkg:"",typ:$funcType([],[B],false)},{prop:"TopmostPoint",name:"TopmostPoint",pkg:"",typ:$funcType([],[B],false)},{prop:"BottommostPoint",name:"BottommostPoint",pkg:"",typ:$funcType([],[B],false)}];AS.methods=[{prop:"Clone",name:"Clone",pkg:"",typ:$funcType([],[P],false)},{prop:"Bounds",name:"Bounds",pkg:"",typ:$funcType([],[B,B],false)},{prop:"Intersection",name:"Intersection",pkg:"",typ:$funcType([$Float64,$Float64,P],[AU],false)},{prop:"Move",name:"Move",pkg:"",typ:$funcType([$Float64,$Float64],[],false)},{prop:"MoveVec",name:"MoveVec",pkg:"",typ:$funcType([B],[],false)},{prop:"SetPosition",name:"SetPosition",pkg:"",typ:$funcType([$Float64,$Float64],[],false)},{prop:"SetPositionVec",name:"SetPositionVec",pkg:"",typ:$funcType([B],[],false)},{prop:"Position",name:"Position",pkg:"",typ:$funcType([],[$Float64,$Float64],false)},{prop:"PointInside",name:"PointInside",pkg:"",typ:$funcType([B],[$Bool],false)},{prop:"IntersectionPointsCircle",name:"IntersectionPointsCircle",pkg:"",typ:$funcType([AS],[AP],false)}];Z.methods=[{prop:"Overlapping",name:"Overlapping",pkg:"",typ:$funcType([Z],[$Bool],false)},{prop:"Overlap",name:"Overlap",pkg:"",typ:$funcType([Z],[$Float64],false)},{prop:"IsInside",name:"IsInside",pkg:"",typ:$funcType([Z],[$Bool],false)}];AN.methods=[{prop:"Clone",name:"Clone",pkg:"",typ:$funcType([],[AN],false)},{prop:"Update",name:"Update",pkg:"",typ:$funcType([],[],false)},{prop:"AddTags",name:"AddTags",pkg:"",typ:$funcType([AV],[],true)},{prop:"RemoveTags",name:"RemoveTags",pkg:"",typ:$funcType([AV],[],true)},{prop:"HasTags",name:"HasTags",pkg:"",typ:$funcType([AV],[$Bool],true)},{prop:"Tags",name:"Tags",pkg:"",typ:$funcType([],[AV],false)},{prop:"SetShape",name:"SetShape",pkg:"",typ:$funcType([P],[],false)},{prop:"BoundsToSpace",name:"BoundsToSpace",pkg:"",typ:$funcType([$Float64,$Float64],[$Int,$Int,$Int,$Int],false)},{prop:"SharesCells",name:"SharesCells",pkg:"",typ:$funcType([AN],[$Bool],false)},{prop:"SharesCellsTags",name:"SharesCellsTags",pkg:"",typ:$funcType([AV],[$Bool],true)},{prop:"Center",name:"Center",pkg:"",typ:$funcType([],[$Float64,$Float64],false)},{prop:"SetCenter",name:"SetCenter",pkg:"",typ:$funcType([$Float64,$Float64],[],false)},{prop:"CellPosition",name:"CellPosition",pkg:"",typ:$funcType([],[$Int,$Int],false)},{prop:"SetRight",name:"SetRight",pkg:"",typ:$funcType([$Float64],[],false)},{prop:"SetBottom",name:"SetBottom",pkg:"",typ:$funcType([$Float64],[],false)},{prop:"Bottom",name:"Bottom",pkg:"",typ:$funcType([],[$Float64],false)},{prop:"Right",name:"Right",pkg:"",typ:$funcType([],[$Float64],false)},{prop:"SetBounds",name:"SetBounds",pkg:"",typ:$funcType([B,B],[],false)},{prop:"Check",name:"Check",pkg:"",typ:$funcType([$Float64,$Float64,AV],[AW],true)},{prop:"Overlaps",name:"Overlaps",pkg:"",typ:$funcType([AN],[$Bool],false)},{prop:"AddToIgnoreList",name:"AddToIgnoreList",pkg:"",typ:$funcType([AN],[],false)},{prop:"RemoveFromIgnoreList",name:"RemoveFromIgnoreList",pkg:"",typ:$funcType([AN],[],false)}];AW.methods=[{prop:"HasTags",name:"HasTags",pkg:"",typ:$funcType([AV],[$Bool],true)},{prop:"ObjectsByTags",name:"ObjectsByTags",pkg:"",typ:$funcType([AV],[AO],true)},{prop:"ContactWithObject",name:"ContactWithObject",pkg:"",typ:$funcType([AN],[B],false)},{prop:"ContactWithCell",name:"ContactWithCell",pkg:"",typ:$funcType([AJ],[B],false)},{prop:"SlideAgainstCell",name:"SlideAgainstCell",pkg:"",typ:$funcType([AJ,AV],[B],true)}];AJ.methods=[{prop:"register",name:"register",pkg:"resolv",typ:$funcType([AN],[],false)},{prop:"unregister",name:"unregister",pkg:"resolv",typ:$funcType([AN],[],false)},{prop:"Contains",name:"Contains",pkg:"",typ:$funcType([AN],[$Bool],false)},{prop:"ContainsTags",name:"ContainsTags",pkg:"",typ:$funcType([AV],[$Bool],true)},{prop:"Occupied",name:"Occupied",pkg:"",typ:$funcType([],[$Bool],false)}];B.init($Float64);N.init("",[{prop:"Cells",name:"Cells",embedded:false,exported:true,typ:AL,tag:""},{prop:"CellWidth",name:"CellWidth",embedded:false,exported:true,typ:$Int,tag:""},{prop:"CellHeight",name:"CellHeight",embedded:false,exported:true,typ:$Int,tag:""}]);P.init([{prop:"Bounds",name:"Bounds",pkg:"",typ:$funcType([],[B,B],false)},{prop:"Clone",name:"Clone",pkg:"",typ:$funcType([],[P],false)},{prop:"Intersection",name:"Intersection",pkg:"",typ:$funcType([$Float64,$Float64,P],[AU],false)},{prop:"Position",name:"Position",pkg:"",typ:$funcType([],[$Float64,$Float64],false)},{prop:"SetPosition",name:"SetPosition",pkg:"",typ:$funcType([$Float64,$Float64],[],false)}]);Q.init("",[{prop:"Start",name:"Start",embedded:false,exported:true,typ:B,tag:""},{prop:"End",name:"End",embedded:false,exported:true,typ:B,tag:""}]);S.init("",[{prop:"Points",name:"Points",embedded:false,exported:true,typ:AP,tag:""},{prop:"X",name:"X",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"Y",name:"Y",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"Closed",name:"Closed",embedded:false,exported:true,typ:$Bool,tag:""}]);U.init("",[{prop:"Points",name:"Points",embedded:false,exported:true,typ:AP,tag:""},{prop:"MTV",name:"MTV",embedded:false,exported:true,typ:B,tag:""},{prop:"Center",name:"Center",embedded:false,exported:true,typ:B,tag:""}]);X.init("",[{prop:"X",name:"X",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"Y",name:"Y",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"Radius",name:"Radius",embedded:false,exported:true,typ:$Float64,tag:""}]);Z.init("",[{prop:"Min",name:"Min",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"Max",name:"Max",embedded:false,exported:true,typ:$Float64,tag:""}]);AA.init("resolv",[{prop:"Shape",name:"Shape",embedded:false,exported:true,typ:P,tag:""},{prop:"Space",name:"Space",embedded:false,exported:true,typ:AM,tag:""},{prop:"X",name:"X",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"Y",name:"Y",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"W",name:"W",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"H",name:"H",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"TouchingCells",name:"TouchingCells",embedded:false,exported:true,typ:AK,tag:""},{prop:"Data",name:"Data",embedded:false,exported:true,typ:$emptyInterface,tag:""},{prop:"ignoreList",name:"ignoreList",embedded:false,exported:false,typ:AY,tag:""},{prop:"tags",name:"tags",embedded:false,exported:false,typ:AV,tag:""}]);AE.init("resolv",[{prop:"checkingObject",name:"checkingObject",embedded:false,exported:false,typ:AN,tag:""},{prop:"dx",name:"dx",embedded:false,exported:false,typ:$Float64,tag:""},{prop:"dy",name:"dy",embedded:false,exported:false,typ:$Float64,tag:""},{prop:"Objects",name:"Objects",embedded:false,exported:true,typ:AO,tag:""},{prop:"Cells",name:"Cells",embedded:false,exported:true,typ:AK,tag:""}]);AG.init("",[{prop:"X",name:"X",embedded:false,exported:true,typ:$Int,tag:""},{prop:"Y",name:"Y",embedded:false,exported:true,typ:$Int,tag:""},{prop:"Objects",name:"Objects",embedded:false,exported:true,typ:AO,tag:""}]);$init=function(){$pkg.$init=function(){};var $f,$c=false,$s=0,$r;if(this!==undefined&&this.$blk!==undefined){$f=this;$c=true;$s=$f.$s;$r=$f.$r;}s:while(true){switch($s){case 0:$r=A.$init();$s=1;case 1:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}}return;}if($f===undefined){$f={$blk:$init};}$f.$s=$s;$f.$r=$r;return $f;};$pkg.$init=$init;return $pkg;})(); -$packages["jsexport/battle"]=(function(){var $pkg={},$init,A,B,C,D,E,F,H,I,J,K,L,M,N,S,AJ,AK,AL,AM,AN,AO,AP,AQ,AR,AS,AT,AU,AV,AW,AX,AY,AZ,BA,BB,BC,BD,BE,BF,BG,BH,BI,P,O,Q,R,T,U,V,W,X,Y,Z,AA,AB,AC,AD,AE,AF,AG,AH,AI;A=$packages["math"];B=$packages["resolv"];C=$pkg.Vec2D=$newType(0,$kindStruct,"battle.Vec2D",true,"jsexport/battle",true,function(X_,Y_){this.$val=this;if(arguments.length===0){this.X=0;this.Y=0;return;}this.X=X_;this.Y=Y_;});D=$pkg.Polygon2D=$newType(0,$kindStruct,"battle.Polygon2D",true,"jsexport/battle",true,function(Anchor_,Points_){this.$val=this;if(arguments.length===0){this.Anchor=BE.nil;this.Points=BF.nil;return;}this.Anchor=Anchor_;this.Points=Points_;});E=$pkg.PlayerDownsync=$newType(0,$kindStruct,"battle.PlayerDownsync",true,"jsexport/battle",true,function(Id_,VirtualGridX_,VirtualGridY_,DirX_,DirY_,VelX_,VelY_,Speed_,BattleState_,JoinIndex_,ColliderRadius_,Removed_,Score_,LastMoveGmtMillis_,FramesToRecover_,Hp_,MaxHp_,CharacterState_,InAir_){this.$val=this;if(arguments.length===0){this.Id=0;this.VirtualGridX=0;this.VirtualGridY=0;this.DirX=0;this.DirY=0;this.VelX=0;this.VelY=0;this.Speed=0;this.BattleState=0;this.JoinIndex=0;this.ColliderRadius=0;this.Removed=false;this.Score=0;this.LastMoveGmtMillis=0;this.FramesToRecover=0;this.Hp=0;this.MaxHp=0;this.CharacterState=0;this.InAir=false;return;}this.Id=Id_;this.VirtualGridX=VirtualGridX_;this.VirtualGridY=VirtualGridY_;this.DirX=DirX_;this.DirY=DirY_;this.VelX=VelX_;this.VelY=VelY_;this.Speed=Speed_;this.BattleState=BattleState_;this.JoinIndex=JoinIndex_;this.ColliderRadius=ColliderRadius_;this.Removed=Removed_;this.Score=Score_;this.LastMoveGmtMillis=LastMoveGmtMillis_;this.FramesToRecover=FramesToRecover_;this.Hp=Hp_;this.MaxHp=MaxHp_;this.CharacterState=CharacterState_;this.InAir=InAir_;});F=$pkg.InputFrameDecoded=$newType(0,$kindStruct,"battle.InputFrameDecoded",true,"jsexport/battle",true,function(Dx_,Dy_,BtnALevel_,BtnBLevel_){this.$val=this;if(arguments.length===0){this.Dx=0;this.Dy=0;this.BtnALevel=0;this.BtnBLevel=0;return;}this.Dx=Dx_;this.Dy=Dy_;this.BtnALevel=BtnALevel_;this.BtnBLevel=BtnBLevel_;});H=$pkg.Barrier=$newType(0,$kindStruct,"battle.Barrier",true,"jsexport/battle",true,function(Boundary_){this.$val=this;if(arguments.length===0){this.Boundary=BG.nil;return;}this.Boundary=Boundary_;});I=$pkg.Bullet=$newType(0,$kindStruct,"battle.Bullet",true,"jsexport/battle",true,function(BattleLocalId_,StartupFrames_,ActiveFrames_,RecoveryFrames_,RecoveryFramesOnBlock_,RecoveryFramesOnHit_,HitboxOffset_,OriginatedRenderFrameId_,HitStunFrames_,BlockStunFrames_,Pushback_,ReleaseTriggerType_,Damage_,OffenderJoinIndex_,OffenderPlayerId_,SelfMoveforwardX_,SelfMoveforwardY_,HitboxSizeX_,HitboxSizeY_){this.$val=this;if(arguments.length===0){this.BattleLocalId=0;this.StartupFrames=0;this.ActiveFrames=0;this.RecoveryFrames=0;this.RecoveryFramesOnBlock=0;this.RecoveryFramesOnHit=0;this.HitboxOffset=0;this.OriginatedRenderFrameId=0;this.HitStunFrames=0;this.BlockStunFrames=0;this.Pushback=0;this.ReleaseTriggerType=0;this.Damage=0;this.OffenderJoinIndex=0;this.OffenderPlayerId=0;this.SelfMoveforwardX=0;this.SelfMoveforwardY=0;this.HitboxSizeX=0;this.HitboxSizeY=0;return;}this.BattleLocalId=BattleLocalId_;this.StartupFrames=StartupFrames_;this.ActiveFrames=ActiveFrames_;this.RecoveryFrames=RecoveryFrames_;this.RecoveryFramesOnBlock=RecoveryFramesOnBlock_;this.RecoveryFramesOnHit=RecoveryFramesOnHit_;this.HitboxOffset=HitboxOffset_;this.OriginatedRenderFrameId=OriginatedRenderFrameId_;this.HitStunFrames=HitStunFrames_;this.BlockStunFrames=BlockStunFrames_;this.Pushback=Pushback_;this.ReleaseTriggerType=ReleaseTriggerType_;this.Damage=Damage_;this.OffenderJoinIndex=OffenderJoinIndex_;this.OffenderPlayerId=OffenderPlayerId_;this.SelfMoveforwardX=SelfMoveforwardX_;this.SelfMoveforwardY=SelfMoveforwardY_;this.HitboxSizeX=HitboxSizeX_;this.HitboxSizeY=HitboxSizeY_;});J=$pkg.MeleeBullet=$newType(0,$kindStruct,"battle.MeleeBullet",true,"jsexport/battle",true,function(Bullet_){this.$val=this;if(arguments.length===0){this.Bullet=new I.ptr(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);return;}this.Bullet=Bullet_;});K=$pkg.FireballBullet=$newType(0,$kindStruct,"battle.FireballBullet",true,"jsexport/battle",true,function(VirtualGridX_,VirtualGridY_,DirX_,DirY_,VelX_,VelY_,Speed_,Bullet_){this.$val=this;if(arguments.length===0){this.VirtualGridX=0;this.VirtualGridY=0;this.DirX=0;this.DirY=0;this.VelX=0;this.VelY=0;this.Speed=0;this.Bullet=new I.ptr(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);return;}this.VirtualGridX=VirtualGridX_;this.VirtualGridY=VirtualGridY_;this.DirX=DirX_;this.DirY=DirY_;this.VelX=VelX_;this.VelY=VelY_;this.Speed=Speed_;this.Bullet=Bullet_;});L=$pkg.RoomDownsyncFrame=$newType(0,$kindStruct,"battle.RoomDownsyncFrame",true,"jsexport/battle",true,function(Id_,PlayersArr_,CountdownNanos_,MeleeBullets_,FireballBullets_,BackendUnconfirmedMask_,ShouldForceResync_,PlayerOpPatternToSkillId_){this.$val=this;if(arguments.length===0){this.Id=0;this.PlayersArr=AW.nil;this.CountdownNanos=new $Int64(0,0);this.MeleeBullets=AX.nil;this.FireballBullets=BC.nil;this.BackendUnconfirmedMask=new $Uint64(0,0);this.ShouldForceResync=false;this.PlayerOpPatternToSkillId=false;return;}this.Id=Id_;this.PlayersArr=PlayersArr_;this.CountdownNanos=CountdownNanos_;this.MeleeBullets=MeleeBullets_;this.FireballBullets=FireballBullets_;this.BackendUnconfirmedMask=BackendUnconfirmedMask_;this.ShouldForceResync=ShouldForceResync_;this.PlayerOpPatternToSkillId=PlayerOpPatternToSkillId_;});M=$pkg.InputFrameDownsync=$newType(0,$kindStruct,"battle.InputFrameDownsync",true,"jsexport/battle",true,function(InputFrameId_,InputList_,ConfirmedList_){this.$val=this;if(arguments.length===0){this.InputFrameId=0;this.InputList=AV.nil;this.ConfirmedList=new $Uint64(0,0);return;}this.InputFrameId=InputFrameId_;this.InputList=InputList_;this.ConfirmedList=ConfirmedList_;});N=$pkg.RingBuffer=$newType(0,$kindStruct,"battle.RingBuffer",true,"jsexport/battle",true,function(Ed_,St_,EdFrameId_,StFrameId_,N_,Cnt_,Eles_){this.$val=this;if(arguments.length===0){this.Ed=0;this.St=0;this.EdFrameId=0;this.StFrameId=0;this.N=0;this.Cnt=0;this.Eles=AL.nil;return;}this.Ed=Ed_;this.St=St_;this.EdFrameId=EdFrameId_;this.StFrameId=StFrameId_;this.N=N_;this.Cnt=Cnt_;this.Eles=Eles_;});S=$pkg.SatResult=$newType(0,$kindStruct,"battle.SatResult",true,"jsexport/battle",true,function(Overlap_,OverlapX_,OverlapY_,AContainedInB_,BContainedInA_,Axis_){this.$val=this;if(arguments.length===0){this.Overlap=0;this.OverlapX=0;this.OverlapY=0;this.AContainedInB=false;this.BContainedInA=false;this.Axis=B.Vector.nil;return;}this.Overlap=Overlap_;this.OverlapX=OverlapX_;this.OverlapY=OverlapY_;this.AContainedInB=AContainedInB_;this.BContainedInA=BContainedInA_;this.Axis=Axis_;});AJ=$sliceType($Int32);AK=$sliceType(AJ);AL=$sliceType($emptyInterface);AM=$ptrType(S);AN=$sliceType(C);AO=$sliceType($String);AP=$ptrType(B.Collision);AQ=$ptrType(AN);AR=$ptrType(E);AS=$ptrType(J);AT=$ptrType(B.ConvexPolygon);AU=$ptrType(M);AV=$sliceType($Uint64);AW=$sliceType(AR);AX=$sliceType(AS);AY=$sliceType(AQ);AZ=$ptrType(B.Object);BA=$sliceType(AZ);BB=$ptrType(K);BC=$sliceType(BB);BD=$sliceType($Float64);BE=$ptrType(C);BF=$sliceType(BE);BG=$ptrType(D);BH=$mapType($Int,$Int);BI=$ptrType(N);O=function(a){var a;return new N.ptr(0,0,0,0,a,0,$makeSlice(AL,a));};$pkg.NewRingBuffer=O;N.ptr.prototype.Put=function(a){var a,b,c,d;b=this;while(true){if(!(0=b.N)){break;}b.Pop();}(c=b.Eles,d=b.Ed,((d<0||d>=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]=a));b.EdFrameId=b.EdFrameId+(1)>>0;b.Cnt=b.Cnt+(1)>>0;b.Ed=b.Ed+(1)>>0;if(b.Ed>=b.N){b.Ed=b.Ed-(b.N)>>0;}};N.prototype.Put=function(a){return this.$val.Put(a);};N.ptr.prototype.Pop=function(){var a,b,c,d;a=this;if(0===a.Cnt){return $ifaceNil;}d=(b=a.Eles,c=a.St,((c<0||c>=b.$length)?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+c]));a.StFrameId=a.StFrameId+(1)>>0;a.Cnt=a.Cnt-(1)>>0;a.St=a.St+(1)>>0;if(a.St>=a.N){a.St=a.St-(a.N)>>0;}return d;};N.prototype.Pop=function(){return this.$val.Pop();};N.ptr.prototype.GetArrIdxByOffset=function(a){var a,b,c;b=this;if((0===b.Cnt)||0>a){return-1;}c=b.St+a>>0;if(b.St=b.N){c=c-(b.N)>>0;}if(c>=b.St||c=d.$length)?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+c]));};N.prototype.GetByOffset=function(a){return this.$val.GetByOffset(a);};N.ptr.prototype.GetByFrameId=function(a){var a,b;b=this;if(a>=b.EdFrameId||a>0);};N.prototype.GetByFrameId=function(a){return this.$val.GetByFrameId(a);};N.ptr.prototype.SetByFrameId=function(a,b){var a,b,c,d,e,f,g,h,i,j,k,l,m,n;c=this;d=c.StFrameId;e=c.EdFrameId;f=d;g=e;if(bb){h=c.GetArrIdxByOffset(b-c.StFrameId>>0);if(!((-1===h))){(i=c.Eles,((h<0||h>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+h]=a));return[0,f,g];}}j=0;if(g>0))>>$min(c,31))>>0);};$pkg.ConvertToInputFrameId=Q;R=function(a){var a,b,c,d,e,f,g,h;b=new $Uint64(a.$high&0,(a.$low&15)>>>0);d=(((c=$shiftRightUint64(a,4),new $Uint64(c.$high&0,(c.$low&1)>>>0)).$low>>0));f=(((e=$shiftRightUint64(a,5),new $Uint64(e.$high&0,(e.$low&1)>>>0)).$low>>0));return new F.ptr((g=(($flatten64(b)<0||$flatten64(b)>=$pkg.DIRECTION_DECODER.$length)?($throwRuntimeError("index out of range"),undefined):$pkg.DIRECTION_DECODER.$array[$pkg.DIRECTION_DECODER.$offset+$flatten64(b)]),(0>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+0])),(h=(($flatten64(b)<0||$flatten64(b)>=$pkg.DIRECTION_DECODER.$length)?($throwRuntimeError("index out of range"),undefined):$pkg.DIRECTION_DECODER.$array[$pkg.DIRECTION_DECODER.$offset+$flatten64(b)]),(1>=h.$length?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+1])),d,f);};T=function(a,b,c,d){var{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,$s,$deferred,$r,$c}=$restore(this,{a,b,c,d});$s=$s||0;var $err=null;try{s:while(true){switch($s){case 0:$deferred=[];$curGoroutine.deferStack.push($deferred);c=[c];e=[e];f=[f];g=c[0].Position();e[0]=g[0];f[0]=g[1];$deferred.push([(function(c,e,f){return function(){c[0].SetPosition(e[0],f[0]);};})(c,e,f),[]]);c[0].SetPosition(e[0]+a,f[0]+b);h=new S.ptr(0,0,0,true,true,new B.Vector([0,0]));i=U(c[0],d,h);if(i){$s=1;continue;}$s=2;continue;case 1:j=h.Overlap*h.OverlapX;k=h.Overlap*h.OverlapY;l=j;m=k;n=[true,l,m,h];$s=4;case 4:return n;case 2:o=[false,0,0,h];$s=5;case 5:return o;case 3:$s=-1;return[false,0,0,AM.nil];}return;}}catch(err){$err=err;$s=-1;return[false,0,0,AM.nil];}finally{$callDeferred($deferred,$err);if($curGoroutine.asleep){var $f={$blk:T,$c:true,$r,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,$s,$deferred};return $f;}}};$pkg.CalcPushbacks=T;U=function(a,b,c){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;d=a.Points.$length;e=b.Points.$length;f=d;g=e;if((1===f)&&(1===g)){if(!(AM.nil===c)){c.Overlap=0;}return((h=(i=a.Points,(0>=i.$length?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+0])),(0>=h.$length?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+0]))===(j=(k=b.Points,(0>=k.$length?($throwRuntimeError("index out of range"),undefined):k.$array[k.$offset+0])),(0>=j.$length?($throwRuntimeError("index out of range"),undefined):j.$array[j.$offset+0])))&&((l=(m=a.Points,(0>=m.$length?($throwRuntimeError("index out of range"),undefined):m.$array[m.$offset+0])),(1>=l.$length?($throwRuntimeError("index out of range"),undefined):l.$array[l.$offset+1]))===(n=(o=b.Points,(0>=o.$length?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+0])),(1>=n.$length?($throwRuntimeError("index out of range"),undefined):n.$array[n.$offset+1])));}if(1=p.$length)?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+q]);if(V(a,b,r.Unit(),c)){return false;}q++;}}if(1=s.$length)?($throwRuntimeError("index out of range"),undefined):s.$array[s.$offset+t]);if(V(a,b,u.Unit(),c)){return false;}t++;}}return true;};V=function(a,b,c,d){var a,aa,ab,ac,ad,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z;e=1.7e+308;f=-1.7e+308;g=1.7e+308;h=-1.7e+308;i=e;j=f;k=g;l=h;m=a.Points;n=0;while(true){if(!(n=m.$length)?($throwRuntimeError("index out of range"),undefined):m.$array[m.$offset+n]);p=((0>=o.$length?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+0])+a.X)*(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0])+((1>=o.$length?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+1])+a.Y)*(1>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+1]);if(i>p){i=p;}if(j=q.$length)?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+r]);t=((0>=s.$length?($throwRuntimeError("index out of range"),undefined):s.$array[s.$offset+0])+b.X)*(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0])+((1>=s.$length?($throwRuntimeError("index out of range"),undefined):s.$array[s.$offset+1])+b.Y)*(1>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+1]);if(k>t){k=t;}if(ll||jl){u=i-l;d.AContainedInB=false;}else{x=j-k;y=l-i;if(x=ab.$length?($throwRuntimeError("index out of range"),undefined):ab.$array[ab.$offset+0])))&&(0===(ac=d.Axis,(1>=ac.$length?($throwRuntimeError("index out of range"),undefined):ac.$array[ac.$offset+1]))))||z>aa){ad=1;if(u<0){ad=-1;}d.Overlap=aa;d.OverlapX=(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0])*ad;d.OverlapY=(1>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+1])*ad;}d.Axis=c;}return false;};W=function(a,b,c){var a,b,c,d,e;d=((A.Floor(a*c)>>0));e=((A.Floor(b*c)>>0));return[d,e];};$pkg.WorldToVirtualGridPos=W;X=function(a,b,c){var a,b,c,d,e;d=(a)*c;e=(b)*c;return[d,e];};$pkg.VirtualGridToWorldPos=X;Y=function(a,b,c,d,e,f,g,h,i,j){var a,b,c,d,e,f,g,h,i,j;return[a-c-g+i,b-d-f+j];};$pkg.WorldToPolygonColliderBLPos=Y;Z=function(a,b,c,d,e,f,g,h,i,j){var a,b,c,d,e,f,g,h,i,j;return[a+c+g-i,b+d+f-j];};$pkg.PolygonColliderBLToWorldPos=Z;AA=function(a,b,c,d,e,f,g,h,i,j,k){var a,b,c,d,e,f,g,h,i,j,k,l,m,n;l=Z(a,b,c,d,e,f,g,h,i,j);m=l[0];n=l[1];return W(m,n,k);};$pkg.PolygonColliderBLToVirtualGridPos=AA;AB=function(a,b,c,d,e,f,g,h,i,j,k){var a,b,c,d,e,f,g,h,i,j,k,l,m,n;l=X(a,b,k);m=l[0];n=l[1];return Y(m,n,c,d,e,f,g,h,i,j);};$pkg.VirtualGridToPolygonColliderBLPos=AB;AC=function(a,b,c,d,e){var{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,$s,$r,$c}=$restore(this,{a,b,c,d,e});$s=$s||0;s:while(true){switch($s){case 0:f=[f];f[0]=$makeSlice(AN,0,10);g=b.Check(0,0,new AO([]));if(AP.nil===g){$s=-1;return(f.$ptr||(f.$ptr=new AQ(function(){return this.$target[0];},function($v){this.$target[0]=$v;},f)));}h=g.Objects;i=0;case 1:if(!(i=h.$length)?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+i]);k=false;l=j.Data;if($assertType(l,AR,true)[1]){}else if($assertType(l,AS,true)[1]){}else{k=true;}if(!k){i++;$s=1;continue;}m=$assertType(j.Shape,AT);o=T(0,0,c,m);$s=3;case 3:if($c){$c=false;o=o.$blk();}if(o&&o.$blk!==undefined){break s;}n=o;p=n[0];q=n[1];r=n[2];s=n[3];if(!p){i++;$s=1;continue;}t=(s.Overlap-d)*s.OverlapX;u=(s.Overlap-d)*s.OverlapY;q=t;r=u;f[0]=$append(f[0],new C.ptr(s.OverlapX,s.OverlapY));e.X=e.X+(q);e.Y=e.Y+(r);i++;$s=1;continue;case 2:$s=-1;return(f.$ptr||(f.$ptr=new AQ(function(){return this.$target[0];},function($v){this.$target[0]=$v;},f)));}return;}var $f={$blk:AC,$c:true,$r,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,$s};return $f;};AD=function(a,b,c,d,e,f){var a,aa,ab,ac,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z;g=Q(c.Id,e,f);h=Q(c.Id-1>>0,e,f);if(0>=g){return[-2,false,0,0];}i=$assertType(d.GetByFrameId(g),AU).InputList;j=AV.nil;if(0>0,((m<0||m>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+m])));o=n.Dx;p=n.Dy;q=o;r=p;s=0;t=0;u=s;v=t;if(!(AV.nil===j)){x=R((w=l-1>>0,((w<0||w>=j.$length)?($throwRuntimeError("index out of range"),undefined):j.$array[j.$offset+w])));u=x.BtnALevel;v=x.BtnBLevel;}if(n.BtnBLevel>v){y=false;if((4===a.CharacterState)||(5===a.CharacterState)||(6===a.CharacterState)){y=true;}z=false;if((0===a.CharacterState)||(1===a.CharacterState)||(4===a.CharacterState)){z=true;}if(!y&&z){k=true;}}aa=-1;if(n.BtnALevel>u){aa=0;ab=0;ac=0;q=ab;r=ac;}return[aa,k,q,r];};AE=function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){var{a,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,al,am,an,ao,ap,aq,ar,as,at,au,av,aw,ax,ay,az,b,ba,bb,bc,bd,be,bf,bg,bh,bi,bj,bk,bl,bm,bn,bo,bp,bq,br,bs,bt,bu,bv,bw,bx,by,bz,c,ca,cb,cc,cd,ce,cf,cg,ch,ci,cj,ck,cl,cm,cn,co,cp,cq,cr,cs,ct,cu,cv,cw,cx,cy,cz,d,da,db,dc,dd,de,df,dg,dh,di,dj,dk,dl,dm,dn,dp,dq,dr,ds,dt,du,dv,dw,dx,dy,dz,e,ea,eb,ec,ed,ee,ef,eg,eh,ei,ej,ek,el,em,en,eo,ep,eq,er,es,et,eu,ev,ew,ex,ey,ez,f,fa,fb,fc,fd,fe,ff,fg,fh,fi,fj,fk,fl,fm,fn,fo,fp,fq,fr,fs,ft,fu,fv,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,$s,$r,$c}=$restore(this,{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p});$s=$s||0;s:while(true){switch($s){case 0:q=b.PlayersArr.$length;r=$makeSlice(AW,q);s=b.PlayersArr;t=0;while(true){if(!(t=s.$length)?($throwRuntimeError("index out of range"),undefined):s.$array[s.$offset+t]);((u<0||u>=r.$length)?($throwRuntimeError("index out of range"),undefined):r.$array[r.$offset+u]=new E.ptr(v.Id,v.VirtualGridX,v.VirtualGridY,v.DirX,v.DirY,v.VelX,v.VelY,v.Speed,v.BattleState,v.JoinIndex,0,v.Removed,v.Score,0,v.FramesToRecover-1>>0,v.Hp,v.MaxHp,v.CharacterState,true));if(((u<0||u>=r.$length)?($throwRuntimeError("index out of range"),undefined):r.$array[r.$offset+u]).FramesToRecover<0){((u<0||u>=r.$length)?($throwRuntimeError("index out of range"),undefined):r.$array[r.$offset+u]).FramesToRecover=0;}t++;}w=$makeSlice(AX,0,b.MeleeBullets.$length);x=$makeSlice(AN,q);y=$makeSlice(AY,q);z=b.PlayersArr;aa=0;while(true){if(!(aa=z.$length)?($throwRuntimeError("index out of range"),undefined):z.$array[z.$offset+aa]);ae=((ac<0||ac>=r.$length)?($throwRuntimeError("index out of range"),undefined):r.$array[r.$offset+ac]);af=AD(ad,ae,b,a,h,i);ag=af[0];ah=af[1];ai=af[2];aj=af[3];if(-2===ag){aa++;continue;}if(ah){ae.VelY=g;ae.VirtualGridY=ae.VirtualGridY+(g)>>0;}ak=ad.JoinIndex;if(!((-1===ag))){al=(am=p[$Int.keyFor(((((ak>>0))<<8>>0))+ag>>0)],am!==undefined?[am.v,true]:[0,false]);an=al[0];ao=al[1];if(ao){aq=$assertType((ap=P[$Int.keyFor(an)],ap!==undefined?ap.v:$ifaceNil),AS);ab[0]=$clone(aq,J);ab[0].Bullet.OffenderJoinIndex=ak;ab[0].Bullet.OffenderPlayerId=ad.Id;ab[0].Bullet.OriginatedRenderFrameId=b.Id;w=$append(w,ab[0]);ae.FramesToRecover=ab[0].Bullet.RecoveryFrames;ae.CharacterState=2;if(false===ad.InAir){ae.VelX=0;}}aa++;continue;}if(!((0===ai))||!((0===aj))){ar=ai;as=aj;ae.DirX=ar;ae.DirY=as;ae.VelX=$imul(ai,ad.Speed);ae.CharacterState=1;}else{ae.CharacterState=0;ae.VelX=0;}aa++;}at=b.PlayersArr;au=0;case 1:if(!(au=at.$length)?($throwRuntimeError("index out of range"),undefined):at.$array[at.$offset+au]);ax=aw.JoinIndex;ay=0;az=0;(ba=ax-1>>0,((ba<0||ba>=x.$length)?($throwRuntimeError("index out of range"),undefined):x.$array[x.$offset+ba])).X=ay;(bb=ax-1>>0,((bb<0||bb>=x.$length)?($throwRuntimeError("index out of range"),undefined):x.$array[x.$offset+bb])).Y=az;bc=131072+ax>>0;be=(bd=d[$Int32.keyFor(bc)],bd!==undefined?bd.v:AZ.nil);bf=((av<0||av>=r.$length)?($throwRuntimeError("index out of range"),undefined):r.$array[r.$offset+av]);bg=aw.VirtualGridX+aw.VelX>>0;bh=aw.VirtualGridY+aw.VelY>>0;bi=bg;bj=bh;bk=AB(bi,bj,be.W*0.5,be.H*0.5,0,0,0,0,j,k,o);be.X=bk[0];be.Y=bk[1];$r=be.Update();$s=3;case 3:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}if(aw.InAir){bf.VelX=bf.VelX+(e)>>0;bf.VelY=bf.VelY+(f)>>0;}au++;$s=1;continue;case 2:bl=$makeSlice(BA,0,b.MeleeBullets.$length);bm=b.MeleeBullets;bn=0;case 4:if(!(bn=bm.$length)?($throwRuntimeError("index out of range"),undefined):bm.$array[bm.$offset+bn]);if(((bo.Bullet.OriginatedRenderFrameId+bo.Bullet.StartupFrames>>0)<=b.Id)&&(((bo.Bullet.OriginatedRenderFrameId+bo.Bullet.StartupFrames>>0)+bo.Bullet.ActiveFrames>>0)>b.Id)){$s=6;continue;}$s=7;continue;case 6:br=(bp=b.PlayersArr,bq=bo.Bullet.OffenderJoinIndex-1>>0,((bq<0||bq>=bp.$length)?($throwRuntimeError("index out of range"),undefined):bp.$array[bp.$offset+bq]));bs=1;if(0>br.DirX){bs=-1;}bt=X(br.VirtualGridX,br.VirtualGridY,o);bu=bt[0];bv=bt[1];bw=bu+bs*bo.Bullet.HitboxOffset;bx=bv;by=bw;bz=bx;ca=AF(by,bz,bo.Bullet.HitboxSizeX,bo.Bullet.HitboxSizeY,l,l,l,l,j,k,bo,"MeleeBullet");$s=9;case 9:if($c){$c=false;ca=ca.$blk();}if(ca&&ca.$blk!==undefined){break s;}cb=ca;$r=c.Add(new BA([cb]));$s=10;case 10:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}bl=$append(bl,cb);$s=8;continue;case 7:w=$append(w,bo);case 8:bn++;$s=4;continue;case 5:cc=b.PlayersArr;cd=0;case 11:if(!(cd=cc.$length)?($throwRuntimeError("index out of range"),undefined):cc.$array[cc.$offset+cd]);cg=cf.JoinIndex;ch=131072+cg>>0;cj=(ci=d[$Int32.keyFor(ch)],ci!==undefined?ci.v:AZ.nil);ck=$assertType(cj.Shape,AT);cm=AC(cg,cj,ck,l,(cl=cg-1>>0,((cl<0||cl>=x.$length)?($throwRuntimeError("index out of range"),undefined):x.$array[x.$offset+cl])));$s=13;case 13:if($c){$c=false;cm=cm.$blk();}if(cm&&cm.$blk!==undefined){break s;}(cn=cg-1>>0,((cn<0||cn>=y.$length)?($throwRuntimeError("index out of range"),undefined):y.$array[y.$offset+cn]=cm));co=((ce<0||ce>=r.$length)?($throwRuntimeError("index out of range"),undefined):r.$array[r.$offset+ce]);cp=false;cq=cj.Check(0,0,new AO([]));if(!(AP.nil===cq)){$s=14;continue;}$s=15;continue;case 14:cr=cq.Objects;cs=0;case 16:if(!(cs=cr.$length)?($throwRuntimeError("index out of range"),undefined):cr.$array[cr.$offset+cs]);cu=false;cv=false;cw=false;cx=cu;cy=cv;cz=cw;da=ct.Data;if($assertType(da,AR,true)[1]){cy=true;}else if($assertType(da,AS,true)[1]){cz=true;}else{cx=true;}if(cz){cs++;$s=16;continue;}db=$assertType(ct.Shape,AT);dd=T(0,0,ck,db);$s=18;case 18:if($c){$c=false;dd=dd.$blk();}if(dd&&dd.$blk!==undefined){break s;}dc=dd;de=dc[0];df=dc[1];dg=dc[2];dh=dc[3];if(!de){cs++;$s=16;continue;}di=dh.OverlapX*0+dh.OverlapY*-1;if(cy){dj=(dh.Overlap-l*2)*dh.OverlapX;dk=(dh.Overlap-l*2)*dh.OverlapY;df=dj;dg=dk;}dl=(dm=cg-1>>0,((dm<0||dm>=y.$length)?($throwRuntimeError("index out of range"),undefined):y.$array[y.$offset+dm])).$get();dn=0;while(true){if(!(dn=dl.$length)?($throwRuntimeError("index out of range"),undefined):dl.$array[dl.$offset+dn]),C);dq=df*dp.X+dg*dp.Y;if(cx||(cy&&0>dq)){df=df-(dq*dp.X);dg=dg-(dq*dp.Y);}dn++;}dr=cg-1>>0;((dr<0||dr>=x.$length)?($throwRuntimeError("index out of range"),undefined):x.$array[x.$offset+dr]).X=((dr<0||dr>=x.$length)?($throwRuntimeError("index out of range"),undefined):x.$array[x.$offset+dr]).X+(df);ds=cg-1>>0;((ds<0||ds>=x.$length)?($throwRuntimeError("index out of range"),undefined):x.$array[x.$offset+ds]).Y=((ds<0||ds>=x.$length)?($throwRuntimeError("index out of range"),undefined):x.$array[x.$offset+ds]).Y+(dg);if(m=cf.VelY){co.VelX=0;co.VelY=0;co.CharacterState=0;co.FramesToRecover=0;}}if(cf.InAir){dt=co.CharacterState;du=dt;if((du===(0))||(du===(1))){co.CharacterState=4;}else if(du===(2)){co.CharacterState=5;}else if(du===(3)){co.CharacterState=6;}}cd++;$s=11;continue;case 12:dv=bl;dw=0;case 19:if(!(dw=dv.$length)?($throwRuntimeError("index out of range"),undefined):dv.$array[dv.$offset+dw]);dy=$assertType(dx.Data,AS);dz=$assertType(dx.Shape,AT);ea=dx.Check(0,0,new AO([]));dx.Space.Remove(new BA([dx]));if(AP.nil===ea){w=$append(w,dy);dw++;$s=19;continue;}ed=(eb=b.PlayersArr,ec=dy.Bullet.OffenderJoinIndex-1>>0,((ec<0||ec>=eb.$length)?($throwRuntimeError("index out of range"),undefined):eb.$array[eb.$offset+ec]));ee=ea.Objects;ef=0;case 21:if(!(ef=ee.$length)?($throwRuntimeError("index out of range"),undefined):ee.$array[ee.$offset+ef]);eh=$assertType(eg.Shape,AT);ei=eg.Data;if($assertType(ei,AR,true)[1]){$s=23;continue;}$s=24;continue;case 23:ej=ei.$val;if(dy.Bullet.OffenderPlayerId===ej.Id){ef++;$s=21;continue;}em=T(0,0,dz,eh);$s=26;case 26:if($c){$c=false;em=em.$blk();}if(em&&em.$blk!==undefined){break s;}el=em;en=el[0];if(!en){ef++;$s=21;continue;}eo=ej.JoinIndex;ep=1;if(0>ed.DirX){ep=-1;}eq=-ep*dy.Bullet.Pushback;er=0;es=eq;et=er;eu=(ev=eo-1>>0,((ev<0||ev>=y.$length)?($throwRuntimeError("index out of range"),undefined):y.$array[y.$offset+ev])).$get();ew=0;while(true){if(!(ew=eu.$length)?($throwRuntimeError("index out of range"),undefined):eu.$array[eu.$offset+ew]),C);ey=es*ex.X+et*ex.Y;if(0>ey){es=es-(ey*ex.X);et=et-(ey*ex.Y);}ew++;}ez=eo-1>>0;((ez<0||ez>=x.$length)?($throwRuntimeError("index out of range"),undefined):x.$array[x.$offset+ez]).X=((ez<0||ez>=x.$length)?($throwRuntimeError("index out of range"),undefined):x.$array[x.$offset+ez]).X+(es);fa=eo-1>>0;((fa<0||fa>=x.$length)?($throwRuntimeError("index out of range"),undefined):x.$array[x.$offset+fa]).Y=((fa<0||fa>=x.$length)?($throwRuntimeError("index out of range"),undefined):x.$array[x.$offset+fa]).Y+(et);fb=(fc=b.PlayersArr,fd=ej.JoinIndex-1>>0,((fd<0||fd>=fc.$length)?($throwRuntimeError("index out of range"),undefined):fc.$array[fc.$offset+fd]));fe=(ff=ej.JoinIndex-1>>0,((ff<0||ff>=r.$length)?($throwRuntimeError("index out of range"),undefined):r.$array[r.$offset+ff]));fg=fb;fh=fe;fh.CharacterState=3;if(fg.InAir){fh.CharacterState=6;}fj=(fi=ej.JoinIndex-1>>0,((fi<0||fi>=r.$length)?($throwRuntimeError("index out of range"),undefined):r.$array[r.$offset+fi])).FramesToRecover;if(dy.Bullet.HitStunFrames>fj){fh.FramesToRecover=dy.Bullet.HitStunFrames;}$s=25;continue;case 24:ek=ei;case 25:ef++;$s=21;continue;case 22:dw++;$s=19;continue;case 20:fk=b.PlayersArr;fl=0;while(true){if(!(fl=fk.$length)?($throwRuntimeError("index out of range"),undefined):fk.$array[fk.$offset+fl]);fo=fn.JoinIndex;fp=131072+fo>>0;fr=(fq=d[$Int32.keyFor(fp)],fq!==undefined?fq.v:AZ.nil);fs=((fm<0||fm>=r.$length)?($throwRuntimeError("index out of range"),undefined):r.$array[r.$offset+fm]);ft=AA(fr.X-(fu=fo-1>>0,((fu<0||fu>=x.$length)?($throwRuntimeError("index out of range"),undefined):x.$array[x.$offset+fu])).X,fr.Y-(fv=fo-1>>0,((fv<0||fv>=x.$length)?($throwRuntimeError("index out of range"),undefined):x.$array[x.$offset+fv])).Y,fr.W*0.5,fr.H*0.5,0,0,0,0,j,k,n);fs.VirtualGridX=ft[0];fs.VirtualGridY=ft[1];fl++;}$s=-1;return new L.ptr(b.Id+1>>0,r,new $Int64(0,0),w,BC.nil,new $Uint64(0,0),false,false);}return;}var $f={$blk:AE,$c:true,$r,a,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,al,am,an,ao,ap,aq,ar,as,at,au,av,aw,ax,ay,az,b,ba,bb,bc,bd,be,bf,bg,bh,bi,bj,bk,bl,bm,bn,bo,bp,bq,br,bs,bt,bu,bv,bw,bx,by,bz,c,ca,cb,cc,cd,ce,cf,cg,ch,ci,cj,ck,cl,cm,cn,co,cp,cq,cr,cs,ct,cu,cv,cw,cx,cy,cz,d,da,db,dc,dd,de,df,dg,dh,di,dj,dk,dl,dm,dn,dp,dq,dr,ds,dt,du,dv,dw,dx,dy,dz,e,ea,eb,ec,ed,ee,ef,eg,eh,ei,ej,ek,el,em,en,eo,ep,eq,er,es,et,eu,ev,ew,ex,ey,ez,f,fa,fb,fc,fd,fe,ff,fg,fh,fi,fj,fk,fl,fm,fn,fo,fp,fq,fr,fs,ft,fu,fv,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,$s};return $f;};$pkg.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame=AE;AF=function(a,b,c,d,e,f,g,h,i,j,k,l){var{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,$s,$r,$c}=$restore(this,{a,b,c,d,e,f,g,h,i,j,k,l});$s=$s||0;s:while(true){switch($s){case 0:m=Y(a,b,c*0.5,d*0.5,e,f,g,h,i,j);n=m[0];o=m[1];p=AG(n,o,g+c+h,f+d+e,k,l);$s=1;case 1:if($c){$c=false;p=p.$blk();}if(p&&p.$blk!==undefined){break s;}q=p;$s=2;case 2:return q;}return;}var $f={$blk:AF,$c:true,$r,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,$s};return $f;};$pkg.GenerateRectCollider=AF;AG=function(a,b,c,d,e,f){var{a,b,c,d,e,f,g,h,$s,$r,$c}=$restore(this,{a,b,c,d,e,f});$s=$s||0;s:while(true){switch($s){case 0:g=B.NewObject(a,b,c,d,new AO([f]));h=B.NewRectangle(0,0,c,d);$r=g.SetShape(h);$s=1;case 1:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}g.Data=e;$s=-1;return g;}return;}var $f={$blk:AG,$c:true,$r,a,b,c,d,e,f,g,h,$s};return $f;};AH=function(a,b,c,d,e){var{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,$s,$r,$c}=$restore(this,{a,b,c,d,e});$s=$s||0;s:while(true){switch($s){case 0:f=AI(a);g=0;h=0;i=g;j=h;k=B.NewConvexPolygon(BD.nil);l=f.Points;m=0;while(true){if(!(m=l.$length)?($throwRuntimeError("index out of range"),undefined):l.$array[l.$offset+m]);p=f.Points;q=0;while(true){if(!(q=p.$length)?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+q]);if(n===r){q++;continue;}if(A.Abs(s.X-o.X)>i){i=A.Abs(s.X-o.X);}if(A.Abs(s.Y-o.Y)>j){j=A.Abs(s.Y-o.Y);}q++;}m++;}t=0;while(true){if(!(t=u.$length)?($throwRuntimeError("index out of range"),undefined):u.$array[u.$offset+t]));k.AddPoints(new BD([v.X,v.Y]));t=t+(1)>>0;}w=B.NewObject(f.Anchor.X+b,f.Anchor.Y+c,i,j,new AO([e]));$r=w.SetShape(k);$s=1;case 1:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}w.Data=d;$s=-1;return w;}return;}var $f={$blk:AH,$c:true,$r,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,$s};return $f;};$pkg.GenerateConvexPolygonCollider=AH;AI=function(a){var a,b,c,d,e,f,g,h,i,j,k;b=new C.ptr(1.7e+308,1.7e+308);c=a.Points;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);if(e.X=g.$length)?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+h]);(k=f.Points,((i<0||i>=k.$length)?($throwRuntimeError("index out of range"),undefined):k.$array[k.$offset+i]=new C.ptr(j.X-b.X,j.Y-b.Y)));h++;}return f;};$pkg.AlignPolygon2DToBoundingBox=AI;BI.methods=[{prop:"Put",name:"Put",pkg:"",typ:$funcType([$emptyInterface],[],false)},{prop:"Pop",name:"Pop",pkg:"",typ:$funcType([],[$emptyInterface],false)},{prop:"GetArrIdxByOffset",name:"GetArrIdxByOffset",pkg:"",typ:$funcType([$Int32],[$Int32],false)},{prop:"GetByOffset",name:"GetByOffset",pkg:"",typ:$funcType([$Int32],[$emptyInterface],false)},{prop:"GetByFrameId",name:"GetByFrameId",pkg:"",typ:$funcType([$Int32],[$emptyInterface],false)},{prop:"SetByFrameId",name:"SetByFrameId",pkg:"",typ:$funcType([$emptyInterface,$Int32],[$Int32,$Int32,$Int32],false)}];C.init("",[{prop:"X",name:"X",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"Y",name:"Y",embedded:false,exported:true,typ:$Float64,tag:""}]);D.init("",[{prop:"Anchor",name:"Anchor",embedded:false,exported:true,typ:BE,tag:""},{prop:"Points",name:"Points",embedded:false,exported:true,typ:BF,tag:""}]);E.init("",[{prop:"Id",name:"Id",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"VirtualGridX",name:"VirtualGridX",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"VirtualGridY",name:"VirtualGridY",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"DirX",name:"DirX",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"DirY",name:"DirY",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"VelX",name:"VelX",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"VelY",name:"VelY",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"Speed",name:"Speed",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"BattleState",name:"BattleState",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"JoinIndex",name:"JoinIndex",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"ColliderRadius",name:"ColliderRadius",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"Removed",name:"Removed",embedded:false,exported:true,typ:$Bool,tag:""},{prop:"Score",name:"Score",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"LastMoveGmtMillis",name:"LastMoveGmtMillis",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"FramesToRecover",name:"FramesToRecover",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"Hp",name:"Hp",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"MaxHp",name:"MaxHp",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"CharacterState",name:"CharacterState",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"InAir",name:"InAir",embedded:false,exported:true,typ:$Bool,tag:""}]);F.init("",[{prop:"Dx",name:"Dx",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"Dy",name:"Dy",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"BtnALevel",name:"BtnALevel",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"BtnBLevel",name:"BtnBLevel",embedded:false,exported:true,typ:$Int32,tag:""}]);H.init("",[{prop:"Boundary",name:"Boundary",embedded:false,exported:true,typ:BG,tag:""}]);I.init("",[{prop:"BattleLocalId",name:"BattleLocalId",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"StartupFrames",name:"StartupFrames",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"ActiveFrames",name:"ActiveFrames",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"RecoveryFrames",name:"RecoveryFrames",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"RecoveryFramesOnBlock",name:"RecoveryFramesOnBlock",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"RecoveryFramesOnHit",name:"RecoveryFramesOnHit",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"HitboxOffset",name:"HitboxOffset",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"OriginatedRenderFrameId",name:"OriginatedRenderFrameId",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"HitStunFrames",name:"HitStunFrames",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"BlockStunFrames",name:"BlockStunFrames",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"Pushback",name:"Pushback",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"ReleaseTriggerType",name:"ReleaseTriggerType",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"Damage",name:"Damage",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"OffenderJoinIndex",name:"OffenderJoinIndex",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"OffenderPlayerId",name:"OffenderPlayerId",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"SelfMoveforwardX",name:"SelfMoveforwardX",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"SelfMoveforwardY",name:"SelfMoveforwardY",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"HitboxSizeX",name:"HitboxSizeX",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"HitboxSizeY",name:"HitboxSizeY",embedded:false,exported:true,typ:$Float64,tag:""}]);J.init("",[{prop:"Bullet",name:"Bullet",embedded:true,exported:true,typ:I,tag:""}]);K.init("",[{prop:"VirtualGridX",name:"VirtualGridX",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"VirtualGridY",name:"VirtualGridY",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"DirX",name:"DirX",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"DirY",name:"DirY",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"VelX",name:"VelX",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"VelY",name:"VelY",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"Speed",name:"Speed",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"Bullet",name:"Bullet",embedded:true,exported:true,typ:I,tag:""}]);L.init("",[{prop:"Id",name:"Id",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"PlayersArr",name:"PlayersArr",embedded:false,exported:true,typ:AW,tag:""},{prop:"CountdownNanos",name:"CountdownNanos",embedded:false,exported:true,typ:$Int64,tag:""},{prop:"MeleeBullets",name:"MeleeBullets",embedded:false,exported:true,typ:AX,tag:""},{prop:"FireballBullets",name:"FireballBullets",embedded:false,exported:true,typ:BC,tag:""},{prop:"BackendUnconfirmedMask",name:"BackendUnconfirmedMask",embedded:false,exported:true,typ:$Uint64,tag:""},{prop:"ShouldForceResync",name:"ShouldForceResync",embedded:false,exported:true,typ:$Bool,tag:""},{prop:"PlayerOpPatternToSkillId",name:"PlayerOpPatternToSkillId",embedded:false,exported:true,typ:BH,tag:""}]);M.init("",[{prop:"InputFrameId",name:"InputFrameId",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"InputList",name:"InputList",embedded:false,exported:true,typ:AV,tag:""},{prop:"ConfirmedList",name:"ConfirmedList",embedded:false,exported:true,typ:$Uint64,tag:""}]);N.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:AL,tag:""}]);S.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:B.Vector,tag:""}]);$init=function(){$pkg.$init=function(){};var $f,$c=false,$s=0,$r;if(this!==undefined&&this.$blk!==undefined){$f=this;$c=true;$s=$f.$s;$r=$f.$r;}s:while(true){switch($s){case 0:$r=A.$init();$s=1;case 1:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}$r=B.$init();$s=2;case 2:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}$pkg.DIRECTION_DECODER=new AK([new AJ([0,0]),new AJ([0,2]),new AJ([0,-2]),new AJ([2,0]),new AJ([-2,0]),new AJ([1,1]),new AJ([-1,-1]),new AJ([1,-1]),new AJ([-1,1])]);P=$makeMap($Int.keyFor,[{k:1,v:new J.ptr(new I.ptr(0,5,10,34,34,34,12,0,18,9,8,1,5,0,0,0,0,24,32))}]);}return;}if($f===undefined){$f={$blk:$init};}$f.$s=$s;$f.$r=$r;return $f;};$pkg.$init=$init;return $pkg;})(); -$packages["jsexport"]=(function(){var $pkg={},$init,A,B,C,R,S,T,U,V,W,X,Y,Z,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR,AS,AT,AU,AV,AW,AX,D,E,F,G,H,I,J,K,L,M,N,O,P,Q;A=$packages["github.com/gopherjs/gopherjs/js"];B=$packages["jsexport/battle"];C=$packages["resolv"];R=$sliceType($Uint64);S=$ptrType(B.Vec2D);T=$sliceType(S);U=$ptrType(B.Polygon2D);V=$ptrType(B.PlayerDownsync);W=$sliceType(V);X=$ptrType(B.MeleeBullet);Y=$sliceType(X);Z=$ptrType(B.FireballBullet);AA=$sliceType(Z);AB=$ptrType(A.Object);AC=$sliceType(AB);AD=$funcType([$Float64,$Float64],[AB],false);AE=$funcType([S,T],[AB],false);AF=$funcType([U],[AB],false);AG=$funcType([$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Bool,$Float64],[AB],false);AH=$funcType([$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Float64,$Float64,$Float64,$Float64,$Float64,$Float64],[AB],false);AI=$funcType([$Int32,W,Y],[AB],false);AJ=$funcType([$Int,$Int,$Int,$Int],[AB],false);AK=$funcType([$Int32,R,$Uint64],[AB],false);AL=$funcType([$Int32],[AB],false);AM=$funcType([$Float64,$Float64,$Float64,$Float64,$Float64,$Float64,$Float64,$Float64,$Float64,$Float64,$emptyInterface,$String],[AB],false);AN=$funcType([U,$Float64,$Float64,$emptyInterface,$String],[AB],false);AO=$ptrType(C.Space);AP=$funcType([AO],[AC],false);AQ=$ptrType(B.RingBuffer);AR=$ptrType(B.RoomDownsyncFrame);AS=$ptrType(C.Object);AT=$mapType($Int32,AS);AU=$mapType($Int,$Int);AV=$funcType([AQ,AR,AO,AT,$Int32,$Int32,$Int32,$Int32,$Uint32,$Float64,$Float64,$Float64,$Float64,$Float64,$Float64,AU],[AB],false);AW=$funcType([$Float64,$Float64,$Float64,$Float64,$Float64,$Float64,$Float64,$Float64,$Float64,$Float64],[$Float64,$Float64],false);AX=$mapType($String,$emptyInterface);D=function(a,b,c){var{a,b,c,d,e,$s,$r,$c}=$restore(this,{a,b,c});$s=$s||0;s:while(true){switch($s){case 0:d=A.MakeFullWrapper(new B.InputFrameDownsync.ptr(a,b,c));$s=1;case 1:if($c){$c=false;d=d.$blk();}if(d&&d.$blk!==undefined){break s;}e=d;$s=2;case 2:return e;}return;}var $f={$blk:D,$c:true,$r,a,b,c,d,e,$s};return $f;};$pkg.NewInputFrameDownsync=D;E=function(a){var{a,b,c,$s,$r,$c}=$restore(this,{a});$s=$s||0;s:while(true){switch($s){case 0:b=A.MakeFullWrapper(B.NewRingBuffer(a));$s=1;case 1:if($c){$c=false;b=b.$blk();}if(b&&b.$blk!==undefined){break s;}c=b;$s=2;case 2:return c;}return;}var $f={$blk:E,$c:true,$r,a,b,c,$s};return $f;};$pkg.NewRingBufferJs=E;F=function(a,b,c,d){var a,b,c,d;return A.MakeWrapper(C.NewSpace(a,b,c,d));};$pkg.NewCollisionSpaceJs=F;G=function(a,b){var{a,b,c,d,$s,$r,$c}=$restore(this,{a,b});$s=$s||0;s:while(true){switch($s){case 0:c=A.MakeFullWrapper(new B.Vec2D.ptr(a,b));$s=1;case 1:if($c){$c=false;c=c.$blk();}if(c&&c.$blk!==undefined){break s;}d=c;$s=2;case 2:return d;}return;}var $f={$blk:G,$c:true,$r,a,b,c,d,$s};return $f;};$pkg.NewVec2DJs=G;H=function(a,b){var{a,b,c,d,$s,$r,$c}=$restore(this,{a,b});$s=$s||0;s:while(true){switch($s){case 0:c=A.MakeFullWrapper(new B.Polygon2D.ptr(a,b));$s=1;case 1:if($c){$c=false;c=c.$blk();}if(c&&c.$blk!==undefined){break s;}d=c;$s=2;case 2:return d;}return;}var $f={$blk:H,$c:true,$r,a,b,c,d,$s};return $f;};$pkg.NewPolygon2DJs=H;I=function(a){var a;return A.MakeWrapper(new B.Barrier.ptr(a));};$pkg.NewBarrierJs=I;J=function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p;return A.MakeWrapper(new B.PlayerDownsync.ptr(a,b,c,d,e,f,g,i,j,l,p,false,0,0,h,m,n,k,o));};$pkg.NewPlayerDownsyncJs=J;K=function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;return A.MakeWrapper(new B.MeleeBullet.ptr(new B.Bullet.ptr(a,b,c,d,e,f,n,0,g,h,m,i,j,k,l,o,p,q,r)));};$pkg.NewMeleeBulletJs=K;L=function(a,b,c){var{a,b,c,d,e,$s,$r,$c}=$restore(this,{a,b,c});$s=$s||0;s:while(true){switch($s){case 0:d=A.MakeFullWrapper(new B.RoomDownsyncFrame.ptr(a,b,new $Int64(0,0),c,AA.nil,new $Uint64(0,0),false,false));$s=1;case 1:if($c){$c=false;d=d.$blk();}if(d&&d.$blk!==undefined){break s;}e=d;$s=2;case 2:return e;}return;}var $f={$blk:L,$c:true,$r,a,b,c,d,e,$s};return $f;};$pkg.NewRoomDownsyncFrameJs=L;M=function(a){var{a,b,c,d,e,f,g,$s,$r,$c}=$restore(this,{a});$s=$s||0;s:while(true){switch($s){case 0:b=a.Objects();c=$makeSlice(AC,0,b.$length);d=b;e=0;case 1:if(!(e=d.$length)?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+e]);g=A.MakeFullWrapper(f);$s=3;case 3:if($c){$c=false;g=g.$blk();}if(g&&g.$blk!==undefined){break s;}c=$append(c,g);e++;$s=1;continue;case 2:$s=-1;return c;}return;}var $f={$blk:M,$c:true,$r,a,b,c,d,e,f,g,$s};return $f;};$pkg.GetCollisionSpaceObjsJs=M;N=function(a,b,c,d,e,f,g,h,i,j,k,l){var{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,$s,$r,$c}=$restore(this,{a,b,c,d,e,f,g,h,i,j,k,l});$s=$s||0;s:while(true){switch($s){case 0:m=B.GenerateRectCollider(a,b,c,d,e,f,g,h,i,j,k,l);$s=1;case 1:if($c){$c=false;m=m.$blk();}if(m&&m.$blk!==undefined){break s;}n=A.MakeFullWrapper(m);$s=2;case 2:if($c){$c=false;n=n.$blk();}if(n&&n.$blk!==undefined){break s;}o=n;$s=3;case 3:return o;}return;}var $f={$blk:N,$c:true,$r,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,$s};return $f;};$pkg.GenerateRectColliderJs=N;O=function(a,b,c,d,e){var{a,b,c,d,e,f,g,h,$s,$r,$c}=$restore(this,{a,b,c,d,e});$s=$s||0;s:while(true){switch($s){case 0:f=B.GenerateConvexPolygonCollider(a,b,c,d,e);$s=1;case 1:if($c){$c=false;f=f.$blk();}if(f&&f.$blk!==undefined){break s;}g=A.MakeFullWrapper(f);$s=2;case 2:if($c){$c=false;g=g.$blk();}if(g&&g.$blk!==undefined){break s;}h=g;$s=3;case 3:return h;}return;}var $f={$blk:O,$c:true,$r,a,b,c,d,e,f,g,h,$s};return $f;};$pkg.GenerateConvexPolygonColliderJs=O;P=function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){var{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,$s,$r,$c}=$restore(this,{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p});$s=$s||0;s:while(true){switch($s){case 0:q=B.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p);$s=1;case 1:if($c){$c=false;q=q.$blk();}if(q&&q.$blk!==undefined){break s;}r=A.MakeFullWrapper(q);$s=2;case 2:if($c){$c=false;r=r.$blk();}if(r&&r.$blk!==undefined){break s;}s=r;$s=3;case 3:return s;}return;}var $f={$blk:P,$c:true,$r,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,$s};return $f;};$pkg.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs=P;Q=function(){$global.gopkgs=$externalize($makeMap($String.keyFor,[{k:"NewVec2DJs",v:new AD(G)},{k:"NewPolygon2DJs",v:new AE(H)},{k:"NewBarrierJs",v:new AF(I)},{k:"NewPlayerDownsyncJs",v:new AG(J)},{k:"NewMeleeBulletJs",v:new AH(K)},{k:"NewRoomDownsyncFrameJs",v:new AI(L)},{k:"NewCollisionSpaceJs",v:new AJ(F)},{k:"NewInputFrameDownsync",v:new AK(D)},{k:"NewRingBufferJs",v:new AL(E)},{k:"GenerateRectColliderJs",v:new AM(N)},{k:"GenerateConvexPolygonColliderJs",v:new AN(O)},{k:"GetCollisionSpaceObjsJs",v:new AP(M)},{k:"ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs",v:new AV(P)},{k:"WorldToPolygonColliderBLPos",v:new AW(B.WorldToPolygonColliderBLPos)},{k:"PolygonColliderBLToWorldPos",v:new AW(B.PolygonColliderBLToWorldPos)}]),AX);};$init=function(){$pkg.$init=function(){};var $f,$c=false,$s=0,$r;if(this!==undefined&&this.$blk!==undefined){$f=this;$c=true;$s=$f.$s;$r=$f.$r;}s:while(true){switch($s){case 0:$r=A.$init();$s=1;case 1:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}$r=B.$init();$s=2;case 2:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}$r=C.$init();$s=3;case 3:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}if($pkg===$mainPkg){Q();$mainFinished=true;}}return;}if($f===undefined){$f={$blk:$init};}$f.$s=$s;$f.$r=$r;return $f;};$pkg.$init=$init;return $pkg;})(); +$packages["jsexport/battle"]=(function(){var $pkg={},$init,A,B,C,D,E,F,H,I,J,K,L,M,N,O,Q,R,AE,AV,AW,AX,AY,AZ,BA,BB,BC,BD,BE,BF,BG,BH,BI,BJ,BK,BL,BM,BN,BO,BP,BQ,BR,BS,BT,BU,BV,BW,S,T,U,V,W,P,Y,Z,AA,AB,AC,AD,AF,AG,AH,AI,AJ,AK,AL,AM,AO,AP,AQ,AR,AS,AT,AU;A=$packages["math"];B=$packages["resolv"];C=$pkg.Vec2D=$newType(0,$kindStruct,"battle.Vec2D",true,"jsexport/battle",true,function(X_,Y_){this.$val=this;if(arguments.length===0){this.X=0;this.Y=0;return;}this.X=X_;this.Y=Y_;});D=$pkg.Polygon2D=$newType(0,$kindStruct,"battle.Polygon2D",true,"jsexport/battle",true,function(Anchor_,Points_){this.$val=this;if(arguments.length===0){this.Anchor=BS.nil;this.Points=BT.nil;return;}this.Anchor=Anchor_;this.Points=Points_;});E=$pkg.PlayerDownsync=$newType(0,$kindStruct,"battle.PlayerDownsync",true,"jsexport/battle",true,function(Id_,VirtualGridX_,VirtualGridY_,DirX_,DirY_,VelX_,VelY_,Speed_,BattleState_,JoinIndex_,ColliderRadius_,Removed_,Score_,LastMoveGmtMillis_,FramesToRecover_,FramesInChState_,Hp_,MaxHp_,CharacterState_,InAir_,ActiveSkillId_,ActiveSkillHit_,FramesInvinsible_){this.$val=this;if(arguments.length===0){this.Id=0;this.VirtualGridX=0;this.VirtualGridY=0;this.DirX=0;this.DirY=0;this.VelX=0;this.VelY=0;this.Speed=0;this.BattleState=0;this.JoinIndex=0;this.ColliderRadius=0;this.Removed=false;this.Score=0;this.LastMoveGmtMillis=0;this.FramesToRecover=0;this.FramesInChState=0;this.Hp=0;this.MaxHp=0;this.CharacterState=0;this.InAir=false;this.ActiveSkillId=0;this.ActiveSkillHit=0;this.FramesInvinsible=0;return;}this.Id=Id_;this.VirtualGridX=VirtualGridX_;this.VirtualGridY=VirtualGridY_;this.DirX=DirX_;this.DirY=DirY_;this.VelX=VelX_;this.VelY=VelY_;this.Speed=Speed_;this.BattleState=BattleState_;this.JoinIndex=JoinIndex_;this.ColliderRadius=ColliderRadius_;this.Removed=Removed_;this.Score=Score_;this.LastMoveGmtMillis=LastMoveGmtMillis_;this.FramesToRecover=FramesToRecover_;this.FramesInChState=FramesInChState_;this.Hp=Hp_;this.MaxHp=MaxHp_;this.CharacterState=CharacterState_;this.InAir=InAir_;this.ActiveSkillId=ActiveSkillId_;this.ActiveSkillHit=ActiveSkillHit_;this.FramesInvinsible=FramesInvinsible_;});F=$pkg.InputFrameDecoded=$newType(0,$kindStruct,"battle.InputFrameDecoded",true,"jsexport/battle",true,function(Dx_,Dy_,BtnALevel_,BtnBLevel_){this.$val=this;if(arguments.length===0){this.Dx=0;this.Dy=0;this.BtnALevel=0;this.BtnBLevel=0;return;}this.Dx=Dx_;this.Dy=Dy_;this.BtnALevel=BtnALevel_;this.BtnBLevel=BtnBLevel_;});H=$pkg.Barrier=$newType(0,$kindStruct,"battle.Barrier",true,"jsexport/battle",true,function(Boundary_){this.$val=this;if(arguments.length===0){this.Boundary=BU.nil;return;}this.Boundary=Boundary_;});I=$pkg.Bullet=$newType(0,$kindStruct,"battle.Bullet",true,"jsexport/battle",true,function(OriginatedRenderFrameId_,OffenderJoinIndex_,StartupFrames_,CancellableStFrame_,CancellableEdFrame_,ActiveFrames_,HitStunFrames_,BlockStunFrames_,PushbackVelX_,PushbackVelY_,Damage_,SelfLockVelX_,SelfLockVelY_,HitboxOffsetX_,HitboxOffsetY_,HitboxSizeX_,HitboxSizeY_,BlowUp_,CancelTransit_){this.$val=this;if(arguments.length===0){this.OriginatedRenderFrameId=0;this.OffenderJoinIndex=0;this.StartupFrames=0;this.CancellableStFrame=0;this.CancellableEdFrame=0;this.ActiveFrames=0;this.HitStunFrames=0;this.BlockStunFrames=0;this.PushbackVelX=0;this.PushbackVelY=0;this.Damage=0;this.SelfLockVelX=0;this.SelfLockVelY=0;this.HitboxOffsetX=0;this.HitboxOffsetY=0;this.HitboxSizeX=0;this.HitboxSizeY=0;this.BlowUp=false;this.CancelTransit=false;return;}this.OriginatedRenderFrameId=OriginatedRenderFrameId_;this.OffenderJoinIndex=OffenderJoinIndex_;this.StartupFrames=StartupFrames_;this.CancellableStFrame=CancellableStFrame_;this.CancellableEdFrame=CancellableEdFrame_;this.ActiveFrames=ActiveFrames_;this.HitStunFrames=HitStunFrames_;this.BlockStunFrames=BlockStunFrames_;this.PushbackVelX=PushbackVelX_;this.PushbackVelY=PushbackVelY_;this.Damage=Damage_;this.SelfLockVelX=SelfLockVelX_;this.SelfLockVelY=SelfLockVelY_;this.HitboxOffsetX=HitboxOffsetX_;this.HitboxOffsetY=HitboxOffsetY_;this.HitboxSizeX=HitboxSizeX_;this.HitboxSizeY=HitboxSizeY_;this.BlowUp=BlowUp_;this.CancelTransit=CancelTransit_;});J=$pkg.MeleeBullet=$newType(0,$kindStruct,"battle.MeleeBullet",true,"jsexport/battle",true,function(Bullet_){this.$val=this;if(arguments.length===0){this.Bullet=new I.ptr(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,false,false);return;}this.Bullet=Bullet_;});K=$pkg.FireballBullet=$newType(0,$kindStruct,"battle.FireballBullet",true,"jsexport/battle",true,function(VirtualGridX_,VirtualGridY_,DirX_,DirY_,VelX_,VelY_,Speed_,Bullet_){this.$val=this;if(arguments.length===0){this.VirtualGridX=0;this.VirtualGridY=0;this.DirX=0;this.DirY=0;this.VelX=0;this.VelY=0;this.Speed=0;this.Bullet=new I.ptr(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,false,false);return;}this.VirtualGridX=VirtualGridX_;this.VirtualGridY=VirtualGridY_;this.DirX=DirX_;this.DirY=DirY_;this.VelX=VelX_;this.VelY=VelY_;this.Speed=Speed_;this.Bullet=Bullet_;});L=$pkg.Skill=$newType(0,$kindStruct,"battle.Skill",true,"jsexport/battle",true,function(BattleLocalId_,RecoveryFrames_,RecoveryFramesOnBlock_,RecoveryFramesOnHit_,ReleaseTriggerType_,BoundChState_,Hits_){this.$val=this;if(arguments.length===0){this.BattleLocalId=0;this.RecoveryFrames=0;this.RecoveryFramesOnBlock=0;this.RecoveryFramesOnHit=0;this.ReleaseTriggerType=0;this.BoundChState=0;this.Hits=AX.nil;return;}this.BattleLocalId=BattleLocalId_;this.RecoveryFrames=RecoveryFrames_;this.RecoveryFramesOnBlock=RecoveryFramesOnBlock_;this.RecoveryFramesOnHit=RecoveryFramesOnHit_;this.ReleaseTriggerType=ReleaseTriggerType_;this.BoundChState=BoundChState_;this.Hits=Hits_;});M=$pkg.RoomDownsyncFrame=$newType(0,$kindStruct,"battle.RoomDownsyncFrame",true,"jsexport/battle",true,function(Id_,PlayersArr_,CountdownNanos_,MeleeBullets_,FireballBullets_,BackendUnconfirmedMask_,ShouldForceResync_,PlayerOpPatternToSkillId_){this.$val=this;if(arguments.length===0){this.Id=0;this.PlayersArr=BJ.nil;this.CountdownNanos=new $Int64(0,0);this.MeleeBullets=BK.nil;this.FireballBullets=BQ.nil;this.BackendUnconfirmedMask=new $Uint64(0,0);this.ShouldForceResync=false;this.PlayerOpPatternToSkillId=false;return;}this.Id=Id_;this.PlayersArr=PlayersArr_;this.CountdownNanos=CountdownNanos_;this.MeleeBullets=MeleeBullets_;this.FireballBullets=FireballBullets_;this.BackendUnconfirmedMask=BackendUnconfirmedMask_;this.ShouldForceResync=ShouldForceResync_;this.PlayerOpPatternToSkillId=PlayerOpPatternToSkillId_;});N=$pkg.InputFrameDownsync=$newType(0,$kindStruct,"battle.InputFrameDownsync",true,"jsexport/battle",true,function(InputFrameId_,InputList_,ConfirmedList_){this.$val=this;if(arguments.length===0){this.InputFrameId=0;this.InputList=BI.nil;this.ConfirmedList=new $Uint64(0,0);return;}this.InputFrameId=InputFrameId_;this.InputList=InputList_;this.ConfirmedList=ConfirmedList_;});O=$pkg.RingBuffer=$newType(0,$kindStruct,"battle.RingBuffer",true,"jsexport/battle",true,function(Ed_,St_,EdFrameId_,StFrameId_,N_,Cnt_,Eles_){this.$val=this;if(arguments.length===0){this.Ed=0;this.St=0;this.EdFrameId=0;this.StFrameId=0;this.N=0;this.Cnt=0;this.Eles=AX.nil;return;}this.Ed=Ed_;this.St=St_;this.EdFrameId=EdFrameId_;this.StFrameId=StFrameId_;this.N=N_;this.Cnt=Cnt_;this.Eles=Eles_;});Q=$pkg.SkillMapperType=$newType(4,$kindFunc,"battle.SkillMapperType",true,"jsexport/battle",true,null);R=$pkg.CharacterConfig=$newType(0,$kindStruct,"battle.CharacterConfig",true,"jsexport/battle",true,function(SpeciesId_,SpeciesName_,InAirIdleFrameIdxTurningPoint_,InAirIdleFrameIdxTurnedCycle_,LayDownFrames_,LayDownFramesToRecover_,GetUpInvinsibleFrames_,GetUpFramesToRecover_,Speed_,JumpingInitVelY_,SkillMapper_){this.$val=this;if(arguments.length===0){this.SpeciesId=0;this.SpeciesName="";this.InAirIdleFrameIdxTurningPoint=0;this.InAirIdleFrameIdxTurnedCycle=0;this.LayDownFrames=0;this.LayDownFramesToRecover=0;this.GetUpInvinsibleFrames=0;this.GetUpFramesToRecover=0;this.Speed=0;this.JumpingInitVelY=0;this.SkillMapper=$throwNilPointerError;return;}this.SpeciesId=SpeciesId_;this.SpeciesName=SpeciesName_;this.InAirIdleFrameIdxTurningPoint=InAirIdleFrameIdxTurningPoint_;this.InAirIdleFrameIdxTurnedCycle=InAirIdleFrameIdxTurnedCycle_;this.LayDownFrames=LayDownFrames_;this.LayDownFramesToRecover=LayDownFramesToRecover_;this.GetUpInvinsibleFrames=GetUpInvinsibleFrames_;this.GetUpFramesToRecover=GetUpFramesToRecover_;this.Speed=Speed_;this.JumpingInitVelY=JumpingInitVelY_;this.SkillMapper=SkillMapper_;});AE=$pkg.SatResult=$newType(0,$kindStruct,"battle.SatResult",true,"jsexport/battle",true,function(Overlap_,OverlapX_,OverlapY_,AContainedInB_,BContainedInA_,Axis_){this.$val=this;if(arguments.length===0){this.Overlap=0;this.OverlapX=0;this.OverlapY=0;this.AContainedInB=false;this.BContainedInA=false;this.Axis=B.Vector.nil;return;}this.Overlap=Overlap_;this.OverlapX=OverlapX_;this.OverlapY=OverlapY_;this.AContainedInB=AContainedInB_;this.BContainedInA=BContainedInA_;this.Axis=Axis_;});AV=$sliceType($Int32);AW=$sliceType(AV);AX=$sliceType($emptyInterface);AY=$ptrType(L);AZ=$ptrType(J);BA=$ptrType(AE);BB=$sliceType(C);BC=$sliceType($String);BD=$ptrType(B.Collision);BE=$ptrType(BB);BF=$ptrType(E);BG=$ptrType(B.ConvexPolygon);BH=$ptrType(N);BI=$sliceType($Uint64);BJ=$sliceType(BF);BK=$sliceType(AZ);BL=$sliceType(BE);BM=$sliceType($Bool);BN=$ptrType(B.Object);BO=$sliceType(BN);BP=$ptrType(K);BQ=$sliceType(BP);BR=$sliceType($Float64);BS=$ptrType(C);BT=$sliceType(BS);BU=$ptrType(D);BV=$mapType($Int,$Int);BW=$ptrType(O);P=function(a){var a;return new O.ptr(0,0,0,0,a,0,$makeSlice(AX,a));};$pkg.NewRingBuffer=P;O.ptr.prototype.Put=function(a){var a,b,c,d;b=this;while(true){if(!(0=b.N)){break;}b.Pop();}(c=b.Eles,d=b.Ed,((d<0||d>=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]=a));b.EdFrameId=b.EdFrameId+(1)>>0;b.Cnt=b.Cnt+(1)>>0;b.Ed=b.Ed+(1)>>0;if(b.Ed>=b.N){b.Ed=b.Ed-(b.N)>>0;}};O.prototype.Put=function(a){return this.$val.Put(a);};O.ptr.prototype.Pop=function(){var a,b,c,d;a=this;if(0===a.Cnt){return $ifaceNil;}d=(b=a.Eles,c=a.St,((c<0||c>=b.$length)?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+c]));a.StFrameId=a.StFrameId+(1)>>0;a.Cnt=a.Cnt-(1)>>0;a.St=a.St+(1)>>0;if(a.St>=a.N){a.St=a.St-(a.N)>>0;}return d;};O.prototype.Pop=function(){return this.$val.Pop();};O.ptr.prototype.GetArrIdxByOffset=function(a){var a,b,c;b=this;if((0===b.Cnt)||0>a){return-1;}c=b.St+a>>0;if(b.St=b.N){c=c-(b.N)>>0;}if(c>=b.St||c=d.$length)?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+c]));};O.prototype.GetByOffset=function(a){return this.$val.GetByOffset(a);};O.ptr.prototype.GetByFrameId=function(a){var a,b;b=this;if(a>=b.EdFrameId||a>0);};O.prototype.GetByFrameId=function(a){return this.$val.GetByFrameId(a);};O.ptr.prototype.SetByFrameId=function(a,b){var a,b,c,d,e,f,g,h,i,j,k,l,m,n;c=this;d=c.StFrameId;e=c.EdFrameId;f=d;g=e;if(bb){h=c.GetArrIdxByOffset(b-c.StFrameId>>0);if(!((-1===h))){(i=c.Eles,((h<0||h>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+h]=a));return[0,f,g];}}j=0;if(g>0))>>2>>0);};$pkg.ConvertToDelayedInputFrameId=Z;AA=function(a){var a;return(a>>2>>0);};$pkg.ConvertToNoDelayInputFrameId=AA;AB=function(a){var a;return(((a<<2>>0))+8>>0);};$pkg.ConvertToFirstUsedRenderFrameId=AB;AC=function(a){var a;return(((((a<<2>>0))+8>>0)+4>>0)-1>>0);};$pkg.ConvertToLastUsedRenderFrameId=AC;AD=function(a){var a,b,c,d,e,f,g,h;b=new $Uint64(a.$high&0,(a.$low&15)>>>0);d=(((c=$shiftRightUint64(a,4),new $Uint64(c.$high&0,(c.$low&1)>>>0)).$low>>0));f=(((e=$shiftRightUint64(a,5),new $Uint64(e.$high&0,(e.$low&1)>>>0)).$low>>0));return new F.ptr((g=(($flatten64(b)<0||$flatten64(b)>=$pkg.DIRECTION_DECODER.$length)?($throwRuntimeError("index out of range"),undefined):$pkg.DIRECTION_DECODER.$array[$pkg.DIRECTION_DECODER.$offset+$flatten64(b)]),(0>=g.$length?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+0])),(h=(($flatten64(b)<0||$flatten64(b)>=$pkg.DIRECTION_DECODER.$length)?($throwRuntimeError("index out of range"),undefined):$pkg.DIRECTION_DECODER.$array[$pkg.DIRECTION_DECODER.$offset+$flatten64(b)]),(1>=h.$length?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+1])),d,f);};AF=function(a,b,c,d){var{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,$s,$deferred,$r,$c}=$restore(this,{a,b,c,d});$s=$s||0;var $err=null;try{s:while(true){switch($s){case 0:$deferred=[];$curGoroutine.deferStack.push($deferred);c=[c];e=[e];f=[f];g=c[0].Position();e[0]=g[0];f[0]=g[1];$deferred.push([(function(c,e,f){return function(){c[0].SetPosition(e[0],f[0]);};})(c,e,f),[]]);c[0].SetPosition(e[0]+a,f[0]+b);h=new AE.ptr(0,0,0,true,true,new B.Vector([0,0]));i=AG(c[0],d,h);if(i){$s=1;continue;}$s=2;continue;case 1:j=h.Overlap*h.OverlapX;k=h.Overlap*h.OverlapY;l=j;m=k;n=[true,l,m,h];$s=4;case 4:return n;case 2:o=[false,0,0,h];$s=5;case 5:return o;case 3:$s=-1;return[false,0,0,BA.nil];}return;}}catch(err){$err=err;$s=-1;return[false,0,0,BA.nil];}finally{$callDeferred($deferred,$err);if($curGoroutine.asleep){var $f={$blk:AF,$c:true,$r,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,$s,$deferred};return $f;}}};$pkg.CalcPushbacks=AF;AG=function(a,b,c){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;d=a.Points.$length;e=b.Points.$length;f=d;g=e;if((1===f)&&(1===g)){if(!(BA.nil===c)){c.Overlap=0;}return((h=(i=a.Points,(0>=i.$length?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+0])),(0>=h.$length?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+0]))===(j=(k=b.Points,(0>=k.$length?($throwRuntimeError("index out of range"),undefined):k.$array[k.$offset+0])),(0>=j.$length?($throwRuntimeError("index out of range"),undefined):j.$array[j.$offset+0])))&&((l=(m=a.Points,(0>=m.$length?($throwRuntimeError("index out of range"),undefined):m.$array[m.$offset+0])),(1>=l.$length?($throwRuntimeError("index out of range"),undefined):l.$array[l.$offset+1]))===(n=(o=b.Points,(0>=o.$length?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+0])),(1>=n.$length?($throwRuntimeError("index out of range"),undefined):n.$array[n.$offset+1])));}if(1=p.$length)?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+q]);if(AH(a,b,r.Unit(),c)){return false;}q++;}}if(1=s.$length)?($throwRuntimeError("index out of range"),undefined):s.$array[s.$offset+t]);if(AH(a,b,u.Unit(),c)){return false;}t++;}}return true;};AH=function(a,b,c,d){var a,aa,ab,ac,ad,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z;e=1.7e+308;f=-1.7e+308;g=1.7e+308;h=-1.7e+308;i=e;j=f;k=g;l=h;m=a.Points;n=0;while(true){if(!(n=m.$length)?($throwRuntimeError("index out of range"),undefined):m.$array[m.$offset+n]);p=((0>=o.$length?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+0])+a.X)*(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0])+((1>=o.$length?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+1])+a.Y)*(1>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+1]);if(i>p){i=p;}if(j=q.$length)?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+r]);t=((0>=s.$length?($throwRuntimeError("index out of range"),undefined):s.$array[s.$offset+0])+b.X)*(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0])+((1>=s.$length?($throwRuntimeError("index out of range"),undefined):s.$array[s.$offset+1])+b.Y)*(1>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+1]);if(k>t){k=t;}if(ll||jl){u=i-l;d.AContainedInB=false;}else{x=j-k;y=l-i;if(x=ab.$length?($throwRuntimeError("index out of range"),undefined):ab.$array[ab.$offset+0])))&&(0===(ac=d.Axis,(1>=ac.$length?($throwRuntimeError("index out of range"),undefined):ac.$array[ac.$offset+1]))))||z>aa){ad=1;if(u<0){ad=-1;}d.Overlap=aa;d.OverlapX=(0>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+0])*ad;d.OverlapY=(1>=c.$length?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+1])*ad;}d.Axis=c;}return false;};AI=function(a,b){var a,b,c,d;c=((A.Floor(a*100)>>0));d=((A.Floor(b*100)>>0));return[c,d];};$pkg.WorldToVirtualGridPos=AI;AJ=function(a,b){var a,b,c,d;c=(a)*0.01;d=(b)*0.01;return[c,d];};$pkg.VirtualGridToWorldPos=AJ;AK=function(a,b,c,d,e,f,g,h,i,j){var a,b,c,d,e,f,g,h,i,j;return[a-c-g+i,b-d-f+j];};$pkg.WorldToPolygonColliderBLPos=AK;AL=function(a,b,c,d,e,f,g,h,i,j){var a,b,c,d,e,f,g,h,i,j;return[a+c+g-i,b+d+f-j];};$pkg.PolygonColliderBLToWorldPos=AL;AM=function(a,b,c,d,e,f,g,h,i,j){var a,b,c,d,e,f,g,h,i,j,k,l,m;k=AL(a,b,c,d,e,f,g,h,i,j);l=k[0];m=k[1];return AI(l,m);};$pkg.PolygonColliderBLToVirtualGridPos=AM;AO=function(a,b,c,d,e){var{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,$s,$r,$c}=$restore(this,{a,b,c,d,e});$s=$s||0;s:while(true){switch($s){case 0:f=[f];f[0]=$makeSlice(BB,0,10);g=b.Check(0,0,new BC([]));if(BD.nil===g){$s=-1;return(f.$ptr||(f.$ptr=new BE(function(){return this.$target[0];},function($v){this.$target[0]=$v;},f)));}h=g.Objects;i=0;case 1:if(!(i=h.$length)?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+i]);k=false;l=j.Data;if($assertType(l,BF,true)[1]){}else if($assertType(l,AZ,true)[1]){}else{k=true;}if(!k){i++;$s=1;continue;}m=$assertType(j.Shape,BG);o=AF(0,0,c,m);$s=3;case 3:if($c){$c=false;o=o.$blk();}if(o&&o.$blk!==undefined){break s;}n=o;p=n[0];q=n[1];r=n[2];s=n[3];if(!p){i++;$s=1;continue;}t=(s.Overlap-d)*s.OverlapX;u=(s.Overlap-d)*s.OverlapY;q=t;r=u;f[0]=$append(f[0],new C.ptr(s.OverlapX,s.OverlapY));e.X=e.X+(q);e.Y=e.Y+(r);i++;$s=1;continue;case 2:$s=-1;return(f.$ptr||(f.$ptr=new BE(function(){return this.$target[0];},function($v){this.$target[0]=$v;},f)));}return;}var $f={$blk:AO,$c:true,$r,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,$s};return $f;};AP=function(a,b,c,d){var a,aa,ab,ac,ad,ae,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z;e=Z(c.Id);f=Z(c.Id-1>>0);if(0>=e){return[-2,false,0,0];}g=(h=U[$Int32.keyFor(a.CharacterState)],h!==undefined?[h.v,true]:[false,false]);i=g[1];if(i){return[-2,false,0,0];}j=$assertType(d.GetByFrameId(e),BH).InputList;k=BI.nil;if(0>0,((n<0||n>=j.$length)?($throwRuntimeError("index out of range"),undefined):j.$array[j.$offset+n])));p=0;q=0;r=p;s=q;t=0;u=0;v=t;w=u;if(!(BI.nil===k)){y=AD((x=m-1>>0,((x<0||x>=k.$length)?($throwRuntimeError("index out of range"),undefined):k.$array[k.$offset+x])));v=y.BtnALevel;w=y.BtnBLevel;}if(0===a.FramesToRecover){z=o.Dx;aa=o.Dy;r=z;s=aa;if(o.BtnBLevel>w){ab=(ac=T[$Int32.keyFor(a.CharacterState)],ac!==undefined?[ac.v,true]:[false,false]);ad=ab[1];if(!ad){l=true;}}}ae=-1;if(o.BtnALevel>v){ae=1;}return[ae,l,r,s];};AQ=function(a,b,c,d,e,f,g){var{a,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,al,am,an,ao,ap,aq,ar,as,at,au,av,aw,ax,ay,az,b,ba,bb,bc,bd,be,bf,bg,bh,bi,bj,bk,bl,bm,bn,bo,bp,bq,br,bs,bt,bu,bv,bw,bx,by,bz,c,ca,cb,cc,cd,ce,cf,cg,ch,ci,cj,ck,cl,cm,cn,co,cp,cq,cr,cs,ct,cu,cv,cw,cx,cy,cz,d,da,db,dc,dd,de,df,dg,dh,di,dj,dk,dl,dm,dn,dp,dq,dr,ds,dt,du,dv,dw,dx,dy,dz,e,ea,eb,ec,ed,ee,ef,eg,eh,ei,ej,ek,el,em,en,eo,ep,eq,er,es,et,eu,ev,ew,ex,ey,ez,f,fa,fb,fc,fd,fe,ff,fg,fh,fi,fj,fk,fl,fm,fn,fo,fp,fq,fr,fs,ft,fu,fv,fw,fx,fy,fz,g,ga,gb,gc,gd,ge,gf,gg,gh,gi,gj,gk,gl,gm,gn,go,gp,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,$s,$r,$c}=$restore(this,{a,b,c,d,e,f,g});$s=$s||0;s:while(true){switch($s){case 0:h=b.PlayersArr.$length;i=$makeSlice(BJ,h);j=b.PlayersArr;k=0;while(true){if(!(k=j.$length)?($throwRuntimeError("index out of range"),undefined):j.$array[j.$offset+k]);((l<0||l>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+l]=new E.ptr(m.Id,m.VirtualGridX,m.VirtualGridY,m.DirX,m.DirY,m.VelX,m.VelY,m.Speed,m.BattleState,m.JoinIndex,m.ColliderRadius,m.Removed,m.Score,0,m.FramesToRecover-1>>0,m.FramesInChState+1>>0,m.Hp,m.MaxHp,m.CharacterState,true,m.ActiveSkillId,m.ActiveSkillHit,m.FramesInvinsible-1>>0));if(((l<0||l>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+l]).FramesToRecover<0){((l<0||l>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+l]).FramesToRecover=0;}if(((l<0||l>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+l]).FramesInvinsible<0){((l<0||l>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+l]).FramesInvinsible=0;}k++;}n=$makeSlice(BK,0,b.MeleeBullets.$length);o=$makeSlice(BB,h);p=$makeSlice(BL,h);q=$makeSlice(BM,h);r=b.PlayersArr;s=0;case 1:if(!(s=r.$length)?($throwRuntimeError("index out of range"),undefined):r.$array[r.$offset+s]);((u<0||u>=q.$length)?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+u]=false);w=((u<0||u>=g.$length)?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+u]);x=((u<0||u>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+u]);y=AP(v,x,b,a);z=y[0];aa=y[1];ab=y[2];ac=y[3];if(aa){x.VelY=(w.JumpingInitVelY);((u<0||u>=q.$length)?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+u]=true);}ad=v.JoinIndex;ae=w.SkillMapper(z,v);$s=3;case 3:if($c){$c=false;ae=ae.$blk();}if(ae&&ae.$blk!==undefined){break s;}af=ae;ag=(ah=S[$Int.keyFor(af)],ah!==undefined?[ah.v,true]:[AY.nil,false]);ai=ag[0];aj=ag[1];if(aj){x.ActiveSkillId=((af>>0));x.ActiveSkillHit=0;ak=(al=ai.Hits,am=x.ActiveSkillHit,((am<0||am>=al.$length)?($throwRuntimeError("index out of range"),undefined):al.$array[al.$offset+am]));if($assertType(ak,AZ,true)[1]){an=ak.$val;t[0]=$clone(an,J);t[0].Bullet.OriginatedRenderFrameId=b.Id;t[0].Bullet.OffenderJoinIndex=ad;n=$append(n,t[0]);x.FramesToRecover=ai.RecoveryFrames;ao=false;if(!((-1===an.Bullet.SelfLockVelX))){ao=true;ap=1;if(0>x.DirX){ap=-ap;}x.VelX=$imul(ap,an.Bullet.SelfLockVelX);}if(!((-1===an.Bullet.SelfLockVelY))){ao=true;x.VelY=an.Bullet.SelfLockVelY;}if(false===ao){if(false===v.InAir){x.VelX=0;}}}x.CharacterState=ai.BoundChState;s++;$s=1;continue;}if(0===v.FramesToRecover){if(!((0===ab))||!((0===ac))){aq=ab;ar=ac;x.DirX=aq;x.DirY=ar;x.VelX=$imul(ab,v.Speed);x.CharacterState=1;}else{x.CharacterState=0;x.VelX=0;}}s++;$s=1;continue;case 2:as=$makeSlice(BO,b.PlayersArr.$length,b.PlayersArr.$length);at=b.PlayersArr;au=0;case 4:if(!(au=at.$length)?($throwRuntimeError("index out of range"),undefined):at.$array[at.$offset+au]);ax=aw.JoinIndex;ay=0;az=0;(ba=ax-1>>0,((ba<0||ba>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+ba])).X=ay;(bb=ax-1>>0,((bb<0||bb>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+bb])).Y=az;bc=((av<0||av>=g.$length)?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+av]);bd=aw.VirtualGridX+aw.VelX>>0;be=aw.VirtualGridY+aw.VelY>>0;bf=bd;bg=be;if(((av<0||av>=q.$length)?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+av])){bg=bg+(bc.JumpingInitVelY)>>0;}bh=AJ(bf,bg);bi=bh[0];bj=bh[1];bk=$imul(aw.ColliderRadius,2);bl=$imul(aw.ColliderRadius,4);bm=bk;bn=bl;bo=aw.CharacterState;if(bo===(9)){bp=$imul(aw.ColliderRadius,4);bq=$imul(aw.ColliderRadius,2);bm=bp;bn=bq;}else if((bo===(8))||(bo===(4))||(bo===(5))){br=$imul(aw.ColliderRadius,2);bs=$imul(aw.ColliderRadius,2);bm=br;bn=bs;}bt=AJ(bm,bn);bu=bt[0];bv=bt[1];bw=AR(bi,bj,bu,bv,0.1,0.1,0.1,0.1,e,f,aw,"Player");$s=6;case 6:if($c){$c=false;bw=bw.$blk();}if(bw&&bw.$blk!==undefined){break s;}bx=bw;((av<0||av>=as.$length)?($throwRuntimeError("index out of range"),undefined):as.$array[as.$offset+av]=bx);$r=c.Add(new BO([bx]));$s=7;case 7:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}by=((av<0||av>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+av]);if(aw.InAir){by.VelX=by.VelX+(0)>>0;by.VelY=by.VelY+(-50)>>0;}au++;$s=4;continue;case 5:bz=$makeSlice(BO,0,b.MeleeBullets.$length);ca=b.MeleeBullets;cb=0;case 8:if(!(cb=ca.$length)?($throwRuntimeError("index out of range"),undefined):ca.$array[ca.$offset+cb]);if(((cc.Bullet.OriginatedRenderFrameId+cc.Bullet.StartupFrames>>0)<=b.Id)&&(((cc.Bullet.OriginatedRenderFrameId+cc.Bullet.StartupFrames>>0)+cc.Bullet.ActiveFrames>>0)>b.Id)){$s=10;continue;}$s=11;continue;case 10:cf=(cd=b.PlayersArr,ce=cc.Bullet.OffenderJoinIndex-1>>0,((ce<0||ce>=cd.$length)?($throwRuntimeError("index out of range"),undefined):cd.$array[cd.$offset+ce]));cg=1;if(0>cf.DirX){cg=-cg;}ch=AJ(cf.VirtualGridX+($imul(cg,cc.Bullet.HitboxOffsetX))>>0,cf.VirtualGridY);ci=ch[0];cj=ch[1];ck=AJ(cc.Bullet.HitboxSizeX,cc.Bullet.HitboxSizeY);cl=ck[0];cm=ck[1];cn=AR(ci,cj,cl,cm,0.1,0.1,0.1,0.1,e,f,cc,"MeleeBullet");$s=13;case 13:if($c){$c=false;cn=cn.$blk();}if(cn&&cn.$blk!==undefined){break s;}co=cn;$r=c.Add(new BO([co]));$s=14;case 14:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}bz=$append(bz,co);$s=12;continue;case 11:n=$append(n,cc);case 12:cb++;$s=8;continue;case 9:cp=b.PlayersArr;cq=0;case 15:if(!(cq=cp.$length)?($throwRuntimeError("index out of range"),undefined):cp.$array[cp.$offset+cq]);ct=cs.JoinIndex;cu=((cr<0||cr>=as.$length)?($throwRuntimeError("index out of range"),undefined):as.$array[as.$offset+cr]);cv=$assertType(cu.Shape,BG);cx=AO(ct,cu,cv,0.1,(cw=ct-1>>0,((cw<0||cw>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+cw])));$s=17;case 17:if($c){$c=false;cx=cx.$blk();}if(cx&&cx.$blk!==undefined){break s;}(cy=ct-1>>0,((cy<0||cy>=p.$length)?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+cy]=cx));cz=((cr<0||cr>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+cr]);da=((cr<0||cr>=g.$length)?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+cr]);db=false;dc=cu.Check(0,0,new BC([]));if(!(BD.nil===dc)){$s=18;continue;}$s=19;continue;case 18:dd=dc.Objects;de=0;case 20:if(!(de=dd.$length)?($throwRuntimeError("index out of range"),undefined):dd.$array[dd.$offset+de]);dg=false;dh=false;di=false;dj=dg;dk=dh;dl=di;dm=df.Data;if($assertType(dm,BF,true)[1]){dk=true;}else if($assertType(dm,AZ,true)[1]){dl=true;}else{dj=true;}if(dl){de++;$s=20;continue;}dn=$assertType(df.Shape,BG);dq=AF(0,0,cv,dn);$s=22;case 22:if($c){$c=false;dq=dq.$blk();}if(dq&&dq.$blk!==undefined){break s;}dp=dq;dr=dp[0];ds=dp[1];dt=dp[2];du=dp[3];if(!dr){de++;$s=20;continue;}dv=du.OverlapX*0+du.OverlapY*-1;if(dk){dw=(du.Overlap-0.2)*du.OverlapX;dx=(du.Overlap-0.2)*du.OverlapY;ds=dw;dt=dx;}dy=(dz=ct-1>>0,((dz<0||dz>=p.$length)?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+dz])).$get();ea=0;while(true){if(!(ea=dy.$length)?($throwRuntimeError("index out of range"),undefined):dy.$array[dy.$offset+ea]),C);ec=ds*eb.X+dt*eb.Y;if(dj||(dk&&0>ec)){ds=ds-(ec*eb.X);dt=dt-(ec*eb.Y);}ea++;}ed=ct-1>>0;((ed<0||ed>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+ed]).X=((ed<0||ed>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+ed]).X+(ds);ee=ct-1>>0;((ee<0||ee>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+ee]).Y=((ee<0||ee>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+ee]).Y+(dt);if(0.5=cs.VelY){cz.VelY=0;cz.VelX=0;ef=(eg=W[$Int32.keyFor(cz.CharacterState)],eg!==undefined?[eg.v,true]:[false,false]);eh=ef[1];if(eh){if(8===cz.CharacterState){cz.CharacterState=9;cz.FramesToRecover=da.LayDownFramesToRecover;}else{ei=0;ej=cs.ColliderRadius;ek=ei;el=ej;em=AJ(ek,el);en=em[1];eo=ct-1>>0;((eo<0||eo>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+eo]).Y=((eo<0||eo>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+eo]).Y-(en);cz.CharacterState=0;}}}else{ep=(eq=W[$Int32.keyFor(cz.CharacterState)],eq!==undefined?[eq.v,true]:[false,false]);er=ep[1];if(er){if(9===cz.CharacterState){if(0===cz.FramesToRecover){cz.CharacterState=10;cz.FramesToRecover=da.GetUpFramesToRecover;}}else if(10===cz.CharacterState){if(0===cz.FramesToRecover){cz.CharacterState=0;cz.FramesInvinsible=da.GetUpInvinsibleFrames;}}}}}cq++;$s=15;continue;case 16:es=bz;et=0;case 23:if(!(et=es.$length)?($throwRuntimeError("index out of range"),undefined):es.$array[es.$offset+et]);ev=eu.Check(0,0,new BC([]));eu.Space.Remove(new BO([eu]));ew=eu.Data;if($assertType(ew,AZ,true)[1]){$s=25;continue;}$s=26;continue;case 25:ex=ew.$val;if(BD.nil===ev){n=$append(n,ex);et++;$s=23;continue;}ey=$assertType(eu.Shape,BG);fb=(ez=b.PlayersArr,fa=ex.Bullet.OffenderJoinIndex-1>>0,((fa<0||fa>=ez.$length)?($throwRuntimeError("index out of range"),undefined):ez.$array[ez.$offset+fa]));fc=ev.Objects;fd=0;case 27:if(!(fd=fc.$length)?($throwRuntimeError("index out of range"),undefined):fc.$array[fc.$offset+fd]);ff=$assertType(fe.Shape,BG);fg=fe.Data;if($assertType(fg,BF,true)[1]){$s=29;continue;}$s=30;continue;case 29:fh=fg.$val;if(ex.Bullet.OffenderJoinIndex===fh.JoinIndex){fd++;$s=27;continue;}fj=(fk=V[$Int32.keyFor(fh.CharacterState)],fk!==undefined?[fk.v,true]:[false,false]);fl=fj[1];if(fl){fd++;$s=27;continue;}if(0fb.DirX){fp=-fp;}fq=$imul(fp,ex.Bullet.PushbackVelX);fr=ex.Bullet.PushbackVelY;fs=fq;ft=fr;fv=(fu=fh.JoinIndex-1>>0,((fu<0||fu>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+fu]));fv.VelX=fs;fv.VelY=ft;if(ex.Bullet.BlowUp){fv.CharacterState=8;}else{fv.CharacterState=3;}fx=(fw=fh.JoinIndex-1>>0,((fw<0||fw>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+fw])).FramesToRecover;if(ex.Bullet.HitStunFrames>fx){fv.FramesToRecover=ex.Bullet.HitStunFrames;}$s=31;continue;case 30:fi=fg;case 31:fd++;$s=27;continue;case 28:case 26:et++;$s=23;continue;case 24:fy=b.PlayersArr;fz=0;while(true){if(!(fz=fy.$length)?($throwRuntimeError("index out of range"),undefined):fy.$array[fy.$offset+fz]);gc=gb.JoinIndex;gd=((ga<0||ga>=as.$length)?($throwRuntimeError("index out of range"),undefined):as.$array[as.$offset+ga]);ge=((ga<0||ga>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+ga]);gf=AM(gd.X-(gg=gc-1>>0,((gg<0||gg>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+gg])).X,gd.Y-(gh=gc-1>>0,((gh<0||gh>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+gh])).Y,gd.W*0.5,gd.H*0.5,0,0,0,0,e,f);ge.VirtualGridX=gf[0];ge.VirtualGridY=gf[1];if(ge.InAir){gi=ge.CharacterState;gj=gi;if((gj===(0))||(gj===(1))){if(((ga<0||ga>=q.$length)?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+ga])||(5===gb.CharacterState)){ge.CharacterState=5;}else{ge.CharacterState=4;}}else if(gj===(2)){ge.CharacterState=6;}else if(gj===(3)){ge.CharacterState=7;}}if(!((ge.CharacterState===gb.CharacterState))){ge.FramesInChState=0;}gk=(gl=W[$Int32.keyFor(ge.CharacterState)],gl!==undefined?[gl.v,true]:[false,false]);gm=gk[1];if(gm){ge.ActiveSkillId=-1;ge.ActiveSkillHit=-1;}fz++;}gn=as;go=0;while(true){if(!(go=gn.$length)?($throwRuntimeError("index out of range"),undefined):gn.$array[gn.$offset+go]);gp.Space.Remove(new BO([gp]));go++;}$s=-1;return new M.ptr(b.Id+1>>0,i,new $Int64(0,0),n,BQ.nil,new $Uint64(0,0),false,false);}return;}var $f={$blk:AQ,$c:true,$r,a,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,al,am,an,ao,ap,aq,ar,as,at,au,av,aw,ax,ay,az,b,ba,bb,bc,bd,be,bf,bg,bh,bi,bj,bk,bl,bm,bn,bo,bp,bq,br,bs,bt,bu,bv,bw,bx,by,bz,c,ca,cb,cc,cd,ce,cf,cg,ch,ci,cj,ck,cl,cm,cn,co,cp,cq,cr,cs,ct,cu,cv,cw,cx,cy,cz,d,da,db,dc,dd,de,df,dg,dh,di,dj,dk,dl,dm,dn,dp,dq,dr,ds,dt,du,dv,dw,dx,dy,dz,e,ea,eb,ec,ed,ee,ef,eg,eh,ei,ej,ek,el,em,en,eo,ep,eq,er,es,et,eu,ev,ew,ex,ey,ez,f,fa,fb,fc,fd,fe,ff,fg,fh,fi,fj,fk,fl,fm,fn,fo,fp,fq,fr,fs,ft,fu,fv,fw,fx,fy,fz,g,ga,gb,gc,gd,ge,gf,gg,gh,gi,gj,gk,gl,gm,gn,go,gp,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,$s};return $f;};$pkg.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame=AQ;AR=function(a,b,c,d,e,f,g,h,i,j,k,l){var{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,$s,$r,$c}=$restore(this,{a,b,c,d,e,f,g,h,i,j,k,l});$s=$s||0;s:while(true){switch($s){case 0:m=AK(a,b,c*0.5,d*0.5,e,f,g,h,i,j);n=m[0];o=m[1];p=AS(n,o,g+c+h,f+d+e,k,l);$s=1;case 1:if($c){$c=false;p=p.$blk();}if(p&&p.$blk!==undefined){break s;}q=p;$s=2;case 2:return q;}return;}var $f={$blk:AR,$c:true,$r,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,$s};return $f;};$pkg.GenerateRectCollider=AR;AS=function(a,b,c,d,e,f){var{a,b,c,d,e,f,g,h,$s,$r,$c}=$restore(this,{a,b,c,d,e,f});$s=$s||0;s:while(true){switch($s){case 0:g=B.NewObject(a,b,c,d,new BC([f]));h=B.NewRectangle(0,0,c,d);$r=g.SetShape(h);$s=1;case 1:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}g.Data=e;$s=-1;return g;}return;}var $f={$blk:AS,$c:true,$r,a,b,c,d,e,f,g,h,$s};return $f;};AT=function(a,b,c,d,e){var{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,$s,$r,$c}=$restore(this,{a,b,c,d,e});$s=$s||0;s:while(true){switch($s){case 0:f=AU(a);g=0;h=0;i=g;j=h;k=B.NewConvexPolygon(BR.nil);l=f.Points;m=0;while(true){if(!(m=l.$length)?($throwRuntimeError("index out of range"),undefined):l.$array[l.$offset+m]);p=f.Points;q=0;while(true){if(!(q=p.$length)?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+q]);if(n===r){q++;continue;}if(A.Abs(s.X-o.X)>i){i=A.Abs(s.X-o.X);}if(A.Abs(s.Y-o.Y)>j){j=A.Abs(s.Y-o.Y);}q++;}m++;}t=0;while(true){if(!(t=u.$length)?($throwRuntimeError("index out of range"),undefined):u.$array[u.$offset+t]));k.AddPoints(new BR([v.X,v.Y]));t=t+(1)>>0;}w=B.NewObject(f.Anchor.X+b,f.Anchor.Y+c,i,j,new BC([e]));$r=w.SetShape(k);$s=1;case 1:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}w.Data=d;$s=-1;return w;}return;}var $f={$blk:AT,$c:true,$r,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,$s};return $f;};$pkg.GenerateConvexPolygonCollider=AT;AU=function(a){var a,b,c,d,e,f,g,h,i,j,k;b=new C.ptr(1.7e+308,1.7e+308);c=a.Points;d=0;while(true){if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);if(e.X=g.$length)?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+h]);(k=f.Points,((i<0||i>=k.$length)?($throwRuntimeError("index out of range"),undefined):k.$array[k.$offset+i]=new C.ptr(j.X-b.X,j.Y-b.Y)));h++;}return f;};$pkg.AlignPolygon2DToBoundingBox=AU;BW.methods=[{prop:"Put",name:"Put",pkg:"",typ:$funcType([$emptyInterface],[],false)},{prop:"Pop",name:"Pop",pkg:"",typ:$funcType([],[$emptyInterface],false)},{prop:"GetArrIdxByOffset",name:"GetArrIdxByOffset",pkg:"",typ:$funcType([$Int32],[$Int32],false)},{prop:"GetByOffset",name:"GetByOffset",pkg:"",typ:$funcType([$Int32],[$emptyInterface],false)},{prop:"GetByFrameId",name:"GetByFrameId",pkg:"",typ:$funcType([$Int32],[$emptyInterface],false)},{prop:"SetByFrameId",name:"SetByFrameId",pkg:"",typ:$funcType([$emptyInterface,$Int32],[$Int32,$Int32,$Int32],false)}];C.init("",[{prop:"X",name:"X",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"Y",name:"Y",embedded:false,exported:true,typ:$Float64,tag:""}]);D.init("",[{prop:"Anchor",name:"Anchor",embedded:false,exported:true,typ:BS,tag:""},{prop:"Points",name:"Points",embedded:false,exported:true,typ:BT,tag:""}]);E.init("",[{prop:"Id",name:"Id",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"VirtualGridX",name:"VirtualGridX",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"VirtualGridY",name:"VirtualGridY",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"DirX",name:"DirX",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"DirY",name:"DirY",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"VelX",name:"VelX",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"VelY",name:"VelY",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"Speed",name:"Speed",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"BattleState",name:"BattleState",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"JoinIndex",name:"JoinIndex",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"ColliderRadius",name:"ColliderRadius",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"Removed",name:"Removed",embedded:false,exported:true,typ:$Bool,tag:""},{prop:"Score",name:"Score",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"LastMoveGmtMillis",name:"LastMoveGmtMillis",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"FramesToRecover",name:"FramesToRecover",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"FramesInChState",name:"FramesInChState",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"Hp",name:"Hp",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"MaxHp",name:"MaxHp",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"CharacterState",name:"CharacterState",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"InAir",name:"InAir",embedded:false,exported:true,typ:$Bool,tag:""},{prop:"ActiveSkillId",name:"ActiveSkillId",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"ActiveSkillHit",name:"ActiveSkillHit",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"FramesInvinsible",name:"FramesInvinsible",embedded:false,exported:true,typ:$Int32,tag:""}]);F.init("",[{prop:"Dx",name:"Dx",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"Dy",name:"Dy",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"BtnALevel",name:"BtnALevel",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"BtnBLevel",name:"BtnBLevel",embedded:false,exported:true,typ:$Int32,tag:""}]);H.init("",[{prop:"Boundary",name:"Boundary",embedded:false,exported:true,typ:BU,tag:""}]);I.init("",[{prop:"OriginatedRenderFrameId",name:"OriginatedRenderFrameId",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"OffenderJoinIndex",name:"OffenderJoinIndex",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"StartupFrames",name:"StartupFrames",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"CancellableStFrame",name:"CancellableStFrame",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"CancellableEdFrame",name:"CancellableEdFrame",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"ActiveFrames",name:"ActiveFrames",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"HitStunFrames",name:"HitStunFrames",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"BlockStunFrames",name:"BlockStunFrames",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"PushbackVelX",name:"PushbackVelX",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"PushbackVelY",name:"PushbackVelY",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"Damage",name:"Damage",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"SelfLockVelX",name:"SelfLockVelX",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"SelfLockVelY",name:"SelfLockVelY",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"HitboxOffsetX",name:"HitboxOffsetX",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"HitboxOffsetY",name:"HitboxOffsetY",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"HitboxSizeX",name:"HitboxSizeX",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"HitboxSizeY",name:"HitboxSizeY",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"BlowUp",name:"BlowUp",embedded:false,exported:true,typ:$Bool,tag:""},{prop:"CancelTransit",name:"CancelTransit",embedded:false,exported:true,typ:BV,tag:""}]);J.init("",[{prop:"Bullet",name:"Bullet",embedded:true,exported:true,typ:I,tag:""}]);K.init("",[{prop:"VirtualGridX",name:"VirtualGridX",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"VirtualGridY",name:"VirtualGridY",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"DirX",name:"DirX",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"DirY",name:"DirY",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"VelX",name:"VelX",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"VelY",name:"VelY",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"Speed",name:"Speed",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"Bullet",name:"Bullet",embedded:true,exported:true,typ:I,tag:""}]);L.init("",[{prop:"BattleLocalId",name:"BattleLocalId",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"RecoveryFrames",name:"RecoveryFrames",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"RecoveryFramesOnBlock",name:"RecoveryFramesOnBlock",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"RecoveryFramesOnHit",name:"RecoveryFramesOnHit",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"ReleaseTriggerType",name:"ReleaseTriggerType",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"BoundChState",name:"BoundChState",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"Hits",name:"Hits",embedded:false,exported:true,typ:AX,tag:""}]);M.init("",[{prop:"Id",name:"Id",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"PlayersArr",name:"PlayersArr",embedded:false,exported:true,typ:BJ,tag:""},{prop:"CountdownNanos",name:"CountdownNanos",embedded:false,exported:true,typ:$Int64,tag:""},{prop:"MeleeBullets",name:"MeleeBullets",embedded:false,exported:true,typ:BK,tag:""},{prop:"FireballBullets",name:"FireballBullets",embedded:false,exported:true,typ:BQ,tag:""},{prop:"BackendUnconfirmedMask",name:"BackendUnconfirmedMask",embedded:false,exported:true,typ:$Uint64,tag:""},{prop:"ShouldForceResync",name:"ShouldForceResync",embedded:false,exported:true,typ:$Bool,tag:""},{prop:"PlayerOpPatternToSkillId",name:"PlayerOpPatternToSkillId",embedded:false,exported:true,typ:BV,tag:""}]);N.init("",[{prop:"InputFrameId",name:"InputFrameId",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"InputList",name:"InputList",embedded:false,exported:true,typ:BI,tag:""},{prop:"ConfirmedList",name:"ConfirmedList",embedded:false,exported:true,typ:$Uint64,tag:""}]);O.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:AX,tag:""}]);Q.init([$Int,BF],[$Int],false);R.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:Q,tag:""}]);AE.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:B.Vector,tag:""}]);$init=function(){$pkg.$init=function(){};var $f,$c=false,$s=0,$r;if(this!==undefined&&this.$blk!==undefined){$f=this;$c=true;$s=$f.$s;$r=$f.$r;}s:while(true){switch($s){case 0:$r=A.$init();$s=1;case 1:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}$r=B.$init();$s=2;case 2:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}$pkg.DIRECTION_DECODER=new AW([new AV([0,0]),new AV([0,2]),new AV([0,-2]),new AV([2,0]),new AV([-2,0]),new AV([1,1]),new AV([-1,-1]),new AV([1,-1]),new AV([-1,1])]);S=$makeMap($Int.keyFor,[{k:1,v:new L.ptr(0,30,30,30,1,2,new AX([new J.ptr(new I.ptr(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}])))]))},{k:2,v:new L.ptr(0,36,36,36,1,11,new AX([new J.ptr(new I.ptr(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}])))]))},{k:3,v:new L.ptr(0,50,50,50,1,12,new AX([new J.ptr(new I.ptr(0,0,15,0,0,30,999999999,9,200,700,10,50,500,3200,0,4800,3200,true,false))]))},{k:4,v:new L.ptr(0,30,30,30,1,2,new AX([new J.ptr(new I.ptr(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}])))]))},{k:5,v:new L.ptr(0,36,36,36,1,11,new AX([new J.ptr(new I.ptr(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}])))]))},{k:6,v:new L.ptr(0,45,45,45,1,12,new AX([new J.ptr(new I.ptr(0,0,15,0,0,28,999999999,9,200,700,10,-10,-1,2400,0,3200,3200,true,false))]))},{k:255,v:new L.ptr(0,30,30,30,1,6,new AX([new J.ptr(new I.ptr(0,0,3,0,0,20,18,9,50,0,5,-1,-1,1200,0,3200,2400,false,false))]))},{k:256,v:new L.ptr(0,20,20,20,1,6,new AX([new J.ptr(new I.ptr(0,0,3,0,0,10,15,9,50,0,5,-1,-1,1200,0,3200,2400,false,false))]))}]);$pkg.Characters=$makeMap($Int.keyFor,[{k:0,v:new R.ptr(0,"MonkGirl",11,1,16,16,10,27,120,800,(function(a,b){var a,b,c,d,e,f,g,h,i,j,k,l,m,n;if(1===a){if(0===b.FramesToRecover){if(b.InAir){return 255;}else{return 1;}}else{c=(d=S[$Int.keyFor(((b.ActiveSkillId>>0)))],d!==undefined?[d.v,true]:[AY.nil,false]);e=c[0];f=c[1];if(f){g=(h=e.Hits,i=b.ActiveSkillHit,((i<0||i>=h.$length)?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+i]));if($assertType(g,AZ,true)[1]){j=g.$val;if(j.Bullet.CancellableStFrame<=b.FramesInChState&&b.FramesInChState>0)))],d!==undefined?[d.v,true]:[AY.nil,false]);e=c[0];f=c[1];if(f){g=(h=e.Hits,i=b.ActiveSkillHit,((i<0||i>=h.$length)?($throwRuntimeError("index out of range"),undefined):h.$array[h.$offset+i]));if($assertType(g,AZ,true)[1]){j=g.$val;if(j.Bullet.CancellableStFrame<=b.FramesInChState&&b.FramesInChState=d.$length)?($throwRuntimeError("index out of range"),undefined):d.$array[d.$offset+e]);g=A.MakeFullWrapper(f);$s=3;case 3:if($c){$c=false;g=g.$blk();}if(g&&g.$blk!==undefined){break s;}c=$append(c,g);e++;$s=1;continue;case 2:$s=-1;return c;}return;}var $f={$blk:M,$c:true,$r,a,b,c,d,e,f,g,$s};return $f;};$pkg.GetCollisionSpaceObjsJs=M;N=function(a,b,c,d,e,f,g,h){var{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,$s,$r,$c}=$restore(this,{a,b,c,d,e,f,g,h});$s=$s||0;s:while(true){switch($s){case 0:i=0.1;j=0.1;k=0.1;l=0.1;m=i;n=j;o=k;p=l;q=B.GenerateRectCollider(a,b,c,d,m,n,o,p,e,f,g,h);$s=1;case 1:if($c){$c=false;q=q.$blk();}if(q&&q.$blk!==undefined){break s;}r=A.MakeFullWrapper(q);$s=2;case 2:if($c){$c=false;r=r.$blk();}if(r&&r.$blk!==undefined){break s;}s=r;$s=3;case 3:return s;}return;}var $f={$blk:N,$c:true,$r,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,$s};return $f;};$pkg.GenerateRectColliderJs=N;O=function(a,b,c,d,e){var{a,b,c,d,e,f,g,h,$s,$r,$c}=$restore(this,{a,b,c,d,e});$s=$s||0;s:while(true){switch($s){case 0:f=B.GenerateConvexPolygonCollider(a,b,c,d,e);$s=1;case 1:if($c){$c=false;f=f.$blk();}if(f&&f.$blk!==undefined){break s;}g=A.MakeFullWrapper(f);$s=2;case 2:if($c){$c=false;g=g.$blk();}if(g&&g.$blk!==undefined){break s;}h=g;$s=3;case 3:return h;}return;}var $f={$blk:O,$c:true,$r,a,b,c,d,e,f,g,h,$s};return $f;};$pkg.GenerateConvexPolygonColliderJs=O;P=function(a){var{a,b,c,d,e,f,g,h,$s,$r,$c}=$restore(this,{a});$s=$s||0;s:while(true){switch($s){case 0:b=$makeSlice(AD,a.$length,a.$length);c=a;d=0;case 1:if(!(d=c.$length)?($throwRuntimeError("index out of range"),undefined):c.$array[c.$offset+d]);h=A.MakeFullWrapper((g=B.Characters[$Int.keyFor(f)],g!==undefined?g.v:AE.nil));$s=3;case 3:if($c){$c=false;h=h.$blk();}if(h&&h.$blk!==undefined){break s;}((e<0||e>=b.$length)?($throwRuntimeError("index out of range"),undefined):b.$array[b.$offset+e]=h);d++;$s=1;continue;case 2:$s=-1;return b;}return;}var $f={$blk:P,$c:true,$r,a,b,c,d,e,f,g,h,$s};return $f;};$pkg.GetCharacterConfigsOrderedByJoinIndex=P;Q=function(a,b,c,d,e,f,g){var{a,b,c,d,e,f,g,h,i,j,$s,$r,$c}=$restore(this,{a,b,c,d,e,f,g});$s=$s||0;s:while(true){switch($s){case 0:h=B.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(a,b,c,d,e,f,g);$s=1;case 1:if($c){$c=false;h=h.$blk();}if(h&&h.$blk!==undefined){break s;}i=A.MakeFullWrapper(h);$s=2;case 2:if($c){$c=false;i=i.$blk();}if(i&&i.$blk!==undefined){break s;}j=i;$s=3;case 3:return j;}return;}var $f={$blk:Q,$c:true,$r,a,b,c,d,e,f,g,h,i,j,$s};return $f;};$pkg.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs=Q;R=function(){$global.gopkgs=$externalize($makeMap($String.keyFor,[{k:"NewVec2DJs",v:new AF(G)},{k:"NewPolygon2DJs",v:new AG(H)},{k:"NewBarrierJs",v:new AH(I)},{k:"NewPlayerDownsyncJs",v:new AI(J)},{k:"NewMeleeBulletJs",v:new AJ(K)},{k:"NewRoomDownsyncFrameJs",v:new AK(L)},{k:"NewCollisionSpaceJs",v:new AL(F)},{k:"NewInputFrameDownsync",v:new AM(D)},{k:"NewRingBufferJs",v:new AN(E)},{k:"GenerateRectColliderJs",v:new AO(N)},{k:"GenerateConvexPolygonColliderJs",v:new AP(O)},{k:"GetCollisionSpaceObjsJs",v:new AR(M)},{k:"WorldToPolygonColliderBLPos",v:new AS(B.WorldToPolygonColliderBLPos)},{k:"PolygonColliderBLToWorldPos",v:new AS(B.PolygonColliderBLToWorldPos)},{k:"WorldToVirtualGridPos",v:new AT(B.WorldToVirtualGridPos)},{k:"VirtualGridToWorldPos",v:new AU(B.VirtualGridToWorldPos)},{k:"GetCharacterConfigsOrderedByJoinIndex",v:new AW(P)},{k:"ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs",v:new BC(Q)},{k:"ConvertToDelayedInputFrameId",v:new BD(B.ConvertToDelayedInputFrameId)},{k:"ConvertToNoDelayInputFrameId",v:new BD(B.ConvertToNoDelayInputFrameId)},{k:"ConvertToFirstUsedRenderFrameId",v:new BD(B.ConvertToFirstUsedRenderFrameId)},{k:"ConvertToLastUsedRenderFrameId",v:new BD(B.ConvertToLastUsedRenderFrameId)},{k:"ShouldGenerateInputFrameUpsync",v:new BE(B.ShouldGenerateInputFrameUpsync)}]),BF);};$init=function(){$pkg.$init=function(){};var $f,$c=false,$s=0,$r;if(this!==undefined&&this.$blk!==undefined){$f=this;$c=true;$s=$f.$s;$r=$f.$r;}s:while(true){switch($s){case 0:$r=A.$init();$s=1;case 1:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}$r=B.$init();$s=2;case 2:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}$r=C.$init();$s=3;case 3:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}if($pkg===$mainPkg){R();$mainFinished=true;}}return;}if($f===undefined){$f={$blk:$init};}$f.$s=$s;$f.$r=$r;return $f;};$pkg.$init=$init;return $pkg;})(); $synthesizeMethods(); $initAllLinknames(); var $mainPkg = $packages["jsexport"]; diff --git a/frontend/assets/resources/animation/KnifeGirl.meta b/frontend/assets/resources/animation/KnifeGirl.meta new file mode 100644 index 0000000..6988f8b --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl.meta @@ -0,0 +1,7 @@ +{ + "ver": "1.0.1", + "uuid": "15043c55-01a9-408c-b985-910c5de144c7", + "isSubpackage": false, + "subpackageName": "", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/KnifeGirl/Atk1.anim b/frontend/assets/resources/animation/KnifeGirl/Atk1.anim new file mode 100644 index 0000000..87bd8ec --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/Atk1.anim @@ -0,0 +1,91 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "Atk1", + "_objFlags": 0, + "_native": "", + "_duration": 0.6, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "6b2a1a09-8236-4972-8aee-1781b6547d4e" + } + }, + { + "frame": 0.06666666666666667, + "value": { + "__uuid__": "5b269b2e-0800-4bf5-b5db-055b78cf318d" + } + }, + { + "frame": 0.11666666666666667, + "value": { + "__uuid__": "e184f831-3f90-47cb-8ca5-ad9446ba0398" + } + }, + { + "frame": 0.18333333333333332, + "value": { + "__uuid__": "f260f82b-10cf-49af-b46c-cd8dc7a3503f" + } + }, + { + "frame": 0.23333333333333334, + "value": { + "__uuid__": "09f43e75-0986-4b8f-907b-e5a5a73b7c54" + } + }, + { + "frame": 0.2833333333333333, + "value": { + "__uuid__": "d7432402-fcbd-4e2e-b2c1-33364f31948b" + } + }, + { + "frame": 0.3333333333333333, + "value": { + "__uuid__": "8acf1c5a-6910-47d6-aa18-1e6f07546d7a" + } + }, + { + "frame": 0.38333333333333336, + "value": { + "__uuid__": "76120dbd-6390-4706-9580-dcec9687e83e" + } + }, + { + "frame": 0.43333333333333335, + "value": { + "__uuid__": "f9a7a04a-2369-4946-8313-c2da896da51e" + } + }, + { + "frame": 0.48333333333333334, + "value": { + "__uuid__": "c8fb14e2-745e-4a2b-b235-d43195052652" + } + }, + { + "frame": 0.5333333333333333, + "value": { + "__uuid__": "1f23e0e5-830c-4d07-8f80-cbb98a2a1954" + } + }, + { + "frame": 0.5833333333333334, + "value": { + "__uuid__": "4c512398-4290-4fdf-bb21-2b0062a9071b" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/KnifeGirl/Atk1.anim.meta b/frontend/assets/resources/animation/KnifeGirl/Atk1.anim.meta new file mode 100644 index 0000000..1848098 --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/Atk1.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "829b17c6-9365-4e97-b14f-fa266bd5ecbe", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/KnifeGirl/Atk2.anim b/frontend/assets/resources/animation/KnifeGirl/Atk2.anim new file mode 100644 index 0000000..a73ecfe --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/Atk2.anim @@ -0,0 +1,91 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "Atk2", + "_objFlags": 0, + "_native": "", + "_duration": 1.0166666666666666, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "60f9f7d4-5cf7-4098-9455-0f6a74963fc6" + } + }, + { + "frame": 0.06666666666666667, + "value": { + "__uuid__": "dd9a00aa-ddbc-4b01-a7cb-3c43c3a655b6" + } + }, + { + "frame": 0.11666666666666667, + "value": { + "__uuid__": "f66e83bd-1afc-4957-bb16-488d70566ed1" + } + }, + { + "frame": 0.16666666666666666, + "value": { + "__uuid__": "bd682c41-dc62-49ff-a96a-18b33e50a6de" + } + }, + { + "frame": 0.23333333333333334, + "value": { + "__uuid__": "94ccab85-e32f-4e13-b0e5-72c798f78ad1" + } + }, + { + "frame": 0.3, + "value": { + "__uuid__": "e80d3a01-5048-42b7-a280-cb6aa01602c2" + } + }, + { + "frame": 0.36666666666666664, + "value": { + "__uuid__": "d899088c-be62-47b4-9ebf-0a89a2261565" + } + }, + { + "frame": 0.4166666666666667, + "value": { + "__uuid__": "5b1e5aa7-fd82-47ae-a5b2-6d4983d848ed" + } + }, + { + "frame": 0.48333333333333334, + "value": { + "__uuid__": "c2945988-b4bb-4583-a5ef-2fa02b23a347" + } + }, + { + "frame": 0.5666666666666667, + "value": { + "__uuid__": "070ea1e3-9c07-4735-8b94-515ef70216ad" + } + }, + { + "frame": 0.6666666666666666, + "value": { + "__uuid__": "3b8bc5c0-26df-4218-b7dc-134a36080a35" + } + }, + { + "frame": 1, + "value": { + "__uuid__": "3898259f-a3b0-490d-b260-f86ab5109dfe" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/KnifeGirl/Atk2.anim.meta b/frontend/assets/resources/animation/KnifeGirl/Atk2.anim.meta new file mode 100644 index 0000000..ddd24ea --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/Atk2.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "52b8e47d-715c-4c12-a2c9-6f553e14dc42", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/KnifeGirl/Atk3.anim b/frontend/assets/resources/animation/KnifeGirl/Atk3.anim new file mode 100644 index 0000000..6497ec2 --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/Atk3.anim @@ -0,0 +1,79 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "Atk3", + "_objFlags": 0, + "_native": "", + "_duration": 1.0166666666666666, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "51ab185b-2271-48b5-a897-af79721d566c" + } + }, + { + "frame": 0.05, + "value": { + "__uuid__": "c29fd95d-7467-4138-9e01-6421af63dd68" + } + }, + { + "frame": 0.1, + "value": { + "__uuid__": "3285b5eb-c6be-4cb9-ac60-c506645fee4b" + } + }, + { + "frame": 0.16666666666666666, + "value": { + "__uuid__": "13fd4a87-71f4-4b69-a5b3-413d564c35e6" + } + }, + { + "frame": 0.25, + "value": { + "__uuid__": "7189e229-00d6-427a-8ea1-d05fbd97824f" + } + }, + { + "frame": 0.45, + "value": { + "__uuid__": "d9ccfe33-3db7-4b3a-807c-adb2121fb7c7" + } + }, + { + "frame": 0.6833333333333333, + "value": { + "__uuid__": "a51cbc29-0826-46f7-a38b-8b0f996fbace" + } + }, + { + "frame": 0.8833333333333333, + "value": { + "__uuid__": "7e9f3a24-6abc-4b49-a5c5-a0c100865ffc" + } + }, + { + "frame": 0.95, + "value": { + "__uuid__": "ecbaeb43-1118-483a-91c9-ff1ff01b7b33" + } + }, + { + "frame": 1, + "value": { + "__uuid__": "58afa365-a916-4ec6-aab3-1c87f5332b12" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/KnifeGirl/Atk3.anim.meta b/frontend/assets/resources/animation/KnifeGirl/Atk3.anim.meta new file mode 100644 index 0000000..411a75a --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/Atk3.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "9b500cb0-8048-4715-81db-cc975c914225", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/KnifeGirl/Atked1.anim b/frontend/assets/resources/animation/KnifeGirl/Atked1.anim new file mode 100644 index 0000000..61a94da --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/Atked1.anim @@ -0,0 +1,43 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "Atked1", + "_objFlags": 0, + "_native": "", + "_duration": 0.26666666666666666, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "9b90ae89-7fbe-4bb6-ab15-fc08462f54c5" + } + }, + { + "frame": 0.1, + "value": { + "__uuid__": "aeb3553a-6de4-4197-9f06-d7cc3fa7c4cf" + } + }, + { + "frame": 0.16666666666666666, + "value": { + "__uuid__": "07650461-a7c0-4638-92fc-fa436752c045" + } + }, + { + "frame": 0.25, + "value": { + "__uuid__": "ca22d473-83aa-4146-b732-89d0246a2968" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/KnifeGirl/Atked1.anim.meta b/frontend/assets/resources/animation/KnifeGirl/Atked1.anim.meta new file mode 100644 index 0000000..3cf3078 --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/Atked1.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "2a50c853-000b-46f3-ae59-1dfb793de814", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/KnifeGirl/BlownUp1.anim b/frontend/assets/resources/animation/KnifeGirl/BlownUp1.anim new file mode 100644 index 0000000..e0d6272 --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/BlownUp1.anim @@ -0,0 +1,43 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "BlownUp1", + "_objFlags": 0, + "_native": "", + "_duration": 0.4166666666666667, + "sample": 60, + "speed": 1, + "wrapMode": 2, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "0ea84f61-4a2f-4ca2-a0b8-b580e027c142" + } + }, + { + "frame": 0.11666666666666667, + "value": { + "__uuid__": "a3a31fcd-a162-456a-9c26-1f32413f87f3" + } + }, + { + "frame": 0.25, + "value": { + "__uuid__": "da4ee0a0-ba66-455c-99d3-9c803a3d0f17" + } + }, + { + "frame": 0.4, + "value": { + "__uuid__": "4c058d60-e727-4438-b058-6e51969df458" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/KnifeGirl/BlownUp1.anim.meta b/frontend/assets/resources/animation/KnifeGirl/BlownUp1.anim.meta new file mode 100644 index 0000000..42d5cde --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/BlownUp1.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "0892a3ea-9da1-4157-825b-0c8ef1c73eeb", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/KnifeGirl/GetUp1.anim b/frontend/assets/resources/animation/KnifeGirl/GetUp1.anim new file mode 100644 index 0000000..20a9ef3 --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/GetUp1.anim @@ -0,0 +1,61 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "GetUp1", + "_objFlags": 0, + "_native": "", + "_duration": 0.5166666666666667, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "3f26b0a4-db13-4a14-b885-5a812073eccf" + } + }, + { + "frame": 0.08333333333333333, + "value": { + "__uuid__": "23eb42d6-52a2-458d-98a3-2f692dd79398" + } + }, + { + "frame": 0.16666666666666666, + "value": { + "__uuid__": "7bd4428c-44f9-4ff8-8d00-d3448a27a0c4" + } + }, + { + "frame": 0.25, + "value": { + "__uuid__": "57640cd8-17eb-4279-a118-1ea40174da3c" + } + }, + { + "frame": 0.35, + "value": { + "__uuid__": "56a2c954-6d04-433c-8ae4-f1bc7a0e9469" + } + }, + { + "frame": 0.43333333333333335, + "value": { + "__uuid__": "b4dc81a3-eb90-4722-9296-5158f004fd4c" + } + }, + { + "frame": 0.5, + "value": { + "__uuid__": "c156fa2c-0c4e-4413-80c1-accf8fea4779" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/KnifeGirl/GetUp1.anim.meta b/frontend/assets/resources/animation/KnifeGirl/GetUp1.anim.meta new file mode 100644 index 0000000..55c64ca --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/GetUp1.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "7d69868f-d474-4d86-a262-01f1cdd49021", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/KnifeGirl/Idle1.anim b/frontend/assets/resources/animation/KnifeGirl/Idle1.anim new file mode 100644 index 0000000..19dd6bd --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/Idle1.anim @@ -0,0 +1,109 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "Idle1", + "_objFlags": 0, + "_native": "", + "_duration": 2.0166666666666666, + "sample": 60, + "speed": 1, + "wrapMode": 2, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "51ede1f1-5e65-4b69-8fbc-5b7df2a7c90f" + } + }, + { + "frame": 0.11666666666666667, + "value": { + "__uuid__": "b0f1ecf7-be41-46a8-bccb-92ee53b4ef88" + } + }, + { + "frame": 0.21666666666666667, + "value": { + "__uuid__": "944adaee-5e11-4c55-9573-1d529f21ed4b" + } + }, + { + "frame": 0.31666666666666665, + "value": { + "__uuid__": "ede36130-8312-46a2-abe5-ba102bc97822" + } + }, + { + "frame": 0.45, + "value": { + "__uuid__": "32dbb977-301c-4fbd-a19c-14a5ce0e2f5b" + } + }, + { + "frame": 0.6, + "value": { + "__uuid__": "581c7ab1-451d-46b0-9eeb-24cf3b898924" + } + }, + { + "frame": 0.7666666666666667, + "value": { + "__uuid__": "27005132-eda8-4c3f-9f4a-3a6004245e9f" + } + }, + { + "frame": 0.9166666666666666, + "value": { + "__uuid__": "2b339657-aa80-4ab6-a4dd-83e9c12b6a54" + } + }, + { + "frame": 1.0666666666666667, + "value": { + "__uuid__": "08e25a99-158d-4159-8152-6c9047fe9d54" + } + }, + { + "frame": 1.2166666666666666, + "value": { + "__uuid__": "ab739541-39b5-4758-9b93-6681d6038730" + } + }, + { + "frame": 1.3833333333333333, + "value": { + "__uuid__": "9ecbf97e-34bc-4c5e-b9e8-4d885a02e0d3" + } + }, + { + "frame": 1.5333333333333334, + "value": { + "__uuid__": "e7d9a7c9-47ec-4335-97c9-19ed6ee3d9ce" + } + }, + { + "frame": 1.7, + "value": { + "__uuid__": "cf258753-3900-4de4-a0bb-09158500fd9a" + } + }, + { + "frame": 1.85, + "value": { + "__uuid__": "be7bedfe-7054-4092-89fc-ca397460f140" + } + }, + { + "frame": 2, + "value": { + "__uuid__": "b1b467dd-1757-4ff1-9909-3449f74463d8" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/KnifeGirl/Idle1.anim.meta b/frontend/assets/resources/animation/KnifeGirl/Idle1.anim.meta new file mode 100644 index 0000000..960a287 --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/Idle1.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "5afe50e0-d03f-4d48-a7c0-a350c36e14d4", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/KnifeGirl/InAirAtk1.anim b/frontend/assets/resources/animation/KnifeGirl/InAirAtk1.anim new file mode 100644 index 0000000..06df660 --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/InAirAtk1.anim @@ -0,0 +1,55 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "InAirAtk1", + "_objFlags": 0, + "_native": "", + "_duration": 0.38333333333333336, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "e6a3099f-b4c3-425f-a66b-9b992ae1c7b0" + } + }, + { + "frame": 0.05, + "value": { + "__uuid__": "cade5a52-282e-47e5-aca9-5abb4f6afd14" + } + }, + { + "frame": 0.1, + "value": { + "__uuid__": "96b0b028-3045-4a04-bf9c-c957f8c9e9ab" + } + }, + { + "frame": 0.25, + "value": { + "__uuid__": "567f6bb7-c764-4c1d-bfec-f5c0c9812192" + } + }, + { + "frame": 0.31666666666666665, + "value": { + "__uuid__": "5d0c32b4-52ce-4157-9b91-dd400a7ed07a" + } + }, + { + "frame": 0.36666666666666664, + "value": { + "__uuid__": "fcef9c9b-dc71-459c-a541-9273b6e3923a" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/KnifeGirl/InAirAtk1.anim.meta b/frontend/assets/resources/animation/KnifeGirl/InAirAtk1.anim.meta new file mode 100644 index 0000000..36c3312 --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/InAirAtk1.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "0e7468cc-b90d-4f68-91ce-0be126b406dd", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/KnifeGirl/InAirAtked1.anim b/frontend/assets/resources/animation/KnifeGirl/InAirAtked1.anim new file mode 100644 index 0000000..907a389 --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/InAirAtked1.anim @@ -0,0 +1,31 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "InAirAtked1", + "_objFlags": 0, + "_native": "", + "_duration": 0.08333333333333333, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "01e8b938-03cb-4519-a417-384c31131a27" + } + }, + { + "frame": 0.06666666666666667, + "value": { + "__uuid__": "d7970a18-f3af-44c6-b216-ee55b9a1b32c" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/KnifeGirl/InAirAtked1.anim.meta b/frontend/assets/resources/animation/KnifeGirl/InAirAtked1.anim.meta new file mode 100644 index 0000000..1937862 --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/InAirAtked1.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "c86debde-118b-46b8-b483-f5ccec337315", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/KnifeGirl/InAirIdle1ByJump.anim b/frontend/assets/resources/animation/KnifeGirl/InAirIdle1ByJump.anim new file mode 100644 index 0000000..18f6225 --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/InAirIdle1ByJump.anim @@ -0,0 +1,79 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "InAirIdle1ByJump", + "_objFlags": 0, + "_native": "", + "_duration": 0.4666666666666667, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "6ff7b4e6-80ec-4673-b47b-e0bba7567c3c" + } + }, + { + "frame": 0.05, + "value": { + "__uuid__": "4ff35932-9869-4c78-9f75-b304eee46647" + } + }, + { + "frame": 0.1, + "value": { + "__uuid__": "6b1355c5-a750-4e37-9018-de1b84238f6c" + } + }, + { + "frame": 0.15, + "value": { + "__uuid__": "01193448-adb0-4364-94f3-ca810897f397" + } + }, + { + "frame": 0.2, + "value": { + "__uuid__": "f4f0cd5d-835b-44c3-8cc9-2651dd00cd37" + } + }, + { + "frame": 0.25, + "value": { + "__uuid__": "4c32b2d6-346f-4d6e-a92e-6678e4c4b1ad" + } + }, + { + "frame": 0.3, + "value": { + "__uuid__": "30ef09b2-366a-4946-b556-2c0fac359c0b" + } + }, + { + "frame": 0.35, + "value": { + "__uuid__": "6ab33993-124f-429e-ba4c-b0f6824ea6c7" + } + }, + { + "frame": 0.4, + "value": { + "__uuid__": "e0612a37-a743-40fe-83ff-f189971f1992" + } + }, + { + "frame": 0.45, + "value": { + "__uuid__": "6ff230eb-44e8-4ca9-97d0-1b059aa1e21b" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/KnifeGirl/InAirIdle1ByJump.anim.meta b/frontend/assets/resources/animation/KnifeGirl/InAirIdle1ByJump.anim.meta new file mode 100644 index 0000000..617aa4b --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/InAirIdle1ByJump.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "c4ddf3ea-2292-4511-a320-5486934ac361", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/KnifeGirl/InAirIdle1NoJump.anim b/frontend/assets/resources/animation/KnifeGirl/InAirIdle1NoJump.anim new file mode 100644 index 0000000..efef36d --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/InAirIdle1NoJump.anim @@ -0,0 +1,25 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "InAirIdle1NoJump", + "_objFlags": 0, + "_native": "", + "_duration": 0.016666666666666666, + "sample": 60, + "speed": 1, + "wrapMode": 2, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "6ff230eb-44e8-4ca9-97d0-1b059aa1e21b" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/KnifeGirl/InAirIdle1NoJump.anim.meta b/frontend/assets/resources/animation/KnifeGirl/InAirIdle1NoJump.anim.meta new file mode 100644 index 0000000..a578459 --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/InAirIdle1NoJump.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "bc461a02-4d1a-46a4-9f3c-7370adc6c1c8", + "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 new file mode 100644 index 0000000..fbfe783 --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.plist @@ -0,0 +1,1481 @@ + + + + + frames + + Atk1_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,128} + spriteSourceSize + {112,128} + textureRect + {{824,544},{112,128}} + textureRotated + + + Atk1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,128} + spriteSourceSize + {112,128} + textureRect + {{0,1200},{112,128}} + textureRotated + + + Atk1_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {64,128} + spriteSourceSize + {64,128} + textureRect + {{616,403},{64,128}} + textureRotated + + + Atk1_11.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,128} + spriteSourceSize + {80,128} + textureRect + {{940,0},{80,128}} + textureRotated + + + Atk1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,128} + spriteSourceSize + {80,128} + textureRect + {{940,128},{80,128}} + textureRotated + + + Atk1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,128} + spriteSourceSize + {112,128} + textureRect + {{0,964},{112,128}} + textureRotated + + + Atk1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,128} + spriteSourceSize + {112,128} + textureRect + {{112,964},{112,128}} + textureRotated + + + Atk1_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,128} + spriteSourceSize + {96,128} + textureRect + {{840,288},{96,128}} + textureRotated + + + Atk1_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,128} + spriteSourceSize + {96,128} + textureRect + {{840,416},{96,128}} + textureRotated + + + Atk1_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,128} + spriteSourceSize + {80,128} + textureRect + {{940,256},{80,128}} + textureRotated + + + Atk1_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,128} + spriteSourceSize + {80,128} + textureRect + {{936,384},{80,128}} + textureRotated + + + Atk1_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,128} + spriteSourceSize + {80,128} + textureRect + {{936,512},{80,128}} + textureRotated + + + Atk2_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,128} + spriteSourceSize + {80,128} + textureRect + {{936,640},{80,128}} + textureRotated + + + Atk2_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,128} + spriteSourceSize + {96,128} + textureRect + {{582,531},{96,128}} + textureRotated + + + Atk2_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {128,112} + spriteSourceSize + {128,112} + textureRect + {{326,871},{128,112}} + textureRotated + + + Atk2_11.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,96} + spriteSourceSize + {96,96} + textureRect + {{696,1200},{96,96}} + textureRotated + + + Atk2_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,112} + spriteSourceSize + {96,112} + textureRect + {{416,983},{96,112}} + textureRotated + + + Atk2_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,112} + spriteSourceSize + {96,112} + textureRect + {{656,1092},{96,112}} + textureRotated + + + Atk2_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,112} + spriteSourceSize + {96,112} + textureRect + {{528,1113},{96,112}} + textureRotated + + + Atk2_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,112} + spriteSourceSize + {96,112} + textureRect + {{392,1207},{96,112}} + textureRotated + + + Atk2_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {144,112} + spriteSourceSize + {144,112} + textureRect + {{328,403},{144,112}} + textureRotated + + + Atk2_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {128,112} + spriteSourceSize + {128,112} + textureRect + {{454,871},{128,112}} + textureRotated + + + Atk2_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {160,112} + spriteSourceSize + {160,112} + textureRect + {{680,288},{160,112}} + textureRotated + + + Atk2_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {144,112} + spriteSourceSize + {144,112} + textureRect + {{472,403},{144,112}} + textureRotated + + + Atk3_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {188,144} + spriteSourceSize + {188,144} + textureRect + {{0,0},{188,144}} + textureRotated + + + Atk3_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {188,144} + spriteSourceSize + {188,144} + textureRect + {{188,0},{188,144}} + textureRotated + + + Atk3_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {188,144} + spriteSourceSize + {188,144} + textureRect + {{376,0},{188,144}} + textureRotated + + + Atk3_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {188,144} + spriteSourceSize + {188,144} + textureRect + {{564,0},{188,144}} + textureRotated + + + Atk3_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {188,144} + spriteSourceSize + {188,144} + textureRect + {{752,0},{188,144}} + textureRotated + + + Atk3_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {188,144} + spriteSourceSize + {188,144} + textureRect + {{0,144},{188,144}} + textureRotated + + + Atk3_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {188,144} + spriteSourceSize + {188,144} + textureRect + {{188,144},{188,144}} + textureRotated + + + Atk3_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {188,144} + spriteSourceSize + {188,144} + textureRect + {{376,144},{188,144}} + textureRotated + + + Atk3_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {188,144} + spriteSourceSize + {188,144} + textureRect + {{564,144},{188,144}} + textureRotated + + + Atk3_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {188,144} + spriteSourceSize + {188,144} + textureRect + {{752,144},{188,144}} + textureRotated + + + Atked1_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,128} + spriteSourceSize + {96,128} + textureRect + {{582,659},{96,128}} + textureRotated + + + Atked1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,112} + spriteSourceSize + {112,112} + textureRect + {{240,1081},{112,112}} + textureRotated + + + Atked1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,112} + spriteSourceSize + {96,112} + textureRect + {{504,1209},{96,112}} + textureRotated + + + Atked1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {128,112} + spriteSourceSize + {128,112} + textureRect + {{678,980},{128,112}} + textureRotated + + + BlownUp1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {164,115} + spriteSourceSize + {164,115} + textureRect + {{352,288},{164,115}} + textureRotated + + + BlownUp1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {164,115} + spriteSourceSize + {164,115} + textureRect + {{0,374},{164,115}} + textureRotated + + + BlownUp1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {164,115} + spriteSourceSize + {164,115} + textureRect + {{164,374},{164,115}} + textureRotated + + + BlownUp1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {164,115} + spriteSourceSize + {164,115} + textureRect + {{516,288},{164,115}} + textureRotated + + + GetUp1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {128,118} + spriteSourceSize + {128,118} + textureRect + {{806,791},{128,118}} + textureRotated + + + GetUp1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {128,118} + spriteSourceSize + {128,118} + textureRect + {{0,846},{128,118}} + textureRotated + + + GetUp1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {128,118} + spriteSourceSize + {128,118} + textureRect + {{128,846},{128,118}} + textureRotated + + + GetUp1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {128,118} + spriteSourceSize + {128,118} + textureRect + {{326,753},{128,118}} + textureRotated + + + GetUp1_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {128,118} + spriteSourceSize + {128,118} + textureRect + {{454,753},{128,118}} + textureRotated + + + GetUp1_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {128,118} + spriteSourceSize + {128,118} + textureRect + {{678,862},{128,118}} + textureRotated + + + GetUp1_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {128,118} + spriteSourceSize + {128,118} + textureRect + {{806,909},{128,118}} + textureRotated + + + Idle1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {70,128} + spriteSourceSize + {70,128} + textureRect + {{256,489},{70,128}} + textureRotated + + + Idle1_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {70,128} + spriteSourceSize + {70,128} + textureRect + {{256,617},{70,128}} + textureRotated + + + Idle1_11.png + + aliases + + spriteOffset + {0,0} + spriteSize + {70,128} + spriteSourceSize + {70,128} + textureRect + {{256,745},{70,128}} + textureRotated + + + Idle1_12.png + + aliases + + spriteOffset + {0,0} + spriteSize + {70,128} + spriteSourceSize + {70,128} + textureRect + {{256,873},{70,128}} + textureRotated + + + Idle1_13.png + + aliases + + spriteOffset + {0,0} + spriteSize + {70,128} + spriteSourceSize + {70,128} + textureRect + {{112,1200},{70,128}} + textureRotated + + + Idle1_14.png + + aliases + + spriteOffset + {0,0} + spriteSize + {70,128} + spriteSourceSize + {70,128} + textureRect + {{182,1200},{70,128}} + textureRotated + + + Idle1_15.png + + aliases + + spriteOffset + {0,0} + spriteSize + {70,128} + spriteSourceSize + {70,128} + textureRect + {{252,1200},{70,128}} + textureRotated + + + Idle1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {70,128} + spriteSourceSize + {70,128} + textureRect + {{252,1200},{70,128}} + textureRotated + + + Idle1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {70,128} + spriteSourceSize + {70,128} + textureRect + {{182,1200},{70,128}} + textureRotated + + + Idle1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {70,128} + spriteSourceSize + {70,128} + textureRect + {{112,1200},{70,128}} + textureRotated + + + Idle1_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {70,128} + spriteSourceSize + {70,128} + textureRect + {{256,873},{70,128}} + textureRotated + + + Idle1_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {70,128} + spriteSourceSize + {70,128} + textureRect + {{256,745},{70,128}} + textureRotated + + + Idle1_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {70,128} + spriteSourceSize + {70,128} + textureRect + {{256,617},{70,128}} + textureRotated + + + Idle1_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {70,128} + spriteSourceSize + {70,128} + textureRect + {{322,1200},{70,128}} + textureRotated + + + Idle1_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {70,128} + spriteSourceSize + {70,128} + textureRect + {{528,1043},{70,128}} + textureRotated + + + InAirAtk1_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,96} + spriteSourceSize + {112,96} + textureRect + {{128,1092},{112,96}} + textureRotated + + + InAirAtk1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {160,112} + spriteSourceSize + {160,112} + textureRect + {{680,400},{160,112}} + textureRotated + + + InAirAtk1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {144,112} + spriteSourceSize + {144,112} + textureRect + {{680,512},{144,112}} + textureRotated + + + InAirAtk1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {128,112} + spriteSourceSize + {128,112} + textureRect + {{806,1027},{128,112}} + textureRotated + + + InAirAtk1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,96} + spriteSourceSize + {96,96} + textureRect + {{792,1139},{96,96}} + textureRotated + + + InAirAtk1_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,96} + spriteSourceSize + {80,96} + textureRect + {{934,1104},{80,96}} + textureRotated + + + InAirAtked1_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,112} + spriteSourceSize + {112,112} + textureRect + {{352,1081},{112,112}} + textureRotated + + + InAirAtked1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {128,96} + spriteSourceSize + {128,96} + textureRect + {{0,1092},{128,96}} + textureRotated + + + InAirIdle1_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,112} + spriteSourceSize + {80,112} + textureRect + {{934,768},{80,112}} + textureRotated + + + InAirIdle1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,112} + spriteSourceSize + {80,112} + textureRect + {{934,880},{80,112}} + textureRotated + + + InAirIdle1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {64,128} + spriteSourceSize + {64,128} + textureRect + {{464,1079},{64,128}} + textureRotated + + + InAirIdle1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,112} + spriteSourceSize + {80,112} + textureRect + {{934,992},{80,112}} + textureRotated + + + InAirIdle1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,96} + spriteSourceSize + {80,96} + textureRect + {{224,1001},{80,96}} + textureRotated + + + InAirIdle1_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,96} + spriteSourceSize + {80,96} + textureRect + {{320,1001},{80,96}} + textureRotated + + + InAirIdle1_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,96} + spriteSourceSize + {80,96} + textureRect + {{792,1235},{80,96}} + textureRotated + + + InAirIdle1_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,112} + spriteSourceSize + {96,112} + textureRect + {{600,1209},{96,112}} + textureRotated + + + InAirIdle1_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,128} + spriteSourceSize + {96,128} + textureRect + {{582,787},{96,128}} + textureRotated + + + InAirIdle1_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,128} + spriteSourceSize + {96,128} + textureRect + {{582,915},{96,128}} + textureRotated + + + LayDown1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {176,86} + spriteSourceSize + {176,86} + textureRect + {{0,288},{176,86}} + textureRotated + + + LayDown1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {176,86} + spriteSourceSize + {176,86} + textureRect + {{176,288},{176,86}} + textureRotated + + + Walking_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {119,128} + spriteSourceSize + {119,128} + textureRect + {{0,489},{119,128}} + textureRotated + + + Walking_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {119,128} + spriteSourceSize + {119,128} + textureRect + {{128,489},{119,128}} + textureRotated + + + Walking_11.png + + aliases + + spriteOffset + {0,0} + spriteSize + {119,128} + spriteSourceSize + {119,128} + textureRect + {{0,608},{119,128}} + textureRotated + + + Walking_12.png + + aliases + + spriteOffset + {0,0} + spriteSize + {119,128} + spriteSourceSize + {119,128} + textureRect + {{128,608},{119,128}} + textureRotated + + + Walking_13.png + + aliases + + spriteOffset + {0,0} + spriteSize + {119,128} + spriteSourceSize + {119,128} + textureRect + {{326,515},{119,128}} + textureRotated + + + Walking_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {119,128} + spriteSourceSize + {119,128} + textureRect + {{454,515},{119,128}} + textureRotated + + + Walking_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {119,128} + spriteSourceSize + {119,128} + textureRect + {{678,624},{119,128}} + textureRotated + + + Walking_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {119,128} + spriteSourceSize + {119,128} + textureRect + {{806,672},{119,128}} + textureRotated + + + Walking_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {119,128} + spriteSourceSize + {119,128} + textureRect + {{0,727},{119,128}} + textureRotated + + + Walking_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {119,128} + spriteSourceSize + {119,128} + textureRect + {{128,727},{119,128}} + textureRotated + + + Walking_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {119,128} + spriteSourceSize + {119,128} + textureRect + {{326,634},{119,128}} + textureRotated + + + Walking_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {119,128} + spriteSourceSize + {119,128} + textureRect + {{454,634},{119,128}} + textureRotated + + + Walking_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {119,128} + spriteSourceSize + {119,128} + textureRect + {{678,743},{119,128}} + textureRotated + + + + metadata + + format + 3 + pixelFormat + RGBA8888 + premultiplyAlpha + + realTextureFileName + KnifeGirl.png + size + {1020,1331} + smartupdate + $TexturePacker:SmartUpdate:9514b6b35473e14baf98f68515bcb817:1aae9dd4a8024ce783fdab093a39672a:1ae107e0c6667a1ecb5ed98687517e0e$ + textureFileName + KnifeGirl.png + + + diff --git a/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.plist.meta b/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.plist.meta new file mode 100644 index 0000000..199cf90 --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.plist.meta @@ -0,0 +1,2146 @@ +{ + "ver": "1.2.4", + "uuid": "579bc0c1-f5e2-4a5d-889b-9d567e53b0e6", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "size": { + "width": 1020, + "height": 1331 + }, + "type": "Texture Packer", + "subMetas": { + "Atk1_0.png": { + "ver": "1.0.4", + "uuid": "5b269b2e-0800-4bf5-b5db-055b78cf318d", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 824, + "trimY": 544, + "width": 112, + "height": 128, + "rawWidth": 112, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk1_1.png": { + "ver": "1.0.4", + "uuid": "e184f831-3f90-47cb-8ca5-ad9446ba0398", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 1200, + "width": 112, + "height": 128, + "rawWidth": 112, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk1_10.png": { + "ver": "1.0.4", + "uuid": "4c512398-4290-4fdf-bb21-2b0062a9071b", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 616, + "trimY": 403, + "width": 64, + "height": 128, + "rawWidth": 64, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk1_11.png": { + "ver": "1.0.4", + "uuid": "6b2a1a09-8236-4972-8aee-1781b6547d4e", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 940, + "trimY": 0, + "width": 80, + "height": 128, + "rawWidth": 80, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk1_2.png": { + "ver": "1.0.4", + "uuid": "f260f82b-10cf-49af-b46c-cd8dc7a3503f", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 940, + "trimY": 128, + "width": 80, + "height": 128, + "rawWidth": 80, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk1_3.png": { + "ver": "1.0.4", + "uuid": "09f43e75-0986-4b8f-907b-e5a5a73b7c54", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 964, + "width": 112, + "height": 128, + "rawWidth": 112, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk1_4.png": { + "ver": "1.0.4", + "uuid": "d7432402-fcbd-4e2e-b2c1-33364f31948b", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 112, + "trimY": 964, + "width": 112, + "height": 128, + "rawWidth": 112, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk1_5.png": { + "ver": "1.0.4", + "uuid": "8acf1c5a-6910-47d6-aa18-1e6f07546d7a", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 840, + "trimY": 288, + "width": 96, + "height": 128, + "rawWidth": 96, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk1_6.png": { + "ver": "1.0.4", + "uuid": "76120dbd-6390-4706-9580-dcec9687e83e", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 840, + "trimY": 416, + "width": 96, + "height": 128, + "rawWidth": 96, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk1_7.png": { + "ver": "1.0.4", + "uuid": "f9a7a04a-2369-4946-8313-c2da896da51e", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 940, + "trimY": 256, + "width": 80, + "height": 128, + "rawWidth": 80, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk1_8.png": { + "ver": "1.0.4", + "uuid": "c8fb14e2-745e-4a2b-b235-d43195052652", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 936, + "trimY": 384, + "width": 80, + "height": 128, + "rawWidth": 80, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk1_9.png": { + "ver": "1.0.4", + "uuid": "1f23e0e5-830c-4d07-8f80-cbb98a2a1954", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 936, + "trimY": 512, + "width": 80, + "height": 128, + "rawWidth": 80, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_0.png": { + "ver": "1.0.4", + "uuid": "dd9a00aa-ddbc-4b01-a7cb-3c43c3a655b6", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 936, + "trimY": 640, + "width": 80, + "height": 128, + "rawWidth": 80, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_1.png": { + "ver": "1.0.4", + "uuid": "f66e83bd-1afc-4957-bb16-488d70566ed1", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 582, + "trimY": 531, + "width": 96, + "height": 128, + "rawWidth": 96, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_10.png": { + "ver": "1.0.4", + "uuid": "3898259f-a3b0-490d-b260-f86ab5109dfe", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 326, + "trimY": 871, + "width": 128, + "height": 112, + "rawWidth": 128, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_11.png": { + "ver": "1.0.4", + "uuid": "60f9f7d4-5cf7-4098-9455-0f6a74963fc6", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 696, + "trimY": 1200, + "width": 96, + "height": 96, + "rawWidth": 96, + "rawHeight": 96, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_2.png": { + "ver": "1.0.4", + "uuid": "bd682c41-dc62-49ff-a96a-18b33e50a6de", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 416, + "trimY": 983, + "width": 96, + "height": 112, + "rawWidth": 96, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_3.png": { + "ver": "1.0.4", + "uuid": "94ccab85-e32f-4e13-b0e5-72c798f78ad1", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 656, + "trimY": 1092, + "width": 96, + "height": 112, + "rawWidth": 96, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_4.png": { + "ver": "1.0.4", + "uuid": "e80d3a01-5048-42b7-a280-cb6aa01602c2", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 528, + "trimY": 1113, + "width": 96, + "height": 112, + "rawWidth": 96, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_5.png": { + "ver": "1.0.4", + "uuid": "d899088c-be62-47b4-9ebf-0a89a2261565", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 392, + "trimY": 1207, + "width": 96, + "height": 112, + "rawWidth": 96, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_6.png": { + "ver": "1.0.4", + "uuid": "5b1e5aa7-fd82-47ae-a5b2-6d4983d848ed", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 328, + "trimY": 403, + "width": 144, + "height": 112, + "rawWidth": 144, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_7.png": { + "ver": "1.0.4", + "uuid": "c2945988-b4bb-4583-a5ef-2fa02b23a347", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 454, + "trimY": 871, + "width": 128, + "height": 112, + "rawWidth": 128, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_8.png": { + "ver": "1.0.4", + "uuid": "070ea1e3-9c07-4735-8b94-515ef70216ad", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 680, + "trimY": 288, + "width": 160, + "height": 112, + "rawWidth": 160, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_9.png": { + "ver": "1.0.4", + "uuid": "3b8bc5c0-26df-4218-b7dc-134a36080a35", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 472, + "trimY": 403, + "width": 144, + "height": 112, + "rawWidth": 144, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_1.png": { + "ver": "1.0.4", + "uuid": "51ab185b-2271-48b5-a897-af79721d566c", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 188, + "height": 144, + "rawWidth": 188, + "rawHeight": 144, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_10.png": { + "ver": "1.0.4", + "uuid": "58afa365-a916-4ec6-aab3-1c87f5332b12", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 188, + "trimY": 0, + "width": 188, + "height": 144, + "rawWidth": 188, + "rawHeight": 144, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_2.png": { + "ver": "1.0.4", + "uuid": "c29fd95d-7467-4138-9e01-6421af63dd68", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 376, + "trimY": 0, + "width": 188, + "height": 144, + "rawWidth": 188, + "rawHeight": 144, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_3.png": { + "ver": "1.0.4", + "uuid": "3285b5eb-c6be-4cb9-ac60-c506645fee4b", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 564, + "trimY": 0, + "width": 188, + "height": 144, + "rawWidth": 188, + "rawHeight": 144, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_4.png": { + "ver": "1.0.4", + "uuid": "13fd4a87-71f4-4b69-a5b3-413d564c35e6", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 752, + "trimY": 0, + "width": 188, + "height": 144, + "rawWidth": 188, + "rawHeight": 144, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_5.png": { + "ver": "1.0.4", + "uuid": "7189e229-00d6-427a-8ea1-d05fbd97824f", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 144, + "width": 188, + "height": 144, + "rawWidth": 188, + "rawHeight": 144, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_6.png": { + "ver": "1.0.4", + "uuid": "d9ccfe33-3db7-4b3a-807c-adb2121fb7c7", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 188, + "trimY": 144, + "width": 188, + "height": 144, + "rawWidth": 188, + "rawHeight": 144, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_7.png": { + "ver": "1.0.4", + "uuid": "a51cbc29-0826-46f7-a38b-8b0f996fbace", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 376, + "trimY": 144, + "width": 188, + "height": 144, + "rawWidth": 188, + "rawHeight": 144, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_8.png": { + "ver": "1.0.4", + "uuid": "7e9f3a24-6abc-4b49-a5c5-a0c100865ffc", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 564, + "trimY": 144, + "width": 188, + "height": 144, + "rawWidth": 188, + "rawHeight": 144, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_9.png": { + "ver": "1.0.4", + "uuid": "ecbaeb43-1118-483a-91c9-ff1ff01b7b33", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 752, + "trimY": 144, + "width": 188, + "height": 144, + "rawWidth": 188, + "rawHeight": 144, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atked1_0.png": { + "ver": "1.0.4", + "uuid": "9b90ae89-7fbe-4bb6-ab15-fc08462f54c5", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 582, + "trimY": 659, + "width": 96, + "height": 128, + "rawWidth": 96, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atked1_1.png": { + "ver": "1.0.4", + "uuid": "aeb3553a-6de4-4197-9f06-d7cc3fa7c4cf", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 240, + "trimY": 1081, + "width": 112, + "height": 112, + "rawWidth": 112, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atked1_2.png": { + "ver": "1.0.4", + "uuid": "07650461-a7c0-4638-92fc-fa436752c045", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 504, + "trimY": 1209, + "width": 96, + "height": 112, + "rawWidth": 96, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atked1_3.png": { + "ver": "1.0.4", + "uuid": "ca22d473-83aa-4146-b732-89d0246a2968", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 678, + "trimY": 980, + "width": 128, + "height": 112, + "rawWidth": 128, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "BlownUp1_1.png": { + "ver": "1.0.4", + "uuid": "0ea84f61-4a2f-4ca2-a0b8-b580e027c142", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 352, + "trimY": 288, + "width": 164, + "height": 115, + "rawWidth": 164, + "rawHeight": 115, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "BlownUp1_2.png": { + "ver": "1.0.4", + "uuid": "a3a31fcd-a162-456a-9c26-1f32413f87f3", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 374, + "width": 164, + "height": 115, + "rawWidth": 164, + "rawHeight": 115, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "BlownUp1_3.png": { + "ver": "1.0.4", + "uuid": "da4ee0a0-ba66-455c-99d3-9c803a3d0f17", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 164, + "trimY": 374, + "width": 164, + "height": 115, + "rawWidth": 164, + "rawHeight": 115, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "BlownUp1_4.png": { + "ver": "1.0.4", + "uuid": "4c058d60-e727-4438-b058-6e51969df458", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 516, + "trimY": 288, + "width": 164, + "height": 115, + "rawWidth": 164, + "rawHeight": 115, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "GetUp1_1.png": { + "ver": "1.0.4", + "uuid": "3f26b0a4-db13-4a14-b885-5a812073eccf", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 806, + "trimY": 791, + "width": 128, + "height": 118, + "rawWidth": 128, + "rawHeight": 118, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "GetUp1_2.png": { + "ver": "1.0.4", + "uuid": "23eb42d6-52a2-458d-98a3-2f692dd79398", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 846, + "width": 128, + "height": 118, + "rawWidth": 128, + "rawHeight": 118, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "GetUp1_3.png": { + "ver": "1.0.4", + "uuid": "7bd4428c-44f9-4ff8-8d00-d3448a27a0c4", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 128, + "trimY": 846, + "width": 128, + "height": 118, + "rawWidth": 128, + "rawHeight": 118, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "GetUp1_4.png": { + "ver": "1.0.4", + "uuid": "57640cd8-17eb-4279-a118-1ea40174da3c", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 326, + "trimY": 753, + "width": 128, + "height": 118, + "rawWidth": 128, + "rawHeight": 118, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "GetUp1_5.png": { + "ver": "1.0.4", + "uuid": "56a2c954-6d04-433c-8ae4-f1bc7a0e9469", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 454, + "trimY": 753, + "width": 128, + "height": 118, + "rawWidth": 128, + "rawHeight": 118, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "GetUp1_6.png": { + "ver": "1.0.4", + "uuid": "b4dc81a3-eb90-4722-9296-5158f004fd4c", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 678, + "trimY": 862, + "width": 128, + "height": 118, + "rawWidth": 128, + "rawHeight": 118, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "GetUp1_7.png": { + "ver": "1.0.4", + "uuid": "c156fa2c-0c4e-4413-80c1-accf8fea4779", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 806, + "trimY": 909, + "width": 128, + "height": 118, + "rawWidth": 128, + "rawHeight": 118, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_1.png": { + "ver": "1.0.4", + "uuid": "b0f1ecf7-be41-46a8-bccb-92ee53b4ef88", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 256, + "trimY": 489, + "width": 70, + "height": 128, + "rawWidth": 70, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_10.png": { + "ver": "1.0.4", + "uuid": "9ecbf97e-34bc-4c5e-b9e8-4d885a02e0d3", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 256, + "trimY": 617, + "width": 70, + "height": 128, + "rawWidth": 70, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_11.png": { + "ver": "1.0.4", + "uuid": "e7d9a7c9-47ec-4335-97c9-19ed6ee3d9ce", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 256, + "trimY": 745, + "width": 70, + "height": 128, + "rawWidth": 70, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_12.png": { + "ver": "1.0.4", + "uuid": "cf258753-3900-4de4-a0bb-09158500fd9a", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 256, + "trimY": 873, + "width": 70, + "height": 128, + "rawWidth": 70, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_13.png": { + "ver": "1.0.4", + "uuid": "be7bedfe-7054-4092-89fc-ca397460f140", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 112, + "trimY": 1200, + "width": 70, + "height": 128, + "rawWidth": 70, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_14.png": { + "ver": "1.0.4", + "uuid": "b1b467dd-1757-4ff1-9909-3449f74463d8", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 182, + "trimY": 1200, + "width": 70, + "height": 128, + "rawWidth": 70, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_15.png": { + "ver": "1.0.4", + "uuid": "51ede1f1-5e65-4b69-8fbc-5b7df2a7c90f", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 252, + "trimY": 1200, + "width": 70, + "height": 128, + "rawWidth": 70, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_2.png": { + "ver": "1.0.4", + "uuid": "944adaee-5e11-4c55-9573-1d529f21ed4b", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 252, + "trimY": 1200, + "width": 70, + "height": 128, + "rawWidth": 70, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_3.png": { + "ver": "1.0.4", + "uuid": "ede36130-8312-46a2-abe5-ba102bc97822", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 182, + "trimY": 1200, + "width": 70, + "height": 128, + "rawWidth": 70, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_4.png": { + "ver": "1.0.4", + "uuid": "32dbb977-301c-4fbd-a19c-14a5ce0e2f5b", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 112, + "trimY": 1200, + "width": 70, + "height": 128, + "rawWidth": 70, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_5.png": { + "ver": "1.0.4", + "uuid": "581c7ab1-451d-46b0-9eeb-24cf3b898924", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 256, + "trimY": 873, + "width": 70, + "height": 128, + "rawWidth": 70, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_6.png": { + "ver": "1.0.4", + "uuid": "27005132-eda8-4c3f-9f4a-3a6004245e9f", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 256, + "trimY": 745, + "width": 70, + "height": 128, + "rawWidth": 70, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_7.png": { + "ver": "1.0.4", + "uuid": "2b339657-aa80-4ab6-a4dd-83e9c12b6a54", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 256, + "trimY": 617, + "width": 70, + "height": 128, + "rawWidth": 70, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_8.png": { + "ver": "1.0.4", + "uuid": "08e25a99-158d-4159-8152-6c9047fe9d54", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 322, + "trimY": 1200, + "width": 70, + "height": 128, + "rawWidth": 70, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_9.png": { + "ver": "1.0.4", + "uuid": "ab739541-39b5-4758-9b93-6681d6038730", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 528, + "trimY": 1043, + "width": 70, + "height": 128, + "rawWidth": 70, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtk1_0.png": { + "ver": "1.0.4", + "uuid": "e6a3099f-b4c3-425f-a66b-9b992ae1c7b0", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 128, + "trimY": 1092, + "width": 112, + "height": 96, + "rawWidth": 112, + "rawHeight": 96, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtk1_1.png": { + "ver": "1.0.4", + "uuid": "cade5a52-282e-47e5-aca9-5abb4f6afd14", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 680, + "trimY": 400, + "width": 160, + "height": 112, + "rawWidth": 160, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtk1_2.png": { + "ver": "1.0.4", + "uuid": "96b0b028-3045-4a04-bf9c-c957f8c9e9ab", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 680, + "trimY": 512, + "width": 144, + "height": 112, + "rawWidth": 144, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtk1_3.png": { + "ver": "1.0.4", + "uuid": "567f6bb7-c764-4c1d-bfec-f5c0c9812192", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 806, + "trimY": 1027, + "width": 128, + "height": 112, + "rawWidth": 128, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtk1_4.png": { + "ver": "1.0.4", + "uuid": "5d0c32b4-52ce-4157-9b91-dd400a7ed07a", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 792, + "trimY": 1139, + "width": 96, + "height": 96, + "rawWidth": 96, + "rawHeight": 96, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtk1_5.png": { + "ver": "1.0.4", + "uuid": "fcef9c9b-dc71-459c-a541-9273b6e3923a", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 934, + "trimY": 1104, + "width": 80, + "height": 96, + "rawWidth": 80, + "rawHeight": 96, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtked1_0.png": { + "ver": "1.0.4", + "uuid": "01e8b938-03cb-4519-a417-384c31131a27", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 352, + "trimY": 1081, + "width": 112, + "height": 112, + "rawWidth": 112, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtked1_1.png": { + "ver": "1.0.4", + "uuid": "d7970a18-f3af-44c6-b216-ee55b9a1b32c", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 1092, + "width": 128, + "height": 96, + "rawWidth": 128, + "rawHeight": 96, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_0.png": { + "ver": "1.0.4", + "uuid": "6ff7b4e6-80ec-4673-b47b-e0bba7567c3c", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 934, + "trimY": 768, + "width": 80, + "height": 112, + "rawWidth": 80, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_1.png": { + "ver": "1.0.4", + "uuid": "4ff35932-9869-4c78-9f75-b304eee46647", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 934, + "trimY": 880, + "width": 80, + "height": 112, + "rawWidth": 80, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_2.png": { + "ver": "1.0.4", + "uuid": "6b1355c5-a750-4e37-9018-de1b84238f6c", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 464, + "trimY": 1079, + "width": 64, + "height": 128, + "rawWidth": 64, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_3.png": { + "ver": "1.0.4", + "uuid": "01193448-adb0-4364-94f3-ca810897f397", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 934, + "trimY": 992, + "width": 80, + "height": 112, + "rawWidth": 80, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_4.png": { + "ver": "1.0.4", + "uuid": "f4f0cd5d-835b-44c3-8cc9-2651dd00cd37", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 224, + "trimY": 1001, + "width": 80, + "height": 96, + "rawWidth": 80, + "rawHeight": 96, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_5.png": { + "ver": "1.0.4", + "uuid": "4c32b2d6-346f-4d6e-a92e-6678e4c4b1ad", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 320, + "trimY": 1001, + "width": 80, + "height": 96, + "rawWidth": 80, + "rawHeight": 96, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_6.png": { + "ver": "1.0.4", + "uuid": "30ef09b2-366a-4946-b556-2c0fac359c0b", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 792, + "trimY": 1235, + "width": 80, + "height": 96, + "rawWidth": 80, + "rawHeight": 96, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_7.png": { + "ver": "1.0.4", + "uuid": "6ab33993-124f-429e-ba4c-b0f6824ea6c7", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 600, + "trimY": 1209, + "width": 96, + "height": 112, + "rawWidth": 96, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_8.png": { + "ver": "1.0.4", + "uuid": "e0612a37-a743-40fe-83ff-f189971f1992", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 582, + "trimY": 787, + "width": 96, + "height": 128, + "rawWidth": 96, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_9.png": { + "ver": "1.0.4", + "uuid": "6ff230eb-44e8-4ca9-97d0-1b059aa1e21b", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 582, + "trimY": 915, + "width": 96, + "height": 128, + "rawWidth": 96, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "LayDown1_1.png": { + "ver": "1.0.4", + "uuid": "4e8a4f3c-5406-4700-9230-b2abc29a1093", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 288, + "width": 176, + "height": 86, + "rawWidth": 176, + "rawHeight": 86, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "LayDown1_2.png": { + "ver": "1.0.4", + "uuid": "1ae5e6f6-ba82-485d-b3c7-59fd16ece3d5", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 176, + "trimY": 288, + "width": 176, + "height": 86, + "rawWidth": 176, + "rawHeight": 86, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_1.png": { + "ver": "1.0.4", + "uuid": "9435195e-4560-495e-b1ae-083c0c87e8a0", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 489, + "width": 119, + "height": 128, + "rawWidth": 119, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_10.png": { + "ver": "1.0.4", + "uuid": "9100da6b-7582-4afb-9698-3d67d3b2012d", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 128, + "trimY": 489, + "width": 119, + "height": 128, + "rawWidth": 119, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_11.png": { + "ver": "1.0.4", + "uuid": "1257f72d-0cb3-4750-ae70-13c2d8eb2269", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 608, + "width": 119, + "height": 128, + "rawWidth": 119, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_12.png": { + "ver": "1.0.4", + "uuid": "1d34b6db-27ba-4e26-864d-0f00d501765e", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 128, + "trimY": 608, + "width": 119, + "height": 128, + "rawWidth": 119, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_13.png": { + "ver": "1.0.4", + "uuid": "c317a75a-52c0-4c38-9300-a064cbf4efb3", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 326, + "trimY": 515, + "width": 119, + "height": 128, + "rawWidth": 119, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_2.png": { + "ver": "1.0.4", + "uuid": "ec048360-7a17-4f22-ba52-eb86ec1acae8", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 454, + "trimY": 515, + "width": 119, + "height": 128, + "rawWidth": 119, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_3.png": { + "ver": "1.0.4", + "uuid": "82bb81e3-667c-4280-8710-211f4904ef2f", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 678, + "trimY": 624, + "width": 119, + "height": 128, + "rawWidth": 119, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_4.png": { + "ver": "1.0.4", + "uuid": "c3b14ecc-a6d9-4cb3-8637-ca7b407a0f5c", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 806, + "trimY": 672, + "width": 119, + "height": 128, + "rawWidth": 119, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_5.png": { + "ver": "1.0.4", + "uuid": "f958fb7f-ef5a-4918-81f3-564004572f45", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 727, + "width": 119, + "height": 128, + "rawWidth": 119, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_6.png": { + "ver": "1.0.4", + "uuid": "8a0ecf92-db26-4206-9a80-20e749055def", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 128, + "trimY": 727, + "width": 119, + "height": 128, + "rawWidth": 119, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_7.png": { + "ver": "1.0.4", + "uuid": "942f2e02-a700-4fbf-877e-08c93e4d4010", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 326, + "trimY": 634, + "width": 119, + "height": 128, + "rawWidth": 119, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_8.png": { + "ver": "1.0.4", + "uuid": "30546064-1a11-499e-8523-a82c83951c73", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 454, + "trimY": 634, + "width": 119, + "height": 128, + "rawWidth": 119, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_9.png": { + "ver": "1.0.4", + "uuid": "515bb75f-7a1f-4500-8aa9-c895915ce19f", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 678, + "trimY": 743, + "width": 119, + "height": 128, + "rawWidth": 119, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.png b/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.png new file mode 100644 index 0000000..d4ab89c Binary files /dev/null and b/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.png differ diff --git a/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.png.meta b/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.png.meta new file mode 100644 index 0000000..8abb6b5 --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.png.meta @@ -0,0 +1,12 @@ +{ + "ver": "2.3.3", + "uuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "type": "raw", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": true, + "platformSettings": {}, + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/KnifeGirl/LayDown1.anim b/frontend/assets/resources/animation/KnifeGirl/LayDown1.anim new file mode 100644 index 0000000..b0384e4 --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/LayDown1.anim @@ -0,0 +1,31 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "LayDown1", + "_objFlags": 0, + "_native": "", + "_duration": 0.06666666666666667, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "4e8a4f3c-5406-4700-9230-b2abc29a1093" + } + }, + { + "frame": 0.05, + "value": { + "__uuid__": "1ae5e6f6-ba82-485d-b3c7-59fd16ece3d5" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/KnifeGirl/LayDown1.anim.meta b/frontend/assets/resources/animation/KnifeGirl/LayDown1.anim.meta new file mode 100644 index 0000000..0e3a0ce --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/LayDown1.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "0a6478a6-f4cc-47cb-a1c6-761cf9141eb2", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/KnifeGirl/Walking.anim b/frontend/assets/resources/animation/KnifeGirl/Walking.anim new file mode 100644 index 0000000..05948e1 --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/Walking.anim @@ -0,0 +1,97 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "Walking", + "_objFlags": 0, + "_native": "", + "_duration": 1.5166666666666666, + "sample": 60, + "speed": 1.2, + "wrapMode": 2, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "c3b14ecc-a6d9-4cb3-8637-ca7b407a0f5c" + } + }, + { + "frame": 0.08333333333333333, + "value": { + "__uuid__": "9435195e-4560-495e-b1ae-083c0c87e8a0" + } + }, + { + "frame": 0.18333333333333332, + "value": { + "__uuid__": "ec048360-7a17-4f22-ba52-eb86ec1acae8" + } + }, + { + "frame": 0.2833333333333333, + "value": { + "__uuid__": "82bb81e3-667c-4280-8710-211f4904ef2f" + } + }, + { + "frame": 0.4, + "value": { + "__uuid__": "f958fb7f-ef5a-4918-81f3-564004572f45" + } + }, + { + "frame": 0.5333333333333333, + "value": { + "__uuid__": "8a0ecf92-db26-4206-9a80-20e749055def" + } + }, + { + "frame": 0.65, + "value": { + "__uuid__": "942f2e02-a700-4fbf-877e-08c93e4d4010" + } + }, + { + "frame": 0.7666666666666667, + "value": { + "__uuid__": "30546064-1a11-499e-8523-a82c83951c73" + } + }, + { + "frame": 0.9, + "value": { + "__uuid__": "515bb75f-7a1f-4500-8aa9-c895915ce19f" + } + }, + { + "frame": 1.0333333333333334, + "value": { + "__uuid__": "9100da6b-7582-4afb-9698-3d67d3b2012d" + } + }, + { + "frame": 1.2166666666666666, + "value": { + "__uuid__": "1257f72d-0cb3-4750-ae70-13c2d8eb2269" + } + }, + { + "frame": 1.3833333333333333, + "value": { + "__uuid__": "1d34b6db-27ba-4e26-864d-0f00d501765e" + } + }, + { + "frame": 1.5, + "value": { + "__uuid__": "c317a75a-52c0-4c38-9300-a064cbf4efb3" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/KnifeGirl/Walking.anim.meta b/frontend/assets/resources/animation/KnifeGirl/Walking.anim.meta new file mode 100644 index 0000000..c4729aa --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/Walking.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "f7f60d3f-32c0-4b56-901e-6eec9f73fa83", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl.meta b/frontend/assets/resources/animation/MonkGirl.meta new file mode 100644 index 0000000..aeea793 --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl.meta @@ -0,0 +1,7 @@ +{ + "ver": "1.0.1", + "uuid": "a0021cb4-2c2e-49ca-8699-7acf4f7a531b", + "isSubpackage": false, + "subpackageName": "", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/Atk1.anim b/frontend/assets/resources/animation/MonkGirl/Atk1.anim new file mode 100644 index 0000000..2a20d16 --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/Atk1.anim @@ -0,0 +1,49 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "Atk1", + "_objFlags": 0, + "_native": "", + "_duration": 0.5, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "a5615ed4-d055-4db5-b924-4c8d8b2d926f" + } + }, + { + "frame": 0.05, + "value": { + "__uuid__": "12b90556-58b9-4311-b5d9-820fb76d659b" + } + }, + { + "frame": 0.11666666666666667, + "value": { + "__uuid__": "72bc74a1-6e8c-48bb-9ab2-9b8f502ceffb" + } + }, + { + "frame": 0.43333333333333335, + "value": { + "__uuid__": "7e619896-100d-4903-b256-e30ddb5ad397" + } + }, + { + "frame": 0.48333333333333334, + "value": { + "__uuid__": "4a35e0f5-95c4-445b-8f9b-6514a060a72d" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/Atk1.anim.meta b/frontend/assets/resources/animation/MonkGirl/Atk1.anim.meta new file mode 100644 index 0000000..620afbf --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/Atk1.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "c3d4f508-b3a9-4deb-b2d1-8ddc7bf22e0c", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/Atk2.anim b/frontend/assets/resources/animation/MonkGirl/Atk2.anim new file mode 100644 index 0000000..1805881 --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/Atk2.anim @@ -0,0 +1,79 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "Atk2", + "_objFlags": 0, + "_native": "", + "_duration": 0.6, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "0e3b6c28-f265-457d-b000-aeea66d05428" + } + }, + { + "frame": 0.03333333333333333, + "value": { + "__uuid__": "1d9c010b-3209-4672-9f78-96527d62f4e0" + } + }, + { + "frame": 0.08333333333333333, + "value": { + "__uuid__": "1fd3ca4d-ec4d-4858-a3d2-fe274e22d4be" + } + }, + { + "frame": 0.11666666666666667, + "value": { + "__uuid__": "b0aaf216-b8d7-4247-be61-df9f3146ce46" + } + }, + { + "frame": 0.15, + "value": { + "__uuid__": "f12c5713-540f-4874-a6b0-0162f0ffb544" + } + }, + { + "frame": 0.2, + "value": { + "__uuid__": "b9a4cd85-53d1-4280-bc9e-35a8dd482fa4" + } + }, + { + "frame": 0.23333333333333334, + "value": { + "__uuid__": "74e9fcd1-11dc-478e-b90a-d4c5cf551aad" + } + }, + { + "frame": 0.3, + "value": { + "__uuid__": "e6c3bdcd-9ba8-4c5b-910d-2d93d9068abd" + } + }, + { + "frame": 0.5166666666666667, + "value": { + "__uuid__": "c359790f-bbd1-4869-a37b-7f1c0bd91578" + } + }, + { + "frame": 0.5833333333333334, + "value": { + "__uuid__": "1b9074dd-d0b0-4129-8d72-8f356bf7f68c" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/Atk2.anim.meta b/frontend/assets/resources/animation/MonkGirl/Atk2.anim.meta new file mode 100644 index 0000000..33bac8f --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/Atk2.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "e6e1d62a-de7d-4fe7-858c-2d2725b7c2e8", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/Atk3.anim b/frontend/assets/resources/animation/MonkGirl/Atk3.anim new file mode 100644 index 0000000..1c7c16b --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/Atk3.anim @@ -0,0 +1,73 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "Atk3", + "_objFlags": 0, + "_native": "", + "_duration": 1.0166666666666666, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "39ba4413-6f4a-49a5-a7ca-d11140dfe7dd" + } + }, + { + "frame": 0.08333333333333333, + "value": { + "__uuid__": "26b646c7-bdbc-495e-adaf-9d52ef1b5c84" + } + }, + { + "frame": 0.16666666666666666, + "value": { + "__uuid__": "5a5208a0-1c29-446f-8375-739aef09fe65" + } + }, + { + "frame": 0.2833333333333333, + "value": { + "__uuid__": "414628f0-13ec-4f01-83a0-b94f6a13fff1" + } + }, + { + "frame": 0.4166666666666667, + "value": { + "__uuid__": "c494965a-e7e6-4c99-ac61-60642e6247dc" + } + }, + { + "frame": 0.5333333333333333, + "value": { + "__uuid__": "04cafb17-39ab-4f2b-9830-3eaf42cab254" + } + }, + { + "frame": 0.6666666666666666, + "value": { + "__uuid__": "fd9c7d8a-1038-4cab-a0e6-699e404701db" + } + }, + { + "frame": 0.8, + "value": { + "__uuid__": "2447c6b3-292b-43b4-84e5-acc35df0c1f5" + } + }, + { + "frame": 1, + "value": { + "__uuid__": "00275818-b9b6-41ab-a792-f21ff10747fa" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/Atk3.anim.meta b/frontend/assets/resources/animation/MonkGirl/Atk3.anim.meta new file mode 100644 index 0000000..83d784c --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/Atk3.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "e8247e2a-1b5b-4618-86f8-224b25246b55", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/Atked1.anim b/frontend/assets/resources/animation/MonkGirl/Atked1.anim new file mode 100644 index 0000000..505dba0 --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/Atked1.anim @@ -0,0 +1,37 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "Atked1", + "_objFlags": 0, + "_native": "", + "_duration": 0.05, + "sample": 60, + "speed": 0.4, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "df446561-abb9-4d91-aa79-636bdf3d9335" + } + }, + { + "frame": 0.016666666666666666, + "value": { + "__uuid__": "852471cd-6270-47d2-b40b-e33a93910240" + } + }, + { + "frame": 0.03333333333333333, + "value": { + "__uuid__": "7d08ee55-243c-4bb0-b614-1cd09cabf13f" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/Atked1.anim.meta b/frontend/assets/resources/animation/MonkGirl/Atked1.anim.meta new file mode 100644 index 0000000..7df34d0 --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/Atked1.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "1ec27664-cd2a-4c7a-838f-953a7713ceca", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/BlownUp1.anim b/frontend/assets/resources/animation/MonkGirl/BlownUp1.anim new file mode 100644 index 0000000..edfc5bb --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/BlownUp1.anim @@ -0,0 +1,43 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "BlownUp1", + "_objFlags": 0, + "_native": "", + "_duration": 0.06666666666666667, + "sample": 60, + "speed": 0.2, + "wrapMode": 2, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "9d16c119-8ead-4d9e-90b3-5bbf749f71ef" + } + }, + { + "frame": 0.016666666666666666, + "value": { + "__uuid__": "f2629502-5c62-4df2-9741-58fe94bfab53" + } + }, + { + "frame": 0.03333333333333333, + "value": { + "__uuid__": "d6a81e68-5f14-45d1-82e2-fabf2853685a" + } + }, + { + "frame": 0.05, + "value": { + "__uuid__": "9f7382dd-4da6-485c-8064-78ec031a2c0a" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/BlownUp1.anim.meta b/frontend/assets/resources/animation/MonkGirl/BlownUp1.anim.meta new file mode 100644 index 0000000..b0fc7f6 --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/BlownUp1.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "f87054fd-328f-4001-a8ff-b4c049cc1e6d", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/GetUp1.anim b/frontend/assets/resources/animation/MonkGirl/GetUp1.anim new file mode 100644 index 0000000..078be81 --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/GetUp1.anim @@ -0,0 +1,79 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "GetUp1", + "_objFlags": 0, + "_native": "", + "_duration": 0.16666666666666666, + "sample": 60, + "speed": 0.3, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "4b1219ad-ef64-47f6-87ca-16188343c47a" + } + }, + { + "frame": 0.016666666666666666, + "value": { + "__uuid__": "49e7f092-85c2-4eb3-a62a-965e9e0d9c12" + } + }, + { + "frame": 0.03333333333333333, + "value": { + "__uuid__": "73023874-a74c-4e9f-8389-d4280d7be452" + } + }, + { + "frame": 0.05, + "value": { + "__uuid__": "ed62daef-540c-4b34-81d3-99c4296d6ca9" + } + }, + { + "frame": 0.06666666666666667, + "value": { + "__uuid__": "cdbcadf6-4e4f-4673-8044-51b40c58da96" + } + }, + { + "frame": 0.08333333333333333, + "value": { + "__uuid__": "7ae337de-a63f-41ef-9627-84f9ced77d6f" + } + }, + { + "frame": 0.1, + "value": { + "__uuid__": "931626d5-01ad-4329-a8f7-9a00bd64fdff" + } + }, + { + "frame": 0.11666666666666667, + "value": { + "__uuid__": "d4c2dae6-8ff6-4976-8e50-cb0b698d93d4" + } + }, + { + "frame": 0.13333333333333333, + "value": { + "__uuid__": "b328d317-3721-4402-89db-34910c31a48a" + } + }, + { + "frame": 0.15, + "value": { + "__uuid__": "a51ca0c2-3e3b-4b7b-b636-1cac791c2511" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/GetUp1.anim.meta b/frontend/assets/resources/animation/MonkGirl/GetUp1.anim.meta new file mode 100644 index 0000000..f08078f --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/GetUp1.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "7cb4d395-c68f-4643-9e2e-8cb8e200d3a5", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/Idle1.anim b/frontend/assets/resources/animation/MonkGirl/Idle1.anim new file mode 100644 index 0000000..9078bff --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/Idle1.anim @@ -0,0 +1,85 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "Idle1", + "_objFlags": 0, + "_native": "", + "_duration": 0.45, + "sample": 60, + "speed": 1, + "wrapMode": 2, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "104ab450-fec3-4ea8-b6c0-aca74a826f5a" + } + }, + { + "frame": 0.016666666666666666, + "value": { + "__uuid__": "4bad7430-7b43-47ae-9d65-ef3a2b88f450" + } + }, + { + "frame": 0.03333333333333333, + "value": { + "__uuid__": "c3675bd6-4aa6-4ec5-80d5-ef35862d15b9" + } + }, + { + "frame": 0.08333333333333333, + "value": { + "__uuid__": "23446a26-dadf-4d7d-9dd3-4ca3f8f6b7a5" + } + }, + { + "frame": 0.13333333333333333, + "value": { + "__uuid__": "47628469-7775-4daf-b321-74fac947ce60" + } + }, + { + "frame": 0.18333333333333332, + "value": { + "__uuid__": "1c37ea82-6700-4bea-9265-c70a16d2187c" + } + }, + { + "frame": 0.23333333333333334, + "value": { + "__uuid__": "c4fb2fc2-7a04-4219-b129-77249f33426b" + } + }, + { + "frame": 0.2833333333333333, + "value": { + "__uuid__": "0ecf4a0c-0f13-42fa-a214-b4826acd8556" + } + }, + { + "frame": 0.3333333333333333, + "value": { + "__uuid__": "cabf9cb6-99ca-426d-9a23-95cdec6f06b9" + } + }, + { + "frame": 0.38333333333333336, + "value": { + "__uuid__": "94d073e8-f17f-4a66-be72-2b8cf3347ea4" + } + }, + { + "frame": 0.43333333333333335, + "value": { + "__uuid__": "3a435737-51d0-4f31-ad2b-838d9d98bad3" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/Idle1.anim.meta b/frontend/assets/resources/animation/MonkGirl/Idle1.anim.meta new file mode 100644 index 0000000..acb8e34 --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/Idle1.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "a0d8b9a6-7bf7-4cf5-aecb-54b2908cbfb3", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/InAirAtk1.anim b/frontend/assets/resources/animation/MonkGirl/InAirAtk1.anim new file mode 100644 index 0000000..6036717 --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/InAirAtk1.anim @@ -0,0 +1,97 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "InAirAtk1", + "_objFlags": 0, + "_native": "", + "_duration": 0.4166666666666667, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "3631c1af-5426-420e-9c81-47d8dc4790f7" + } + }, + { + "frame": 0.03333333333333333, + "value": { + "__uuid__": "f10683b4-2dd8-48d9-b11d-3e7fd12e2dee" + } + }, + { + "frame": 0.06666666666666667, + "value": { + "__uuid__": "6134b002-58ed-4d78-af23-5f574661b04b" + } + }, + { + "frame": 0.1, + "value": { + "__uuid__": "5db472a6-3371-4a5b-860d-e6ea6a9eaba0" + } + }, + { + "frame": 0.13333333333333333, + "value": { + "__uuid__": "769179e3-d0bb-4bd0-a084-ce5ad5b57d47" + } + }, + { + "frame": 0.16666666666666666, + "value": { + "__uuid__": "8f09ba68-066c-4240-84be-390cdbb2d59c" + } + }, + { + "frame": 0.2, + "value": { + "__uuid__": "e8ce0f1e-6af0-423b-9448-2a72c944127d" + } + }, + { + "frame": 0.23333333333333334, + "value": { + "__uuid__": "1da322c5-98b8-49d0-8f96-33fdc68a23cb" + } + }, + { + "frame": 0.26666666666666666, + "value": { + "__uuid__": "1e4bf242-5d08-4220-a5d9-2a2524b0e3c7" + } + }, + { + "frame": 0.3, + "value": { + "__uuid__": "6de218a1-5a97-405d-b7d0-68cc9cf076f9" + } + }, + { + "frame": 0.3333333333333333, + "value": { + "__uuid__": "4c16e710-abfe-4030-bd42-fded0f41f665" + } + }, + { + "frame": 0.36666666666666664, + "value": { + "__uuid__": "1753c533-3a31-46b6-ab01-15b778702237" + } + }, + { + "frame": 0.4, + "value": { + "__uuid__": "923cfcea-2c3e-493f-826a-0b08b447ebde" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/InAirAtk1.anim.meta b/frontend/assets/resources/animation/MonkGirl/InAirAtk1.anim.meta new file mode 100644 index 0000000..15b2b5c --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/InAirAtk1.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "555d837b-4a68-4a28-b9ff-e97e393d1a05", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/InAirAtked1.anim b/frontend/assets/resources/animation/MonkGirl/InAirAtked1.anim new file mode 100644 index 0000000..77dde40 --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/InAirAtked1.anim @@ -0,0 +1,31 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "InAirAtked1", + "_objFlags": 0, + "_native": "", + "_duration": 0.03333333333333333, + "sample": 60, + "speed": 0.2, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "852471cd-6270-47d2-b40b-e33a93910240" + } + }, + { + "frame": 0.016666666666666666, + "value": { + "__uuid__": "7d08ee55-243c-4bb0-b614-1cd09cabf13f" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/InAirAtked1.anim.meta b/frontend/assets/resources/animation/MonkGirl/InAirAtked1.anim.meta new file mode 100644 index 0000000..a56bece --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/InAirAtked1.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "ee0b89e9-89f0-451e-a6ef-d41d64d3d67a", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/InAirIdle1ByJump.anim b/frontend/assets/resources/animation/MonkGirl/InAirIdle1ByJump.anim new file mode 100644 index 0000000..f887f69 --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/InAirIdle1ByJump.anim @@ -0,0 +1,91 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "InAirIdle1ByJump", + "_objFlags": 0, + "_native": "", + "_duration": 0.2, + "sample": 60, + "speed": 0.6, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "21c7f1b2-77c7-4f9a-b5c6-b79d99553432" + } + }, + { + "frame": 0.016666666666666666, + "value": { + "__uuid__": "9106d51d-808b-4cec-b03c-1a0e9de3dd13" + } + }, + { + "frame": 0.03333333333333333, + "value": { + "__uuid__": "23199f52-ded0-4271-b426-17c6037989a4" + } + }, + { + "frame": 0.05, + "value": { + "__uuid__": "293367f0-6557-40d2-aff5-4f6b9faa3b14" + } + }, + { + "frame": 0.06666666666666667, + "value": { + "__uuid__": "f9029e1e-91f8-4ae2-a3ef-b811c409f41a" + } + }, + { + "frame": 0.08333333333333333, + "value": { + "__uuid__": "de0e3195-e56e-4bba-82f6-72635f453eea" + } + }, + { + "frame": 0.1, + "value": { + "__uuid__": "93e7fb75-b42d-4da9-860d-2e7dd0930d8d" + } + }, + { + "frame": 0.11666666666666667, + "value": { + "__uuid__": "1a789615-1580-4342-b739-7ef94c80b34a" + } + }, + { + "frame": 0.13333333333333333, + "value": { + "__uuid__": "5331bbb0-fad4-402c-8788-cb070cc8fb7c" + } + }, + { + "frame": 0.15, + "value": { + "__uuid__": "2f2bce67-0e39-45ee-aebf-b15e0d0c341f" + } + }, + { + "frame": 0.16666666666666666, + "value": { + "__uuid__": "77a2f890-6627-4699-9278-21d7365bd2c8" + } + }, + { + "frame": 0.18333333333333332, + "value": { + "__uuid__": "ce3e8e33-4420-478b-a084-5a7f77d584b8" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/InAirIdle1ByJump.anim.meta b/frontend/assets/resources/animation/MonkGirl/InAirIdle1ByJump.anim.meta new file mode 100644 index 0000000..ad1f6ed --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/InAirIdle1ByJump.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "170bbc56-3cff-4a81-b48f-a037b9418758", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/InAirIdle1NoJump.anim b/frontend/assets/resources/animation/MonkGirl/InAirIdle1NoJump.anim new file mode 100644 index 0000000..396cc34 --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/InAirIdle1NoJump.anim @@ -0,0 +1,25 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "InAirIdle1NoJump", + "_objFlags": 0, + "_native": "", + "_duration": 0.016666666666666666, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "ce3e8e33-4420-478b-a084-5a7f77d584b8" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/InAirIdle1NoJump.anim.meta b/frontend/assets/resources/animation/MonkGirl/InAirIdle1NoJump.anim.meta new file mode 100644 index 0000000..d911250 --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/InAirIdle1NoJump.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "996c218a-9e18-441e-b0f8-e61c5c991b9e", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/LayDown1.anim b/frontend/assets/resources/animation/MonkGirl/LayDown1.anim new file mode 100644 index 0000000..8affc52 --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/LayDown1.anim @@ -0,0 +1,49 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "LayDown1", + "_objFlags": 0, + "_native": "", + "_duration": 0.08333333333333333, + "sample": 60, + "speed": 0.3, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "e1f19129-8517-47fa-814d-b79c8abcd549" + } + }, + { + "frame": 0.016666666666666666, + "value": { + "__uuid__": "b4127445-a13e-4244-9656-92033a5abcca" + } + }, + { + "frame": 0.03333333333333333, + "value": { + "__uuid__": "64a8e39c-95ed-4181-b777-b05434d1fa6d" + } + }, + { + "frame": 0.05, + "value": { + "__uuid__": "5d1458ae-8812-4c4a-a01f-0a2b901ed3f3" + } + }, + { + "frame": 0.06666666666666667, + "value": { + "__uuid__": "ac0b9039-5caf-4bc1-bf29-2a733fbb7898" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/LayDown1.anim.meta b/frontend/assets/resources/animation/MonkGirl/LayDown1.anim.meta new file mode 100644 index 0000000..d5d0a44 --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/LayDown1.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "0978395c-8947-4830-9f68-58fadcbe5c63", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist b/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist new file mode 100644 index 0000000..155a5aa --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist @@ -0,0 +1,1496 @@ + + + + + frames + + Atk1_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {62,92} + spriteSourceSize + {62,92} + textureRect + {{1277,188},{62,92}} + textureRotated + + + Atk1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {77,99} + spriteSourceSize + {77,99} + textureRect + {{748,0},{77,99}} + textureRotated + + + Atk1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,99} + spriteSourceSize + {112,99} + textureRect + {{408,348},{112,99}} + textureRotated + + + Atk1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,100} + spriteSourceSize + {96,100} + textureRect + {{664,315},{96,100}} + textureRotated + + + Atk1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {62,92} + spriteSourceSize + {62,92} + textureRect + {{1277,188},{62,92}} + textureRotated + + + Atk2_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {58,97} + spriteSourceSize + {58,97} + textureRect + {{1023,194},{58,97}} + textureRotated + + + Atk2_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {60,90} + spriteSourceSize + {60,90} + textureRect + {{1393,141},{60,90}} + textureRotated + + + Atk2_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {84,96} + spriteSourceSize + {84,96} + textureRect + {{1087,97},{84,96}} + textureRotated + + + Atk2_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {55,100} + spriteSourceSize + {55,100} + textureRect + {{731,101},{55,100}} + textureRotated + + + Atk2_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {63,100} + spriteSourceSize + {63,100} + textureRect + {{717,206},{63,100}} + textureRotated + + + Atk2_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {66,101} + spriteSourceSize + {66,101} + textureRect + {{682,0},{66,101}} + textureRotated + + + Atk2_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,95} + spriteSourceSize + {80,95} + textureRect + {{1126,0},{80,95}} + textureRotated + + + Atk2_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {116,109} + spriteSourceSize + {116,109} + textureRect + {{315,119},{116,109}} + textureRotated + + + Atk2_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {102,96} + spriteSourceSize + {102,96} + textureRect + {{621,213},{102,96}} + textureRotated + + + Atk2_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {75,102} + spriteSourceSize + {75,102} + textureRect + {{139,421},{75,102}} + textureRotated + + + Atk3_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {66,109} + spriteSourceSize + {66,109} + textureRect + {{469,110},{66,109}} + textureRotated + + + Atk3_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {66,113} + spriteSourceSize + {66,113} + textureRect + {{355,235},{66,113}} + textureRotated + + + Atk3_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {78,151} + spriteSourceSize + {78,151} + textureRect + {{0,0},{78,151}} + textureRotated + + + Atk3_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {77,144} + spriteSourceSize + {77,144} + textureRect + {{0,151},{77,144}} + textureRotated + + + Atk3_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {78,142} + spriteSourceSize + {78,142} + textureRect + {{0,295},{78,142}} + textureRotated + + + Atk3_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {83,139} + spriteSourceSize + {83,139} + textureRect + {{77,151},{83,139}} + textureRotated + + + Atk3_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {78,131} + spriteSourceSize + {78,131} + textureRect + {{137,290},{78,131}} + textureRotated + + + Atk3_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {59,139} + spriteSourceSize + {59,139} + textureRect + {{0,437},{59,139}} + textureRotated + + + Atk3_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {59,139} + spriteSourceSize + {59,139} + textureRect + {{78,290},{59,139}} + textureRotated + + + Atked1_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {62,97} + spriteSourceSize + {62,97} + textureRect + {{507,434},{62,97}} + textureRotated + + + Atked1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {73,95} + spriteSourceSize + {73,95} + textureRect + {{1171,95},{73,95}} + textureRotated + + + Atked1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {90,89} + spriteSourceSize + {90,89} + textureRect + {{1324,0},{90,89}} + textureRotated + + + BlownUp1_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {95,80} + spriteSourceSize + {95,80} + textureRect + {{1084,291},{95,80}} + textureRotated + + + BlownUp1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,95} + spriteSourceSize + {80,95} + textureRect + {{1010,388},{80,95}} + textureRotated + + + BlownUp1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {83,92} + spriteSourceSize + {83,92} + textureRect + {{1208,382},{83,92}} + textureRotated + + + BlownUp1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {92,83} + spriteSourceSize + {92,83} + textureRect + {{1224,284},{92,83}} + textureRotated + + + GetUp1_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,45} + spriteSourceSize + {112,45} + textureRect + {{424,115},{112,45}} + textureRotated + + + GetUp1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {88,69} + spriteSourceSize + {88,69} + textureRect + {{604,427},{88,69}} + textureRotated + + + GetUp1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {91,90} + spriteSourceSize + {91,90} + textureRect + {{1303,93},{91,90}} + textureRotated + + + GetUp1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {120,93} + spriteSourceSize + {120,93} + textureRect + {{222,123},{120,93}} + textureRotated + + + GetUp1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {100,112} + spriteSourceSize + {100,112} + textureRect + {{241,396},{100,112}} + textureRotated + + + GetUp1_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {106,93} + spriteSourceSize + {106,93} + textureRect + {{507,328},{106,93}} + textureRotated + + + GetUp1_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {106,79} + spriteSourceSize + {106,79} + textureRect + {{542,217},{106,79}} + textureRotated + + + GetUp1_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {73,87} + spriteSourceSize + {73,87} + textureRect + {{1307,280},{73,87}} + textureRotated + + + GetUp1_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {67,90} + spriteSourceSize + {67,90} + textureRect + {{1413,74},{67,90}} + textureRotated + + + GetUp1_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {58,97} + spriteSourceSize + {58,97} + textureRect + {{1023,194},{58,97}} + textureRotated + + + Idle1_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {58,95} + spriteSourceSize + {58,95} + textureRect + {{1090,386},{58,95}} + textureRotated + + + Idle1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {58,97} + spriteSourceSize + {58,97} + textureRect + {{1029,97},{58,97}} + textureRotated + + + Idle1_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {60,94} + spriteSourceSize + {60,94} + textureRect + {{1148,386},{60,94}} + textureRotated + + + Idle1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {58,97} + spriteSourceSize + {58,97} + textureRect + {{1081,194},{58,97}} + textureRotated + + + Idle1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {58,97} + spriteSourceSize + {58,97} + textureRect + {{1068,0},{58,97}} + textureRotated + + + Idle1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {60,95} + spriteSourceSize + {60,95} + textureRect + {{1206,0},{60,95}} + textureRotated + + + Idle1_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {60,94} + spriteSourceSize + {60,94} + textureRect + {{1164,288},{60,94}} + textureRotated + + + Idle1_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {59,93} + spriteSourceSize + {59,93} + textureRect + {{789,403},{59,93}} + textureRotated + + + Idle1_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {58,93} + spriteSourceSize + {58,93} + textureRect + {{1266,0},{58,93}} + textureRotated + + + Idle1_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {59,93} + spriteSourceSize + {59,93} + textureRect + {{1244,95},{59,93}} + textureRotated + + + Idle1_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {60,94} + spriteSourceSize + {60,94} + textureRect + {{1217,190},{60,94}} + textureRotated + + + InAirAtk1_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {77,68} + spriteSourceSize + {77,68} + textureRect + {{1437,417},{77,68}} + textureRotated + + + InAirAtk1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {118,76} + spriteSourceSize + {118,76} + textureRect + {{215,278},{118,76}} + textureRotated + + + InAirAtk1_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {104,65} + spriteSourceSize + {104,65} + textureRect + {{617,0},{104,65}} + textureRotated + + + InAirAtk1_11.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,66} + spriteSourceSize + {80,66} + textureRect + {{1380,285},{80,66}} + textureRotated + + + InAirAtk1_12.png + + aliases + + spriteOffset + {0,0} + spriteSize + {102,67} + spriteSourceSize + {102,67} + textureRect + {{664,104},{102,67}} + textureRotated + + + InAirAtk1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {79,66} + spriteSourceSize + {79,66} + textureRect + {{1339,201},{79,66}} + textureRotated + + + InAirAtk1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {124,64} + spriteSourceSize + {124,64} + textureRect + {{78,0},{124,64}} + textureRotated + + + InAirAtk1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {104,64} + spriteSourceSize + {104,64} + textureRect + {{600,323},{104,64}} + textureRotated + + + InAirAtk1_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {79,61} + spriteSourceSize + {79,61} + textureRect + {{1376,417},{79,61}} + textureRotated + + + InAirAtk1_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {124,64} + spriteSourceSize + {124,64} + textureRect + {{142,0},{124,64}} + textureRotated + + + InAirAtk1_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {106,67} + spriteSourceSize + {106,67} + textureRect + {{597,107},{106,67}} + textureRotated + + + InAirAtk1_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {79,66} + spriteSourceSize + {79,66} + textureRect + {{1380,351},{79,66}} + textureRotated + + + InAirAtk1_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {118,64} + spriteSourceSize + {118,64} + textureRect + {{291,243},{118,64}} + textureRotated + + + InAirIdle1_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {71,119} + spriteSourceSize + {71,119} + textureRect + {{242,0},{71,119}} + textureRotated + + + InAirIdle1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {71,119} + spriteSourceSize + {71,119} + textureRect + {{313,0},{71,119}} + textureRotated + + + InAirIdle1_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {55,114} + spriteSourceSize + {55,114} + textureRect + {{353,361},{55,114}} + textureRotated + + + InAirIdle1_11.png + + aliases + + spriteOffset + {0,0} + spriteSize + {62,124} + spriteSourceSize + {62,124} + textureRect + {{160,124},{62,124}} + textureRotated + + + InAirIdle1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {74,90} + spriteSourceSize + {74,90} + textureRect + {{1413,0},{74,90}} + textureRotated + + + InAirIdle1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {110,54} + spriteSourceSize + {110,54} + textureRect + {{440,0},{110,54}} + textureRotated + + + InAirIdle1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {85,88} + spriteSourceSize + {85,88} + textureRect + {{1291,376},{85,88}} + textureRotated + + + InAirIdle1_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {64,112} + spriteSourceSize + {64,112} + textureRect + {{421,235},{64,112}} + textureRotated + + + InAirIdle1_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {62,107} + spriteSourceSize + {62,107} + textureRect + {{555,0},{62,107}} + textureRotated + + + InAirIdle1_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {85,84} + spriteSourceSize + {85,84} + textureRect + {{1405,201},{85,84}} + textureRotated + + + InAirIdle1_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {109,61} + spriteSourceSize + {109,61} + textureRect + {{494,0},{109,61}} + textureRotated + + + InAirIdle1_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {78,95} + spriteSourceSize + {78,95} + textureRect + {{1139,193},{78,95}} + textureRotated + + + LayDown1_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {115,56} + spriteSourceSize + {115,56} + textureRect + {{384,0},{115,56}} + textureRotated + + + LayDown1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {109,57} + spriteSourceSize + {109,57} + textureRect + {{485,219},{109,57}} + textureRotated + + + LayDown1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {108,62} + spriteSourceSize + {108,62} + textureRect + {{535,109},{108,62}} + textureRotated + + + LayDown1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {123,36} + spriteSourceSize + {123,36} + textureRect + {{206,0},{123,36}} + textureRotated + + + LayDown1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {123,30} + spriteSourceSize + {123,30} + textureRect + {{160,248},{123,30}} + textureRotated + + + Walking_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {81,97} + spriteSourceSize + {81,97} + textureRect + {{692,415},{81,97}} + textureRotated + + + Walking_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {81,97} + spriteSourceSize + {81,97} + textureRect + {{760,306},{81,97}} + textureRotated + + + Walking_11.png + + aliases + + spriteOffset + {0,0} + spriteSize + {81,97} + spriteSourceSize + {81,97} + textureRect + {{780,201},{81,97}} + textureRotated + + + Walking_12.png + + aliases + + spriteOffset + {0,0} + spriteSize + {81,97} + spriteSourceSize + {81,97} + textureRect + {{786,99},{81,97}} + textureRotated + + + Walking_13.png + + aliases + + spriteOffset + {0,0} + spriteSize + {81,97} + spriteSourceSize + {81,97} + textureRect + {{825,0},{81,97}} + textureRotated + + + Walking_14.png + + aliases + + spriteOffset + {0,0} + spriteSize + {81,97} + spriteSourceSize + {81,97} + textureRect + {{841,298},{81,97}} + textureRotated + + + Walking_15.png + + aliases + + spriteOffset + {0,0} + spriteSize + {81,97} + spriteSourceSize + {81,97} + textureRect + {{848,395},{81,97}} + textureRotated + + + Walking_16.png + + aliases + + spriteOffset + {0,0} + spriteSize + {81,97} + spriteSourceSize + {81,97} + textureRect + {{861,196},{81,97}} + textureRotated + + + Walking_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {81,97} + spriteSourceSize + {81,97} + textureRect + {{867,97},{81,97}} + textureRotated + + + Walking_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {81,97} + spriteSourceSize + {81,97} + textureRect + {{906,0},{81,97}} + textureRotated + + + Walking_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {81,97} + spriteSourceSize + {81,97} + textureRect + {{922,293},{81,97}} + textureRotated + + + Walking_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {81,97} + spriteSourceSize + {81,97} + textureRect + {{942,194},{81,97}} + textureRotated + + + Walking_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {81,97} + spriteSourceSize + {81,97} + textureRect + {{948,97},{81,97}} + textureRotated + + + Walking_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {81,97} + spriteSourceSize + {81,97} + textureRect + {{987,0},{81,97}} + textureRotated + + + Walking_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {81,97} + spriteSourceSize + {81,97} + textureRect + {{929,390},{81,97}} + textureRotated + + + Walking_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {81,97} + spriteSourceSize + {81,97} + textureRect + {{1003,291},{81,97}} + textureRotated + + + + metadata + + format + 3 + pixelFormat + RGBA8888 + premultiplyAlpha + + realTextureFileName + MonkGirl.png + size + {1505,496} + smartupdate + $TexturePacker:SmartUpdate:8383576ddc6ed0fb9e6adcbc98ec9c07:b0caf27c9f592741053365a3d87b3473:7b088363a1f16e4f4ff313aecc52227b$ + textureFileName + MonkGirl.png + + + diff --git a/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist.meta b/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist.meta new file mode 100644 index 0000000..e72a3d5 --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist.meta @@ -0,0 +1,2168 @@ +{ + "ver": "1.2.4", + "uuid": "725c90f9-56f8-48ea-9159-4d2949cd3ce0", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "size": { + "width": 1505, + "height": 496 + }, + "type": "Texture Packer", + "subMetas": { + "Atk1_0.png": { + "ver": "1.0.4", + "uuid": "a5615ed4-d055-4db5-b924-4c8d8b2d926f", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 1277, + "trimY": 188, + "width": 62, + "height": 92, + "rawWidth": 62, + "rawHeight": 92, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk1_1.png": { + "ver": "1.0.4", + "uuid": "12b90556-58b9-4311-b5d9-820fb76d659b", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 748, + "trimY": 0, + "width": 77, + "height": 99, + "rawWidth": 77, + "rawHeight": 99, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk1_2.png": { + "ver": "1.0.4", + "uuid": "72bc74a1-6e8c-48bb-9ab2-9b8f502ceffb", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 408, + "trimY": 348, + "width": 112, + "height": 99, + "rawWidth": 112, + "rawHeight": 99, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk1_3.png": { + "ver": "1.0.4", + "uuid": "7e619896-100d-4903-b256-e30ddb5ad397", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 664, + "trimY": 315, + "width": 96, + "height": 100, + "rawWidth": 96, + "rawHeight": 100, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk1_4.png": { + "ver": "1.0.4", + "uuid": "4a35e0f5-95c4-445b-8f9b-6514a060a72d", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 1277, + "trimY": 188, + "width": 62, + "height": 92, + "rawWidth": 62, + "rawHeight": 92, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_0.png": { + "ver": "1.0.4", + "uuid": "1d9c010b-3209-4672-9f78-96527d62f4e0", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 1023, + "trimY": 194, + "width": 58, + "height": 97, + "rawWidth": 58, + "rawHeight": 97, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_1.png": { + "ver": "1.0.4", + "uuid": "1fd3ca4d-ec4d-4858-a3d2-fe274e22d4be", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 1393, + "trimY": 141, + "width": 60, + "height": 90, + "rawWidth": 60, + "rawHeight": 90, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_2.png": { + "ver": "1.0.4", + "uuid": "b0aaf216-b8d7-4247-be61-df9f3146ce46", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 1087, + "trimY": 97, + "width": 84, + "height": 96, + "rawWidth": 84, + "rawHeight": 96, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_3.png": { + "ver": "1.0.4", + "uuid": "f12c5713-540f-4874-a6b0-0162f0ffb544", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 731, + "trimY": 101, + "width": 55, + "height": 100, + "rawWidth": 55, + "rawHeight": 100, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_4.png": { + "ver": "1.0.4", + "uuid": "b9a4cd85-53d1-4280-bc9e-35a8dd482fa4", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 717, + "trimY": 206, + "width": 63, + "height": 100, + "rawWidth": 63, + "rawHeight": 100, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_5.png": { + "ver": "1.0.4", + "uuid": "74e9fcd1-11dc-478e-b90a-d4c5cf551aad", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 682, + "trimY": 0, + "width": 66, + "height": 101, + "rawWidth": 66, + "rawHeight": 101, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_6.png": { + "ver": "1.0.4", + "uuid": "0e3b6c28-f265-457d-b000-aeea66d05428", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 1126, + "trimY": 0, + "width": 80, + "height": 95, + "rawWidth": 80, + "rawHeight": 95, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_7.png": { + "ver": "1.0.4", + "uuid": "e6c3bdcd-9ba8-4c5b-910d-2d93d9068abd", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 315, + "trimY": 119, + "width": 116, + "height": 109, + "rawWidth": 116, + "rawHeight": 109, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_8.png": { + "ver": "1.0.4", + "uuid": "c359790f-bbd1-4869-a37b-7f1c0bd91578", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 621, + "trimY": 213, + "width": 102, + "height": 96, + "rawWidth": 102, + "rawHeight": 96, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_9.png": { + "ver": "1.0.4", + "uuid": "1b9074dd-d0b0-4129-8d72-8f356bf7f68c", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 139, + "trimY": 421, + "width": 75, + "height": 102, + "rawWidth": 75, + "rawHeight": 102, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_0.png": { + "ver": "1.0.4", + "uuid": "39ba4413-6f4a-49a5-a7ca-d11140dfe7dd", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 469, + "trimY": 110, + "width": 66, + "height": 109, + "rawWidth": 66, + "rawHeight": 109, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_1.png": { + "ver": "1.0.4", + "uuid": "26b646c7-bdbc-495e-adaf-9d52ef1b5c84", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 355, + "trimY": 235, + "width": 66, + "height": 113, + "rawWidth": 66, + "rawHeight": 113, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_2.png": { + "ver": "1.0.4", + "uuid": "5a5208a0-1c29-446f-8375-739aef09fe65", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 78, + "height": 151, + "rawWidth": 78, + "rawHeight": 151, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_3.png": { + "ver": "1.0.4", + "uuid": "414628f0-13ec-4f01-83a0-b94f6a13fff1", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 151, + "width": 77, + "height": 144, + "rawWidth": 77, + "rawHeight": 144, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_4.png": { + "ver": "1.0.4", + "uuid": "c494965a-e7e6-4c99-ac61-60642e6247dc", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 295, + "width": 78, + "height": 142, + "rawWidth": 78, + "rawHeight": 142, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_5.png": { + "ver": "1.0.4", + "uuid": "04cafb17-39ab-4f2b-9830-3eaf42cab254", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 77, + "trimY": 151, + "width": 83, + "height": 139, + "rawWidth": 83, + "rawHeight": 139, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_6.png": { + "ver": "1.0.4", + "uuid": "fd9c7d8a-1038-4cab-a0e6-699e404701db", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 137, + "trimY": 290, + "width": 78, + "height": 131, + "rawWidth": 78, + "rawHeight": 131, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_7.png": { + "ver": "1.0.4", + "uuid": "2447c6b3-292b-43b4-84e5-acc35df0c1f5", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 437, + "width": 59, + "height": 139, + "rawWidth": 59, + "rawHeight": 139, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_8.png": { + "ver": "1.0.4", + "uuid": "00275818-b9b6-41ab-a792-f21ff10747fa", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 78, + "trimY": 290, + "width": 59, + "height": 139, + "rawWidth": 59, + "rawHeight": 139, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atked1_0.png": { + "ver": "1.0.4", + "uuid": "df446561-abb9-4d91-aa79-636bdf3d9335", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 507, + "trimY": 434, + "width": 62, + "height": 97, + "rawWidth": 62, + "rawHeight": 97, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atked1_1.png": { + "ver": "1.0.4", + "uuid": "852471cd-6270-47d2-b40b-e33a93910240", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 1171, + "trimY": 95, + "width": 73, + "height": 95, + "rawWidth": 73, + "rawHeight": 95, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atked1_2.png": { + "ver": "1.0.4", + "uuid": "7d08ee55-243c-4bb0-b614-1cd09cabf13f", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 1324, + "trimY": 0, + "width": 90, + "height": 89, + "rawWidth": 90, + "rawHeight": 89, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "BlownUp1_0.png": { + "ver": "1.0.4", + "uuid": "9d16c119-8ead-4d9e-90b3-5bbf749f71ef", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 1084, + "trimY": 291, + "width": 95, + "height": 80, + "rawWidth": 95, + "rawHeight": 80, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "BlownUp1_1.png": { + "ver": "1.0.4", + "uuid": "f2629502-5c62-4df2-9741-58fe94bfab53", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 1010, + "trimY": 388, + "width": 80, + "height": 95, + "rawWidth": 80, + "rawHeight": 95, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "BlownUp1_2.png": { + "ver": "1.0.4", + "uuid": "d6a81e68-5f14-45d1-82e2-fabf2853685a", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 1208, + "trimY": 382, + "width": 83, + "height": 92, + "rawWidth": 83, + "rawHeight": 92, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "BlownUp1_3.png": { + "ver": "1.0.4", + "uuid": "9f7382dd-4da6-485c-8064-78ec031a2c0a", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 1224, + "trimY": 284, + "width": 92, + "height": 83, + "rawWidth": 92, + "rawHeight": 83, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "GetUp1_0.png": { + "ver": "1.0.4", + "uuid": "4b1219ad-ef64-47f6-87ca-16188343c47a", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 424, + "trimY": 115, + "width": 112, + "height": 45, + "rawWidth": 112, + "rawHeight": 45, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "GetUp1_1.png": { + "ver": "1.0.4", + "uuid": "49e7f092-85c2-4eb3-a62a-965e9e0d9c12", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 604, + "trimY": 427, + "width": 88, + "height": 69, + "rawWidth": 88, + "rawHeight": 69, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "GetUp1_2.png": { + "ver": "1.0.4", + "uuid": "73023874-a74c-4e9f-8389-d4280d7be452", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 1303, + "trimY": 93, + "width": 91, + "height": 90, + "rawWidth": 91, + "rawHeight": 90, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "GetUp1_3.png": { + "ver": "1.0.4", + "uuid": "ed62daef-540c-4b34-81d3-99c4296d6ca9", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 222, + "trimY": 123, + "width": 120, + "height": 93, + "rawWidth": 120, + "rawHeight": 93, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "GetUp1_4.png": { + "ver": "1.0.4", + "uuid": "cdbcadf6-4e4f-4673-8044-51b40c58da96", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 241, + "trimY": 396, + "width": 100, + "height": 112, + "rawWidth": 100, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "GetUp1_5.png": { + "ver": "1.0.4", + "uuid": "7ae337de-a63f-41ef-9627-84f9ced77d6f", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 507, + "trimY": 328, + "width": 106, + "height": 93, + "rawWidth": 106, + "rawHeight": 93, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "GetUp1_6.png": { + "ver": "1.0.4", + "uuid": "931626d5-01ad-4329-a8f7-9a00bd64fdff", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 542, + "trimY": 217, + "width": 106, + "height": 79, + "rawWidth": 106, + "rawHeight": 79, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "GetUp1_7.png": { + "ver": "1.0.4", + "uuid": "d4c2dae6-8ff6-4976-8e50-cb0b698d93d4", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 1307, + "trimY": 280, + "width": 73, + "height": 87, + "rawWidth": 73, + "rawHeight": 87, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "GetUp1_8.png": { + "ver": "1.0.4", + "uuid": "b328d317-3721-4402-89db-34910c31a48a", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 1413, + "trimY": 74, + "width": 67, + "height": 90, + "rawWidth": 67, + "rawHeight": 90, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "GetUp1_9.png": { + "ver": "1.0.4", + "uuid": "a51ca0c2-3e3b-4b7b-b636-1cac791c2511", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 1023, + "trimY": 194, + "width": 58, + "height": 97, + "rawWidth": 58, + "rawHeight": 97, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_0.png": { + "ver": "1.0.4", + "uuid": "104ab450-fec3-4ea8-b6c0-aca74a826f5a", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 1090, + "trimY": 386, + "width": 58, + "height": 95, + "rawWidth": 58, + "rawHeight": 95, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_1.png": { + "ver": "1.0.4", + "uuid": "4bad7430-7b43-47ae-9d65-ef3a2b88f450", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 1029, + "trimY": 97, + "width": 58, + "height": 97, + "rawWidth": 58, + "rawHeight": 97, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_10.png": { + "ver": "1.0.4", + "uuid": "3a435737-51d0-4f31-ad2b-838d9d98bad3", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 1148, + "trimY": 386, + "width": 60, + "height": 94, + "rawWidth": 60, + "rawHeight": 94, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_2.png": { + "ver": "1.0.4", + "uuid": "c3675bd6-4aa6-4ec5-80d5-ef35862d15b9", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 1081, + "trimY": 194, + "width": 58, + "height": 97, + "rawWidth": 58, + "rawHeight": 97, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_3.png": { + "ver": "1.0.4", + "uuid": "23446a26-dadf-4d7d-9dd3-4ca3f8f6b7a5", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 1068, + "trimY": 0, + "width": 58, + "height": 97, + "rawWidth": 58, + "rawHeight": 97, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_4.png": { + "ver": "1.0.4", + "uuid": "47628469-7775-4daf-b321-74fac947ce60", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 1206, + "trimY": 0, + "width": 60, + "height": 95, + "rawWidth": 60, + "rawHeight": 95, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_5.png": { + "ver": "1.0.4", + "uuid": "1c37ea82-6700-4bea-9265-c70a16d2187c", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 1164, + "trimY": 288, + "width": 60, + "height": 94, + "rawWidth": 60, + "rawHeight": 94, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_6.png": { + "ver": "1.0.4", + "uuid": "c4fb2fc2-7a04-4219-b129-77249f33426b", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 789, + "trimY": 403, + "width": 59, + "height": 93, + "rawWidth": 59, + "rawHeight": 93, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_7.png": { + "ver": "1.0.4", + "uuid": "0ecf4a0c-0f13-42fa-a214-b4826acd8556", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 1266, + "trimY": 0, + "width": 58, + "height": 93, + "rawWidth": 58, + "rawHeight": 93, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_8.png": { + "ver": "1.0.4", + "uuid": "cabf9cb6-99ca-426d-9a23-95cdec6f06b9", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 1244, + "trimY": 95, + "width": 59, + "height": 93, + "rawWidth": 59, + "rawHeight": 93, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_9.png": { + "ver": "1.0.4", + "uuid": "94d073e8-f17f-4a66-be72-2b8cf3347ea4", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 1217, + "trimY": 190, + "width": 60, + "height": 94, + "rawWidth": 60, + "rawHeight": 94, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtk1_0.png": { + "ver": "1.0.4", + "uuid": "f10683b4-2dd8-48d9-b11d-3e7fd12e2dee", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 1437, + "trimY": 417, + "width": 77, + "height": 68, + "rawWidth": 77, + "rawHeight": 68, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtk1_1.png": { + "ver": "1.0.4", + "uuid": "6134b002-58ed-4d78-af23-5f574661b04b", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 215, + "trimY": 278, + "width": 118, + "height": 76, + "rawWidth": 118, + "rawHeight": 76, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtk1_10.png": { + "ver": "1.0.4", + "uuid": "1753c533-3a31-46b6-ab01-15b778702237", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 617, + "trimY": 0, + "width": 104, + "height": 65, + "rawWidth": 104, + "rawHeight": 65, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtk1_11.png": { + "ver": "1.0.4", + "uuid": "923cfcea-2c3e-493f-826a-0b08b447ebde", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 1380, + "trimY": 285, + "width": 80, + "height": 66, + "rawWidth": 80, + "rawHeight": 66, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtk1_12.png": { + "ver": "1.0.4", + "uuid": "3631c1af-5426-420e-9c81-47d8dc4790f7", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 664, + "trimY": 104, + "width": 102, + "height": 67, + "rawWidth": 102, + "rawHeight": 67, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtk1_2.png": { + "ver": "1.0.4", + "uuid": "5db472a6-3371-4a5b-860d-e6ea6a9eaba0", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 1339, + "trimY": 201, + "width": 79, + "height": 66, + "rawWidth": 79, + "rawHeight": 66, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtk1_3.png": { + "ver": "1.0.4", + "uuid": "769179e3-d0bb-4bd0-a084-ce5ad5b57d47", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 78, + "trimY": 0, + "width": 124, + "height": 64, + "rawWidth": 124, + "rawHeight": 64, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtk1_4.png": { + "ver": "1.0.4", + "uuid": "8f09ba68-066c-4240-84be-390cdbb2d59c", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 600, + "trimY": 323, + "width": 104, + "height": 64, + "rawWidth": 104, + "rawHeight": 64, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtk1_5.png": { + "ver": "1.0.4", + "uuid": "e8ce0f1e-6af0-423b-9448-2a72c944127d", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 1376, + "trimY": 417, + "width": 79, + "height": 61, + "rawWidth": 79, + "rawHeight": 61, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtk1_6.png": { + "ver": "1.0.4", + "uuid": "1da322c5-98b8-49d0-8f96-33fdc68a23cb", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 142, + "trimY": 0, + "width": 124, + "height": 64, + "rawWidth": 124, + "rawHeight": 64, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtk1_7.png": { + "ver": "1.0.4", + "uuid": "1e4bf242-5d08-4220-a5d9-2a2524b0e3c7", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 597, + "trimY": 107, + "width": 106, + "height": 67, + "rawWidth": 106, + "rawHeight": 67, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtk1_8.png": { + "ver": "1.0.4", + "uuid": "6de218a1-5a97-405d-b7d0-68cc9cf076f9", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 1380, + "trimY": 351, + "width": 79, + "height": 66, + "rawWidth": 79, + "rawHeight": 66, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtk1_9.png": { + "ver": "1.0.4", + "uuid": "4c16e710-abfe-4030-bd42-fded0f41f665", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 291, + "trimY": 243, + "width": 118, + "height": 64, + "rawWidth": 118, + "rawHeight": 64, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_0.png": { + "ver": "1.0.4", + "uuid": "9106d51d-808b-4cec-b03c-1a0e9de3dd13", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 242, + "trimY": 0, + "width": 71, + "height": 119, + "rawWidth": 71, + "rawHeight": 119, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_1.png": { + "ver": "1.0.4", + "uuid": "21c7f1b2-77c7-4f9a-b5c6-b79d99553432", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 313, + "trimY": 0, + "width": 71, + "height": 119, + "rawWidth": 71, + "rawHeight": 119, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_10.png": { + "ver": "1.0.4", + "uuid": "77a2f890-6627-4699-9278-21d7365bd2c8", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 353, + "trimY": 361, + "width": 55, + "height": 114, + "rawWidth": 55, + "rawHeight": 114, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_11.png": { + "ver": "1.0.4", + "uuid": "ce3e8e33-4420-478b-a084-5a7f77d584b8", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 160, + "trimY": 124, + "width": 62, + "height": 124, + "rawWidth": 62, + "rawHeight": 124, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_2.png": { + "ver": "1.0.4", + "uuid": "23199f52-ded0-4271-b426-17c6037989a4", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 1413, + "trimY": 0, + "width": 74, + "height": 90, + "rawWidth": 74, + "rawHeight": 90, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_3.png": { + "ver": "1.0.4", + "uuid": "293367f0-6557-40d2-aff5-4f6b9faa3b14", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 440, + "trimY": 0, + "width": 110, + "height": 54, + "rawWidth": 110, + "rawHeight": 54, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_4.png": { + "ver": "1.0.4", + "uuid": "f9029e1e-91f8-4ae2-a3ef-b811c409f41a", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 1291, + "trimY": 376, + "width": 85, + "height": 88, + "rawWidth": 85, + "rawHeight": 88, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_5.png": { + "ver": "1.0.4", + "uuid": "de0e3195-e56e-4bba-82f6-72635f453eea", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 421, + "trimY": 235, + "width": 64, + "height": 112, + "rawWidth": 64, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_6.png": { + "ver": "1.0.4", + "uuid": "93e7fb75-b42d-4da9-860d-2e7dd0930d8d", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 555, + "trimY": 0, + "width": 62, + "height": 107, + "rawWidth": 62, + "rawHeight": 107, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_7.png": { + "ver": "1.0.4", + "uuid": "1a789615-1580-4342-b739-7ef94c80b34a", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 1405, + "trimY": 201, + "width": 85, + "height": 84, + "rawWidth": 85, + "rawHeight": 84, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_8.png": { + "ver": "1.0.4", + "uuid": "5331bbb0-fad4-402c-8788-cb070cc8fb7c", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 494, + "trimY": 0, + "width": 109, + "height": 61, + "rawWidth": 109, + "rawHeight": 61, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_9.png": { + "ver": "1.0.4", + "uuid": "2f2bce67-0e39-45ee-aebf-b15e0d0c341f", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 1139, + "trimY": 193, + "width": 78, + "height": 95, + "rawWidth": 78, + "rawHeight": 95, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "LayDown1_0.png": { + "ver": "1.0.4", + "uuid": "e1f19129-8517-47fa-814d-b79c8abcd549", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 384, + "trimY": 0, + "width": 115, + "height": 56, + "rawWidth": 115, + "rawHeight": 56, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "LayDown1_1.png": { + "ver": "1.0.4", + "uuid": "b4127445-a13e-4244-9656-92033a5abcca", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 485, + "trimY": 219, + "width": 109, + "height": 57, + "rawWidth": 109, + "rawHeight": 57, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "LayDown1_2.png": { + "ver": "1.0.4", + "uuid": "64a8e39c-95ed-4181-b777-b05434d1fa6d", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 535, + "trimY": 109, + "width": 108, + "height": 62, + "rawWidth": 108, + "rawHeight": 62, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "LayDown1_3.png": { + "ver": "1.0.4", + "uuid": "5d1458ae-8812-4c4a-a01f-0a2b901ed3f3", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 206, + "trimY": 0, + "width": 123, + "height": 36, + "rawWidth": 123, + "rawHeight": 36, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "LayDown1_4.png": { + "ver": "1.0.4", + "uuid": "ac0b9039-5caf-4bc1-bf29-2a733fbb7898", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 160, + "trimY": 248, + "width": 123, + "height": 30, + "rawWidth": 123, + "rawHeight": 30, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_1.png": { + "ver": "1.0.4", + "uuid": "7515ef50-3a14-4e58-8811-a0c890fc40f3", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 692, + "trimY": 415, + "width": 81, + "height": 97, + "rawWidth": 81, + "rawHeight": 97, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_10.png": { + "ver": "1.0.4", + "uuid": "650b8ccb-2a82-4972-bb5b-79a2cb4a3503", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 760, + "trimY": 306, + "width": 81, + "height": 97, + "rawWidth": 81, + "rawHeight": 97, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_11.png": { + "ver": "1.0.4", + "uuid": "b264bcc2-71c7-45a6-8c94-be049bb0d163", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 780, + "trimY": 201, + "width": 81, + "height": 97, + "rawWidth": 81, + "rawHeight": 97, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_12.png": { + "ver": "1.0.4", + "uuid": "a75af05e-3b54-45d8-b7ad-cbcf2b65b2a9", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 786, + "trimY": 99, + "width": 81, + "height": 97, + "rawWidth": 81, + "rawHeight": 97, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_13.png": { + "ver": "1.0.4", + "uuid": "3e2e26f7-007a-4130-8d90-154dfcde96d3", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 825, + "trimY": 0, + "width": 81, + "height": 97, + "rawWidth": 81, + "rawHeight": 97, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_14.png": { + "ver": "1.0.4", + "uuid": "275387d0-70fd-47f5-b82e-14165a14c45a", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 841, + "trimY": 298, + "width": 81, + "height": 97, + "rawWidth": 81, + "rawHeight": 97, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_15.png": { + "ver": "1.0.4", + "uuid": "9cf71d99-7262-4a6c-8c27-06167d841a24", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 848, + "trimY": 395, + "width": 81, + "height": 97, + "rawWidth": 81, + "rawHeight": 97, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_16.png": { + "ver": "1.0.4", + "uuid": "60f04127-1580-4dda-828b-57d82e991398", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 861, + "trimY": 196, + "width": 81, + "height": 97, + "rawWidth": 81, + "rawHeight": 97, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_2.png": { + "ver": "1.0.4", + "uuid": "fa3d6703-1cfc-4f40-b61e-7ebf0fdac56a", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 867, + "trimY": 97, + "width": 81, + "height": 97, + "rawWidth": 81, + "rawHeight": 97, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_3.png": { + "ver": "1.0.4", + "uuid": "37eea7f3-5a1d-4172-be38-9b492399ef44", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 906, + "trimY": 0, + "width": 81, + "height": 97, + "rawWidth": 81, + "rawHeight": 97, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_4.png": { + "ver": "1.0.4", + "uuid": "0e2ad2ed-2b21-4e14-9607-5a341d9ed7e4", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 922, + "trimY": 293, + "width": 81, + "height": 97, + "rawWidth": 81, + "rawHeight": 97, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_5.png": { + "ver": "1.0.4", + "uuid": "e1625aba-a6fc-4883-a696-2d9d56d3050d", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 942, + "trimY": 194, + "width": 81, + "height": 97, + "rawWidth": 81, + "rawHeight": 97, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_6.png": { + "ver": "1.0.4", + "uuid": "86f805a2-a27c-4c96-8e11-acc448b0bdd0", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 948, + "trimY": 97, + "width": 81, + "height": 97, + "rawWidth": 81, + "rawHeight": 97, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_7.png": { + "ver": "1.0.4", + "uuid": "63bcaa39-1cc5-461f-a175-0d7a0abd3510", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 987, + "trimY": 0, + "width": 81, + "height": 97, + "rawWidth": 81, + "rawHeight": 97, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_8.png": { + "ver": "1.0.4", + "uuid": "691383d5-9199-4bd5-9803-403216331d7f", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 929, + "trimY": 390, + "width": 81, + "height": 97, + "rawWidth": 81, + "rawHeight": 97, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_9.png": { + "ver": "1.0.4", + "uuid": "602818c2-1242-4a24-87ba-77f6accccbc3", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 1003, + "trimY": 291, + "width": 81, + "height": 97, + "rawWidth": 81, + "rawHeight": 97, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/MonkGirl.png b/frontend/assets/resources/animation/MonkGirl/MonkGirl.png new file mode 100644 index 0000000..0984281 Binary files /dev/null and b/frontend/assets/resources/animation/MonkGirl/MonkGirl.png differ diff --git a/frontend/assets/resources/animation/MonkGirl/MonkGirl.png.meta b/frontend/assets/resources/animation/MonkGirl/MonkGirl.png.meta new file mode 100644 index 0000000..3acb665 --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/MonkGirl.png.meta @@ -0,0 +1,12 @@ +{ + "ver": "2.3.3", + "uuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "type": "raw", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": true, + "platformSettings": {}, + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/Walking.anim b/frontend/assets/resources/animation/MonkGirl/Walking.anim new file mode 100644 index 0000000..6235387 --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/Walking.anim @@ -0,0 +1,129 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "Walking", + "_objFlags": 0, + "_native": "", + "_duration": 0.6666666666666666, + "sample": 60, + "speed": 1, + "wrapMode": 2, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "60f04127-1580-4dda-828b-57d82e991398" + } + }, + { + "frame": 0.05, + "value": { + "__uuid__": "37eea7f3-5a1d-4172-be38-9b492399ef44" + } + }, + { + "frame": 0.1, + "value": { + "__uuid__": "0e2ad2ed-2b21-4e14-9607-5a341d9ed7e4" + } + }, + { + "frame": 0.15, + "value": { + "__uuid__": "e1625aba-a6fc-4883-a696-2d9d56d3050d" + } + }, + { + "frame": 0.2, + "value": { + "__uuid__": "86f805a2-a27c-4c96-8e11-acc448b0bdd0" + } + }, + { + "frame": 0.25, + "value": { + "__uuid__": "63bcaa39-1cc5-461f-a175-0d7a0abd3510" + } + }, + { + "frame": 0.3, + "value": { + "__uuid__": "691383d5-9199-4bd5-9803-403216331d7f" + } + }, + { + "frame": 0.35, + "value": { + "__uuid__": "602818c2-1242-4a24-87ba-77f6accccbc3" + } + }, + { + "frame": 0.4, + "value": { + "__uuid__": "650b8ccb-2a82-4972-bb5b-79a2cb4a3503" + } + }, + { + "frame": 0.45, + "value": { + "__uuid__": "b264bcc2-71c7-45a6-8c94-be049bb0d163" + } + }, + { + "frame": 0.5, + "value": { + "__uuid__": "3e2e26f7-007a-4130-8d90-154dfcde96d3" + } + }, + { + "frame": 0.55, + "value": { + "__uuid__": "275387d0-70fd-47f5-b82e-14165a14c45a" + } + }, + { + "frame": 0.6, + "value": { + "__uuid__": "9cf71d99-7262-4a6c-8c27-06167d841a24" + } + }, + { + "frame": 0.65, + "value": { + "__uuid__": "60f04127-1580-4dda-828b-57d82e991398" + } + } + ] + } + } + }, + "events": [ + { + "frame": 0, + "func": "", + "params": [] + }, + { + "frame": 0, + "func": "", + "params": [] + }, + { + "frame": 0, + "func": "", + "params": [] + }, + { + "frame": 0, + "func": "", + "params": [] + }, + { + "frame": 0, + "func": "", + "params": [] + } + ] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/MonkGirl/Walking.anim.meta b/frontend/assets/resources/animation/MonkGirl/Walking.anim.meta new file mode 100644 index 0000000..1f66a37 --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/Walking.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "768d591b-4467-4a8f-95bf-4f7fcc3835b6", + "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 b7e54a3..d679abd 100644 --- a/frontend/assets/resources/map/dungeon/map.tmx +++ b/frontend/assets/resources/map/dungeon/map.tmx @@ -1,18 +1,18 @@ - + - eJzt3MFq1EAcwOFli5ceikUU9NyD4Et47qle9OapLyB60ZMgvoIH776nWUggxkySnZ1kksx3+KC0S2jn9082E5ZeHQ6HKwAAAAAAAAAAAAAAAAAAiHBdy/17sJzHlqb/Y4Fyd8jZ/1hr+n+s3Accd0j/f/uH6L8/7f73I/2vV9BK//n699F/305/+/Na39p0rwm5W+m/bP8S6K9/7g45+z+LkLuZ/nn772kG9Nc/d4ct9l8T/cvs7/wvu3+KGdB/u5z/+utfbv8UM6B/+rVtnin+uNDc577++uu/jf4va/qX07/du/21/vrrn6//0xEp+7fpn7f/WPe+/r8q78/U9Hf/t57+U9s/HNz/b8XU/lPbH/XflLH+fY3fVG4C7bv9ux7OpH++/n3tb1q63efo/6Jyp/9q+g9d99v9U9N/vf1j7hHPpf/y/afMQHctU/Ydk7L/cQUt1tg/1RoPiWmv/376nzMjcxxb/23MwFz0L3sG9Ne/5P651z+30vd/udc/N/3Lpn/Z9C+b/mXTv2z6l03/sulfNv3Lpn/Z9C+b/mXTv2z6l03/9boL0H8d/ef6nFCo+xxzoP96+t+OeBKg/z7656B/fG/9t23t93/6769/6L29+fm7hNrHDF2ffP573Ida93rffD/3OXzp+a//sKH3/C3177tG6D8stOc6Gduv3U44fs72Tf/cHdbav+n8+gKX7s/nbK///Guf4hnNXO31T/88LdQ/xwxM2SOU3n+p87+x1HOiqXtE/Zft38zAnP/v5ZxnBPr/L+X9/ND+IeR7hJj2+o/3u3QOYvrHzMDPSPpPEzsHrw5x/f9UvgRaN75VPtWv1X/e/rGq/m9j+598PoT7f2297tTyd03/6f3J3wEAAAAAAAAAAAAAAABY3l9OOPTh + eJzt3LGK1EAcwOGwYnPF4SEKWl8h+BLWV52Ndlb3AqKNVoL4ADYW9r6nu5BAXHeS7OwkM8l8xQfH3RLu8vtPLhOWfdQ0zSMAAAAAAAAAAAAAAAAAAIhw1cr9e7Cch56u/0OFcnfI2X/X6vp/2LsL2G2Q/v/2D9F/e/r970b6XxXQSv/5+p+i/7Yd/vZnrVPn5viakLuV/sv2r4H++ufukLP/0wi5m+mft/+WZkB//XN3WGP/kuhfZ3/rv+7+KWZA//Wy/vXXv97+KWZA//Tntnum+P1Cc699/fXXfx39X7T0r6d/v3f/a/311z9f/ycjUvbv0z9v/7Hup/r/2nt3pq6/+79y+k9tf9+4/1+Lqf2ntt/pvypj/U81fr13HWh/3P/Y/Zn0z9f/VPvrnuPuc/R/vnerfzH9h677/f6p6V9u/5h7xHPpv3z/KTNwfC5T9h2Tsv+ugBYl9k91jofEtNd/O/3PmZE5jq3/5TPwJ1GLVMfRP13/KTOg/zrpr39J3XL1z91Bf/3X3P9nQvqvr/+a6V83/eumf930r5v+ddO/bvrXTf+66V83/eumf930r5v+5boN0L+M/nO9XzTUfY450L+c/jcjHgfov43+Oegf31v/dSv9/k//7fUP/W/vfv42of4xQ9cn7/8e9751fL3vvp97DV+6/vUfNvQ/f039T10j9B8W2nMdjO3XbiYcP2f7rn/uDqX27zq/usCl+/M52+s//7lP8Yxmrvb6p3+eFuqfYwam7BFq77/U+u8s9Zxo6h5R/2X7dzMw5+e9nPOMQP//pbyfH9o/hHyLENNe//F+l85BTP+YGfgRSf9pYufgZRPX//BZAJ8DrTtf9z62r9V/3v6x9v3fxPY/+NSE+3/pve7Q8ndL/+n9yd8BAAAAAAAAAAAAAAAAWN5f3AoF6w== - + - + @@ -200,5 +200,20 @@ + + + + + + + + + + + + + + + diff --git a/frontend/assets/resources/pbfiles/room_downsync_frame.proto b/frontend/assets/resources/pbfiles/room_downsync_frame.proto index f8cc68c..4226fa8 100644 --- a/frontend/assets/resources/pbfiles/room_downsync_frame.proto +++ b/frontend/assets/resources/pbfiles/room_downsync_frame.proto @@ -15,7 +15,7 @@ message PlayerDownsync { int32 speed = 8; // this is the instantaneous scalar attribute of a character, different from but will be accounted in "velX" and "velY" int32 battleState = 9; int32 joinIndex = 10; - double colliderRadius = 11; + int32 colliderRadius = 11; bool removed = 12; int32 score = 13; int32 lastMoveGmtMillis = 14; @@ -24,10 +24,14 @@ message PlayerDownsync { int32 maxHp = 17; int32 characterState = 18; bool inAir = 19; // by design a standalone field only inferred by the collision result of "applyInputFrameDownsyncDynamicsOnSingleRenderFrame" instead of "characterState", because we need check the transition for "characterState" from this field, i.e. "inAir (prev -> curr)" + int32 framesInChState = 20; // number of frames elapsed in the current character state + int32 activeSkillId = 21; + int32 activeSkillHit = 22; + int32 framesInvinsible = 23; - string name = 20; - string displayName = 21; - string avatar = 22; + string name = 997; + string displayName = 998; + string avatar = 999; } message InputFrameDecoded { @@ -84,67 +88,47 @@ message MeleeBullet { // ALL lengths are in world coordinate // for offender - int32 battleLocalId = 1; - int32 startupFrames = 2; - int32 activeFrames = 3; - int32 recoveryFrames = 4; - int32 recoveryFramesOnBlock = 5; - int32 recoveryFramesOnHit = 6; - double hitboxOffset = 7; - int32 originatedRenderFrameId = 8; + int32 originatedRenderFrameId = 1; + int32 offenderJoinIndex = 2; - // for defender - int32 hitStunFrames = 9; - int32 blockStunFrames = 10; - double pushback = 11; + int32 startupFrames = 3; + int32 cancellableStFrame = 4; + int32 cancellableEdFrame = 5; + int32 activeFrames = 6; - int32 releaseTriggerType = 12; // 1: rising-edge, 2: falling-edge - int32 damage = 13; + int32 hitStunFrames = 7; + int32 blockStunFrames = 8; + int32 pushbackVelX = 9; + int32 pushbackVelY = 10; + int32 damage = 11; - int32 offenderJoinIndex = 14; - int32 offenderPlayerId = 15; + int32 selfLockVelX = 12; + int32 selfLockVelY = 13; - double hitboxSizeX = 16; - double hitboxSizeY = 17; + int32 hitboxOffsetX = 14; + int32 hitboxOffsetY = 15; + int32 hitboxSizeX = 16; + int32 hitboxSizeY = 17; - double selfMoveforwardX = 18; - double selfMoveforwardY = 19; + bool blowUp = 18; } message BattleColliderInfo { string stageName = 1; - int32 stageDiscreteW = 2; - int32 stageDiscreteH = 3; - int32 stageTileW = 4; - int32 stageTileH = 5; - int32 intervalToPing = 6; - int32 willKickIfInactiveFor = 7; - int32 boundRoomId = 8; - int32 battleDurationFrames = 9; - int64 battleDurationNanos = 10; - int32 serverFps = 11; - int32 inputDelayFrames = 12; // in the count of render frames - uint32 inputScaleFrames = 13; // inputDelayedAndScaledFrameId = ((originalFrameId - InputDelayFrames) >> InputScaleFrames) - int32 nstDelayFrames = 14; // 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" - int32 inputFrameUpsyncDelayTolerance = 15; - int32 maxChasingRenderFramesPerUpdate = 16; - int32 playerBattleState = 17; - double rollbackEstimatedDtMillis = 18; - int64 rollbackEstimatedDtNanos = 19; + int32 intervalToPing = 2; + int32 willKickIfInactiveFor = 3; + int32 boundRoomId = 4; + int64 battleDurationNanos = 5; + int32 inputFrameUpsyncDelayTolerance = 6; + int32 maxChasingRenderFramesPerUpdate = 7; + double rollbackEstimatedDtMillis = 8; + int64 rollbackEstimatedDtNanos = 9; - double worldToVirtualGridRatio = 20; - double virtualGridToWorldRatio = 21; - - int32 spAtkLookupFrames = 22; - int32 renderCacheSize = 23; - - double snapIntoPlatformOverlap = 24; - double snapIntoPlatformThreshold = 25; - int32 jumpingInitVelY = 26; - int32 gravityX = 27; - int32 gravityY = 28; - int32 collisionMinStep = 29; + int32 renderCacheSize = 10; + double spaceOffsetX = 11; + double spaceOffsetY = 12; + int32 collisionMinStep = 13; bool frameDataLoggingEnabled = 999; } @@ -156,5 +140,5 @@ message RoomDownsyncFrame { repeated MeleeBullet meleeBullets = 4; // I don't know how to mimic inheritance/composition in protobuf by far, thus using an array for each type of bullet as a compromise uint64 backendUnconfirmedMask = 5; // Indexed by "joinIndex", same compression concern as stated in InputFrameDownsync bool shouldForceResync = 6; - map playerOpPatternToSkillId = 7; + repeated int32 speciesIdList = 7; } diff --git a/frontend/assets/resources/prefabs/ControlledCharacter.prefab b/frontend/assets/resources/prefabs/ControlledCharacter.prefab index 07979d3..80d2db2 100644 --- a/frontend/assets/resources/prefabs/ControlledCharacter.prefab +++ b/frontend/assets/resources/prefabs/ControlledCharacter.prefab @@ -33,14 +33,14 @@ "_active": true, "_components": [ { - "__id__": 23 + "__id__": 21 }, { - "__id__": 24 + "__id__": 22 } ], "_prefab": { - "__id__": 25 + "__id__": 23 }, "_opacity": 255, "_color": { @@ -489,16 +489,13 @@ "__id__": 12 }, { - "__id__": 15 - }, - { - "__id__": 18 + "__id__": 16 } ], "_active": true, "_components": [], "_prefab": { - "__id__": 22 + "__id__": 20 }, "_opacity": 255, "_color": { @@ -549,253 +546,23 @@ }, { "__type__": "cc.Node", - "_name": "SoldierWaterGhost", + "_name": "MonkGirl", "_objFlags": 0, "_parent": { "__id__": 11 }, "_children": [], - "_active": false, + "_active": true, "_components": [ { "__id__": 13 - } - ], - "_prefab": { - "__id__": 14 - }, - "_opacity": 255, - "_color": { - "__type__": "cc.Color", - "r": 255, - "g": 255, - "b": 255, - "a": 255 - }, - "_contentSize": { - "__type__": "cc.Size", - "width": 0, - "height": 0 - }, - "_anchorPoint": { - "__type__": "cc.Vec2", - "x": 0.5, - "y": 0.5 - }, - "_trs": { - "__type__": "TypedArray", - "ctor": "Float64Array", - "array": [ - 0, - -24, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1 - ] - }, - "_eulerAngles": { - "__type__": "cc.Vec3", - "x": 0, - "y": 0, - "z": 0 - }, - "_skewX": 0, - "_skewY": 0, - "_is3DNode": false, - "_groupIndex": 0, - "groupIndex": 0, - "_id": "" - }, - { - "__type__": "dragonBones.ArmatureDisplay", - "_name": "", - "_objFlags": 0, - "node": { - "__id__": 12 - }, - "_enabled": true, - "_materials": [ - { - "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" - } - ], - "_armatureName": "SoldierWaterGhost", - "_animationName": "Idle1", - "_preCacheMode": 0, - "_cacheMode": 0, - "playTimes": -1, - "premultipliedAlpha": false, - "_armatureKey": "2ae76843-1f61-48cf-bbfb-384c0dcf77e1#e9e703e9-3589-4713-b889-28b23406d220", - "_accTime": 0, - "_playCount": 0, - "_frameCache": null, - "_curFrame": null, - "_playing": false, - "_armatureCache": null, - "_N$dragonAsset": { - "__uuid__": "2ae76843-1f61-48cf-bbfb-384c0dcf77e1" - }, - "_N$dragonAtlasAsset": { - "__uuid__": "e9e703e9-3589-4713-b889-28b23406d220" - }, - "_N$_defaultArmatureIndex": 0, - "_N$_animationIndex": 8, - "_N$_defaultCacheMode": 0, - "_N$timeScale": 1, - "_N$debugBones": false, - "_N$enableBatch": false, - "_id": "" - }, - { - "__type__": "cc.PrefabInfo", - "root": { - "__id__": 1 - }, - "asset": { - "__uuid__": "59bff7a2-23e1-4d69-bce7-afb37eae196a" - }, - "fileId": "42Rmp/YOdMOYWzJwr3ET1h", - "sync": false - }, - { - "__type__": "cc.Node", - "_name": "SoldierFireGhost", - "_objFlags": 0, - "_parent": { - "__id__": 11 - }, - "_children": [], - "_active": false, - "_components": [ - { - "__id__": 16 - } - ], - "_prefab": { - "__id__": 17 - }, - "_opacity": 255, - "_color": { - "__type__": "cc.Color", - "r": 255, - "g": 255, - "b": 255, - "a": 255 - }, - "_contentSize": { - "__type__": "cc.Size", - "width": 0, - "height": 0 - }, - "_anchorPoint": { - "__type__": "cc.Vec2", - "x": 0.5, - "y": 0.5 - }, - "_trs": { - "__type__": "TypedArray", - "ctor": "Float64Array", - "array": [ - 0, - -24, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1 - ] - }, - "_eulerAngles": { - "__type__": "cc.Vec3", - "x": 0, - "y": 0, - "z": 0 - }, - "_skewX": 0, - "_skewY": 0, - "_is3DNode": false, - "_groupIndex": 0, - "groupIndex": 0, - "_id": "" - }, - { - "__type__": "dragonBones.ArmatureDisplay", - "_name": "", - "_objFlags": 0, - "node": { - "__id__": 15 - }, - "_enabled": true, - "_materials": [ - { - "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" - } - ], - "_armatureName": "SoldierFireGhost", - "_animationName": "Idle1", - "_preCacheMode": 0, - "_cacheMode": 0, - "playTimes": -1, - "premultipliedAlpha": false, - "_armatureKey": "36230012-8df3-4e85-afad-76ec47d0e4d7#4a9187d5-a9ad-4464-a03c-d2f3cc277051", - "_accTime": 0, - "_playCount": 0, - "_frameCache": null, - "_curFrame": null, - "_playing": false, - "_armatureCache": null, - "_N$dragonAsset": { - "__uuid__": "36230012-8df3-4e85-afad-76ec47d0e4d7" - }, - "_N$dragonAtlasAsset": { - "__uuid__": "4a9187d5-a9ad-4464-a03c-d2f3cc277051" - }, - "_N$_defaultArmatureIndex": 0, - "_N$_animationIndex": 8, - "_N$_defaultCacheMode": 0, - "_N$timeScale": 1, - "_N$debugBones": false, - "_N$enableBatch": false, - "_id": "" - }, - { - "__type__": "cc.PrefabInfo", - "root": { - "__id__": 1 - }, - "asset": { - "__uuid__": "59bff7a2-23e1-4d69-bce7-afb37eae196a" - }, - "fileId": "3b2LJFABVL7ozO2U81FC4U", - "sync": false - }, - { - "__type__": "cc.Node", - "_name": "UltramanTiga", - "_objFlags": 0, - "_parent": { - "__id__": 11 - }, - "_children": [], - "_active": false, - "_components": [ - { - "__id__": 19 }, { - "__id__": 20 + "__id__": 14 } ], "_prefab": { - "__id__": 21 + "__id__": 15 }, "_opacity": 255, "_color": { @@ -813,21 +580,21 @@ "_anchorPoint": { "__type__": "cc.Vec2", "x": 0.5, - "y": 0.5 + "y": 0 }, "_trs": { "__type__": "TypedArray", "ctor": "Float64Array", "array": [ 0, - 0, + -24, 0, 0, 0, 0, 1, 0.7, - 0.7, + 0.6, 1 ] }, @@ -849,31 +616,49 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 18 + "__id__": 12 }, "_enabled": true, "_defaultClip": null, "_clips": [ { - "__uuid__": "252b321f-81f4-485c-85bd-ea44d298cb76" + "__uuid__": "a0d8b9a6-7bf7-4cf5-aecb-54b2908cbfb3" }, { - "__uuid__": "f51bb583-0010-48f3-a6a1-451a78ac2d65" + "__uuid__": "768d591b-4467-4a8f-95bf-4f7fcc3835b6" }, { - "__uuid__": "c738236a-0702-45f8-aa38-99457b051997" + "__uuid__": "c3d4f508-b3a9-4deb-b2d1-8ddc7bf22e0c" }, { - "__uuid__": "c69bcceb-d7d1-4e33-9623-e2a374a0a6b6" + "__uuid__": "1ec27664-cd2a-4c7a-838f-953a7713ceca" }, { - "__uuid__": "43dbf141-be76-48c3-bdef-29233ccbe30d" + "__uuid__": "996c218a-9e18-441e-b0f8-e61c5c991b9e" }, { - "__uuid__": "8710591c-3f5e-4911-83e7-42cc18be6af9" + "__uuid__": "170bbc56-3cff-4a81-b48f-a037b9418758" }, { - "__uuid__": "c69bcceb-d7d1-4e33-9623-e2a374a0a6b6" + "__uuid__": "555d837b-4a68-4a28-b9ff-e97e393d1a05" + }, + { + "__uuid__": "ee0b89e9-89f0-451e-a6ef-d41d64d3d67a" + }, + { + "__uuid__": "f87054fd-328f-4001-a8ff-b4c049cc1e6d" + }, + { + "__uuid__": "0978395c-8947-4830-9f68-58fadcbe5c63" + }, + { + "__uuid__": "7cb4d395-c68f-4643-9e2e-8cb8e200d3a5" + }, + { + "__uuid__": "e6e1d62a-de7d-4fe7-858c-2d2725b7c2e8" + }, + { + "__uuid__": "e8247e2a-1b5b-4618-86f8-224b25246b55" } ], "playOnLoad": false, @@ -884,7 +669,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 18 + "__id__": 12 }, "_enabled": true, "_materials": [ @@ -907,7 +692,7 @@ "_fillRange": 0, "_isTrimmedMode": true, "_atlas": { - "__uuid__": "5d522f7b-359b-4f38-ac35-55fdbee56cae" + "__uuid__": "725c90f9-56f8-48ea-9159-4d2949cd3ce0" }, "_id": "" }, @@ -919,7 +704,170 @@ "asset": { "__uuid__": "59bff7a2-23e1-4d69-bce7-afb37eae196a" }, - "fileId": "17JdhftghBYr81MfV9i6cy", + "fileId": "6cGpRwF5ZPjpJdtoqbrnta", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "KnifeGirl", + "_objFlags": 0, + "_parent": { + "__id__": 11 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 17 + }, + { + "__id__": 18 + } + ], + "_prefab": { + "__id__": 19 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 1425, + "height": 1024 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + -24, + 0, + 0, + 0, + 0, + 1, + 0.7, + 0.5, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Animation", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 16 + }, + "_enabled": true, + "_defaultClip": null, + "_clips": [ + { + "__uuid__": "5afe50e0-d03f-4d48-a7c0-a350c36e14d4" + }, + { + "__uuid__": "f7f60d3f-32c0-4b56-901e-6eec9f73fa83" + }, + { + "__uuid__": "829b17c6-9365-4e97-b14f-fa266bd5ecbe" + }, + { + "__uuid__": "2a50c853-000b-46f3-ae59-1dfb793de814" + }, + { + "__uuid__": "bc461a02-4d1a-46a4-9f3c-7370adc6c1c8" + }, + { + "__uuid__": "c4ddf3ea-2292-4511-a320-5486934ac361" + }, + { + "__uuid__": "0e7468cc-b90d-4f68-91ce-0be126b406dd" + }, + { + "__uuid__": "c86debde-118b-46b8-b483-f5ccec337315" + }, + { + "__uuid__": "0892a3ea-9da1-4157-825b-0c8ef1c73eeb" + }, + { + "__uuid__": "0a6478a6-f4cc-47cb-a1c6-761cf9141eb2" + }, + { + "__uuid__": "7d69868f-d474-4d86-a262-01f1cdd49021" + }, + { + "__uuid__": "52b8e47d-715c-4c12-a2c9-6f553e14dc42" + }, + { + "__uuid__": "9b500cb0-8048-4715-81db-cc975c914225" + } + ], + "playOnLoad": false, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 16 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": null, + "_type": 0, + "_sizeMode": 1, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": { + "__uuid__": "579bc0c1-f5e2-4a5d-889b-9d567e53b0e6" + }, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__uuid__": "59bff7a2-23e1-4d69-bce7-afb37eae196a" + }, + "fileId": "bdCx1wrTtJ1KaGHUmgL7iA", "sync": false }, { diff --git a/frontend/assets/scenes/login.fire b/frontend/assets/scenes/login.fire index 9d76136..27aa1b6 100644 --- a/frontend/assets/scenes/login.fire +++ b/frontend/assets/scenes/login.fire @@ -440,7 +440,7 @@ "array": [ 0, 0, - 216.6771387800957, + 217.36724690689908, 0, 0, 0, diff --git a/frontend/assets/scenes/offline_map.fire b/frontend/assets/scenes/offline_map.fire index 7059ef0..257018c 100644 --- a/frontend/assets/scenes/offline_map.fire +++ b/frontend/assets/scenes/offline_map.fire @@ -461,7 +461,7 @@ "array": [ 0, 0, - 216.50635094610968, + 217.36724690689908, 0, 0, 0, diff --git a/frontend/assets/scripts/AttackingCharacter.js b/frontend/assets/scripts/AttackingCharacter.js index 04290eb..da57a40 100644 --- a/frontend/assets/scripts/AttackingCharacter.js +++ b/frontend/assets/scripts/AttackingCharacter.js @@ -5,33 +5,17 @@ window.ATK_CHARACTER_STATE = { Walking: [1, "Walking"], Atk1: [2, "Atk1"], Atked1: [3, "Atked1"], - InAirIdle1: [4, "InAirIdle1"], - InAirAtk1: [5, "Atk1"], - InAirAtked1: [6, "Atked1"], + InAirIdle1NoJump: [4, "InAirIdle1NoJump"], + InAirIdle1ByJump: [5, "InAirIdle1ByJump"], // The cycling part of it would be exactly "InAirIdle1NoJump" + InAirAtk1: [6, "InAirAtk1"], + InAirAtked1: [7, "InAirAtked1"], + 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"], }; -window.toInAirConjugate = function(foo) { - switch (foo) { - case window.ATK_CHARACTER_STATE.Idle1[0]: - case window.ATK_CHARACTER_STATE.Walking[0]: - return window.ATK_CHARACTER_STATE.InAirIdle1[0]; - case window.ATK_CHARACTER_STATE.Atk1[0]: - return window.ATK_CHARACTER_STATE.InAirAtk1[0]; - case window.ATK_CHARACTER_STATE.Atked1[0]: - return window.ATK_CHARACTER_STATE.InAirAtked1[0]; - - case window.ATK_CHARACTER_STATE.InAirIdle1[0]: - return window.ATK_CHARACTER_STATE.Idle1[0]; - case window.ATK_CHARACTER_STATE.InAirAtk1[0]: - return window.ATK_CHARACTER_STATE.Atk1[0]; - case window.ATK_CHARACTER_STATE.InAirAtked1[0]: - return window.ATK_CHARACTER_STATE.Atked1[0]; - default: - console.warn(`Invalid characterState ${foo} received, no in air conjugate is available!`); - return null; - } -} - window.ATK_CHARACTER_STATE_ARR = []; for (let k in window.ATK_CHARACTER_STATE) { window.ATK_CHARACTER_STATE_ARR.push(window.ATK_CHARACTER_STATE[k]); @@ -40,12 +24,18 @@ for (let k in window.ATK_CHARACTER_STATE) { window.ATK_CHARACTER_STATE_INTERRUPT_WAIVE_SET = new Set(); window.ATK_CHARACTER_STATE_INTERRUPT_WAIVE_SET.add(window.ATK_CHARACTER_STATE.Idle1[0]); window.ATK_CHARACTER_STATE_INTERRUPT_WAIVE_SET.add(window.ATK_CHARACTER_STATE.Walking[0]); -window.ATK_CHARACTER_STATE_INTERRUPT_WAIVE_SET.add(window.ATK_CHARACTER_STATE.InAirIdle1[0]); +window.ATK_CHARACTER_STATE_INTERRUPT_WAIVE_SET.add(window.ATK_CHARACTER_STATE.InAirIdle1NoJump[0]); +window.ATK_CHARACTER_STATE_INTERRUPT_WAIVE_SET.add(window.ATK_CHARACTER_STATE.InAirIdle1ByJump[0]); +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_IN_AIR_SET = new Set(); -window.ATK_CHARACTER_STATE_IN_AIR_SET.add(window.ATK_CHARACTER_STATE.InAirIdle1[0]); +window.ATK_CHARACTER_STATE_IN_AIR_SET.add(window.ATK_CHARACTER_STATE.InAirIdle1NoJump[0]); +window.ATK_CHARACTER_STATE_IN_AIR_SET.add(window.ATK_CHARACTER_STATE.InAirIdle1ByJump[0]); 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]); /* 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. @@ -80,19 +70,19 @@ cc.Class({ this.animComp = this.effAnimNode.getComponent(dragonBones.ArmatureDisplay); if (!this.animComp) { this.animComp = this.effAnimNode.getComponent(cc.Animation); - } + } this.effAnimNode.active = true; }, - updateCharacterAnim(rdfPlayer, prevRdfPlayer, forceAnimSwitch) { + 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. // Update directions if (this.animComp && this.animComp.node) { if (0 > rdfPlayer.DirX) { - this.animComp.node.scaleX = (-1.0); + this.animNode.scaleX = (-1.0); } else if (0 < rdfPlayer.DirX) { - this.animComp.node.scaleX = (1.0); + this.animNode.scaleX = (1.0); } } @@ -117,29 +107,25 @@ cc.Class({ } if (this.animComp instanceof dragonBones.ArmatureDisplay) { - this._interruptPlayingAnimAndPlayNewAnimDragonBones(rdfPlayer, prevRdfPlayer, newCharacterState, newAnimName, underlyingAnimationCtrl, playingAnimName); + this._interruptPlayingAnimAndPlayNewAnimDragonBones(rdfPlayer, prevRdfPlayer, newCharacterState, newAnimName, underlyingAnimationCtrl, playingAnimName, chConfig); } else { - this._interruptPlayingAnimAndPlayNewAnimFrameAnim(rdfPlayer, prevRdfPlayer, newCharacterState, newAnimName, playingAnimName); + this._interruptPlayingAnimAndPlayNewAnimFrameAnim(rdfPlayer, prevRdfPlayer, newCharacterState, newAnimName, playingAnimName, chConfig); } }, - _interruptPlayingAnimAndPlayNewAnimDragonBones(rdfPlayer, prevRdfPlayer, newCharacterState, newAnimName, underlyingAnimationCtrl, playingAnimName) { + _interruptPlayingAnimAndPlayNewAnimDragonBones(rdfPlayer, prevRdfPlayer, newCharacterState, newAnimName, underlyingAnimationCtrl, playingAnimName, chConfig) { if (window.ATK_CHARACTER_STATE_INTERRUPT_WAIVE_SET.has(newCharacterState)) { // No "framesToRecover" // console.warn(`#DragonBones JoinIndex=${rdfPlayer.joinIndex}, ${playingAnimName} -> ${newAnimName}`); underlyingAnimationCtrl.gotoAndPlayByFrame(newAnimName, 0, -1); } else { const animationData = underlyingAnimationCtrl._animations[newAnimName]; - let fromAnimFrame = (animationData.frameCount - rdfPlayer.FramesToRecover); - if (fromAnimFrame < 0) { - // For Atk1 or Atk2, it's possible that the "meleeBullet.recoveryFrames" is configured to be slightly larger than corresponding animation duration frames - fromAnimFrame = 0; - } - underlyingAnimationCtrl.gotoAndPlayByFrame(newAnimName, fromAnimFrame, 1); + let frameIdxInAnim = rdfPlayer.FramesInChState; + underlyingAnimationCtrl.gotoAndPlayByFrame(newAnimName, frameIdxInAnim, 1); } }, - _interruptPlayingAnimAndPlayNewAnimFrameAnim(rdfPlayer, prevRdfPlayer, newCharacterState, newAnimName, playingAnimName) { + _interruptPlayingAnimAndPlayNewAnimFrameAnim(rdfPlayer, prevRdfPlayer, newCharacterState, newAnimName, playingAnimName, chConfig) { if (window.ATK_CHARACTER_STATE_INTERRUPT_WAIVE_SET.has(newCharacterState)) { // No "framesToRecover" //console.warn(`#FrameAnim JoinIndex=${rdfPlayer.joinIndex}, ${playingAnimName} -> ${newAnimName}`); @@ -148,11 +134,11 @@ cc.Class({ } // The "playTimes" counterpart is managed by each "cc.AnimationClip.wrapMode", already preset in the editor. const targetClip = this.animComp.getClips()[newCharacterState]; // The clips follow the exact order in ATK_CHARACTER_STATE - let fromTime = (targetClip.duration - rdfPlayer.FramesToRecover / targetClip.sample); // TODO: Anyway to avoid using division here? - if (fromTime < 0) { - // For Atk1 or Atk2, it's possible that the "meleeBullet.recoveryFrames" is configured to be slightly larger than corresponding animation duration frames - fromTime = 0; - } + 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 e06ac04..e26ed8c 100644 --- a/frontend/assets/scripts/Map.js +++ b/frontend/assets/scripts/Map.js @@ -107,23 +107,6 @@ cc.Class({ return (0 == inputFrameId % 10); }, - _convertToInputFrameId(renderFrameId, inputDelayFrames) { - if (renderFrameId < inputDelayFrames) return 0; - return ((renderFrameId - inputDelayFrames) >> this.inputScaleFrames); - }, - - _convertToFirstUsedRenderFrameId(inputFrameId, inputDelayFrames) { - return ((inputFrameId << this.inputScaleFrames) + inputDelayFrames); - }, - - _convertToLastUsedRenderFrameId(inputFrameId, inputDelayFrames) { - return ((inputFrameId << this.inputScaleFrames) + inputDelayFrames + (1 << this.inputScaleFrames) - 1); - }, - - shouldGenerateInputFrameUpsync(renderFrameId) { - return ((renderFrameId & ((1 << this.inputScaleFrames) - 1)) == 0); - }, - _allConfirmed(confirmedList) { return (confirmedList + 1) == (1 << this.playerRichInfoDict.size); }, @@ -296,7 +279,7 @@ cc.Class({ self.collisionPlayerIndexPrefix = (1 << 17); // For tracking the movements of players if (null != self.playerRichInfoDict) { self.playerRichInfoDict.forEach((playerRichInfo, playerId) => { - if (playerRichInfo.node.parent) { + if (playerRichInfo.node && playerRichInfo.node.parent) { playerRichInfo.node.parent.removeChild(playerRichInfo.node); } }); @@ -315,11 +298,7 @@ cc.Class({ self.selfPlayerInfo = null; // This field is kept for distinguishing "self" and "others". self.recentInputCache = gopkgs.NewRingBufferJs((self.renderCacheSize >> 1) + 1); - const spaceW = self.stageDiscreteW * self.stageTileW; - const spaceH = self.stageDiscreteH * self.stageTileH; - self.spaceOffsetX = (spaceW >> 1); - self.spaceOffsetY = (spaceH >> 1); - self.gopkgsCollisionSys = gopkgs.NewCollisionSpaceJs(spaceW, spaceH, self.collisionMinStep, self.collisionMinStep); + self.gopkgsCollisionSys = gopkgs.NewCollisionSpaceJs((self.spaceOffsetX << 1), (self.spaceOffsetY << 1), self.collisionMinStep, self.collisionMinStep); self.gopkgsCollisionSysMap = {}; // [WARNING] Don't use "JavaScript Map" which could cause loss of type information when passing through Golang transpiled functions! self.collisionBarrierIndexPrefix = (1 << 16); // For tracking the movements of barriers, though not yet actually used @@ -350,6 +329,56 @@ cc.Class({ } }, + initDebugDrawers() { + const self = this; + if (self.showCriticalCoordinateLabels) { + const drawer1 = new cc.Node(); + drawer1.setPosition(cc.v2(0, 0)) + safelyAddChild(self.node, drawer1); + setLocalZOrder(drawer1, 999); + const g1 = drawer1.addComponent(cc.Graphics); + g1.lineWidth = 2; + self.g1 = g1; + + const collisionSpaceObjs = gopkgs.GetCollisionSpaceObjsJs(self.gopkgsCollisionSys); // This step is slow according to Chrome profiling, and we only need draw it once for those static barriers + for (let k in collisionSpaceObjs) { + const body = collisionSpaceObjs[k]; + let padding = 0; + if (null != body.Data && null != body.Data.JoinIndex) { + // character + if (1 == body.Data.JoinIndex) { + g1.strokeColor = cc.Color.BLUE; + } else { + g1.strokeColor = cc.Color.RED; + } + padding = self.snapIntoPlatformOverlap; + } else { + // barrier + g1.strokeColor = cc.Color.WHITE; + } + const points = body.Shape.Points; + const wpos = [body.X - self.spaceOffsetX, body.Y - self.spaceOffsetY]; + g1.moveTo(wpos[0], wpos[1]); + const cnt = points.length; + for (let j = 0; j < cnt; j += 1) { + const x = wpos[0] + points[j][0], + y = wpos[1] + points[j][1]; + g1.lineTo(x, y); + } + g1.lineTo(wpos[0], wpos[1]); + g1.stroke(); + } + + const drawer2 = new cc.Node(); + drawer2.setPosition(cc.v2(0, 0)) + safelyAddChild(self.node, drawer2); + setLocalZOrder(drawer2, 999); + const g2 = drawer2.addComponent(cc.Graphics); + g2.lineWidth = 2; + self.g2 = g2; + } + }, + onLoad() { const self = this; window.mapIns = self; @@ -439,16 +468,6 @@ cc.Class({ mapNode.removeAllChildren(); self._resetCurrentMatch(); - if (self.showCriticalCoordinateLabels) { - const drawer = new cc.Node(); - drawer.setPosition(cc.v2(0, 0)) - safelyAddChild(self.node, drawer); - setLocalZOrder(drawer, 999); - const g = drawer.addComponent(cc.Graphics); - g.lineWidth = 2; - self.g = g; - } - tiledMapIns.tmxAsset = tmxAsset; const newMapSize = tiledMapIns.getMapSize(); const newTileSize = tiledMapIns.getTileSize(); @@ -477,37 +496,6 @@ cc.Class({ const newBarrierCollider = gopkgs.GenerateConvexPolygonColliderJs(gopkgsBoundary, self.spaceOffsetX, self.spaceOffsetY, gopkgsBarrier, "Barrier"); self.gopkgsCollisionSys.Add(newBarrierCollider); - if (false && self.showCriticalCoordinateLabels) { - for (let i = 0; i < boundaryObj.length; ++i) { - const barrierVertLabelNode = new cc.Node(); - switch (i % 4) { - case 0: - barrierVertLabelNode.color = cc.Color.RED; - break; - case 1: - barrierVertLabelNode.color = cc.Color.GRAY; - break; - case 2: - barrierVertLabelNode.color = cc.Color.BLACK; - break; - default: - barrierVertLabelNode.color = cc.Color.MAGENTA; - break; - } - const wx = boundaryObj.anchor.x + boundaryObj[i].x, - wy = boundaryObj.anchor.y + boundaryObj[i].y; - barrierVertLabelNode.setPosition(cc.v2(wx, wy)); - const barrierVertLabel = barrierVertLabelNode.addComponent(cc.Label); - barrierVertLabel.fontSize = 12; - barrierVertLabel.lineHeight = barrierVertLabel.fontSize + 1; - barrierVertLabel.string = `(${wx.toFixed(1)}, ${wy.toFixed(1)})`; - safelyAddChild(self.node, barrierVertLabelNode); - setLocalZOrder(barrierVertLabelNode, 5); - - barrierVertLabelNode.active = true; - } - - } // console.log("Created barrier: ", newBarrierCollider); ++barrierIdCounter; const collisionBarrierIndex = (self.collisionBarrierIndexPrefix + barrierIdCounter); @@ -517,7 +505,7 @@ cc.Class({ Object.assign(self.selfPlayerInfo, { Id: self.selfPlayerInfo.playerId }); - + self.initDebugDrawers(); const reqData = window.pb.protos.WsReq.encode({ msgId: Date.now(), act: window.UPSYNC_MSG_ACT_PLAYER_COLLIDER_ACK, @@ -590,13 +578,13 @@ cc.Class({ const jsPlayersArr = new Array().fill(null); for (let k in pbRdf.playersArr) { 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.speed, pbPlayer.battleState, pbPlayer.characterState, pbPlayer.joinIndex, pbPlayer.hp, pbPlayer.maxHp, pbPlayer.inAir, pbPlayer.colliderRadius); + 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); jsPlayersArr[k] = jsPlayer; } const jsMeleeBulletsArr = []; for (let k in pbRdf.meleeBullets) { const pbBullet = pbRdf.meleeBullets[k]; - const jsBullet = gopkgs.NewMeleeBulletJs(pbBullet.battleLocalId, pbBullet.startupFrames, pbBullet.activeFrames, pbBullet.recoveryFrames, pbBullet.recoveryFramesOnBlock, pbBullet.recoveryFramesOnHit, pbBullet.hitStunFrames, pbBullet.blockStunFrames, pbBullet.releaseTriggerType, pbBullet.damage, pbBullet.offenderJoinIndex, pbBullet.offenderPlayerId, pbBullet.pushback, pbBullet.hitboxOffset, pbBullet.selfMoveforwardX, pbBullet.selfMoveforwardY, pbBullet.hitboxSizeX, pbBullet.hitboxSizeY); + const jsBullet = gopkgs.NewMeleeBulletJs(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); jsMeleeBulletsArr.push(jsBullet); } @@ -638,7 +626,10 @@ cc.Class({ } // The logic below applies to (window.MAGIC_ROOM_DOWNSYNC_FRAME_ID.BATTLE_START == rdf.id || window.RING_BUFF_NON_CONSECUTIVE_SET == dumpRenderCacheRet) - self.playerOpPatternToSkillId = pbRdf.playerOpPatternToSkillId; + if (null == pbRdf.speciesIdList) { + console.error(`pbRdf.speciesIdList is required for starting or resyncing battle!`); + } + self.chConfigsOrderedByJoinIndex = gopkgs.GetCharacterConfigsOrderedByJoinIndex(pbRdf.speciesIdList); self._initPlayerRichInfoDict(rdf.PlayersArr); // Show the top status indicators for IN_BATTLE @@ -694,18 +685,19 @@ cc.Class({ equalPlayers(lhs, rhs) { 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; - if (lhs.dirY != rhs.dirY) return false; - if (lhs.velX != rhs.velX) return false; - if (lhs.velY != rhs.velY) return false; - if (lhs.speed != rhs.speed) return false; - if (lhs.framesToRecover != rhs.framesToRecover) return false; - if (lhs.hp != rhs.hp) return false; - if (lhs.maxHp != rhs.maxHp) return false; - if (lhs.characterState != rhs.characterState) return false; - if (lhs.inAir != rhs.inAir) return false; + if (lhs.VirtualGridX != rhs.VirtualGridX) return false; + if (lhs.VirtualGridY != rhs.VirtualGridY) return false; + if (lhs.DirX != rhs.DirX) return false; + if (lhs.DirY != rhs.DirY) return false; + if (lhs.VelX != rhs.VelX) return false; + if (lhs.VelY != rhs.VelY) return false; + if (lhs.Speed != rhs.Speed) return false; + if (lhs.Hp != rhs.Hp) return false; + if (lhs.MaxHp != rhs.MaxHp) return false; + if (lhs.CharacterState != rhs.CharacterState) return false; + if (lhs.InAir != rhs.InAir) return false; + if (lhs.FramesToRecover != rhs.FramesToRecover) return false; + if (lhs.FramesInChState != rhs.FramesInChState) return false; return true; }, @@ -770,7 +762,7 @@ cc.Class({ } if (null == firstPredictedYetIncorrectInputFrameId) return; - const renderFrameId1 = self._convertToFirstUsedRenderFrameId(firstPredictedYetIncorrectInputFrameId, self.inputDelayFrames) - 1; + const renderFrameId1 = gopkgs.ConvertToFirstUsedRenderFrameId(firstPredictedYetIncorrectInputFrameId) - 1; if (renderFrameId1 >= self.chaserRenderFrameId) return; /* @@ -829,37 +821,20 @@ batchInputFrameIdRange=[${batch[0].inputFrameId}, ${batch[batch.length - 1].inpu const self = this; const newPlayerNode = cc.instantiate(self.controlledCharacterPrefab) const playerScriptIns = newPlayerNode.getComponent("ControlledCharacter"); + const chConfig = self.chConfigsOrderedByJoinIndex[joinIndex - 1]; + playerScriptIns.setSpecies(chConfig.SpeciesName); + if (1 == joinIndex) { - playerScriptIns.setSpecies("SoldierWaterGhost"); - } else if (2 == joinIndex) { - playerScriptIns.setSpecies("UltramanTiga"); + newPlayerNode.color = cc.Color.RED; + } else { + newPlayerNode.color = cc.Color.BLUE; } - const [wx, wy] = self.virtualGridToWorldPos(vx, vy); + const [wx, wy] = gopkgs.VirtualGridToWorldPos(vx, vy); newPlayerNode.setPosition(wx, wy); playerScriptIns.mapNode = self.node; - const colliderRadius = playerDownsyncInfo.ColliderRadius; - const halfColliderWidth = colliderRadius, - halfColliderHeight = colliderRadius + colliderRadius; // avoid multiplying - const colliderWidth = halfColliderWidth + halfColliderWidth, - colliderHeight = halfColliderHeight + halfColliderHeight; // avoid multiplying - const [cx, cy] = gopkgs.WorldToPolygonColliderBLPos(wx, wy, halfColliderWidth, halfColliderHeight, self.snapIntoPlatformOverlap, self.snapIntoPlatformOverlap, self.snapIntoPlatformOverlap, self.snapIntoPlatformOverlap, self.spaceOffsetX, self.spaceOffsetY); - const gopkgsBoundaryAnchor = gopkgs.NewVec2DJs(cx, cy); - const gopkgsBoundaryPts = [ - gopkgs.NewVec2DJs(0, 0), - gopkgs.NewVec2DJs(self.snapIntoPlatformOverlap + colliderWidth + self.snapIntoPlatformOverlap, 0), - gopkgs.NewVec2DJs(self.snapIntoPlatformOverlap + colliderWidth + self.snapIntoPlatformOverlap, self.snapIntoPlatformOverlap + colliderHeight + self.snapIntoPlatformOverlap), - gopkgs.NewVec2DJs(0, self.snapIntoPlatformOverlap + colliderHeight + self.snapIntoPlatformOverlap) - ]; - const gopkgsBoundary = gopkgs.NewPolygon2DJs(gopkgsBoundaryAnchor, gopkgsBoundaryPts); - const newPlayerCollider = gopkgs.GenerateConvexPolygonColliderJs(gopkgsBoundary, self.spaceOffsetX, self.spaceOffsetY, playerDownsyncInfo, "Player"); - //const newPlayerCollider = gopkgs.GenerateRectColliderJs(wx, wy, colliderWidth, colliderHeight, self.snapIntoPlatformOverlap, self.snapIntoPlatformOverlap, self.snapIntoPlatformOverlap, self.snapIntoPlatformOverlap, self.spaceOffsetX, self.spaceOffsetY, playerDownsyncInfo, "Player"); - self.gopkgsCollisionSys.Add(newPlayerCollider); - const collisionPlayerIndex = self.collisionPlayerIndexPrefix + joinIndex; - self.gopkgsCollisionSysMap[collisionPlayerIndex] = newPlayerCollider; - - console.log(`Created new player collider: joinIndex=${joinIndex}, colliderRadius=${playerDownsyncInfo.ColliderRadius}`); + console.log(`Created new player node: joinIndex=${joinIndex}`); safelyAddChild(self.node, newPlayerNode); setLocalZOrder(newPlayerNode, 5); @@ -883,8 +858,8 @@ batchInputFrameIdRange=[${batch[0].inputFrameId}, ${batch[batch.length - 1].inpu let st = performance.now(); let prevSelfInput = null, currSelfInput = null; - const noDelayInputFrameId = self._convertToInputFrameId(self.renderFrameId, 0); // It's important that "inputDelayFrames == 0" here - if (self.shouldGenerateInputFrameUpsync(self.renderFrameId)) { + const noDelayInputFrameId = gopkgs.ConvertToNoDelayInputFrameId(self.renderFrameId); + if (gopkgs.ShouldGenerateInputFrameUpsync(self.renderFrameId)) { [prevSelfInput, currSelfInput] = self.getOrPrefabInputFrameUpsync(noDelayInputFrameId); } @@ -919,7 +894,7 @@ 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 = self._convertToInputFrameId(rdf.id, 0); + 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}: @@ -1063,12 +1038,13 @@ othersForcedDownsyncRenderFrame=${JSON.stringify(othersForcedDownsyncRenderFrame const playersArr = rdf.PlayersArr; for (let k in playersArr) { const currPlayerDownsync = playersArr[k]; + const chConfig = self.chConfigsOrderedByJoinIndex[k]; const prevRdfPlayer = (null == prevRdf ? null : prevRdf.PlayersArr[k]); - const [wx, wy] = self.virtualGridToWorldPos(currPlayerDownsync.VirtualGridX, currPlayerDownsync.VirtualGridY); + const [wx, wy] = gopkgs.VirtualGridToWorldPos(currPlayerDownsync.VirtualGridX, currPlayerDownsync.VirtualGridY); const playerRichInfo = self.playerRichInfoArr[k]; playerRichInfo.node.setPosition(wx, wy); playerRichInfo.scriptIns.updateSpeed(currPlayerDownsync.Speed); - playerRichInfo.scriptIns.updateCharacterAnim(currPlayerDownsync, prevRdfPlayer, false); + playerRichInfo.scriptIns.updateCharacterAnim(currPlayerDownsync, prevRdfPlayer, false, chConfig); } // Update countdown @@ -1087,14 +1063,14 @@ othersForcedDownsyncRenderFrame=${JSON.stringify(othersForcedDownsyncRenderFrame if (null == currRdf) { throw `Couldn't find renderFrame for i=${i} to rollback (are you using Firefox?), self.renderFrameId=${self.renderFrameId}, lastAllConfirmedInputFrameId=${self.lastAllConfirmedInputFrameId}, might've been interruptted by onRoomDownsyncFrame`; } - const j = self._convertToInputFrameId(i, self.inputDelayFrames); + const j = gopkgs.ConvertToDelayedInputFrameId(i); const delayedInputFrame = self.recentInputCache.GetByFrameId(j); // Don't make prediction here, the inputFrameDownsyncs in recentInputCache was already predicted while prefabbing if (null == delayedInputFrame) { // Shouldn't happen! throw `Failed to get cached delayedInputFrame for i=${i}, j=${j}, renderFrameId=${self.renderFrameId}, lastUpsyncInputFrameId=${self.lastUpsyncInputFrameId}, lastAllConfirmedInputFrameId=${self.lastAllConfirmedInputFrameId}, chaserRenderFrameId=${self.chaserRenderFrameId}; recentRenderCache=${self._stringifyRecentRenderCache(false)}, recentInputCache=${self._stringifyRecentInputCache(false)}`; } - const jPrev = self._convertToInputFrameId(i - 1, self.inputDelayFrames); + const jPrev = gopkgs.ConvertToDelayedInputFrameId(i - 1); if (self.frameDataLoggingEnabled) { const actuallyUsedInputClone = delayedInputFrame.InputList.slice(); const inputFrameDownsyncClone = { @@ -1104,7 +1080,15 @@ othersForcedDownsyncRenderFrame=${JSON.stringify(othersForcedDownsyncRenderFrame }; self.rdfIdToActuallyUsedInput.set(currRdf.Id, inputFrameDownsyncClone); } - const nextRdf = gopkgs.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs(self.recentInputCache, currRdf, collisionSys, collisionSysMap, self.gravityX, self.gravityY, self.jumpingInitVelY, self.inputDelayFrames, self.inputScaleFrames, self.spaceOffsetX, self.spaceOffsetY, self.snapIntoPlatformOverlap, self.snapIntoPlatformThreshold, self.worldToVirtualGridRatio, self.virtualGridToWorldRatio, self.playerOpPatternToSkillId); + const nextRdf = gopkgs.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs(self.recentInputCache, currRdf, collisionSys, collisionSysMap, self.spaceOffsetX, self.spaceOffsetY, self.chConfigsOrderedByJoinIndex); + + if (3 == nextRdf.PlayersArr[0].ActiveSkillId && 3 != currRdf.PlayersArr[0].ActiveSkillId) { + console.log(`Started skill 3 at rdf.Id=${nextRdf.Id}`); + self.lastSkill3Started = nextRdf.Id; + } + if (3 != nextRdf.PlayersArr[0].ActiveSkillId && 3 == currRdf.PlayersArr[0].ActiveSkillId) { + console.log(`Stopped skill 3 at rdf.Id=${nextRdf.Id}, duration = ${nextRdf.Id-self.lastSkill3Started}`); + } if (true == isChasing) { // [WARNING] Move the cursor "self.chaserRenderFrameId" when "true == isChasing", keep in mind that "self.chaserRenderFrameId" is not monotonic! @@ -1233,49 +1217,81 @@ actuallyUsedinputList:{${self.inputFrameDownsyncStr(actuallyUsedInputClone)}}`); return `{${(playerCollider.x + leftPadding + halfBoundingW).toFixed(2)}, ${(playerCollider.y + bottomPadding + halfBoundingH).toFixed(2)}}`; }, - virtualGridToWorldPos(vx, vy) { - // No loss of precision - const self = this; - return [vx * self.virtualGridToWorldRatio, vy * self.virtualGridToWorldRatio]; - }, - showDebugBoundaries(rdf) { const self = this; - const leftPadding = self.snapIntoPlatformOverlap, - rightPadding = self.snapIntoPlatformOverlap, - topPadding = self.snapIntoPlatformOverlap, - bottomPadding = self.snapIntoPlatformOverlap; - if (self.showCriticalCoordinateLabels) { - let g = self.g; - g.clear(); + // Hardcoded paddings for now + const leftPadding = 0.1, + rightPadding = 0.1, + topPadding = 0.1, + bottomPadding = 0.1; + if (self.showCriticalCoordinateLabels && self.g2) { + let g2 = self.g2; + g2.clear(); - const collisionSpaceObjs = gopkgs.GetCollisionSpaceObjsJs(self.gopkgsCollisionSys); - for (let k in collisionSpaceObjs) { - const body = collisionSpaceObjs[k]; - let padding = 0; - if (null != body.Data && null != body.Data.JoinIndex) { - // character - if (1 == body.Data.JoinIndex) { - g.strokeColor = cc.Color.BLUE; - } else { - g.strokeColor = cc.Color.RED; - } - padding = self.snapIntoPlatformOverlap; + for (let k in rdf.PlayersArr) { + const player = rdf.PlayersArr[k]; + if (1 == player.JoinIndex) { + g2.strokeColor = cc.Color.BLUE; } else { - // barrier - g.strokeColor = cc.Color.WHITE; + g2.strokeColor = cc.Color.RED; } - const points = body.Shape.Points; - const wpos = [body.X - self.spaceOffsetX, body.Y - self.spaceOffsetY]; - g.moveTo(wpos[0], wpos[1]); - const cnt = points.length; - for (let j = 0; j < cnt; j += 1) { - const x = wpos[0] + points[j][0], - y = wpos[1] + points[j][1]; - g.lineTo(x, y); + + let [colliderWidth, colliderHeight] = [player.ColliderRadius * 2, player.ColliderRadius * 4]; + switch (player.CharacterState) { + case ATK_CHARACTER_STATE.LayDown1[0]: + [colliderWidth, colliderHeight] = [player.ColliderRadius * 4, player.ColliderRadius * 2]; + break; + case ATK_CHARACTER_STATE.BlownUp1[0]: + case ATK_CHARACTER_STATE.InAirIdle1NoJump[0]: + case ATK_CHARACTER_STATE.InAirIdle1ByJump[0]: + [colliderWidth, colliderHeight] = [player.ColliderRadius * 2, player.ColliderRadius * 2]; + break; + } + + const [halfColliderWidth, halfColliderHeight] = gopkgs.VirtualGridToWorldPos((colliderWidth >> 1), (colliderHeight >> 1)); + + const [wx, wy] = gopkgs.VirtualGridToWorldPos(player.VirtualGridX, player.VirtualGridY); + const [cx, cy] = gopkgs.WorldToPolygonColliderBLPos(wx, wy, halfColliderWidth, halfColliderHeight, topPadding, bottomPadding, leftPadding, rightPadding, 0, 0); + const pts = [[0, 0], [leftPadding + halfColliderWidth * 2 + rightPadding, 0], [leftPadding + halfColliderWidth * 2 + rightPadding, bottomPadding + halfColliderHeight * 2 + topPadding], [0, bottomPadding + halfColliderHeight * 2 + topPadding]]; + + g2.moveTo(cx, cy); + for (let j = 0; j < pts.length; j += 1) { + g2.lineTo(pts[j][0] + cx, pts[j][1] + cy); + } + g2.lineTo(cx, cy); + g2.stroke(); + } + + for (let k in rdf.MeleeBullets) { + const meleeBullet = rdf.MeleeBullets[k]; + if ( + meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames <= rdf.Id + && + meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames + meleeBullet.Bullet.ActiveFrames > rdf.Id + ) { + const offender = rdf.PlayersArr[meleeBullet.Bullet.OffenderJoinIndex - 1]; + if (1 == offender.JoinIndex) { + g2.strokeColor = cc.Color.BLUE; + } else { + g2.strokeColor = cc.Color.RED; + } + + let xfac = 1; // By now, straight Punch offset doesn't respect "y-axis" + if (0 > offender.DirX) { + xfac = -1; + } + const [bulletWx, bulletWy] = gopkgs.VirtualGridToWorldPos(offender.VirtualGridX + xfac * meleeBullet.Bullet.HitboxOffsetX, offender.VirtualGridY); + const [halfColliderWidth, halfColliderHeight] = gopkgs.VirtualGridToWorldPos((meleeBullet.Bullet.HitboxSizeX >> 1), (meleeBullet.Bullet.HitboxSizeY >> 1)); + const [bulletCx, bulletCy] = gopkgs.WorldToPolygonColliderBLPos(bulletWx, bulletWy, halfColliderWidth, halfColliderHeight, topPadding, bottomPadding, leftPadding, rightPadding, 0, 0); + const pts = [[0, 0], [leftPadding + halfColliderWidth * 2 + rightPadding, 0], [leftPadding + halfColliderWidth * 2 + rightPadding, bottomPadding + halfColliderHeight * 2 + topPadding], [0, bottomPadding + halfColliderHeight * 2 + topPadding]]; + + g2.moveTo(bulletCx, bulletCy); + for (let j = 0; j < pts.length; j += 1) { + g2.lineTo(pts[j][0] + bulletCx, pts[j][1] + bulletCy); + } + g2.lineTo(bulletCx, bulletCy); + g2.stroke(); } - g.lineTo(wpos[0], wpos[1]); - g.stroke(); } } }, diff --git a/frontend/assets/scripts/OfflineMap.js b/frontend/assets/scripts/OfflineMap.js index 1959b32..fe495e0 100644 --- a/frontend/assets/scripts/OfflineMap.js +++ b/frontend/assets/scripts/OfflineMap.js @@ -28,8 +28,6 @@ cc.Class({ /** Init required prefab ended. */ - self.inputDelayFrames = 8; - self.inputScaleFrames = 2; self.inputFrameUpsyncDelayTolerance = 2; self.collisionMinStep = 8; @@ -40,24 +38,6 @@ cc.Class({ self.rollbackEstimatedDtNanos = 16666666; self.tooFastDtIntervalMillis = 0.5 * self.rollbackEstimatedDtMillis; - self.worldToVirtualGridRatio = 1000; - self.virtualGridToWorldRatio = 1.0 / self.worldToVirtualGridRatio; - const opJoinIndexPrefix1 = (1 << 8); - const opJoinIndexPrefix2 = (2 << 8); - self.playerOpPatternToSkillId = {}; - self.playerOpPatternToSkillId[opJoinIndexPrefix1 + 0] = 1; - self.playerOpPatternToSkillId[opJoinIndexPrefix2 + 0] = 1; - - /* - [WARNING] As when a character is standing on a barrier, if not carefully curated there MIGHT BE a bouncing sequence of "[(inAir -> dropIntoBarrier ->), (notInAir -> pushedOutOfBarrier ->)], [(inAir -> ..." - - Moreover, "snapIntoPlatformOverlap" should be small enough such that the walking "velX" or jumping initial "velY" can escape from it by 1 renderFrame (when jumping is triggered, the character is waived from snappig for 1 renderFrame). - */ - self.snapIntoPlatformOverlap = 0.1; - self.snapIntoPlatformThreshold = 0.5; // a platform must be "horizontal enough" for a character to "stand on" - self.jumpingInitVelY = 7 * self.worldToVirtualGridRatio; // unit: (virtual grid length/renderFrame) - [self.gravityX, self.gravityY] = [0, -0.5 * self.worldToVirtualGridRatio]; // unit: (virtual grid length/renderFrame^2) - const tiledMapIns = self.node.getComponent(cc.TiledMap); const fullPathOfTmxFile = cc.js.formatStr("map/%s/map", "dungeon"); @@ -86,10 +66,8 @@ cc.Class({ self.node.setContentSize(newMapSize.width * newTileSize.width, newMapSize.height * newTileSize.height); self.node.setPosition(cc.v2(0, 0)); - self.stageDiscreteW = newMapSize.width; - self.stageDiscreteH = newMapSize.height; - self.stageTileW = newTileSize.width; - self.stageTileH = newTileSize.height; + self.spaceOffsetX = ((newMapSize.width * newTileSize.width) >> 1); + self.spaceOffsetY = ((newMapSize.height * newTileSize.height) >> 1); self._resetCurrentMatch(); let barrierIdCounter = 0; @@ -105,42 +83,17 @@ cc.Class({ const newBarrierCollider = gopkgs.GenerateConvexPolygonColliderJs(gopkgsBoundary, self.spaceOffsetX, self.spaceOffsetY, gopkgsBarrier, "Barrier"); self.gopkgsCollisionSys.Add(newBarrierCollider); - if (false && self.showCriticalCoordinateLabels) { - for (let i = 0; i < boundaryObj.length; ++i) { - const barrierVertLabelNode = new cc.Node(); - switch (i % 4) { - case 0: - barrierVertLabelNode.color = cc.Color.RED; - break; - case 1: - barrierVertLabelNode.color = cc.Color.GRAY; - break; - case 2: - barrierVertLabelNode.color = cc.Color.BLACK; - break; - default: - barrierVertLabelNode.color = cc.Color.MAGENTA; - break; - } - const wx = boundaryObj.anchor.x + boundaryObj[i].x, - wy = boundaryObj.anchor.y + boundaryObj[i].y; - barrierVertLabelNode.setPosition(cc.v2(wx, wy)); - const barrierVertLabel = barrierVertLabelNode.addComponent(cc.Label); - barrierVertLabel.fontSize = 12; - barrierVertLabel.lineHeight = barrierVertLabel.fontSize + 1; - barrierVertLabel.string = `(${wx.toFixed(1)}, ${wy.toFixed(1)})`; - safelyAddChild(self.node, barrierVertLabelNode); - setLocalZOrder(barrierVertLabelNode, 5); - - barrierVertLabelNode.active = true; - } - - } // console.log("Created barrier: ", newBarrierCollider); ++barrierIdCounter; const collisionBarrierIndex = (self.collisionBarrierIndexPrefix + barrierIdCounter); self.gopkgsCollisionSysMap[collisionBarrierIndex] = newBarrierCollider; } + self.initDebugDrawers(); + + const p1Vpos = gopkgs.WorldToVirtualGridPos(boundaryObjs.playerStartingPositions[0].x, boundaryObjs.playerStartingPositions[0].y); + const p2Vpos = gopkgs.WorldToVirtualGridPos(boundaryObjs.playerStartingPositions[1].x, boundaryObjs.playerStartingPositions[1].y); + const speedV = gopkgs.WorldToVirtualGridPos(1.0, 0); + const colliderRadiusV = gopkgs.WorldToVirtualGridPos(12.0, 0); const startRdf = window.pb.protos.RoomDownsyncFrame.create({ id: window.MAGIC_ROOM_DOWNSYNC_FRAME_ID.BATTLE_START, @@ -148,13 +101,13 @@ cc.Class({ window.pb.protos.PlayerDownsync.create({ id: 10, joinIndex: 1, - virtualGridX: boundaryObjs.playerStartingPositions[0].x * self.worldToVirtualGridRatio, - virtualGridY: boundaryObjs.playerStartingPositions[0].y * self.worldToVirtualGridRatio, - speed: 1 * self.worldToVirtualGridRatio, - colliderRadius: 12, - characterState: window.ATK_CHARACTER_STATE.InAirIdle1[0], + virtualGridX: p1Vpos[0], + virtualGridY: p1Vpos[1], + speed: speedV[0], + colliderRadius: colliderRadiusV[0], + characterState: window.ATK_CHARACTER_STATE.InAirIdle1NoJump[0], framesToRecover: 0, - dirX: 0, + dirX: +2, dirY: 0, velX: 0, velY: 0, @@ -163,19 +116,20 @@ cc.Class({ window.pb.protos.PlayerDownsync.create({ id: 11, joinIndex: 2, - virtualGridX: boundaryObjs.playerStartingPositions[1].x * self.worldToVirtualGridRatio, - virtualGridY: boundaryObjs.playerStartingPositions[1].y * self.worldToVirtualGridRatio, - speed: 1 * self.worldToVirtualGridRatio, - colliderRadius: 12, - characterState: window.ATK_CHARACTER_STATE.InAirIdle1[0], + virtualGridX: p2Vpos[0], + virtualGridY: p2Vpos[1], + speed: speedV[0], + colliderRadius: colliderRadiusV[0], + characterState: window.ATK_CHARACTER_STATE.InAirIdle1NoJump[0], framesToRecover: 0, - dirX: 0, + dirX: -2, dirY: 0, velX: 0, velY: 0, inAir: true, }), - ] + ], + speciesIdList: [1, 0], }); self.selfPlayerInfo = { @@ -202,8 +156,8 @@ cc.Class({ let st = performance.now(); let prevSelfInput = null, currSelfInput = null; - const noDelayInputFrameId = self._convertToInputFrameId(self.renderFrameId, 0); // It's important that "inputDelayFrames == 0" here - if (self.shouldGenerateInputFrameUpsync(self.renderFrameId)) { + const noDelayInputFrameId = gopkgs.ConvertToNoDelayInputFrameId(self.renderFrameId); // It's important that "inputDelayFrames == 0" here + if (gopkgs.ShouldGenerateInputFrameUpsync(self.renderFrameId)) { const prevAndCurrInputs = self.getOrPrefabInputFrameUpsync(noDelayInputFrameId); prevSelfInput = prevAndCurrInputs[0]; currSelfInput = prevAndCurrInputs[1]; diff --git a/frontend/assets/scripts/modules/Collisions.js b/frontend/assets/scripts/modules/Collisions.js deleted file mode 100644 index a1e8477..0000000 --- a/frontend/assets/scripts/modules/Collisions.js +++ /dev/null @@ -1,197 +0,0 @@ -/******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = "./src/Collisions.mjs"); -/******/ }) -/************************************************************************/ -/******/ ({ - -/***/ "./src/Collisions.mjs": -/*!****************************!*\ - !*** ./src/Collisions.mjs ***! - \****************************/ -/*! no exports provided */ -/***/ (function(__webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _modules_BVH_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./modules/BVH.mjs */ \"./src/modules/BVH.mjs\");\n/* harmony import */ var _modules_Circle_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modules/Circle.mjs */ \"./src/modules/Circle.mjs\");\n/* harmony import */ var _modules_Polygon_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modules/Polygon.mjs */ \"./src/modules/Polygon.mjs\");\n/* harmony import */ var _modules_Point_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modules/Point.mjs */ \"./src/modules/Point.mjs\");\n/* harmony import */ var _modules_Result_mjs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./modules/Result.mjs */ \"./src/modules/Result.mjs\");\n/* harmony import */ var _modules_SAT_mjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./modules/SAT.mjs */ \"./src/modules/SAT.mjs\");\n\n\n\n\n\n\n\n/**\n * A collision system used to track bodies in order to improve collision detection performance\n * @class\n */\nclass Collisions {\n\t/**\n\t * @constructor\n\t */\n\tconstructor() {\n\t\t/** @private */\n\t\tthis._bvh = new _modules_BVH_mjs__WEBPACK_IMPORTED_MODULE_0__[\"default\"]();\n\t}\n\n\t/**\n\t * Creates a {@link Circle} and inserts it into the collision system\n\t * @param {Number} [x = 0] The starting X coordinate\n\t * @param {Number} [y = 0] The starting Y coordinate\n\t * @param {Number} [radius = 0] The radius\n\t * @param {Number} [scale = 1] The scale\n\t * @param {Number} [padding = 0] The amount to pad the bounding volume when testing for potential collisions\n\t * @returns {Circle}\n\t */\n\tcreateCircle(x = 0, y = 0, radius = 0, scale = 1, padding = 0) {\n\t\tconst body = new _modules_Circle_mjs__WEBPACK_IMPORTED_MODULE_1__[\"default\"](x, y, radius, scale, padding);\n\n\t\tthis._bvh.insert(body);\n\n\t\treturn body;\n\t}\n\n\t/**\n\t * Creates a {@link Polygon} and inserts it into the collision system\n\t * @param {Number} [x = 0] The starting X coordinate\n\t * @param {Number} [y = 0] The starting Y coordinate\n\t * @param {Array} [points = []] An array of coordinate pairs making up the polygon - [[x1, y1], [x2, y2], ...]\n\t * @param {Number} [angle = 0] The starting rotation in radians\n\t * @param {Number} [scale_x = 1] The starting scale along the X axis\n\t * @param {Number} [scale_y = 1] The starting scale long the Y axis\n\t * @param {Number} [padding = 0] The amount to pad the bounding volume when testing for potential collisions\n\t * @returns {Polygon}\n\t */\n\tcreatePolygon(x = 0, y = 0, points = [[0, 0]], angle = 0, scale_x = 1, scale_y = 1, padding = 0) {\n\t\tconst body = new _modules_Polygon_mjs__WEBPACK_IMPORTED_MODULE_2__[\"default\"](x, y, points, angle, scale_x, scale_y, padding);\n\n\t\tthis._bvh.insert(body);\n\n\t\treturn body;\n\t}\n\n\t/**\n\t * Creates a {@link Point} and inserts it into the collision system\n\t * @param {Number} [x = 0] The starting X coordinate\n\t * @param {Number} [y = 0] The starting Y coordinate\n\t * @param {Number} [padding = 0] The amount to pad the bounding volume when testing for potential collisions\n\t * @returns {Point}\n\t */\n\tcreatePoint(x = 0, y = 0, padding = 0) {\n\t\tconst body = new _modules_Point_mjs__WEBPACK_IMPORTED_MODULE_3__[\"default\"](x, y, padding);\n\n\t\tthis._bvh.insert(body);\n\n\t\treturn body;\n\t}\n\n\t/**\n\t * Creates a {@link Result} used to collect the detailed results of a collision test\n\t */\n\tcreateResult() {\n\t\treturn new _modules_Result_mjs__WEBPACK_IMPORTED_MODULE_4__[\"default\"]();\n\t}\n\n\t/**\n\t * Creates a Result used to collect the detailed results of a collision test\n\t */\n\tstatic createResult() {\n\t\treturn new _modules_Result_mjs__WEBPACK_IMPORTED_MODULE_4__[\"default\"]();\n\t}\n\n\t/**\n\t * Inserts bodies into the collision system\n\t * @param {...Circle|...Polygon|...Point} bodies\n\t */\n\tinsert(...bodies) {\n\t\tfor(const body of bodies) {\n\t\t\tthis._bvh.insert(body, false);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes bodies from the collision system\n\t * @param {...Circle|...Polygon|...Point} bodies\n\t */\n\tremove(...bodies) {\n\t\tfor(const body of bodies) {\n\t\t\tthis._bvh.remove(body, false);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Updates the collision system. This should be called before any collisions are tested.\n\t */\n\tupdate() {\n\t\tthis._bvh.update();\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Draws the bodies within the system to a CanvasRenderingContext2D's current path\n\t * @param {CanvasRenderingContext2D} context The context to draw to\n\t */\n\tdraw(context) {\n\t\treturn this._bvh.draw(context);\n\t}\n\n\t/**\n\t * Draws the system's BVH to a CanvasRenderingContext2D's current path. This is useful for testing out different padding values for bodies.\n\t * @param {CanvasRenderingContext2D} context The context to draw to\n\t */\n\tdrawBVH(context) {\n\t\treturn this._bvh.drawBVH(context);\n\t}\n\n\t/**\n\t * Returns a list of potential collisions for a body\n\t * @param {Circle|Polygon|Point} body The body to test for potential collisions against\n\t * @returns {Array}\n\t */\n\tpotentials(body) {\n\t\treturn this._bvh.potentials(body);\n\t}\n\n\t/**\n\t * Determines if two bodies are colliding\n\t * @param {Circle|Polygon|Point} target The target body to test against\n\t * @param {Result} [result = null] A Result object on which to store information about the collision\n\t * @param {Boolean} [aabb = true] Set to false to skip the AABB test (useful if you use your own potential collision heuristic)\n\t * @returns {Boolean}\n\t */\n\tcollides(source, target, result = null, aabb = true) {\n\t\treturn Object(_modules_SAT_mjs__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(source, target, result, aabb);\n\t}\n};\n\nconst toExport = {\n\tCollisions,\n\tResult: _modules_Result_mjs__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n\tCircle: _modules_Circle_mjs__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n\tPolygon: _modules_Polygon_mjs__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n\tPoint: _modules_Point_mjs__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n};\n\nmodule.exports = toExport; \n\n\n//# sourceURL=webpack:///./src/Collisions.mjs?"); - -/***/ }), - -/***/ "./src/modules/BVH.mjs": -/*!*****************************!*\ - !*** ./src/modules/BVH.mjs ***! - \*****************************/ -/*! exports provided: default */ -/***/ (function(__webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return BVH; });\n/* harmony import */ var _BVHBranch_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BVHBranch.mjs */ \"./src/modules/BVHBranch.mjs\");\n\n\n/**\n * A Bounding Volume Hierarchy (BVH) used to find potential collisions quickly\n * @class\n * @private\n */\nclass BVH {\n\t/**\n\t * @constructor\n\t */\n\tconstructor() {\n\t\t/** @private */\n\t\tthis._hierarchy = null;\n\n\t\t/** @private */\n\t\tthis._bodies = [];\n\n\t\t/** @private */\n\t\tthis._dirty_branches = [];\n\t}\n\n\t/**\n\t * Inserts a body into the BVH\n\t * @param {Circle|Polygon|Point} body The body to insert\n\t * @param {Boolean} [updating = false] Set to true if the body already exists in the BVH (used internally when updating the body's position)\n\t */\n\tinsert(body, updating = false) {\n\t\tif(!updating) {\n\t\t\tconst bvh = body._bvh;\n\n\t\t\tif(bvh && bvh !== this) {\n\t\t\t\tthrow new Error('Body belongs to another collision system');\n\t\t\t}\n\n\t\t\tbody._bvh = this;\n\t\t\tthis._bodies.push(body);\n\t\t}\n\n\t\tconst polygon = body._polygon;\n\t\tconst body_x = body.x;\n\t\tconst body_y = body.y;\n\n\t\tif(polygon) {\n\t\t\tif(\n\t\t\t\tbody._dirty_coords ||\n\t\t\t\tbody.x !== body._x ||\n\t\t\t\tbody.y !== body._y ||\n\t\t\t\tbody.angle !== body._angle ||\n\t\t\t\tbody.scale_x !== body._scale_x ||\n\t\t\t\tbody.scale_y !== body._scale_y\n\t\t\t) {\n\t\t\t\tbody._calculateCoords();\n\t\t\t}\n\t\t}\n\n\t\tconst padding = body._bvh_padding;\n\t\tconst radius = polygon ? 0 : body.radius * body.scale;\n\t\tconst body_min_x = (polygon ? body._min_x : body_x - radius) - padding;\n\t\tconst body_min_y = (polygon ? body._min_y : body_y - radius) - padding;\n\t\tconst body_max_x = (polygon ? body._max_x : body_x + radius) + padding;\n\t\tconst body_max_y = (polygon ? body._max_y : body_y + radius) + padding;\n\n\t\tbody._bvh_min_x = body_min_x;\n\t\tbody._bvh_min_y = body_min_y;\n\t\tbody._bvh_max_x = body_max_x;\n\t\tbody._bvh_max_y = body_max_y;\n\n\t\tlet current = this._hierarchy;\n\t\tlet sort = 0;\n\n\t\tif(!current) {\n\t\t\tthis._hierarchy = body;\n\t\t}\n\t\telse {\n\t\t\twhile(true) {\n\t\t\t\t// Branch\n\t\t\t\tif(current._bvh_branch) {\n\t\t\t\t\tconst left = current._bvh_left;\n\t\t\t\t\tconst left_min_y = left._bvh_min_y;\n\t\t\t\t\tconst left_max_x = left._bvh_max_x;\n\t\t\t\t\tconst left_max_y = left._bvh_max_y;\n\t\t\t\t\tconst left_new_min_x = body_min_x < left._bvh_min_x ? body_min_x : left._bvh_min_x;\n\t\t\t\t\tconst left_new_min_y = body_min_y < left_min_y ? body_min_y : left_min_y;\n\t\t\t\t\tconst left_new_max_x = body_max_x > left_max_x ? body_max_x : left_max_x;\n\t\t\t\t\tconst left_new_max_y = body_max_y > left_max_y ? body_max_y : left_max_y;\n\t\t\t\t\tconst left_volume = (left_max_x - left._bvh_min_x) * (left_max_y - left_min_y);\n\t\t\t\t\tconst left_new_volume = (left_new_max_x - left_new_min_x) * (left_new_max_y - left_new_min_y);\n\t\t\t\t\tconst left_difference = left_new_volume - left_volume;\n\n\t\t\t\t\tconst right = current._bvh_right;\n\t\t\t\t\tconst right_min_x = right._bvh_min_x;\n\t\t\t\t\tconst right_min_y = right._bvh_min_y;\n\t\t\t\t\tconst right_max_x = right._bvh_max_x;\n\t\t\t\t\tconst right_max_y = right._bvh_max_y;\n\t\t\t\t\tconst right_new_min_x = body_min_x < right_min_x ? body_min_x : right_min_x;\n\t\t\t\t\tconst right_new_min_y = body_min_y < right_min_y ? body_min_y : right_min_y;\n\t\t\t\t\tconst right_new_max_x = body_max_x > right_max_x ? body_max_x : right_max_x;\n\t\t\t\t\tconst right_new_max_y = body_max_y > right_max_y ? body_max_y : right_max_y;\n\t\t\t\t\tconst right_volume = (right_max_x - right_min_x) * (right_max_y - right_min_y);\n\t\t\t\t\tconst right_new_volume = (right_new_max_x - right_new_min_x) * (right_new_max_y - right_new_min_y);\n\t\t\t\t\tconst right_difference = right_new_volume - right_volume;\n\n\t\t\t\t\tcurrent._bvh_sort = sort++;\n\t\t\t\t\tcurrent._bvh_min_x = left_new_min_x < right_new_min_x ? left_new_min_x : right_new_min_x;\n\t\t\t\t\tcurrent._bvh_min_y = left_new_min_y < right_new_min_y ? left_new_min_y : right_new_min_y;\n\t\t\t\t\tcurrent._bvh_max_x = left_new_max_x > right_new_max_x ? left_new_max_x : right_new_max_x;\n\t\t\t\t\tcurrent._bvh_max_y = left_new_max_y > right_new_max_y ? left_new_max_y : right_new_max_y;\n\n\t\t\t\t\tcurrent = left_difference <= right_difference ? left : right;\n\t\t\t\t}\n\t\t\t\t// Leaf\n\t\t\t\telse {\n\t\t\t\t\tconst grandparent = current._bvh_parent;\n\t\t\t\t\tconst parent_min_x = current._bvh_min_x;\n\t\t\t\t\tconst parent_min_y = current._bvh_min_y;\n\t\t\t\t\tconst parent_max_x = current._bvh_max_x;\n\t\t\t\t\tconst parent_max_y = current._bvh_max_y;\n\t\t\t\t\tconst new_parent = current._bvh_parent = body._bvh_parent = _BVHBranch_mjs__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getBranch();\n\n\t\t\t\t\tnew_parent._bvh_parent = grandparent;\n\t\t\t\t\tnew_parent._bvh_left = current;\n\t\t\t\t\tnew_parent._bvh_right = body;\n\t\t\t\t\tnew_parent._bvh_sort = sort++;\n\t\t\t\t\tnew_parent._bvh_min_x = body_min_x < parent_min_x ? body_min_x : parent_min_x;\n\t\t\t\t\tnew_parent._bvh_min_y = body_min_y < parent_min_y ? body_min_y : parent_min_y;\n\t\t\t\t\tnew_parent._bvh_max_x = body_max_x > parent_max_x ? body_max_x : parent_max_x;\n\t\t\t\t\tnew_parent._bvh_max_y = body_max_y > parent_max_y ? body_max_y : parent_max_y;\n\n\t\t\t\t\tif(!grandparent) {\n\t\t\t\t\t\tthis._hierarchy = new_parent;\n\t\t\t\t\t}\n\t\t\t\t\telse if(grandparent._bvh_left === current) {\n\t\t\t\t\t\tgrandparent._bvh_left = new_parent;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tgrandparent._bvh_right = new_parent;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Removes a body from the BVH\n\t * @param {Circle|Polygon|Point} body The body to remove\n\t * @param {Boolean} [updating = false] Set to true if this is a temporary removal (used internally when updating the body's position)\n\t */\n\tremove(body, updating = false) {\n\t\tif(!updating) {\n\t\t\tconst bvh = body._bvh;\n\n\t\t\tif(bvh && bvh !== this) {\n\t\t\t\tthrow new Error('Body belongs to another collision system');\n\t\t\t}\n\n\t\t\tbody._bvh = null;\n\t\t\tthis._bodies.splice(this._bodies.indexOf(body), 1);\n\t\t}\n\n\t\tif(this._hierarchy === body) {\n\t\t\tthis._hierarchy = null;\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst parent = body._bvh_parent;\n\t\tconst grandparent = parent._bvh_parent;\n\t\tconst parent_left = parent._bvh_left;\n\t\tconst sibling = parent_left === body ? parent._bvh_right : parent_left;\n\n\t\tsibling._bvh_parent = grandparent;\n\n\t\tif(sibling._bvh_branch) {\n\t\t\tsibling._bvh_sort = parent._bvh_sort;\n\t\t}\n\n\t\tif(grandparent) {\n\t\t\tif(grandparent._bvh_left === parent) {\n\t\t\t\tgrandparent._bvh_left = sibling;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tgrandparent._bvh_right = sibling;\n\t\t\t}\n\n\t\t\tlet branch = grandparent;\n\n\t\t\twhile(branch) {\n\t\t\t\tconst left = branch._bvh_left;\n\t\t\t\tconst left_min_x = left._bvh_min_x;\n\t\t\t\tconst left_min_y = left._bvh_min_y;\n\t\t\t\tconst left_max_x = left._bvh_max_x;\n\t\t\t\tconst left_max_y = left._bvh_max_y;\n\n\t\t\t\tconst right = branch._bvh_right;\n\t\t\t\tconst right_min_x = right._bvh_min_x;\n\t\t\t\tconst right_min_y = right._bvh_min_y;\n\t\t\t\tconst right_max_x = right._bvh_max_x;\n\t\t\t\tconst right_max_y = right._bvh_max_y;\n\n\t\t\t\tbranch._bvh_min_x = left_min_x < right_min_x ? left_min_x : right_min_x;\n\t\t\t\tbranch._bvh_min_y = left_min_y < right_min_y ? left_min_y : right_min_y;\n\t\t\t\tbranch._bvh_max_x = left_max_x > right_max_x ? left_max_x : right_max_x;\n\t\t\t\tbranch._bvh_max_y = left_max_y > right_max_y ? left_max_y : right_max_y;\n\n\t\t\t\tbranch = branch._bvh_parent;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tthis._hierarchy = sibling;\n\t\t}\n\n\t\t_BVHBranch_mjs__WEBPACK_IMPORTED_MODULE_0__[\"default\"].releaseBranch(parent);\n\t}\n\n\t/**\n\t * Updates the BVH. Moved bodies are removed/inserted.\n\t */\n\tupdate() {\n\t\tconst bodies = this._bodies;\n\t\tconst count = bodies.length;\n\n\t\tfor(let i = 0; i < count; ++i) {\n\t\t\tconst body = bodies[i];\n\n\t\t\tlet update = false;\n\n\t\t\tif(!update && body.padding !== body._bvh_padding) {\n\t\t\t\tbody._bvh_padding = body.padding;\n\t\t\t\tupdate = true;\n\t\t\t}\n\n\t\t\tif(!update) {\n\t\t\t\tconst polygon = body._polygon;\n\n\t\t\t\tif(polygon) {\n\t\t\t\t\tif(\n\t\t\t\t\t\tbody._dirty_coords ||\n\t\t\t\t\t\tbody.x !== body._x ||\n\t\t\t\t\t\tbody.y !== body._y ||\n\t\t\t\t\t\tbody.angle !== body._angle ||\n\t\t\t\t\t\tbody.scale_x !== body._scale_x ||\n\t\t\t\t\t\tbody.scale_y !== body._scale_y\n\t\t\t\t\t) {\n\t\t\t\t\t\tbody._calculateCoords();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst x = body.x;\n\t\t\t\tconst y = body.y;\n\t\t\t\tconst radius = polygon ? 0 : body.radius * body.scale;\n\t\t\t\tconst min_x = polygon ? body._min_x : x - radius;\n\t\t\t\tconst min_y = polygon ? body._min_y : y - radius;\n\t\t\t\tconst max_x = polygon ? body._max_x : x + radius;\n\t\t\t\tconst max_y = polygon ? body._max_y : y + radius;\n\n\t\t\t\tupdate = min_x < body._bvh_min_x || min_y < body._bvh_min_y || max_x > body._bvh_max_x || max_y > body._bvh_max_y;\n\t\t\t}\n\n\t\t\tif(update) {\n\t\t\t\tthis.remove(body, true);\n\t\t\t\tthis.insert(body, true);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Returns a list of potential collisions for a body\n\t * @param {Circle|Polygon|Point} body The body to test\n\t * @returns {Array}\n\t */\n\tpotentials(body) {\n\t\tconst results = [];\n\t\tconst min_x = body._bvh_min_x;\n\t\tconst min_y = body._bvh_min_y;\n\t\tconst max_x = body._bvh_max_x;\n\t\tconst max_y = body._bvh_max_y;\n\n\t\tlet current = this._hierarchy;\n\t\tlet traverse_left = true;\n\n\t\tif(!current || !current._bvh_branch) {\n\t\t\treturn results;\n\t\t}\n\n\t\twhile(current) {\n\t\t\tif(traverse_left) {\n\t\t\t\ttraverse_left = false;\n\n\t\t\t\tlet left = current._bvh_branch ? current._bvh_left : null;\n\n\t\t\t\twhile(\n\t\t\t\t\tleft &&\n\t\t\t\t\tleft._bvh_max_x >= min_x &&\n\t\t\t\t\tleft._bvh_max_y >= min_y &&\n\t\t\t\t\tleft._bvh_min_x <= max_x &&\n\t\t\t\t\tleft._bvh_min_y <= max_y\n\t\t\t\t) {\n\t\t\t\t\tcurrent = left;\n\t\t\t\t\tleft = current._bvh_branch ? current._bvh_left : null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst branch = current._bvh_branch;\n\t\t\tconst right = branch ? current._bvh_right : null;\n\n\t\t\tif(\n\t\t\t\tright &&\n\t\t\t\tright._bvh_max_x > min_x &&\n\t\t\t\tright._bvh_max_y > min_y &&\n\t\t\t\tright._bvh_min_x < max_x &&\n\t\t\t\tright._bvh_min_y < max_y\n\t\t\t) {\n\t\t\t\tcurrent = right;\n\t\t\t\ttraverse_left = true;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif(!branch && current !== body) {\n\t\t\t\t\tresults.push(current);\n\t\t\t\t}\n\n\t\t\t\tlet parent = current._bvh_parent;\n\n\t\t\t\tif(parent) {\n\t\t\t\t\twhile(parent && parent._bvh_right === current) {\n\t\t\t\t\t\tcurrent = parent;\n\t\t\t\t\t\tparent = current._bvh_parent;\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrent = parent;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t}\n\n\t/**\n\t * Draws the bodies within the BVH to a CanvasRenderingContext2D's current path\n\t * @param {CanvasRenderingContext2D} context The context to draw to\n\t */\n\tdraw(context) {\n\t\tconst bodies = this._bodies;\n\t\tconst count = bodies.length;\n\n\t\tfor(let i = 0; i < count; ++i) {\n\t\t\tbodies[i].draw(context);\n\t\t}\n\t}\n\n\t/**\n\t * Draws the BVH to a CanvasRenderingContext2D's current path. This is useful for testing out different padding values for bodies.\n\t * @param {CanvasRenderingContext2D} context The context to draw to\n\t */\n\tdrawBVH(context) {\n\t\tlet current = this._hierarchy;\n\t\tlet traverse_left = true;\n\n\t\twhile(current) {\n\t\t\tif(traverse_left) {\n\t\t\t\ttraverse_left = false;\n\n\t\t\t\tlet left = current._bvh_branch ? current._bvh_left : null;\n\n\t\t\t\twhile(left) {\n\t\t\t\t\tcurrent = left;\n\t\t\t\t\tleft = current._bvh_branch ? current._bvh_left : null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst branch = current._bvh_branch;\n\t\t\tconst min_x = current._bvh_min_x;\n\t\t\tconst min_y = current._bvh_min_y;\n\t\t\tconst max_x = current._bvh_max_x;\n\t\t\tconst max_y = current._bvh_max_y;\n\t\t\tconst right = branch ? current._bvh_right : null;\n\n\t\t\tcontext.moveTo(min_x, min_y);\n\t\t\tcontext.lineTo(max_x, min_y);\n\t\t\tcontext.lineTo(max_x, max_y);\n\t\t\tcontext.lineTo(min_x, max_y);\n\t\t\tcontext.lineTo(min_x, min_y);\n\n\t\t\tif(right) {\n\t\t\t\tcurrent = right;\n\t\t\t\ttraverse_left = true;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet parent = current._bvh_parent;\n\n\t\t\t\tif(parent) {\n\t\t\t\t\twhile(parent && parent._bvh_right === current) {\n\t\t\t\t\t\tcurrent = parent;\n\t\t\t\t\t\tparent = current._bvh_parent;\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrent = parent;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n//# sourceURL=webpack:///./src/modules/BVH.mjs?"); - -/***/ }), - -/***/ "./src/modules/BVHBranch.mjs": -/*!***********************************!*\ - !*** ./src/modules/BVHBranch.mjs ***! - \***********************************/ -/*! exports provided: default */ -/***/ (function(__webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return BVHBranch; });\n/**\n * @private\n */\nconst branch_pool = [];\n\n/**\n * A branch within a BVH\n * @class\n * @private\n */\nclass BVHBranch {\n\t/**\n\t * @constructor\n\t */\n\tconstructor() {\n\t\t/** @private */\n\t\tthis._bvh_parent = null;\n\n\t\t/** @private */\n\t\tthis._bvh_branch = true;\n\n\t\t/** @private */\n\t\tthis._bvh_left = null;\n\n\t\t/** @private */\n\t\tthis._bvh_right = null;\n\n\t\t/** @private */\n\t\tthis._bvh_sort = 0;\n\n\t\t/** @private */\n\t\tthis._bvh_min_x = 0;\n\n\t\t/** @private */\n\t\tthis._bvh_min_y = 0;\n\n\t\t/** @private */\n\t\tthis._bvh_max_x = 0;\n\n\t\t/** @private */\n\t\tthis._bvh_max_y = 0;\n\t}\n\n\t/**\n\t * Returns a branch from the branch pool or creates a new branch\n\t * @returns {BVHBranch}\n\t */\n\tstatic getBranch() {\n\t\tif(branch_pool.length) {\n\t\t\treturn branch_pool.pop();\n\t\t}\n\n\t\treturn new BVHBranch();\n\t}\n\n\t/**\n\t * Releases a branch back into the branch pool\n\t * @param {BVHBranch} branch The branch to release\n\t */\n\tstatic releaseBranch(branch) {\n\t\tbranch_pool.push(branch);\n\t}\n\n\t/**\n\t * Sorting callback used to sort branches by deepest first\n\t * @param {BVHBranch} a The first branch\n\t * @param {BVHBranch} b The second branch\n\t * @returns {Number}\n\t */\n\tstatic sortBranches(a, b) {\n\t\treturn a.sort > b.sort ? -1 : 1;\n\t}\n};\n\n\n//# sourceURL=webpack:///./src/modules/BVHBranch.mjs?"); - -/***/ }), - -/***/ "./src/modules/Body.mjs": -/*!******************************!*\ - !*** ./src/modules/Body.mjs ***! - \******************************/ -/*! exports provided: default */ -/***/ (function(__webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return Body; });\n/* harmony import */ var _Result_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Result.mjs */ \"./src/modules/Result.mjs\");\n/* harmony import */ var _SAT_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./SAT.mjs */ \"./src/modules/SAT.mjs\");\n\n\n\n/**\n * The base class for bodies used to detect collisions\n * @class\n * @protected\n */\nclass Body {\n\t/**\n\t * @constructor\n\t * @param {Number} [x = 0] The starting X coordinate\n\t * @param {Number} [y = 0] The starting Y coordinate\n\t * @param {Number} [padding = 0] The amount to pad the bounding volume when testing for potential collisions\n\t */\n\tconstructor(x = 0, y = 0, padding = 0) {\n\t\t/**\n\t\t * @desc The X coordinate of the body\n\t\t * @type {Number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * @desc The Y coordinate of the body\n\t\t * @type {Number}\n\t\t */\n\t\tthis.y = y;\n\n\t\t/**\n\t\t * @desc The amount to pad the bounding volume when testing for potential collisions\n\t\t * @type {Number}\n\t\t */\n\t\tthis.padding = padding;\n\n\t\t/** @private */\n\t\tthis._circle = false;\n\n\t\t/** @private */\n\t\tthis._polygon = false;\n\n\t\t/** @private */\n\t\tthis._point = false;\n\n\t\t/** @private */\n\t\tthis._bvh = null;\n\n\t\t/** @private */\n\t\tthis._bvh_parent = null;\n\n\t\t/** @private */\n\t\tthis._bvh_branch = false;\n\n\t\t/** @private */\n\t\tthis._bvh_padding = padding;\n\n\t\t/** @private */\n\t\tthis._bvh_min_x = 0;\n\n\t\t/** @private */\n\t\tthis._bvh_min_y = 0;\n\n\t\t/** @private */\n\t\tthis._bvh_max_x = 0;\n\n\t\t/** @private */\n\t\tthis._bvh_max_y = 0;\n\t}\n\n\t/**\n\t * Determines if the body is colliding with another body\n\t * @param {Circle|Polygon|Point} target The target body to test against\n\t * @param {Result} [result = null] A Result object on which to store information about the collision\n\t * @param {Boolean} [aabb = true] Set to false to skip the AABB test (useful if you use your own potential collision heuristic)\n\t * @returns {Boolean}\n\t */\n\tcollides(target, result = null, aabb = true) {\n\t\treturn Object(_SAT_mjs__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(this, target, result, aabb);\n\t}\n\n\t/**\n\t * Returns a list of potential collisions\n\t * @returns {Array}\n\t */\n\tpotentials() {\n\t\tconst bvh = this._bvh;\n\n\t\tif(bvh === null) {\n\t\t\tthrow new Error('Body does not belong to a collision system');\n\t\t}\n\n\t\treturn bvh.potentials(this);\n\t}\n\n\t/**\n\t * Removes the body from its current collision system\n\t */\n\tremove() {\n\t\tconst bvh = this._bvh;\n\n\t\tif(bvh) {\n\t\t\tbvh.remove(this, false);\n\t\t}\n\t}\n\n\t/**\n\t * Creates a {@link Result} used to collect the detailed results of a collision test\n\t */\n\tcreateResult() {\n\t\treturn new _Result_mjs__WEBPACK_IMPORTED_MODULE_0__[\"default\"]();\n\t}\n\n\t/**\n\t * Creates a Result used to collect the detailed results of a collision test\n\t */\n\tstatic createResult() {\n\t\treturn new _Result_mjs__WEBPACK_IMPORTED_MODULE_0__[\"default\"]();\n\t}\n};\n\n\n//# sourceURL=webpack:///./src/modules/Body.mjs?"); - -/***/ }), - -/***/ "./src/modules/Circle.mjs": -/*!********************************!*\ - !*** ./src/modules/Circle.mjs ***! - \********************************/ -/*! exports provided: default */ -/***/ (function(__webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return Circle; });\n/* harmony import */ var _Body_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Body.mjs */ \"./src/modules/Body.mjs\");\n\n\n/**\n * A circle used to detect collisions\n * @class\n */\nclass Circle extends _Body_mjs__WEBPACK_IMPORTED_MODULE_0__[\"default\"] {\n\t/**\n\t * @constructor\n\t * @param {Number} [x = 0] The starting X coordinate\n\t * @param {Number} [y = 0] The starting Y coordinate\n\t * @param {Number} [radius = 0] The radius\n\t * @param {Number} [scale = 1] The scale\n\t * @param {Number} [padding = 0] The amount to pad the bounding volume when testing for potential collisions\n\t */\n\tconstructor(x = 0, y = 0, radius = 0, scale = 1, padding = 0) {\n\t\tsuper(x, y, padding);\n\n\t\t/**\n\t\t * @desc\n\t\t * @type {Number}\n\t\t */\n\t\tthis.radius = radius;\n\n\t\t/**\n\t\t * @desc\n\t\t * @type {Number}\n\t\t */\n\t\tthis.scale = scale;\n\t}\n\n\t/**\n\t * Draws the circle to a CanvasRenderingContext2D's current path\n\t * @param {CanvasRenderingContext2D} context The context to add the arc to\n\t */\n\tdraw(context) {\n\t\tconst x = this.x;\n\t\tconst y = this.y;\n\t\tconst radius = this.radius * this.scale;\n\n\t\tcontext.moveTo(x + radius, y);\n\t\tcontext.arc(x, y, radius, 0, Math.PI * 2);\n\t}\n};\n\n\n//# sourceURL=webpack:///./src/modules/Circle.mjs?"); - -/***/ }), - -/***/ "./src/modules/Point.mjs": -/*!*******************************!*\ - !*** ./src/modules/Point.mjs ***! - \*******************************/ -/*! exports provided: default */ -/***/ (function(__webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return Point; });\n/* harmony import */ var _Polygon_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Polygon.mjs */ \"./src/modules/Polygon.mjs\");\n\n\n/**\n * A point used to detect collisions\n * @class\n */\nclass Point extends _Polygon_mjs__WEBPACK_IMPORTED_MODULE_0__[\"default\"] {\n\t/**\n\t * @constructor\n\t * @param {Number} [x = 0] The starting X coordinate\n\t * @param {Number} [y = 0] The starting Y coordinate\n\t * @param {Number} [padding = 0] The amount to pad the bounding volume when testing for potential collisions\n\t */\n\tconstructor(x = 0, y = 0, padding = 0) {\n\t\tsuper(x, y, [[0, 0]], 0, 1, 1, padding);\n\n\t\t/** @private */\n\t\tthis._point = true;\n\t}\n};\n\nPoint.prototype.setPoints = undefined;\n\n\n//# sourceURL=webpack:///./src/modules/Point.mjs?"); - -/***/ }), - -/***/ "./src/modules/Polygon.mjs": -/*!*********************************!*\ - !*** ./src/modules/Polygon.mjs ***! - \*********************************/ -/*! exports provided: default */ -/***/ (function(__webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return Polygon; });\n/* harmony import */ var _Body_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Body.mjs */ \"./src/modules/Body.mjs\");\n\n\n/**\n * A polygon used to detect collisions\n * @class\n */\nclass Polygon extends _Body_mjs__WEBPACK_IMPORTED_MODULE_0__[\"default\"] {\n\t/**\n\t * @constructor\n\t * @param {Number} [x = 0] The starting X coordinate\n\t * @param {Number} [y = 0] The starting Y coordinate\n\t * @param {Array} [points = []] An array of coordinate pairs making up the polygon - [[x1, y1], [x2, y2], ...]\n\t * @param {Number} [angle = 0] The starting rotation in radians\n\t * @param {Number} [scale_x = 1] The starting scale along the X axis\n\t * @param {Number} [scale_y = 1] The starting scale long the Y axis\n\t * @param {Number} [padding = 0] The amount to pad the bounding volume when testing for potential collisions\n\t */\n\tconstructor(x = 0, y = 0, points = [], angle = 0, scale_x = 1, scale_y = 1, padding = 0) {\n\t\tsuper(x, y, padding);\n\n\t\t/**\n\t\t * @desc The angle of the body in radians\n\t\t * @type {Number}\n\t\t */\n\t\tthis.angle = angle;\n\n\t\t/**\n\t\t * @desc The scale of the body along the X axis\n\t\t * @type {Number}\n\t\t */\n\t\tthis.scale_x = scale_x;\n\n\t\t/**\n\t\t * @desc The scale of the body along the Y axis\n\t\t * @type {Number}\n\t\t */\n\t\tthis.scale_y = scale_y;\n\n\n\t\t/** @private */\n\t\tthis._polygon = true;\n\n\t\t/** @private */\n\t\tthis._x = x;\n\n\t\t/** @private */\n\t\tthis._y = y;\n\n\t\t/** @private */\n\t\tthis._angle = angle;\n\n\t\t/** @private */\n\t\tthis._scale_x = scale_x;\n\n\t\t/** @private */\n\t\tthis._scale_y = scale_y;\n\n\t\t/** @private */\n\t\tthis._min_x = 0;\n\n\t\t/** @private */\n\t\tthis._min_y = 0;\n\n\t\t/** @private */\n\t\tthis._max_x = 0;\n\n\t\t/** @private */\n\t\tthis._max_y = 0;\n\n\t\t/** @private */\n\t\tthis._points = null;\n\n\t\t/** @private */\n\t\tthis._coords = null;\n\n\t\t/** @private */\n\t\tthis._edges = null;\n\n\t\t/** @private */\n\t\tthis._normals = null;\n\n\t\t/** @private */\n\t\tthis._dirty_coords = true;\n\n\t\t/** @private */\n\t\tthis._dirty_normals = true;\n\n\t\tPolygon.prototype.setPoints.call(this, points);\n\t}\n\n\t/**\n\t * Draws the polygon to a CanvasRenderingContext2D's current path\n\t * @param {CanvasRenderingContext2D} context The context to add the shape to\n\t */\n\tdraw(context) {\n\t\tif(\n\t\t\tthis._dirty_coords ||\n\t\t\tthis.x !== this._x ||\n\t\t\tthis.y !== this._y ||\n\t\t\tthis.angle !== this._angle ||\n\t\t\tthis.scale_x !== this._scale_x ||\n\t\t\tthis.scale_y !== this._scale_y\n\t\t) {\n\t\t\tthis._calculateCoords();\n\t\t}\n\n\t\tconst coords = this._coords;\n\n\t\tif(coords.length === 2) {\n\t\t\tcontext.moveTo(coords[0], coords[1]);\n\t\t\tcontext.arc(coords[0], coords[1], 1, 0, Math.PI * 2);\n\t\t}\n\t\telse {\n\t\t\tcontext.moveTo(coords[0], coords[1]);\n\n\t\t\tfor(let i = 2; i < coords.length; i += 2) {\n\t\t\t\tcontext.lineTo(coords[i], coords[i + 1]);\n\t\t\t}\n\n\t\t\tif(coords.length > 4) {\n\t\t\t\tcontext.lineTo(coords[0], coords[1]);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Sets the points making up the polygon. It's important to use this function when changing the polygon's shape to ensure internal data is also updated.\n\t * @param {Array} new_points An array of coordinate pairs making up the polygon - [[x1, y1], [x2, y2], ...]\n\t */\n\tsetPoints(new_points) {\n\t\tconst count = new_points.length;\n\n\t\tthis._points = new Float64Array(count * 2);\n\t\tthis._coords = new Float64Array(count * 2);\n\t\tthis._edges = new Float64Array(count * 2);\n\t\tthis._normals = new Float64Array(count * 2);\n\n\t\tconst points = this._points;\n\n\t\tfor(let i = 0, ix = 0, iy = 1; i < count; ++i, ix += 2, iy += 2) {\n\t\t\tconst new_point = new_points[i];\n\n\t\t\tpoints[ix] = new_point[0];\n\t\t\tpoints[iy] = new_point[1];\n\t\t}\n\n\t\tthis._dirty_coords = true;\n\t}\n\n\t/**\n\t * Calculates and caches the polygon's world coordinates based on its points, angle, and scale\n\t */\n\t_calculateCoords() {\n\t\tconst x = this.x;\n\t\tconst y = this.y;\n\t\tconst angle = this.angle;\n\t\tconst scale_x = this.scale_x;\n\t\tconst scale_y = this.scale_y;\n\t\tconst points = this._points;\n\t\tconst coords = this._coords;\n\t\tconst count = points.length;\n\n\t\tlet min_x;\n\t\tlet max_x;\n\t\tlet min_y;\n\t\tlet max_y;\n\n\t\tfor(let ix = 0, iy = 1; ix < count; ix += 2, iy += 2) {\n\t\t\tlet coord_x = points[ix] * scale_x;\n\t\t\tlet coord_y = points[iy] * scale_y;\n\n\t\t\tif(angle) {\n\t\t\t\tconst cos = Math.cos(angle);\n\t\t\t\tconst sin = Math.sin(angle);\n\t\t\t\tconst tmp_x = coord_x;\n\t\t\t\tconst tmp_y = coord_y;\n\n\t\t\t\tcoord_x = tmp_x * cos - tmp_y * sin;\n\t\t\t\tcoord_y = tmp_x * sin + tmp_y * cos;\n\t\t\t}\n\n\t\t\tcoord_x += x;\n\t\t\tcoord_y += y;\n\n\t\t\tcoords[ix] = coord_x;\n\t\t\tcoords[iy] = coord_y;\n\n\t\t\tif(ix === 0) {\n\t\t\t\tmin_x = max_x = coord_x;\n\t\t\t\tmin_y = max_y = coord_y;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif(coord_x < min_x) {\n\t\t\t\t\tmin_x = coord_x;\n\t\t\t\t}\n\t\t\t\telse if(coord_x > max_x) {\n\t\t\t\t\tmax_x = coord_x;\n\t\t\t\t}\n\n\t\t\t\tif(coord_y < min_y) {\n\t\t\t\t\tmin_y = coord_y;\n\t\t\t\t}\n\t\t\t\telse if(coord_y > max_y) {\n\t\t\t\t\tmax_y = coord_y;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._angle = angle;\n\t\tthis._scale_x = scale_x;\n\t\tthis._scale_y = scale_y;\n\t\tthis._min_x = min_x;\n\t\tthis._min_y = min_y;\n\t\tthis._max_x = max_x;\n\t\tthis._max_y = max_y;\n\t\tthis._dirty_coords = false;\n\t\tthis._dirty_normals = true;\n\t}\n\n\t/**\n\t * Calculates the normals and edges of the polygon's sides\n\t */\n\t_calculateNormals() {\n\t\tconst coords = this._coords;\n\t\tconst edges = this._edges;\n\t\tconst normals = this._normals;\n\t\tconst count = coords.length;\n\n\t\tfor(let ix = 0, iy = 1; ix < count; ix += 2, iy += 2) {\n\t\t\tconst next = ix + 2 < count ? ix + 2 : 0;\n\t\t\tconst x = coords[next] - coords[ix];\n\t\t\tconst y = coords[next + 1] - coords[iy];\n\t\t\tconst length = x || y ? Math.sqrt(x * x + y * y) : 0;\n\n\t\t\tedges[ix] = x;\n\t\t\tedges[iy] = y;\n\t\t\tnormals[ix] = length ? y / length : 0;\n\t\t\tnormals[iy] = length ? -x / length : 0;\n\t\t}\n\n\t\tthis._dirty_normals = false;\n\t}\n};\n\n\n//# sourceURL=webpack:///./src/modules/Polygon.mjs?"); - -/***/ }), - -/***/ "./src/modules/Result.mjs": -/*!********************************!*\ - !*** ./src/modules/Result.mjs ***! - \********************************/ -/*! exports provided: default */ -/***/ (function(__webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return Result; });\n/**\n * An object used to collect the detailed results of a collision test\n *\n * > **Note:** It is highly recommended you recycle the same Result object if possible in order to avoid wasting memory\n * @class\n */\nclass Result {\n\t/**\n\t * @constructor\n\t */\n\tconstructor() {\n\t\t/**\n\t\t * @desc True if a collision was detected\n\t\t * @type {Boolean}\n\t\t */\n\t\tthis.collision = false;\n\n\t\t/**\n\t\t * @desc The source body tested\n\t\t * @type {Circle|Polygon|Point}\n\t\t */\n\t\tthis.a = null;\n\n\t\t/**\n\t\t * @desc The target body tested against\n\t\t * @type {Circle|Polygon|Point}\n\t\t */\n\t\tthis.b = null;\n\n\t\t/**\n\t\t * @desc True if A is completely contained within B\n\t\t * @type {Boolean}\n\t\t */\n\t\tthis.a_in_b = false;\n\n\t\t/**\n\t\t * @desc True if B is completely contained within A\n\t\t * @type {Boolean}\n\t\t */\n\t\tthis.b_in_a = false;\n\n\t\t/**\n\t\t * @desc The magnitude of the shortest axis of overlap\n\t\t * @type {Number}\n\t\t */\n\t\tthis.overlap = 0;\n\n\t\t/**\n\t\t * @desc The X direction of the shortest axis of overlap\n\t\t * @type {Number}\n\t\t */\n\t\tthis.overlap_x = 0;\n\n\t\t/**\n\t\t * @desc The Y direction of the shortest axis of overlap\n\t\t * @type {Number}\n\t\t */\n\t\tthis.overlap_y = 0;\n\t}\n};\n\n\n//# sourceURL=webpack:///./src/modules/Result.mjs?"); - -/***/ }), - -/***/ "./src/modules/SAT.mjs": -/*!*****************************!*\ - !*** ./src/modules/SAT.mjs ***! - \*****************************/ -/*! exports provided: default */ -/***/ (function(__webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return SAT; });\n/**\n * Determines if two bodies are colliding using the Separating Axis Theorem\n * @private\n * @param {Circle|Polygon|Point} a The source body to test\n * @param {Circle|Polygon|Point} b The target body to test against\n * @param {Result} [result = null] A Result object on which to store information about the collision\n * @param {Boolean} [aabb = true] Set to false to skip the AABB test (useful if you use your own collision heuristic)\n * @returns {Boolean}\n */\nfunction SAT(a, b, result = null, aabb = true) {\n\tconst a_polygon = a._polygon;\n\tconst b_polygon = b._polygon;\n\n\tlet collision = false;\n\n\tif(result) {\n\t\tresult.a = a;\n\t\tresult.b = b;\n\t\tresult.a_in_b = true;\n\t\tresult.b_in_a = true;\n\t\tresult.overlap = null;\n\t\tresult.overlap_x = 0;\n\t\tresult.overlap_y = 0;\n\t}\n\n\tif(a_polygon) {\n\t\tif(\n\t\t\ta._dirty_coords ||\n\t\t\ta.x !== a._x ||\n\t\t\ta.y !== a._y ||\n\t\t\ta.angle !== a._angle ||\n\t\t\ta.scale_x !== a._scale_x ||\n\t\t\ta.scale_y !== a._scale_y\n\t\t) {\n\t\t\ta._calculateCoords();\n\t\t}\n\t}\n\n\tif(b_polygon) {\n\t\tif(\n\t\t\tb._dirty_coords ||\n\t\t\tb.x !== b._x ||\n\t\t\tb.y !== b._y ||\n\t\t\tb.angle !== b._angle ||\n\t\t\tb.scale_x !== b._scale_x ||\n\t\t\tb.scale_y !== b._scale_y\n\t\t) {\n\t\t\tb._calculateCoords();\n\t\t}\n\t}\n\n\tif(!aabb || aabbAABB(a, b)) {\n\t\tif(a_polygon && a._dirty_normals) {\n\t\t\ta._calculateNormals();\n\t\t}\n\n\t\tif(b_polygon && b._dirty_normals) {\n\t\t\tb._calculateNormals();\n\t\t}\n\n\t\tcollision = (\n\t\t\ta_polygon && b_polygon ? polygonPolygon(a, b, result) :\n\t\t\ta_polygon ? polygonCircle(a, b, result, false) :\n\t\t\tb_polygon ? polygonCircle(b, a, result, true) :\n\t\t\tcircleCircle(a, b, result)\n\t\t);\n\t}\n\n\tif(result) {\n\t\tresult.collision = collision;\n\t}\n\n\treturn collision;\n};\n\n/**\n * Determines if two bodies' axis aligned bounding boxes are colliding\n * @param {Circle|Polygon|Point} a The source body to test\n * @param {Circle|Polygon|Point} b The target body to test against\n */\nfunction aabbAABB(a, b) {\n\tconst a_polygon = a._polygon;\n\tconst a_x = a_polygon ? 0 : a.x;\n\tconst a_y = a_polygon ? 0 : a.y;\n\tconst a_radius = a_polygon ? 0 : a.radius * a.scale;\n\tconst a_min_x = a_polygon ? a._min_x : a_x - a_radius;\n\tconst a_min_y = a_polygon ? a._min_y : a_y - a_radius;\n\tconst a_max_x = a_polygon ? a._max_x : a_x + a_radius;\n\tconst a_max_y = a_polygon ? a._max_y : a_y + a_radius;\n\n\tconst b_polygon = b._polygon;\n\tconst b_x = b_polygon ? 0 : b.x;\n\tconst b_y = b_polygon ? 0 : b.y;\n\tconst b_radius = b_polygon ? 0 : b.radius * b.scale;\n\tconst b_min_x = b_polygon ? b._min_x : b_x - b_radius;\n\tconst b_min_y = b_polygon ? b._min_y : b_y - b_radius;\n\tconst b_max_x = b_polygon ? b._max_x : b_x + b_radius;\n\tconst b_max_y = b_polygon ? b._max_y : b_y + b_radius;\n\n\treturn a_min_x < b_max_x && a_min_y < b_max_y && a_max_x > b_min_x && a_max_y > b_min_y;\n}\n\n/**\n * Determines if two polygons are colliding\n * @param {Polygon} a The source polygon to test\n * @param {Polygon} b The target polygon to test against\n * @param {Result} [result = null] A Result object on which to store information about the collision\n * @returns {Boolean}\n */\nfunction polygonPolygon(a, b, result = null) {\n\tconst a_count = a._coords.length;\n\tconst b_count = b._coords.length;\n\n\t// Handle points specially\n\tif(a_count === 2 && b_count === 2) {\n\t\tconst a_coords = a._coords;\n\t\tconst b_coords = b._coords;\n\n\t\tif(result) {\n\t\t\tresult.overlap = 0;\n\t\t}\n\n\t\treturn a_coords[0] === b_coords[0] && a_coords[1] === b_coords[1];\n\t}\n\n\tconst a_coords = a._coords;\n\tconst b_coords = b._coords;\n\tconst a_normals = a._normals;\n\tconst b_normals = b._normals;\n\n\tif(a_count > 2) {\n\t\tfor(let ix = 0, iy = 1; ix < a_count; ix += 2, iy += 2) {\n\t\t\tif(separatingAxis(a_coords, b_coords, a_normals[ix], a_normals[iy], result)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\tif(b_count > 2) {\n\t\tfor(let ix = 0, iy = 1; ix < b_count; ix += 2, iy += 2) {\n\t\t\tif(separatingAxis(a_coords, b_coords, b_normals[ix], b_normals[iy], result)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true;\n}\n\n/**\n * Determines if a polygon and a circle are colliding\n * @param {Polygon} a The source polygon to test\n * @param {Circle} b The target circle to test against\n * @param {Result} [result = null] A Result object on which to store information about the collision\n * @param {Boolean} [reverse = false] Set to true to reverse a and b in the result parameter when testing circle->polygon instead of polygon->circle\n * @returns {Boolean}\n */\nfunction polygonCircle(a, b, result = null, reverse = false) {\n\tconst a_coords = a._coords;\n\tconst a_edges = a._edges;\n\tconst a_normals = a._normals;\n\tconst b_x = b.x;\n\tconst b_y = b.y;\n\tconst b_radius = b.radius * b.scale;\n\tconst b_radius2 = b_radius * 2;\n\tconst radius_squared = b_radius * b_radius;\n\tconst count = a_coords.length;\n\n\tlet a_in_b = true;\n\tlet b_in_a = true;\n\tlet overlap = null;\n\tlet overlap_x = 0;\n\tlet overlap_y = 0;\n\n\t// Handle points specially\n\tif(count === 2) {\n\t\tconst coord_x = b_x - a_coords[0];\n\t\tconst coord_y = b_y - a_coords[1];\n\t\tconst length_squared = coord_x * coord_x + coord_y * coord_y;\n\n\t\tif(length_squared > radius_squared) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif(result) {\n\t\t\tconst length = Math.sqrt(length_squared);\n\n\t\t\toverlap = b_radius - length;\n\t\t\toverlap_x = coord_x / length;\n\t\t\toverlap_y = coord_y / length;\n\t\t\tb_in_a = false;\n\t\t}\n\t}\n\telse {\n\t\tfor(let ix = 0, iy = 1; ix < count; ix += 2, iy += 2) {\n\t\t\tconst coord_x = b_x - a_coords[ix];\n\t\t\tconst coord_y = b_y - a_coords[iy];\n\t\t\tconst edge_x = a_edges[ix];\n\t\t\tconst edge_y = a_edges[iy];\n\t\t\tconst dot = coord_x * edge_x + coord_y * edge_y;\n\t\t\tconst region = dot < 0 ? -1 : dot > edge_x * edge_x + edge_y * edge_y ? 1 : 0;\n\n\t\t\tlet tmp_overlapping = false;\n\t\t\tlet tmp_overlap = 0;\n\t\t\tlet tmp_overlap_x = 0;\n\t\t\tlet tmp_overlap_y = 0;\n\n\t\t\tif(result && a_in_b && coord_x * coord_x + coord_y * coord_y > radius_squared) {\n\t\t\t\ta_in_b = false;\n\t\t\t}\n\n\t\t\tif(region) {\n\t\t\t\tconst left = region === -1;\n\t\t\t\tconst other_x = left ? (ix === 0 ? count - 2 : ix - 2) : (ix === count - 2 ? 0 : ix + 2);\n\t\t\t\tconst other_y = other_x + 1;\n\t\t\t\tconst coord2_x = b_x - a_coords[other_x];\n\t\t\t\tconst coord2_y = b_y - a_coords[other_y];\n\t\t\t\tconst edge2_x = a_edges[other_x];\n\t\t\t\tconst edge2_y = a_edges[other_y];\n\t\t\t\tconst dot2 = coord2_x * edge2_x + coord2_y * edge2_y;\n\t\t\t\tconst region2 = dot2 < 0 ? -1 : dot2 > edge2_x * edge2_x + edge2_y * edge2_y ? 1 : 0;\n\n\t\t\t\tif(region2 === -region) {\n\t\t\t\t\tconst target_x = left ? coord_x : coord2_x;\n\t\t\t\t\tconst target_y = left ? coord_y : coord2_y;\n\t\t\t\t\tconst length_squared = target_x * target_x + target_y * target_y;\n\n\t\t\t\t\tif(length_squared > radius_squared) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tif(result) {\n\t\t\t\t\t\tconst length = Math.sqrt(length_squared);\n\n\t\t\t\t\t\ttmp_overlapping = true;\n\t\t\t\t\t\ttmp_overlap = b_radius - length;\n\t\t\t\t\t\ttmp_overlap_x = target_x / length;\n\t\t\t\t\t\ttmp_overlap_y = target_y / length;\n\t\t\t\t\t\tb_in_a = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst normal_x = a_normals[ix];\n\t\t\t\tconst normal_y = a_normals[iy];\n\t\t\t\tconst length = coord_x * normal_x + coord_y * normal_y;\n\t\t\t\tconst absolute_length = length < 0 ? -length : length;\n\n\t\t\t\tif(length > 0 && absolute_length > b_radius) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif(result) {\n\t\t\t\t\ttmp_overlapping = true;\n\t\t\t\t\ttmp_overlap = b_radius - length;\n\t\t\t\t\ttmp_overlap_x = normal_x;\n\t\t\t\t\ttmp_overlap_y = normal_y;\n\n\t\t\t\t\tif(b_in_a && length >= 0 || tmp_overlap < b_radius2) {\n\t\t\t\t\t\tb_in_a = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(tmp_overlapping && (overlap === null || overlap > tmp_overlap)) {\n\t\t\t\toverlap = tmp_overlap;\n\t\t\t\toverlap_x = tmp_overlap_x;\n\t\t\t\toverlap_y = tmp_overlap_y;\n\t\t\t}\n\t\t}\n\t}\n\n\tif(result) {\n\t\tresult.a_in_b = reverse ? b_in_a : a_in_b;\n\t\tresult.b_in_a = reverse ? a_in_b : b_in_a;\n\t\tresult.overlap = overlap;\n\t\tresult.overlap_x = reverse ? -overlap_x : overlap_x;\n\t\tresult.overlap_y = reverse ? -overlap_y : overlap_y;\n\t}\n\n\treturn true;\n}\n\n/**\n * Determines if two circles are colliding\n * @param {Circle} a The source circle to test\n * @param {Circle} b The target circle to test against\n * @param {Result} [result = null] A Result object on which to store information about the collision\n * @returns {Boolean}\n */\nfunction circleCircle(a, b, result = null) {\n\tconst a_radius = a.radius * a.scale;\n\tconst b_radius = b.radius * b.scale;\n\tconst difference_x = b.x - a.x;\n\tconst difference_y = b.y - a.y;\n\tconst radius_sum = a_radius + b_radius;\n\tconst length_squared = difference_x * difference_x + difference_y * difference_y;\n\n\tif(length_squared > radius_sum * radius_sum) {\n\t\treturn false;\n\t}\n\n\tif(result) {\n\t\tconst length = Math.sqrt(length_squared);\n\n\t\tresult.a_in_b = a_radius <= b_radius && length <= b_radius - a_radius;\n\t\tresult.b_in_a = b_radius <= a_radius && length <= a_radius - b_radius;\n\t\tresult.overlap = radius_sum - length;\n\t\tresult.overlap_x = difference_x / length;\n\t\tresult.overlap_y = difference_y / length;\n\t}\n\n\treturn true;\n}\n\n/**\n * Determines if two polygons are separated by an axis\n * @param {Array} a_coords The coordinates of the polygon to test\n * @param {Array} b_coords The coordinates of the polygon to test against\n * @param {Number} x The X direction of the axis\n * @param {Number} y The Y direction of the axis\n * @param {Result} [result = null] A Result object on which to store information about the collision\n * @returns {Boolean}\n */\nfunction separatingAxis(a_coords, b_coords, x, y, result = null) {\n\tconst a_count = a_coords.length;\n\tconst b_count = b_coords.length;\n\n\tif(!a_count || !b_count) {\n\t\treturn true;\n\t}\n\n\tlet a_start = null;\n\tlet a_end = null;\n\tlet b_start = null;\n\tlet b_end = null;\n\n\tfor(let ix = 0, iy = 1; ix < a_count; ix += 2, iy += 2) {\n\t\tconst dot = a_coords[ix] * x + a_coords[iy] * y;\n\n\t\tif(a_start === null || a_start > dot) {\n\t\t\ta_start = dot;\n\t\t}\n\n\t\tif(a_end === null || a_end < dot) {\n\t\t\ta_end = dot;\n\t\t}\n\t}\n\n\tfor(let ix = 0, iy = 1; ix < b_count; ix += 2, iy += 2) {\n\t\tconst dot = b_coords[ix] * x + b_coords[iy] * y;\n\n\t\tif(b_start === null || b_start > dot) {\n\t\t\tb_start = dot;\n\t\t}\n\n\t\tif(b_end === null || b_end < dot) {\n\t\t\tb_end = dot;\n\t\t}\n\t}\n\n\tif(a_start > b_end || a_end < b_start) {\n\t\treturn true;\n\t}\n\n\tif(result) {\n\t\tlet overlap = 0;\n\n\t\tif(a_start < b_start) {\n\t\t\tresult.a_in_b = false;\n\n\t\t\tif(a_end < b_end) {\n\t\t\t\toverlap = a_end - b_start;\n\t\t\t\tresult.b_in_a = false;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst option1 = a_end - b_start;\n\t\t\t\tconst option2 = b_end - a_start;\n\n\t\t\t\toverlap = option1 < option2 ? option1 : -option2;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tresult.b_in_a = false;\n\n\t\t\tif(a_end > b_end) {\n\t\t\t\toverlap = a_start - b_end;\n\t\t\t\tresult.a_in_b = false;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst option1 = a_end - b_start;\n\t\t\t\tconst option2 = b_end - a_start;\n\n\t\t\t\toverlap = option1 < option2 ? option1 : -option2;\n\t\t\t}\n\t\t}\n\n\t\tconst current_overlap = result.overlap;\n\t\tconst absolute_overlap = overlap < 0 ? -overlap : overlap;\n\n\t\tif(current_overlap === null || current_overlap > absolute_overlap) {\n\t\t\tconst sign = overlap < 0 ? -1 : 1;\n\n\t\t\tresult.overlap = absolute_overlap;\n\t\t\tresult.overlap_x = x * sign;\n\t\t\tresult.overlap_y = y * sign;\n\t\t}\n\t}\n\n\treturn false;\n}\n\n\n//# sourceURL=webpack:///./src/modules/SAT.mjs?"); - -/***/ }) - -/******/ }); \ No newline at end of file diff --git a/frontend/assets/scripts/modules/Collisions.js.meta b/frontend/assets/scripts/modules/Collisions.js.meta deleted file mode 100644 index 657c759..0000000 --- a/frontend/assets/scripts/modules/Collisions.js.meta +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ver": "1.0.5", - "uuid": "da0a517f-5c74-4fc0-ba89-dbcee184b13e", - "isPlugin": false, - "loadPluginInWeb": true, - "loadPluginInNative": true, - "loadPluginInEditor": false, - "subMetas": {} -} \ No newline at end of file diff --git a/frontend/assets/scripts/modules/room_downsync_frame_proto_bundle.forcemsg.js b/frontend/assets/scripts/modules/room_downsync_frame_proto_bundle.forcemsg.js index 80d2474..474499d 100644 --- a/frontend/assets/scripts/modules/room_downsync_frame_proto_bundle.forcemsg.js +++ b/frontend/assets/scripts/modules/room_downsync_frame_proto_bundle.forcemsg.js @@ -1210,6 +1210,10 @@ $root.protos = (function() { * @property {number|null} [maxHp] PlayerDownsync maxHp * @property {number|null} [characterState] PlayerDownsync characterState * @property {boolean|null} [inAir] PlayerDownsync inAir + * @property {number|null} [framesInChState] PlayerDownsync framesInChState + * @property {number|null} [activeSkillId] PlayerDownsync activeSkillId + * @property {number|null} [activeSkillHit] PlayerDownsync activeSkillHit + * @property {number|null} [framesInvinsible] PlayerDownsync framesInvinsible * @property {string|null} [name] PlayerDownsync name * @property {string|null} [displayName] PlayerDownsync displayName * @property {string|null} [avatar] PlayerDownsync avatar @@ -1382,6 +1386,38 @@ $root.protos = (function() { */ PlayerDownsync.prototype.inAir = false; + /** + * PlayerDownsync framesInChState. + * @member {number} framesInChState + * @memberof protos.PlayerDownsync + * @instance + */ + PlayerDownsync.prototype.framesInChState = 0; + + /** + * PlayerDownsync activeSkillId. + * @member {number} activeSkillId + * @memberof protos.PlayerDownsync + * @instance + */ + PlayerDownsync.prototype.activeSkillId = 0; + + /** + * PlayerDownsync activeSkillHit. + * @member {number} activeSkillHit + * @memberof protos.PlayerDownsync + * @instance + */ + PlayerDownsync.prototype.activeSkillHit = 0; + + /** + * PlayerDownsync framesInvinsible. + * @member {number} framesInvinsible + * @memberof protos.PlayerDownsync + * @instance + */ + PlayerDownsync.prototype.framesInvinsible = 0; + /** * PlayerDownsync name. * @member {string} name @@ -1451,7 +1487,7 @@ $root.protos = (function() { if (message.joinIndex != null && Object.hasOwnProperty.call(message, "joinIndex")) writer.uint32(/* id 10, wireType 0 =*/80).int32(message.joinIndex); if (message.colliderRadius != null && Object.hasOwnProperty.call(message, "colliderRadius")) - writer.uint32(/* id 11, wireType 1 =*/89).double(message.colliderRadius); + writer.uint32(/* id 11, wireType 0 =*/88).int32(message.colliderRadius); if (message.removed != null && Object.hasOwnProperty.call(message, "removed")) writer.uint32(/* id 12, wireType 0 =*/96).bool(message.removed); if (message.score != null && Object.hasOwnProperty.call(message, "score")) @@ -1468,12 +1504,20 @@ $root.protos = (function() { writer.uint32(/* id 18, wireType 0 =*/144).int32(message.characterState); if (message.inAir != null && Object.hasOwnProperty.call(message, "inAir")) writer.uint32(/* id 19, wireType 0 =*/152).bool(message.inAir); + if (message.framesInChState != null && Object.hasOwnProperty.call(message, "framesInChState")) + writer.uint32(/* id 20, wireType 0 =*/160).int32(message.framesInChState); + if (message.activeSkillId != null && Object.hasOwnProperty.call(message, "activeSkillId")) + writer.uint32(/* id 21, wireType 0 =*/168).int32(message.activeSkillId); + if (message.activeSkillHit != null && Object.hasOwnProperty.call(message, "activeSkillHit")) + writer.uint32(/* id 22, wireType 0 =*/176).int32(message.activeSkillHit); + if (message.framesInvinsible != null && Object.hasOwnProperty.call(message, "framesInvinsible")) + writer.uint32(/* id 23, wireType 0 =*/184).int32(message.framesInvinsible); if (message.name != null && Object.hasOwnProperty.call(message, "name")) - writer.uint32(/* id 20, wireType 2 =*/162).string(message.name); + writer.uint32(/* id 997, wireType 2 =*/7978).string(message.name); if (message.displayName != null && Object.hasOwnProperty.call(message, "displayName")) - writer.uint32(/* id 21, wireType 2 =*/170).string(message.displayName); + writer.uint32(/* id 998, wireType 2 =*/7986).string(message.displayName); if (message.avatar != null && Object.hasOwnProperty.call(message, "avatar")) - writer.uint32(/* id 22, wireType 2 =*/178).string(message.avatar); + writer.uint32(/* id 999, wireType 2 =*/7994).string(message.avatar); return writer; }; @@ -1549,7 +1593,7 @@ $root.protos = (function() { break; } case 11: { - message.colliderRadius = reader.double(); + message.colliderRadius = reader.int32(); break; } case 12: { @@ -1585,14 +1629,30 @@ $root.protos = (function() { break; } case 20: { - message.name = reader.string(); + message.framesInChState = reader.int32(); break; } case 21: { - message.displayName = reader.string(); + message.activeSkillId = reader.int32(); break; } case 22: { + message.activeSkillHit = reader.int32(); + break; + } + case 23: { + message.framesInvinsible = reader.int32(); + break; + } + case 997: { + message.name = reader.string(); + break; + } + case 998: { + message.displayName = reader.string(); + break; + } + case 999: { message.avatar = reader.string(); break; } @@ -1662,8 +1722,8 @@ $root.protos = (function() { if (!$util.isInteger(message.joinIndex)) return "joinIndex: integer expected"; if (message.colliderRadius != null && message.hasOwnProperty("colliderRadius")) - if (typeof message.colliderRadius !== "number") - return "colliderRadius: number expected"; + if (!$util.isInteger(message.colliderRadius)) + return "colliderRadius: integer expected"; if (message.removed != null && message.hasOwnProperty("removed")) if (typeof message.removed !== "boolean") return "removed: boolean expected"; @@ -1688,6 +1748,18 @@ $root.protos = (function() { if (message.inAir != null && message.hasOwnProperty("inAir")) if (typeof message.inAir !== "boolean") return "inAir: boolean expected"; + if (message.framesInChState != null && message.hasOwnProperty("framesInChState")) + if (!$util.isInteger(message.framesInChState)) + return "framesInChState: integer expected"; + if (message.activeSkillId != null && message.hasOwnProperty("activeSkillId")) + if (!$util.isInteger(message.activeSkillId)) + return "activeSkillId: integer expected"; + if (message.activeSkillHit != null && message.hasOwnProperty("activeSkillHit")) + if (!$util.isInteger(message.activeSkillHit)) + return "activeSkillHit: integer expected"; + if (message.framesInvinsible != null && message.hasOwnProperty("framesInvinsible")) + if (!$util.isInteger(message.framesInvinsible)) + return "framesInvinsible: integer expected"; if (message.name != null && message.hasOwnProperty("name")) if (!$util.isString(message.name)) return "name: string expected"; @@ -1733,7 +1805,7 @@ $root.protos = (function() { if (object.joinIndex != null) message.joinIndex = object.joinIndex | 0; if (object.colliderRadius != null) - message.colliderRadius = Number(object.colliderRadius); + message.colliderRadius = object.colliderRadius | 0; if (object.removed != null) message.removed = Boolean(object.removed); if (object.score != null) @@ -1750,6 +1822,14 @@ $root.protos = (function() { message.characterState = object.characterState | 0; if (object.inAir != null) message.inAir = Boolean(object.inAir); + if (object.framesInChState != null) + message.framesInChState = object.framesInChState | 0; + if (object.activeSkillId != null) + message.activeSkillId = object.activeSkillId | 0; + if (object.activeSkillHit != null) + message.activeSkillHit = object.activeSkillHit | 0; + if (object.framesInvinsible != null) + message.framesInvinsible = object.framesInvinsible | 0; if (object.name != null) message.name = String(object.name); if (object.displayName != null) @@ -1792,6 +1872,10 @@ $root.protos = (function() { object.maxHp = 0; object.characterState = 0; object.inAir = false; + object.framesInChState = 0; + object.activeSkillId = 0; + object.activeSkillHit = 0; + object.framesInvinsible = 0; object.name = ""; object.displayName = ""; object.avatar = ""; @@ -1817,7 +1901,7 @@ $root.protos = (function() { if (message.joinIndex != null && message.hasOwnProperty("joinIndex")) object.joinIndex = message.joinIndex; if (message.colliderRadius != null && message.hasOwnProperty("colliderRadius")) - object.colliderRadius = options.json && !isFinite(message.colliderRadius) ? String(message.colliderRadius) : message.colliderRadius; + object.colliderRadius = message.colliderRadius; if (message.removed != null && message.hasOwnProperty("removed")) object.removed = message.removed; if (message.score != null && message.hasOwnProperty("score")) @@ -1834,6 +1918,14 @@ $root.protos = (function() { object.characterState = message.characterState; if (message.inAir != null && message.hasOwnProperty("inAir")) object.inAir = message.inAir; + if (message.framesInChState != null && message.hasOwnProperty("framesInChState")) + object.framesInChState = message.framesInChState; + if (message.activeSkillId != null && message.hasOwnProperty("activeSkillId")) + object.activeSkillId = message.activeSkillId; + if (message.activeSkillHit != null && message.hasOwnProperty("activeSkillHit")) + object.activeSkillHit = message.activeSkillHit; + if (message.framesInvinsible != null && message.hasOwnProperty("framesInvinsible")) + object.framesInvinsible = message.framesInvinsible; if (message.name != null && message.hasOwnProperty("name")) object.name = message.name; if (message.displayName != null && message.hasOwnProperty("displayName")) @@ -3960,25 +4052,24 @@ $root.protos = (function() { * Properties of a MeleeBullet. * @memberof protos * @interface IMeleeBullet - * @property {number|null} [battleLocalId] MeleeBullet battleLocalId - * @property {number|null} [startupFrames] MeleeBullet startupFrames - * @property {number|null} [activeFrames] MeleeBullet activeFrames - * @property {number|null} [recoveryFrames] MeleeBullet recoveryFrames - * @property {number|null} [recoveryFramesOnBlock] MeleeBullet recoveryFramesOnBlock - * @property {number|null} [recoveryFramesOnHit] MeleeBullet recoveryFramesOnHit - * @property {number|null} [hitboxOffset] MeleeBullet hitboxOffset * @property {number|null} [originatedRenderFrameId] MeleeBullet originatedRenderFrameId + * @property {number|null} [offenderJoinIndex] MeleeBullet offenderJoinIndex + * @property {number|null} [startupFrames] MeleeBullet startupFrames + * @property {number|null} [cancellableStFrame] MeleeBullet cancellableStFrame + * @property {number|null} [cancellableEdFrame] MeleeBullet cancellableEdFrame + * @property {number|null} [activeFrames] MeleeBullet activeFrames * @property {number|null} [hitStunFrames] MeleeBullet hitStunFrames * @property {number|null} [blockStunFrames] MeleeBullet blockStunFrames - * @property {number|null} [pushback] MeleeBullet pushback - * @property {number|null} [releaseTriggerType] MeleeBullet releaseTriggerType + * @property {number|null} [pushbackVelX] MeleeBullet pushbackVelX + * @property {number|null} [pushbackVelY] MeleeBullet pushbackVelY * @property {number|null} [damage] MeleeBullet damage - * @property {number|null} [offenderJoinIndex] MeleeBullet offenderJoinIndex - * @property {number|null} [offenderPlayerId] MeleeBullet offenderPlayerId + * @property {number|null} [selfLockVelX] MeleeBullet selfLockVelX + * @property {number|null} [selfLockVelY] MeleeBullet selfLockVelY + * @property {number|null} [hitboxOffsetX] MeleeBullet hitboxOffsetX + * @property {number|null} [hitboxOffsetY] MeleeBullet hitboxOffsetY * @property {number|null} [hitboxSizeX] MeleeBullet hitboxSizeX * @property {number|null} [hitboxSizeY] MeleeBullet hitboxSizeY - * @property {number|null} [selfMoveforwardX] MeleeBullet selfMoveforwardX - * @property {number|null} [selfMoveforwardY] MeleeBullet selfMoveforwardY + * @property {boolean|null} [blowUp] MeleeBullet blowUp */ /** @@ -3997,12 +4088,20 @@ $root.protos = (function() { } /** - * MeleeBullet battleLocalId. - * @member {number} battleLocalId + * MeleeBullet originatedRenderFrameId. + * @member {number} originatedRenderFrameId * @memberof protos.MeleeBullet * @instance */ - MeleeBullet.prototype.battleLocalId = 0; + MeleeBullet.prototype.originatedRenderFrameId = 0; + + /** + * MeleeBullet offenderJoinIndex. + * @member {number} offenderJoinIndex + * @memberof protos.MeleeBullet + * @instance + */ + MeleeBullet.prototype.offenderJoinIndex = 0; /** * MeleeBullet startupFrames. @@ -4012,6 +4111,22 @@ $root.protos = (function() { */ MeleeBullet.prototype.startupFrames = 0; + /** + * MeleeBullet cancellableStFrame. + * @member {number} cancellableStFrame + * @memberof protos.MeleeBullet + * @instance + */ + MeleeBullet.prototype.cancellableStFrame = 0; + + /** + * MeleeBullet cancellableEdFrame. + * @member {number} cancellableEdFrame + * @memberof protos.MeleeBullet + * @instance + */ + MeleeBullet.prototype.cancellableEdFrame = 0; + /** * MeleeBullet activeFrames. * @member {number} activeFrames @@ -4020,46 +4135,6 @@ $root.protos = (function() { */ MeleeBullet.prototype.activeFrames = 0; - /** - * MeleeBullet recoveryFrames. - * @member {number} recoveryFrames - * @memberof protos.MeleeBullet - * @instance - */ - MeleeBullet.prototype.recoveryFrames = 0; - - /** - * MeleeBullet recoveryFramesOnBlock. - * @member {number} recoveryFramesOnBlock - * @memberof protos.MeleeBullet - * @instance - */ - MeleeBullet.prototype.recoveryFramesOnBlock = 0; - - /** - * MeleeBullet recoveryFramesOnHit. - * @member {number} recoveryFramesOnHit - * @memberof protos.MeleeBullet - * @instance - */ - MeleeBullet.prototype.recoveryFramesOnHit = 0; - - /** - * MeleeBullet hitboxOffset. - * @member {number} hitboxOffset - * @memberof protos.MeleeBullet - * @instance - */ - MeleeBullet.prototype.hitboxOffset = 0; - - /** - * MeleeBullet originatedRenderFrameId. - * @member {number} originatedRenderFrameId - * @memberof protos.MeleeBullet - * @instance - */ - MeleeBullet.prototype.originatedRenderFrameId = 0; - /** * MeleeBullet hitStunFrames. * @member {number} hitStunFrames @@ -4077,20 +4152,20 @@ $root.protos = (function() { MeleeBullet.prototype.blockStunFrames = 0; /** - * MeleeBullet pushback. - * @member {number} pushback + * MeleeBullet pushbackVelX. + * @member {number} pushbackVelX * @memberof protos.MeleeBullet * @instance */ - MeleeBullet.prototype.pushback = 0; + MeleeBullet.prototype.pushbackVelX = 0; /** - * MeleeBullet releaseTriggerType. - * @member {number} releaseTriggerType + * MeleeBullet pushbackVelY. + * @member {number} pushbackVelY * @memberof protos.MeleeBullet * @instance */ - MeleeBullet.prototype.releaseTriggerType = 0; + MeleeBullet.prototype.pushbackVelY = 0; /** * MeleeBullet damage. @@ -4101,20 +4176,36 @@ $root.protos = (function() { MeleeBullet.prototype.damage = 0; /** - * MeleeBullet offenderJoinIndex. - * @member {number} offenderJoinIndex + * MeleeBullet selfLockVelX. + * @member {number} selfLockVelX * @memberof protos.MeleeBullet * @instance */ - MeleeBullet.prototype.offenderJoinIndex = 0; + MeleeBullet.prototype.selfLockVelX = 0; /** - * MeleeBullet offenderPlayerId. - * @member {number} offenderPlayerId + * MeleeBullet selfLockVelY. + * @member {number} selfLockVelY * @memberof protos.MeleeBullet * @instance */ - MeleeBullet.prototype.offenderPlayerId = 0; + MeleeBullet.prototype.selfLockVelY = 0; + + /** + * MeleeBullet hitboxOffsetX. + * @member {number} hitboxOffsetX + * @memberof protos.MeleeBullet + * @instance + */ + MeleeBullet.prototype.hitboxOffsetX = 0; + + /** + * MeleeBullet hitboxOffsetY. + * @member {number} hitboxOffsetY + * @memberof protos.MeleeBullet + * @instance + */ + MeleeBullet.prototype.hitboxOffsetY = 0; /** * MeleeBullet hitboxSizeX. @@ -4133,20 +4224,12 @@ $root.protos = (function() { MeleeBullet.prototype.hitboxSizeY = 0; /** - * MeleeBullet selfMoveforwardX. - * @member {number} selfMoveforwardX + * MeleeBullet blowUp. + * @member {boolean} blowUp * @memberof protos.MeleeBullet * @instance */ - MeleeBullet.prototype.selfMoveforwardX = 0; - - /** - * MeleeBullet selfMoveforwardY. - * @member {number} selfMoveforwardY - * @memberof protos.MeleeBullet - * @instance - */ - MeleeBullet.prototype.selfMoveforwardY = 0; + MeleeBullet.prototype.blowUp = false; /** * Creates a new MeleeBullet instance using the specified properties. @@ -4172,44 +4255,42 @@ $root.protos = (function() { MeleeBullet.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.battleLocalId != null && Object.hasOwnProperty.call(message, "battleLocalId")) - writer.uint32(/* id 1, wireType 0 =*/8).int32(message.battleLocalId); - if (message.startupFrames != null && Object.hasOwnProperty.call(message, "startupFrames")) - writer.uint32(/* id 2, wireType 0 =*/16).int32(message.startupFrames); - if (message.activeFrames != null && Object.hasOwnProperty.call(message, "activeFrames")) - writer.uint32(/* id 3, wireType 0 =*/24).int32(message.activeFrames); - if (message.recoveryFrames != null && Object.hasOwnProperty.call(message, "recoveryFrames")) - writer.uint32(/* id 4, wireType 0 =*/32).int32(message.recoveryFrames); - if (message.recoveryFramesOnBlock != null && Object.hasOwnProperty.call(message, "recoveryFramesOnBlock")) - writer.uint32(/* id 5, wireType 0 =*/40).int32(message.recoveryFramesOnBlock); - if (message.recoveryFramesOnHit != null && Object.hasOwnProperty.call(message, "recoveryFramesOnHit")) - writer.uint32(/* id 6, wireType 0 =*/48).int32(message.recoveryFramesOnHit); - if (message.hitboxOffset != null && Object.hasOwnProperty.call(message, "hitboxOffset")) - writer.uint32(/* id 7, wireType 1 =*/57).double(message.hitboxOffset); if (message.originatedRenderFrameId != null && Object.hasOwnProperty.call(message, "originatedRenderFrameId")) - writer.uint32(/* id 8, wireType 0 =*/64).int32(message.originatedRenderFrameId); - if (message.hitStunFrames != null && Object.hasOwnProperty.call(message, "hitStunFrames")) - writer.uint32(/* id 9, wireType 0 =*/72).int32(message.hitStunFrames); - if (message.blockStunFrames != null && Object.hasOwnProperty.call(message, "blockStunFrames")) - writer.uint32(/* id 10, wireType 0 =*/80).int32(message.blockStunFrames); - if (message.pushback != null && Object.hasOwnProperty.call(message, "pushback")) - writer.uint32(/* id 11, wireType 1 =*/89).double(message.pushback); - if (message.releaseTriggerType != null && Object.hasOwnProperty.call(message, "releaseTriggerType")) - writer.uint32(/* id 12, wireType 0 =*/96).int32(message.releaseTriggerType); - if (message.damage != null && Object.hasOwnProperty.call(message, "damage")) - writer.uint32(/* id 13, wireType 0 =*/104).int32(message.damage); + writer.uint32(/* id 1, wireType 0 =*/8).int32(message.originatedRenderFrameId); if (message.offenderJoinIndex != null && Object.hasOwnProperty.call(message, "offenderJoinIndex")) - writer.uint32(/* id 14, wireType 0 =*/112).int32(message.offenderJoinIndex); - if (message.offenderPlayerId != null && Object.hasOwnProperty.call(message, "offenderPlayerId")) - writer.uint32(/* id 15, wireType 0 =*/120).int32(message.offenderPlayerId); + writer.uint32(/* id 2, wireType 0 =*/16).int32(message.offenderJoinIndex); + if (message.startupFrames != null && Object.hasOwnProperty.call(message, "startupFrames")) + writer.uint32(/* id 3, wireType 0 =*/24).int32(message.startupFrames); + if (message.cancellableStFrame != null && Object.hasOwnProperty.call(message, "cancellableStFrame")) + writer.uint32(/* id 4, wireType 0 =*/32).int32(message.cancellableStFrame); + if (message.cancellableEdFrame != null && Object.hasOwnProperty.call(message, "cancellableEdFrame")) + writer.uint32(/* id 5, wireType 0 =*/40).int32(message.cancellableEdFrame); + if (message.activeFrames != null && Object.hasOwnProperty.call(message, "activeFrames")) + writer.uint32(/* id 6, wireType 0 =*/48).int32(message.activeFrames); + if (message.hitStunFrames != null && Object.hasOwnProperty.call(message, "hitStunFrames")) + writer.uint32(/* id 7, wireType 0 =*/56).int32(message.hitStunFrames); + if (message.blockStunFrames != null && Object.hasOwnProperty.call(message, "blockStunFrames")) + writer.uint32(/* id 8, wireType 0 =*/64).int32(message.blockStunFrames); + if (message.pushbackVelX != null && Object.hasOwnProperty.call(message, "pushbackVelX")) + writer.uint32(/* id 9, wireType 0 =*/72).int32(message.pushbackVelX); + if (message.pushbackVelY != null && Object.hasOwnProperty.call(message, "pushbackVelY")) + writer.uint32(/* id 10, wireType 0 =*/80).int32(message.pushbackVelY); + if (message.damage != null && Object.hasOwnProperty.call(message, "damage")) + writer.uint32(/* id 11, wireType 0 =*/88).int32(message.damage); + if (message.selfLockVelX != null && Object.hasOwnProperty.call(message, "selfLockVelX")) + writer.uint32(/* id 12, wireType 0 =*/96).int32(message.selfLockVelX); + if (message.selfLockVelY != null && Object.hasOwnProperty.call(message, "selfLockVelY")) + writer.uint32(/* id 13, wireType 0 =*/104).int32(message.selfLockVelY); + if (message.hitboxOffsetX != null && Object.hasOwnProperty.call(message, "hitboxOffsetX")) + writer.uint32(/* id 14, wireType 0 =*/112).int32(message.hitboxOffsetX); + if (message.hitboxOffsetY != null && Object.hasOwnProperty.call(message, "hitboxOffsetY")) + writer.uint32(/* id 15, wireType 0 =*/120).int32(message.hitboxOffsetY); if (message.hitboxSizeX != null && Object.hasOwnProperty.call(message, "hitboxSizeX")) - writer.uint32(/* id 16, wireType 1 =*/129).double(message.hitboxSizeX); + writer.uint32(/* id 16, wireType 0 =*/128).int32(message.hitboxSizeX); if (message.hitboxSizeY != null && Object.hasOwnProperty.call(message, "hitboxSizeY")) - writer.uint32(/* id 17, wireType 1 =*/137).double(message.hitboxSizeY); - if (message.selfMoveforwardX != null && Object.hasOwnProperty.call(message, "selfMoveforwardX")) - writer.uint32(/* id 18, wireType 1 =*/145).double(message.selfMoveforwardX); - if (message.selfMoveforwardY != null && Object.hasOwnProperty.call(message, "selfMoveforwardY")) - writer.uint32(/* id 19, wireType 1 =*/153).double(message.selfMoveforwardY); + writer.uint32(/* id 17, wireType 0 =*/136).int32(message.hitboxSizeY); + if (message.blowUp != null && Object.hasOwnProperty.call(message, "blowUp")) + writer.uint32(/* id 18, wireType 0 =*/144).bool(message.blowUp); return writer; }; @@ -4245,79 +4326,75 @@ $root.protos = (function() { var tag = reader.uint32(); switch (tag >>> 3) { case 1: { - message.battleLocalId = reader.int32(); - break; - } - case 2: { - message.startupFrames = reader.int32(); - break; - } - case 3: { - message.activeFrames = reader.int32(); - break; - } - case 4: { - message.recoveryFrames = reader.int32(); - break; - } - case 5: { - message.recoveryFramesOnBlock = reader.int32(); - break; - } - case 6: { - message.recoveryFramesOnHit = reader.int32(); - break; - } - case 7: { - message.hitboxOffset = reader.double(); - break; - } - case 8: { message.originatedRenderFrameId = reader.int32(); break; } - case 9: { - message.hitStunFrames = reader.int32(); - break; - } - case 10: { - message.blockStunFrames = reader.int32(); - break; - } - case 11: { - message.pushback = reader.double(); - break; - } - case 12: { - message.releaseTriggerType = reader.int32(); - break; - } - case 13: { - message.damage = reader.int32(); - break; - } - case 14: { + case 2: { message.offenderJoinIndex = reader.int32(); break; } + case 3: { + message.startupFrames = reader.int32(); + break; + } + case 4: { + message.cancellableStFrame = reader.int32(); + break; + } + case 5: { + message.cancellableEdFrame = reader.int32(); + break; + } + case 6: { + message.activeFrames = reader.int32(); + break; + } + case 7: { + message.hitStunFrames = reader.int32(); + break; + } + case 8: { + message.blockStunFrames = reader.int32(); + break; + } + case 9: { + message.pushbackVelX = reader.int32(); + break; + } + case 10: { + message.pushbackVelY = reader.int32(); + break; + } + case 11: { + message.damage = reader.int32(); + break; + } + case 12: { + message.selfLockVelX = reader.int32(); + break; + } + case 13: { + message.selfLockVelY = reader.int32(); + break; + } + case 14: { + message.hitboxOffsetX = reader.int32(); + break; + } case 15: { - message.offenderPlayerId = reader.int32(); + message.hitboxOffsetY = reader.int32(); break; } case 16: { - message.hitboxSizeX = reader.double(); + message.hitboxSizeX = reader.int32(); break; } case 17: { - message.hitboxSizeY = reader.double(); + message.hitboxSizeY = reader.int32(); break; } case 18: { - message.selfMoveforwardX = reader.double(); - break; - } - case 19: { - message.selfMoveforwardY = reader.double(); + message.blowUp = reader.bool(); break; } default: @@ -4355,63 +4432,60 @@ $root.protos = (function() { MeleeBullet.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.battleLocalId != null && message.hasOwnProperty("battleLocalId")) - if (!$util.isInteger(message.battleLocalId)) - return "battleLocalId: integer expected"; - if (message.startupFrames != null && message.hasOwnProperty("startupFrames")) - if (!$util.isInteger(message.startupFrames)) - return "startupFrames: integer expected"; - if (message.activeFrames != null && message.hasOwnProperty("activeFrames")) - if (!$util.isInteger(message.activeFrames)) - return "activeFrames: integer expected"; - if (message.recoveryFrames != null && message.hasOwnProperty("recoveryFrames")) - if (!$util.isInteger(message.recoveryFrames)) - return "recoveryFrames: integer expected"; - if (message.recoveryFramesOnBlock != null && message.hasOwnProperty("recoveryFramesOnBlock")) - if (!$util.isInteger(message.recoveryFramesOnBlock)) - return "recoveryFramesOnBlock: integer expected"; - if (message.recoveryFramesOnHit != null && message.hasOwnProperty("recoveryFramesOnHit")) - if (!$util.isInteger(message.recoveryFramesOnHit)) - return "recoveryFramesOnHit: integer expected"; - if (message.hitboxOffset != null && message.hasOwnProperty("hitboxOffset")) - if (typeof message.hitboxOffset !== "number") - return "hitboxOffset: number expected"; if (message.originatedRenderFrameId != null && message.hasOwnProperty("originatedRenderFrameId")) if (!$util.isInteger(message.originatedRenderFrameId)) return "originatedRenderFrameId: integer expected"; + if (message.offenderJoinIndex != null && message.hasOwnProperty("offenderJoinIndex")) + if (!$util.isInteger(message.offenderJoinIndex)) + return "offenderJoinIndex: integer expected"; + if (message.startupFrames != null && message.hasOwnProperty("startupFrames")) + if (!$util.isInteger(message.startupFrames)) + return "startupFrames: integer expected"; + if (message.cancellableStFrame != null && message.hasOwnProperty("cancellableStFrame")) + if (!$util.isInteger(message.cancellableStFrame)) + return "cancellableStFrame: integer expected"; + if (message.cancellableEdFrame != null && message.hasOwnProperty("cancellableEdFrame")) + if (!$util.isInteger(message.cancellableEdFrame)) + return "cancellableEdFrame: integer expected"; + if (message.activeFrames != null && message.hasOwnProperty("activeFrames")) + if (!$util.isInteger(message.activeFrames)) + return "activeFrames: integer expected"; if (message.hitStunFrames != null && message.hasOwnProperty("hitStunFrames")) if (!$util.isInteger(message.hitStunFrames)) return "hitStunFrames: integer expected"; if (message.blockStunFrames != null && message.hasOwnProperty("blockStunFrames")) if (!$util.isInteger(message.blockStunFrames)) return "blockStunFrames: integer expected"; - if (message.pushback != null && message.hasOwnProperty("pushback")) - if (typeof message.pushback !== "number") - return "pushback: number expected"; - if (message.releaseTriggerType != null && message.hasOwnProperty("releaseTriggerType")) - if (!$util.isInteger(message.releaseTriggerType)) - return "releaseTriggerType: integer expected"; + if (message.pushbackVelX != null && message.hasOwnProperty("pushbackVelX")) + if (!$util.isInteger(message.pushbackVelX)) + return "pushbackVelX: integer expected"; + if (message.pushbackVelY != null && message.hasOwnProperty("pushbackVelY")) + if (!$util.isInteger(message.pushbackVelY)) + return "pushbackVelY: integer expected"; if (message.damage != null && message.hasOwnProperty("damage")) if (!$util.isInteger(message.damage)) return "damage: integer expected"; - if (message.offenderJoinIndex != null && message.hasOwnProperty("offenderJoinIndex")) - if (!$util.isInteger(message.offenderJoinIndex)) - return "offenderJoinIndex: integer expected"; - if (message.offenderPlayerId != null && message.hasOwnProperty("offenderPlayerId")) - if (!$util.isInteger(message.offenderPlayerId)) - return "offenderPlayerId: integer expected"; + if (message.selfLockVelX != null && message.hasOwnProperty("selfLockVelX")) + if (!$util.isInteger(message.selfLockVelX)) + return "selfLockVelX: integer expected"; + if (message.selfLockVelY != null && message.hasOwnProperty("selfLockVelY")) + if (!$util.isInteger(message.selfLockVelY)) + return "selfLockVelY: integer expected"; + if (message.hitboxOffsetX != null && message.hasOwnProperty("hitboxOffsetX")) + if (!$util.isInteger(message.hitboxOffsetX)) + return "hitboxOffsetX: integer expected"; + if (message.hitboxOffsetY != null && message.hasOwnProperty("hitboxOffsetY")) + if (!$util.isInteger(message.hitboxOffsetY)) + return "hitboxOffsetY: integer expected"; if (message.hitboxSizeX != null && message.hasOwnProperty("hitboxSizeX")) - if (typeof message.hitboxSizeX !== "number") - return "hitboxSizeX: number expected"; + if (!$util.isInteger(message.hitboxSizeX)) + return "hitboxSizeX: integer expected"; if (message.hitboxSizeY != null && message.hasOwnProperty("hitboxSizeY")) - if (typeof message.hitboxSizeY !== "number") - return "hitboxSizeY: number expected"; - if (message.selfMoveforwardX != null && message.hasOwnProperty("selfMoveforwardX")) - if (typeof message.selfMoveforwardX !== "number") - return "selfMoveforwardX: number expected"; - if (message.selfMoveforwardY != null && message.hasOwnProperty("selfMoveforwardY")) - if (typeof message.selfMoveforwardY !== "number") - return "selfMoveforwardY: number expected"; + if (!$util.isInteger(message.hitboxSizeY)) + return "hitboxSizeY: integer expected"; + if (message.blowUp != null && message.hasOwnProperty("blowUp")) + if (typeof message.blowUp !== "boolean") + return "blowUp: boolean expected"; return null; }; @@ -4427,44 +4501,42 @@ $root.protos = (function() { if (object instanceof $root.protos.MeleeBullet) return object; var message = new $root.protos.MeleeBullet(); - if (object.battleLocalId != null) - message.battleLocalId = object.battleLocalId | 0; - if (object.startupFrames != null) - message.startupFrames = object.startupFrames | 0; - if (object.activeFrames != null) - message.activeFrames = object.activeFrames | 0; - if (object.recoveryFrames != null) - message.recoveryFrames = object.recoveryFrames | 0; - if (object.recoveryFramesOnBlock != null) - message.recoveryFramesOnBlock = object.recoveryFramesOnBlock | 0; - if (object.recoveryFramesOnHit != null) - message.recoveryFramesOnHit = object.recoveryFramesOnHit | 0; - if (object.hitboxOffset != null) - message.hitboxOffset = Number(object.hitboxOffset); if (object.originatedRenderFrameId != null) message.originatedRenderFrameId = object.originatedRenderFrameId | 0; + if (object.offenderJoinIndex != null) + message.offenderJoinIndex = object.offenderJoinIndex | 0; + if (object.startupFrames != null) + message.startupFrames = object.startupFrames | 0; + if (object.cancellableStFrame != null) + message.cancellableStFrame = object.cancellableStFrame | 0; + if (object.cancellableEdFrame != null) + message.cancellableEdFrame = object.cancellableEdFrame | 0; + if (object.activeFrames != null) + message.activeFrames = object.activeFrames | 0; if (object.hitStunFrames != null) message.hitStunFrames = object.hitStunFrames | 0; if (object.blockStunFrames != null) message.blockStunFrames = object.blockStunFrames | 0; - if (object.pushback != null) - message.pushback = Number(object.pushback); - if (object.releaseTriggerType != null) - message.releaseTriggerType = object.releaseTriggerType | 0; + if (object.pushbackVelX != null) + message.pushbackVelX = object.pushbackVelX | 0; + if (object.pushbackVelY != null) + message.pushbackVelY = object.pushbackVelY | 0; if (object.damage != null) message.damage = object.damage | 0; - if (object.offenderJoinIndex != null) - message.offenderJoinIndex = object.offenderJoinIndex | 0; - if (object.offenderPlayerId != null) - message.offenderPlayerId = object.offenderPlayerId | 0; + if (object.selfLockVelX != null) + message.selfLockVelX = object.selfLockVelX | 0; + if (object.selfLockVelY != null) + message.selfLockVelY = object.selfLockVelY | 0; + if (object.hitboxOffsetX != null) + message.hitboxOffsetX = object.hitboxOffsetX | 0; + if (object.hitboxOffsetY != null) + message.hitboxOffsetY = object.hitboxOffsetY | 0; if (object.hitboxSizeX != null) - message.hitboxSizeX = Number(object.hitboxSizeX); + message.hitboxSizeX = object.hitboxSizeX | 0; if (object.hitboxSizeY != null) - message.hitboxSizeY = Number(object.hitboxSizeY); - if (object.selfMoveforwardX != null) - message.selfMoveforwardX = Number(object.selfMoveforwardX); - if (object.selfMoveforwardY != null) - message.selfMoveforwardY = Number(object.selfMoveforwardY); + message.hitboxSizeY = object.hitboxSizeY | 0; + if (object.blowUp != null) + message.blowUp = Boolean(object.blowUp); return message; }; @@ -4482,64 +4554,61 @@ $root.protos = (function() { options = {}; var object = {}; if (options.defaults) { - object.battleLocalId = 0; - object.startupFrames = 0; - object.activeFrames = 0; - object.recoveryFrames = 0; - object.recoveryFramesOnBlock = 0; - object.recoveryFramesOnHit = 0; - object.hitboxOffset = 0; object.originatedRenderFrameId = 0; + object.offenderJoinIndex = 0; + object.startupFrames = 0; + object.cancellableStFrame = 0; + object.cancellableEdFrame = 0; + object.activeFrames = 0; object.hitStunFrames = 0; object.blockStunFrames = 0; - object.pushback = 0; - object.releaseTriggerType = 0; + object.pushbackVelX = 0; + object.pushbackVelY = 0; object.damage = 0; - object.offenderJoinIndex = 0; - object.offenderPlayerId = 0; + object.selfLockVelX = 0; + object.selfLockVelY = 0; + object.hitboxOffsetX = 0; + object.hitboxOffsetY = 0; object.hitboxSizeX = 0; object.hitboxSizeY = 0; - object.selfMoveforwardX = 0; - object.selfMoveforwardY = 0; + object.blowUp = false; } - if (message.battleLocalId != null && message.hasOwnProperty("battleLocalId")) - object.battleLocalId = message.battleLocalId; - if (message.startupFrames != null && message.hasOwnProperty("startupFrames")) - object.startupFrames = message.startupFrames; - if (message.activeFrames != null && message.hasOwnProperty("activeFrames")) - object.activeFrames = message.activeFrames; - if (message.recoveryFrames != null && message.hasOwnProperty("recoveryFrames")) - object.recoveryFrames = message.recoveryFrames; - if (message.recoveryFramesOnBlock != null && message.hasOwnProperty("recoveryFramesOnBlock")) - object.recoveryFramesOnBlock = message.recoveryFramesOnBlock; - if (message.recoveryFramesOnHit != null && message.hasOwnProperty("recoveryFramesOnHit")) - object.recoveryFramesOnHit = message.recoveryFramesOnHit; - if (message.hitboxOffset != null && message.hasOwnProperty("hitboxOffset")) - object.hitboxOffset = options.json && !isFinite(message.hitboxOffset) ? String(message.hitboxOffset) : message.hitboxOffset; if (message.originatedRenderFrameId != null && message.hasOwnProperty("originatedRenderFrameId")) object.originatedRenderFrameId = message.originatedRenderFrameId; + if (message.offenderJoinIndex != null && message.hasOwnProperty("offenderJoinIndex")) + object.offenderJoinIndex = message.offenderJoinIndex; + if (message.startupFrames != null && message.hasOwnProperty("startupFrames")) + object.startupFrames = message.startupFrames; + if (message.cancellableStFrame != null && message.hasOwnProperty("cancellableStFrame")) + object.cancellableStFrame = message.cancellableStFrame; + if (message.cancellableEdFrame != null && message.hasOwnProperty("cancellableEdFrame")) + object.cancellableEdFrame = message.cancellableEdFrame; + if (message.activeFrames != null && message.hasOwnProperty("activeFrames")) + object.activeFrames = message.activeFrames; if (message.hitStunFrames != null && message.hasOwnProperty("hitStunFrames")) object.hitStunFrames = message.hitStunFrames; if (message.blockStunFrames != null && message.hasOwnProperty("blockStunFrames")) object.blockStunFrames = message.blockStunFrames; - if (message.pushback != null && message.hasOwnProperty("pushback")) - object.pushback = options.json && !isFinite(message.pushback) ? String(message.pushback) : message.pushback; - if (message.releaseTriggerType != null && message.hasOwnProperty("releaseTriggerType")) - object.releaseTriggerType = message.releaseTriggerType; + if (message.pushbackVelX != null && message.hasOwnProperty("pushbackVelX")) + object.pushbackVelX = message.pushbackVelX; + if (message.pushbackVelY != null && message.hasOwnProperty("pushbackVelY")) + object.pushbackVelY = message.pushbackVelY; if (message.damage != null && message.hasOwnProperty("damage")) object.damage = message.damage; - if (message.offenderJoinIndex != null && message.hasOwnProperty("offenderJoinIndex")) - object.offenderJoinIndex = message.offenderJoinIndex; - if (message.offenderPlayerId != null && message.hasOwnProperty("offenderPlayerId")) - object.offenderPlayerId = message.offenderPlayerId; + if (message.selfLockVelX != null && message.hasOwnProperty("selfLockVelX")) + object.selfLockVelX = message.selfLockVelX; + if (message.selfLockVelY != null && message.hasOwnProperty("selfLockVelY")) + object.selfLockVelY = message.selfLockVelY; + if (message.hitboxOffsetX != null && message.hasOwnProperty("hitboxOffsetX")) + object.hitboxOffsetX = message.hitboxOffsetX; + if (message.hitboxOffsetY != null && message.hasOwnProperty("hitboxOffsetY")) + object.hitboxOffsetY = message.hitboxOffsetY; if (message.hitboxSizeX != null && message.hasOwnProperty("hitboxSizeX")) - object.hitboxSizeX = options.json && !isFinite(message.hitboxSizeX) ? String(message.hitboxSizeX) : message.hitboxSizeX; + object.hitboxSizeX = message.hitboxSizeX; if (message.hitboxSizeY != null && message.hasOwnProperty("hitboxSizeY")) - object.hitboxSizeY = options.json && !isFinite(message.hitboxSizeY) ? String(message.hitboxSizeY) : message.hitboxSizeY; - if (message.selfMoveforwardX != null && message.hasOwnProperty("selfMoveforwardX")) - object.selfMoveforwardX = options.json && !isFinite(message.selfMoveforwardX) ? String(message.selfMoveforwardX) : message.selfMoveforwardX; - if (message.selfMoveforwardY != null && message.hasOwnProperty("selfMoveforwardY")) - object.selfMoveforwardY = options.json && !isFinite(message.selfMoveforwardY) ? String(message.selfMoveforwardY) : message.selfMoveforwardY; + object.hitboxSizeY = message.hitboxSizeY; + if (message.blowUp != null && message.hasOwnProperty("blowUp")) + object.blowUp = message.blowUp; return object; }; @@ -4579,33 +4648,17 @@ $root.protos = (function() { * @memberof protos * @interface IBattleColliderInfo * @property {string|null} [stageName] BattleColliderInfo stageName - * @property {number|null} [stageDiscreteW] BattleColliderInfo stageDiscreteW - * @property {number|null} [stageDiscreteH] BattleColliderInfo stageDiscreteH - * @property {number|null} [stageTileW] BattleColliderInfo stageTileW - * @property {number|null} [stageTileH] BattleColliderInfo stageTileH * @property {number|null} [intervalToPing] BattleColliderInfo intervalToPing * @property {number|null} [willKickIfInactiveFor] BattleColliderInfo willKickIfInactiveFor * @property {number|null} [boundRoomId] BattleColliderInfo boundRoomId - * @property {number|null} [battleDurationFrames] BattleColliderInfo battleDurationFrames * @property {number|Long|null} [battleDurationNanos] BattleColliderInfo battleDurationNanos - * @property {number|null} [serverFps] BattleColliderInfo serverFps - * @property {number|null} [inputDelayFrames] BattleColliderInfo inputDelayFrames - * @property {number|null} [inputScaleFrames] BattleColliderInfo inputScaleFrames - * @property {number|null} [nstDelayFrames] BattleColliderInfo nstDelayFrames * @property {number|null} [inputFrameUpsyncDelayTolerance] BattleColliderInfo inputFrameUpsyncDelayTolerance * @property {number|null} [maxChasingRenderFramesPerUpdate] BattleColliderInfo maxChasingRenderFramesPerUpdate - * @property {number|null} [playerBattleState] BattleColliderInfo playerBattleState * @property {number|null} [rollbackEstimatedDtMillis] BattleColliderInfo rollbackEstimatedDtMillis * @property {number|Long|null} [rollbackEstimatedDtNanos] BattleColliderInfo rollbackEstimatedDtNanos - * @property {number|null} [worldToVirtualGridRatio] BattleColliderInfo worldToVirtualGridRatio - * @property {number|null} [virtualGridToWorldRatio] BattleColliderInfo virtualGridToWorldRatio - * @property {number|null} [spAtkLookupFrames] BattleColliderInfo spAtkLookupFrames * @property {number|null} [renderCacheSize] BattleColliderInfo renderCacheSize - * @property {number|null} [snapIntoPlatformOverlap] BattleColliderInfo snapIntoPlatformOverlap - * @property {number|null} [snapIntoPlatformThreshold] BattleColliderInfo snapIntoPlatformThreshold - * @property {number|null} [jumpingInitVelY] BattleColliderInfo jumpingInitVelY - * @property {number|null} [gravityX] BattleColliderInfo gravityX - * @property {number|null} [gravityY] BattleColliderInfo gravityY + * @property {number|null} [spaceOffsetX] BattleColliderInfo spaceOffsetX + * @property {number|null} [spaceOffsetY] BattleColliderInfo spaceOffsetY * @property {number|null} [collisionMinStep] BattleColliderInfo collisionMinStep * @property {boolean|null} [frameDataLoggingEnabled] BattleColliderInfo frameDataLoggingEnabled */ @@ -4633,38 +4686,6 @@ $root.protos = (function() { */ BattleColliderInfo.prototype.stageName = ""; - /** - * BattleColliderInfo stageDiscreteW. - * @member {number} stageDiscreteW - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.stageDiscreteW = 0; - - /** - * BattleColliderInfo stageDiscreteH. - * @member {number} stageDiscreteH - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.stageDiscreteH = 0; - - /** - * BattleColliderInfo stageTileW. - * @member {number} stageTileW - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.stageTileW = 0; - - /** - * BattleColliderInfo stageTileH. - * @member {number} stageTileH - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.stageTileH = 0; - /** * BattleColliderInfo intervalToPing. * @member {number} intervalToPing @@ -4689,14 +4710,6 @@ $root.protos = (function() { */ BattleColliderInfo.prototype.boundRoomId = 0; - /** - * BattleColliderInfo battleDurationFrames. - * @member {number} battleDurationFrames - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.battleDurationFrames = 0; - /** * BattleColliderInfo battleDurationNanos. * @member {number|Long} battleDurationNanos @@ -4705,38 +4718,6 @@ $root.protos = (function() { */ BattleColliderInfo.prototype.battleDurationNanos = $util.Long ? $util.Long.fromBits(0,0,false) : 0; - /** - * BattleColliderInfo serverFps. - * @member {number} serverFps - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.serverFps = 0; - - /** - * BattleColliderInfo inputDelayFrames. - * @member {number} inputDelayFrames - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.inputDelayFrames = 0; - - /** - * BattleColliderInfo inputScaleFrames. - * @member {number} inputScaleFrames - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.inputScaleFrames = 0; - - /** - * BattleColliderInfo nstDelayFrames. - * @member {number} nstDelayFrames - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.nstDelayFrames = 0; - /** * BattleColliderInfo inputFrameUpsyncDelayTolerance. * @member {number} inputFrameUpsyncDelayTolerance @@ -4753,14 +4734,6 @@ $root.protos = (function() { */ BattleColliderInfo.prototype.maxChasingRenderFramesPerUpdate = 0; - /** - * BattleColliderInfo playerBattleState. - * @member {number} playerBattleState - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.playerBattleState = 0; - /** * BattleColliderInfo rollbackEstimatedDtMillis. * @member {number} rollbackEstimatedDtMillis @@ -4777,30 +4750,6 @@ $root.protos = (function() { */ BattleColliderInfo.prototype.rollbackEstimatedDtNanos = $util.Long ? $util.Long.fromBits(0,0,false) : 0; - /** - * BattleColliderInfo worldToVirtualGridRatio. - * @member {number} worldToVirtualGridRatio - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.worldToVirtualGridRatio = 0; - - /** - * BattleColliderInfo virtualGridToWorldRatio. - * @member {number} virtualGridToWorldRatio - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.virtualGridToWorldRatio = 0; - - /** - * BattleColliderInfo spAtkLookupFrames. - * @member {number} spAtkLookupFrames - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.spAtkLookupFrames = 0; - /** * BattleColliderInfo renderCacheSize. * @member {number} renderCacheSize @@ -4810,44 +4759,20 @@ $root.protos = (function() { BattleColliderInfo.prototype.renderCacheSize = 0; /** - * BattleColliderInfo snapIntoPlatformOverlap. - * @member {number} snapIntoPlatformOverlap + * BattleColliderInfo spaceOffsetX. + * @member {number} spaceOffsetX * @memberof protos.BattleColliderInfo * @instance */ - BattleColliderInfo.prototype.snapIntoPlatformOverlap = 0; + BattleColliderInfo.prototype.spaceOffsetX = 0; /** - * BattleColliderInfo snapIntoPlatformThreshold. - * @member {number} snapIntoPlatformThreshold + * BattleColliderInfo spaceOffsetY. + * @member {number} spaceOffsetY * @memberof protos.BattleColliderInfo * @instance */ - BattleColliderInfo.prototype.snapIntoPlatformThreshold = 0; - - /** - * BattleColliderInfo jumpingInitVelY. - * @member {number} jumpingInitVelY - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.jumpingInitVelY = 0; - - /** - * BattleColliderInfo gravityX. - * @member {number} gravityX - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.gravityX = 0; - - /** - * BattleColliderInfo gravityY. - * @member {number} gravityY - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.gravityY = 0; + BattleColliderInfo.prototype.spaceOffsetY = 0; /** * BattleColliderInfo collisionMinStep. @@ -4891,62 +4816,30 @@ $root.protos = (function() { writer = $Writer.create(); if (message.stageName != null && Object.hasOwnProperty.call(message, "stageName")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.stageName); - if (message.stageDiscreteW != null && Object.hasOwnProperty.call(message, "stageDiscreteW")) - writer.uint32(/* id 2, wireType 0 =*/16).int32(message.stageDiscreteW); - if (message.stageDiscreteH != null && Object.hasOwnProperty.call(message, "stageDiscreteH")) - writer.uint32(/* id 3, wireType 0 =*/24).int32(message.stageDiscreteH); - if (message.stageTileW != null && Object.hasOwnProperty.call(message, "stageTileW")) - writer.uint32(/* id 4, wireType 0 =*/32).int32(message.stageTileW); - if (message.stageTileH != null && Object.hasOwnProperty.call(message, "stageTileH")) - writer.uint32(/* id 5, wireType 0 =*/40).int32(message.stageTileH); if (message.intervalToPing != null && Object.hasOwnProperty.call(message, "intervalToPing")) - writer.uint32(/* id 6, wireType 0 =*/48).int32(message.intervalToPing); + writer.uint32(/* id 2, wireType 0 =*/16).int32(message.intervalToPing); if (message.willKickIfInactiveFor != null && Object.hasOwnProperty.call(message, "willKickIfInactiveFor")) - writer.uint32(/* id 7, wireType 0 =*/56).int32(message.willKickIfInactiveFor); + writer.uint32(/* id 3, wireType 0 =*/24).int32(message.willKickIfInactiveFor); if (message.boundRoomId != null && Object.hasOwnProperty.call(message, "boundRoomId")) - writer.uint32(/* id 8, wireType 0 =*/64).int32(message.boundRoomId); - if (message.battleDurationFrames != null && Object.hasOwnProperty.call(message, "battleDurationFrames")) - writer.uint32(/* id 9, wireType 0 =*/72).int32(message.battleDurationFrames); + writer.uint32(/* id 4, wireType 0 =*/32).int32(message.boundRoomId); if (message.battleDurationNanos != null && Object.hasOwnProperty.call(message, "battleDurationNanos")) - writer.uint32(/* id 10, wireType 0 =*/80).int64(message.battleDurationNanos); - if (message.serverFps != null && Object.hasOwnProperty.call(message, "serverFps")) - writer.uint32(/* id 11, wireType 0 =*/88).int32(message.serverFps); - if (message.inputDelayFrames != null && Object.hasOwnProperty.call(message, "inputDelayFrames")) - writer.uint32(/* id 12, wireType 0 =*/96).int32(message.inputDelayFrames); - if (message.inputScaleFrames != null && Object.hasOwnProperty.call(message, "inputScaleFrames")) - writer.uint32(/* id 13, wireType 0 =*/104).uint32(message.inputScaleFrames); - if (message.nstDelayFrames != null && Object.hasOwnProperty.call(message, "nstDelayFrames")) - writer.uint32(/* id 14, wireType 0 =*/112).int32(message.nstDelayFrames); + writer.uint32(/* id 5, wireType 0 =*/40).int64(message.battleDurationNanos); if (message.inputFrameUpsyncDelayTolerance != null && Object.hasOwnProperty.call(message, "inputFrameUpsyncDelayTolerance")) - writer.uint32(/* id 15, wireType 0 =*/120).int32(message.inputFrameUpsyncDelayTolerance); + writer.uint32(/* id 6, wireType 0 =*/48).int32(message.inputFrameUpsyncDelayTolerance); if (message.maxChasingRenderFramesPerUpdate != null && Object.hasOwnProperty.call(message, "maxChasingRenderFramesPerUpdate")) - writer.uint32(/* id 16, wireType 0 =*/128).int32(message.maxChasingRenderFramesPerUpdate); - if (message.playerBattleState != null && Object.hasOwnProperty.call(message, "playerBattleState")) - writer.uint32(/* id 17, wireType 0 =*/136).int32(message.playerBattleState); + writer.uint32(/* id 7, wireType 0 =*/56).int32(message.maxChasingRenderFramesPerUpdate); if (message.rollbackEstimatedDtMillis != null && Object.hasOwnProperty.call(message, "rollbackEstimatedDtMillis")) - writer.uint32(/* id 18, wireType 1 =*/145).double(message.rollbackEstimatedDtMillis); + writer.uint32(/* id 8, wireType 1 =*/65).double(message.rollbackEstimatedDtMillis); if (message.rollbackEstimatedDtNanos != null && Object.hasOwnProperty.call(message, "rollbackEstimatedDtNanos")) - writer.uint32(/* id 19, wireType 0 =*/152).int64(message.rollbackEstimatedDtNanos); - if (message.worldToVirtualGridRatio != null && Object.hasOwnProperty.call(message, "worldToVirtualGridRatio")) - writer.uint32(/* id 20, wireType 1 =*/161).double(message.worldToVirtualGridRatio); - if (message.virtualGridToWorldRatio != null && Object.hasOwnProperty.call(message, "virtualGridToWorldRatio")) - writer.uint32(/* id 21, wireType 1 =*/169).double(message.virtualGridToWorldRatio); - if (message.spAtkLookupFrames != null && Object.hasOwnProperty.call(message, "spAtkLookupFrames")) - writer.uint32(/* id 22, wireType 0 =*/176).int32(message.spAtkLookupFrames); + writer.uint32(/* id 9, wireType 0 =*/72).int64(message.rollbackEstimatedDtNanos); if (message.renderCacheSize != null && Object.hasOwnProperty.call(message, "renderCacheSize")) - writer.uint32(/* id 23, wireType 0 =*/184).int32(message.renderCacheSize); - if (message.snapIntoPlatformOverlap != null && Object.hasOwnProperty.call(message, "snapIntoPlatformOverlap")) - writer.uint32(/* id 24, wireType 1 =*/193).double(message.snapIntoPlatformOverlap); - if (message.snapIntoPlatformThreshold != null && Object.hasOwnProperty.call(message, "snapIntoPlatformThreshold")) - writer.uint32(/* id 25, wireType 1 =*/201).double(message.snapIntoPlatformThreshold); - if (message.jumpingInitVelY != null && Object.hasOwnProperty.call(message, "jumpingInitVelY")) - writer.uint32(/* id 26, wireType 0 =*/208).int32(message.jumpingInitVelY); - if (message.gravityX != null && Object.hasOwnProperty.call(message, "gravityX")) - writer.uint32(/* id 27, wireType 0 =*/216).int32(message.gravityX); - if (message.gravityY != null && Object.hasOwnProperty.call(message, "gravityY")) - writer.uint32(/* id 28, wireType 0 =*/224).int32(message.gravityY); + writer.uint32(/* id 10, wireType 0 =*/80).int32(message.renderCacheSize); + if (message.spaceOffsetX != null && Object.hasOwnProperty.call(message, "spaceOffsetX")) + writer.uint32(/* id 11, wireType 1 =*/89).double(message.spaceOffsetX); + if (message.spaceOffsetY != null && Object.hasOwnProperty.call(message, "spaceOffsetY")) + writer.uint32(/* id 12, wireType 1 =*/97).double(message.spaceOffsetY); if (message.collisionMinStep != null && Object.hasOwnProperty.call(message, "collisionMinStep")) - writer.uint32(/* id 29, wireType 0 =*/232).int32(message.collisionMinStep); + writer.uint32(/* id 13, wireType 0 =*/104).int32(message.collisionMinStep); if (message.frameDataLoggingEnabled != null && Object.hasOwnProperty.call(message, "frameDataLoggingEnabled")) writer.uint32(/* id 999, wireType 0 =*/7992).bool(message.frameDataLoggingEnabled); return writer; @@ -4988,114 +4881,50 @@ $root.protos = (function() { break; } case 2: { - message.stageDiscreteW = reader.int32(); - break; - } - case 3: { - message.stageDiscreteH = reader.int32(); - break; - } - case 4: { - message.stageTileW = reader.int32(); - break; - } - case 5: { - message.stageTileH = reader.int32(); - break; - } - case 6: { message.intervalToPing = reader.int32(); break; } - case 7: { + case 3: { message.willKickIfInactiveFor = reader.int32(); break; } - case 8: { + case 4: { message.boundRoomId = reader.int32(); break; } - case 9: { - message.battleDurationFrames = reader.int32(); - break; - } - case 10: { + case 5: { message.battleDurationNanos = reader.int64(); break; } - case 11: { - message.serverFps = reader.int32(); - break; - } - case 12: { - message.inputDelayFrames = reader.int32(); - break; - } - case 13: { - message.inputScaleFrames = reader.uint32(); - break; - } - case 14: { - message.nstDelayFrames = reader.int32(); - break; - } - case 15: { + case 6: { message.inputFrameUpsyncDelayTolerance = reader.int32(); break; } - case 16: { + case 7: { message.maxChasingRenderFramesPerUpdate = reader.int32(); break; } - case 17: { - message.playerBattleState = reader.int32(); - break; - } - case 18: { + case 8: { message.rollbackEstimatedDtMillis = reader.double(); break; } - case 19: { + case 9: { message.rollbackEstimatedDtNanos = reader.int64(); break; } - case 20: { - message.worldToVirtualGridRatio = reader.double(); - break; - } - case 21: { - message.virtualGridToWorldRatio = reader.double(); - break; - } - case 22: { - message.spAtkLookupFrames = reader.int32(); - break; - } - case 23: { + case 10: { message.renderCacheSize = reader.int32(); break; } - case 24: { - message.snapIntoPlatformOverlap = reader.double(); + case 11: { + message.spaceOffsetX = reader.double(); break; } - case 25: { - message.snapIntoPlatformThreshold = reader.double(); + case 12: { + message.spaceOffsetY = reader.double(); break; } - case 26: { - message.jumpingInitVelY = reader.int32(); - break; - } - case 27: { - message.gravityX = reader.int32(); - break; - } - case 28: { - message.gravityY = reader.int32(); - break; - } - case 29: { + case 13: { message.collisionMinStep = reader.int32(); break; } @@ -5141,18 +4970,6 @@ $root.protos = (function() { if (message.stageName != null && message.hasOwnProperty("stageName")) if (!$util.isString(message.stageName)) return "stageName: string expected"; - if (message.stageDiscreteW != null && message.hasOwnProperty("stageDiscreteW")) - if (!$util.isInteger(message.stageDiscreteW)) - return "stageDiscreteW: integer expected"; - if (message.stageDiscreteH != null && message.hasOwnProperty("stageDiscreteH")) - if (!$util.isInteger(message.stageDiscreteH)) - return "stageDiscreteH: integer expected"; - if (message.stageTileW != null && message.hasOwnProperty("stageTileW")) - if (!$util.isInteger(message.stageTileW)) - return "stageTileW: integer expected"; - if (message.stageTileH != null && message.hasOwnProperty("stageTileH")) - if (!$util.isInteger(message.stageTileH)) - return "stageTileH: integer expected"; if (message.intervalToPing != null && message.hasOwnProperty("intervalToPing")) if (!$util.isInteger(message.intervalToPing)) return "intervalToPing: integer expected"; @@ -5162,66 +4979,30 @@ $root.protos = (function() { if (message.boundRoomId != null && message.hasOwnProperty("boundRoomId")) if (!$util.isInteger(message.boundRoomId)) return "boundRoomId: integer expected"; - if (message.battleDurationFrames != null && message.hasOwnProperty("battleDurationFrames")) - if (!$util.isInteger(message.battleDurationFrames)) - return "battleDurationFrames: integer expected"; if (message.battleDurationNanos != null && message.hasOwnProperty("battleDurationNanos")) if (!$util.isInteger(message.battleDurationNanos) && !(message.battleDurationNanos && $util.isInteger(message.battleDurationNanos.low) && $util.isInteger(message.battleDurationNanos.high))) return "battleDurationNanos: integer|Long expected"; - if (message.serverFps != null && message.hasOwnProperty("serverFps")) - if (!$util.isInteger(message.serverFps)) - return "serverFps: integer expected"; - if (message.inputDelayFrames != null && message.hasOwnProperty("inputDelayFrames")) - if (!$util.isInteger(message.inputDelayFrames)) - return "inputDelayFrames: integer expected"; - if (message.inputScaleFrames != null && message.hasOwnProperty("inputScaleFrames")) - if (!$util.isInteger(message.inputScaleFrames)) - return "inputScaleFrames: integer expected"; - if (message.nstDelayFrames != null && message.hasOwnProperty("nstDelayFrames")) - if (!$util.isInteger(message.nstDelayFrames)) - return "nstDelayFrames: integer expected"; if (message.inputFrameUpsyncDelayTolerance != null && message.hasOwnProperty("inputFrameUpsyncDelayTolerance")) if (!$util.isInteger(message.inputFrameUpsyncDelayTolerance)) return "inputFrameUpsyncDelayTolerance: integer expected"; if (message.maxChasingRenderFramesPerUpdate != null && message.hasOwnProperty("maxChasingRenderFramesPerUpdate")) if (!$util.isInteger(message.maxChasingRenderFramesPerUpdate)) return "maxChasingRenderFramesPerUpdate: integer expected"; - if (message.playerBattleState != null && message.hasOwnProperty("playerBattleState")) - if (!$util.isInteger(message.playerBattleState)) - return "playerBattleState: integer expected"; if (message.rollbackEstimatedDtMillis != null && message.hasOwnProperty("rollbackEstimatedDtMillis")) if (typeof message.rollbackEstimatedDtMillis !== "number") return "rollbackEstimatedDtMillis: number expected"; if (message.rollbackEstimatedDtNanos != null && message.hasOwnProperty("rollbackEstimatedDtNanos")) if (!$util.isInteger(message.rollbackEstimatedDtNanos) && !(message.rollbackEstimatedDtNanos && $util.isInteger(message.rollbackEstimatedDtNanos.low) && $util.isInteger(message.rollbackEstimatedDtNanos.high))) return "rollbackEstimatedDtNanos: integer|Long expected"; - if (message.worldToVirtualGridRatio != null && message.hasOwnProperty("worldToVirtualGridRatio")) - if (typeof message.worldToVirtualGridRatio !== "number") - return "worldToVirtualGridRatio: number expected"; - if (message.virtualGridToWorldRatio != null && message.hasOwnProperty("virtualGridToWorldRatio")) - if (typeof message.virtualGridToWorldRatio !== "number") - return "virtualGridToWorldRatio: number expected"; - if (message.spAtkLookupFrames != null && message.hasOwnProperty("spAtkLookupFrames")) - if (!$util.isInteger(message.spAtkLookupFrames)) - return "spAtkLookupFrames: integer expected"; if (message.renderCacheSize != null && message.hasOwnProperty("renderCacheSize")) if (!$util.isInteger(message.renderCacheSize)) return "renderCacheSize: integer expected"; - if (message.snapIntoPlatformOverlap != null && message.hasOwnProperty("snapIntoPlatformOverlap")) - if (typeof message.snapIntoPlatformOverlap !== "number") - return "snapIntoPlatformOverlap: number expected"; - if (message.snapIntoPlatformThreshold != null && message.hasOwnProperty("snapIntoPlatformThreshold")) - if (typeof message.snapIntoPlatformThreshold !== "number") - return "snapIntoPlatformThreshold: number expected"; - if (message.jumpingInitVelY != null && message.hasOwnProperty("jumpingInitVelY")) - if (!$util.isInteger(message.jumpingInitVelY)) - return "jumpingInitVelY: integer expected"; - if (message.gravityX != null && message.hasOwnProperty("gravityX")) - if (!$util.isInteger(message.gravityX)) - return "gravityX: integer expected"; - if (message.gravityY != null && message.hasOwnProperty("gravityY")) - if (!$util.isInteger(message.gravityY)) - return "gravityY: integer expected"; + if (message.spaceOffsetX != null && message.hasOwnProperty("spaceOffsetX")) + if (typeof message.spaceOffsetX !== "number") + return "spaceOffsetX: number expected"; + if (message.spaceOffsetY != null && message.hasOwnProperty("spaceOffsetY")) + if (typeof message.spaceOffsetY !== "number") + return "spaceOffsetY: number expected"; if (message.collisionMinStep != null && message.hasOwnProperty("collisionMinStep")) if (!$util.isInteger(message.collisionMinStep)) return "collisionMinStep: integer expected"; @@ -5245,22 +5026,12 @@ $root.protos = (function() { var message = new $root.protos.BattleColliderInfo(); if (object.stageName != null) message.stageName = String(object.stageName); - if (object.stageDiscreteW != null) - message.stageDiscreteW = object.stageDiscreteW | 0; - if (object.stageDiscreteH != null) - message.stageDiscreteH = object.stageDiscreteH | 0; - if (object.stageTileW != null) - message.stageTileW = object.stageTileW | 0; - if (object.stageTileH != null) - message.stageTileH = object.stageTileH | 0; if (object.intervalToPing != null) message.intervalToPing = object.intervalToPing | 0; if (object.willKickIfInactiveFor != null) message.willKickIfInactiveFor = object.willKickIfInactiveFor | 0; if (object.boundRoomId != null) message.boundRoomId = object.boundRoomId | 0; - if (object.battleDurationFrames != null) - message.battleDurationFrames = object.battleDurationFrames | 0; if (object.battleDurationNanos != null) if ($util.Long) (message.battleDurationNanos = $util.Long.fromValue(object.battleDurationNanos)).unsigned = false; @@ -5270,20 +5041,10 @@ $root.protos = (function() { message.battleDurationNanos = object.battleDurationNanos; else if (typeof object.battleDurationNanos === "object") message.battleDurationNanos = new $util.LongBits(object.battleDurationNanos.low >>> 0, object.battleDurationNanos.high >>> 0).toNumber(); - if (object.serverFps != null) - message.serverFps = object.serverFps | 0; - if (object.inputDelayFrames != null) - message.inputDelayFrames = object.inputDelayFrames | 0; - if (object.inputScaleFrames != null) - message.inputScaleFrames = object.inputScaleFrames >>> 0; - if (object.nstDelayFrames != null) - message.nstDelayFrames = object.nstDelayFrames | 0; if (object.inputFrameUpsyncDelayTolerance != null) message.inputFrameUpsyncDelayTolerance = object.inputFrameUpsyncDelayTolerance | 0; if (object.maxChasingRenderFramesPerUpdate != null) message.maxChasingRenderFramesPerUpdate = object.maxChasingRenderFramesPerUpdate | 0; - if (object.playerBattleState != null) - message.playerBattleState = object.playerBattleState | 0; if (object.rollbackEstimatedDtMillis != null) message.rollbackEstimatedDtMillis = Number(object.rollbackEstimatedDtMillis); if (object.rollbackEstimatedDtNanos != null) @@ -5295,24 +5056,12 @@ $root.protos = (function() { message.rollbackEstimatedDtNanos = object.rollbackEstimatedDtNanos; else if (typeof object.rollbackEstimatedDtNanos === "object") message.rollbackEstimatedDtNanos = new $util.LongBits(object.rollbackEstimatedDtNanos.low >>> 0, object.rollbackEstimatedDtNanos.high >>> 0).toNumber(); - if (object.worldToVirtualGridRatio != null) - message.worldToVirtualGridRatio = Number(object.worldToVirtualGridRatio); - if (object.virtualGridToWorldRatio != null) - message.virtualGridToWorldRatio = Number(object.virtualGridToWorldRatio); - if (object.spAtkLookupFrames != null) - message.spAtkLookupFrames = object.spAtkLookupFrames | 0; if (object.renderCacheSize != null) message.renderCacheSize = object.renderCacheSize | 0; - if (object.snapIntoPlatformOverlap != null) - message.snapIntoPlatformOverlap = Number(object.snapIntoPlatformOverlap); - if (object.snapIntoPlatformThreshold != null) - message.snapIntoPlatformThreshold = Number(object.snapIntoPlatformThreshold); - if (object.jumpingInitVelY != null) - message.jumpingInitVelY = object.jumpingInitVelY | 0; - if (object.gravityX != null) - message.gravityX = object.gravityX | 0; - if (object.gravityY != null) - message.gravityY = object.gravityY | 0; + if (object.spaceOffsetX != null) + message.spaceOffsetX = Number(object.spaceOffsetX); + if (object.spaceOffsetY != null) + message.spaceOffsetY = Number(object.spaceOffsetY); if (object.collisionMinStep != null) message.collisionMinStep = object.collisionMinStep | 0; if (object.frameDataLoggingEnabled != null) @@ -5335,81 +5084,45 @@ $root.protos = (function() { var object = {}; if (options.defaults) { object.stageName = ""; - object.stageDiscreteW = 0; - object.stageDiscreteH = 0; - object.stageTileW = 0; - object.stageTileH = 0; object.intervalToPing = 0; object.willKickIfInactiveFor = 0; object.boundRoomId = 0; - object.battleDurationFrames = 0; if ($util.Long) { var long = new $util.Long(0, 0, false); object.battleDurationNanos = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; } else object.battleDurationNanos = options.longs === String ? "0" : 0; - object.serverFps = 0; - object.inputDelayFrames = 0; - object.inputScaleFrames = 0; - object.nstDelayFrames = 0; object.inputFrameUpsyncDelayTolerance = 0; object.maxChasingRenderFramesPerUpdate = 0; - object.playerBattleState = 0; object.rollbackEstimatedDtMillis = 0; if ($util.Long) { var long = new $util.Long(0, 0, false); object.rollbackEstimatedDtNanos = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; } else object.rollbackEstimatedDtNanos = options.longs === String ? "0" : 0; - object.worldToVirtualGridRatio = 0; - object.virtualGridToWorldRatio = 0; - object.spAtkLookupFrames = 0; object.renderCacheSize = 0; - object.snapIntoPlatformOverlap = 0; - object.snapIntoPlatformThreshold = 0; - object.jumpingInitVelY = 0; - object.gravityX = 0; - object.gravityY = 0; + object.spaceOffsetX = 0; + object.spaceOffsetY = 0; object.collisionMinStep = 0; object.frameDataLoggingEnabled = false; } if (message.stageName != null && message.hasOwnProperty("stageName")) object.stageName = message.stageName; - if (message.stageDiscreteW != null && message.hasOwnProperty("stageDiscreteW")) - object.stageDiscreteW = message.stageDiscreteW; - if (message.stageDiscreteH != null && message.hasOwnProperty("stageDiscreteH")) - object.stageDiscreteH = message.stageDiscreteH; - if (message.stageTileW != null && message.hasOwnProperty("stageTileW")) - object.stageTileW = message.stageTileW; - if (message.stageTileH != null && message.hasOwnProperty("stageTileH")) - object.stageTileH = message.stageTileH; if (message.intervalToPing != null && message.hasOwnProperty("intervalToPing")) object.intervalToPing = message.intervalToPing; if (message.willKickIfInactiveFor != null && message.hasOwnProperty("willKickIfInactiveFor")) object.willKickIfInactiveFor = message.willKickIfInactiveFor; if (message.boundRoomId != null && message.hasOwnProperty("boundRoomId")) object.boundRoomId = message.boundRoomId; - if (message.battleDurationFrames != null && message.hasOwnProperty("battleDurationFrames")) - object.battleDurationFrames = message.battleDurationFrames; if (message.battleDurationNanos != null && message.hasOwnProperty("battleDurationNanos")) if (typeof message.battleDurationNanos === "number") object.battleDurationNanos = options.longs === String ? String(message.battleDurationNanos) : message.battleDurationNanos; else object.battleDurationNanos = options.longs === String ? $util.Long.prototype.toString.call(message.battleDurationNanos) : options.longs === Number ? new $util.LongBits(message.battleDurationNanos.low >>> 0, message.battleDurationNanos.high >>> 0).toNumber() : message.battleDurationNanos; - if (message.serverFps != null && message.hasOwnProperty("serverFps")) - object.serverFps = message.serverFps; - if (message.inputDelayFrames != null && message.hasOwnProperty("inputDelayFrames")) - object.inputDelayFrames = message.inputDelayFrames; - if (message.inputScaleFrames != null && message.hasOwnProperty("inputScaleFrames")) - object.inputScaleFrames = message.inputScaleFrames; - if (message.nstDelayFrames != null && message.hasOwnProperty("nstDelayFrames")) - object.nstDelayFrames = message.nstDelayFrames; if (message.inputFrameUpsyncDelayTolerance != null && message.hasOwnProperty("inputFrameUpsyncDelayTolerance")) object.inputFrameUpsyncDelayTolerance = message.inputFrameUpsyncDelayTolerance; if (message.maxChasingRenderFramesPerUpdate != null && message.hasOwnProperty("maxChasingRenderFramesPerUpdate")) object.maxChasingRenderFramesPerUpdate = message.maxChasingRenderFramesPerUpdate; - if (message.playerBattleState != null && message.hasOwnProperty("playerBattleState")) - object.playerBattleState = message.playerBattleState; if (message.rollbackEstimatedDtMillis != null && message.hasOwnProperty("rollbackEstimatedDtMillis")) object.rollbackEstimatedDtMillis = options.json && !isFinite(message.rollbackEstimatedDtMillis) ? String(message.rollbackEstimatedDtMillis) : message.rollbackEstimatedDtMillis; if (message.rollbackEstimatedDtNanos != null && message.hasOwnProperty("rollbackEstimatedDtNanos")) @@ -5417,24 +5130,12 @@ $root.protos = (function() { object.rollbackEstimatedDtNanos = options.longs === String ? String(message.rollbackEstimatedDtNanos) : message.rollbackEstimatedDtNanos; else object.rollbackEstimatedDtNanos = options.longs === String ? $util.Long.prototype.toString.call(message.rollbackEstimatedDtNanos) : options.longs === Number ? new $util.LongBits(message.rollbackEstimatedDtNanos.low >>> 0, message.rollbackEstimatedDtNanos.high >>> 0).toNumber() : message.rollbackEstimatedDtNanos; - if (message.worldToVirtualGridRatio != null && message.hasOwnProperty("worldToVirtualGridRatio")) - object.worldToVirtualGridRatio = options.json && !isFinite(message.worldToVirtualGridRatio) ? String(message.worldToVirtualGridRatio) : message.worldToVirtualGridRatio; - if (message.virtualGridToWorldRatio != null && message.hasOwnProperty("virtualGridToWorldRatio")) - object.virtualGridToWorldRatio = options.json && !isFinite(message.virtualGridToWorldRatio) ? String(message.virtualGridToWorldRatio) : message.virtualGridToWorldRatio; - if (message.spAtkLookupFrames != null && message.hasOwnProperty("spAtkLookupFrames")) - object.spAtkLookupFrames = message.spAtkLookupFrames; if (message.renderCacheSize != null && message.hasOwnProperty("renderCacheSize")) object.renderCacheSize = message.renderCacheSize; - if (message.snapIntoPlatformOverlap != null && message.hasOwnProperty("snapIntoPlatformOverlap")) - object.snapIntoPlatformOverlap = options.json && !isFinite(message.snapIntoPlatformOverlap) ? String(message.snapIntoPlatformOverlap) : message.snapIntoPlatformOverlap; - if (message.snapIntoPlatformThreshold != null && message.hasOwnProperty("snapIntoPlatformThreshold")) - object.snapIntoPlatformThreshold = options.json && !isFinite(message.snapIntoPlatformThreshold) ? String(message.snapIntoPlatformThreshold) : message.snapIntoPlatformThreshold; - if (message.jumpingInitVelY != null && message.hasOwnProperty("jumpingInitVelY")) - object.jumpingInitVelY = message.jumpingInitVelY; - if (message.gravityX != null && message.hasOwnProperty("gravityX")) - object.gravityX = message.gravityX; - if (message.gravityY != null && message.hasOwnProperty("gravityY")) - object.gravityY = message.gravityY; + if (message.spaceOffsetX != null && message.hasOwnProperty("spaceOffsetX")) + object.spaceOffsetX = options.json && !isFinite(message.spaceOffsetX) ? String(message.spaceOffsetX) : message.spaceOffsetX; + if (message.spaceOffsetY != null && message.hasOwnProperty("spaceOffsetY")) + object.spaceOffsetY = options.json && !isFinite(message.spaceOffsetY) ? String(message.spaceOffsetY) : message.spaceOffsetY; if (message.collisionMinStep != null && message.hasOwnProperty("collisionMinStep")) object.collisionMinStep = message.collisionMinStep; if (message.frameDataLoggingEnabled != null && message.hasOwnProperty("frameDataLoggingEnabled")) @@ -5483,7 +5184,7 @@ $root.protos = (function() { * @property {Array.|null} [meleeBullets] RoomDownsyncFrame meleeBullets * @property {number|Long|null} [backendUnconfirmedMask] RoomDownsyncFrame backendUnconfirmedMask * @property {boolean|null} [shouldForceResync] RoomDownsyncFrame shouldForceResync - * @property {Object.|null} [playerOpPatternToSkillId] RoomDownsyncFrame playerOpPatternToSkillId + * @property {Array.|null} [speciesIdList] RoomDownsyncFrame speciesIdList */ /** @@ -5497,7 +5198,7 @@ $root.protos = (function() { function RoomDownsyncFrame(properties) { this.playersArr = []; this.meleeBullets = []; - this.playerOpPatternToSkillId = {}; + this.speciesIdList = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -5553,12 +5254,12 @@ $root.protos = (function() { RoomDownsyncFrame.prototype.shouldForceResync = false; /** - * RoomDownsyncFrame playerOpPatternToSkillId. - * @member {Object.} playerOpPatternToSkillId + * RoomDownsyncFrame speciesIdList. + * @member {Array.} speciesIdList * @memberof protos.RoomDownsyncFrame * @instance */ - RoomDownsyncFrame.prototype.playerOpPatternToSkillId = $util.emptyObject; + RoomDownsyncFrame.prototype.speciesIdList = $util.emptyArray; /** * Creates a new RoomDownsyncFrame instance using the specified properties. @@ -5598,9 +5299,12 @@ $root.protos = (function() { writer.uint32(/* id 5, wireType 0 =*/40).uint64(message.backendUnconfirmedMask); if (message.shouldForceResync != null && Object.hasOwnProperty.call(message, "shouldForceResync")) writer.uint32(/* id 6, wireType 0 =*/48).bool(message.shouldForceResync); - if (message.playerOpPatternToSkillId != null && Object.hasOwnProperty.call(message, "playerOpPatternToSkillId")) - for (var keys = Object.keys(message.playerOpPatternToSkillId), i = 0; i < keys.length; ++i) - writer.uint32(/* id 7, wireType 2 =*/58).fork().uint32(/* id 1, wireType 0 =*/8).int32(keys[i]).uint32(/* id 2, wireType 0 =*/16).int32(message.playerOpPatternToSkillId[keys[i]]).ldelim(); + if (message.speciesIdList != null && message.speciesIdList.length) { + writer.uint32(/* id 7, wireType 2 =*/58).fork(); + for (var i = 0; i < message.speciesIdList.length; ++i) + writer.int32(message.speciesIdList[i]); + writer.ldelim(); + } return writer; }; @@ -5631,7 +5335,7 @@ $root.protos = (function() { RoomDownsyncFrame.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.protos.RoomDownsyncFrame(), key, value; + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.protos.RoomDownsyncFrame(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { @@ -5664,26 +5368,14 @@ $root.protos = (function() { break; } case 7: { - if (message.playerOpPatternToSkillId === $util.emptyObject) - message.playerOpPatternToSkillId = {}; - var end2 = reader.uint32() + reader.pos; - key = 0; - value = 0; - while (reader.pos < end2) { - var tag2 = reader.uint32(); - switch (tag2 >>> 3) { - case 1: - key = reader.int32(); - break; - case 2: - value = reader.int32(); - break; - default: - reader.skipType(tag2 & 7); - break; - } - } - message.playerOpPatternToSkillId[key] = value; + if (!(message.speciesIdList && message.speciesIdList.length)) + message.speciesIdList = []; + if ((tag & 7) === 2) { + var end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) + message.speciesIdList.push(reader.int32()); + } else + message.speciesIdList.push(reader.int32()); break; } default: @@ -5751,16 +5443,12 @@ $root.protos = (function() { if (message.shouldForceResync != null && message.hasOwnProperty("shouldForceResync")) if (typeof message.shouldForceResync !== "boolean") return "shouldForceResync: boolean expected"; - if (message.playerOpPatternToSkillId != null && message.hasOwnProperty("playerOpPatternToSkillId")) { - if (!$util.isObject(message.playerOpPatternToSkillId)) - return "playerOpPatternToSkillId: object expected"; - var key = Object.keys(message.playerOpPatternToSkillId); - for (var i = 0; i < key.length; ++i) { - if (!$util.key32Re.test(key[i])) - return "playerOpPatternToSkillId: integer key{k:int32} expected"; - if (!$util.isInteger(message.playerOpPatternToSkillId[key[i]])) - return "playerOpPatternToSkillId: integer{k:int32} expected"; - } + if (message.speciesIdList != null && message.hasOwnProperty("speciesIdList")) { + if (!Array.isArray(message.speciesIdList)) + return "speciesIdList: array expected"; + for (var i = 0; i < message.speciesIdList.length; ++i) + if (!$util.isInteger(message.speciesIdList[i])) + return "speciesIdList: integer[] expected"; } return null; }; @@ -5819,12 +5507,12 @@ $root.protos = (function() { message.backendUnconfirmedMask = new $util.LongBits(object.backendUnconfirmedMask.low >>> 0, object.backendUnconfirmedMask.high >>> 0).toNumber(true); if (object.shouldForceResync != null) message.shouldForceResync = Boolean(object.shouldForceResync); - if (object.playerOpPatternToSkillId) { - if (typeof object.playerOpPatternToSkillId !== "object") - throw TypeError(".protos.RoomDownsyncFrame.playerOpPatternToSkillId: object expected"); - message.playerOpPatternToSkillId = {}; - for (var keys = Object.keys(object.playerOpPatternToSkillId), i = 0; i < keys.length; ++i) - message.playerOpPatternToSkillId[keys[i]] = object.playerOpPatternToSkillId[keys[i]] | 0; + if (object.speciesIdList) { + if (!Array.isArray(object.speciesIdList)) + throw TypeError(".protos.RoomDownsyncFrame.speciesIdList: array expected"); + message.speciesIdList = []; + for (var i = 0; i < object.speciesIdList.length; ++i) + message.speciesIdList[i] = object.speciesIdList[i] | 0; } return message; }; @@ -5845,9 +5533,8 @@ $root.protos = (function() { if (options.arrays || options.defaults) { object.playersArr = []; object.meleeBullets = []; + object.speciesIdList = []; } - if (options.objects || options.defaults) - object.playerOpPatternToSkillId = {}; if (options.defaults) { object.id = 0; if ($util.Long) { @@ -5886,11 +5573,10 @@ $root.protos = (function() { object.backendUnconfirmedMask = options.longs === String ? $util.Long.prototype.toString.call(message.backendUnconfirmedMask) : options.longs === Number ? new $util.LongBits(message.backendUnconfirmedMask.low >>> 0, message.backendUnconfirmedMask.high >>> 0).toNumber(true) : message.backendUnconfirmedMask; if (message.shouldForceResync != null && message.hasOwnProperty("shouldForceResync")) object.shouldForceResync = message.shouldForceResync; - var keys2; - if (message.playerOpPatternToSkillId && (keys2 = Object.keys(message.playerOpPatternToSkillId)).length) { - object.playerOpPatternToSkillId = {}; - for (var j = 0; j < keys2.length; ++j) - object.playerOpPatternToSkillId[keys2[j]] = message.playerOpPatternToSkillId[keys2[j]]; + if (message.speciesIdList && message.speciesIdList.length) { + object.speciesIdList = []; + for (var j = 0; j < message.speciesIdList.length; ++j) + object.speciesIdList[j] = message.speciesIdList[j]; } return object; }; diff --git a/jsexport/battle/battle.go b/jsexport/battle/battle.go index 8d9aee4..36853b3 100644 --- a/jsexport/battle/battle.go +++ b/jsexport/battle/battle.go @@ -7,12 +7,33 @@ import ( const ( MAX_FLOAT64 = 1.7e+308 + MAX_INT32 = int32(999999999) COLLISION_PLAYER_INDEX_PREFIX = (1 << 17) COLLISION_BARRIER_INDEX_PREFIX = (1 << 16) COLLISION_BULLET_INDEX_PREFIX = (1 << 15) PATTERN_ID_UNABLE_TO_OP = -2 PATTERN_ID_NO_OP = -1 + + WORLD_TO_VIRTUAL_GRID_RATIO = float64(100) + VIRTUAL_GRID_TO_WORLD_RATIO = float64(1.0) / WORLD_TO_VIRTUAL_GRID_RATIO + + 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_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" + + SP_ATK_LOOKUP_FRAMES = int32(5) + + SNAP_INTO_PLATFORM_OVERLAP = float64(0.1) + SNAP_INTO_PLATFORM_THRESHOLD = float64(0.5) + + NO_SKILL = -1 + NO_SKILL_HIT = -1 + + NO_LOCK_VEL = int32(-1) ) // These directions are chosen such that when speed is changed to "(speedX+delta, speedY+delta)" for any of them, the direction is unchanged. @@ -28,47 +49,87 @@ var DIRECTION_DECODER = [][]int32{ {-1, +1}, } -var skillIdToBullet = map[int]interface{}{ - 1: &MeleeBullet{ - Bullet: Bullet{ - // for offender - StartupFrames: int32(5), - ActiveFrames: int32(10), - RecoveryFrames: int32(34), - RecoveryFramesOnBlock: int32(34), - RecoveryFramesOnHit: int32(34), - HitboxOffset: float64(12.0), // should be about the radius of the PlayerCollider - - // for defender - HitStunFrames: int32(18), - BlockStunFrames: int32(9), - Pushback: float64(8.0), - ReleaseTriggerType: int32(1), // 1: rising-edge, 2: falling-edge - Damage: int32(5), - - SelfMoveforwardX: 0, - SelfMoveforwardY: 0, - HitboxSizeX: 24.0, - HitboxSizeY: 32.0, - }, - }, -} - const ( - ATK_CHARACTER_STATE_IDLE1 = int32(0) - ATK_CHARACTER_STATE_WALKING = int32(1) - ATK_CHARACTER_STATE_ATK1 = int32(2) - ATK_CHARACTER_STATE_ATKED1 = int32(3) - ATK_CHARACTER_STATE_INAIR_IDLE1 = int32(4) - ATK_CHARACTER_STATE_INAIR_ATK1 = int32(5) - ATK_CHARACTER_STATE_INAIR_ATKED1 = int32(6) + ATK_CHARACTER_STATE_IDLE1 = int32(0) + ATK_CHARACTER_STATE_WALKING = int32(1) + ATK_CHARACTER_STATE_ATK1 = int32(2) + ATK_CHARACTER_STATE_ATKED1 = int32(3) + ATK_CHARACTER_STATE_INAIR_IDLE1_NO_JUMP = int32(4) + ATK_CHARACTER_STATE_INAIR_IDLE1_BY_JUMP = int32(5) + ATK_CHARACTER_STATE_INAIR_ATK1 = int32(6) + ATK_CHARACTER_STATE_INAIR_ATKED1 = int32(7) + ATK_CHARACTER_STATE_BLOWN_UP1 = int32(8) + ATK_CHARACTER_STATE_LAY_DOWN1 = int32(9) + ATK_CHARACTER_STATE_GET_UP1 = int32(10) + + ATK_CHARACTER_STATE_ATK2 = int32(11) + ATK_CHARACTER_STATE_ATK3 = int32(12) ) -func ConvertToInputFrameId(renderFrameId int32, inputDelayFrames int32, inputScaleFrames uint32) int32 { - if renderFrameId < inputDelayFrames { +var inAirSet = map[int32]bool{ + ATK_CHARACTER_STATE_INAIR_IDLE1_NO_JUMP: true, + ATK_CHARACTER_STATE_INAIR_IDLE1_BY_JUMP: true, + ATK_CHARACTER_STATE_INAIR_ATK1: true, + ATK_CHARACTER_STATE_INAIR_ATKED1: true, + ATK_CHARACTER_STATE_BLOWN_UP1: true, +} + +var noOpSet = map[int32]bool{ + ATK_CHARACTER_STATE_ATKED1: true, + ATK_CHARACTER_STATE_INAIR_ATKED1: true, + ATK_CHARACTER_STATE_BLOWN_UP1: true, + ATK_CHARACTER_STATE_LAY_DOWN1: true, + // During the invinsible frames of GET_UP1, the player is allowed to take any action +} + +var invinsibleSet = map[int32]bool{ + ATK_CHARACTER_STATE_BLOWN_UP1: true, + ATK_CHARACTER_STATE_LAY_DOWN1: true, + ATK_CHARACTER_STATE_GET_UP1: true, +} + +var nonAttackingSet = map[int32]bool{ + ATK_CHARACTER_STATE_IDLE1: true, + ATK_CHARACTER_STATE_WALKING: true, + ATK_CHARACTER_STATE_INAIR_IDLE1_NO_JUMP: true, + ATK_CHARACTER_STATE_INAIR_IDLE1_BY_JUMP: true, + ATK_CHARACTER_STATE_ATKED1: true, + ATK_CHARACTER_STATE_INAIR_ATKED1: true, + ATK_CHARACTER_STATE_BLOWN_UP1: true, + ATK_CHARACTER_STATE_LAY_DOWN1: true, + ATK_CHARACTER_STATE_GET_UP1: true, +} + +func ShouldPrefabInputFrameDownsync(prevRenderFrameId int32, renderFrameId int32) (bool, int32) { + for i := prevRenderFrameId + 1; i <= renderFrameId; i++ { + if (0 <= i) && (0 == (i & ((1 << INPUT_SCALE_FRAMES) - 1))) { + return true, i + } + } + return false, -1 +} + +func ShouldGenerateInputFrameUpsync(renderFrameId int32) bool { + return ((renderFrameId & ((1 << INPUT_SCALE_FRAMES) - 1)) == 0) +} + +func ConvertToDelayedInputFrameId(renderFrameId int32) int32 { + if renderFrameId < INPUT_DELAY_FRAMES { return 0 } - return ((renderFrameId - inputDelayFrames) >> inputScaleFrames) + return ((renderFrameId - INPUT_DELAY_FRAMES) >> INPUT_SCALE_FRAMES) +} + +func ConvertToNoDelayInputFrameId(renderFrameId int32) int32 { + return (renderFrameId >> INPUT_SCALE_FRAMES) +} + +func ConvertToFirstUsedRenderFrameId(inputFrameId int32) int32 { + return ((inputFrameId << INPUT_SCALE_FRAMES) + INPUT_DELAY_FRAMES) +} + +func ConvertToLastUsedRenderFrameId(inputFrameId int32) int32 { + return ((inputFrameId << INPUT_SCALE_FRAMES) + INPUT_DELAY_FRAMES + (1 << INPUT_SCALE_FRAMES) - 1) } func decodeInput(encodedInput uint64) *InputFrameDecoded { @@ -250,18 +311,18 @@ func isPolygonPairSeparatedByDir(a, b *resolv.ConvexPolygon, e resolv.Vector, re return false } -func WorldToVirtualGridPos(wx, wy, worldToVirtualGridRatio float64) (int32, int32) { +func WorldToVirtualGridPos(wx, wy float64) (int32, int32) { // [WARNING] Introduces loss of precision! // In JavaScript floating numbers suffer from seemingly non-deterministic arithmetics, and even if certain libs solved this issue by approaches such as fixed-point-number, they might not be used in other libs -- e.g. the "collision libs" we're interested in -- thus couldn't kill all pains. - var virtualGridX int32 = int32(math.Floor(wx * worldToVirtualGridRatio)) - var virtualGridY int32 = int32(math.Floor(wy * worldToVirtualGridRatio)) + var virtualGridX int32 = int32(math.Floor(wx * WORLD_TO_VIRTUAL_GRID_RATIO)) + var virtualGridY int32 = int32(math.Floor(wy * WORLD_TO_VIRTUAL_GRID_RATIO)) return virtualGridX, virtualGridY } -func VirtualGridToWorldPos(vx, vy int32, virtualGridToWorldRatio float64) (float64, float64) { +func VirtualGridToWorldPos(vx, vy int32) (float64, float64) { // No loss of precision - var wx float64 = float64(vx) * virtualGridToWorldRatio - var wy float64 = float64(vy) * virtualGridToWorldRatio + var wx float64 = float64(vx) * VIRTUAL_GRID_TO_WORLD_RATIO + var wy float64 = float64(vy) * VIRTUAL_GRID_TO_WORLD_RATIO return wx, wy } @@ -273,13 +334,13 @@ func PolygonColliderBLToWorldPos(cx, cy, halfBoundingW, halfBoundingH, topPaddin return cx + halfBoundingW + leftPadding - collisionSpaceOffsetX, cy + halfBoundingH + bottomPadding - collisionSpaceOffsetY } -func PolygonColliderBLToVirtualGridPos(cx, cy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY float64, worldToVirtualGridRatio float64) (int32, int32) { +func PolygonColliderBLToVirtualGridPos(cx, cy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY float64) (int32, int32) { wx, wy := PolygonColliderBLToWorldPos(cx, cy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY) - return WorldToVirtualGridPos(wx, wy, worldToVirtualGridRatio) + return WorldToVirtualGridPos(wx, wy) } -func VirtualGridToPolygonColliderBLPos(vx, vy int32, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY float64, virtualGridToWorldRatio float64) (float64, float64) { - wx, wy := VirtualGridToWorldPos(vx, vy, virtualGridToWorldRatio) +func VirtualGridToPolygonColliderBLPos(vx, vy int32, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY float64) (float64, float64) { + wx, wy := VirtualGridToWorldPos(vx, vy) return WorldToPolygonColliderBLPos(wx, wy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY) } @@ -321,15 +382,19 @@ func calcHardPushbacksNorms(joinIndex int32, playerCollider *resolv.Object, play return &ret } -func deriveOpPattern(currPlayerDownsync, thatPlayerInNextFrame *PlayerDownsync, currRenderFrame *RoomDownsyncFrame, inputsBuffer *RingBuffer, inputDelayFrames int32, inputScaleFrames uint32) (int, bool, int32, int32) { +func deriveOpPattern(currPlayerDownsync, thatPlayerInNextFrame *PlayerDownsync, currRenderFrame *RoomDownsyncFrame, inputsBuffer *RingBuffer) (int, bool, int32, int32) { // returns (patternId, jumpedOrNot, effectiveDx, effectiveDy) - delayedInputFrameId := ConvertToInputFrameId(currRenderFrame.Id, inputDelayFrames, inputScaleFrames) - delayedInputFrameIdForPrevRdf := ConvertToInputFrameId(currRenderFrame.Id-1, inputDelayFrames, inputScaleFrames) + delayedInputFrameId := ConvertToDelayedInputFrameId(currRenderFrame.Id) + delayedInputFrameIdForPrevRdf := ConvertToDelayedInputFrameId(currRenderFrame.Id - 1) if 0 >= delayedInputFrameId { return PATTERN_ID_UNABLE_TO_OP, false, 0, 0 } + if _, existent := noOpSet[currPlayerDownsync.CharacterState]; existent { + return PATTERN_ID_UNABLE_TO_OP, false, 0, 0 + } + delayedInputList := inputsBuffer.GetByFrameId(delayedInputFrameId).(*InputFrameDownsync).InputList var delayedInputListForPrevRdf []uint64 = nil if 0 < delayedInputFrameIdForPrevRdf { @@ -338,11 +403,8 @@ func deriveOpPattern(currPlayerDownsync, thatPlayerInNextFrame *PlayerDownsync, jumpedOrNot := false joinIndex := currPlayerDownsync.JoinIndex - if 0 < currPlayerDownsync.FramesToRecover { - return PATTERN_ID_UNABLE_TO_OP, false, 0, 0 - } decodedInput := decodeInput(delayedInputList[joinIndex-1]) - effDx, effDy := decodedInput.Dx, decodedInput.Dy + effDx, effDy := int32(0), int32(0) prevBtnALevel, prevBtnBLevel := int32(0), int32(0) if nil != delayedInputListForPrevRdf { prevDecodedInput := decodeInput(delayedInputListForPrevRdf[joinIndex-1]) @@ -350,121 +412,164 @@ func deriveOpPattern(currPlayerDownsync, thatPlayerInNextFrame *PlayerDownsync, prevBtnBLevel = prevDecodedInput.BtnBLevel } - if decodedInput.BtnBLevel > prevBtnBLevel { - characStateAlreadyInAir := false - if ATK_CHARACTER_STATE_INAIR_IDLE1 == currPlayerDownsync.CharacterState || ATK_CHARACTER_STATE_INAIR_ATK1 == currPlayerDownsync.CharacterState || ATK_CHARACTER_STATE_INAIR_ATKED1 == currPlayerDownsync.CharacterState { - characStateAlreadyInAir = true - } - characStateIsInterruptWaivable := false - if ATK_CHARACTER_STATE_IDLE1 == currPlayerDownsync.CharacterState || ATK_CHARACTER_STATE_WALKING == currPlayerDownsync.CharacterState || ATK_CHARACTER_STATE_INAIR_IDLE1 == currPlayerDownsync.CharacterState { - characStateIsInterruptWaivable = true - } - if !characStateAlreadyInAir && characStateIsInterruptWaivable { - jumpedOrNot = true + if 0 == currPlayerDownsync.FramesToRecover { + // Jumping and moving are only allowed here + effDx, effDy = decodedInput.Dx, decodedInput.Dy + if decodedInput.BtnBLevel > prevBtnBLevel { + if _, existent := inAirSet[currPlayerDownsync.CharacterState]; !existent { + jumpedOrNot = true + } } } patternId := PATTERN_ID_NO_OP if decodedInput.BtnALevel > prevBtnALevel { - patternId = 0 - effDx, effDy = 0, 0 // Most patterns/skills should not allow simultaneous movement + patternId = 1 } return patternId, jumpedOrNot, effDx, effDy } // [WARNING] The params of this method is carefully tuned such that only "battle.RoomDownsyncFrame" is a necessary custom struct. -func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer, currRenderFrame *RoomDownsyncFrame, collisionSys *resolv.Space, collisionSysMap map[int32]*resolv.Object, gravityX, gravityY, jumpingInitVelY, inputDelayFrames int32, inputScaleFrames uint32, collisionSpaceOffsetX, collisionSpaceOffsetY, snapIntoPlatformOverlap, snapIntoPlatformThreshold, worldToVirtualGridRatio, virtualGridToWorldRatio float64, playerOpPatternToSkillId map[int]int) *RoomDownsyncFrame { +func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer, currRenderFrame *RoomDownsyncFrame, collisionSys *resolv.Space, collisionSysMap map[int32]*resolv.Object, collisionSpaceOffsetX, collisionSpaceOffsetY float64, chConfigsOrderedByJoinIndex []*CharacterConfig) *RoomDownsyncFrame { // [WARNING] On backend this function MUST BE called while "InputsBufferLock" is locked! roomCapacity := len(currRenderFrame.PlayersArr) nextRenderFramePlayers := make([]*PlayerDownsync, roomCapacity) // Make a copy first for i, currPlayerDownsync := range currRenderFrame.PlayersArr { nextRenderFramePlayers[i] = &PlayerDownsync{ - Id: currPlayerDownsync.Id, - VirtualGridX: currPlayerDownsync.VirtualGridX, - VirtualGridY: currPlayerDownsync.VirtualGridY, - DirX: currPlayerDownsync.DirX, - DirY: currPlayerDownsync.DirY, - VelX: currPlayerDownsync.VelX, - VelY: currPlayerDownsync.VelY, - CharacterState: currPlayerDownsync.CharacterState, - InAir: true, - Speed: currPlayerDownsync.Speed, - BattleState: currPlayerDownsync.BattleState, - Score: currPlayerDownsync.Score, - Removed: currPlayerDownsync.Removed, - JoinIndex: currPlayerDownsync.JoinIndex, - FramesToRecover: currPlayerDownsync.FramesToRecover - 1, - Hp: currPlayerDownsync.Hp, - MaxHp: currPlayerDownsync.MaxHp, + Id: currPlayerDownsync.Id, + VirtualGridX: currPlayerDownsync.VirtualGridX, + VirtualGridY: currPlayerDownsync.VirtualGridY, + DirX: currPlayerDownsync.DirX, + DirY: currPlayerDownsync.DirY, + VelX: currPlayerDownsync.VelX, + VelY: currPlayerDownsync.VelY, + CharacterState: currPlayerDownsync.CharacterState, + InAir: true, + Speed: currPlayerDownsync.Speed, + BattleState: currPlayerDownsync.BattleState, + Score: currPlayerDownsync.Score, + Removed: currPlayerDownsync.Removed, + JoinIndex: currPlayerDownsync.JoinIndex, + Hp: currPlayerDownsync.Hp, + MaxHp: currPlayerDownsync.MaxHp, + FramesToRecover: currPlayerDownsync.FramesToRecover - 1, + FramesInChState: currPlayerDownsync.FramesInChState + 1, + ActiveSkillId: currPlayerDownsync.ActiveSkillId, + ActiveSkillHit: currPlayerDownsync.ActiveSkillHit, + FramesInvinsible: currPlayerDownsync.FramesInvinsible - 1, + ColliderRadius: currPlayerDownsync.ColliderRadius, } if nextRenderFramePlayers[i].FramesToRecover < 0 { nextRenderFramePlayers[i].FramesToRecover = 0 } + if nextRenderFramePlayers[i].FramesInvinsible < 0 { + nextRenderFramePlayers[i].FramesInvinsible = 0 + } } nextRenderFrameMeleeBullets := make([]*MeleeBullet, 0, len(currRenderFrame.MeleeBullets)) // Is there any better way to reduce malloc/free impact, e.g. smart prediction for fixed memory allocation? effPushbacks := make([]Vec2D, roomCapacity) hardPushbackNorms := make([]*[]Vec2D, roomCapacity) + jumpedOrNotList := make([]bool, roomCapacity) // 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, inputDelayFrames, inputScaleFrames) - if PATTERN_ID_UNABLE_TO_OP == patternId { - continue - } + patternId, jumpedOrNot, effDx, effDy := deriveOpPattern(currPlayerDownsync, thatPlayerInNextFrame, currRenderFrame, inputsBuffer) if jumpedOrNot { - thatPlayerInNextFrame.VelY = jumpingInitVelY - thatPlayerInNextFrame.VirtualGridY += jumpingInitVelY // Immediately gets out of any snapping + thatPlayerInNextFrame.VelY = int32(chConfig.JumpingInitVelY) + jumpedOrNotList[i] = true } joinIndex := currPlayerDownsync.JoinIndex - if PATTERN_ID_NO_OP != patternId { - if skillId, existent := playerOpPatternToSkillId[(int(joinIndex)< thatPlayerInNextFrame.DirX { + xfac = -xfac + } + thatPlayerInNextFrame.VelX = xfac * v.SelfLockVelX + } + if NO_LOCK_VEL != v.SelfLockVelY { + hasLockVel = true + thatPlayerInNextFrame.VelY = v.SelfLockVelY + } + if false == hasLockVel { + if false == currPlayerDownsync.InAir { + thatPlayerInNextFrame.VelX = 0 + } } } - continue + + thatPlayerInNextFrame.CharacterState = skillConfig.BoundChState + continue // Don't allow movement if skill is used } - if 0 != effDx || 0 != effDy { - thatPlayerInNextFrame.DirX, thatPlayerInNextFrame.DirY = effDx, effDy - thatPlayerInNextFrame.VelX = effDx * currPlayerDownsync.Speed - thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_WALKING - } else { - thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_IDLE1 - thatPlayerInNextFrame.VelX = 0 + if 0 == currPlayerDownsync.FramesToRecover { + if 0 != effDx || 0 != effDy { + thatPlayerInNextFrame.DirX, thatPlayerInNextFrame.DirY = effDx, effDy + thatPlayerInNextFrame.VelX = effDx * currPlayerDownsync.Speed + thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_WALKING + } else { + thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_IDLE1 + thatPlayerInNextFrame.VelX = 0 + } } } // 2. Process player movement + playerColliders := make([]*resolv.Object, len(currRenderFrame.PlayersArr), len(currRenderFrame.PlayersArr)) // Will all be removed at the end of this function due to the need for being rollback-compatible for i, currPlayerDownsync := range currRenderFrame.PlayersArr { joinIndex := currPlayerDownsync.JoinIndex effPushbacks[joinIndex-1].X, effPushbacks[joinIndex-1].Y = float64(0), float64(0) - collisionPlayerIndex := COLLISION_PLAYER_INDEX_PREFIX + joinIndex - playerCollider := collisionSysMap[collisionPlayerIndex] - 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 + } - playerCollider.X, playerCollider.Y = VirtualGridToPolygonColliderBLPos(newVx, newVy, playerCollider.W*0.5, playerCollider.H*0.5, 0, 0, 0, 0, collisionSpaceOffsetX, collisionSpaceOffsetY, virtualGridToWorldRatio) - // Update in the collision system - playerCollider.Update() + wx, wy := VirtualGridToWorldPos(newVx, newVy) + colliderWidth, colliderHeight := currPlayerDownsync.ColliderRadius*2, currPlayerDownsync.ColliderRadius*4 + 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: + colliderWidth, colliderHeight = currPlayerDownsync.ColliderRadius*2, currPlayerDownsync.ColliderRadius*2 + } + colliderWorldWidth, colliderWorldHeight := VirtualGridToWorldPos(colliderWidth, colliderHeight) + + playerCollider := GenerateRectCollider(wx, wy, colliderWorldWidth, colliderWorldHeight, SNAP_INTO_PLATFORM_OVERLAP, SNAP_INTO_PLATFORM_OVERLAP, SNAP_INTO_PLATFORM_OVERLAP, SNAP_INTO_PLATFORM_OVERLAP, collisionSpaceOffsetX, collisionSpaceOffsetY, currPlayerDownsync, "Player") // the coords of all barrier boundaries are multiples of tileWidth(i.e. 16), by adding snapping y-padding when "landedOnGravityPushback" all "playerCollider.Y" would be a multiple of 1.0 + playerColliders[i] = playerCollider + + // Add to collision system + collisionSys.Add(playerCollider) + + thatPlayerInNextFrame := nextRenderFramePlayers[i] if currPlayerDownsync.InAir { - thatPlayerInNextFrame.VelX += gravityX - thatPlayerInNextFrame.VelY += gravityY + thatPlayerInNextFrame.VelX += GRAVITY_X + thatPlayerInNextFrame.VelY += GRAVITY_Y } } @@ -474,13 +579,13 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer if (meleeBullet.OriginatedRenderFrameId+meleeBullet.StartupFrames <= currRenderFrame.Id) && (meleeBullet.OriginatedRenderFrameId+meleeBullet.StartupFrames+meleeBullet.ActiveFrames > currRenderFrame.Id) { offender := currRenderFrame.PlayersArr[meleeBullet.OffenderJoinIndex-1] - xfac := float64(1.0) // By now, straight Punch offset doesn't respect "y-axis" + xfac := int32(1) // By now, straight Punch offset doesn't respect "y-axis" if 0 > offender.DirX { - xfac = float64(-1.0) + xfac = -xfac } - offenderWx, offenderWy := VirtualGridToWorldPos(offender.VirtualGridX, offender.VirtualGridY, virtualGridToWorldRatio) - bulletWx, bulletWy := offenderWx+xfac*meleeBullet.HitboxOffset, offenderWy - newBulletCollider := GenerateRectCollider(bulletWx, bulletWy, meleeBullet.HitboxSizeX, meleeBullet.HitboxSizeY, snapIntoPlatformOverlap, snapIntoPlatformOverlap, snapIntoPlatformOverlap, snapIntoPlatformOverlap, collisionSpaceOffsetX, collisionSpaceOffsetY, meleeBullet, "MeleeBullet") + bulletWx, bulletWy := VirtualGridToWorldPos(offender.VirtualGridX+xfac*meleeBullet.HitboxOffsetX, offender.VirtualGridY) + hitboxSizeWx, hitboxSizeWy := VirtualGridToWorldPos(meleeBullet.HitboxSizeX, meleeBullet.HitboxSizeY) + newBulletCollider := GenerateRectCollider(bulletWx, bulletWy, hitboxSizeWx, hitboxSizeWy, SNAP_INTO_PLATFORM_OVERLAP, SNAP_INTO_PLATFORM_OVERLAP, SNAP_INTO_PLATFORM_OVERLAP, SNAP_INTO_PLATFORM_OVERLAP, collisionSpaceOffsetX, collisionSpaceOffsetY, meleeBullet, "MeleeBullet") collisionSys.Add(newBulletCollider) bulletColliders = append(bulletColliders, newBulletCollider) } else { @@ -491,12 +596,13 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer // 4. Calc pushbacks for each player (after its movement) w/o bullets for i, currPlayerDownsync := range currRenderFrame.PlayersArr { joinIndex := currPlayerDownsync.JoinIndex - collisionPlayerIndex := COLLISION_PLAYER_INDEX_PREFIX + joinIndex - playerCollider := collisionSysMap[collisionPlayerIndex] + playerCollider := playerColliders[i] playerShape := playerCollider.Shape.(*resolv.ConvexPolygon) - hardPushbackNorms[joinIndex-1] = calcHardPushbacksNorms(joinIndex, playerCollider, playerShape, snapIntoPlatformOverlap, &(effPushbacks[joinIndex-1])) + hardPushbackNorms[joinIndex-1] = calcHardPushbacksNorms(joinIndex, playerCollider, playerShape, SNAP_INTO_PLATFORM_OVERLAP, &(effPushbacks[joinIndex-1])) thatPlayerInNextFrame := nextRenderFramePlayers[i] + chConfig := chConfigsOrderedByJoinIndex[i] landedOnGravityPushback := false + if collision := playerCollider.Check(0, 0); nil != collision { for _, obj := range collision.Objects { isBarrier, isAnotherPlayer, isBullet := false, false, false @@ -521,7 +627,7 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer normAlignmentWithGravity := (overlapResult.OverlapX*float64(0) + overlapResult.OverlapY*float64(-1.0)) if isAnotherPlayer { // [WARNING] The "zero overlap collision" might be randomly detected/missed on either frontend or backend, to have deterministic result we added paddings to all sides of a playerCollider. As each velocity component of (velX, velY) being a multiple of 0.5 at any renderFrame, each position component of (x, y) can only be a multiple of 0.5 too, thus whenever a 1-dimensional collision happens between players from [player#1: i*0.5, player#2: j*0.5, not collided yet] to [player#1: (i+k)*0.5, player#2: j*0.5, collided], the overlap becomes (i+k-j)*0.5+2*s, and after snapping subtraction the effPushback magnitude for each player is (i+k-j)*0.5, resulting in 0.5-multiples-position for the next renderFrame. - pushbackX, pushbackY = (overlapResult.Overlap-snapIntoPlatformOverlap*2)*overlapResult.OverlapX, (overlapResult.Overlap-snapIntoPlatformOverlap*2)*overlapResult.OverlapY + pushbackX, pushbackY = (overlapResult.Overlap-SNAP_INTO_PLATFORM_OVERLAP*2)*overlapResult.OverlapX, (overlapResult.Overlap-SNAP_INTO_PLATFORM_OVERLAP*2)*overlapResult.OverlapY } for _, hardPushbackNorm := range *hardPushbackNorms[joinIndex-1] { projectedMagnitude := pushbackX*hardPushbackNorm.X + pushbackY*hardPushbackNorm.Y @@ -533,7 +639,7 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer effPushbacks[joinIndex-1].X += pushbackX effPushbacks[joinIndex-1].Y += pushbackY - if snapIntoPlatformThreshold < normAlignmentWithGravity { + if SNAP_INTO_PLATFORM_THRESHOLD < normAlignmentWithGravity { landedOnGravityPushback = true //playerColliderCenterX, playerColliderCenterY := playerCollider.Center() //fmt.Printf("joinIndex=%d landedOnGravityPushback\n{renderFrame.id: %d, isBarrier: %v, isAnotherPlayer: %v}\nhardPushbackNormsOfThisPlayer=%v, playerColliderPos=(%.2f,%.2f), immediatePushback={%.3f, %.3f}, effPushback={%.3f, %.3f}, overlapMag=%.4f\n", joinIndex, currRenderFrame.Id, isBarrier, isAnotherPlayer, *hardPushbackNorms[joinIndex-1], playerColliderCenterX, playerColliderCenterY, pushbackX, pushbackY, effPushbacks[joinIndex-1].X, effPushbacks[joinIndex-1].Y, overlapResult.Overlap) @@ -544,75 +650,86 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer thatPlayerInNextFrame.InAir = false if currPlayerDownsync.InAir && 0 >= currPlayerDownsync.VelY { // fallStopping - thatPlayerInNextFrame.VelX = 0 thatPlayerInNextFrame.VelY = 0 - thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_IDLE1 - thatPlayerInNextFrame.FramesToRecover = 0 - } - } - if currPlayerDownsync.InAir { - oldNextCharacterState := thatPlayerInNextFrame.CharacterState - switch oldNextCharacterState { - case ATK_CHARACTER_STATE_IDLE1, ATK_CHARACTER_STATE_WALKING: - thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_INAIR_IDLE1 - case ATK_CHARACTER_STATE_ATK1: - thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_INAIR_ATK1 - case ATK_CHARACTER_STATE_ATKED1: - thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_INAIR_ATKED1 + 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 { + 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 + } + } + } else { + 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 + thatPlayerInNextFrame.FramesToRecover = chConfig.GetUpFramesToRecover + } + } else if ATK_CHARACTER_STATE_GET_UP1 == thatPlayerInNextFrame.CharacterState { + if 0 == thatPlayerInNextFrame.FramesToRecover { + thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_IDLE1 + thatPlayerInNextFrame.FramesInvinsible = chConfig.GetUpInvinsibleFrames + } + } + } } } } // 5. Check bullet-anything collisions for _, bulletCollider := range bulletColliders { - meleeBullet := bulletCollider.Data.(*MeleeBullet) - bulletShape := bulletCollider.Shape.(*resolv.ConvexPolygon) collision := bulletCollider.Check(0, 0) bulletCollider.Space.Remove(bulletCollider) // Make sure that the bulletCollider is always removed for each renderFrame - if nil == collision { - nextRenderFrameMeleeBullets = append(nextRenderFrameMeleeBullets, meleeBullet) - continue - } - offender := currRenderFrame.PlayersArr[meleeBullet.OffenderJoinIndex-1] - for _, obj := range collision.Objects { - defenderShape := obj.Shape.(*resolv.ConvexPolygon) - switch t := obj.Data.(type) { - case *PlayerDownsync: - if meleeBullet.OffenderPlayerId == t.Id { - continue - } - overlapped, _, _, _ := CalcPushbacks(0, 0, bulletShape, defenderShape) - if !overlapped { - continue - } - joinIndex := t.JoinIndex - xfac := float64(1.0) // By now, straight Punch offset doesn't respect "y-axis" - if 0 > offender.DirX { - xfac = float64(-1.0) - } - pushbackX, pushbackY := -xfac*meleeBullet.Pushback, float64(0) - - for _, hardPushbackNorm := range *hardPushbackNorms[joinIndex-1] { - projectedMagnitude := pushbackX*hardPushbackNorm.X + pushbackY*hardPushbackNorm.Y - if 0 > projectedMagnitude { - //fmt.Printf("defenderPlayerId=%d, joinIndex=%d reducing bullet pushback={%.3f, %.3f} by {%.3f, %.3f} where hardPushbackNorm={%.3f, %.3f}, projectedMagnitude=%.3f at renderFrame.id=%d", t.Id, joinIndex, pushbackX, pushbackY, projectedMagnitude*hardPushbackNorm.X, projectedMagnitude*hardPushbackNorm.Y, hardPushbackNorm.X, hardPushbackNorm.Y, projectedMagnitude, currRenderFrame.Id) - pushbackX -= projectedMagnitude * hardPushbackNorm.X - pushbackY -= projectedMagnitude * hardPushbackNorm.Y + switch v := bulletCollider.Data.(type) { + case *MeleeBullet: + if nil == collision { + nextRenderFrameMeleeBullets = append(nextRenderFrameMeleeBullets, v) + continue + } + bulletShape := bulletCollider.Shape.(*resolv.ConvexPolygon) + offender := currRenderFrame.PlayersArr[v.OffenderJoinIndex-1] + for _, obj := range collision.Objects { + defenderShape := obj.Shape.(*resolv.ConvexPolygon) + switch t := obj.Data.(type) { + case *PlayerDownsync: + if v.OffenderJoinIndex == t.JoinIndex { + continue } + if _, existent := invinsibleSet[t.CharacterState]; existent { + continue + } + if 0 < t.FramesInvinsible { + continue + } + overlapped, _, _, _ := CalcPushbacks(0, 0, bulletShape, defenderShape) + if !overlapped { + continue + } + xfac := int32(1) // By now, straight Punch offset doesn't respect "y-axis" + if 0 > offender.DirX { + xfac = -xfac + } + pushbackVelX, pushbackVelY := xfac*v.PushbackVelX, v.PushbackVelY + atkedPlayerInNextFrame := nextRenderFramePlayers[t.JoinIndex-1] + atkedPlayerInNextFrame.VelX = pushbackVelX + atkedPlayerInNextFrame.VelY = pushbackVelY + if v.BlowUp { + atkedPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_BLOWN_UP1 + } else { + atkedPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_ATKED1 + } + oldFramesToRecover := nextRenderFramePlayers[t.JoinIndex-1].FramesToRecover + if v.HitStunFrames > oldFramesToRecover { + atkedPlayerInNextFrame.FramesToRecover = v.HitStunFrames + } + default: } - - effPushbacks[joinIndex-1].X += pushbackX - effPushbacks[joinIndex-1].Y += pushbackY - atkedPlayerInCurFrame, atkedPlayerInNextFrame := currRenderFrame.PlayersArr[t.JoinIndex-1], nextRenderFramePlayers[t.JoinIndex-1] - atkedPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_ATKED1 - if atkedPlayerInCurFrame.InAir { - atkedPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_INAIR_ATKED1 - } - oldFramesToRecover := nextRenderFramePlayers[t.JoinIndex-1].FramesToRecover - if meleeBullet.HitStunFrames > oldFramesToRecover { - atkedPlayerInNextFrame.FramesToRecover = meleeBullet.HitStunFrames - } - default: } } } @@ -620,11 +737,43 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer // 6. Get players out of stuck barriers if there's any for i, currPlayerDownsync := range currRenderFrame.PlayersArr { joinIndex := currPlayerDownsync.JoinIndex - collisionPlayerIndex := COLLISION_PLAYER_INDEX_PREFIX + joinIndex - playerCollider := collisionSysMap[collisionPlayerIndex] + playerCollider := playerColliders[i] // Update "virtual grid position" thatPlayerInNextFrame := nextRenderFramePlayers[i] - thatPlayerInNextFrame.VirtualGridX, thatPlayerInNextFrame.VirtualGridY = PolygonColliderBLToVirtualGridPos(playerCollider.X-effPushbacks[joinIndex-1].X, playerCollider.Y-effPushbacks[joinIndex-1].Y, playerCollider.W*0.5, playerCollider.H*0.5, 0, 0, 0, 0, collisionSpaceOffsetX, collisionSpaceOffsetY, worldToVirtualGridRatio) + thatPlayerInNextFrame.VirtualGridX, thatPlayerInNextFrame.VirtualGridY = PolygonColliderBLToVirtualGridPos(playerCollider.X-effPushbacks[joinIndex-1].X, playerCollider.Y-effPushbacks[joinIndex-1].Y, playerCollider.W*0.5, playerCollider.H*0.5, 0, 0, 0, 0, collisionSpaceOffsetX, collisionSpaceOffsetY) + + // Update "CharacterState" + if thatPlayerInNextFrame.InAir { + oldNextCharacterState := thatPlayerInNextFrame.CharacterState + switch oldNextCharacterState { + case ATK_CHARACTER_STATE_IDLE1, ATK_CHARACTER_STATE_WALKING: + 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 + case ATK_CHARACTER_STATE_ATKED1: + thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_INAIR_ATKED1 + } + } + + // Reset "FramesInChState" if "CharacterState" is changed + if thatPlayerInNextFrame.CharacterState != currPlayerDownsync.CharacterState { + thatPlayerInNextFrame.FramesInChState = 0 + } + + // Remove any active skill if not attacking + if _, existent := nonAttackingSet[thatPlayerInNextFrame.CharacterState]; existent { + thatPlayerInNextFrame.ActiveSkillId = int32(NO_SKILL) + thatPlayerInNextFrame.ActiveSkillHit = int32(NO_SKILL_HIT) + } + } + + for _, playerCollider := range playerColliders { + playerCollider.Space.Remove(playerCollider) } return &RoomDownsyncFrame{ diff --git a/jsexport/battle/characterConfig.go b/jsexport/battle/characterConfig.go new file mode 100644 index 0000000..c8ab482 --- /dev/null +++ b/jsexport/battle/characterConfig.go @@ -0,0 +1,348 @@ +package battle + +type SkillMapperType func(patternId int, currPlayerDownsync *PlayerDownsync) int + +type CharacterConfig struct { + SpeciesId int + SpeciesName string + + InAirIdleFrameIdxTurningPoint int + InAirIdleFrameIdxTurnedCycle int + + LayDownFrames int32 + LayDownFramesToRecover int32 + + GetUpInvinsibleFrames int32 + GetUpFramesToRecover int32 + + Speed int32 + JumpingInitVelY int32 + + SkillMapper SkillMapperType +} + +var Characters = map[int]*CharacterConfig{ + 0: &CharacterConfig{ + SpeciesId: 0, + SpeciesName: "MonkGirl", + + InAirIdleFrameIdxTurningPoint: 11, + InAirIdleFrameIdxTurnedCycle: 1, + + LayDownFrames: int32(16), + LayDownFramesToRecover: int32(16), + + GetUpInvinsibleFrames: int32(10), + GetUpFramesToRecover: int32(27), + + Speed: int32(float64(1.2) * WORLD_TO_VIRTUAL_GRID_RATIO), + JumpingInitVelY: int32(float64(8) * WORLD_TO_VIRTUAL_GRID_RATIO), + + SkillMapper: func(patternId int, currPlayerDownsync *PlayerDownsync) int { + if 1 == patternId { + if 0 == currPlayerDownsync.FramesToRecover { + if currPlayerDownsync.InAir { + return 255 + } else { + return 1 + } + } else { + // Now that "0 < FramesToRecover", we're only able to fire any skill if it's a cancellation + if skillConfig, existent1 := skills[int(currPlayerDownsync.ActiveSkillId)]; existent1 { + switch v := skillConfig.Hits[currPlayerDownsync.ActiveSkillHit].(type) { + case *MeleeBullet: + if v.CancellableStFrame <= currPlayerDownsync.FramesInChState && currPlayerDownsync.FramesInChState < v.CancellableEdFrame { + if nextSkillId, existent2 := v.CancelTransit[patternId]; existent2 { + return nextSkillId + } + } + } + } + } + } + + // By default no skill can be fired + return NO_SKILL + }, + }, + 1: &CharacterConfig{ + SpeciesId: 1, + SpeciesName: "KnifeGirl", + + InAirIdleFrameIdxTurningPoint: 9, + InAirIdleFrameIdxTurnedCycle: 1, + + LayDownFrames: int32(16), + LayDownFramesToRecover: int32(16), + + GetUpInvinsibleFrames: int32(10), + GetUpFramesToRecover: int32(27), + + Speed: int32(float64(1.4) * WORLD_TO_VIRTUAL_GRID_RATIO), + JumpingInitVelY: int32(float64(7.5) * WORLD_TO_VIRTUAL_GRID_RATIO), + + SkillMapper: func(patternId int, currPlayerDownsync *PlayerDownsync) int { + if 1 == patternId { + if 0 == currPlayerDownsync.FramesToRecover { + if currPlayerDownsync.InAir { + return 256 + } else { + return 4 + } + } else { + // Now that "0 < FramesToRecover", we're only able to fire any skill if it's a cancellation + if skillConfig, existent1 := skills[int(currPlayerDownsync.ActiveSkillId)]; existent1 { + switch v := skillConfig.Hits[currPlayerDownsync.ActiveSkillHit].(type) { + case *MeleeBullet: + if v.CancellableStFrame <= currPlayerDownsync.FramesInChState && currPlayerDownsync.FramesInChState < v.CancellableEdFrame { + if nextSkillId, existent2 := v.CancelTransit[patternId]; existent2 { + return nextSkillId + } + } + } + } + } + } + + // By default no skill can be fired + return NO_SKILL + }, + }, +} + +var skills = map[int]*Skill{ + 1: &Skill{ + RecoveryFrames: int32(30), + RecoveryFramesOnBlock: int32(30), + RecoveryFramesOnHit: int32(30), + ReleaseTriggerType: int32(1), + BoundChState: ATK_CHARACTER_STATE_ATK1, + Hits: []interface{}{ + &MeleeBullet{ + Bullet: Bullet{ + StartupFrames: int32(7), + ActiveFrames: int32(22), + HitStunFrames: int32(13), + BlockStunFrames: int32(9), + Damage: int32(5), + SelfLockVelX: int32(float64(0.05) * WORLD_TO_VIRTUAL_GRID_RATIO), + SelfLockVelY: NO_LOCK_VEL, + PushbackVelX: int32(float64(0.5) * WORLD_TO_VIRTUAL_GRID_RATIO), + PushbackVelY: int32(0), + HitboxOffsetX: int32(float64(12) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxOffsetY: int32(0), + HitboxSizeX: int32(float64(24) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxSizeY: int32(float64(32) * WORLD_TO_VIRTUAL_GRID_RATIO), + CancellableStFrame: int32(13), + CancellableEdFrame: int32(30), + + CancelTransit: map[int]int{ + 1: 2, + }, + // TODO: Use non-zero "selfLockVel" + }, + }, + }, + }, + 2: &Skill{ + RecoveryFrames: int32(36), + RecoveryFramesOnBlock: int32(36), + RecoveryFramesOnHit: int32(36), + ReleaseTriggerType: int32(1), + BoundChState: ATK_CHARACTER_STATE_ATK2, + Hits: []interface{}{ + &MeleeBullet{ + Bullet: Bullet{ + StartupFrames: int32(18), + ActiveFrames: int32(18), + HitStunFrames: int32(18), + BlockStunFrames: int32(9), + Damage: int32(5), + SelfLockVelX: int32(float64(0.1) * WORLD_TO_VIRTUAL_GRID_RATIO), + SelfLockVelY: NO_LOCK_VEL, + PushbackVelX: int32(float64(0.5) * WORLD_TO_VIRTUAL_GRID_RATIO), + PushbackVelY: int32(0), + HitboxOffsetX: int32(float64(18) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxOffsetY: int32(0), + HitboxSizeX: int32(float64(24) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxSizeY: int32(float64(32) * WORLD_TO_VIRTUAL_GRID_RATIO), + CancellableStFrame: int32(22), + CancellableEdFrame: int32(36), + CancelTransit: map[int]int{ + 1: 3, + }, + }, + }, + }, + }, + 3: &Skill{ + RecoveryFrames: int32(50), + RecoveryFramesOnBlock: int32(50), + RecoveryFramesOnHit: int32(50), + ReleaseTriggerType: int32(1), + BoundChState: ATK_CHARACTER_STATE_ATK3, + Hits: []interface{}{ + &MeleeBullet{ + Bullet: Bullet{ + StartupFrames: int32(15), + ActiveFrames: int32(30), + HitStunFrames: MAX_INT32, + BlockStunFrames: int32(9), + Damage: int32(10), + SelfLockVelX: int32(float64(0.5) * WORLD_TO_VIRTUAL_GRID_RATIO), + SelfLockVelY: int32(float64(5) * WORLD_TO_VIRTUAL_GRID_RATIO), + PushbackVelX: int32(float64(2) * WORLD_TO_VIRTUAL_GRID_RATIO), + PushbackVelY: int32(float64(7) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxOffsetX: int32(float64(32) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxOffsetY: int32(0), + HitboxSizeX: int32(float64(48) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxSizeY: int32(float64(32) * WORLD_TO_VIRTUAL_GRID_RATIO), + BlowUp: true, + }, + }, + }, + }, + 4: &Skill{ + RecoveryFrames: int32(30), + RecoveryFramesOnBlock: int32(30), + RecoveryFramesOnHit: int32(30), + ReleaseTriggerType: int32(1), + BoundChState: ATK_CHARACTER_STATE_ATK1, + Hits: []interface{}{ + &MeleeBullet{ + Bullet: Bullet{ + StartupFrames: int32(7), + ActiveFrames: int32(22), + HitStunFrames: int32(13), + BlockStunFrames: int32(9), + Damage: int32(5), + SelfLockVelX: int32(float64(0.05) * WORLD_TO_VIRTUAL_GRID_RATIO), + SelfLockVelY: NO_LOCK_VEL, + PushbackVelX: int32(float64(0.5) * WORLD_TO_VIRTUAL_GRID_RATIO), + PushbackVelY: int32(0), + HitboxOffsetX: int32(float64(12) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxOffsetY: int32(0), + HitboxSizeX: int32(float64(24) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxSizeY: int32(float64(32) * WORLD_TO_VIRTUAL_GRID_RATIO), + CancellableStFrame: int32(13), + CancellableEdFrame: int32(30), + + CancelTransit: map[int]int{ + 1: 5, + }, + // TODO: Use non-zero "selfLockVel" + }, + }, + }, + }, + 5: &Skill{ + RecoveryFrames: int32(36), + RecoveryFramesOnBlock: int32(36), + RecoveryFramesOnHit: int32(36), + ReleaseTriggerType: int32(1), + BoundChState: ATK_CHARACTER_STATE_ATK2, + Hits: []interface{}{ + &MeleeBullet{ + Bullet: Bullet{ + StartupFrames: int32(18), + ActiveFrames: int32(18), + HitStunFrames: int32(18), + BlockStunFrames: int32(9), + Damage: int32(5), + SelfLockVelX: int32(float64(0.1) * WORLD_TO_VIRTUAL_GRID_RATIO), + SelfLockVelY: NO_LOCK_VEL, + PushbackVelX: int32(float64(0.5) * WORLD_TO_VIRTUAL_GRID_RATIO), + PushbackVelY: int32(0), + HitboxOffsetX: int32(float64(18) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxOffsetY: int32(0), + HitboxSizeX: int32(float64(24) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxSizeY: int32(float64(32) * WORLD_TO_VIRTUAL_GRID_RATIO), + CancellableStFrame: int32(22), + CancellableEdFrame: int32(36), + CancelTransit: map[int]int{ + 1: 6, + }, + }, + }, + }, + }, + 6: &Skill{ + RecoveryFrames: int32(45), + RecoveryFramesOnBlock: int32(45), + RecoveryFramesOnHit: int32(45), + ReleaseTriggerType: int32(1), + BoundChState: ATK_CHARACTER_STATE_ATK3, + Hits: []interface{}{ + &MeleeBullet{ + Bullet: Bullet{ + StartupFrames: int32(15), + ActiveFrames: int32(28), + HitStunFrames: MAX_INT32, + BlockStunFrames: int32(9), + Damage: int32(10), + SelfLockVelX: int32(float64(-0.1) * WORLD_TO_VIRTUAL_GRID_RATIO), + SelfLockVelY: NO_LOCK_VEL, + PushbackVelX: int32(float64(2) * WORLD_TO_VIRTUAL_GRID_RATIO), + PushbackVelY: int32(float64(7) * 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), + HitboxSizeY: int32(float64(32) * WORLD_TO_VIRTUAL_GRID_RATIO), + BlowUp: true, + }, + }, + }, + }, + 255: &Skill{ + RecoveryFrames: int32(30), + RecoveryFramesOnBlock: int32(30), + RecoveryFramesOnHit: int32(30), + ReleaseTriggerType: int32(1), + BoundChState: ATK_CHARACTER_STATE_INAIR_ATK1, + Hits: []interface{}{ + &MeleeBullet{ + Bullet: Bullet{ + StartupFrames: int32(3), + ActiveFrames: int32(20), + HitStunFrames: int32(18), + BlockStunFrames: int32(9), + Damage: int32(5), + SelfLockVelX: NO_LOCK_VEL, + SelfLockVelY: NO_LOCK_VEL, + PushbackVelX: int32(float64(0.5) * WORLD_TO_VIRTUAL_GRID_RATIO), + PushbackVelY: int32(0), + HitboxOffsetX: int32(float64(12) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxOffsetY: int32(0), + HitboxSizeX: int32(float64(32) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxSizeY: int32(float64(24) * WORLD_TO_VIRTUAL_GRID_RATIO), + }, + }, + }, + }, + 256: &Skill{ + RecoveryFrames: int32(20), + RecoveryFramesOnBlock: int32(20), + RecoveryFramesOnHit: int32(20), + ReleaseTriggerType: int32(1), + BoundChState: ATK_CHARACTER_STATE_INAIR_ATK1, + Hits: []interface{}{ + &MeleeBullet{ + Bullet: Bullet{ + StartupFrames: int32(3), + ActiveFrames: int32(10), + HitStunFrames: int32(15), + BlockStunFrames: int32(9), + Damage: int32(5), + SelfLockVelX: NO_LOCK_VEL, + SelfLockVelY: NO_LOCK_VEL, + PushbackVelX: int32(float64(0.5) * WORLD_TO_VIRTUAL_GRID_RATIO), + PushbackVelY: int32(0), + HitboxOffsetX: int32(float64(12) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxOffsetY: int32(0), + HitboxSizeX: int32(float64(32) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxSizeY: int32(float64(24) * WORLD_TO_VIRTUAL_GRID_RATIO), + }, + }, + }, + }, +} diff --git a/jsexport/battle/room_downsync_frame.go b/jsexport/battle/room_downsync_frame.go index 3bc65a7..52f99fd 100644 --- a/jsexport/battle/room_downsync_frame.go +++ b/jsexport/battle/room_downsync_frame.go @@ -23,15 +23,21 @@ type PlayerDownsync struct { Speed int32 BattleState int32 JoinIndex int32 - ColliderRadius float64 + ColliderRadius int32 Removed bool Score int32 LastMoveGmtMillis int32 FramesToRecover int32 + FramesInChState int32 Hp int32 MaxHp int32 CharacterState int32 InAir bool + + ActiveSkillId int32 + ActiveSkillHit int32 + + FramesInvinsible int32 } type InputFrameDecoded struct { @@ -52,27 +58,31 @@ type Barrier struct { type Bullet struct { // for offender - BattleLocalId int32 - StartupFrames int32 + OriginatedRenderFrameId int32 // Copied from the first bullet for all subsequent bullets + OffenderJoinIndex int32 // Copied to favor collision handling of the dispatched bullet + StartupFrames int32 // from "OriginatedRenderFrameId" + CancellableStFrame int32 // from "OriginatedRenderFrameId" + CancellableEdFrame int32 // from "OriginatedRenderFrameId" ActiveFrames int32 - RecoveryFrames int32 - RecoveryFramesOnBlock int32 - RecoveryFramesOnHit int32 - HitboxOffset float64 - OriginatedRenderFrameId int32 - // for defender - HitStunFrames int32 - BlockStunFrames int32 - Pushback float64 - ReleaseTriggerType int32 - Damage int32 - OffenderJoinIndex int32 - OffenderPlayerId int32 - SelfMoveforwardX float64 - SelfMoveforwardY float64 - HitboxSizeX float64 - HitboxSizeY float64 + // for defender + HitStunFrames int32 + BlockStunFrames int32 + PushbackVelX int32 + PushbackVelY int32 + Damage int32 + + SelfLockVelX int32 + SelfLockVelY int32 + + HitboxOffsetX int32 + HitboxOffsetY int32 + HitboxSizeX int32 + HitboxSizeY int32 + + BlowUp bool + + CancelTransit map[int]int } type MeleeBullet struct { @@ -90,6 +100,16 @@ type FireballBullet struct { Bullet } +type Skill struct { + BattleLocalId int32 + RecoveryFrames int32 + RecoveryFramesOnBlock int32 + RecoveryFramesOnHit int32 + ReleaseTriggerType int32 // 1: rising-edge, 2: falling-edge + BoundChState int32 + Hits []interface{} // Hits within a "Skill" are automatically triggered +} + type RoomDownsyncFrame struct { Id int32 PlayersArr []*PlayerDownsync diff --git a/jsexport/main.go b/jsexport/main.go index 6f6cf68..73c1ed8 100644 --- a/jsexport/main.go +++ b/jsexport/main.go @@ -42,50 +42,57 @@ func NewBarrierJs(boundary *Polygon2D) *js.Object { }) } -func NewPlayerDownsyncJs(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, framesToRecover, speed, battleState, characterState, joinIndex, hp, maxHp int32, inAir bool, colliderRadius float64) *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) *js.Object { return js.MakeWrapper(&PlayerDownsync{ - Id: id, - VirtualGridX: virtualGridX, - VirtualGridY: virtualGridY, - DirX: dirX, - DirY: dirY, - VelX: velX, - VelY: velY, - FramesToRecover: framesToRecover, - Speed: speed, - BattleState: battleState, - JoinIndex: joinIndex, - ColliderRadius: colliderRadius, - Hp: hp, - MaxHp: maxHp, - CharacterState: characterState, - InAir: inAir, + Id: id, + VirtualGridX: virtualGridX, + VirtualGridY: virtualGridY, + DirX: dirX, + DirY: dirY, + VelX: velX, + VelY: velY, + FramesToRecover: framesToRecover, + FramesInChState: framesInChState, + ActiveSkillId: activeSkillId, + ActiveSkillHit: activeSkillHit, + FramesInvinsible: framesInvinsible, + Speed: speed, + BattleState: battleState, + CharacterState: characterState, + JoinIndex: joinIndex, + Hp: hp, + MaxHp: maxHp, + ColliderRadius: colliderRadius, + InAir: inAir, }) } -func NewMeleeBulletJs(battleLocalId, startupFrames, activeFrames, recoveryFrames, recoveryFramesOnBlock, recoveryFramesOnHit, hitStunFrames, blockStunFrames, releaseTriggerType, damage, offenderJoinIndex, offenderPlayerId int32, pushback, hitboxOffset, selfMoveforwardX, selfMoveforwardY, hitboxSizeX, hitboxSizeY float64) *js.Object { +func NewMeleeBulletJs(originatedRenderFrameId, offenderJoinIndex, startupFrames, cancellableStFrame, cancellableEdFrame, activeFrames, hitStunFrames, blockStunFrames, pushbackVelX, pushbackVelY, damage, selfLockVelX, selfLockVelY, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY int32, blowUp bool) *js.Object { return js.MakeWrapper(&MeleeBullet{ Bullet: Bullet{ - BattleLocalId: battleLocalId, - StartupFrames: startupFrames, - ActiveFrames: activeFrames, - RecoveryFrames: recoveryFrames, - RecoveryFramesOnBlock: recoveryFramesOnBlock, - RecoveryFramesOnHit: recoveryFramesOnHit, - HitboxOffset: hitboxOffset, - HitStunFrames: hitStunFrames, - BlockStunFrames: blockStunFrames, - Pushback: pushback, - ReleaseTriggerType: releaseTriggerType, - Damage: damage, + OriginatedRenderFrameId: originatedRenderFrameId, + OffenderJoinIndex: offenderJoinIndex, - SelfMoveforwardX: selfMoveforwardX, - SelfMoveforwardY: selfMoveforwardY, - HitboxSizeX: hitboxSizeX, - HitboxSizeY: hitboxSizeY, + StartupFrames: startupFrames, + CancellableStFrame: cancellableStFrame, + CancellableEdFrame: cancellableEdFrame, + ActiveFrames: activeFrames, - OffenderJoinIndex: offenderJoinIndex, - OffenderPlayerId: offenderPlayerId, + HitStunFrames: hitStunFrames, + BlockStunFrames: blockStunFrames, + PushbackVelX: pushbackVelX, + PushbackVelY: pushbackVelY, + Damage: damage, + + SelfLockVelX: selfLockVelX, + SelfLockVelY: selfLockVelY, + + HitboxOffsetX: hitboxOffsetX, + HitboxOffsetY: hitboxOffsetY, + HitboxSizeX: hitboxSizeX, + HitboxSizeY: hitboxSizeY, + + BlowUp: blowUp, }, }) } @@ -109,18 +116,19 @@ func GetCollisionSpaceObjsJs(space *resolv.Space) []*js.Object { return ret } -func GenerateRectColliderJs(wx, wy, w, h, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY float64, data interface{}, tag string) *js.Object { +func GenerateRectColliderJs(wx, wy, w, h, spaceOffsetX, spaceOffsetY float64, data interface{}, tag string) *js.Object { /* [WARNING] It's important to note that we don't need "js.MakeFullWrapper" for a call sequence as follows. ``` var space = gopkgs.NewCollisionSpaceJs(2048, 2048, 8, 8); - var a = gopkgs.GenerateRectColliderJs(189, 497, 48, 48, snapIntoPlatformOverlap, snapIntoPlatformOverlap, snapIntoPlatformOverlap, snapIntoPlatformOverlap, spaceOffsetX, spaceOffsetY, "Player"); + var a = gopkgs.GenerateRectColliderJs(189, 497, 48, 48, spaceOffsetX, spaceOffsetY, "Player"); space.Add(a); ``` The "space" variable doesn't need access to the field of "a" in JavaScript level to run "space.Add(...)" method, which is good. However, the full wrapper access here is used for updating "collider.X/collider.Y" at JavaScript runtime. */ + topPadding, bottomPadding, leftPadding, rightPadding := SNAP_INTO_PLATFORM_OVERLAP, SNAP_INTO_PLATFORM_OVERLAP, SNAP_INTO_PLATFORM_OVERLAP, SNAP_INTO_PLATFORM_OVERLAP return js.MakeFullWrapper(GenerateRectCollider(wx, wy, w, h, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, data, tag)) } @@ -129,27 +137,43 @@ func GenerateConvexPolygonColliderJs(unalignedSrc *Polygon2D, spaceOffsetX, spac return js.MakeFullWrapper(GenerateConvexPolygonCollider(unalignedSrc, spaceOffsetX, spaceOffsetY, data, tag)) } -func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs(inputsBuffer *RingBuffer, currRenderFrame *RoomDownsyncFrame, collisionSys *resolv.Space, collisionSysMap map[int32]*resolv.Object, gravityX, gravityY, jumpingInitVelY, inputDelayFrames int32, inputScaleFrames uint32, collisionSpaceOffsetX, collisionSpaceOffsetY, snapIntoPlatformOverlap, snapIntoPlatformThreshold, worldToVirtualGridRatio, virtualGridToWorldRatio float64, playerOpPatternToSkillId map[int]int) *js.Object { +func GetCharacterConfigsOrderedByJoinIndex(speciesIdList []int) []*js.Object { + ret := make([]*js.Object, len(speciesIdList), len(speciesIdList)) + for i, speciesId := range speciesIdList { + ret[i] = js.MakeFullWrapper(Characters[speciesId]) + } + return ret +} + +func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs(inputsBuffer *RingBuffer, currRenderFrame *RoomDownsyncFrame, collisionSys *resolv.Space, collisionSysMap map[int32]*resolv.Object, collisionSpaceOffsetX, collisionSpaceOffsetY float64, chConfigsOrderedByJoinIndex []*CharacterConfig) *js.Object { // We need access to all fields of RoomDownsyncFrame for displaying in frontend - return js.MakeFullWrapper(ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, gravityX, gravityY, jumpingInitVelY, inputDelayFrames, inputScaleFrames, collisionSpaceOffsetX, collisionSpaceOffsetY, snapIntoPlatformOverlap, snapIntoPlatformThreshold, worldToVirtualGridRatio, virtualGridToWorldRatio, playerOpPatternToSkillId)) + return js.MakeFullWrapper(ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, chConfigsOrderedByJoinIndex)) } func main() { js.Global.Set("gopkgs", map[string]interface{}{ - "NewVec2DJs": NewVec2DJs, - "NewPolygon2DJs": NewPolygon2DJs, - "NewBarrierJs": NewBarrierJs, - "NewPlayerDownsyncJs": NewPlayerDownsyncJs, - "NewMeleeBulletJs": NewMeleeBulletJs, - "NewRoomDownsyncFrameJs": NewRoomDownsyncFrameJs, - "NewCollisionSpaceJs": NewCollisionSpaceJs, - "NewInputFrameDownsync": NewInputFrameDownsync, - "NewRingBufferJs": NewRingBufferJs, - "GenerateRectColliderJs": GenerateRectColliderJs, - "GenerateConvexPolygonColliderJs": GenerateConvexPolygonColliderJs, - "GetCollisionSpaceObjsJs": GetCollisionSpaceObjsJs, - "ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs": ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs, + "NewVec2DJs": NewVec2DJs, + "NewPolygon2DJs": NewPolygon2DJs, + "NewBarrierJs": NewBarrierJs, + "NewPlayerDownsyncJs": NewPlayerDownsyncJs, + "NewMeleeBulletJs": NewMeleeBulletJs, + "NewRoomDownsyncFrameJs": NewRoomDownsyncFrameJs, + "NewCollisionSpaceJs": NewCollisionSpaceJs, + "NewInputFrameDownsync": NewInputFrameDownsync, + "NewRingBufferJs": NewRingBufferJs, + "GenerateRectColliderJs": GenerateRectColliderJs, + "GenerateConvexPolygonColliderJs": GenerateConvexPolygonColliderJs, + "GetCollisionSpaceObjsJs": GetCollisionSpaceObjsJs, "WorldToPolygonColliderBLPos": WorldToPolygonColliderBLPos, // No need to wrap primitive return types "PolygonColliderBLToWorldPos": PolygonColliderBLToWorldPos, + "WorldToVirtualGridPos": WorldToVirtualGridPos, + "VirtualGridToWorldPos": VirtualGridToWorldPos, + "GetCharacterConfigsOrderedByJoinIndex": GetCharacterConfigsOrderedByJoinIndex, + "ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs": ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs, + "ConvertToDelayedInputFrameId": ConvertToDelayedInputFrameId, + "ConvertToNoDelayInputFrameId": ConvertToNoDelayInputFrameId, + "ConvertToFirstUsedRenderFrameId": ConvertToFirstUsedRenderFrameId, + "ConvertToLastUsedRenderFrameId": ConvertToLastUsedRenderFrameId, + "ShouldGenerateInputFrameUpsync": ShouldGenerateInputFrameUpsync, }) } diff --git a/resolv_tailored/object.go b/resolv_tailored/object.go index e990d44..918917f 100644 --- a/resolv_tailored/object.go +++ b/resolv_tailored/object.go @@ -285,27 +285,27 @@ func (obj *Object) Check(dx, dy float64, tags ...string) *Collision { } /* - // In my use case, order of objects within a collision instance is not needed, and this also favors both runtime performance & size reduction of `jsexport.js`. + // In my use case, order of objects within a collision instance is not needed, and this also favors both runtime performance & size reduction of `jsexport.js`. - ox, oy := cc.checkingObject.Center() - oc := Vector{ox, oy} - sort.Slice(cc.Objects, func(i, j int) bool { + ox, oy := cc.checkingObject.Center() + oc := Vector{ox, oy} + sort.Slice(cc.Objects, func(i, j int) bool { - ix, iy := cc.Objects[i].Center() - jx, jy := cc.Objects[j].Center() - return Vector{ix, iy}.Sub(oc).Magnitude2() < Vector{jx, jy}.Sub(oc).Magnitude2() + ix, iy := cc.Objects[i].Center() + jx, jy := cc.Objects[j].Center() + return Vector{ix, iy}.Sub(oc).Magnitude2() < Vector{jx, jy}.Sub(oc).Magnitude2() - }) + }) - cw := cc.checkingObject.Space.CellWidth - ch := cc.checkingObject.Space.CellHeight + cw := cc.checkingObject.Space.CellWidth + ch := cc.checkingObject.Space.CellHeight - sort.Slice(cc.Cells, func(i, j int) bool { + sort.Slice(cc.Cells, func(i, j int) bool { - return Vector{float64(cc.Cells[i].X*cw + (cw / 2)), float64(cc.Cells[i].Y*ch + (ch / 2))}.Sub(oc).Magnitude2() < - Vector{float64(cc.Cells[j].X*cw + (cw / 2)), float64(cc.Cells[j].Y*ch + (ch / 2))}.Sub(oc).Magnitude2() + return Vector{float64(cc.Cells[i].X*cw + (cw / 2)), float64(cc.Cells[i].Y*ch + (ch / 2))}.Sub(oc).Magnitude2() < + Vector{float64(cc.Cells[j].X*cw + (cw / 2)), float64(cc.Cells[j].Y*ch + (ch / 2))}.Sub(oc).Magnitude2() - }) + }) */ return cc