From c7fc377a2b8a692859356f177598352399279155 Mon Sep 17 00:00:00 2001 From: genxium Date: Sat, 31 Dec 2022 15:47:45 +0800 Subject: [PATCH 01/10] A temp broken commit except for OfflineMap - refactoring jumping. --- MULTIHIT_ROADMAP.md | 7 + battle_srv/models/pb_type_convert.go | 4 +- battle_srv/models/room.go | 11 +- battle_srv/protos/room_downsync_frame.pb.go | 521 +- collider_visualizer/README.md | 1 + frontend/assets/plugin_scripts/jsexport.js | 6126 ++++++++++++++++- .../assets/resources/animation/MonkGirl.meta | 7 + .../resources/animation/MonkGirl/Atk1.anim | 49 + .../animation/MonkGirl/Atk1.anim.meta | 5 + .../resources/animation/MonkGirl/Atked1.anim | 37 + .../animation/MonkGirl/Atked1.anim.meta | 5 + .../animation/MonkGirl/BlownUp1.anim | 43 + .../animation/MonkGirl/BlownUp1.anim.meta | 5 + .../resources/animation/MonkGirl/GetUp1.anim | 79 + .../animation/MonkGirl/GetUp1.anim.meta | 5 + .../resources/animation/MonkGirl/Idle1.anim | 85 + .../animation/MonkGirl/Idle1.anim.meta | 5 + .../animation/MonkGirl/InAirAtk1.anim | 97 + .../animation/MonkGirl/InAirAtk1.anim.meta | 5 + .../animation/MonkGirl/InAirAtked1.anim | 31 + .../animation/MonkGirl/InAirAtked1.anim.meta | 5 + .../animation/MonkGirl/InAirIdle1ByJump.anim | 91 + .../MonkGirl/InAirIdle1ByJump.anim.meta | 5 + .../animation/MonkGirl/InAirIdle1NoJump.anim | 25 + .../MonkGirl/InAirIdle1NoJump.anim.meta | 5 + .../animation/MonkGirl/LayDown1.anim | 49 + .../animation/MonkGirl/LayDown1.anim.meta | 5 + .../animation/MonkGirl/MonkGirl.plist | 1211 ++++ .../animation/MonkGirl/MonkGirl.plist.meta | 1750 +++++ .../resources/animation/MonkGirl/MonkGirl.png | Bin 0 -> 76232 bytes .../animation/MonkGirl/MonkGirl.png.meta | 12 + .../resources/animation/MonkGirl/Walking.anim | 115 + .../animation/MonkGirl/Walking.anim.meta | 5 + .../pbfiles/room_downsync_frame.proto | 7 +- .../prefabs/ControlledCharacter.prefab | 168 +- frontend/assets/scenes/login.fire | 2 +- frontend/assets/scripts/AttackingCharacter.js | 72 +- frontend/assets/scripts/Map.js | 33 +- frontend/assets/scripts/OfflineMap.js | 75 +- frontend/assets/scripts/modules/Collisions.js | 197 - .../assets/scripts/modules/Collisions.js.meta | 9 - ...om_downsync_frame_proto_bundle.forcemsg.js | 33 +- jsexport/battle/battle.go | 126 +- jsexport/battle/characterConfig.go | 74 + jsexport/battle/room_downsync_frame.go | 26 + jsexport/main.go | 40 +- resolv_tailored/object.go | 28 +- 47 files changed, 10636 insertions(+), 660 deletions(-) create mode 100644 MULTIHIT_ROADMAP.md create mode 100644 collider_visualizer/README.md create mode 100644 frontend/assets/resources/animation/MonkGirl.meta create mode 100644 frontend/assets/resources/animation/MonkGirl/Atk1.anim create mode 100644 frontend/assets/resources/animation/MonkGirl/Atk1.anim.meta create mode 100644 frontend/assets/resources/animation/MonkGirl/Atked1.anim create mode 100644 frontend/assets/resources/animation/MonkGirl/Atked1.anim.meta create mode 100644 frontend/assets/resources/animation/MonkGirl/BlownUp1.anim create mode 100644 frontend/assets/resources/animation/MonkGirl/BlownUp1.anim.meta create mode 100644 frontend/assets/resources/animation/MonkGirl/GetUp1.anim create mode 100644 frontend/assets/resources/animation/MonkGirl/GetUp1.anim.meta create mode 100644 frontend/assets/resources/animation/MonkGirl/Idle1.anim create mode 100644 frontend/assets/resources/animation/MonkGirl/Idle1.anim.meta create mode 100644 frontend/assets/resources/animation/MonkGirl/InAirAtk1.anim create mode 100644 frontend/assets/resources/animation/MonkGirl/InAirAtk1.anim.meta create mode 100644 frontend/assets/resources/animation/MonkGirl/InAirAtked1.anim create mode 100644 frontend/assets/resources/animation/MonkGirl/InAirAtked1.anim.meta create mode 100644 frontend/assets/resources/animation/MonkGirl/InAirIdle1ByJump.anim create mode 100644 frontend/assets/resources/animation/MonkGirl/InAirIdle1ByJump.anim.meta create mode 100644 frontend/assets/resources/animation/MonkGirl/InAirIdle1NoJump.anim create mode 100644 frontend/assets/resources/animation/MonkGirl/InAirIdle1NoJump.anim.meta create mode 100644 frontend/assets/resources/animation/MonkGirl/LayDown1.anim create mode 100644 frontend/assets/resources/animation/MonkGirl/LayDown1.anim.meta create mode 100644 frontend/assets/resources/animation/MonkGirl/MonkGirl.plist create mode 100644 frontend/assets/resources/animation/MonkGirl/MonkGirl.plist.meta create mode 100644 frontend/assets/resources/animation/MonkGirl/MonkGirl.png create mode 100644 frontend/assets/resources/animation/MonkGirl/MonkGirl.png.meta create mode 100644 frontend/assets/resources/animation/MonkGirl/Walking.anim create mode 100644 frontend/assets/resources/animation/MonkGirl/Walking.anim.meta delete mode 100644 frontend/assets/scripts/modules/Collisions.js delete mode 100644 frontend/assets/scripts/modules/Collisions.js.meta create mode 100644 jsexport/battle/characterConfig.go 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..a1a03dc 100644 --- a/battle_srv/models/pb_type_convert.go +++ b/battle_srv/models/pb_type_convert.go @@ -35,10 +35,11 @@ func toPbRoomDownsyncFrame(rdf *battle.RoomDownsyncFrame) *pb.RoomDownsyncFrame JoinIndex: last.JoinIndex, ColliderRadius: last.ColliderRadius, Score: last.Score, - FramesToRecover: last.FramesToRecover, Hp: last.Hp, MaxHp: last.MaxHp, Removed: last.Removed, + FramesToRecover: last.FramesToRecover, + FramesInChState: last.FramesInChState, } ret.PlayersArr[i] = pbPlayer } @@ -100,6 +101,7 @@ func toPbPlayers(modelInstances map[int32]*Player, withMetaInfo bool) []*pb.Play Score: last.Score, Removed: last.Removed, FramesToRecover: last.FramesToRecover, + FramesInChState: last.FramesInChState, } if withMetaInfo { pbPlayer.Name = last.Name diff --git a/battle_srv/models/room.go b/battle_srv/models/room.go index 8370e58..68c9cd0 100644 --- a/battle_srv/models/room.go +++ b/battle_srv/models/room.go @@ -353,7 +353,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 } @@ -744,7 +744,7 @@ 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.WorldToVirtualGridRatio = battle.WORLD_TO_VIRTUAL_GRID_RATIO 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 @@ -791,11 +791,6 @@ func (pR *Room) OnDismissed() { 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! @@ -1275,7 +1270,7 @@ 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.InputDelayFrames, pR.InputScaleFrames, pR.collisionSpaceOffsetX, pR.collisionSpaceOffsetY, pR.SnapIntoPlatformOverlap, pR.SnapIntoPlatformThreshold, pR.WorldToVirtualGridRatio, pR.VirtualGridToWorldRatio, pR.playerOpPatternToSkillId) pR.RenderFrameBuffer.Put(nextRenderFrame) pR.CurDynamicsRenderFrameId++ } diff --git a/battle_srv/protos/room_downsync_frame.pb.go b/battle_srv/protos/room_downsync_frame.pb.go index bab51dc..238161a 100644 --- a/battle_srv/protos/room_downsync_frame.pb.go +++ b/battle_srv/protos/room_downsync_frame.pb.go @@ -44,10 +44,11 @@ type PlayerDownsync struct { 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"` + 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 + 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() { @@ -215,6 +216,13 @@ func (x *PlayerDownsync) GetInAir() bool { return false } +func (x *PlayerDownsync) GetFramesInChState() int32 { + if x != nil { + return x.FramesInChState + } + return 0 +} + func (x *PlayerDownsync) GetName() string { if x != nil { return x.Name @@ -1306,7 +1314,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, 0x9d, 0x05, 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, @@ -1340,258 +1348,261 @@ 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, - 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, + 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, 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, 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, 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, + 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, - 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, - 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, + 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, 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, } var ( 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..887f469 100644 --- a/frontend/assets/plugin_scripts/jsexport.js +++ b/frontend/assets/plugin_scripts/jsexport.js @@ -2,15 +2,6125 @@ (function() { var $goVersion = "go1.18.6"; -Error.stackTraceLimit=1/0;var $global,$module,$NaN=NaN;if("undefined"!=typeof window?$global=window:"undefined"!=typeof self?$global=self:"undefined"!=typeof global?($global=global).require=require:$global=this,void 0===$global||void 0===$global.Array)throw new Error("no global object found");if("undefined"!=typeof module&&($module=module),!$global.fs&&$global.require)try{var fs=$global.require("fs");"object"==typeof fs&&null!==fs&&0!==Object.keys(fs).length&&($global.fs=fs)}catch(e){}if(!$global.fs){var outputBuf="",decoder=new TextDecoder("utf-8");$global.fs={constants:{O_WRONLY:-1,O_RDWR:-1,O_CREAT:-1,O_TRUNC:-1,O_APPEND:-1,O_EXCL:-1},writeSync:function(e,n){var r=(outputBuf+=decoder.decode(n)).lastIndexOf("\n");return-1!=r&&(console.log(outputBuf.substr(0,r)),outputBuf=outputBuf.substr(r+1)),n.length},write:function(e,n,r,t,i,a){0===r&&t===n.length&&null===i?a(null,this.writeSync(e,n)):a(enosys())}}}var $throwRuntimeError,$linknames={},$packages={},$idCounter=0,$keys=function(e){return e?Object.keys(e):[]},$flushConsole=function(){},$throwNilPointerError=function(){$throwRuntimeError("invalid memory address or nil pointer dereference")},$call=function(e,n,r){return e.apply(n,r)},$makeFunc=function(e){return function(){return $externalize(e(this,new($sliceType($jsObjectPtr))($global.Array.prototype.slice.call(arguments,[]))),$emptyInterface)}},$unused=function(e){},$print=console.log;if(void 0!==$global.process&&$global.require)try{var util=$global.require("util");$print=function(){$global.process.stderr.write(util.format.apply(this,arguments))}}catch(e){}var $println=console.log,$initAllLinknames=function(){for(var e=$keys($packages),n=0;ne.$capacity||t>e.$capacity)&&$throwRuntimeError("slice bounds out of range"),e===e.constructor.nil)return e;var i=new e.constructor(e.$array);return i.$offset=e.$offset+n,i.$length=r-n,i.$capacity=t-n,i},$substring=function(e,n,r){return(n<0||re.length)&&$throwRuntimeError("slice bounds out of range"),e.substring(n,r)},$sliceToNativeArray=function(e){return e.$array.constructor!==Array?e.$array.subarray(e.$offset,e.$offset+e.$length):e.$array.slice(e.$offset,e.$offset+e.$length)},$sliceToGoArray=function(e,n){var r=n.elem;return void 0!==r&&e.$length1114111||55296<=e&&e<=57343)&&(e=65533),e<=127?String.fromCharCode(e):e<=2047?String.fromCharCode(192|e>>6,128|63&e):e<=65535?String.fromCharCode(224|e>>12,128|e>>6&63,128|63&e):String.fromCharCode(240|e>>18,128|e>>12&63,128|e>>6&63,128|63&e)},$stringToBytes=function(e){for(var n=new Uint8Array(e.length),r=0;rt){for(var o=i-1;o>=0;o--)a.copy(e[r+o],n[t+o]);return}for(o=0;ot)for(o=i-1;o>=0;o--)e[r+o]=n[t+o];else for(o=0;oc)if(a=0,c=Math.max(o,e.$capacity<1024?2*e.$capacity:Math.floor(5*e.$capacity/4)),e.$array.constructor===Array){(i=e.$array.slice(e.$offset,e.$offset+e.$length)).length=c;for(var $=e.constructor.elem.zero,u=e.$length;u>>16&65535)*t+r*(n>>>16&65535)<<16>>>0)>>0},$floatKey=function(e){return e!=e?"NaN$"+ ++$idCounter:String(e)},$flatten64=function(e){return 4294967296*e.$high+e.$low},$shiftLeft64=function(e,n){return 0===n?e:n<32?new e.constructor(e.$high<>>32-n,e.$low<>>0):n<64?new e.constructor(e.$low<>n,(e.$low>>>n|e.$high<<32-n)>>>0):n<64?new e.constructor(e.$high>>31,e.$high>>n-32>>>0):e.$high<0?new e.constructor(-1,4294967295):new e.constructor(0,0)},$shiftRightUint64=function(e,n){return 0===n?e:n<32?new e.constructor(e.$high>>>n,(e.$low>>>n|e.$high<<32-n)>>>0):n<64?new e.constructor(0,e.$high>>>n-32):new e.constructor(0,0)},$mul64=function(e,n){var r=e.$high>>>16,t=65535&e.$high,i=e.$low>>>16,a=65535&e.$low,o=n.$high>>>16,c=65535&n.$high,$=n.$low>>>16,u=65535&n.$low,l=0,s=0,f=0,d=0;f+=(d+=a*u)>>>16,s+=(f+=i*u)>>>16,f&=65535,s+=(f+=a*$)>>>16,l+=(s+=t*u)>>>16,s&=65535,l+=(s+=i*$)>>>16,s&=65535,l+=(s+=a*c)>>>16,l+=r*u+t*$+i*c+a*o;var p=((l&=65535)<<16|(s&=65535))>>>0,h=((f&=65535)<<16|(d&=65535))>>>0;return new e.constructor(p,h)},$div64=function(e,n,r){0===n.$high&&0===n.$low&&$throwRuntimeError("integer divide by zero");var t=1,i=1,a=e.$high,o=e.$low;a<0&&(t=-1,i=-1,a=-a,0!==o&&(a--,o=4294967296-o));var c=n.$high,$=n.$low;n.$high<0&&(t*=-1,c=-c,0!==$&&(c--,$=4294967296-$));for(var u=0,l=0,s=0;c<2147483648&&(a>c||a===c&&o>$);)c=(c<<1|$>>>31)>>>0,$=$<<1>>>0,s++;for(var f=0;f<=s;f++)u=u<<1|l>>>31,l=l<<1>>>0,(a>c||a===c&&o>=$)&&(a-=c,(o-=$)<0&&(a--,o+=4294967296),4294967296===++l&&(u++,l=0)),$=($>>>1|c<<31)>>>0,c>>>=1;return r?new e.constructor(a*i,o*i):new e.constructor(u*t,l*t)},$divComplex=function(e,n){var r=e.$real===1/0||e.$real===-1/0||e.$imag===1/0||e.$imag===-1/0,t=n.$real===1/0||n.$real===-1/0||n.$imag===1/0||n.$imag===-1/0,i=!r&&(e.$real!=e.$real||e.$imag!=e.$imag),a=!t&&(n.$real!=n.$real||n.$imag!=n.$imag);if(i||a)return new e.constructor(NaN,NaN);if(r&&!t)return new e.constructor(1/0,1/0);if(!r&&t)return new e.constructor(0,0);if(0===n.$real&&0===n.$imag)return 0===e.$real&&0===e.$imag?new e.constructor(NaN,NaN):new e.constructor(1/0,1/0);if(Math.abs(n.$real)<=Math.abs(n.$imag)){var o=n.$real/n.$imag,c=n.$real*o+n.$imag;return new e.constructor((e.$real*o+e.$imag)/c,(e.$imag*o-e.$real)/c)}o=n.$imag/n.$real,c=n.$imag*o+n.$real;return new e.constructor((e.$imag*o+e.$real)/c,(e.$imag-e.$real*o)/c)},$kindBool=1,$kindInt=2,$kindInt8=3,$kindInt16=4,$kindInt32=5,$kindInt64=6,$kindUint=7,$kindUint8=8,$kindUint16=9,$kindUint32=10,$kindUint64=11,$kindUintptr=12,$kindFloat32=13,$kindFloat64=14,$kindComplex64=15,$kindComplex128=16,$kindArray=17,$kindChan=18,$kindFunc=19,$kindInterface=20,$kindMap=21,$kindPtr=22,$kindSlice=23,$kindString=24,$kindStruct=25,$kindUnsafePointer=26,$methodSynthesizers=[],$addMethodSynthesizer=function(e){null!==$methodSynthesizers?$methodSynthesizers.push(e):e()},$synthesizeMethods=function(){$methodSynthesizers.forEach(function(e){e()}),$methodSynthesizers=null},$ifaceKeyFor=function(e){if(e===$ifaceNil)return"nil";var n=e.constructor;return n.string+"$"+n.keyFor(e.$val)},$identity=function(e){return e},$typeIDCounter=0,$idKey=function(e){return void 0===e.$id&&($idCounter++,e.$id=$idCounter),String(e.$id)},$arrayPtrCtor=function(){return function(e){this.$get=function(){return e},this.$set=function(e){typ.copy(this,e)},this.$val=e}},$newType=function(e,n,r,t,i,a,o){var c;switch(n){case $kindBool:case $kindInt:case $kindInt8:case $kindInt16:case $kindInt32:case $kindUint:case $kindUint8:case $kindUint16:case $kindUint32:case $kindUintptr:case $kindUnsafePointer:(c=function(e){this.$val=e}).wrapped=!0,c.keyFor=$identity;break;case $kindString:(c=function(e){this.$val=e}).wrapped=!0,c.keyFor=function(e){return"$"+e};break;case $kindFloat32:case $kindFloat64:(c=function(e){this.$val=e}).wrapped=!0,c.keyFor=function(e){return $floatKey(e)};break;case $kindInt64:(c=function(e,n){this.$high=e+Math.floor(Math.ceil(n)/4294967296)>>0,this.$low=n>>>0,this.$val=this}).keyFor=function(e){return e.$high+"$"+e.$low};break;case $kindUint64:(c=function(e,n){this.$high=e+Math.floor(Math.ceil(n)/4294967296)>>>0,this.$low=n>>>0,this.$val=this}).keyFor=function(e){return e.$high+"$"+e.$low};break;case $kindComplex64:(c=function(e,n){this.$real=$fround(e),this.$imag=$fround(n),this.$val=this}).keyFor=function(e){return e.$real+"$"+e.$imag};break;case $kindComplex128:(c=function(e,n){this.$real=e,this.$imag=n,this.$val=this}).keyFor=function(e){return e.$real+"$"+e.$imag};break;case $kindArray:(c=function(e){this.$val=e}).wrapped=!0,c.ptr=$newType(4,$kindPtr,"*"+r,!1,"",!1,$arrayPtrCtor()),c.init=function(e,n){c.elem=e,c.len=n,c.comparable=e.comparable,c.keyFor=function(n){return Array.prototype.join.call($mapArray(n,function(n){return String(e.keyFor(n)).replace(/\\/g,"\\\\").replace(/\$/g,"\\$")}),"$")},c.copy=function(n,r){$copyArray(n,r,0,0,r.length,e)},c.ptr.init(c),Object.defineProperty(c.ptr.nil,"nilCheck",{get:$throwNilPointerError})};break;case $kindChan:(c=function(e){this.$val=e}).wrapped=!0,c.keyFor=$idKey,c.init=function(e,n,r){c.elem=e,c.sendOnly=n,c.recvOnly=r};break;case $kindFunc:(c=function(e){this.$val=e}).wrapped=!0,c.init=function(e,n,r){c.params=e,c.results=n,c.variadic=r,c.comparable=!1};break;case $kindInterface:(c={implementedBy:{},missingMethodFor:{}}).keyFor=$ifaceKeyFor,c.init=function(e){c.methods=e,e.forEach(function(e){$ifaceNil[e.prop]=$throwNilPointerError})};break;case $kindMap:(c=function(e){this.$val=e}).wrapped=!0,c.init=function(e,n){c.key=e,c.elem=n,c.comparable=!1};break;case $kindPtr:(c=o||function(e,n,r){this.$get=e,this.$set=n,this.$target=r,this.$val=this}).keyFor=$idKey,c.init=function(e){c.elem=e,c.wrapped=e.kind===$kindArray,c.nil=new c($throwNilPointerError,$throwNilPointerError)};break;case $kindSlice:(c=function(e){e.constructor!==c.nativeArray&&(e=new c.nativeArray(e)),this.$array=e,this.$offset=0,this.$length=e.length,this.$capacity=e.length,this.$val=this}).init=function(e){c.elem=e,c.comparable=!1,c.nativeArray=$nativeArray(e.kind),c.nil=new c([])};break;case $kindStruct:(c=function(e){this.$val=e}).wrapped=!0,c.ptr=$newType(4,$kindPtr,"*"+r,!1,i,a,o),c.ptr.elem=c,c.ptr.prototype.$get=function(){return this},c.ptr.prototype.$set=function(e){c.copy(this,e)},c.init=function(e,n){c.pkgPath=e,c.fields=n,n.forEach(function(e){e.typ.comparable||(c.comparable=!1)}),c.keyFor=function(e){var r=e.$val;return $mapArray(n,function(e){return String(e.typ.keyFor(r[e.prop])).replace(/\\/g,"\\\\").replace(/\$/g,"\\$")}).join("$")},c.copy=function(e,r){for(var t=0;t0;){var a=[],o=[];t.forEach(function(e){if(!i[e.typ.string])switch(i[e.typ.string]=!0,e.typ.named&&(o=o.concat(e.typ.methods),e.indirect&&(o=o.concat($ptrType(e.typ).methods))),e.typ.kind){case $kindStruct:e.typ.fields.forEach(function(n){if(n.embedded){var r=n.typ,t=r.kind===$kindPtr;a.push({typ:t?r.elem:r,indirect:e.indirect||t})}});break;case $kindInterface:o=o.concat(e.typ.methods)}}),o.forEach(function(e){void 0===n[e.name]&&(n[e.name]=e)}),t=a}return e.methodSetCache=[],Object.keys(n).sort().forEach(function(r){e.methodSetCache.push(n[r])}),e.methodSetCache},$Bool=$newType(1,$kindBool,"bool",!0,"",!1,null),$Int=$newType(4,$kindInt,"int",!0,"",!1,null),$Int8=$newType(1,$kindInt8,"int8",!0,"",!1,null),$Int16=$newType(2,$kindInt16,"int16",!0,"",!1,null),$Int32=$newType(4,$kindInt32,"int32",!0,"",!1,null),$Int64=$newType(8,$kindInt64,"int64",!0,"",!1,null),$Uint=$newType(4,$kindUint,"uint",!0,"",!1,null),$Uint8=$newType(1,$kindUint8,"uint8",!0,"",!1,null),$Uint16=$newType(2,$kindUint16,"uint16",!0,"",!1,null),$Uint32=$newType(4,$kindUint32,"uint32",!0,"",!1,null),$Uint64=$newType(8,$kindUint64,"uint64",!0,"",!1,null),$Uintptr=$newType(4,$kindUintptr,"uintptr",!0,"",!1,null),$Float32=$newType(4,$kindFloat32,"float32",!0,"",!1,null),$Float64=$newType(8,$kindFloat64,"float64",!0,"",!1,null),$Complex64=$newType(8,$kindComplex64,"complex64",!0,"",!1,null),$Complex128=$newType(16,$kindComplex128,"complex128",!0,"",!1,null),$String=$newType(8,$kindString,"string",!0,"",!1,null),$UnsafePointer=$newType(4,$kindUnsafePointer,"unsafe.Pointer",!0,"unsafe",!1,null),$nativeArray=function(e){switch(e){case $kindInt:return Int32Array;case $kindInt8:return Int8Array;case $kindInt16:return Int16Array;case $kindInt32:return Int32Array;case $kindUint:return Uint32Array;case $kindUint8:return Uint8Array;case $kindUint16:return Uint16Array;case $kindUint32:case $kindUintptr:return Uint32Array;case $kindFloat32:return Float32Array;case $kindFloat64:return Float64Array;default:return Array}},$toNativeArray=function(e,n){var r=$nativeArray(e);return r===Array?n:new r(n)},$arrayTypes={},$arrayType=function(e,n){var r=e.id+"$"+n,t=$arrayTypes[r];return void 0===t&&(t=$newType(12,$kindArray,"["+n+"]"+e.string,!1,"",!1,null),$arrayTypes[r]=t,t.init(e,n)),t},$chanType=function(e,n,r){var t=(r?"<-":"")+"chan"+(n?"<- ":" ");n||r||"<"!=e.string[0]?t+=e.string:t+="("+e.string+")";var i=n?"SendChan":r?"RecvChan":"Chan",a=e[i];return void 0===a&&(a=$newType(4,$kindChan,t,!1,"",!1,null),e[i]=a,a.init(e,n,r)),a},$Chan=function(e,n){(n<0||n>2147483647)&&$throwRuntimeError("makechan: size out of range"),this.$elem=e,this.$capacity=n,this.$buffer=[],this.$sendQueue=[],this.$recvQueue=[],this.$closed=!1},$chanNil=new $Chan(null,0);$chanNil.$sendQueue=$chanNil.$recvQueue={length:0,push:function(){},shift:function(){},indexOf:function(){return-1}};var $funcTypes={},$funcType=function(e,n,r){var t=$mapArray(e,function(e){return e.id}).join(",")+"$"+$mapArray(n,function(e){return e.id}).join(",")+"$"+r,i=$funcTypes[t];if(void 0===i){var a=$mapArray(e,function(e){return e.string});r&&(a[a.length-1]="..."+a[a.length-1].substr(2));var o="func("+a.join(", ")+")";1===n.length?o+=" "+n[0].string:n.length>1&&(o+=" ("+$mapArray(n,function(e){return e.string}).join(", ")+")"),i=$newType(4,$kindFunc,o,!1,"",!1,null),$funcTypes[t]=i,i.init(e,n,r)}return i},$interfaceTypes={},$interfaceType=function(e){var n=$mapArray(e,function(e){return e.pkg+","+e.name+","+e.typ.id}).join("$"),r=$interfaceTypes[n];if(void 0===r){var t="interface {}";0!==e.length&&(t="interface { "+$mapArray(e,function(e){return(""!==e.pkg?e.pkg+".":"")+e.name+e.typ.string.substr(4)}).join("; ")+" }"),r=$newType(8,$kindInterface,t,!1,"",!1,null),$interfaceTypes[n]=r,r.init(e)}return r},$emptyInterface=$interfaceType([]),$ifaceNil={},$error=$newType(8,$kindInterface,"error",!0,"",!1,null);$error.init([{prop:"Error",name:"Error",pkg:"",typ:$funcType([],[$String],!1)}]);var $panicValue,$jsObjectPtr,$jsErrorPtr,$mapTypes={},$mapType=function(e,n){var r=e.id+"$"+n.id,t=$mapTypes[r];return void 0===t&&(t=$newType(4,$kindMap,"map["+e.string+"]"+n.string,!1,"",!1,null),$mapTypes[r]=t,t.init(e,n)),t},$makeMap=function(e,n){for(var r={},t=0;t2147483647)&&$throwRuntimeError("makeslice: len out of range"),(r<0||r2147483647)&&$throwRuntimeError("makeslice: cap out of range");var t=new e.nativeArray(r);if(e.nativeArray===Array)for(var i=0;i4||t<0)break}}finally{0==$scheduled.length&&clearTimeout(e)}},$schedule=function(e){e.asleep&&(e.asleep=!1,$awakeGoroutines++),$scheduled.push(e),$curGoroutine===$noGoroutine&&$runScheduled()},$setTimeout=function(e,n){return $awakeGoroutines++,setTimeout(function(){$awakeGoroutines--,e()},n)},$block=function(){$curGoroutine===$noGoroutine&&$throwRuntimeError("cannot block in JavaScript callback, fix by wrapping code in goroutine"),$curGoroutine.asleep=!0},$restore=function(e,n){return void 0!==e&&void 0!==e.$blk?e:n},$send=function(e,n){e.$closed&&$throwRuntimeError("send on closed channel");var r=e.$recvQueue.shift();if(void 0===r){if(!(e.$buffer.length65535){var l=Math.floor((u-65536)/1024)+55296,s=(u-65536)%1024+56320;$+=String.fromCharCode(l,s)}else $+=String.fromCharCode(u)}return $;case $kindStruct:var f=$packages.time;if(void 0!==f&&e.constructor===f.Time.ptr){var d=$div64(e.UnixNano(),new $Int64(0,1e6));return new Date($flatten64(d))}var p={},h=function(e,n){if(n===$jsObjectPtr)return e;switch(n.kind){case $kindPtr:return e===n.nil?p:h(e.$get(),n.elem);case $kindStruct:var r=n.fields[0];return h(e[r.prop],r.typ);case $kindInterface:return h(e.$val,e.constructor);default:return p}},k=h(e,n);if(k!==p)return k;if(void 0!==r)return r(e);k={};for(a=0;a>24;case $kindInt16:return parseInt(e)<<16>>16;case $kindInt32:return parseInt(e)>>0;case $kindUint:return parseInt(e);case $kindUint8:return parseInt(e)<<24>>>24;case $kindUint16:return parseInt(e)<<16>>>16;case $kindUint32:case $kindUintptr:return parseInt(e)>>>0;case $kindInt64:case $kindUint64:return new n(0,e);case $kindFloat32:case $kindFloat64:return parseFloat(e);case $kindArray:return e.length!==n.len&&$throwRuntimeError("got array with wrong size from JavaScript native"),$mapArray(e,function(e){return $internalize(e,n.elem,i)});case $kindFunc:return function(){for(var t=[],a=0;a=128)return!1;return!0}; +Error.stackTraceLimit = Infinity; -$packages["github.com/gopherjs/gopherjs/js"]=(function(){var $pkg={},$init,A,B,J,K,M,O,P,Q,R,S,T,G,H,L;A=$pkg.Object=$newType(0,$kindStruct,"js.Object",true,"github.com/gopherjs/gopherjs/js",true,function(object_){this.$val=this;if(arguments.length===0){this.object=null;return;}this.object=object_;});B=$pkg.Error=$newType(0,$kindStruct,"js.Error",true,"github.com/gopherjs/gopherjs/js",true,function(Object_){this.$val=this;if(arguments.length===0){this.Object=null;return;}this.Object=Object_;});J=$pkg.M=$newType(4,$kindMap,"js.M",true,"github.com/gopherjs/gopherjs/js",true,null);K=$pkg.S=$newType(12,$kindSlice,"js.S",true,"github.com/gopherjs/gopherjs/js",true,null);M=$sliceType($emptyInterface);O=$ptrType(A);P=$sliceType(O);Q=$funcType([P],[O],true);R=$funcType([],[O],false);S=$funcType([O],[],false);T=$ptrType(B);A.ptr.prototype.Get=function(a){var a,b;b=this;return b.object[$externalize(a,$String)];};A.prototype.Get=function(a){return this.$val.Get(a);};A.ptr.prototype.Set=function(a,b){var a,b,c;c=this;c.object[$externalize(a,$String)]=$externalize(b,$emptyInterface);};A.prototype.Set=function(a,b){return this.$val.Set(a,b);};A.ptr.prototype.Delete=function(a){var a,b;b=this;delete b.object[$externalize(a,$String)];};A.prototype.Delete=function(a){return this.$val.Delete(a);};A.ptr.prototype.Length=function(){var a;a=this;return $parseInt(a.object.length);};A.prototype.Length=function(){return this.$val.Length();};A.ptr.prototype.Index=function(a){var a,b;b=this;return b.object[a];};A.prototype.Index=function(a){return this.$val.Index(a);};A.ptr.prototype.SetIndex=function(a,b){var a,b,c;c=this;c.object[a]=$externalize(b,$emptyInterface);};A.prototype.SetIndex=function(a,b){return this.$val.SetIndex(a,b);};A.ptr.prototype.Call=function(a,b){var a,b,c,d;c=this;return(d=c.object,d[$externalize(a,$String)].apply(d,$externalize(b,M)));};A.prototype.Call=function(a,b){return this.$val.Call(a,b);};A.ptr.prototype.Invoke=function(a){var a,b;b=this;return b.object.apply(undefined,$externalize(a,M));};A.prototype.Invoke=function(a){return this.$val.Invoke(a);};A.ptr.prototype.New=function(a){var a,b;b=this;return new($global.Function.prototype.bind.apply(b.object,[undefined].concat($externalize(a,M))));};A.prototype.New=function(a){return this.$val.New(a);};A.ptr.prototype.Bool=function(){var a;a=this;return!!(a.object);};A.prototype.Bool=function(){return this.$val.Bool();};A.ptr.prototype.String=function(){var a;a=this;return $internalize(a.object,$String);};A.prototype.String=function(){return this.$val.String();};A.ptr.prototype.Int=function(){var a;a=this;return $parseInt(a.object)>>0;};A.prototype.Int=function(){return this.$val.Int();};A.ptr.prototype.Int64=function(){var a;a=this;return $internalize(a.object,$Int64);};A.prototype.Int64=function(){return this.$val.Int64();};A.ptr.prototype.Uint64=function(){var a;a=this;return $internalize(a.object,$Uint64);};A.prototype.Uint64=function(){return this.$val.Uint64();};A.ptr.prototype.Float=function(){var a;a=this;return $parseFloat(a.object);};A.prototype.Float=function(){return this.$val.Float();};A.ptr.prototype.Interface=function(){var a;a=this;return $internalize(a.object,$emptyInterface);};A.prototype.Interface=function(){return this.$val.Interface();};A.ptr.prototype.Unsafe=function(){var a;a=this;return a.object;};A.prototype.Unsafe=function(){return this.$val.Unsafe();};B.ptr.prototype.Error=function(){var a;a=this;return"JavaScript error: "+$internalize(a.Object.message,$String);};B.prototype.Error=function(){return this.$val.Error();};B.ptr.prototype.Stack=function(){var a;a=this;return $internalize(a.Object.stack,$String);};B.prototype.Stack=function(){return this.$val.Stack();};G=function(a){var a,b,c,d,e,f;b=a;c=new($global.Object)();c.__internal_object__=b;d=b.constructor.methods;e=0;while(true){if(!(e<$parseInt(d.length))){break;}f=[f];f[0]=d[e];if(!($internalize(f[0].pkg,$String)==="")){e=e+(1)>>0;continue;}c[$externalize($internalize(f[0].name,$String),$String)]=$externalize((function(f){return function(g){var g;return $externalizeFunction(b[$externalize($internalize(f[0].prop,$String),$String)],f[0].typ,$externalize(true,$Bool)).apply(b,$externalize(g,P));};})(f),Q);e=e+(1)>>0;}return c;};$pkg.MakeWrapper=G;H=function(a){var{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,$s,$r,$c}=$restore(this,{a});$s=$s||0;s:while(true){switch($s){case 0:b=[b];c=[c];b[0]=a;d=b[0].constructor;c[0]=new($global.Object)();e=(function(b,c){return function(e,f){var e,f;$global.Object.defineProperty(c[0],$externalize(e,$String),$externalize(f,J));};})(b,c);$r=e("__internal_object__",$makeMap($String.keyFor,[{k:"value",v:new $jsObjectPtr(b[0])}]));$s=1;case 1:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}f=$internalize(d.string,$String);g=$internalize(d.pkg,$String);h="";if(f.charCodeAt(0)===42){h="*";}i=0;while(true){if(!(i>0));break;}i=i+(1)>>0;}j=g+"."+h+f;$r=e("$type",$makeMap($String.keyFor,[{k:"value",v:new $String(j)}]));$s=2;case 2:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}k=null;l=new($global.Array)();m=d.methods;if(!(m===undefined)){l=l.concat(m);}n=d.elem;if(!(n===undefined)){k=n.fields;l=l.concat(n.methods);}else{k=d.fields;}o=0;case 3:if(!(o<$parseInt(l.length))){$s=4;continue;}p=[p];p[0]=l[o];if(!($internalize(p[0].pkg,$String)==="")){o=o+(1)>>0;$s=3;continue;}$r=e($internalize(p[0].prop,$String),$makeMap($String.keyFor,[{k:"value",v:new Q((function(b,c,p){return function(q){var q;return $externalizeFunction(b[0][$externalize($internalize(p[0].prop,$String),$String)],p[0].typ,$externalize(true,$Bool),H).apply(b[0],$externalize(q,P));};})(b,c,p))}]));$s=5;case 5:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}o=o+(1)>>0;$s=3;continue;case 4:if(!(k===undefined)){$s=6;continue;}$s=7;continue;case 6:q=0;case 8:if(!(q<$parseInt(k.length))){$s=9;continue;}r=[r];r[0]=k[q];if(!!!(r[0].exported)){q=q+(1)>>0;$s=8;continue;}$r=e($internalize(r[0].prop,$String),$makeMap($String.keyFor,[{k:"get",v:new R((function(b,c,r){return function(){var s;s=$copyIfRequired(b[0].$val[$externalize($internalize(r[0].prop,$String),$String)],r[0].typ);return $externalize(s,r[0].typ,H);};})(b,c,r))},{k:"set",v:new S((function(b,c,r){return function(s){var s,t;t=$internalize(s,r[0].typ,H);b[0].$val[$externalize($internalize(r[0].prop,$String),$String)]=t;};})(b,c,r))}]));$s=10;case 10:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}q=q+(1)>>0;$s=8;continue;case 9:case 7:$s=-1;return c[0];}return;}var $f={$blk:H,$c:true,$r,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,$s};return $f;};$pkg.MakeFullWrapper=H;L=function(){var a;a=new B.ptr(null);$unused(a);};O.methods=[{prop:"Get",name:"Get",pkg:"",typ:$funcType([$String],[O],false)},{prop:"Set",name:"Set",pkg:"",typ:$funcType([$String,$emptyInterface],[],false)},{prop:"Delete",name:"Delete",pkg:"",typ:$funcType([$String],[],false)},{prop:"Length",name:"Length",pkg:"",typ:$funcType([],[$Int],false)},{prop:"Index",name:"Index",pkg:"",typ:$funcType([$Int],[O],false)},{prop:"SetIndex",name:"SetIndex",pkg:"",typ:$funcType([$Int,$emptyInterface],[],false)},{prop:"Call",name:"Call",pkg:"",typ:$funcType([$String,M],[O],true)},{prop:"Invoke",name:"Invoke",pkg:"",typ:$funcType([M],[O],true)},{prop:"New",name:"New",pkg:"",typ:$funcType([M],[O],true)},{prop:"Bool",name:"Bool",pkg:"",typ:$funcType([],[$Bool],false)},{prop:"String",name:"String",pkg:"",typ:$funcType([],[$String],false)},{prop:"Int",name:"Int",pkg:"",typ:$funcType([],[$Int],false)},{prop:"Int64",name:"Int64",pkg:"",typ:$funcType([],[$Int64],false)},{prop:"Uint64",name:"Uint64",pkg:"",typ:$funcType([],[$Uint64],false)},{prop:"Float",name:"Float",pkg:"",typ:$funcType([],[$Float64],false)},{prop:"Interface",name:"Interface",pkg:"",typ:$funcType([],[$emptyInterface],false)},{prop:"Unsafe",name:"Unsafe",pkg:"",typ:$funcType([],[$Uintptr],false)}];T.methods=[{prop:"Error",name:"Error",pkg:"",typ:$funcType([],[$String],false)},{prop:"Stack",name:"Stack",pkg:"",typ:$funcType([],[$String],false)}];A.init("github.com/gopherjs/gopherjs/js",[{prop:"object",name:"object",embedded:false,exported:false,typ:O,tag:""}]);B.init("",[{prop:"Object",name:"Object",embedded:true,exported:true,typ:O,tag:""}]);J.init($String,$emptyInterface);K.init($emptyInterface);$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:L();}return;}if($f===undefined){$f={$blk:$init};}$f.$s=$s;$f.$r=$r;return $f;};$pkg.$init=$init;return $pkg;})(); -$packages["runtime"]=(function(){var $pkg={},$init,A,C,D,AT,AZ,BD,AM,E,AU;A=$packages["github.com/gopherjs/gopherjs/js"];C=$pkg._type=$newType(0,$kindStruct,"runtime._type",true,"runtime",false,function(str_){this.$val=this;if(arguments.length===0){this.str="";return;}this.str=str_;});D=$pkg.TypeAssertionError=$newType(0,$kindStruct,"runtime.TypeAssertionError",true,"runtime",true,function(_interface_,concrete_,asserted_,missingMethod_){this.$val=this;if(arguments.length===0){this._interface=AZ.nil;this.concrete=AZ.nil;this.asserted=AZ.nil;this.missingMethod="";return;}this._interface=_interface_;this.concrete=concrete_;this.asserted=asserted_;this.missingMethod=missingMethod_;});AT=$pkg.errorString=$newType(8,$kindString,"runtime.errorString",true,"runtime",false,null);AZ=$ptrType(C);BD=$ptrType(D);C.ptr.prototype.string=function(){var a;a=this;return a.str;};C.prototype.string=function(){return this.$val.string();};C.ptr.prototype.pkgpath=function(){var a;a=this;return"";};C.prototype.pkgpath=function(){return this.$val.pkgpath();};D.ptr.prototype.RuntimeError=function(){};D.prototype.RuntimeError=function(){return this.$val.RuntimeError();};D.ptr.prototype.Error=function(){var a,b,c,d,e;a=this;b="interface";if(!(a._interface===AZ.nil)){b=a._interface.string();}c=a.asserted.string();if(a.concrete===AZ.nil){return"interface conversion: "+b+" is nil, not "+c;}d=a.concrete.string();if(a.missingMethod===""){e="interface conversion: "+b+" is "+d+", not "+c;if(d===c){if(!(a.concrete.pkgpath()===a.asserted.pkgpath())){e=e+(" (types from different packages)");}else{e=e+(" (types from different scopes)");}}return e;}return"interface conversion: "+d+" is not "+c+": missing method "+a.missingMethod;};D.prototype.Error=function(){return this.$val.Error();};E=function(){var a,b;a=$packages[$externalize("github.com/gopherjs/gopherjs/js",$String)];$jsObjectPtr=a.Object.ptr;$jsErrorPtr=a.Error.ptr;$throwRuntimeError=AU;AM=$internalize($goVersion,$String);b=$ifaceNil;b=new D.ptr(AZ.nil,AZ.nil,AZ.nil,"");$unused(b);};AT.prototype.RuntimeError=function(){var a;a=this.$val;};$ptrType(AT).prototype.RuntimeError=function(){return new AT(this.$get()).RuntimeError();};AT.prototype.Error=function(){var a;a=this.$val;return"runtime error: "+(a);};$ptrType(AT).prototype.Error=function(){return new AT(this.$get()).Error();};AU=function(a){var a;$panic(new AT((a)));};AZ.methods=[{prop:"string",name:"string",pkg:"runtime",typ:$funcType([],[$String],false)},{prop:"pkgpath",name:"pkgpath",pkg:"runtime",typ:$funcType([],[$String],false)}];BD.methods=[{prop:"RuntimeError",name:"RuntimeError",pkg:"",typ:$funcType([],[],false)},{prop:"Error",name:"Error",pkg:"",typ:$funcType([],[$String],false)}];AT.methods=[{prop:"RuntimeError",name:"RuntimeError",pkg:"",typ:$funcType([],[],false)},{prop:"Error",name:"Error",pkg:"",typ:$funcType([],[$String],false)}];C.init("runtime",[{prop:"str",name:"str",embedded:false,exported:false,typ:$String,tag:""}]);D.init("runtime",[{prop:"_interface",name:"_interface",embedded:false,exported:false,typ:AZ,tag:""},{prop:"concrete",name:"concrete",embedded:false,exported:false,typ:AZ,tag:""},{prop:"asserted",name:"asserted",embedded:false,exported:false,typ:AZ,tag:""},{prop:"missingMethod",name:"missingMethod",embedded:false,exported:false,typ:$String,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;}AM="";E();}return;}if($f===undefined){$f={$blk:$init};}$f.$s=$s;$f.$r=$r;return $f;};$pkg.$init=$init;return $pkg;})(); -$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;})(); +var $NaN = NaN; +var $global, $module; +if (typeof window !== "undefined") { /* web page */ + $global = window; +} else if (typeof self !== "undefined") { /* web worker */ + $global = self; +} else if (typeof global !== "undefined") { /* Node.js */ + $global = global; + $global.require = require; +} else { /* others (e.g. Nashorn) */ + $global = this; +} + +if ($global === undefined || $global.Array === undefined) { + throw new Error("no global object found"); +} +if (typeof module !== "undefined") { + $module = module; +} + +if (!$global.fs && $global.require) { + try { + var fs = $global.require('fs'); + if (typeof fs === "object" && fs !== null && Object.keys(fs).length !== 0) { + $global.fs = fs; + } + } catch(e) { /* Ignore if the module couldn't be loaded. */ } +} + +if (!$global.fs) { + var outputBuf = ""; + var decoder = new TextDecoder("utf-8"); + $global.fs = { + constants: { O_WRONLY: -1, O_RDWR: -1, O_CREAT: -1, O_TRUNC: -1, O_APPEND: -1, O_EXCL: -1 }, // unused + writeSync: function writeSync(fd, buf) { + outputBuf += decoder.decode(buf); + var nl = outputBuf.lastIndexOf("\n"); + if (nl != -1) { + console.log(outputBuf.substr(0, nl)); + outputBuf = outputBuf.substr(nl + 1); + } + return buf.length; + }, + write: function write(fd, buf, offset, length, position, callback) { + if (offset !== 0 || length !== buf.length || position !== null) { + callback(enosys()); + return; + } + var n = this.writeSync(fd, buf); + callback(null, n); + } + }; +} + +var $linknames = {} // Collection of functions referenced by a go:linkname directive. +var $packages = {}, $idCounter = 0; +var $keys = function(m) { return m ? Object.keys(m) : []; }; +var $flushConsole = function() {}; +var $throwRuntimeError; /* set by package "runtime" */ +var $throwNilPointerError = function() { $throwRuntimeError("invalid memory address or nil pointer dereference"); }; +var $call = function(fn, rcvr, args) { return fn.apply(rcvr, args); }; +var $makeFunc = function(fn) { return function() { return $externalize(fn(this, new ($sliceType($jsObjectPtr))($global.Array.prototype.slice.call(arguments, []))), $emptyInterface); }; }; +var $unused = function(v) {}; +var $print = console.log; +// Under Node we can emulate print() more closely by avoiding a newline. +if (($global.process !== undefined) && $global.require) { + try { + var util = $global.require('util'); + $print = function() { $global.process.stderr.write(util.format.apply(this, arguments)); }; + } catch (e) { + // Failed to require util module, keep using console.log(). + } +} +var $println = console.log + +var $initAllLinknames = function() { + var names = $keys($packages); + for (var i = 0; i < names.length; i++) { + var f = $packages[names[i]]["$initLinknames"]; + if (typeof f == 'function') { + f(); + } + } +} + +var $mapArray = function(array, f) { + var newArray = new array.constructor(array.length); + for (var i = 0; i < array.length; i++) { + newArray[i] = f(array[i]); + } + return newArray; +}; + +// Returns a method bound to the receiver instance, safe to invoke as a +// standalone function. Bound function is cached for later reuse. +var $methodVal = function(recv, name) { + var vals = recv.$methodVals || {}; + recv.$methodVals = vals; /* noop for primitives */ + var f = vals[name]; + if (f !== undefined) { + return f; + } + var method = recv[name]; + f = method.bind(recv); + vals[name] = f; + return f; +}; + +var $methodExpr = function(typ, name) { + var method = typ.prototype[name]; + if (method.$expr === undefined) { + method.$expr = function() { + $stackDepthOffset--; + try { + if (typ.wrapped) { + arguments[0] = new typ(arguments[0]); + } + return Function.call.apply(method, arguments); + } finally { + $stackDepthOffset++; + } + }; + } + return method.$expr; +}; + +var $ifaceMethodExprs = {}; +var $ifaceMethodExpr = function(name) { + var expr = $ifaceMethodExprs["$" + name]; + if (expr === undefined) { + expr = $ifaceMethodExprs["$" + name] = function() { + $stackDepthOffset--; + try { + return Function.call.apply(arguments[0][name], arguments); + } finally { + $stackDepthOffset++; + } + }; + } + return expr; +}; + +var $subslice = function(slice, low, high, max) { + if (high === undefined) { + high = slice.$length; + } + if (max === undefined) { + max = slice.$capacity; + } + if (low < 0 || high < low || max < high || high > slice.$capacity || max > slice.$capacity) { + $throwRuntimeError("slice bounds out of range"); + } + if (slice === slice.constructor.nil) { + return slice; + } + var s = new slice.constructor(slice.$array); + s.$offset = slice.$offset + low; + s.$length = high - low; + s.$capacity = max - low; + return s; +}; + +var $substring = function(str, low, high) { + if (low < 0 || high < low || high > str.length) { + $throwRuntimeError("slice bounds out of range"); + } + return str.substring(low, high); +}; + +// Convert Go slice to an equivalent JS array type. +var $sliceToNativeArray = function(slice) { + if (slice.$array.constructor !== Array) { + return slice.$array.subarray(slice.$offset, slice.$offset + slice.$length); + } + return slice.$array.slice(slice.$offset, slice.$offset + slice.$length); +}; + +// Convert Go slice to a pointer to an underlying Go array. +// +// Note that an array pointer can be represented by an "unwrapped" native array +// type, and it will be wrapped back into its Go type when necessary. +var $sliceToGoArray = function(slice, arrayPtrType) { + var arrayType = arrayPtrType.elem; + if (arrayType !== undefined && slice.$length < arrayType.len) { + $throwRuntimeError("cannot convert slice with length " + slice.$length + " to pointer to array with length " + arrayType.len); + } + if (slice == slice.constructor.nil) { + return arrayPtrType.nil; // Nil slice converts to nil array pointer. + } + if (slice.$array.constructor !== Array) { + return slice.$array.subarray(slice.$offset, slice.$offset + arrayType.len); + } + if (slice.$offset == 0 && slice.$length == slice.$capacity && slice.$length == arrayType.len) { + return slice.$array; + } + if (arrayType.len == 0) { + return new arrayType([]); + } + + // Array.slice (unlike TypedArray.subarray) returns a copy of an array range, + // which is not sharing memory with the original one, which violates the spec + // for slice to array conversion. This is incompatible with the Go spec, in + // particular that the assignments to the array elements would be visible in + // the slice. Prefer to fail explicitly instead of creating subtle bugs. + $throwRuntimeError("gopherjs: non-numeric slice to underlying array conversion is not supported for subslices"); +}; + +// Convert between compatible slice types (e.g. native and names). +var $convertSliceType = function(slice, desiredType) { + if (slice == slice.constructor.nil) { + return desiredType.nil; // Preserve nil value. + } + + return $subslice(new desiredType(slice.$array), slice.$offset, slice.$offset + slice.$length); +} + +var $decodeRune = function(str, pos) { + var c0 = str.charCodeAt(pos); + + if (c0 < 0x80) { + return [c0, 1]; + } + + if (c0 !== c0 || c0 < 0xC0) { + return [0xFFFD, 1]; + } + + var c1 = str.charCodeAt(pos + 1); + if (c1 !== c1 || c1 < 0x80 || 0xC0 <= c1) { + return [0xFFFD, 1]; + } + + if (c0 < 0xE0) { + var r = (c0 & 0x1F) << 6 | (c1 & 0x3F); + if (r <= 0x7F) { + return [0xFFFD, 1]; + } + return [r, 2]; + } + + var c2 = str.charCodeAt(pos + 2); + if (c2 !== c2 || c2 < 0x80 || 0xC0 <= c2) { + return [0xFFFD, 1]; + } + + if (c0 < 0xF0) { + var r = (c0 & 0x0F) << 12 | (c1 & 0x3F) << 6 | (c2 & 0x3F); + if (r <= 0x7FF) { + return [0xFFFD, 1]; + } + if (0xD800 <= r && r <= 0xDFFF) { + return [0xFFFD, 1]; + } + return [r, 3]; + } + + var c3 = str.charCodeAt(pos + 3); + if (c3 !== c3 || c3 < 0x80 || 0xC0 <= c3) { + return [0xFFFD, 1]; + } + + if (c0 < 0xF8) { + var r = (c0 & 0x07) << 18 | (c1 & 0x3F) << 12 | (c2 & 0x3F) << 6 | (c3 & 0x3F); + if (r <= 0xFFFF || 0x10FFFF < r) { + return [0xFFFD, 1]; + } + return [r, 4]; + } + + return [0xFFFD, 1]; +}; + +var $encodeRune = function(r) { + if (r < 0 || r > 0x10FFFF || (0xD800 <= r && r <= 0xDFFF)) { + r = 0xFFFD; + } + if (r <= 0x7F) { + return String.fromCharCode(r); + } + if (r <= 0x7FF) { + return String.fromCharCode(0xC0 | r >> 6, 0x80 | (r & 0x3F)); + } + if (r <= 0xFFFF) { + return String.fromCharCode(0xE0 | r >> 12, 0x80 | (r >> 6 & 0x3F), 0x80 | (r & 0x3F)); + } + return String.fromCharCode(0xF0 | r >> 18, 0x80 | (r >> 12 & 0x3F), 0x80 | (r >> 6 & 0x3F), 0x80 | (r & 0x3F)); +}; + +var $stringToBytes = function(str) { + var array = new Uint8Array(str.length); + for (var i = 0; i < str.length; i++) { + array[i] = str.charCodeAt(i); + } + return array; +}; + +var $bytesToString = function(slice) { + if (slice.$length === 0) { + return ""; + } + var str = ""; + for (var i = 0; i < slice.$length; i += 10000) { + str += String.fromCharCode.apply(undefined, slice.$array.subarray(slice.$offset + i, slice.$offset + Math.min(slice.$length, i + 10000))); + } + return str; +}; + +var $stringToRunes = function(str) { + var array = new Int32Array(str.length); + var rune, j = 0; + for (var i = 0; i < str.length; i += rune[1], j++) { + rune = $decodeRune(str, i); + array[j] = rune[0]; + } + return array.subarray(0, j); +}; + +var $runesToString = function(slice) { + if (slice.$length === 0) { + return ""; + } + var str = ""; + for (var i = 0; i < slice.$length; i++) { + str += $encodeRune(slice.$array[slice.$offset + i]); + } + return str; +}; + +var $copyString = function(dst, src) { + var n = Math.min(src.length, dst.$length); + for (var i = 0; i < n; i++) { + dst.$array[dst.$offset + i] = src.charCodeAt(i); + } + return n; +}; + +var $copySlice = function(dst, src) { + var n = Math.min(src.$length, dst.$length); + $copyArray(dst.$array, src.$array, dst.$offset, src.$offset, n, dst.constructor.elem); + return n; +}; + +var $copyArray = function(dst, src, dstOffset, srcOffset, n, elem) { + if (n === 0 || (dst === src && dstOffset === srcOffset)) { + return; + } + + if (src.subarray) { + dst.set(src.subarray(srcOffset, srcOffset + n), dstOffset); + return; + } + + switch (elem.kind) { + case $kindArray: + case $kindStruct: + if (dst === src && dstOffset > srcOffset) { + for (var i = n - 1; i >= 0; i--) { + elem.copy(dst[dstOffset + i], src[srcOffset + i]); + } + return; + } + for (var i = 0; i < n; i++) { + elem.copy(dst[dstOffset + i], src[srcOffset + i]); + } + return; + } + + if (dst === src && dstOffset > srcOffset) { + for (var i = n - 1; i >= 0; i--) { + dst[dstOffset + i] = src[srcOffset + i]; + } + return; + } + for (var i = 0; i < n; i++) { + dst[dstOffset + i] = src[srcOffset + i]; + } +}; + +var $clone = function(src, type) { + var clone = type.zero(); + type.copy(clone, src); + return clone; +}; + +var $pointerOfStructConversion = function(obj, type) { + if(obj.$proxies === undefined) { + obj.$proxies = {}; + obj.$proxies[obj.constructor.string] = obj; + } + var proxy = obj.$proxies[type.string]; + if (proxy === undefined) { + var properties = {}; + for (var i = 0; i < type.elem.fields.length; i++) { + (function(fieldProp) { + properties[fieldProp] = { + get: function() { return obj[fieldProp]; }, + set: function(value) { obj[fieldProp] = value; } + }; + })(type.elem.fields[i].prop); + } + proxy = Object.create(type.prototype, properties); + proxy.$val = proxy; + obj.$proxies[type.string] = proxy; + proxy.$proxies = obj.$proxies; + } + return proxy; +}; + +var $append = function(slice) { + return $internalAppend(slice, arguments, 1, arguments.length - 1); +}; + +var $appendSlice = function(slice, toAppend) { + if (toAppend.constructor === String) { + var bytes = $stringToBytes(toAppend); + return $internalAppend(slice, bytes, 0, bytes.length); + } + return $internalAppend(slice, toAppend.$array, toAppend.$offset, toAppend.$length); +}; + +var $internalAppend = function(slice, array, offset, length) { + if (length === 0) { + return slice; + } + + var newArray = slice.$array; + var newOffset = slice.$offset; + var newLength = slice.$length + length; + var newCapacity = slice.$capacity; + + if (newLength > newCapacity) { + newOffset = 0; + newCapacity = Math.max(newLength, slice.$capacity < 1024 ? slice.$capacity * 2 : Math.floor(slice.$capacity * 5 / 4)); + + if (slice.$array.constructor === Array) { + newArray = slice.$array.slice(slice.$offset, slice.$offset + slice.$length); + newArray.length = newCapacity; + var zero = slice.constructor.elem.zero; + for (var i = slice.$length; i < newCapacity; i++) { + newArray[i] = zero(); + } + } else { + newArray = new slice.$array.constructor(newCapacity); + newArray.set(slice.$array.subarray(slice.$offset, slice.$offset + slice.$length)); + } + } + + $copyArray(newArray, array, newOffset + slice.$length, offset, length, slice.constructor.elem); + + var newSlice = new slice.constructor(newArray); + newSlice.$offset = newOffset; + newSlice.$length = newLength; + newSlice.$capacity = newCapacity; + return newSlice; +}; + +var $equal = function(a, b, type) { + if (type === $jsObjectPtr) { + return a === b; + } + switch (type.kind) { + case $kindComplex64: + case $kindComplex128: + return a.$real === b.$real && a.$imag === b.$imag; + case $kindInt64: + case $kindUint64: + return a.$high === b.$high && a.$low === b.$low; + case $kindArray: + if (a.length !== b.length) { + return false; + } + for (var i = 0; i < a.length; i++) { + if (!$equal(a[i], b[i], type.elem)) { + return false; + } + } + return true; + case $kindStruct: + for (var i = 0; i < type.fields.length; i++) { + var f = type.fields[i]; + if (!$equal(a[f.prop], b[f.prop], f.typ)) { + return false; + } + } + return true; + case $kindInterface: + return $interfaceIsEqual(a, b); + default: + return a === b; + } +}; + +var $interfaceIsEqual = function(a, b) { + if (a === $ifaceNil || b === $ifaceNil) { + return a === b; + } + if (a.constructor !== b.constructor) { + return false; + } + if (a.constructor === $jsObjectPtr) { + return a.object === b.object; + } + if (!a.constructor.comparable) { + $throwRuntimeError("comparing uncomparable type " + a.constructor.string); + } + return $equal(a.$val, b.$val, a.constructor); +}; + +var $min = Math.min; +var $mod = function(x, y) { return x % y; }; +var $parseInt = parseInt; +var $parseFloat = function(f) { + if (f !== undefined && f !== null && f.constructor === Number) { + return f; + } + return parseFloat(f); +}; + +var $froundBuf = new Float32Array(1); +var $fround = Math.fround || function(f) { + $froundBuf[0] = f; + return $froundBuf[0]; +}; + +var $imul = Math.imul || function(a, b) { + var ah = (a >>> 16) & 0xffff; + var al = a & 0xffff; + var bh = (b >>> 16) & 0xffff; + var bl = b & 0xffff; + return ((al * bl) + (((ah * bl + al * bh) << 16) >>> 0) >> 0); +}; + +var $floatKey = function(f) { + if (f !== f) { + $idCounter++; + return "NaN$" + $idCounter; + } + return String(f); +}; + +var $flatten64 = function(x) { + return x.$high * 4294967296 + x.$low; +}; + +var $shiftLeft64 = function(x, y) { + if (y === 0) { + return x; + } + if (y < 32) { + return new x.constructor(x.$high << y | x.$low >>> (32 - y), (x.$low << y) >>> 0); + } + if (y < 64) { + return new x.constructor(x.$low << (y - 32), 0); + } + return new x.constructor(0, 0); +}; + +var $shiftRightInt64 = function(x, y) { + if (y === 0) { + return x; + } + if (y < 32) { + return new x.constructor(x.$high >> y, (x.$low >>> y | x.$high << (32 - y)) >>> 0); + } + if (y < 64) { + return new x.constructor(x.$high >> 31, (x.$high >> (y - 32)) >>> 0); + } + if (x.$high < 0) { + return new x.constructor(-1, 4294967295); + } + return new x.constructor(0, 0); +}; + +var $shiftRightUint64 = function(x, y) { + if (y === 0) { + return x; + } + if (y < 32) { + return new x.constructor(x.$high >>> y, (x.$low >>> y | x.$high << (32 - y)) >>> 0); + } + if (y < 64) { + return new x.constructor(0, x.$high >>> (y - 32)); + } + return new x.constructor(0, 0); +}; + +var $mul64 = function(x, y) { + var x48 = x.$high >>> 16; + var x32 = x.$high & 0xFFFF; + var x16 = x.$low >>> 16; + var x00 = x.$low & 0xFFFF; + + var y48 = y.$high >>> 16; + var y32 = y.$high & 0xFFFF; + var y16 = y.$low >>> 16; + var y00 = y.$low & 0xFFFF; + + var z48 = 0, z32 = 0, z16 = 0, z00 = 0; + z00 += x00 * y00; + z16 += z00 >>> 16; + z00 &= 0xFFFF; + z16 += x16 * y00; + z32 += z16 >>> 16; + z16 &= 0xFFFF; + z16 += x00 * y16; + z32 += z16 >>> 16; + z16 &= 0xFFFF; + z32 += x32 * y00; + z48 += z32 >>> 16; + z32 &= 0xFFFF; + z32 += x16 * y16; + z48 += z32 >>> 16; + z32 &= 0xFFFF; + z32 += x00 * y32; + z48 += z32 >>> 16; + z32 &= 0xFFFF; + z48 += x48 * y00 + x32 * y16 + x16 * y32 + x00 * y48; + z48 &= 0xFFFF; + + var hi = ((z48 << 16) | z32) >>> 0; + var lo = ((z16 << 16) | z00) >>> 0; + + var r = new x.constructor(hi, lo); + return r; +}; + +var $div64 = function(x, y, returnRemainder) { + if (y.$high === 0 && y.$low === 0) { + $throwRuntimeError("integer divide by zero"); + } + + var s = 1; + var rs = 1; + + var xHigh = x.$high; + var xLow = x.$low; + if (xHigh < 0) { + s = -1; + rs = -1; + xHigh = -xHigh; + if (xLow !== 0) { + xHigh--; + xLow = 4294967296 - xLow; + } + } + + var yHigh = y.$high; + var yLow = y.$low; + if (y.$high < 0) { + s *= -1; + yHigh = -yHigh; + if (yLow !== 0) { + yHigh--; + yLow = 4294967296 - yLow; + } + } + + var high = 0, low = 0, n = 0; + while (yHigh < 2147483648 && ((xHigh > yHigh) || (xHigh === yHigh && xLow > yLow))) { + yHigh = (yHigh << 1 | yLow >>> 31) >>> 0; + yLow = (yLow << 1) >>> 0; + n++; + } + for (var i = 0; i <= n; i++) { + high = high << 1 | low >>> 31; + low = (low << 1) >>> 0; + if ((xHigh > yHigh) || (xHigh === yHigh && xLow >= yLow)) { + xHigh = xHigh - yHigh; + xLow = xLow - yLow; + if (xLow < 0) { + xHigh--; + xLow += 4294967296; + } + low++; + if (low === 4294967296) { + high++; + low = 0; + } + } + yLow = (yLow >>> 1 | yHigh << (32 - 1)) >>> 0; + yHigh = yHigh >>> 1; + } + + if (returnRemainder) { + return new x.constructor(xHigh * rs, xLow * rs); + } + return new x.constructor(high * s, low * s); +}; + +var $divComplex = function(n, d) { + var ninf = n.$real === Infinity || n.$real === -Infinity || n.$imag === Infinity || n.$imag === -Infinity; + var dinf = d.$real === Infinity || d.$real === -Infinity || d.$imag === Infinity || d.$imag === -Infinity; + var nnan = !ninf && (n.$real !== n.$real || n.$imag !== n.$imag); + var dnan = !dinf && (d.$real !== d.$real || d.$imag !== d.$imag); + if(nnan || dnan) { + return new n.constructor(NaN, NaN); + } + if (ninf && !dinf) { + return new n.constructor(Infinity, Infinity); + } + if (!ninf && dinf) { + return new n.constructor(0, 0); + } + if (d.$real === 0 && d.$imag === 0) { + if (n.$real === 0 && n.$imag === 0) { + return new n.constructor(NaN, NaN); + } + return new n.constructor(Infinity, Infinity); + } + var a = Math.abs(d.$real); + var b = Math.abs(d.$imag); + if (a <= b) { + var ratio = d.$real / d.$imag; + var denom = d.$real * ratio + d.$imag; + return new n.constructor((n.$real * ratio + n.$imag) / denom, (n.$imag * ratio - n.$real) / denom); + } + var ratio = d.$imag / d.$real; + var denom = d.$imag * ratio + d.$real; + return new n.constructor((n.$imag * ratio + n.$real) / denom, (n.$imag - n.$real * ratio) / denom); +}; + +var $kindBool = 1; +var $kindInt = 2; +var $kindInt8 = 3; +var $kindInt16 = 4; +var $kindInt32 = 5; +var $kindInt64 = 6; +var $kindUint = 7; +var $kindUint8 = 8; +var $kindUint16 = 9; +var $kindUint32 = 10; +var $kindUint64 = 11; +var $kindUintptr = 12; +var $kindFloat32 = 13; +var $kindFloat64 = 14; +var $kindComplex64 = 15; +var $kindComplex128 = 16; +var $kindArray = 17; +var $kindChan = 18; +var $kindFunc = 19; +var $kindInterface = 20; +var $kindMap = 21; +var $kindPtr = 22; +var $kindSlice = 23; +var $kindString = 24; +var $kindStruct = 25; +var $kindUnsafePointer = 26; + +var $methodSynthesizers = []; +var $addMethodSynthesizer = function(f) { + if ($methodSynthesizers === null) { + f(); + return; + } + $methodSynthesizers.push(f); +}; +var $synthesizeMethods = function() { + $methodSynthesizers.forEach(function(f) { f(); }); + $methodSynthesizers = null; +}; + +var $ifaceKeyFor = function(x) { + if (x === $ifaceNil) { + return 'nil'; + } + var c = x.constructor; + return c.string + '$' + c.keyFor(x.$val); +}; + +var $identity = function(x) { return x; }; + +var $typeIDCounter = 0; + +var $idKey = function(x) { + if (x.$id === undefined) { + $idCounter++; + x.$id = $idCounter; + } + return String(x.$id); +}; + +// Creates constructor functions for array pointer types. Returns a new function +// instace each time to make sure each type is independent of the other. +var $arrayPtrCtor = function() { + return function(array) { + this.$get = function() { return array; }; + this.$set = function(v) { typ.copy(this, v); }; + this.$val = array; + } +} + +var $newType = function(size, kind, string, named, pkg, exported, constructor) { + var typ; + switch(kind) { + case $kindBool: + case $kindInt: + case $kindInt8: + case $kindInt16: + case $kindInt32: + case $kindUint: + case $kindUint8: + case $kindUint16: + case $kindUint32: + case $kindUintptr: + case $kindUnsafePointer: + typ = function(v) { this.$val = v; }; + typ.wrapped = true; + typ.keyFor = $identity; + break; + + case $kindString: + typ = function(v) { this.$val = v; }; + typ.wrapped = true; + typ.keyFor = function(x) { return "$" + x; }; + break; + + case $kindFloat32: + case $kindFloat64: + typ = function(v) { this.$val = v; }; + typ.wrapped = true; + typ.keyFor = function(x) { return $floatKey(x); }; + break; + + case $kindInt64: + typ = function(high, low) { + this.$high = (high + Math.floor(Math.ceil(low) / 4294967296)) >> 0; + this.$low = low >>> 0; + this.$val = this; + }; + typ.keyFor = function(x) { return x.$high + "$" + x.$low; }; + break; + + case $kindUint64: + typ = function(high, low) { + this.$high = (high + Math.floor(Math.ceil(low) / 4294967296)) >>> 0; + this.$low = low >>> 0; + this.$val = this; + }; + typ.keyFor = function(x) { return x.$high + "$" + x.$low; }; + break; + + case $kindComplex64: + typ = function(real, imag) { + this.$real = $fround(real); + this.$imag = $fround(imag); + this.$val = this; + }; + typ.keyFor = function(x) { return x.$real + "$" + x.$imag; }; + break; + + case $kindComplex128: + typ = function(real, imag) { + this.$real = real; + this.$imag = imag; + this.$val = this; + }; + typ.keyFor = function(x) { return x.$real + "$" + x.$imag; }; + break; + + case $kindArray: + typ = function(v) { this.$val = v; }; + typ.wrapped = true; + typ.ptr = $newType(4, $kindPtr, "*" + string, false, "", false, $arrayPtrCtor()); + typ.init = function(elem, len) { + typ.elem = elem; + typ.len = len; + typ.comparable = elem.comparable; + typ.keyFor = function(x) { + return Array.prototype.join.call($mapArray(x, function(e) { + return String(elem.keyFor(e)).replace(/\\/g, "\\\\").replace(/\$/g, "\\$"); + }), "$"); + }; + typ.copy = function(dst, src) { + $copyArray(dst, src, 0, 0, src.length, elem); + }; + typ.ptr.init(typ); + Object.defineProperty(typ.ptr.nil, "nilCheck", { get: $throwNilPointerError }); + }; + break; + + case $kindChan: + typ = function(v) { this.$val = v; }; + typ.wrapped = true; + typ.keyFor = $idKey; + typ.init = function(elem, sendOnly, recvOnly) { + typ.elem = elem; + typ.sendOnly = sendOnly; + typ.recvOnly = recvOnly; + }; + break; + + case $kindFunc: + typ = function(v) { this.$val = v; }; + typ.wrapped = true; + typ.init = function(params, results, variadic) { + typ.params = params; + typ.results = results; + typ.variadic = variadic; + typ.comparable = false; + }; + break; + + case $kindInterface: + typ = { implementedBy: {}, missingMethodFor: {} }; + typ.keyFor = $ifaceKeyFor; + typ.init = function(methods) { + typ.methods = methods; + methods.forEach(function(m) { + $ifaceNil[m.prop] = $throwNilPointerError; + }); + }; + break; + + case $kindMap: + typ = function(v) { this.$val = v; }; + typ.wrapped = true; + typ.init = function(key, elem) { + typ.key = key; + typ.elem = elem; + typ.comparable = false; + }; + break; + + case $kindPtr: + typ = constructor || function(getter, setter, target) { + this.$get = getter; + this.$set = setter; + this.$target = target; + this.$val = this; + }; + typ.keyFor = $idKey; + typ.init = function(elem) { + typ.elem = elem; + typ.wrapped = (elem.kind === $kindArray); + typ.nil = new typ($throwNilPointerError, $throwNilPointerError); + }; + break; + + case $kindSlice: + typ = function(array) { + if (array.constructor !== typ.nativeArray) { + array = new typ.nativeArray(array); + } + this.$array = array; + this.$offset = 0; + this.$length = array.length; + this.$capacity = array.length; + this.$val = this; + }; + typ.init = function(elem) { + typ.elem = elem; + typ.comparable = false; + typ.nativeArray = $nativeArray(elem.kind); + typ.nil = new typ([]); + }; + break; + + case $kindStruct: + typ = function(v) { this.$val = v; }; + typ.wrapped = true; + typ.ptr = $newType(4, $kindPtr, "*" + string, false, pkg, exported, constructor); + typ.ptr.elem = typ; + typ.ptr.prototype.$get = function() { return this; }; + typ.ptr.prototype.$set = function(v) { typ.copy(this, v); }; + typ.init = function(pkgPath, fields) { + typ.pkgPath = pkgPath; + typ.fields = fields; + fields.forEach(function(f) { + if (!f.typ.comparable) { + typ.comparable = false; + } + }); + typ.keyFor = function(x) { + var val = x.$val; + return $mapArray(fields, function(f) { + return String(f.typ.keyFor(val[f.prop])).replace(/\\/g, "\\\\").replace(/\$/g, "\\$"); + }).join("$"); + }; + typ.copy = function(dst, src) { + for (var i = 0; i < fields.length; i++) { + var f = fields[i]; + switch (f.typ.kind) { + case $kindArray: + case $kindStruct: + f.typ.copy(dst[f.prop], src[f.prop]); + continue; + default: + dst[f.prop] = src[f.prop]; + continue; + } + } + }; + /* nil value */ + var properties = {}; + fields.forEach(function(f) { + properties[f.prop] = { get: $throwNilPointerError, set: $throwNilPointerError }; + }); + typ.ptr.nil = Object.create(constructor.prototype, properties); + typ.ptr.nil.$val = typ.ptr.nil; + /* methods for embedded fields */ + $addMethodSynthesizer(function() { + var synthesizeMethod = function(target, m, f) { + if (target.prototype[m.prop] !== undefined) { return; } + target.prototype[m.prop] = function() { + var v = this.$val[f.prop]; + if (f.typ === $jsObjectPtr) { + v = new $jsObjectPtr(v); + } + if (v.$val === undefined) { + v = new f.typ(v); + } + return v[m.prop].apply(v, arguments); + }; + }; + fields.forEach(function(f) { + if (f.embedded) { + $methodSet(f.typ).forEach(function(m) { + synthesizeMethod(typ, m, f); + synthesizeMethod(typ.ptr, m, f); + }); + $methodSet($ptrType(f.typ)).forEach(function(m) { + synthesizeMethod(typ.ptr, m, f); + }); + } + }); + }); + }; + break; + + default: + $panic(new $String("invalid kind: " + kind)); + } + + switch (kind) { + case $kindBool: + case $kindMap: + typ.zero = function() { return false; }; + break; + + case $kindInt: + case $kindInt8: + case $kindInt16: + case $kindInt32: + case $kindUint: + case $kindUint8 : + case $kindUint16: + case $kindUint32: + case $kindUintptr: + case $kindUnsafePointer: + case $kindFloat32: + case $kindFloat64: + typ.zero = function() { return 0; }; + break; + + case $kindString: + typ.zero = function() { return ""; }; + break; + + case $kindInt64: + case $kindUint64: + case $kindComplex64: + case $kindComplex128: + var zero = new typ(0, 0); + typ.zero = function() { return zero; }; + break; + + case $kindPtr: + case $kindSlice: + typ.zero = function() { return typ.nil; }; + break; + + case $kindChan: + typ.zero = function() { return $chanNil; }; + break; + + case $kindFunc: + typ.zero = function() { return $throwNilPointerError; }; + break; + + case $kindInterface: + typ.zero = function() { return $ifaceNil; }; + break; + + case $kindArray: + typ.zero = function() { + var arrayClass = $nativeArray(typ.elem.kind); + if (arrayClass !== Array) { + return new arrayClass(typ.len); + } + var array = new Array(typ.len); + for (var i = 0; i < typ.len; i++) { + array[i] = typ.elem.zero(); + } + return array; + }; + break; + + case $kindStruct: + typ.zero = function() { return new typ.ptr(); }; + break; + + default: + $panic(new $String("invalid kind: " + kind)); + } + + typ.id = $typeIDCounter; + $typeIDCounter++; + typ.size = size; + typ.kind = kind; + typ.string = string; + typ.named = named; + typ.pkg = pkg; + typ.exported = exported; + typ.methods = []; + typ.methodSetCache = null; + typ.comparable = true; + return typ; +}; + +var $methodSet = function(typ) { + if (typ.methodSetCache !== null) { + return typ.methodSetCache; + } + var base = {}; + + var isPtr = (typ.kind === $kindPtr); + if (isPtr && typ.elem.kind === $kindInterface) { + typ.methodSetCache = []; + return []; + } + + var current = [{typ: isPtr ? typ.elem : typ, indirect: isPtr}]; + + var seen = {}; + + while (current.length > 0) { + var next = []; + var mset = []; + + current.forEach(function(e) { + if (seen[e.typ.string]) { + return; + } + seen[e.typ.string] = true; + + if (e.typ.named) { + mset = mset.concat(e.typ.methods); + if (e.indirect) { + mset = mset.concat($ptrType(e.typ).methods); + } + } + + switch (e.typ.kind) { + case $kindStruct: + e.typ.fields.forEach(function(f) { + if (f.embedded) { + var fTyp = f.typ; + var fIsPtr = (fTyp.kind === $kindPtr); + next.push({typ: fIsPtr ? fTyp.elem : fTyp, indirect: e.indirect || fIsPtr}); + } + }); + break; + + case $kindInterface: + mset = mset.concat(e.typ.methods); + break; + } + }); + + mset.forEach(function(m) { + if (base[m.name] === undefined) { + base[m.name] = m; + } + }); + + current = next; + } + + typ.methodSetCache = []; + Object.keys(base).sort().forEach(function(name) { + typ.methodSetCache.push(base[name]); + }); + return typ.methodSetCache; +}; + +var $Bool = $newType( 1, $kindBool, "bool", true, "", false, null); +var $Int = $newType( 4, $kindInt, "int", true, "", false, null); +var $Int8 = $newType( 1, $kindInt8, "int8", true, "", false, null); +var $Int16 = $newType( 2, $kindInt16, "int16", true, "", false, null); +var $Int32 = $newType( 4, $kindInt32, "int32", true, "", false, null); +var $Int64 = $newType( 8, $kindInt64, "int64", true, "", false, null); +var $Uint = $newType( 4, $kindUint, "uint", true, "", false, null); +var $Uint8 = $newType( 1, $kindUint8, "uint8", true, "", false, null); +var $Uint16 = $newType( 2, $kindUint16, "uint16", true, "", false, null); +var $Uint32 = $newType( 4, $kindUint32, "uint32", true, "", false, null); +var $Uint64 = $newType( 8, $kindUint64, "uint64", true, "", false, null); +var $Uintptr = $newType( 4, $kindUintptr, "uintptr", true, "", false, null); +var $Float32 = $newType( 4, $kindFloat32, "float32", true, "", false, null); +var $Float64 = $newType( 8, $kindFloat64, "float64", true, "", false, null); +var $Complex64 = $newType( 8, $kindComplex64, "complex64", true, "", false, null); +var $Complex128 = $newType(16, $kindComplex128, "complex128", true, "", false, null); +var $String = $newType( 8, $kindString, "string", true, "", false, null); +var $UnsafePointer = $newType( 4, $kindUnsafePointer, "unsafe.Pointer", true, "unsafe", false, null); + +var $nativeArray = function(elemKind) { + switch (elemKind) { + case $kindInt: + return Int32Array; + case $kindInt8: + return Int8Array; + case $kindInt16: + return Int16Array; + case $kindInt32: + return Int32Array; + case $kindUint: + return Uint32Array; + case $kindUint8: + return Uint8Array; + case $kindUint16: + return Uint16Array; + case $kindUint32: + return Uint32Array; + case $kindUintptr: + return Uint32Array; + case $kindFloat32: + return Float32Array; + case $kindFloat64: + return Float64Array; + default: + return Array; + } +}; +var $toNativeArray = function(elemKind, array) { + var nativeArray = $nativeArray(elemKind); + if (nativeArray === Array) { + return array; + } + return new nativeArray(array); +}; +var $arrayTypes = {}; +var $arrayType = function(elem, len) { + var typeKey = elem.id + "$" + len; + var typ = $arrayTypes[typeKey]; + if (typ === undefined) { + typ = $newType(12, $kindArray, "[" + len + "]" + elem.string, false, "", false, null); + $arrayTypes[typeKey] = typ; + typ.init(elem, len); + } + return typ; +}; + +var $chanType = function(elem, sendOnly, recvOnly) { + var string = (recvOnly ? "<-" : "") + "chan" + (sendOnly ? "<- " : " "); + if (!sendOnly && !recvOnly && (elem.string[0] == "<")) { + string += "(" + elem.string + ")"; + } else { + string += elem.string; + } + var field = sendOnly ? "SendChan" : (recvOnly ? "RecvChan" : "Chan"); + var typ = elem[field]; + if (typ === undefined) { + typ = $newType(4, $kindChan, string, false, "", false, null); + elem[field] = typ; + typ.init(elem, sendOnly, recvOnly); + } + return typ; +}; +var $Chan = function(elem, capacity) { + if (capacity < 0 || capacity > 2147483647) { + $throwRuntimeError("makechan: size out of range"); + } + this.$elem = elem; + this.$capacity = capacity; + this.$buffer = []; + this.$sendQueue = []; + this.$recvQueue = []; + this.$closed = false; +}; +var $chanNil = new $Chan(null, 0); +$chanNil.$sendQueue = $chanNil.$recvQueue = { length: 0, push: function() {}, shift: function() { return undefined; }, indexOf: function() { return -1; } }; + +var $funcTypes = {}; +var $funcType = function(params, results, variadic) { + var typeKey = $mapArray(params, function(p) { return p.id; }).join(",") + "$" + $mapArray(results, function(r) { return r.id; }).join(",") + "$" + variadic; + var typ = $funcTypes[typeKey]; + if (typ === undefined) { + var paramTypes = $mapArray(params, function(p) { return p.string; }); + if (variadic) { + paramTypes[paramTypes.length - 1] = "..." + paramTypes[paramTypes.length - 1].substr(2); + } + var string = "func(" + paramTypes.join(", ") + ")"; + if (results.length === 1) { + string += " " + results[0].string; + } else if (results.length > 1) { + string += " (" + $mapArray(results, function(r) { return r.string; }).join(", ") + ")"; + } + typ = $newType(4, $kindFunc, string, false, "", false, null); + $funcTypes[typeKey] = typ; + typ.init(params, results, variadic); + } + return typ; +}; + +var $interfaceTypes = {}; +var $interfaceType = function(methods) { + var typeKey = $mapArray(methods, function(m) { return m.pkg + "," + m.name + "," + m.typ.id; }).join("$"); + var typ = $interfaceTypes[typeKey]; + if (typ === undefined) { + var string = "interface {}"; + if (methods.length !== 0) { + string = "interface { " + $mapArray(methods, function(m) { + return (m.pkg !== "" ? m.pkg + "." : "") + m.name + m.typ.string.substr(4); + }).join("; ") + " }"; + } + typ = $newType(8, $kindInterface, string, false, "", false, null); + $interfaceTypes[typeKey] = typ; + typ.init(methods); + } + return typ; +}; +var $emptyInterface = $interfaceType([]); +var $ifaceNil = {}; +var $error = $newType(8, $kindInterface, "error", true, "", false, null); +$error.init([{prop: "Error", name: "Error", pkg: "", typ: $funcType([], [$String], false)}]); + +var $mapTypes = {}; +var $mapType = function(key, elem) { + var typeKey = key.id + "$" + elem.id; + var typ = $mapTypes[typeKey]; + if (typ === undefined) { + typ = $newType(4, $kindMap, "map[" + key.string + "]" + elem.string, false, "", false, null); + $mapTypes[typeKey] = typ; + typ.init(key, elem); + } + return typ; +}; +var $makeMap = function(keyForFunc, entries) { + var m = {}; + for (var i = 0; i < entries.length; i++) { + var e = entries[i]; + m[keyForFunc(e.k)] = e; + } + return m; +}; + +var $ptrType = function(elem) { + var typ = elem.ptr; + if (typ === undefined) { + typ = $newType(4, $kindPtr, "*" + elem.string, false, "", elem.exported, null); + elem.ptr = typ; + typ.init(elem); + } + return typ; +}; + +var $newDataPointer = function(data, constructor) { + if (constructor.elem.kind === $kindStruct) { + return data; + } + return new constructor(function() { return data; }, function(v) { data = v; }); +}; + +var $indexPtr = function(array, index, constructor) { + if (array.buffer) { + // Pointers to the same underlying ArrayBuffer share cache. + var cache = array.buffer.$ptr = array.buffer.$ptr || {}; + // Pointers of different primitive types are non-comparable and stored in different caches. + var typeCache = cache[array.name] = cache[array.name] || {}; + var cacheIdx = array.BYTES_PER_ELEMENT * index + array.byteOffset; + return typeCache[cacheIdx] || (typeCache[cacheIdx] = new constructor(function() { return array[index]; }, function(v) { array[index] = v; })); + } else { + array.$ptr = array.$ptr || {}; + return array.$ptr[index] || (array.$ptr[index] = new constructor(function() { return array[index]; }, function(v) { array[index] = v; })); + } +}; + +var $sliceType = function(elem) { + var typ = elem.slice; + if (typ === undefined) { + typ = $newType(12, $kindSlice, "[]" + elem.string, false, "", false, null); + elem.slice = typ; + typ.init(elem); + } + return typ; +}; +var $makeSlice = function(typ, length, capacity) { + capacity = capacity || length; + if (length < 0 || length > 2147483647) { + $throwRuntimeError("makeslice: len out of range"); + } + if (capacity < 0 || capacity < length || capacity > 2147483647) { + $throwRuntimeError("makeslice: cap out of range"); + } + var array = new typ.nativeArray(capacity); + if (typ.nativeArray === Array) { + for (var i = 0; i < capacity; i++) { + array[i] = typ.elem.zero(); + } + } + var slice = new typ(array); + slice.$length = length; + return slice; +}; + +var $structTypes = {}; +var $structType = function(pkgPath, fields) { + var typeKey = $mapArray(fields, function(f) { return f.name + "," + f.typ.id + "," + f.tag; }).join("$"); + var typ = $structTypes[typeKey]; + if (typ === undefined) { + var string = "struct { " + $mapArray(fields, function(f) { + var str = f.typ.string + (f.tag !== "" ? (" \"" + f.tag.replace(/\\/g, "\\\\").replace(/"/g, "\\\"") + "\"") : ""); + if (f.embedded) { + return str; + } + return f.name + " " + str; + }).join("; ") + " }"; + if (fields.length === 0) { + string = "struct {}"; + } + typ = $newType(0, $kindStruct, string, false, "", false, function() { + this.$val = this; + for (var i = 0; i < fields.length; i++) { + var f = fields[i]; + if (f.name == '_') { + continue; + } + var arg = arguments[i]; + this[f.prop] = arg !== undefined ? arg : f.typ.zero(); + } + }); + $structTypes[typeKey] = typ; + typ.init(pkgPath, fields); + } + return typ; +}; + +var $assertType = function(value, type, returnTuple) { + var isInterface = (type.kind === $kindInterface), ok, missingMethod = ""; + if (value === $ifaceNil) { + ok = false; + } else if (!isInterface) { + ok = value.constructor === type; + } else { + var valueTypeString = value.constructor.string; + ok = type.implementedBy[valueTypeString]; + if (ok === undefined) { + ok = true; + var valueMethodSet = $methodSet(value.constructor); + var interfaceMethods = type.methods; + for (var i = 0; i < interfaceMethods.length; i++) { + var tm = interfaceMethods[i]; + var found = false; + for (var j = 0; j < valueMethodSet.length; j++) { + var vm = valueMethodSet[j]; + if (vm.name === tm.name && vm.pkg === tm.pkg && vm.typ === tm.typ) { + found = true; + break; + } + } + if (!found) { + ok = false; + type.missingMethodFor[valueTypeString] = tm.name; + break; + } + } + type.implementedBy[valueTypeString] = ok; + } + if (!ok) { + missingMethod = type.missingMethodFor[valueTypeString]; + } + } + + if (!ok) { + if (returnTuple) { + return [type.zero(), false]; + } + $panic(new $packages["runtime"].TypeAssertionError.ptr( + $packages["runtime"]._type.ptr.nil, + (value === $ifaceNil ? $packages["runtime"]._type.ptr.nil : new $packages["runtime"]._type.ptr(value.constructor.string)), + new $packages["runtime"]._type.ptr(type.string), + missingMethod)); + } + + if (!isInterface) { + value = value.$val; + } + if (type === $jsObjectPtr) { + value = value.object; + } + return returnTuple ? [value, true] : value; +}; + +var $stackDepthOffset = 0; +var $getStackDepth = function() { + var err = new Error(); + if (err.stack === undefined) { + return undefined; + } + return $stackDepthOffset + err.stack.split("\n").length; +}; + +var $panicStackDepth = null, $panicValue; +var $callDeferred = function(deferred, jsErr, fromPanic) { + if (!fromPanic && deferred !== null && $curGoroutine.deferStack.indexOf(deferred) == -1) { + throw jsErr; + } + if (jsErr !== null) { + var newErr = null; + try { + $panic(new $jsErrorPtr(jsErr)); + } catch (err) { + newErr = err; + } + $callDeferred(deferred, newErr); + return; + } + if ($curGoroutine.asleep) { + return; + } + + $stackDepthOffset--; + var outerPanicStackDepth = $panicStackDepth; + var outerPanicValue = $panicValue; + + var localPanicValue = $curGoroutine.panicStack.pop(); + if (localPanicValue !== undefined) { + $panicStackDepth = $getStackDepth(); + $panicValue = localPanicValue; + } + + try { + while (true) { + if (deferred === null) { + deferred = $curGoroutine.deferStack[$curGoroutine.deferStack.length - 1]; + if (deferred === undefined) { + /* The panic reached the top of the stack. Clear it and throw it as a JavaScript error. */ + $panicStackDepth = null; + if (localPanicValue.Object instanceof Error) { + throw localPanicValue.Object; + } + var msg; + if (localPanicValue.constructor === $String) { + msg = localPanicValue.$val; + } else if (localPanicValue.Error !== undefined) { + msg = localPanicValue.Error(); + } else if (localPanicValue.String !== undefined) { + msg = localPanicValue.String(); + } else { + msg = localPanicValue; + } + throw new Error(msg); + } + } + var call = deferred.pop(); + if (call === undefined) { + $curGoroutine.deferStack.pop(); + if (localPanicValue !== undefined) { + deferred = null; + continue; + } + return; + } + var r = call[0].apply(call[2], call[1]); + if (r && r.$blk !== undefined) { + deferred.push([r.$blk, [], r]); + if (fromPanic) { + throw null; + } + return; + } + + if (localPanicValue !== undefined && $panicStackDepth === null) { + /* error was recovered */ + if (fromPanic) { + throw null; + } + return; + } + } + } catch(e) { + // Deferred function threw a JavaScript exception or tries to unwind stack + // to the point where a panic was handled. + if (fromPanic) { + // Re-throw the exception to reach deferral execution call at the end + // of the function. + throw e; + } + // We are at the end of the function, handle the error or re-throw to + // continue unwinding if necessary, or simply stop unwinding if we got far + // enough. + $callDeferred(deferred, e, fromPanic); + } finally { + if (localPanicValue !== undefined) { + if ($panicStackDepth !== null) { + $curGoroutine.panicStack.push(localPanicValue); + } + $panicStackDepth = outerPanicStackDepth; + $panicValue = outerPanicValue; + } + $stackDepthOffset++; + } +}; + +var $panic = function(value) { + $curGoroutine.panicStack.push(value); + $callDeferred(null, null, true); +}; +var $recover = function() { + if ($panicStackDepth === null || ($panicStackDepth !== undefined && $panicStackDepth !== $getStackDepth() - 2)) { + return $ifaceNil; + } + $panicStackDepth = null; + return $panicValue; +}; +var $throw = function(err) { throw err; }; + +var $noGoroutine = { asleep: false, exit: false, deferStack: [], panicStack: [] }; +var $curGoroutine = $noGoroutine, $totalGoroutines = 0, $awakeGoroutines = 0, $checkForDeadlock = true, $exportedFunctions = 0; +var $mainFinished = false; +var $go = function(fun, args) { + $totalGoroutines++; + $awakeGoroutines++; + var $goroutine = function() { + try { + $curGoroutine = $goroutine; + var r = fun.apply(undefined, args); + if (r && r.$blk !== undefined) { + fun = function() { return r.$blk(); }; + args = []; + return; + } + $goroutine.exit = true; + } catch (err) { + if (!$goroutine.exit) { + throw err; + } + } finally { + $curGoroutine = $noGoroutine; + if ($goroutine.exit) { /* also set by runtime.Goexit() */ + $totalGoroutines--; + $goroutine.asleep = true; + } + if ($goroutine.asleep) { + $awakeGoroutines--; + if (!$mainFinished && $awakeGoroutines === 0 && $checkForDeadlock && $exportedFunctions === 0) { + console.error("fatal error: all goroutines are asleep - deadlock!"); + if ($global.process !== undefined) { + $global.process.exit(2); + } + } + } + } + }; + $goroutine.asleep = false; + $goroutine.exit = false; + $goroutine.deferStack = []; + $goroutine.panicStack = []; + $schedule($goroutine); +}; + +var $scheduled = []; +var $runScheduled = function() { + // For nested setTimeout calls browsers enforce 4ms minimum delay. We minimize + // the effect of this penalty by queueing the timer preemptively before we run + // the goroutines, and later cancelling it if it turns out unneeded. See: + // https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#nested_timeouts + var nextRun = setTimeout($runScheduled); + try { + var start = Date.now(); + var r; + while ((r = $scheduled.shift()) !== undefined) { + r(); + // We need to interrupt this loop in order to allow the event loop to + // process timers, IO, etc. However, invoking scheduling through + // setTimeout is ~1000 times more expensive, so we amortize this cost by + // looping until the 4ms minimal delay has elapsed (assuming there are + // scheduled goroutines to run), and then yield to the event loop. + var elapsed = Date.now() - start; + if (elapsed > 4 || elapsed < 0) { break; } + } + } finally { + if ($scheduled.length == 0) { + // Cancel scheduling pass if there's nothing to run. + clearTimeout(nextRun); + } + } +}; + +var $schedule = function(goroutine) { + if (goroutine.asleep) { + goroutine.asleep = false; + $awakeGoroutines++; + } + $scheduled.push(goroutine); + if ($curGoroutine === $noGoroutine) { + $runScheduled(); + } +}; + +var $setTimeout = function(f, t) { + $awakeGoroutines++; + return setTimeout(function() { + $awakeGoroutines--; + f(); + }, t); +}; + +var $block = function() { + if ($curGoroutine === $noGoroutine) { + $throwRuntimeError("cannot block in JavaScript callback, fix by wrapping code in goroutine"); + } + $curGoroutine.asleep = true; +}; + +var $restore = function(context, params) { + if (context !== undefined && context.$blk !== undefined) { + return context; + } + return params; +} + +var $send = function(chan, value) { + if (chan.$closed) { + $throwRuntimeError("send on closed channel"); + } + var queuedRecv = chan.$recvQueue.shift(); + if (queuedRecv !== undefined) { + queuedRecv([value, true]); + return; + } + if (chan.$buffer.length < chan.$capacity) { + chan.$buffer.push(value); + return; + } + + var thisGoroutine = $curGoroutine; + var closedDuringSend; + chan.$sendQueue.push(function(closed) { + closedDuringSend = closed; + $schedule(thisGoroutine); + return value; + }); + $block(); + return { + $blk: function() { + if (closedDuringSend) { + $throwRuntimeError("send on closed channel"); + } + } + }; +}; +var $recv = function(chan) { + var queuedSend = chan.$sendQueue.shift(); + if (queuedSend !== undefined) { + chan.$buffer.push(queuedSend(false)); + } + var bufferedValue = chan.$buffer.shift(); + if (bufferedValue !== undefined) { + return [bufferedValue, true]; + } + if (chan.$closed) { + return [chan.$elem.zero(), false]; + } + + var thisGoroutine = $curGoroutine; + var f = { $blk: function() { return this.value; } }; + var queueEntry = function(v) { + f.value = v; + $schedule(thisGoroutine); + }; + chan.$recvQueue.push(queueEntry); + $block(); + return f; +}; +var $close = function(chan) { + if (chan.$closed) { + $throwRuntimeError("close of closed channel"); + } + chan.$closed = true; + while (true) { + var queuedSend = chan.$sendQueue.shift(); + if (queuedSend === undefined) { + break; + } + queuedSend(true); /* will panic */ + } + while (true) { + var queuedRecv = chan.$recvQueue.shift(); + if (queuedRecv === undefined) { + break; + } + queuedRecv([chan.$elem.zero(), false]); + } +}; +var $select = function(comms) { + var ready = []; + var selection = -1; + for (var i = 0; i < comms.length; i++) { + var comm = comms[i]; + var chan = comm[0]; + switch (comm.length) { + case 0: /* default */ + selection = i; + break; + case 1: /* recv */ + if (chan.$sendQueue.length !== 0 || chan.$buffer.length !== 0 || chan.$closed) { + ready.push(i); + } + break; + case 2: /* send */ + if (chan.$closed) { + $throwRuntimeError("send on closed channel"); + } + if (chan.$recvQueue.length !== 0 || chan.$buffer.length < chan.$capacity) { + ready.push(i); + } + break; + } + } + + if (ready.length !== 0) { + selection = ready[Math.floor(Math.random() * ready.length)]; + } + if (selection !== -1) { + var comm = comms[selection]; + switch (comm.length) { + case 0: /* default */ + return [selection]; + case 1: /* recv */ + return [selection, $recv(comm[0])]; + case 2: /* send */ + $send(comm[0], comm[1]); + return [selection]; + } + } + + var entries = []; + var thisGoroutine = $curGoroutine; + var f = { $blk: function() { return this.selection; } }; + var removeFromQueues = function() { + for (var i = 0; i < entries.length; i++) { + var entry = entries[i]; + var queue = entry[0]; + var index = queue.indexOf(entry[1]); + if (index !== -1) { + queue.splice(index, 1); + } + } + }; + for (var i = 0; i < comms.length; i++) { + (function(i) { + var comm = comms[i]; + switch (comm.length) { + case 1: /* recv */ + var queueEntry = function(value) { + f.selection = [i, value]; + removeFromQueues(); + $schedule(thisGoroutine); + }; + entries.push([comm[0].$recvQueue, queueEntry]); + comm[0].$recvQueue.push(queueEntry); + break; + case 2: /* send */ + var queueEntry = function() { + if (comm[0].$closed) { + $throwRuntimeError("send on closed channel"); + } + f.selection = [i]; + removeFromQueues(); + $schedule(thisGoroutine); + return comm[1]; + }; + entries.push([comm[0].$sendQueue, queueEntry]); + comm[0].$sendQueue.push(queueEntry); + break; + } + })(i); + } + $block(); + return f; +}; + +var $jsObjectPtr, $jsErrorPtr; + +var $needsExternalization = function(t) { + switch (t.kind) { + case $kindBool: + case $kindInt: + case $kindInt8: + case $kindInt16: + case $kindInt32: + case $kindUint: + case $kindUint8: + case $kindUint16: + case $kindUint32: + case $kindUintptr: + case $kindFloat32: + case $kindFloat64: + return false; + default: + return t !== $jsObjectPtr; + } +}; + +var $externalize = function(v, t, makeWrapper) { + if (t === $jsObjectPtr) { + return v; + } + switch (t.kind) { + case $kindBool: + case $kindInt: + case $kindInt8: + case $kindInt16: + case $kindInt32: + case $kindUint: + case $kindUint8: + case $kindUint16: + case $kindUint32: + case $kindUintptr: + case $kindFloat32: + case $kindFloat64: + return v; + case $kindInt64: + case $kindUint64: + return $flatten64(v); + case $kindArray: + if ($needsExternalization(t.elem)) { + return $mapArray(v, function(e) { return $externalize(e, t.elem, makeWrapper); }); + } + return v; + case $kindFunc: + return $externalizeFunction(v, t, false, makeWrapper); + case $kindInterface: + if (v === $ifaceNil) { + return null; + } + if (v.constructor === $jsObjectPtr) { + return v.$val.object; + } + return $externalize(v.$val, v.constructor, makeWrapper); + case $kindMap: + var m = {}; + var keys = $keys(v); + for (var i = 0; i < keys.length; i++) { + var entry = v[keys[i]]; + m[$externalize(entry.k, t.key, makeWrapper)] = $externalize(entry.v, t.elem, makeWrapper); + } + return m; + case $kindPtr: + if (v === t.nil) { + return null; + } + return $externalize(v.$get(), t.elem, makeWrapper); + case $kindSlice: + if ($needsExternalization(t.elem)) { + return $mapArray($sliceToNativeArray(v), function(e) { return $externalize(e, t.elem, makeWrapper); }); + } + return $sliceToNativeArray(v); + case $kindString: + if ($isASCII(v)) { + return v; + } + var s = "", r; + for (var i = 0; i < v.length; i += r[1]) { + r = $decodeRune(v, i); + var c = r[0]; + if (c > 0xFFFF) { + var h = Math.floor((c - 0x10000) / 0x400) + 0xD800; + var l = (c - 0x10000) % 0x400 + 0xDC00; + s += String.fromCharCode(h, l); + continue; + } + s += String.fromCharCode(c); + } + return s; + case $kindStruct: + var timePkg = $packages["time"]; + if (timePkg !== undefined && v.constructor === timePkg.Time.ptr) { + var milli = $div64(v.UnixNano(), new $Int64(0, 1000000)); + return new Date($flatten64(milli)); + } + + var noJsObject = {}; + var searchJsObject = function(v, t) { + if (t === $jsObjectPtr) { + return v; + } + switch (t.kind) { + case $kindPtr: + if (v === t.nil) { + return noJsObject; + } + return searchJsObject(v.$get(), t.elem); + case $kindStruct: + var f = t.fields[0]; + return searchJsObject(v[f.prop], f.typ); + case $kindInterface: + return searchJsObject(v.$val, v.constructor); + default: + return noJsObject; + } + }; + var o = searchJsObject(v, t); + if (o !== noJsObject) { + return o; + } + + if (makeWrapper !== undefined) { + return makeWrapper(v); + } + + o = {}; + for (var i = 0; i < t.fields.length; i++) { + var f = t.fields[i]; + if (!f.exported) { + continue; + } + o[f.name] = $externalize(v[f.prop], f.typ, makeWrapper); + } + return o; + } + $throwRuntimeError("cannot externalize " + t.string); +}; + +var $externalizeFunction = function(v, t, passThis, makeWrapper) { + if (v === $throwNilPointerError) { + return null; + } + if (v.$externalizeWrapper === undefined) { + $checkForDeadlock = false; + v.$externalizeWrapper = function() { + var args = []; + for (var i = 0; i < t.params.length; i++) { + if (t.variadic && i === t.params.length - 1) { + var vt = t.params[i].elem, varargs = []; + for (var j = i; j < arguments.length; j++) { + varargs.push($internalize(arguments[j], vt, makeWrapper)); + } + args.push(new (t.params[i])(varargs)); + break; + } + args.push($internalize(arguments[i], t.params[i], makeWrapper)); + } + var result = v.apply(passThis ? this : undefined, args); + switch (t.results.length) { + case 0: + return; + case 1: + return $externalize($copyIfRequired(result, t.results[0]), t.results[0], makeWrapper); + default: + for (var i = 0; i < t.results.length; i++) { + result[i] = $externalize($copyIfRequired(result[i], t.results[i]), t.results[i], makeWrapper); + } + return result; + } + }; + } + return v.$externalizeWrapper; +}; + +var $internalize = function(v, t, recv, seen, makeWrapper) { + if (t === $jsObjectPtr) { + return v; + } + if (t === $jsObjectPtr.elem) { + $throwRuntimeError("cannot internalize js.Object, use *js.Object instead"); + } + if (v && v.__internal_object__ !== undefined) { + return $assertType(v.__internal_object__, t, false); + } + var timePkg = $packages["time"]; + if (timePkg !== undefined && t === timePkg.Time) { + if (!(v !== null && v !== undefined && v.constructor === Date)) { + $throwRuntimeError("cannot internalize time.Time from " + typeof v + ", must be Date"); + } + return timePkg.Unix(new $Int64(0, 0), new $Int64(0, v.getTime() * 1000000)); + } + + // Cache for values we've already internalized in order to deal with circular + // references. + if (seen === undefined) { seen = new Map(); } + if (!seen.has(t)) { seen.set(t, new Map()); } + if (seen.get(t).has(v)) { return seen.get(t).get(v); } + + switch (t.kind) { + case $kindBool: + return !!v; + case $kindInt: + return parseInt(v); + case $kindInt8: + return parseInt(v) << 24 >> 24; + case $kindInt16: + return parseInt(v) << 16 >> 16; + case $kindInt32: + return parseInt(v) >> 0; + case $kindUint: + return parseInt(v); + case $kindUint8: + return parseInt(v) << 24 >>> 24; + case $kindUint16: + return parseInt(v) << 16 >>> 16; + case $kindUint32: + case $kindUintptr: + return parseInt(v) >>> 0; + case $kindInt64: + case $kindUint64: + return new t(0, v); + case $kindFloat32: + case $kindFloat64: + return parseFloat(v); + case $kindArray: + if (v.length !== t.len) { + $throwRuntimeError("got array with wrong size from JavaScript native"); + } + return $mapArray(v, function(e) { return $internalize(e, t.elem, makeWrapper); }); + case $kindFunc: + return function() { + var args = []; + for (var i = 0; i < t.params.length; i++) { + if (t.variadic && i === t.params.length - 1) { + var vt = t.params[i].elem, varargs = arguments[i]; + for (var j = 0; j < varargs.$length; j++) { + args.push($externalize(varargs.$array[varargs.$offset + j], vt, makeWrapper)); + } + break; + } + args.push($externalize(arguments[i], t.params[i], makeWrapper)); + } + var result = v.apply(recv, args); + switch (t.results.length) { + case 0: + return; + case 1: + return $internalize(result, t.results[0], makeWrapper); + default: + for (var i = 0; i < t.results.length; i++) { + result[i] = $internalize(result[i], t.results[i], makeWrapper); + } + return result; + } + }; + case $kindInterface: + if (t.methods.length !== 0) { + $throwRuntimeError("cannot internalize " + t.string); + } + if (v === null) { + return $ifaceNil; + } + if (v === undefined) { + return new $jsObjectPtr(undefined); + } + switch (v.constructor) { + case Int8Array: + return new ($sliceType($Int8))(v); + case Int16Array: + return new ($sliceType($Int16))(v); + case Int32Array: + return new ($sliceType($Int))(v); + case Uint8Array: + return new ($sliceType($Uint8))(v); + case Uint16Array: + return new ($sliceType($Uint16))(v); + case Uint32Array: + return new ($sliceType($Uint))(v); + case Float32Array: + return new ($sliceType($Float32))(v); + case Float64Array: + return new ($sliceType($Float64))(v); + case Array: + return $internalize(v, $sliceType($emptyInterface), makeWrapper); + case Boolean: + return new $Bool(!!v); + case Date: + if (timePkg === undefined) { + /* time package is not present, internalize as &js.Object{Date} so it can be externalized into original Date. */ + return new $jsObjectPtr(v); + } + return new timePkg.Time($internalize(v, timePkg.Time, makeWrapper)); + case (function () { }).constructor: // is usually Function, but in Chrome extensions it is something else + var funcType = $funcType([$sliceType($emptyInterface)], [$jsObjectPtr], true); + return new funcType($internalize(v, funcType, makeWrapper)); + case Number: + return new $Float64(parseFloat(v)); + case String: + return new $String($internalize(v, $String, makeWrapper)); + default: + if ($global.Node && v instanceof $global.Node) { + return new $jsObjectPtr(v); + } + var mapType = $mapType($String, $emptyInterface); + return new mapType($internalize(v, mapType, recv, seen, makeWrapper)); + } + case $kindMap: + var m = {}; + seen.get(t).set(v, m); + var keys = $keys(v); + for (var i = 0; i < keys.length; i++) { + var k = $internalize(keys[i], t.key, recv, seen, makeWrapper); + m[t.key.keyFor(k)] = { k: k, v: $internalize(v[keys[i]], t.elem, recv, seen, makeWrapper) }; + } + return m; + case $kindPtr: + if (t.elem.kind === $kindStruct) { + return $internalize(v, t.elem, makeWrapper); + } + case $kindSlice: + return new t($mapArray(v, function(e) { return $internalize(e, t.elem, makeWrapper); })); + case $kindString: + v = String(v); + if ($isASCII(v)) { + return v; + } + var s = ""; + var i = 0; + while (i < v.length) { + var h = v.charCodeAt(i); + if (0xD800 <= h && h <= 0xDBFF) { + var l = v.charCodeAt(i + 1); + var c = (h - 0xD800) * 0x400 + l - 0xDC00 + 0x10000; + s += $encodeRune(c); + i += 2; + continue; + } + s += $encodeRune(h); + i++; + } + return s; + case $kindStruct: + var noJsObject = {}; + var searchJsObject = function(t) { + if (t === $jsObjectPtr) { + return v; + } + if (t === $jsObjectPtr.elem) { + $throwRuntimeError("cannot internalize js.Object, use *js.Object instead"); + } + switch (t.kind) { + case $kindPtr: + return searchJsObject(t.elem); + case $kindStruct: + var f = t.fields[0]; + var o = searchJsObject(f.typ); + if (o !== noJsObject) { + var n = new t.ptr(); + n[f.prop] = o; + return n; + } + return noJsObject; + default: + return noJsObject; + } + }; + var o = searchJsObject(t); + if (o !== noJsObject) { + return o; + } + } + $throwRuntimeError("cannot internalize " + t.string); +}; + +var $copyIfRequired = function(v, typ) { + // interface values + if (v && v.constructor && v.constructor.copy) { + return new v.constructor($clone(v.$val, v.constructor)) + } + // array and struct values + if (typ.copy) { + var clone = typ.zero(); + typ.copy(clone, v); + return clone; + } + return v; +} + +/* $isASCII reports whether string s contains only ASCII characters. */ +var $isASCII = function(s) { + for (var i = 0; i < s.length; i++) { + if (s.charCodeAt(i) >= 128) { + return false; + } + } + return true; +}; + +$packages["github.com/gopherjs/gopherjs/js"] = (function() { + var $pkg = {}, $init, Object, Error, M, sliceType, ptrType, sliceType$2, funcType, funcType$1, funcType$2, ptrType$1, MakeWrapper, MakeFullWrapper, init; + Object = $pkg.Object = $newType(0, $kindStruct, "js.Object", true, "github.com/gopherjs/gopherjs/js", true, function(object_) { + this.$val = this; + if (arguments.length === 0) { + this.object = null; + return; + } + this.object = object_; + }); + Error = $pkg.Error = $newType(0, $kindStruct, "js.Error", true, "github.com/gopherjs/gopherjs/js", true, function(Object_) { + this.$val = this; + if (arguments.length === 0) { + this.Object = null; + return; + } + this.Object = Object_; + }); + M = $pkg.M = $newType(4, $kindMap, "js.M", true, "github.com/gopherjs/gopherjs/js", true, null); + sliceType = $sliceType($emptyInterface); + ptrType = $ptrType(Object); + sliceType$2 = $sliceType(ptrType); + funcType = $funcType([sliceType$2], [ptrType], true); + funcType$1 = $funcType([], [ptrType], false); + funcType$2 = $funcType([ptrType], [], false); + ptrType$1 = $ptrType(Error); + Object.ptr.prototype.Get = function(key) { + var key, o; + o = this; + return o.object[$externalize(key, $String)]; + }; + Object.prototype.Get = function(key) { return this.$val.Get(key); }; + Object.ptr.prototype.Set = function(key, value) { + var key, o, value; + o = this; + o.object[$externalize(key, $String)] = $externalize(value, $emptyInterface); + }; + Object.prototype.Set = function(key, value) { return this.$val.Set(key, value); }; + Object.ptr.prototype.Delete = function(key) { + var key, o; + o = this; + delete o.object[$externalize(key, $String)]; + }; + Object.prototype.Delete = function(key) { return this.$val.Delete(key); }; + Object.ptr.prototype.Length = function() { + var o; + o = this; + return $parseInt(o.object.length); + }; + Object.prototype.Length = function() { return this.$val.Length(); }; + Object.ptr.prototype.Index = function(i) { + var i, o; + o = this; + return o.object[i]; + }; + Object.prototype.Index = function(i) { return this.$val.Index(i); }; + Object.ptr.prototype.SetIndex = function(i, value) { + var i, o, value; + o = this; + o.object[i] = $externalize(value, $emptyInterface); + }; + Object.prototype.SetIndex = function(i, value) { return this.$val.SetIndex(i, value); }; + Object.ptr.prototype.Call = function(name, args) { + var args, name, o, obj; + o = this; + return (obj = o.object, obj[$externalize(name, $String)].apply(obj, $externalize(args, sliceType))); + }; + Object.prototype.Call = function(name, args) { return this.$val.Call(name, args); }; + Object.ptr.prototype.Invoke = function(args) { + var args, o; + o = this; + return o.object.apply(undefined, $externalize(args, sliceType)); + }; + Object.prototype.Invoke = function(args) { return this.$val.Invoke(args); }; + Object.ptr.prototype.New = function(args) { + var args, o; + o = this; + return new ($global.Function.prototype.bind.apply(o.object, [undefined].concat($externalize(args, sliceType)))); + }; + Object.prototype.New = function(args) { return this.$val.New(args); }; + Object.ptr.prototype.Bool = function() { + var o; + o = this; + return !!(o.object); + }; + Object.prototype.Bool = function() { return this.$val.Bool(); }; + Object.ptr.prototype.String = function() { + var o; + o = this; + return $internalize(o.object, $String); + }; + Object.prototype.String = function() { return this.$val.String(); }; + Object.ptr.prototype.Int = function() { + var o; + o = this; + return $parseInt(o.object) >> 0; + }; + Object.prototype.Int = function() { return this.$val.Int(); }; + Object.ptr.prototype.Int64 = function() { + var o; + o = this; + return $internalize(o.object, $Int64); + }; + Object.prototype.Int64 = function() { return this.$val.Int64(); }; + Object.ptr.prototype.Uint64 = function() { + var o; + o = this; + return $internalize(o.object, $Uint64); + }; + Object.prototype.Uint64 = function() { return this.$val.Uint64(); }; + Object.ptr.prototype.Float = function() { + var o; + o = this; + return $parseFloat(o.object); + }; + Object.prototype.Float = function() { return this.$val.Float(); }; + Object.ptr.prototype.Interface = function() { + var o; + o = this; + return $internalize(o.object, $emptyInterface); + }; + Object.prototype.Interface = function() { return this.$val.Interface(); }; + Object.ptr.prototype.Unsafe = function() { + var o; + o = this; + return o.object; + }; + Object.prototype.Unsafe = function() { return this.$val.Unsafe(); }; + Error.ptr.prototype.Error = function() { + var err; + err = this; + return "JavaScript error: " + $internalize(err.Object.message, $String); + }; + Error.prototype.Error = function() { return this.$val.Error(); }; + Error.ptr.prototype.Stack = function() { + var err; + err = this; + return $internalize(err.Object.stack, $String); + }; + Error.prototype.Stack = function() { return this.$val.Stack(); }; + MakeWrapper = function(i) { + var i, i$1, m, methods, o, v; + v = i; + o = new ($global.Object)(); + o.__internal_object__ = v; + methods = v.constructor.methods; + i$1 = 0; + while (true) { + if (!(i$1 < $parseInt(methods.length))) { break; } + m = [m]; + m[0] = methods[i$1]; + if (!($internalize(m[0].pkg, $String) === "")) { + i$1 = i$1 + (1) >> 0; + continue; + } + o[$externalize($internalize(m[0].name, $String), $String)] = $externalize((function(m) { return function(args) { + var args; + return $externalizeFunction(v[$externalize($internalize(m[0].prop, $String), $String)], m[0].typ, $externalize(true, $Bool)).apply(v, $externalize(args, sliceType$2)); + }; })(m), funcType); + i$1 = i$1 + (1) >> 0; + } + return o; + }; + $pkg.MakeWrapper = MakeWrapper; + MakeFullWrapper = function(i) { + var {constructor, defineProperty, e, f, fields, i, i$1, i$2, i$3, internalObj, m, methods, ms, pkg, pkgTyp, ptr, typ, wrapperObj, $s, $r, $c} = $restore(this, {i}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + internalObj = [internalObj]; + wrapperObj = [wrapperObj]; + internalObj[0] = i; + constructor = internalObj[0].constructor; + wrapperObj[0] = new ($global.Object)(); + defineProperty = (function(internalObj, wrapperObj) { return function(key, descriptor) { + var descriptor, key; + $global.Object.defineProperty(wrapperObj[0], $externalize(key, $String), $externalize(descriptor, M)); + }; })(internalObj, wrapperObj); + $r = defineProperty("__internal_object__", $makeMap($String.keyFor, [{ k: "value", v: new $jsObjectPtr(internalObj[0]) }])); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + typ = $internalize(constructor.string, $String); + pkg = $internalize(constructor.pkg, $String); + ptr = ""; + if (typ.charCodeAt(0) === 42) { + ptr = "*"; + } + i$1 = 0; + while (true) { + if (!(i$1 < typ.length)) { break; } + if (typ.charCodeAt(i$1) === 46) { + typ = $substring(typ, (i$1 + 1 >> 0)); + break; + } + i$1 = i$1 + (1) >> 0; + } + pkgTyp = pkg + "." + ptr + typ; + $r = defineProperty("$type", $makeMap($String.keyFor, [{ k: "value", v: new $String(pkgTyp) }])); /* */ $s = 2; case 2: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + fields = null; + methods = new ($global.Array)(); + ms = constructor.methods; + if (!(ms === undefined)) { + methods = methods.concat(ms); + } + e = constructor.elem; + if (!(e === undefined)) { + fields = e.fields; + methods = methods.concat(e.methods); + } else { + fields = constructor.fields; + } + i$2 = 0; + /* while (true) { */ case 3: + /* if (!(i$2 < $parseInt(methods.length))) { break; } */ if(!(i$2 < $parseInt(methods.length))) { $s = 4; continue; } + m = [m]; + m[0] = methods[i$2]; + if (!($internalize(m[0].pkg, $String) === "")) { + i$2 = i$2 + (1) >> 0; + /* continue; */ $s = 3; continue; + } + $r = defineProperty($internalize(m[0].prop, $String), $makeMap($String.keyFor, [{ k: "value", v: new funcType((function(internalObj, m, wrapperObj) { return function(args) { + var args; + return $externalizeFunction(internalObj[0][$externalize($internalize(m[0].prop, $String), $String)], m[0].typ, $externalize(true, $Bool), MakeFullWrapper).apply(internalObj[0], $externalize(args, sliceType$2)); + }; })(internalObj, m, wrapperObj)) }])); /* */ $s = 5; case 5: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + i$2 = i$2 + (1) >> 0; + $s = 3; continue; + case 4: + /* */ if (!(fields === undefined)) { $s = 6; continue; } + /* */ $s = 7; continue; + /* if (!(fields === undefined)) { */ case 6: + i$3 = 0; + /* while (true) { */ case 8: + /* if (!(i$3 < $parseInt(fields.length))) { break; } */ if(!(i$3 < $parseInt(fields.length))) { $s = 9; continue; } + f = [f]; + f[0] = fields[i$3]; + if (!!!(f[0].exported)) { + i$3 = i$3 + (1) >> 0; + /* continue; */ $s = 8; continue; + } + $r = defineProperty($internalize(f[0].prop, $String), $makeMap($String.keyFor, [{ k: "get", v: new funcType$1((function(f, internalObj, wrapperObj) { return function() { + var vc; + vc = $copyIfRequired(internalObj[0].$val[$externalize($internalize(f[0].prop, $String), $String)], f[0].typ); + return $externalize(vc, f[0].typ, MakeFullWrapper); + }; })(f, internalObj, wrapperObj)) }, { k: "set", v: new funcType$2((function(f, internalObj, wrapperObj) { return function(jv) { + var gv, jv; + gv = $internalize(jv, f[0].typ, MakeFullWrapper); + internalObj[0].$val[$externalize($internalize(f[0].prop, $String), $String)] = gv; + }; })(f, internalObj, wrapperObj)) }])); /* */ $s = 10; case 10: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + i$3 = i$3 + (1) >> 0; + $s = 8; continue; + case 9: + /* } */ case 7: + $s = -1; return wrapperObj[0]; + /* */ } return; } var $f = {$blk: MakeFullWrapper, $c: true, $r, constructor, defineProperty, e, f, fields, i, i$1, i$2, i$3, internalObj, m, methods, ms, pkg, pkgTyp, ptr, typ, wrapperObj, $s};return $f; + }; + $pkg.MakeFullWrapper = MakeFullWrapper; + init = function() { + var e; + e = new Error.ptr(null); + $unused(e); + }; + ptrType.methods = [{prop: "Get", name: "Get", pkg: "", typ: $funcType([$String], [ptrType], false)}, {prop: "Set", name: "Set", pkg: "", typ: $funcType([$String, $emptyInterface], [], false)}, {prop: "Delete", name: "Delete", pkg: "", typ: $funcType([$String], [], false)}, {prop: "Length", name: "Length", pkg: "", typ: $funcType([], [$Int], false)}, {prop: "Index", name: "Index", pkg: "", typ: $funcType([$Int], [ptrType], false)}, {prop: "SetIndex", name: "SetIndex", pkg: "", typ: $funcType([$Int, $emptyInterface], [], false)}, {prop: "Call", name: "Call", pkg: "", typ: $funcType([$String, sliceType], [ptrType], true)}, {prop: "Invoke", name: "Invoke", pkg: "", typ: $funcType([sliceType], [ptrType], true)}, {prop: "New", name: "New", pkg: "", typ: $funcType([sliceType], [ptrType], true)}, {prop: "Bool", name: "Bool", pkg: "", typ: $funcType([], [$Bool], false)}, {prop: "String", name: "String", pkg: "", typ: $funcType([], [$String], false)}, {prop: "Int", name: "Int", pkg: "", typ: $funcType([], [$Int], false)}, {prop: "Int64", name: "Int64", pkg: "", typ: $funcType([], [$Int64], false)}, {prop: "Uint64", name: "Uint64", pkg: "", typ: $funcType([], [$Uint64], false)}, {prop: "Float", name: "Float", pkg: "", typ: $funcType([], [$Float64], false)}, {prop: "Interface", name: "Interface", pkg: "", typ: $funcType([], [$emptyInterface], false)}, {prop: "Unsafe", name: "Unsafe", pkg: "", typ: $funcType([], [$Uintptr], false)}]; + ptrType$1.methods = [{prop: "Error", name: "Error", pkg: "", typ: $funcType([], [$String], false)}, {prop: "Stack", name: "Stack", pkg: "", typ: $funcType([], [$String], false)}]; + Object.init("github.com/gopherjs/gopherjs/js", [{prop: "object", name: "object", embedded: false, exported: false, typ: ptrType, tag: ""}]); + Error.init("", [{prop: "Object", name: "Object", embedded: true, exported: true, typ: ptrType, tag: ""}]); + M.init($String, $emptyInterface); + $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: + init(); + /* */ } return; } if ($f === undefined) { $f = { $blk: $init }; } $f.$s = $s; $f.$r = $r; return $f; + }; + $pkg.$init = $init; + return $pkg; +})(); +$packages["runtime"] = (function() { + var $pkg = {}, $init, js, _type, TypeAssertionError, errorString, ptrType$1, ptrType$2, buildVersion, init, throw$1; + js = $packages["github.com/gopherjs/gopherjs/js"]; + _type = $pkg._type = $newType(0, $kindStruct, "runtime._type", true, "runtime", false, function(str_) { + this.$val = this; + if (arguments.length === 0) { + this.str = ""; + return; + } + this.str = str_; + }); + TypeAssertionError = $pkg.TypeAssertionError = $newType(0, $kindStruct, "runtime.TypeAssertionError", true, "runtime", true, function(_interface_, concrete_, asserted_, missingMethod_) { + this.$val = this; + if (arguments.length === 0) { + this._interface = ptrType$1.nil; + this.concrete = ptrType$1.nil; + this.asserted = ptrType$1.nil; + this.missingMethod = ""; + return; + } + this._interface = _interface_; + this.concrete = concrete_; + this.asserted = asserted_; + this.missingMethod = missingMethod_; + }); + errorString = $pkg.errorString = $newType(8, $kindString, "runtime.errorString", true, "runtime", false, null); + ptrType$1 = $ptrType(_type); + ptrType$2 = $ptrType(TypeAssertionError); + _type.ptr.prototype.string = function() { + var t; + t = this; + return t.str; + }; + _type.prototype.string = function() { return this.$val.string(); }; + _type.ptr.prototype.pkgpath = function() { + var t; + t = this; + return ""; + }; + _type.prototype.pkgpath = function() { return this.$val.pkgpath(); }; + TypeAssertionError.ptr.prototype.RuntimeError = function() { + }; + TypeAssertionError.prototype.RuntimeError = function() { return this.$val.RuntimeError(); }; + TypeAssertionError.ptr.prototype.Error = function() { + var as, cs, e, inter, msg; + e = this; + inter = "interface"; + if (!(e._interface === ptrType$1.nil)) { + inter = e._interface.string(); + } + as = e.asserted.string(); + if (e.concrete === ptrType$1.nil) { + return "interface conversion: " + inter + " is nil, not " + as; + } + cs = e.concrete.string(); + if (e.missingMethod === "") { + msg = "interface conversion: " + inter + " is " + cs + ", not " + as; + if (cs === as) { + if (!(e.concrete.pkgpath() === e.asserted.pkgpath())) { + msg = msg + (" (types from different packages)"); + } else { + msg = msg + (" (types from different scopes)"); + } + } + return msg; + } + return "interface conversion: " + cs + " is not " + as + ": missing method " + e.missingMethod; + }; + TypeAssertionError.prototype.Error = function() { return this.$val.Error(); }; + init = function() { + var e, jsPkg; + jsPkg = $packages[$externalize("github.com/gopherjs/gopherjs/js", $String)]; + $jsObjectPtr = jsPkg.Object.ptr; + $jsErrorPtr = jsPkg.Error.ptr; + $throwRuntimeError = throw$1; + buildVersion = $internalize($goVersion, $String); + e = $ifaceNil; + e = new TypeAssertionError.ptr(ptrType$1.nil, ptrType$1.nil, ptrType$1.nil, ""); + $unused(e); + }; + errorString.prototype.RuntimeError = function() { + var e; + e = this.$val; + }; + $ptrType(errorString).prototype.RuntimeError = function() { return new errorString(this.$get()).RuntimeError(); }; + errorString.prototype.Error = function() { + var e; + e = this.$val; + return "runtime error: " + (e); + }; + $ptrType(errorString).prototype.Error = function() { return new errorString(this.$get()).Error(); }; + throw$1 = function(s) { + var s; + $panic(new errorString((s))); + }; + ptrType$1.methods = [{prop: "string", name: "string", pkg: "runtime", typ: $funcType([], [$String], false)}, {prop: "pkgpath", name: "pkgpath", pkg: "runtime", typ: $funcType([], [$String], false)}]; + ptrType$2.methods = [{prop: "RuntimeError", name: "RuntimeError", pkg: "", typ: $funcType([], [], false)}, {prop: "Error", name: "Error", pkg: "", typ: $funcType([], [$String], false)}]; + errorString.methods = [{prop: "RuntimeError", name: "RuntimeError", pkg: "", typ: $funcType([], [], false)}, {prop: "Error", name: "Error", pkg: "", typ: $funcType([], [$String], false)}]; + _type.init("runtime", [{prop: "str", name: "str", embedded: false, exported: false, typ: $String, tag: ""}]); + TypeAssertionError.init("runtime", [{prop: "_interface", name: "_interface", embedded: false, exported: false, typ: ptrType$1, tag: ""}, {prop: "concrete", name: "concrete", embedded: false, exported: false, typ: ptrType$1, tag: ""}, {prop: "asserted", name: "asserted", embedded: false, exported: false, typ: ptrType$1, tag: ""}, {prop: "missingMethod", name: "missingMethod", embedded: false, exported: false, typ: $String, 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 = js.$init(); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + buildVersion = ""; + init(); + /* */ } return; } if ($f === undefined) { $f = { $blk: $init }; } $f.$s = $s; $f.$r = $r; return $f; + }; + $pkg.$init = $init; + return $pkg; +})(); +$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, js, bits, arrayType, arrayType$1, arrayType$2, structType, math, _zero, posInf, negInf, nan, buf, max, min, Abs, Cos, Floor, Inf, IsInf, IsNaN, Max, Min, NaN, Pow, Signbit, Sin, Sqrt, init, Float64bits, Float64frombits; + js = $packages["github.com/gopherjs/gopherjs/js"]; + bits = $packages["math/bits"]; + arrayType = $arrayType($Uint32, 2); + arrayType$1 = $arrayType($Float32, 2); + arrayType$2 = $arrayType($Float64, 1); + structType = $structType("math", [{prop: "uint32array", name: "uint32array", embedded: false, exported: false, typ: arrayType, tag: ""}, {prop: "float32array", name: "float32array", embedded: false, exported: false, typ: arrayType$1, tag: ""}, {prop: "float64array", name: "float64array", embedded: false, exported: false, typ: arrayType$2, tag: ""}]); + max = function(x, y) { + var x, y; + if (IsInf(x, 1) || IsInf(y, 1)) { + return Inf(1); + } else if (IsNaN(x) || IsNaN(y)) { + return NaN(); + } else if ((x === 0) && (x === y)) { + if (Signbit(x)) { + return y; + } + return x; + } + if (x > y) { + return x; + } + return y; + }; + min = function(x, y) { + var x, y; + if (IsInf(x, -1) || IsInf(y, -1)) { + return Inf(-1); + } else if (IsNaN(x) || IsNaN(y)) { + return NaN(); + } else if ((x === 0) && (x === y)) { + if (Signbit(x)) { + return x; + } + return y; + } + if (x < y) { + return x; + } + return y; + }; + Abs = function(x) { + var x, x$1; + return Float64frombits((x$1 = Float64bits(x), new $Uint64(x$1.$high & ~2147483648, (x$1.$low & ~0) >>> 0))); + }; + $pkg.Abs = Abs; + Cos = function(x) { + var x; + return $parseFloat(math.cos(x)); + }; + $pkg.Cos = Cos; + Floor = function(x) { + var x; + return $parseFloat(math.floor(x)); + }; + $pkg.Floor = Floor; + Inf = function(sign) { + var sign; + if (sign >= 0) { + return posInf; + } else { + return negInf; + } + }; + $pkg.Inf = Inf; + IsInf = function(f, sign) { + var f, sign; + if (f === posInf) { + return sign >= 0; + } + if (f === negInf) { + return sign <= 0; + } + return false; + }; + $pkg.IsInf = IsInf; + IsNaN = function(f) { + var f, is; + is = false; + is = !((f === f)); + return is; + }; + $pkg.IsNaN = IsNaN; + Max = function(x, y) { + var x, y; + return max(x, y); + }; + $pkg.Max = Max; + Min = function(x, y) { + var x, y; + return min(x, y); + }; + $pkg.Min = Min; + NaN = function() { + return nan; + }; + $pkg.NaN = NaN; + Pow = function(x, y) { + var x, y; + if ((x === 1) || ((x === -1) && ((y === posInf) || (y === negInf)))) { + return 1; + } + return $parseFloat(math.pow(x, y)); + }; + $pkg.Pow = Pow; + Signbit = function(x) { + var x; + return x < 0 || (1 / x === negInf); + }; + $pkg.Signbit = Signbit; + Sin = function(x) { + var x; + return $parseFloat(math.sin(x)); + }; + $pkg.Sin = Sin; + Sqrt = function(x) { + var x; + return $parseFloat(math.sqrt(x)); + }; + $pkg.Sqrt = Sqrt; + init = function() { + var ab; + ab = new ($global.ArrayBuffer)(8); + buf.uint32array = new ($global.Uint32Array)(ab); + buf.float32array = new ($global.Float32Array)(ab); + buf.float64array = new ($global.Float64Array)(ab); + }; + Float64bits = function(f) { + var f, x, x$1; + buf.float64array[0] = f; + return (x = $shiftLeft64((new $Uint64(0, buf.uint32array[1])), 32), x$1 = (new $Uint64(0, buf.uint32array[0])), new $Uint64(x.$high + x$1.$high, x.$low + x$1.$low)); + }; + $pkg.Float64bits = Float64bits; + Float64frombits = function(b) { + var b; + buf.uint32array[0] = ((b.$low >>> 0)); + buf.uint32array[1] = (($shiftRightUint64(b, 32).$low >>> 0)); + return buf.float64array[0]; + }; + $pkg.Float64frombits = Float64frombits; + $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 = js.$init(); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + $r = bits.$init(); /* */ $s = 2; case 2: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + buf = new structType.ptr(arrayType.zero(), arrayType$1.zero(), arrayType$2.zero()); + math = $global.Math; + _zero = 0; + posInf = 1 / _zero; + negInf = -1 / _zero; + nan = $parseFloat($NaN); + init(); + /* */ } 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, math, Vector, Axis, Space, Shape, Line, ConvexPolygon, ContactSet, Circle, Projection, Object, Collision, Cell, sliceType, ptrType, sliceType$1, sliceType$2, ptrType$1, ptrType$2, sliceType$3, sliceType$4, ptrType$3, sliceType$5, ptrType$4, ptrType$5, ptrType$6, sliceType$6, ptrType$7, sliceType$7, mapType, Dot, NewSpace, NewLine, NewConvexPolygon, NewContactSet, NewRectangle, NewCircle, NewObject, axpyUnitaryTo, scalUnitaryTo, NewCollision, newCell; + math = $packages["math"]; + Vector = $pkg.Vector = $newType(12, $kindSlice, "resolv.Vector", true, "resolv", true, null); + Axis = $pkg.Axis = $newType(4, $kindInt, "resolv.Axis", true, "resolv", true, null); + Space = $pkg.Space = $newType(0, $kindStruct, "resolv.Space", true, "resolv", true, function(Cells_, CellWidth_, CellHeight_) { + this.$val = this; + if (arguments.length === 0) { + this.Cells = sliceType$2.nil; + this.CellWidth = 0; + this.CellHeight = 0; + return; + } + this.Cells = Cells_; + this.CellWidth = CellWidth_; + this.CellHeight = CellHeight_; + }); + Shape = $pkg.Shape = $newType(8, $kindInterface, "resolv.Shape", true, "resolv", true, null); + Line = $pkg.Line = $newType(0, $kindStruct, "resolv.Line", true, "resolv", true, function(Start_, End_) { + this.$val = this; + if (arguments.length === 0) { + this.Start = Vector.nil; + this.End = Vector.nil; + return; + } + this.Start = Start_; + this.End = End_; + }); + ConvexPolygon = $pkg.ConvexPolygon = $newType(0, $kindStruct, "resolv.ConvexPolygon", true, "resolv", true, function(Points_, X_, Y_, Closed_) { + this.$val = this; + if (arguments.length === 0) { + this.Points = sliceType$4.nil; + this.X = 0; + this.Y = 0; + this.Closed = false; + return; + } + this.Points = Points_; + this.X = X_; + this.Y = Y_; + this.Closed = Closed_; + }); + ContactSet = $pkg.ContactSet = $newType(0, $kindStruct, "resolv.ContactSet", true, "resolv", true, function(Points_, MTV_, Center_) { + this.$val = this; + if (arguments.length === 0) { + this.Points = sliceType$4.nil; + this.MTV = Vector.nil; + this.Center = Vector.nil; + return; + } + this.Points = Points_; + this.MTV = MTV_; + this.Center = Center_; + }); + Circle = $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_; + }); + Projection = $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_; + }); + Object = $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 = ptrType$1.nil; + this.X = 0; + this.Y = 0; + this.W = 0; + this.H = 0; + this.TouchingCells = sliceType$1.nil; + this.Data = $ifaceNil; + this.ignoreList = false; + this.tags = sliceType$6.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_; + }); + Collision = $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 = ptrType$2.nil; + this.dx = 0; + this.dy = 0; + this.Objects = sliceType$3.nil; + this.Cells = sliceType$1.nil; + return; + } + this.checkingObject = checkingObject_; + this.dx = dx_; + this.dy = dy_; + this.Objects = Objects_; + this.Cells = Cells_; + }); + Cell = $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 = sliceType$3.nil; + return; + } + this.X = X_; + this.Y = Y_; + this.Objects = Objects_; + }); + sliceType = $sliceType($Float64); + ptrType = $ptrType(Cell); + sliceType$1 = $sliceType(ptrType); + sliceType$2 = $sliceType(sliceType$1); + ptrType$1 = $ptrType(Space); + ptrType$2 = $ptrType(Object); + sliceType$3 = $sliceType(ptrType$2); + sliceType$4 = $sliceType(Vector); + ptrType$3 = $ptrType(Line); + sliceType$5 = $sliceType(ptrType$3); + ptrType$4 = $ptrType(Circle); + ptrType$5 = $ptrType(ConvexPolygon); + ptrType$6 = $ptrType(ContactSet); + sliceType$6 = $sliceType($String); + ptrType$7 = $ptrType(Collision); + sliceType$7 = $sliceType(Axis); + mapType = $mapType(ptrType$2, $Bool); + Vector.prototype.Clone = function() { + var clone, v; + v = this; + clone = $makeSlice(Vector, v.$length); + $copySlice(clone, v); + return clone; + }; + $ptrType(Vector).prototype.Clone = function() { return this.$get().Clone(); }; + Vector.prototype.Add = function(vs) { + var _i, _ref, dim, i, v, vs; + v = this; + dim = v.$length; + _ref = vs; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + i = _i; + if (((i < 0 || i >= vs.$length) ? ($throwRuntimeError("index out of range"), undefined) : vs.$array[vs.$offset + i]).$length > dim) { + axpyUnitaryTo($convertSliceType(v, sliceType), 1, $convertSliceType(v, sliceType), $convertSliceType($subslice(((i < 0 || i >= vs.$length) ? ($throwRuntimeError("index out of range"), undefined) : vs.$array[vs.$offset + i]), 0, dim), sliceType)); + } else { + axpyUnitaryTo($convertSliceType(v, sliceType), 1, $convertSliceType(v, sliceType), $convertSliceType(((i < 0 || i >= vs.$length) ? ($throwRuntimeError("index out of range"), undefined) : vs.$array[vs.$offset + i]), sliceType)); + } + _i++; + } + return v; + }; + $ptrType(Vector).prototype.Add = function(vs) { return this.$get().Add(vs); }; + Vector.prototype.Sub = function(vs) { + var _i, _ref, dim, i, v, vs; + v = this; + dim = v.$length; + _ref = vs; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + i = _i; + if (((i < 0 || i >= vs.$length) ? ($throwRuntimeError("index out of range"), undefined) : vs.$array[vs.$offset + i]).$length > dim) { + axpyUnitaryTo($convertSliceType(v, sliceType), -1, $convertSliceType($subslice(((i < 0 || i >= vs.$length) ? ($throwRuntimeError("index out of range"), undefined) : vs.$array[vs.$offset + i]), 0, dim), sliceType), $convertSliceType(v, sliceType)); + } else { + axpyUnitaryTo($convertSliceType(v, sliceType), -1, $convertSliceType(((i < 0 || i >= vs.$length) ? ($throwRuntimeError("index out of range"), undefined) : vs.$array[vs.$offset + i]), sliceType), $convertSliceType(v, sliceType)); + } + _i++; + } + return v; + }; + $ptrType(Vector).prototype.Sub = function(vs) { return this.$get().Sub(vs); }; + Vector.prototype.Scale = function(size) { + var size, v; + v = this; + scalUnitaryTo($convertSliceType(v, sliceType), size, $convertSliceType(v, sliceType)); + return v; + }; + $ptrType(Vector).prototype.Scale = function(size) { return this.$get().Scale(size); }; + Vector.prototype.Equal = function(v2) { + var _i, _ref, i, v, v2; + v = this; + if (!((v.$length === v2.$length))) { + return false; + } + _ref = v; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + i = _i; + if (math.Abs(((i < 0 || i >= v.$length) ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + i]) - ((i < 0 || i >= v2.$length) ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + i])) > 1e-08) { + return false; + } + _i++; + } + return true; + }; + $ptrType(Vector).prototype.Equal = function(v2) { return this.$get().Equal(v2); }; + Vector.prototype.Magnitude = function() { + var v; + v = this; + return math.Sqrt(v.Magnitude2()); + }; + $ptrType(Vector).prototype.Magnitude = function() { return this.$get().Magnitude(); }; + Vector.prototype.Magnitude2 = function() { + var _i, _ref, result, scalar, v; + v = this; + result = 0; + _ref = v; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + scalar = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + result = result + (scalar * scalar); + _i++; + } + return result; + }; + $ptrType(Vector).prototype.Magnitude2 = function() { return this.$get().Magnitude2(); }; + Vector.prototype.Unit = function() { + var _i, _ref, i, l, v; + v = this; + l = v.Magnitude(); + if (l < 1e-08) { + return v; + } + _ref = v; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + i = _i; + ((i < 0 || i >= v.$length) ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + i] = ((i < 0 || i >= v.$length) ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + i]) / l); + _i++; + } + return v; + }; + $ptrType(Vector).prototype.Unit = function() { return this.$get().Unit(); }; + Dot = function(v1, v2) { + var _i, _ref, _tmp, _tmp$1, _tmp$2, dim1, dim2, i, result, v1, v2; + _tmp = 0; + _tmp$1 = v1.$length; + _tmp$2 = v2.$length; + result = _tmp; + dim1 = _tmp$1; + dim2 = _tmp$2; + if (dim1 > dim2) { + v2 = $appendSlice(v2, $convertSliceType($makeSlice(Vector, (dim1 - dim2 >> 0)), sliceType)); + } + if (dim1 < dim2) { + v1 = $appendSlice(v1, $convertSliceType($makeSlice(Vector, (dim2 - dim1 >> 0)), sliceType)); + } + _ref = v1; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + i = _i; + result = result + (((i < 0 || i >= v1.$length) ? ($throwRuntimeError("index out of range"), undefined) : v1.$array[v1.$offset + i]) * ((i < 0 || i >= v2.$length) ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + i])); + _i++; + } + return result; + }; + $pkg.Dot = Dot; + Vector.prototype.Dot = function(v2) { + var v, v2; + v = this; + return Dot(v, v2); + }; + $ptrType(Vector).prototype.Dot = function(v2) { return this.$get().Dot(v2); }; + Vector.prototype.Cross = function(v2) { + var v, v2; + v = this; + if (!((v.$length === 3)) || !((v2.$length === 3))) { + return Vector.nil; + } + return new Vector([(1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1]) * (2 >= v2.$length ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + 2]) - (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2]) * (1 >= v2.$length ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + 1]), (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2]) * (0 >= v2.$length ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + 0]) - (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0]) * (2 >= v2.$length ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + 2]), (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0]) * (2 >= v2.$length ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + 2]) - (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2]) * (0 >= v2.$length ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + 0])]); + }; + $ptrType(Vector).prototype.Cross = function(v2) { return this.$get().Cross(v2); }; + Vector.prototype.Rotate = function(angle, as) { + var _1, _tmp, _tmp$1, _tmp$2, _tmp$3, _tmp$4, _tmp$5, angle, as, axis, cos, dim, sin, v, x, y, z, z$1; + v = this; + _tmp = 2; + _tmp$1 = v.$length; + axis = _tmp; + dim = _tmp$1; + if (dim === 0) { + return v; + } + if (as.$length > 0) { + axis = (0 >= as.$length ? ($throwRuntimeError("index out of range"), undefined) : as.$array[as.$offset + 0]); + } + if ((dim === 1) && !((axis === 2))) { + v = $append(v, 0, 0); + } + if ((dim < 2 && (axis === 2)) || ((dim === 2) && !((axis === 2)))) { + v = $append(v, 0); + } + _tmp$2 = (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0]); + _tmp$3 = (1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1]); + x = _tmp$2; + y = _tmp$3; + _tmp$4 = math.Cos(angle); + _tmp$5 = math.Sin(angle); + cos = _tmp$4; + sin = _tmp$5; + _1 = axis; + if (_1 === (0)) { + z = (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2]); + (1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1] = y * cos - z * sin); + (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2] = y * sin + z * cos); + } else if (_1 === (1)) { + z$1 = (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2]); + (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0] = x * cos + z$1 * sin); + (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2] = -x * sin + z$1 * cos); + } else if (_1 === (2)) { + (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0] = x * cos - y * sin); + (1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1] = x * sin + y * cos); + } + if (dim > 3) { + return $subslice(v, 0, 3); + } + return v; + }; + $ptrType(Vector).prototype.Rotate = function(angle, as) { return this.$get().Rotate(angle, as); }; + Vector.prototype.X = function() { + var v; + v = this; + if (v.$length < 1) { + return 0; + } + return (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0]); + }; + $ptrType(Vector).prototype.X = function() { return this.$get().X(); }; + Vector.prototype.Y = function() { + var v; + v = this; + if (v.$length < 2) { + return 0; + } + return (1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1]); + }; + $ptrType(Vector).prototype.Y = function() { return this.$get().Y(); }; + Vector.prototype.Z = function() { + var v; + v = this; + if (v.$length < 3) { + return 0; + } + return (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2]); + }; + $ptrType(Vector).prototype.Z = function() { return this.$get().Z(); }; + NewSpace = function(spaceWidth, spaceHeight, cellWidth, cellHeight) { + var _q, _q$1, cellHeight, cellWidth, sp, spaceHeight, spaceWidth; + sp = new Space.ptr(sliceType$2.nil, cellWidth, cellHeight); + sp.Resize((_q = spaceWidth / cellWidth, (_q === _q && _q !== 1/0 && _q !== -1/0) ? _q >> 0 : $throwRuntimeError("integer divide by zero")), (_q$1 = spaceHeight / cellHeight, (_q$1 === _q$1 && _q$1 !== 1/0 && _q$1 !== -1/0) ? _q$1 >> 0 : $throwRuntimeError("integer divide by zero"))); + return sp; + }; + $pkg.NewSpace = NewSpace; + Space.ptr.prototype.Add = function(objects) { + var {_i, _ref, obj, objects, sp, $s, $r, $c} = $restore(this, {objects}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + sp = this; + if (sp === ptrType$1.nil) { + $panic(new $String("ERROR: space is nil")); + } + _ref = objects; + _i = 0; + /* while (true) { */ case 1: + /* if (!(_i < _ref.$length)) { break; } */ if(!(_i < _ref.$length)) { $s = 2; continue; } + obj = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + obj.Space = sp; + $r = obj.Update(); /* */ $s = 3; case 3: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + _i++; + $s = 1; continue; + case 2: + $s = -1; return; + /* */ } return; } var $f = {$blk: Space.ptr.prototype.Add, $c: true, $r, _i, _ref, obj, objects, sp, $s};return $f; + }; + Space.prototype.Add = function(objects) { return this.$val.Add(objects); }; + Space.ptr.prototype.Remove = function(objects) { + var _i, _i$1, _ref, _ref$1, cell, obj, objects, sp; + sp = this; + if (sp === ptrType$1.nil) { + $panic(new $String("ERROR: space is nil")); + } + _ref = objects; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + obj = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + _ref$1 = obj.TouchingCells; + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$1.$length)) { break; } + cell = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); + cell.unregister(obj); + _i$1++; + } + obj.TouchingCells = new sliceType$1([]); + obj.Space = ptrType$1.nil; + _i++; + } + }; + Space.prototype.Remove = function(objects) { return this.$val.Remove(objects); }; + Space.ptr.prototype.Objects = function() { + var _entry, _i, _i$1, _i$2, _key, _ref, _ref$1, _ref$2, _tuple, added, cx, cy, o, objects, objectsAdded, sp, x, x$1, x$2; + sp = this; + objectsAdded = $makeMap(ptrType$2.keyFor, []); + objects = new sliceType$3([]); + _ref = sp.Cells; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + cy = _i; + _ref$1 = (x = sp.Cells, ((cy < 0 || cy >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + cy])); + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$1.$length)) { break; } + cx = _i$1; + _ref$2 = (x$1 = (x$2 = sp.Cells, ((cy < 0 || cy >= x$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + cy])), ((cx < 0 || cx >= x$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + cx])).Objects; + _i$2 = 0; + while (true) { + if (!(_i$2 < _ref$2.$length)) { break; } + o = ((_i$2 < 0 || _i$2 >= _ref$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$2.$array[_ref$2.$offset + _i$2]); + _tuple = (_entry = objectsAdded[ptrType$2.keyFor(o)], _entry !== undefined ? [_entry.v, true] : [false, false]); + added = _tuple[1]; + if (!added) { + objects = $append(objects, o); + _key = o; (objectsAdded || $throwRuntimeError("assignment to entry in nil map"))[ptrType$2.keyFor(_key)] = { k: _key, v: true }; + } + _i$2++; + } + _i$1++; + } + _i++; + } + return objects; + }; + Space.prototype.Objects = function() { return this.$val.Objects(); }; + Space.ptr.prototype.Resize = function(width, height) { + var height, sp, width, x, x$1, x$2, y; + sp = this; + sp.Cells = new sliceType$2([]); + y = 0; + while (true) { + if (!(y < height)) { break; } + sp.Cells = $append(sp.Cells, new sliceType$1([])); + x = 0; + while (true) { + if (!(x < width)) { break; } + (x$2 = sp.Cells, ((y < 0 || y >= x$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + y] = $append((x$1 = sp.Cells, ((y < 0 || y >= x$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + y])), newCell(x, y)))); + x = x + (1) >> 0; + } + y = y + (1) >> 0; + } + }; + Space.prototype.Resize = function(width, height) { return this.$val.Resize(width, height); }; + Space.ptr.prototype.Cell = function(x, y) { + var sp, x, x$1, x$2, x$3, y; + sp = this; + if (y >= 0 && y < sp.Cells.$length && x >= 0 && x < (x$1 = sp.Cells, ((y < 0 || y >= x$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + y])).$length) { + return (x$2 = (x$3 = sp.Cells, ((y < 0 || y >= x$3.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + y])), ((x < 0 || x >= x$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + x])); + } + return ptrType.nil; + }; + Space.prototype.Cell = function(x, y) { return this.$val.Cell(x, y); }; + Space.ptr.prototype.CheckCells = function(x, y, w, h, tags) { + var _i, _ref, cell, h, ix, iy, obj, sp, tags, w, x, x$1, y; + sp = this; + ix = x; + while (true) { + if (!(ix < (x + w >> 0))) { break; } + iy = y; + while (true) { + if (!(iy < (y + h >> 0))) { break; } + cell = sp.Cell(ix, iy); + if (!(cell === ptrType.nil)) { + if (tags.$length > 0) { + if (cell.ContainsTags(tags)) { + _ref = cell.Objects; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + obj = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (obj.HasTags(tags)) { + return obj; + } + _i++; + } + } + } else if (cell.Occupied()) { + return (x$1 = cell.Objects, (0 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 0])); + } + } + iy = iy + (1) >> 0; + } + ix = ix + (1) >> 0; + } + return ptrType$2.nil; + }; + Space.prototype.CheckCells = function(x, y, w, h, tags) { return this.$val.CheckCells(x, y, w, h, tags); }; + Space.ptr.prototype.CheckCellsWorld = function(x, y, w, h, tags) { + var _tuple, _tuple$1, ch, cw, h, sp, sx, sy, tags, w, x, y; + sp = this; + _tuple = sp.WorldToSpace(x, y); + sx = _tuple[0]; + sy = _tuple[1]; + _tuple$1 = sp.WorldToSpace(w, h); + cw = _tuple$1[0]; + ch = _tuple$1[1]; + return sp.CheckCells(sx, sy, cw, ch, tags); + }; + Space.prototype.CheckCellsWorld = function(x, y, w, h, tags) { return this.$val.CheckCellsWorld(x, y, w, h, tags); }; + Space.ptr.prototype.UnregisterAllObjects = function() { + var cell, sp, x, x$1, x$2, x$3, y; + sp = this; + y = 0; + while (true) { + if (!(y < sp.Cells.$length)) { break; } + x = 0; + while (true) { + if (!(x < (x$1 = sp.Cells, ((y < 0 || y >= x$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + y])).$length)) { break; } + cell = (x$2 = (x$3 = sp.Cells, ((y < 0 || y >= x$3.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + y])), ((x < 0 || x >= x$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + x])); + sp.Remove(cell.Objects); + x = x + (1) >> 0; + } + y = y + (1) >> 0; + } + }; + Space.prototype.UnregisterAllObjects = function() { return this.$val.UnregisterAllObjects(); }; + Space.ptr.prototype.WorldToSpace = function(x, y) { + var fx, fy, sp, x, y; + sp = this; + fx = ((math.Floor(x / (sp.CellWidth)) >> 0)); + fy = ((math.Floor(y / (sp.CellHeight)) >> 0)); + return [fx, fy]; + }; + Space.prototype.WorldToSpace = function(x, y) { return this.$val.WorldToSpace(x, y); }; + Space.ptr.prototype.SpaceToWorld = function(x, y) { + var fx, fy, sp, x, y; + sp = this; + fx = (($imul(x, sp.CellWidth))); + fy = (($imul(y, sp.CellHeight))); + return [fx, fy]; + }; + Space.prototype.SpaceToWorld = function(x, y) { return this.$val.SpaceToWorld(x, y); }; + Space.ptr.prototype.Height = function() { + var sp; + sp = this; + return sp.Cells.$length; + }; + Space.prototype.Height = function() { return this.$val.Height(); }; + Space.ptr.prototype.Width = function() { + var sp, x; + sp = this; + if (sp.Cells.$length > 0) { + return (x = sp.Cells, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])).$length; + } + return 0; + }; + Space.prototype.Width = function() { return this.$val.Width(); }; + Space.ptr.prototype.CellsInLine = function(startX, startY, endX, endY) { + var _q, _q$1, _q$2, _q$3, _tuple, _tuple$1, alternate, c, cell, cells, cx, cy, dv, endCell, endX, endY, p, pX, pY, sp, startX, startY; + sp = this; + cells = new sliceType$1([]); + cell = sp.Cell(startX, startY); + endCell = sp.Cell(endX, endY); + if (!(cell === ptrType.nil) && !(endCell === ptrType.nil)) { + dv = new Vector([((endX - startX >> 0)), ((endY - startY >> 0))]).Unit(); + (0 >= dv.$length ? ($throwRuntimeError("index out of range"), undefined) : dv.$array[dv.$offset + 0] = (0 >= dv.$length ? ($throwRuntimeError("index out of range"), undefined) : dv.$array[dv.$offset + 0]) * (((_q = sp.CellWidth / 2, (_q === _q && _q !== 1/0 && _q !== -1/0) ? _q >> 0 : $throwRuntimeError("integer divide by zero"))))); + (1 >= dv.$length ? ($throwRuntimeError("index out of range"), undefined) : dv.$array[dv.$offset + 1] = (1 >= dv.$length ? ($throwRuntimeError("index out of range"), undefined) : dv.$array[dv.$offset + 1]) * (((_q$1 = sp.CellHeight / 2, (_q$1 === _q$1 && _q$1 !== 1/0 && _q$1 !== -1/0) ? _q$1 >> 0 : $throwRuntimeError("integer divide by zero"))))); + _tuple = sp.SpaceToWorld(startX, startY); + pX = _tuple[0]; + pY = _tuple[1]; + p = new Vector([pX + ((_q$2 = sp.CellWidth / 2, (_q$2 === _q$2 && _q$2 !== 1/0 && _q$2 !== -1/0) ? _q$2 >> 0 : $throwRuntimeError("integer divide by zero"))), pY + ((_q$3 = sp.CellHeight / 2, (_q$3 === _q$3 && _q$3 !== 1/0 && _q$3 !== -1/0) ? _q$3 >> 0 : $throwRuntimeError("integer divide by zero")))]); + alternate = false; + while (true) { + if (!(!(cell === ptrType.nil))) { break; } + if (cell === endCell) { + cells = $append(cells, cell); + break; + } + cells = $append(cells, cell); + if (alternate) { + (1 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 1] = (1 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 1]) + ((1 >= dv.$length ? ($throwRuntimeError("index out of range"), undefined) : dv.$array[dv.$offset + 1]))); + } else { + (0 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 0] = (0 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 0]) + ((0 >= dv.$length ? ($throwRuntimeError("index out of range"), undefined) : dv.$array[dv.$offset + 0]))); + } + _tuple$1 = sp.WorldToSpace((0 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 0]), (1 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 1])); + cx = _tuple$1[0]; + cy = _tuple$1[1]; + c = sp.Cell(cx, cy); + if (!(c === cell)) { + cell = c; + } + alternate = !alternate; + } + } + return cells; + }; + Space.prototype.CellsInLine = function(startX, startY, endX, endY) { return this.$val.CellsInLine(startX, startY, endX, endY); }; + NewLine = function(x, y, x2, y2) { + var x, x2, y, y2; + return new Line.ptr(new Vector([x, y]), new Vector([x2, y2])); + }; + $pkg.NewLine = NewLine; + Line.ptr.prototype.Project = function(axis) { + var axis, line; + line = this; + return line.Vector().Scale(axis.Dot(line.Start.Sub(new sliceType$4([line.End])))); + }; + Line.prototype.Project = function(axis) { return this.$val.Project(axis); }; + Line.ptr.prototype.Normal = function() { + var line, v; + line = this; + v = line.Vector(); + return new Vector([(1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1]), -(0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0])]).Unit(); + }; + Line.prototype.Normal = function() { return this.$val.Normal(); }; + Line.ptr.prototype.Vector = function() { + var line; + line = this; + return line.End.Clone().Sub(new sliceType$4([line.Start])).Unit(); + }; + Line.prototype.Vector = function() { return this.$val.Vector(); }; + Line.ptr.prototype.IntersectionPointsLine = function(other) { + var det, dx, dy, gamma, lambda, line, other, x, x$1, x$10, x$11, x$12, x$13, x$14, x$15, x$16, x$17, x$18, x$19, x$2, x$20, x$21, x$22, x$23, x$24, x$25, x$26, x$27, x$28, x$29, x$3, x$4, x$5, x$6, x$7, x$8, x$9; + line = this; + det = ((x = line.End, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])) - (x$1 = line.Start, (0 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 0]))) * ((x$2 = other.End, (1 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 1])) - (x$3 = other.Start, (1 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 1]))) - ((x$4 = other.End, (0 >= x$4.$length ? ($throwRuntimeError("index out of range"), undefined) : x$4.$array[x$4.$offset + 0])) - (x$5 = other.Start, (0 >= x$5.$length ? ($throwRuntimeError("index out of range"), undefined) : x$5.$array[x$5.$offset + 0]))) * ((x$6 = line.End, (1 >= x$6.$length ? ($throwRuntimeError("index out of range"), undefined) : x$6.$array[x$6.$offset + 1])) - (x$7 = line.Start, (1 >= x$7.$length ? ($throwRuntimeError("index out of range"), undefined) : x$7.$array[x$7.$offset + 1]))); + if (!((det === 0))) { + lambda = ((((x$8 = line.Start, (1 >= x$8.$length ? ($throwRuntimeError("index out of range"), undefined) : x$8.$array[x$8.$offset + 1])) - (x$9 = other.Start, (1 >= x$9.$length ? ($throwRuntimeError("index out of range"), undefined) : x$9.$array[x$9.$offset + 1]))) * ((x$10 = other.End, (0 >= x$10.$length ? ($throwRuntimeError("index out of range"), undefined) : x$10.$array[x$10.$offset + 0])) - (x$11 = other.Start, (0 >= x$11.$length ? ($throwRuntimeError("index out of range"), undefined) : x$11.$array[x$11.$offset + 0])))) - (((x$12 = line.Start, (0 >= x$12.$length ? ($throwRuntimeError("index out of range"), undefined) : x$12.$array[x$12.$offset + 0])) - (x$13 = other.Start, (0 >= x$13.$length ? ($throwRuntimeError("index out of range"), undefined) : x$13.$array[x$13.$offset + 0]))) * ((x$14 = other.End, (1 >= x$14.$length ? ($throwRuntimeError("index out of range"), undefined) : x$14.$array[x$14.$offset + 1])) - (x$15 = other.Start, (1 >= x$15.$length ? ($throwRuntimeError("index out of range"), undefined) : x$15.$array[x$15.$offset + 1])))) + 1) / det; + gamma = ((((x$16 = line.Start, (1 >= x$16.$length ? ($throwRuntimeError("index out of range"), undefined) : x$16.$array[x$16.$offset + 1])) - (x$17 = other.Start, (1 >= x$17.$length ? ($throwRuntimeError("index out of range"), undefined) : x$17.$array[x$17.$offset + 1]))) * ((x$18 = line.End, (0 >= x$18.$length ? ($throwRuntimeError("index out of range"), undefined) : x$18.$array[x$18.$offset + 0])) - (x$19 = line.Start, (0 >= x$19.$length ? ($throwRuntimeError("index out of range"), undefined) : x$19.$array[x$19.$offset + 0])))) - (((x$20 = line.Start, (0 >= x$20.$length ? ($throwRuntimeError("index out of range"), undefined) : x$20.$array[x$20.$offset + 0])) - (x$21 = other.Start, (0 >= x$21.$length ? ($throwRuntimeError("index out of range"), undefined) : x$21.$array[x$21.$offset + 0]))) * ((x$22 = line.End, (1 >= x$22.$length ? ($throwRuntimeError("index out of range"), undefined) : x$22.$array[x$22.$offset + 1])) - (x$23 = line.Start, (1 >= x$23.$length ? ($throwRuntimeError("index out of range"), undefined) : x$23.$array[x$23.$offset + 1])))) + 1) / det; + if ((0 < lambda && lambda < 1) && (0 < gamma && gamma < 1)) { + dx = (x$24 = line.End, (0 >= x$24.$length ? ($throwRuntimeError("index out of range"), undefined) : x$24.$array[x$24.$offset + 0])) - (x$25 = line.Start, (0 >= x$25.$length ? ($throwRuntimeError("index out of range"), undefined) : x$25.$array[x$25.$offset + 0])); + dy = (x$26 = line.End, (1 >= x$26.$length ? ($throwRuntimeError("index out of range"), undefined) : x$26.$array[x$26.$offset + 1])) - (x$27 = line.Start, (1 >= x$27.$length ? ($throwRuntimeError("index out of range"), undefined) : x$27.$array[x$27.$offset + 1])); + return new Vector([(x$28 = line.Start, (0 >= x$28.$length ? ($throwRuntimeError("index out of range"), undefined) : x$28.$array[x$28.$offset + 0])) + (lambda * dx), (x$29 = line.Start, (1 >= x$29.$length ? ($throwRuntimeError("index out of range"), undefined) : x$29.$array[x$29.$offset + 1])) + (lambda * dy)]); + } + } + return Vector.nil; + }; + Line.prototype.IntersectionPointsLine = function(other) { return this.$val.IntersectionPointsLine(other); }; + Line.ptr.prototype.IntersectionPointsCircle = function(circle) { + var a, b, c, circle, cp, det, diff, lEnd, lStart, line, points, t, t$1, x, x$1, x$2, x$3, x$4, x$5; + line = this; + points = new sliceType$4([]); + cp = new Vector([circle.X, circle.Y]); + lStart = line.Start.Sub(new sliceType$4([cp])); + lEnd = line.End.Sub(new sliceType$4([cp])); + diff = lEnd.Sub(new sliceType$4([lStart])); + a = (0 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 0]) * (0 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 0]) + (1 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 1]) * (1 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 1]); + b = 2 * (((0 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 0]) * (0 >= lStart.$length ? ($throwRuntimeError("index out of range"), undefined) : lStart.$array[lStart.$offset + 0])) + ((1 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 1]) * (1 >= lStart.$length ? ($throwRuntimeError("index out of range"), undefined) : lStart.$array[lStart.$offset + 1]))); + c = ((0 >= lStart.$length ? ($throwRuntimeError("index out of range"), undefined) : lStart.$array[lStart.$offset + 0]) * (0 >= lStart.$length ? ($throwRuntimeError("index out of range"), undefined) : lStart.$array[lStart.$offset + 0])) + ((1 >= lStart.$length ? ($throwRuntimeError("index out of range"), undefined) : lStart.$array[lStart.$offset + 1]) * (1 >= lStart.$length ? ($throwRuntimeError("index out of range"), undefined) : lStart.$array[lStart.$offset + 1])) - (circle.Radius * circle.Radius); + det = b * b - (4 * a * c); + if (det < 0) { + } else if (det === 0) { + t = -b / (2 * a); + if (t >= 0 && t <= 1) { + points = $append(points, new Vector([(x = line.Start, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])) + t * (0 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 0]), (x$1 = line.Start, (1 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 1])) + t * (1 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 1])])); + } + } else { + t$1 = (-b + math.Sqrt(det)) / (2 * a); + if (t$1 >= 0 && t$1 <= 1) { + points = $append(points, new Vector([(x$2 = line.Start, (0 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 0])) + t$1 * (0 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 0]), (x$3 = line.Start, (1 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 1])) + t$1 * (1 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 1])])); + } + t$1 = (-b - math.Sqrt(det)) / (2 * a); + if (t$1 >= 0 && t$1 <= 1) { + points = $append(points, new Vector([(x$4 = line.Start, (0 >= x$4.$length ? ($throwRuntimeError("index out of range"), undefined) : x$4.$array[x$4.$offset + 0])) + t$1 * (0 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 0]), (x$5 = line.Start, (1 >= x$5.$length ? ($throwRuntimeError("index out of range"), undefined) : x$5.$array[x$5.$offset + 1])) + t$1 * (1 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 1])])); + } + } + return points; + }; + Line.prototype.IntersectionPointsCircle = function(circle) { return this.$val.IntersectionPointsCircle(circle); }; + NewConvexPolygon = function(points) { + var cp, points; + cp = new ConvexPolygon.ptr(new sliceType$4([]), 0, 0, true); + cp.AddPoints(points); + return cp; + }; + $pkg.NewConvexPolygon = NewConvexPolygon; + ConvexPolygon.ptr.prototype.Clone = function() { + var _i, _ref, cp, newPoly, point, points; + cp = this; + points = new sliceType$4([]); + _ref = cp.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + point = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + points = $append(points, point.Clone()); + _i++; + } + newPoly = NewConvexPolygon(sliceType.nil); + newPoly.X = cp.X; + newPoly.Y = cp.Y; + newPoly.AddPointsVec(points); + newPoly.Closed = cp.Closed; + return newPoly; + }; + ConvexPolygon.prototype.Clone = function() { return this.$val.Clone(); }; + ConvexPolygon.ptr.prototype.AddPointsVec = function(points) { + var cp, points; + cp = this; + cp.Points = $appendSlice(cp.Points, points); + }; + ConvexPolygon.prototype.AddPointsVec = function(points) { return this.$val.AddPointsVec(points); }; + ConvexPolygon.ptr.prototype.AddPoints = function(vertexPositions) { + var cp, v, vertexPositions, x; + cp = this; + v = 0; + while (true) { + if (!(v < vertexPositions.$length)) { break; } + cp.Points = $append(cp.Points, new Vector([((v < 0 || v >= vertexPositions.$length) ? ($throwRuntimeError("index out of range"), undefined) : vertexPositions.$array[vertexPositions.$offset + v]), (x = v + 1 >> 0, ((x < 0 || x >= vertexPositions.$length) ? ($throwRuntimeError("index out of range"), undefined) : vertexPositions.$array[vertexPositions.$offset + x]))])); + v = v + (2) >> 0; + } + }; + ConvexPolygon.prototype.AddPoints = function(vertexPositions) { return this.$val.AddPoints(vertexPositions); }; + ConvexPolygon.ptr.prototype.Lines = function() { + var _tmp, _tmp$1, cp, end, i, line, lines, start, vertices, x; + cp = this; + lines = new sliceType$5([]); + vertices = cp.Transformed(); + i = 0; + while (true) { + if (!(i < vertices.$length)) { break; } + _tmp = ((i < 0 || i >= vertices.$length) ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + i]); + _tmp$1 = (0 >= vertices.$length ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + 0]); + start = _tmp; + end = _tmp$1; + if (i < (vertices.$length - 1 >> 0)) { + end = (x = i + 1 >> 0, ((x < 0 || x >= vertices.$length) ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + x])); + } else if (!cp.Closed) { + break; + } + line = NewLine((0 >= start.$length ? ($throwRuntimeError("index out of range"), undefined) : start.$array[start.$offset + 0]), (1 >= start.$length ? ($throwRuntimeError("index out of range"), undefined) : start.$array[start.$offset + 1]), (0 >= end.$length ? ($throwRuntimeError("index out of range"), undefined) : end.$array[end.$offset + 0]), (1 >= end.$length ? ($throwRuntimeError("index out of range"), undefined) : end.$array[end.$offset + 1])); + lines = $append(lines, line); + i = i + (1) >> 0; + } + return lines; + }; + ConvexPolygon.prototype.Lines = function() { return this.$val.Lines(); }; + ConvexPolygon.ptr.prototype.Transformed = function() { + var _i, _ref, cp, point, transformed; + cp = this; + transformed = new sliceType$4([]); + _ref = cp.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + point = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + transformed = $append(transformed, new Vector([(0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]) + cp.X, (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1]) + cp.Y])); + _i++; + } + return transformed; + }; + ConvexPolygon.prototype.Transformed = function() { return this.$val.Transformed(); }; + ConvexPolygon.ptr.prototype.Bounds = function() { + var bottomRight, cp, i, point, topLeft, transformed, x, x$1; + cp = this; + transformed = cp.Transformed(); + topLeft = new Vector([(x = (0 >= transformed.$length ? ($throwRuntimeError("index out of range"), undefined) : transformed.$array[transformed.$offset + 0]), (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])), (x$1 = (0 >= transformed.$length ? ($throwRuntimeError("index out of range"), undefined) : transformed.$array[transformed.$offset + 0]), (1 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 1]))]); + bottomRight = topLeft.Clone(); + i = 0; + while (true) { + if (!(i < transformed.$length)) { break; } + point = ((i < 0 || i >= transformed.$length) ? ($throwRuntimeError("index out of range"), undefined) : transformed.$array[transformed.$offset + i]); + if ((0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]) < (0 >= topLeft.$length ? ($throwRuntimeError("index out of range"), undefined) : topLeft.$array[topLeft.$offset + 0])) { + (0 >= topLeft.$length ? ($throwRuntimeError("index out of range"), undefined) : topLeft.$array[topLeft.$offset + 0] = (0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0])); + } else if ((0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]) > (0 >= bottomRight.$length ? ($throwRuntimeError("index out of range"), undefined) : bottomRight.$array[bottomRight.$offset + 0])) { + (0 >= bottomRight.$length ? ($throwRuntimeError("index out of range"), undefined) : bottomRight.$array[bottomRight.$offset + 0] = (0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0])); + } + if ((1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1]) < (1 >= topLeft.$length ? ($throwRuntimeError("index out of range"), undefined) : topLeft.$array[topLeft.$offset + 1])) { + (1 >= topLeft.$length ? ($throwRuntimeError("index out of range"), undefined) : topLeft.$array[topLeft.$offset + 1] = (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1])); + } else if ((1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1]) > (1 >= bottomRight.$length ? ($throwRuntimeError("index out of range"), undefined) : bottomRight.$array[bottomRight.$offset + 1])) { + (1 >= bottomRight.$length ? ($throwRuntimeError("index out of range"), undefined) : bottomRight.$array[bottomRight.$offset + 1] = (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1])); + } + i = i + (1) >> 0; + } + return [topLeft, bottomRight]; + }; + ConvexPolygon.prototype.Bounds = function() { return this.$val.Bounds(); }; + ConvexPolygon.ptr.prototype.Position = function() { + var cp; + cp = this; + return [cp.X, cp.Y]; + }; + ConvexPolygon.prototype.Position = function() { return this.$val.Position(); }; + ConvexPolygon.ptr.prototype.SetPosition = function(x, y) { + var cp, x, y; + cp = this; + cp.X = x; + cp.Y = y; + }; + ConvexPolygon.prototype.SetPosition = function(x, y) { return this.$val.SetPosition(x, y); }; + ConvexPolygon.ptr.prototype.SetPositionVec = function(vec) { + var cp, vec; + cp = this; + cp.X = vec.X(); + cp.Y = vec.Y(); + }; + ConvexPolygon.prototype.SetPositionVec = function(vec) { return this.$val.SetPositionVec(vec); }; + ConvexPolygon.ptr.prototype.Move = function(x, y) { + var cp, x, y; + cp = this; + cp.X = cp.X + (x); + cp.Y = cp.Y + (y); + }; + ConvexPolygon.prototype.Move = function(x, y) { return this.$val.Move(x, y); }; + ConvexPolygon.ptr.prototype.MoveVec = function(vec) { + var cp, vec; + cp = this; + cp.X = cp.X + (vec.X()); + cp.Y = cp.Y + (vec.Y()); + }; + ConvexPolygon.prototype.MoveVec = function(vec) { return this.$val.MoveVec(vec); }; + ConvexPolygon.ptr.prototype.Center = function() { + var _i, _ref, cp, pos, v; + cp = this; + pos = new Vector([0, 0]); + _ref = cp.Transformed(); + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + v = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + pos.Add(new sliceType$4([v])); + _i++; + } + (0 >= pos.$length ? ($throwRuntimeError("index out of range"), undefined) : pos.$array[pos.$offset + 0] = (0 >= pos.$length ? ($throwRuntimeError("index out of range"), undefined) : pos.$array[pos.$offset + 0]) / ((cp.Transformed().$length))); + (1 >= pos.$length ? ($throwRuntimeError("index out of range"), undefined) : pos.$array[pos.$offset + 1] = (1 >= pos.$length ? ($throwRuntimeError("index out of range"), undefined) : pos.$array[pos.$offset + 1]) / ((cp.Transformed().$length))); + return pos; + }; + ConvexPolygon.prototype.Center = function() { return this.$val.Center(); }; + ConvexPolygon.ptr.prototype.Project = function(axis) { + var axis, cp, i, max, min, p, vertices, x, x$1, x$2, x$3; + cp = this; + axis = axis.Unit(); + vertices = cp.Transformed(); + min = axis.Dot(new Vector([(x = (0 >= vertices.$length ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + 0]), (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])), (x$1 = (0 >= vertices.$length ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + 0]), (1 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 1]))])); + max = min; + i = 1; + while (true) { + if (!(i < vertices.$length)) { break; } + p = axis.Dot(new Vector([(x$2 = ((i < 0 || i >= vertices.$length) ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + i]), (0 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 0])), (x$3 = ((i < 0 || i >= vertices.$length) ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + i]), (1 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 1]))])); + if (p < min) { + min = p; + } else if (p > max) { + max = p; + } + i = i + (1) >> 0; + } + return new Projection.ptr(min, max); + }; + ConvexPolygon.prototype.Project = function(axis) { return this.$val.Project(axis); }; + ConvexPolygon.ptr.prototype.SATAxes = function() { + var _i, _ref, axes, cp, line; + cp = this; + axes = new sliceType$4([]); + _ref = cp.Lines(); + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + line = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + axes = $append(axes, line.Normal()); + _i++; + } + return axes; + }; + ConvexPolygon.prototype.SATAxes = function() { return this.$val.SATAxes(); }; + ConvexPolygon.ptr.prototype.PointInside = function(point) { + var _i, _ref, contactCount, line, point, pointLine, polygon; + polygon = this; + pointLine = NewLine((0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]), (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1]), (0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]) + 9.99999999999e+11, (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1])); + contactCount = 0; + _ref = polygon.Lines(); + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + line = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (!(line.IntersectionPointsLine(pointLine) === Vector.nil)) { + contactCount = contactCount + (1) >> 0; + } + _i++; + } + return contactCount === 1; + }; + ConvexPolygon.prototype.PointInside = function(point) { return this.$val.PointInside(point); }; + NewContactSet = function() { + return new ContactSet.ptr(new sliceType$4([]), new Vector([0, 0]), new Vector([0, 0])); + }; + $pkg.NewContactSet = NewContactSet; + ContactSet.ptr.prototype.LeftmostPoint = function() { + var _i, _ref, cs, left, point; + cs = this; + left = Vector.nil; + _ref = cs.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + point = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (left === Vector.nil || (0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]) < (0 >= left.$length ? ($throwRuntimeError("index out of range"), undefined) : left.$array[left.$offset + 0])) { + left = point; + } + _i++; + } + return left; + }; + ContactSet.prototype.LeftmostPoint = function() { return this.$val.LeftmostPoint(); }; + ContactSet.ptr.prototype.RightmostPoint = function() { + var _i, _ref, cs, point, right; + cs = this; + right = Vector.nil; + _ref = cs.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + point = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (right === Vector.nil || (0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]) > (0 >= right.$length ? ($throwRuntimeError("index out of range"), undefined) : right.$array[right.$offset + 0])) { + right = point; + } + _i++; + } + return right; + }; + ContactSet.prototype.RightmostPoint = function() { return this.$val.RightmostPoint(); }; + ContactSet.ptr.prototype.TopmostPoint = function() { + var _i, _ref, cs, point, top; + cs = this; + top = Vector.nil; + _ref = cs.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + point = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (top === Vector.nil || (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1]) < (1 >= top.$length ? ($throwRuntimeError("index out of range"), undefined) : top.$array[top.$offset + 1])) { + top = point; + } + _i++; + } + return top; + }; + ContactSet.prototype.TopmostPoint = function() { return this.$val.TopmostPoint(); }; + ContactSet.ptr.prototype.BottommostPoint = function() { + var _i, _ref, bottom, cs, point; + cs = this; + bottom = Vector.nil; + _ref = cs.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + point = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (bottom === Vector.nil || (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1]) > (1 >= bottom.$length ? ($throwRuntimeError("index out of range"), undefined) : bottom.$array[bottom.$offset + 1])) { + bottom = point; + } + _i++; + } + return bottom; + }; + ContactSet.prototype.BottommostPoint = function() { return this.$val.BottommostPoint(); }; + ConvexPolygon.ptr.prototype.Intersection = function(dx, dy, other) { + var _i, _i$1, _i$2, _i$3, _ref, _ref$1, _ref$2, _ref$3, _tuple, _tuple$1, circle, contactSet, cp, deltaMagnitude, dx, dy, isCircle, isPoly, line, line$1, mtv, ogMagnitude, ogX, ogY, other, otherLine, point, point$1, poly, x, x$1, x$2, x$3; + cp = this; + contactSet = NewContactSet(); + ogX = cp.X; + ogY = cp.Y; + cp.X = cp.X + (dx); + cp.Y = cp.Y + (dy); + _tuple = $assertType(other, ptrType$4, true); + circle = _tuple[0]; + isCircle = _tuple[1]; + if (isCircle) { + _ref = cp.Lines(); + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + line = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + contactSet.Points = $appendSlice(contactSet.Points, line.IntersectionPointsCircle(circle)); + _i++; + } + } else { + _tuple$1 = $assertType(other, ptrType$5, true); + poly = _tuple$1[0]; + isPoly = _tuple$1[1]; + if (isPoly) { + _ref$1 = cp.Lines(); + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$1.$length)) { break; } + line$1 = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); + _ref$2 = poly.Lines(); + _i$2 = 0; + while (true) { + if (!(_i$2 < _ref$2.$length)) { break; } + otherLine = ((_i$2 < 0 || _i$2 >= _ref$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$2.$array[_ref$2.$offset + _i$2]); + point = line$1.IntersectionPointsLine(otherLine); + if (!(point === Vector.nil)) { + contactSet.Points = $append(contactSet.Points, point); + } + _i$2++; + } + _i$1++; + } + } + } + if (contactSet.Points.$length > 0) { + _ref$3 = contactSet.Points; + _i$3 = 0; + while (true) { + if (!(_i$3 < _ref$3.$length)) { break; } + point$1 = ((_i$3 < 0 || _i$3 >= _ref$3.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$3.$array[_ref$3.$offset + _i$3]); + contactSet.Center = contactSet.Center.Add(new sliceType$4([point$1])); + _i$3++; + } + (x$1 = contactSet.Center, (0 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 0] = (x = contactSet.Center, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])) / ((contactSet.Points.$length)))); + (x$3 = contactSet.Center, (1 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 1] = (x$2 = contactSet.Center, (1 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 1])) / ((contactSet.Points.$length)))); + mtv = cp.calculateMTV(contactSet, other); + if (!(mtv === Vector.nil)) { + contactSet.MTV = mtv; + } + } else { + contactSet = ptrType$6.nil; + } + if (!(contactSet === ptrType$6.nil) && (!((dx === 0)) || !((dy === 0)))) { + deltaMagnitude = new Vector([dx, dy]).Magnitude(); + ogMagnitude = contactSet.MTV.Magnitude(); + contactSet.MTV = contactSet.MTV.Unit().Scale(ogMagnitude - deltaMagnitude); + } + cp.X = ogX; + cp.Y = ogY; + return contactSet; + }; + ConvexPolygon.prototype.Intersection = function(dx, dy, other) { return this.$val.Intersection(dx, dy, other); }; + ConvexPolygon.ptr.prototype.calculateMTV = function(contactSet, otherShape) { + var _i, _i$1, _ref, _ref$1, _ref$2, axis, axis$1, contactSet, cp, delta, other, otherShape, overlap, overlap$1, smallest; + cp = this; + delta = new Vector([0, 0]); + smallest = new Vector([1.7976931348623157e+308, 0]); + _ref = otherShape; + if ($assertType(_ref, ptrType$5, true)[1]) { + other = _ref.$val; + _ref$1 = cp.SATAxes(); + _i = 0; + while (true) { + if (!(_i < _ref$1.$length)) { break; } + axis = ((_i < 0 || _i >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i]); + if (!$clone(cp.Project(axis), Projection).Overlapping($clone(other.Project(axis), Projection))) { + return Vector.nil; + } + overlap = $clone(cp.Project(axis), Projection).Overlap($clone(other.Project(axis), Projection)); + if (smallest.Magnitude() > overlap) { + smallest = axis.Scale(overlap); + } + _i++; + } + _ref$2 = other.SATAxes(); + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$2.$length)) { break; } + axis$1 = ((_i$1 < 0 || _i$1 >= _ref$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$2.$array[_ref$2.$offset + _i$1]); + if (!$clone(cp.Project(axis$1), Projection).Overlapping($clone(other.Project(axis$1), Projection))) { + return Vector.nil; + } + overlap$1 = $clone(cp.Project(axis$1), Projection).Overlap($clone(other.Project(axis$1), Projection)); + if (smallest.Magnitude() > overlap$1) { + smallest = axis$1.Scale(overlap$1); + } + _i$1++; + } + } + (0 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 0] = (0 >= smallest.$length ? ($throwRuntimeError("index out of range"), undefined) : smallest.$array[smallest.$offset + 0])); + (1 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 1] = (1 >= smallest.$length ? ($throwRuntimeError("index out of range"), undefined) : smallest.$array[smallest.$offset + 1])); + return delta; + }; + ConvexPolygon.prototype.calculateMTV = function(contactSet, otherShape) { return this.$val.calculateMTV(contactSet, otherShape); }; + ConvexPolygon.ptr.prototype.ContainedBy = function(otherShape) { + var _i, _i$1, _ref, _ref$1, _ref$2, axis, axis$1, cp, other, otherShape; + cp = this; + _ref = otherShape; + if ($assertType(_ref, ptrType$5, true)[1]) { + other = _ref.$val; + _ref$1 = cp.SATAxes(); + _i = 0; + while (true) { + if (!(_i < _ref$1.$length)) { break; } + axis = ((_i < 0 || _i >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i]); + if (!$clone(cp.Project(axis), Projection).IsInside($clone(other.Project(axis), Projection))) { + return false; + } + _i++; + } + _ref$2 = other.SATAxes(); + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$2.$length)) { break; } + axis$1 = ((_i$1 < 0 || _i$1 >= _ref$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$2.$array[_ref$2.$offset + _i$1]); + if (!$clone(cp.Project(axis$1), Projection).IsInside($clone(other.Project(axis$1), Projection))) { + return false; + } + _i$1++; + } + } + return true; + }; + ConvexPolygon.prototype.ContainedBy = function(otherShape) { return this.$val.ContainedBy(otherShape); }; + ConvexPolygon.ptr.prototype.FlipH = function() { + var _i, _ref, cp, v; + cp = this; + _ref = cp.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + v = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0] = -(0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0])); + _i++; + } + cp.ReverseVertexOrder(); + }; + ConvexPolygon.prototype.FlipH = function() { return this.$val.FlipH(); }; + ConvexPolygon.ptr.prototype.FlipV = function() { + var _i, _ref, cp, v; + cp = this; + _ref = cp.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + v = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + (1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1] = -(1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1])); + _i++; + } + cp.ReverseVertexOrder(); + }; + ConvexPolygon.prototype.FlipV = function() { return this.$val.FlipV(); }; + ConvexPolygon.ptr.prototype.ReverseVertexOrder = function() { + var cp, i, verts, x, x$1; + cp = this; + verts = new sliceType$4([(x = cp.Points, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0]))]); + i = cp.Points.$length - 1 >> 0; + while (true) { + if (!(i >= 1)) { break; } + verts = $append(verts, (x$1 = cp.Points, ((i < 0 || i >= x$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + i]))); + i = i - (1) >> 0; + } + cp.Points = verts; + }; + ConvexPolygon.prototype.ReverseVertexOrder = function() { return this.$val.ReverseVertexOrder(); }; + NewRectangle = function(x, y, w, h) { + var h, w, x, y; + return NewConvexPolygon(new sliceType([x, y, x + w, y, x + w, y + h, x, y + h])); + }; + $pkg.NewRectangle = NewRectangle; + NewCircle = function(x, y, radius) { + var circle, radius, x, y; + circle = new Circle.ptr(x, y, radius); + return circle; + }; + $pkg.NewCircle = NewCircle; + Circle.ptr.prototype.Clone = function() { + var circle; + circle = this; + return NewCircle(circle.X, circle.Y, circle.Radius); + }; + Circle.prototype.Clone = function() { return this.$val.Clone(); }; + Circle.ptr.prototype.Bounds = function() { + var circle; + circle = this; + return [new Vector([circle.X - circle.Radius, circle.Y - circle.Radius]), new Vector([circle.X + circle.Radius, circle.Y + circle.Radius])]; + }; + Circle.prototype.Bounds = function() { return this.$val.Bounds(); }; + Circle.ptr.prototype.Intersection = function(dx, dy, other) { + var _i, _ref, _ref$1, circle, contactSet, dist, dx, dy, other, ox, oy, point, shape, shape$1, x, x$1, x$2, x$3; + circle = this; + contactSet = ptrType$6.nil; + ox = circle.X; + oy = circle.Y; + circle.X = circle.X + (dx); + circle.Y = circle.Y + (dy); + _ref = other; + if ($assertType(_ref, ptrType$5, true)[1]) { + shape = _ref.$val; + contactSet = shape.Intersection(-dx, -dy, circle); + if (!(contactSet === ptrType$6.nil)) { + contactSet.MTV = contactSet.MTV.Scale(-1); + } + } else if ($assertType(_ref, ptrType$4, true)[1]) { + shape$1 = _ref.$val; + contactSet = NewContactSet(); + contactSet.Points = circle.IntersectionPointsCircle(shape$1); + if (contactSet.Points.$length === 0) { + return ptrType$6.nil; + } + contactSet.MTV = new Vector([circle.X - shape$1.X, circle.Y - shape$1.Y]); + dist = contactSet.MTV.Magnitude(); + contactSet.MTV = contactSet.MTV.Unit().Scale(circle.Radius + shape$1.Radius - dist); + _ref$1 = contactSet.Points; + _i = 0; + while (true) { + if (!(_i < _ref$1.$length)) { break; } + point = ((_i < 0 || _i >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i]); + contactSet.Center = contactSet.Center.Add(new sliceType$4([point])); + _i++; + } + (x$1 = contactSet.Center, (0 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 0] = (x = contactSet.Center, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])) / ((contactSet.Points.$length)))); + (x$3 = contactSet.Center, (1 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 1] = (x$2 = contactSet.Center, (1 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 1])) / ((contactSet.Points.$length)))); + } + circle.X = ox; + circle.Y = oy; + return contactSet; + }; + Circle.prototype.Intersection = function(dx, dy, other) { return this.$val.Intersection(dx, dy, other); }; + Circle.ptr.prototype.Move = function(x, y) { + var circle, x, y; + circle = this; + circle.X = circle.X + (x); + circle.Y = circle.Y + (y); + }; + Circle.prototype.Move = function(x, y) { return this.$val.Move(x, y); }; + Circle.ptr.prototype.MoveVec = function(vec) { + var circle, vec; + circle = this; + circle.X = circle.X + (vec.X()); + circle.Y = circle.Y + (vec.Y()); + }; + Circle.prototype.MoveVec = function(vec) { return this.$val.MoveVec(vec); }; + Circle.ptr.prototype.SetPosition = function(x, y) { + var circle, x, y; + circle = this; + circle.X = x; + circle.Y = y; + }; + Circle.prototype.SetPosition = function(x, y) { return this.$val.SetPosition(x, y); }; + Circle.ptr.prototype.SetPositionVec = function(vec) { + var circle, vec; + circle = this; + circle.X = vec.X(); + circle.Y = vec.Y(); + }; + Circle.prototype.SetPositionVec = function(vec) { return this.$val.SetPositionVec(vec); }; + Circle.ptr.prototype.Position = function() { + var circle; + circle = this; + return [circle.X, circle.Y]; + }; + Circle.prototype.Position = function() { return this.$val.Position(); }; + Circle.ptr.prototype.PointInside = function(point) { + var circle, point; + circle = this; + return point.Sub(new sliceType$4([new Vector([circle.X, circle.Y])])).Magnitude() <= circle.Radius; + }; + Circle.prototype.PointInside = function(point) { return this.$val.PointInside(point); }; + Circle.ptr.prototype.IntersectionPointsCircle = function(other) { + var a, circle, d, h, other, x2, y2; + circle = this; + d = math.Sqrt(math.Pow(other.X - circle.X, 2) + math.Pow(other.Y - circle.Y, 2)); + if (d > circle.Radius + other.Radius || d < math.Abs(circle.Radius - other.Radius) || (d === 0) && (circle.Radius === other.Radius)) { + return sliceType$4.nil; + } + a = (math.Pow(circle.Radius, 2) - math.Pow(other.Radius, 2) + math.Pow(d, 2)) / (2 * d); + h = math.Sqrt(math.Pow(circle.Radius, 2) - math.Pow(a, 2)); + x2 = circle.X + a * (other.X - circle.X) / d; + y2 = circle.Y + a * (other.Y - circle.Y) / d; + return new sliceType$4([new Vector([x2 + h * (other.Y - circle.Y) / d, y2 - h * (other.X - circle.X) / d]), new Vector([x2 - h * (other.Y - circle.Y) / d, y2 + h * (other.X - circle.X) / d])]); + }; + Circle.prototype.IntersectionPointsCircle = function(other) { return this.$val.IntersectionPointsCircle(other); }; + Projection.ptr.prototype.Overlapping = function(other) { + var other, projection; + projection = this; + return $clone(projection, Projection).Overlap($clone(other, Projection)) > 0; + }; + Projection.prototype.Overlapping = function(other) { return this.$val.Overlapping(other); }; + Projection.ptr.prototype.Overlap = function(other) { + var other, projection; + projection = this; + return math.Min(projection.Max, other.Max) - math.Max(projection.Min, other.Min); + }; + Projection.prototype.Overlap = function(other) { return this.$val.Overlap(other); }; + Projection.ptr.prototype.IsInside = function(other) { + var other, projection; + projection = this; + return projection.Min >= other.Min && projection.Max <= other.Max; + }; + Projection.prototype.IsInside = function(other) { return this.$val.IsInside(other); }; + NewObject = function(x, y, w, h, tags) { + var h, o, tags, w, x, y; + o = new Object.ptr($ifaceNil, ptrType$1.nil, x, y, w, h, sliceType$1.nil, $ifaceNil, $makeMap(ptrType$2.keyFor, []), new sliceType$6([])); + if (tags.$length > 0) { + o.AddTags(tags); + } + return o; + }; + $pkg.NewObject = NewObject; + Object.ptr.prototype.Clone = function() { + var {_entry, _i, _keys, _r, _ref, k, newObj, obj, $s, $r, $c} = $restore(this, {}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + obj = this; + newObj = NewObject(obj.X, obj.Y, obj.W, obj.H, obj.Tags()); + newObj.Data = obj.Data; + /* */ if (!($interfaceIsEqual(obj.Shape, $ifaceNil))) { $s = 1; continue; } + /* */ $s = 2; continue; + /* if (!($interfaceIsEqual(obj.Shape, $ifaceNil))) { */ case 1: + _r = obj.Shape.Clone(); /* */ $s = 3; case 3: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + $r = newObj.SetShape(_r); /* */ $s = 4; case 4: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + /* } */ case 2: + _ref = obj.ignoreList; + _i = 0; + _keys = $keys(_ref); + while (true) { + if (!(_i < _keys.length)) { break; } + _entry = _ref[_keys[_i]]; + if (_entry === undefined) { + _i++; + continue; + } + k = _entry.k; + newObj.AddToIgnoreList(k); + _i++; + } + $s = -1; return newObj; + /* */ } return; } var $f = {$blk: Object.ptr.prototype.Clone, $c: true, $r, _entry, _i, _keys, _r, _ref, k, newObj, obj, $s};return $f; + }; + Object.prototype.Clone = function() { return this.$val.Clone(); }; + Object.ptr.prototype.Update = function() { + var {_tuple, c, cx, cy, ex, ey, obj, space, x, y, $s, $r, $c} = $restore(this, {}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + obj = this; + if (!(obj.Space === ptrType$1.nil)) { + space = obj.Space; + obj.Space.Remove(new sliceType$3([obj])); + obj.Space = space; + _tuple = obj.BoundsToSpace(0, 0); + cx = _tuple[0]; + cy = _tuple[1]; + ex = _tuple[2]; + ey = _tuple[3]; + y = cy; + while (true) { + if (!(y <= ey)) { break; } + x = cx; + while (true) { + if (!(x <= ex)) { break; } + c = obj.Space.Cell(x, y); + if (!(c === ptrType.nil)) { + c.register(obj); + obj.TouchingCells = $append(obj.TouchingCells, c); + } + x = x + (1) >> 0; + } + y = y + (1) >> 0; + } + } + /* */ if (!($interfaceIsEqual(obj.Shape, $ifaceNil))) { $s = 1; continue; } + /* */ $s = 2; continue; + /* if (!($interfaceIsEqual(obj.Shape, $ifaceNil))) { */ case 1: + $r = obj.Shape.SetPosition(obj.X, obj.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: Object.ptr.prototype.Update, $c: true, $r, _tuple, c, cx, cy, ex, ey, obj, space, x, y, $s};return $f; + }; + Object.prototype.Update = function() { return this.$val.Update(); }; + Object.ptr.prototype.AddTags = function(tags) { + var obj, tags; + obj = this; + obj.tags = $appendSlice(obj.tags, tags); + }; + Object.prototype.AddTags = function(tags) { return this.$val.AddTags(tags); }; + Object.ptr.prototype.RemoveTags = function(tags) { + var _i, _i$1, _ref, _ref$1, i, obj, t, tag, tags; + obj = this; + _ref = tags; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + tag = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + _ref$1 = obj.tags; + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$1.$length)) { break; } + i = _i$1; + t = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); + if (t === tag) { + obj.tags = $appendSlice($subslice(obj.tags, 0, i), $subslice(obj.tags, (i + 1 >> 0))); + break; + } + _i$1++; + } + _i++; + } + }; + Object.prototype.RemoveTags = function(tags) { return this.$val.RemoveTags(tags); }; + Object.ptr.prototype.HasTags = function(tags) { + var _i, _i$1, _ref, _ref$1, obj, t, tag, tags; + obj = this; + _ref = tags; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + tag = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + _ref$1 = obj.tags; + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$1.$length)) { break; } + t = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); + if (t === tag) { + return true; + } + _i$1++; + } + _i++; + } + return false; + }; + Object.prototype.HasTags = function(tags) { return this.$val.HasTags(tags); }; + Object.ptr.prototype.Tags = function() { + var obj; + obj = this; + return $appendSlice(new sliceType$6([]), obj.tags); + }; + Object.prototype.Tags = function() { return this.$val.Tags(); }; + Object.ptr.prototype.SetShape = function(shape) { + var {obj, shape, $s, $r, $c} = $restore(this, {shape}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + obj = this; + /* */ if (!($interfaceIsEqual(obj.Shape, shape))) { $s = 1; continue; } + /* */ $s = 2; continue; + /* if (!($interfaceIsEqual(obj.Shape, shape))) { */ case 1: + obj.Shape = shape; + $r = obj.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: Object.ptr.prototype.SetShape, $c: true, $r, obj, shape, $s};return $f; + }; + Object.prototype.SetShape = function(shape) { return this.$val.SetShape(shape); }; + Object.ptr.prototype.BoundsToSpace = function(dx, dy) { + var _tuple, _tuple$1, cx, cy, dx, dy, ex, ey, obj; + obj = this; + _tuple = obj.Space.WorldToSpace(obj.X + dx, obj.Y + dy); + cx = _tuple[0]; + cy = _tuple[1]; + _tuple$1 = obj.Space.WorldToSpace(obj.X + obj.W + dx - 1, obj.Y + obj.H + dy - 1); + ex = _tuple$1[0]; + ey = _tuple$1[1]; + return [cx, cy, ex, ey]; + }; + Object.prototype.BoundsToSpace = function(dx, dy) { return this.$val.BoundsToSpace(dx, dy); }; + Object.ptr.prototype.SharesCells = function(other) { + var _i, _ref, cell, obj, other; + obj = this; + _ref = obj.TouchingCells; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + cell = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (cell.Contains(other)) { + return true; + } + _i++; + } + return false; + }; + Object.prototype.SharesCells = function(other) { return this.$val.SharesCells(other); }; + Object.ptr.prototype.SharesCellsTags = function(tags) { + var _i, _ref, cell, obj, tags; + obj = this; + _ref = obj.TouchingCells; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + cell = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (cell.ContainsTags(tags)) { + return true; + } + _i++; + } + return false; + }; + Object.prototype.SharesCellsTags = function(tags) { return this.$val.SharesCellsTags(tags); }; + Object.ptr.prototype.Center = function() { + var obj; + obj = this; + return [obj.X + (obj.W / 2), obj.Y + (obj.H / 2)]; + }; + Object.prototype.Center = function() { return this.$val.Center(); }; + Object.ptr.prototype.SetCenter = function(x, y) { + var obj, x, y; + obj = this; + obj.X = x - (obj.W / 2); + obj.Y = y - (obj.H / 2); + }; + Object.prototype.SetCenter = function(x, y) { return this.$val.SetCenter(x, y); }; + Object.ptr.prototype.CellPosition = function() { + var _tuple, obj; + obj = this; + _tuple = obj.Center(); + return obj.Space.WorldToSpace(_tuple[0], _tuple[1]); + }; + Object.prototype.CellPosition = function() { return this.$val.CellPosition(); }; + Object.ptr.prototype.SetRight = function(x) { + var obj, x; + obj = this; + obj.X = x - obj.W; + }; + Object.prototype.SetRight = function(x) { return this.$val.SetRight(x); }; + Object.ptr.prototype.SetBottom = function(y) { + var obj, y; + obj = this; + obj.Y = y - obj.H; + }; + Object.prototype.SetBottom = function(y) { return this.$val.SetBottom(y); }; + Object.ptr.prototype.Bottom = function() { + var obj; + obj = this; + return obj.Y + obj.H; + }; + Object.prototype.Bottom = function() { return this.$val.Bottom(); }; + Object.ptr.prototype.Right = function() { + var obj; + obj = this; + return obj.X + obj.W; + }; + Object.prototype.Right = function() { return this.$val.Right(); }; + Object.ptr.prototype.SetBounds = function(topLeft, bottomRight) { + var bottomRight, obj, topLeft; + obj = this; + obj.X = (0 >= topLeft.$length ? ($throwRuntimeError("index out of range"), undefined) : topLeft.$array[topLeft.$offset + 0]); + obj.Y = (1 >= topLeft.$length ? ($throwRuntimeError("index out of range"), undefined) : topLeft.$array[topLeft.$offset + 1]); + obj.W = (0 >= bottomRight.$length ? ($throwRuntimeError("index out of range"), undefined) : bottomRight.$array[bottomRight.$offset + 0]) - obj.X; + obj.H = (1 >= bottomRight.$length ? ($throwRuntimeError("index out of range"), undefined) : bottomRight.$array[bottomRight.$offset + 1]) - obj.Y; + }; + Object.prototype.SetBounds = function(topLeft, bottomRight) { return this.$val.SetBounds(topLeft, bottomRight); }; + Object.ptr.prototype.Check = function(dx, dy, tags) { + var _entry, _entry$1, _entry$2, _i, _key, _key$1, _ref, _tuple, _tuple$1, _tuple$2, added, added$1, c, cc, cellsAdded, cx, cy, dx, dy, ex, ey, ignored, o, obj, objectsAdded, tags, x, y; + obj = this; + if (obj.Space === ptrType$1.nil) { + return ptrType$7.nil; + } + cc = NewCollision(); + cc.checkingObject = obj; + if (dx < 0) { + dx = math.Min(dx, -1); + } else if (dx > 0) { + dx = math.Max(dx, 1); + } + if (dy < 0) { + dy = math.Min(dy, -1); + } else if (dy > 0) { + dy = math.Max(dy, 1); + } + cc.dx = dx; + cc.dy = dy; + _tuple = obj.BoundsToSpace(dx, dy); + cx = _tuple[0]; + cy = _tuple[1]; + ex = _tuple[2]; + ey = _tuple[3]; + objectsAdded = $makeMap(ptrType$2.keyFor, []); + cellsAdded = $makeMap(ptrType.keyFor, []); + y = cy; + while (true) { + if (!(y <= ey)) { break; } + x = cx; + while (true) { + if (!(x <= ex)) { break; } + c = obj.Space.Cell(x, y); + if (!(c === ptrType.nil)) { + _ref = c.Objects; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + o = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + ignored = (_entry = obj.ignoreList[ptrType$2.keyFor(o)], _entry !== undefined ? _entry.v : false); + if (o === obj || ignored) { + _i++; + continue; + } + _tuple$1 = (_entry$1 = objectsAdded[ptrType$2.keyFor(o)], _entry$1 !== undefined ? [_entry$1.v, true] : [false, false]); + added = _tuple$1[1]; + if (((tags.$length === 0) || o.HasTags(tags)) && !added) { + cc.Objects = $append(cc.Objects, o); + _key = o; (objectsAdded || $throwRuntimeError("assignment to entry in nil map"))[ptrType$2.keyFor(_key)] = { k: _key, v: true }; + _tuple$2 = (_entry$2 = cellsAdded[ptrType.keyFor(c)], _entry$2 !== undefined ? [_entry$2.v, true] : [false, false]); + added$1 = _tuple$2[1]; + if (!added$1) { + cc.Cells = $append(cc.Cells, c); + _key$1 = c; (cellsAdded || $throwRuntimeError("assignment to entry in nil map"))[ptrType.keyFor(_key$1)] = { k: _key$1, v: true }; + } + _i++; + continue; + } + _i++; + } + } + x = x + (1) >> 0; + } + y = y + (1) >> 0; + } + if (cc.Objects.$length === 0) { + return ptrType$7.nil; + } + return cc; + }; + Object.prototype.Check = function(dx, dy, tags) { return this.$val.Check(dx, dy, tags); }; + Object.ptr.prototype.Overlaps = function(other) { + var obj, other; + obj = this; + return other.X <= obj.X + obj.W && other.X + other.W >= obj.X && other.Y <= obj.Y + obj.H && other.Y + other.H >= obj.Y; + }; + Object.prototype.Overlaps = function(other) { return this.$val.Overlaps(other); }; + Object.ptr.prototype.AddToIgnoreList = function(ignoreObj) { + var _key, ignoreObj, obj; + obj = this; + _key = ignoreObj; (obj.ignoreList || $throwRuntimeError("assignment to entry in nil map"))[ptrType$2.keyFor(_key)] = { k: _key, v: true }; + }; + Object.prototype.AddToIgnoreList = function(ignoreObj) { return this.$val.AddToIgnoreList(ignoreObj); }; + Object.ptr.prototype.RemoveFromIgnoreList = function(ignoreObj) { + var ignoreObj, obj; + obj = this; + delete obj.ignoreList[ptrType$2.keyFor(ignoreObj)]; + }; + Object.prototype.RemoveFromIgnoreList = function(ignoreObj) { return this.$val.RemoveFromIgnoreList(ignoreObj); }; + axpyUnitaryTo = function(dst, alpha, x, y) { + var _i, _ref, alpha, dim, dst, i, v, x, y; + dim = y.$length; + _ref = x; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + i = _i; + v = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (i === dim) { + return; + } + ((i < 0 || i >= dst.$length) ? ($throwRuntimeError("index out of range"), undefined) : dst.$array[dst.$offset + i] = alpha * v + ((i < 0 || i >= y.$length) ? ($throwRuntimeError("index out of range"), undefined) : y.$array[y.$offset + i])); + _i++; + } + }; + scalUnitaryTo = function(dst, alpha, x) { + var _i, _ref, alpha, dst, i, x; + _ref = x; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + i = _i; + ((i < 0 || i >= dst.$length) ? ($throwRuntimeError("index out of range"), undefined) : dst.$array[dst.$offset + i] = ((i < 0 || i >= dst.$length) ? ($throwRuntimeError("index out of range"), undefined) : dst.$array[dst.$offset + i]) * (alpha)); + _i++; + } + }; + NewCollision = function() { + return new Collision.ptr(ptrType$2.nil, 0, 0, new sliceType$3([]), sliceType$1.nil); + }; + $pkg.NewCollision = NewCollision; + Collision.ptr.prototype.HasTags = function(tags) { + var _i, _ref, cc, o, tags; + cc = this; + _ref = cc.Objects; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + o = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (o === cc.checkingObject) { + _i++; + continue; + } + if (o.HasTags(tags)) { + return true; + } + _i++; + } + return false; + }; + Collision.prototype.HasTags = function(tags) { return this.$val.HasTags(tags); }; + Collision.ptr.prototype.ObjectsByTags = function(tags) { + var _i, _ref, cc, o, objects, tags; + cc = this; + objects = new sliceType$3([]); + _ref = cc.Objects; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + o = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (o === cc.checkingObject) { + _i++; + continue; + } + if (o.HasTags(tags)) { + objects = $append(objects, o); + } + _i++; + } + return objects; + }; + Collision.prototype.ObjectsByTags = function(tags) { return this.$val.ObjectsByTags(tags); }; + Collision.ptr.prototype.ContactWithObject = function(object) { + var cc, delta, object; + cc = this; + delta = new Vector([0, 0]); + if (cc.dx < 0) { + (0 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 0] = object.X + object.W - cc.checkingObject.X); + } else if (cc.dx > 0) { + (0 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 0] = object.X - cc.checkingObject.W - cc.checkingObject.X); + } + if (cc.dy < 0) { + (1 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 1] = object.Y + object.H - cc.checkingObject.Y); + } else if (cc.dy > 0) { + (1 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 1] = object.Y - cc.checkingObject.H - cc.checkingObject.Y); + } + return delta; + }; + Collision.prototype.ContactWithObject = function(object) { return this.$val.ContactWithObject(object); }; + Collision.ptr.prototype.ContactWithCell = function(cell) { + var cc, cell, cx, cy, delta; + cc = this; + delta = new Vector([0, 0]); + cx = (($imul(cell.X, cc.checkingObject.Space.CellWidth))); + cy = (($imul(cell.Y, cc.checkingObject.Space.CellHeight))); + if (cc.dx < 0) { + (0 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 0] = cx + (cc.checkingObject.Space.CellWidth) - cc.checkingObject.X); + } else if (cc.dx > 0) { + (0 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 0] = cx - cc.checkingObject.W - cc.checkingObject.X); + } + if (cc.dy < 0) { + (1 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 1] = cy + (cc.checkingObject.Space.CellHeight) - cc.checkingObject.Y); + } else if (cc.dy > 0) { + (1 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 1] = cy - cc.checkingObject.H - cc.checkingObject.Y); + } + return delta; + }; + Collision.prototype.ContactWithCell = function(cell) { return this.$val.ContactWithCell(cell); }; + Collision.ptr.prototype.SlideAgainstCell = function(cell, avoidTags) { + var _tuple, _tuple$1, avoidTags, cc, ccX, ccY, cell, collidingCell, diffX, diffY, down, hX, hY, left, oX, oY, right, slide, sp, up, x; + cc = this; + sp = cc.checkingObject.Space; + collidingCell = (x = cc.Cells, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])); + _tuple = sp.SpaceToWorld(collidingCell.X, collidingCell.Y); + ccX = _tuple[0]; + ccY = _tuple[1]; + hX = (sp.CellWidth) / 2; + hY = (sp.CellHeight) / 2; + ccX = ccX + (hX); + ccY = ccY + (hY); + _tuple$1 = cc.checkingObject.Center(); + oX = _tuple$1[0]; + oY = _tuple$1[1]; + diffX = oX - ccX; + diffY = oY - ccY; + left = sp.Cell(collidingCell.X - 1 >> 0, collidingCell.Y); + right = sp.Cell(collidingCell.X + 1 >> 0, collidingCell.Y); + up = sp.Cell(collidingCell.X, collidingCell.Y - 1 >> 0); + down = sp.Cell(collidingCell.X, collidingCell.Y + 1 >> 0); + slide = new Vector([0, 0]); + if (!((cc.dy === 0))) { + if (diffX > 0 && (right === ptrType.nil || !right.ContainsTags(avoidTags))) { + (0 >= slide.$length ? ($throwRuntimeError("index out of range"), undefined) : slide.$array[slide.$offset + 0] = ccX + hX - cc.checkingObject.X); + } else if (diffX < 0 && (left === ptrType.nil || !left.ContainsTags(avoidTags))) { + (0 >= slide.$length ? ($throwRuntimeError("index out of range"), undefined) : slide.$array[slide.$offset + 0] = ccX - hX - (cc.checkingObject.X + cc.checkingObject.W)); + } else { + return Vector.nil; + } + } + if (!((cc.dx === 0))) { + if (diffY > 0 && (down === ptrType.nil || !down.ContainsTags(avoidTags))) { + (1 >= slide.$length ? ($throwRuntimeError("index out of range"), undefined) : slide.$array[slide.$offset + 1] = ccY + hY - cc.checkingObject.Y); + } else if (diffY < 0 && (up === ptrType.nil || !up.ContainsTags(avoidTags))) { + (1 >= slide.$length ? ($throwRuntimeError("index out of range"), undefined) : slide.$array[slide.$offset + 1] = ccY - hY - (cc.checkingObject.Y + cc.checkingObject.H)); + } else { + return Vector.nil; + } + } + return slide; + }; + Collision.prototype.SlideAgainstCell = function(cell, avoidTags) { return this.$val.SlideAgainstCell(cell, avoidTags); }; + newCell = function(x, y) { + var x, y; + return new Cell.ptr(x, y, new sliceType$3([])); + }; + Cell.ptr.prototype.register = function(obj) { + var cell, obj; + cell = this; + if (!cell.Contains(obj)) { + cell.Objects = $append(cell.Objects, obj); + } + }; + Cell.prototype.register = function(obj) { return this.$val.register(obj); }; + Cell.ptr.prototype.unregister = function(obj) { + var _i, _ref, cell, i, o, obj, x, x$1, x$2; + cell = this; + _ref = cell.Objects; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + i = _i; + o = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (o === obj) { + (x$2 = cell.Objects, ((i < 0 || i >= x$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + i] = (x = cell.Objects, x$1 = cell.Objects.$length - 1 >> 0, ((x$1 < 0 || x$1 >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + x$1])))); + cell.Objects = $subslice(cell.Objects, 0, (cell.Objects.$length - 1 >> 0)); + break; + } + _i++; + } + }; + Cell.prototype.unregister = function(obj) { return this.$val.unregister(obj); }; + Cell.ptr.prototype.Contains = function(obj) { + var _i, _ref, cell, o, obj; + cell = this; + _ref = cell.Objects; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + o = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (o === obj) { + return true; + } + _i++; + } + return false; + }; + Cell.prototype.Contains = function(obj) { return this.$val.Contains(obj); }; + Cell.ptr.prototype.ContainsTags = function(tags) { + var _i, _ref, cell, o, tags; + cell = this; + _ref = cell.Objects; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + o = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (o.HasTags(tags)) { + return true; + } + _i++; + } + return false; + }; + Cell.prototype.ContainsTags = function(tags) { return this.$val.ContainsTags(tags); }; + Cell.ptr.prototype.Occupied = function() { + var cell; + cell = this; + return cell.Objects.$length > 0; + }; + Cell.prototype.Occupied = function() { return this.$val.Occupied(); }; + Vector.methods = [{prop: "Clone", name: "Clone", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "Add", name: "Add", pkg: "", typ: $funcType([sliceType$4], [Vector], true)}, {prop: "Sub", name: "Sub", pkg: "", typ: $funcType([sliceType$4], [Vector], true)}, {prop: "Scale", name: "Scale", pkg: "", typ: $funcType([$Float64], [Vector], false)}, {prop: "Equal", name: "Equal", pkg: "", typ: $funcType([Vector], [$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([], [Vector], false)}, {prop: "Dot", name: "Dot", pkg: "", typ: $funcType([Vector], [$Float64], false)}, {prop: "Cross", name: "Cross", pkg: "", typ: $funcType([Vector], [Vector], false)}, {prop: "Rotate", name: "Rotate", pkg: "", typ: $funcType([$Float64, sliceType$7], [Vector], 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)}]; + ptrType$1.methods = [{prop: "Add", name: "Add", pkg: "", typ: $funcType([sliceType$3], [], true)}, {prop: "Remove", name: "Remove", pkg: "", typ: $funcType([sliceType$3], [], true)}, {prop: "Objects", name: "Objects", pkg: "", typ: $funcType([], [sliceType$3], false)}, {prop: "Resize", name: "Resize", pkg: "", typ: $funcType([$Int, $Int], [], false)}, {prop: "Cell", name: "Cell", pkg: "", typ: $funcType([$Int, $Int], [ptrType], false)}, {prop: "CheckCells", name: "CheckCells", pkg: "", typ: $funcType([$Int, $Int, $Int, $Int, sliceType$6], [ptrType$2], true)}, {prop: "CheckCellsWorld", name: "CheckCellsWorld", pkg: "", typ: $funcType([$Float64, $Float64, $Float64, $Float64, sliceType$6], [ptrType$2], 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], [sliceType$1], false)}]; + ptrType$3.methods = [{prop: "Project", name: "Project", pkg: "", typ: $funcType([Vector], [Vector], false)}, {prop: "Normal", name: "Normal", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "Vector", name: "Vector", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "IntersectionPointsLine", name: "IntersectionPointsLine", pkg: "", typ: $funcType([ptrType$3], [Vector], false)}, {prop: "IntersectionPointsCircle", name: "IntersectionPointsCircle", pkg: "", typ: $funcType([ptrType$4], [sliceType$4], false)}]; + ptrType$5.methods = [{prop: "Clone", name: "Clone", pkg: "", typ: $funcType([], [Shape], false)}, {prop: "AddPointsVec", name: "AddPointsVec", pkg: "", typ: $funcType([sliceType$4], [], true)}, {prop: "AddPoints", name: "AddPoints", pkg: "", typ: $funcType([sliceType], [], true)}, {prop: "Lines", name: "Lines", pkg: "", typ: $funcType([], [sliceType$5], false)}, {prop: "Transformed", name: "Transformed", pkg: "", typ: $funcType([], [sliceType$4], false)}, {prop: "Bounds", name: "Bounds", pkg: "", typ: $funcType([], [Vector, Vector], 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([Vector], [], false)}, {prop: "Move", name: "Move", pkg: "", typ: $funcType([$Float64, $Float64], [], false)}, {prop: "MoveVec", name: "MoveVec", pkg: "", typ: $funcType([Vector], [], false)}, {prop: "Center", name: "Center", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "Project", name: "Project", pkg: "", typ: $funcType([Vector], [Projection], false)}, {prop: "SATAxes", name: "SATAxes", pkg: "", typ: $funcType([], [sliceType$4], false)}, {prop: "PointInside", name: "PointInside", pkg: "", typ: $funcType([Vector], [$Bool], false)}, {prop: "Intersection", name: "Intersection", pkg: "", typ: $funcType([$Float64, $Float64, Shape], [ptrType$6], false)}, {prop: "calculateMTV", name: "calculateMTV", pkg: "resolv", typ: $funcType([ptrType$6, Shape], [Vector], false)}, {prop: "ContainedBy", name: "ContainedBy", pkg: "", typ: $funcType([Shape], [$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)}]; + ptrType$6.methods = [{prop: "LeftmostPoint", name: "LeftmostPoint", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "RightmostPoint", name: "RightmostPoint", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "TopmostPoint", name: "TopmostPoint", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "BottommostPoint", name: "BottommostPoint", pkg: "", typ: $funcType([], [Vector], false)}]; + ptrType$4.methods = [{prop: "Clone", name: "Clone", pkg: "", typ: $funcType([], [Shape], false)}, {prop: "Bounds", name: "Bounds", pkg: "", typ: $funcType([], [Vector, Vector], false)}, {prop: "Intersection", name: "Intersection", pkg: "", typ: $funcType([$Float64, $Float64, Shape], [ptrType$6], false)}, {prop: "Move", name: "Move", pkg: "", typ: $funcType([$Float64, $Float64], [], false)}, {prop: "MoveVec", name: "MoveVec", pkg: "", typ: $funcType([Vector], [], false)}, {prop: "SetPosition", name: "SetPosition", pkg: "", typ: $funcType([$Float64, $Float64], [], false)}, {prop: "SetPositionVec", name: "SetPositionVec", pkg: "", typ: $funcType([Vector], [], false)}, {prop: "Position", name: "Position", pkg: "", typ: $funcType([], [$Float64, $Float64], false)}, {prop: "PointInside", name: "PointInside", pkg: "", typ: $funcType([Vector], [$Bool], false)}, {prop: "IntersectionPointsCircle", name: "IntersectionPointsCircle", pkg: "", typ: $funcType([ptrType$4], [sliceType$4], false)}]; + Projection.methods = [{prop: "Overlapping", name: "Overlapping", pkg: "", typ: $funcType([Projection], [$Bool], false)}, {prop: "Overlap", name: "Overlap", pkg: "", typ: $funcType([Projection], [$Float64], false)}, {prop: "IsInside", name: "IsInside", pkg: "", typ: $funcType([Projection], [$Bool], false)}]; + ptrType$2.methods = [{prop: "Clone", name: "Clone", pkg: "", typ: $funcType([], [ptrType$2], false)}, {prop: "Update", name: "Update", pkg: "", typ: $funcType([], [], false)}, {prop: "AddTags", name: "AddTags", pkg: "", typ: $funcType([sliceType$6], [], true)}, {prop: "RemoveTags", name: "RemoveTags", pkg: "", typ: $funcType([sliceType$6], [], true)}, {prop: "HasTags", name: "HasTags", pkg: "", typ: $funcType([sliceType$6], [$Bool], true)}, {prop: "Tags", name: "Tags", pkg: "", typ: $funcType([], [sliceType$6], false)}, {prop: "SetShape", name: "SetShape", pkg: "", typ: $funcType([Shape], [], false)}, {prop: "BoundsToSpace", name: "BoundsToSpace", pkg: "", typ: $funcType([$Float64, $Float64], [$Int, $Int, $Int, $Int], false)}, {prop: "SharesCells", name: "SharesCells", pkg: "", typ: $funcType([ptrType$2], [$Bool], false)}, {prop: "SharesCellsTags", name: "SharesCellsTags", pkg: "", typ: $funcType([sliceType$6], [$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([Vector, Vector], [], false)}, {prop: "Check", name: "Check", pkg: "", typ: $funcType([$Float64, $Float64, sliceType$6], [ptrType$7], true)}, {prop: "Overlaps", name: "Overlaps", pkg: "", typ: $funcType([ptrType$2], [$Bool], false)}, {prop: "AddToIgnoreList", name: "AddToIgnoreList", pkg: "", typ: $funcType([ptrType$2], [], false)}, {prop: "RemoveFromIgnoreList", name: "RemoveFromIgnoreList", pkg: "", typ: $funcType([ptrType$2], [], false)}]; + ptrType$7.methods = [{prop: "HasTags", name: "HasTags", pkg: "", typ: $funcType([sliceType$6], [$Bool], true)}, {prop: "ObjectsByTags", name: "ObjectsByTags", pkg: "", typ: $funcType([sliceType$6], [sliceType$3], true)}, {prop: "ContactWithObject", name: "ContactWithObject", pkg: "", typ: $funcType([ptrType$2], [Vector], false)}, {prop: "ContactWithCell", name: "ContactWithCell", pkg: "", typ: $funcType([ptrType], [Vector], false)}, {prop: "SlideAgainstCell", name: "SlideAgainstCell", pkg: "", typ: $funcType([ptrType, sliceType$6], [Vector], true)}]; + ptrType.methods = [{prop: "register", name: "register", pkg: "resolv", typ: $funcType([ptrType$2], [], false)}, {prop: "unregister", name: "unregister", pkg: "resolv", typ: $funcType([ptrType$2], [], false)}, {prop: "Contains", name: "Contains", pkg: "", typ: $funcType([ptrType$2], [$Bool], false)}, {prop: "ContainsTags", name: "ContainsTags", pkg: "", typ: $funcType([sliceType$6], [$Bool], true)}, {prop: "Occupied", name: "Occupied", pkg: "", typ: $funcType([], [$Bool], false)}]; + Vector.init($Float64); + Space.init("", [{prop: "Cells", name: "Cells", embedded: false, exported: true, typ: sliceType$2, tag: ""}, {prop: "CellWidth", name: "CellWidth", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "CellHeight", name: "CellHeight", embedded: false, exported: true, typ: $Int, tag: ""}]); + Shape.init([{prop: "Bounds", name: "Bounds", pkg: "", typ: $funcType([], [Vector, Vector], false)}, {prop: "Clone", name: "Clone", pkg: "", typ: $funcType([], [Shape], false)}, {prop: "Intersection", name: "Intersection", pkg: "", typ: $funcType([$Float64, $Float64, Shape], [ptrType$6], false)}, {prop: "Position", name: "Position", pkg: "", typ: $funcType([], [$Float64, $Float64], false)}, {prop: "SetPosition", name: "SetPosition", pkg: "", typ: $funcType([$Float64, $Float64], [], false)}]); + Line.init("", [{prop: "Start", name: "Start", embedded: false, exported: true, typ: Vector, tag: ""}, {prop: "End", name: "End", embedded: false, exported: true, typ: Vector, tag: ""}]); + ConvexPolygon.init("", [{prop: "Points", name: "Points", embedded: false, exported: true, typ: sliceType$4, 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: ""}]); + ContactSet.init("", [{prop: "Points", name: "Points", embedded: false, exported: true, typ: sliceType$4, tag: ""}, {prop: "MTV", name: "MTV", embedded: false, exported: true, typ: Vector, tag: ""}, {prop: "Center", name: "Center", embedded: false, exported: true, typ: Vector, tag: ""}]); + Circle.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: ""}]); + Projection.init("", [{prop: "Min", name: "Min", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "Max", name: "Max", embedded: false, exported: true, typ: $Float64, tag: ""}]); + Object.init("resolv", [{prop: "Shape", name: "Shape", embedded: false, exported: true, typ: Shape, tag: ""}, {prop: "Space", name: "Space", embedded: false, exported: true, typ: ptrType$1, 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: sliceType$1, tag: ""}, {prop: "Data", name: "Data", embedded: false, exported: true, typ: $emptyInterface, tag: ""}, {prop: "ignoreList", name: "ignoreList", embedded: false, exported: false, typ: mapType, tag: ""}, {prop: "tags", name: "tags", embedded: false, exported: false, typ: sliceType$6, tag: ""}]); + Collision.init("resolv", [{prop: "checkingObject", name: "checkingObject", embedded: false, exported: false, typ: ptrType$2, 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: sliceType$3, tag: ""}, {prop: "Cells", name: "Cells", embedded: false, exported: true, typ: sliceType$1, tag: ""}]); + Cell.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: sliceType$3, 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 = math.$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, math, resolv, Vec2D, Polygon2D, PlayerDownsync, InputFrameDecoded, Barrier, Bullet, MeleeBullet, FireballBullet, RoomDownsyncFrame, InputFrameDownsync, CharacterConfig, RingBuffer, SatResult, sliceType, sliceType$1, sliceType$2, ptrType, sliceType$3, sliceType$4, ptrType$1, ptrType$2, ptrType$3, ptrType$4, ptrType$5, ptrType$6, sliceType$5, sliceType$6, sliceType$7, sliceType$8, sliceType$9, ptrType$7, sliceType$10, ptrType$8, sliceType$11, sliceType$12, ptrType$9, sliceType$13, ptrType$10, mapType, ptrType$11, skillIdToBullet, inAirSet, NewRingBuffer, ConvertToInputFrameId, decodeInput, CalcPushbacks, isPolygonPairOverlapped, isPolygonPairSeparatedByDir, WorldToVirtualGridPos, VirtualGridToWorldPos, WorldToPolygonColliderBLPos, PolygonColliderBLToWorldPos, PolygonColliderBLToVirtualGridPos, VirtualGridToPolygonColliderBLPos, calcHardPushbacksNorms, deriveOpPattern, ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame, GenerateRectCollider, generateRectColliderInCollisionSpace, GenerateConvexPolygonCollider, AlignPolygon2DToBoundingBox; + math = $packages["math"]; + resolv = $packages["resolv"]; + Vec2D = $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_; + }); + Polygon2D = $pkg.Polygon2D = $newType(0, $kindStruct, "battle.Polygon2D", true, "jsexport/battle", true, function(Anchor_, Points_) { + this.$val = this; + if (arguments.length === 0) { + this.Anchor = ptrType$9.nil; + this.Points = sliceType$13.nil; + return; + } + this.Anchor = Anchor_; + this.Points = Points_; + }); + PlayerDownsync = $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_) { + 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; + 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_; + }); + InputFrameDecoded = $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_; + }); + Barrier = $pkg.Barrier = $newType(0, $kindStruct, "battle.Barrier", true, "jsexport/battle", true, function(Boundary_) { + this.$val = this; + if (arguments.length === 0) { + this.Boundary = ptrType$10.nil; + return; + } + this.Boundary = Boundary_; + }); + Bullet = $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_, BlowUpVelY_) { + 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; + this.BlowUpVelY = 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_; + this.BlowUpVelY = BlowUpVelY_; + }); + MeleeBullet = $pkg.MeleeBullet = $newType(0, $kindStruct, "battle.MeleeBullet", true, "jsexport/battle", true, function(Bullet_) { + this.$val = this; + if (arguments.length === 0) { + this.Bullet = new Bullet.ptr(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + return; + } + this.Bullet = Bullet_; + }); + FireballBullet = $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 Bullet.ptr(0, 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_; + }); + RoomDownsyncFrame = $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 = sliceType$6.nil; + this.CountdownNanos = new $Int64(0, 0); + this.MeleeBullets = sliceType$7.nil; + this.FireballBullets = sliceType$11.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_; + }); + InputFrameDownsync = $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 = sliceType$5.nil; + this.ConfirmedList = new $Uint64(0, 0); + return; + } + this.InputFrameId = InputFrameId_; + this.InputList = InputList_; + this.ConfirmedList = ConfirmedList_; + }); + CharacterConfig = $pkg.CharacterConfig = $newType(0, $kindStruct, "battle.CharacterConfig", true, "jsexport/battle", true, function(SpeciesId_, SpeciesName_, InAirIdleFrameIdxTurningPoint_, InAirIdleFrameIdxTurnedCycle_, LayDownFrames_, LayDownFramesToRecover_, GetUpFrames_, GetUpFramesToRecover_, JumpingInitVelY_, PatternIdToSkillId_) { + 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.GetUpFrames = 0; + this.GetUpFramesToRecover = 0; + this.JumpingInitVelY = 0; + this.PatternIdToSkillId = false; + return; + } + this.SpeciesId = SpeciesId_; + this.SpeciesName = SpeciesName_; + this.InAirIdleFrameIdxTurningPoint = InAirIdleFrameIdxTurningPoint_; + this.InAirIdleFrameIdxTurnedCycle = InAirIdleFrameIdxTurnedCycle_; + this.LayDownFrames = LayDownFrames_; + this.LayDownFramesToRecover = LayDownFramesToRecover_; + this.GetUpFrames = GetUpFrames_; + this.GetUpFramesToRecover = GetUpFramesToRecover_; + this.JumpingInitVelY = JumpingInitVelY_; + this.PatternIdToSkillId = PatternIdToSkillId_; + }); + RingBuffer = $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 = sliceType$2.nil; + return; + } + this.Ed = Ed_; + this.St = St_; + this.EdFrameId = EdFrameId_; + this.StFrameId = StFrameId_; + this.N = N_; + this.Cnt = Cnt_; + this.Eles = Eles_; + }); + SatResult = $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 = resolv.Vector.nil; + return; + } + this.Overlap = Overlap_; + this.OverlapX = OverlapX_; + this.OverlapY = OverlapY_; + this.AContainedInB = AContainedInB_; + this.BContainedInA = BContainedInA_; + this.Axis = Axis_; + }); + sliceType = $sliceType($Int32); + sliceType$1 = $sliceType(sliceType); + sliceType$2 = $sliceType($emptyInterface); + ptrType = $ptrType(SatResult); + sliceType$3 = $sliceType(Vec2D); + sliceType$4 = $sliceType($String); + ptrType$1 = $ptrType(resolv.Collision); + ptrType$2 = $ptrType(sliceType$3); + ptrType$3 = $ptrType(PlayerDownsync); + ptrType$4 = $ptrType(MeleeBullet); + ptrType$5 = $ptrType(resolv.ConvexPolygon); + ptrType$6 = $ptrType(InputFrameDownsync); + sliceType$5 = $sliceType($Uint64); + sliceType$6 = $sliceType(ptrType$3); + sliceType$7 = $sliceType(ptrType$4); + sliceType$8 = $sliceType(ptrType$2); + sliceType$9 = $sliceType($Bool); + ptrType$7 = $ptrType(resolv.Object); + sliceType$10 = $sliceType(ptrType$7); + ptrType$8 = $ptrType(FireballBullet); + sliceType$11 = $sliceType(ptrType$8); + sliceType$12 = $sliceType($Float64); + ptrType$9 = $ptrType(Vec2D); + sliceType$13 = $sliceType(ptrType$9); + ptrType$10 = $ptrType(Polygon2D); + mapType = $mapType($Int, $Int); + ptrType$11 = $ptrType(RingBuffer); + NewRingBuffer = function(n) { + var n; + return new RingBuffer.ptr(0, 0, 0, 0, n, 0, $makeSlice(sliceType$2, n)); + }; + $pkg.NewRingBuffer = NewRingBuffer; + RingBuffer.ptr.prototype.Put = function(pItem) { + var pItem, rb, x, x$1; + rb = this; + while (true) { + if (!(0 < rb.Cnt && rb.Cnt >= rb.N)) { break; } + rb.Pop(); + } + (x = rb.Eles, x$1 = rb.Ed, ((x$1 < 0 || x$1 >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + x$1] = pItem)); + rb.EdFrameId = rb.EdFrameId + (1) >> 0; + rb.Cnt = rb.Cnt + (1) >> 0; + rb.Ed = rb.Ed + (1) >> 0; + if (rb.Ed >= rb.N) { + rb.Ed = rb.Ed - (rb.N) >> 0; + } + }; + RingBuffer.prototype.Put = function(pItem) { return this.$val.Put(pItem); }; + RingBuffer.ptr.prototype.Pop = function() { + var pItem, rb, x, x$1; + rb = this; + if (0 === rb.Cnt) { + return $ifaceNil; + } + pItem = (x = rb.Eles, x$1 = rb.St, ((x$1 < 0 || x$1 >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + x$1])); + rb.StFrameId = rb.StFrameId + (1) >> 0; + rb.Cnt = rb.Cnt - (1) >> 0; + rb.St = rb.St + (1) >> 0; + if (rb.St >= rb.N) { + rb.St = rb.St - (rb.N) >> 0; + } + return pItem; + }; + RingBuffer.prototype.Pop = function() { return this.$val.Pop(); }; + RingBuffer.ptr.prototype.GetArrIdxByOffset = function(offsetFromSt) { + var arrIdx, offsetFromSt, rb; + rb = this; + if ((0 === rb.Cnt) || 0 > offsetFromSt) { + return -1; + } + arrIdx = rb.St + offsetFromSt >> 0; + if (rb.St < rb.Ed) { + if (rb.St <= arrIdx && arrIdx < rb.Ed) { + return arrIdx; + } + } else { + if (arrIdx >= rb.N) { + arrIdx = arrIdx - (rb.N) >> 0; + } + if (arrIdx >= rb.St || arrIdx < rb.Ed) { + return arrIdx; + } + } + return -1; + }; + RingBuffer.prototype.GetArrIdxByOffset = function(offsetFromSt) { return this.$val.GetArrIdxByOffset(offsetFromSt); }; + RingBuffer.ptr.prototype.GetByOffset = function(offsetFromSt) { + var arrIdx, offsetFromSt, rb, x; + rb = this; + arrIdx = rb.GetArrIdxByOffset(offsetFromSt); + if (-1 === arrIdx) { + return $ifaceNil; + } + return (x = rb.Eles, ((arrIdx < 0 || arrIdx >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + arrIdx])); + }; + RingBuffer.prototype.GetByOffset = function(offsetFromSt) { return this.$val.GetByOffset(offsetFromSt); }; + RingBuffer.ptr.prototype.GetByFrameId = function(frameId) { + var frameId, rb; + rb = this; + if (frameId >= rb.EdFrameId || frameId < rb.StFrameId) { + return $ifaceNil; + } + return rb.GetByOffset(frameId - rb.StFrameId >> 0); + }; + RingBuffer.prototype.GetByFrameId = function(frameId) { return this.$val.GetByFrameId(frameId); }; + RingBuffer.ptr.prototype.SetByFrameId = function(pItem, frameId) { + var _tmp, _tmp$1, _tmp$2, _tmp$3, _tmp$4, _tmp$5, arrIdx, frameId, oldEdFrameId, oldStFrameId, pItem, rb, ret, x; + rb = this; + _tmp = rb.StFrameId; + _tmp$1 = rb.EdFrameId; + oldStFrameId = _tmp; + oldEdFrameId = _tmp$1; + if (frameId < oldStFrameId) { + return [2, oldStFrameId, oldEdFrameId]; + } + if (oldEdFrameId > frameId) { + arrIdx = rb.GetArrIdxByOffset(frameId - rb.StFrameId >> 0); + if (!((-1 === arrIdx))) { + (x = rb.Eles, ((arrIdx < 0 || arrIdx >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + arrIdx] = pItem)); + return [0, oldStFrameId, oldEdFrameId]; + } + } + ret = 0; + if (oldEdFrameId < frameId) { + _tmp$2 = 0; + _tmp$3 = 0; + rb.St = _tmp$2; + rb.Ed = _tmp$3; + _tmp$4 = frameId; + _tmp$5 = frameId; + rb.StFrameId = _tmp$4; + rb.EdFrameId = _tmp$5; + rb.Cnt = 0; + ret = 1; + } + rb.Put(pItem); + return [ret, oldStFrameId, oldEdFrameId]; + }; + RingBuffer.prototype.SetByFrameId = function(pItem, frameId) { return this.$val.SetByFrameId(pItem, frameId); }; + ConvertToInputFrameId = function(renderFrameId, inputDelayFrames, inputScaleFrames) { + var inputDelayFrames, inputScaleFrames, renderFrameId; + if (renderFrameId < inputDelayFrames) { + return 0; + } + return ((((renderFrameId - inputDelayFrames >> 0)) >> $min(inputScaleFrames, 31)) >> 0); + }; + $pkg.ConvertToInputFrameId = ConvertToInputFrameId; + decodeInput = function(encodedInput) { + var btnALevel, btnBLevel, encodedDirection, encodedInput, x, x$1, x$2, x$3; + encodedDirection = new $Uint64(encodedInput.$high & 0, (encodedInput.$low & 15) >>> 0); + btnALevel = (((x = $shiftRightUint64(encodedInput, 4), new $Uint64(x.$high & 0, (x.$low & 1) >>> 0)).$low >> 0)); + btnBLevel = (((x$1 = $shiftRightUint64(encodedInput, 5), new $Uint64(x$1.$high & 0, (x$1.$low & 1) >>> 0)).$low >> 0)); + return new InputFrameDecoded.ptr((x$2 = (($flatten64(encodedDirection) < 0 || $flatten64(encodedDirection) >= $pkg.DIRECTION_DECODER.$length) ? ($throwRuntimeError("index out of range"), undefined) : $pkg.DIRECTION_DECODER.$array[$pkg.DIRECTION_DECODER.$offset + $flatten64(encodedDirection)]), (0 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 0])), (x$3 = (($flatten64(encodedDirection) < 0 || $flatten64(encodedDirection) >= $pkg.DIRECTION_DECODER.$length) ? ($throwRuntimeError("index out of range"), undefined) : $pkg.DIRECTION_DECODER.$array[$pkg.DIRECTION_DECODER.$offset + $flatten64(encodedDirection)]), (1 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 1])), btnALevel, btnBLevel); + }; + CalcPushbacks = function(oldDx, oldDy, playerShape, barrierShape) { + var {$24r, $24r$1, _tmp, _tmp$1, _tuple, barrierShape, oldDx, oldDy, origX, origY, overlapResult, overlapped, playerShape, pushbackX, pushbackY, $s, $deferred, $r, $c} = $restore(this, {oldDx, oldDy, playerShape, barrierShape}); + /* */ $s = $s || 0; var $err = null; try { s: while (true) { switch ($s) { case 0: $deferred = []; $curGoroutine.deferStack.push($deferred); + origX = [origX]; + origY = [origY]; + playerShape = [playerShape]; + _tuple = playerShape[0].Position(); + origX[0] = _tuple[0]; + origY[0] = _tuple[1]; + $deferred.push([(function(origX, origY, playerShape) { return function() { + playerShape[0].SetPosition(origX[0], origY[0]); + }; })(origX, origY, playerShape), []]); + playerShape[0].SetPosition(origX[0] + oldDx, origY[0] + oldDy); + overlapResult = new SatResult.ptr(0, 0, 0, true, true, new resolv.Vector([0, 0])); + overlapped = isPolygonPairOverlapped(playerShape[0], barrierShape, overlapResult); + /* */ if (overlapped) { $s = 1; continue; } + /* */ $s = 2; continue; + /* if (overlapped) { */ case 1: + _tmp = overlapResult.Overlap * overlapResult.OverlapX; + _tmp$1 = overlapResult.Overlap * overlapResult.OverlapY; + pushbackX = _tmp; + pushbackY = _tmp$1; + $24r = [true, pushbackX, pushbackY, overlapResult]; + $s = 4; case 4: return $24r; + /* } else { */ case 2: + $24r$1 = [false, 0, 0, overlapResult]; + $s = 5; case 5: return $24r$1; + /* } */ case 3: + $s = -1; return [false, 0, 0, ptrType.nil]; + /* */ } return; } } catch(err) { $err = err; $s = -1; return [false, 0, 0, ptrType.nil]; } finally { $callDeferred($deferred, $err); if($curGoroutine.asleep) { var $f = {$blk: CalcPushbacks, $c: true, $r, $24r, $24r$1, _tmp, _tmp$1, _tuple, barrierShape, oldDx, oldDy, origX, origY, overlapResult, overlapped, playerShape, pushbackX, pushbackY, $s, $deferred};return $f; } } + }; + $pkg.CalcPushbacks = CalcPushbacks; + isPolygonPairOverlapped = function(a, b, result) { + var _i, _i$1, _ref, _ref$1, _tmp, _tmp$1, a, aCnt, axis, axis$1, b, bCnt, result, x, x$1, x$2, x$3, x$4, x$5, x$6, x$7; + _tmp = a.Points.$length; + _tmp$1 = b.Points.$length; + aCnt = _tmp; + bCnt = _tmp$1; + if ((1 === aCnt) && (1 === bCnt)) { + if (!(ptrType.nil === result)) { + result.Overlap = 0; + } + return ((x = (x$1 = a.Points, (0 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 0])), (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])) === (x$2 = (x$3 = b.Points, (0 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 0])), (0 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 0]))) && ((x$4 = (x$5 = a.Points, (0 >= x$5.$length ? ($throwRuntimeError("index out of range"), undefined) : x$5.$array[x$5.$offset + 0])), (1 >= x$4.$length ? ($throwRuntimeError("index out of range"), undefined) : x$4.$array[x$4.$offset + 1])) === (x$6 = (x$7 = b.Points, (0 >= x$7.$length ? ($throwRuntimeError("index out of range"), undefined) : x$7.$array[x$7.$offset + 0])), (1 >= x$6.$length ? ($throwRuntimeError("index out of range"), undefined) : x$6.$array[x$6.$offset + 1]))); + } + if (1 < aCnt) { + _ref = a.SATAxes(); + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + axis = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (isPolygonPairSeparatedByDir(a, b, axis.Unit(), result)) { + return false; + } + _i++; + } + } + if (1 < bCnt) { + _ref$1 = b.SATAxes(); + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$1.$length)) { break; } + axis$1 = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); + if (isPolygonPairSeparatedByDir(a, b, axis$1.Unit(), result)) { + return false; + } + _i$1++; + } + } + return true; + }; + isPolygonPairSeparatedByDir = function(a, b, e, result) { + var _i, _i$1, _ref, _ref$1, _tmp, _tmp$1, _tmp$2, _tmp$3, a, aEnd, aStart, absoluteOverlap, b, bEnd, bStart, currentOverlap, dot, dot$1, e, option1, option1$1, option2, option2$1, overlap, p, p$1, result, sign, x, x$1; + _tmp = 1.7e+308; + _tmp$1 = -1.7e+308; + _tmp$2 = 1.7e+308; + _tmp$3 = -1.7e+308; + aStart = _tmp; + aEnd = _tmp$1; + bStart = _tmp$2; + bEnd = _tmp$3; + _ref = a.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + p = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + dot = ((0 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 0]) + a.X) * (0 >= e.$length ? ($throwRuntimeError("index out of range"), undefined) : e.$array[e.$offset + 0]) + ((1 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 1]) + a.Y) * (1 >= e.$length ? ($throwRuntimeError("index out of range"), undefined) : e.$array[e.$offset + 1]); + if (aStart > dot) { + aStart = dot; + } + if (aEnd < dot) { + aEnd = dot; + } + _i++; + } + _ref$1 = b.Points; + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$1.$length)) { break; } + p$1 = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); + dot$1 = ((0 >= p$1.$length ? ($throwRuntimeError("index out of range"), undefined) : p$1.$array[p$1.$offset + 0]) + b.X) * (0 >= e.$length ? ($throwRuntimeError("index out of range"), undefined) : e.$array[e.$offset + 0]) + ((1 >= p$1.$length ? ($throwRuntimeError("index out of range"), undefined) : p$1.$array[p$1.$offset + 1]) + b.Y) * (1 >= e.$length ? ($throwRuntimeError("index out of range"), undefined) : e.$array[e.$offset + 1]); + if (bStart > dot$1) { + bStart = dot$1; + } + if (bEnd < dot$1) { + bEnd = dot$1; + } + _i$1++; + } + if (aStart > bEnd || aEnd < bStart) { + return true; + } + if (!(ptrType.nil === result)) { + overlap = 0; + if (aStart < bStart) { + result.AContainedInB = false; + if (aEnd < bEnd) { + overlap = aEnd - bStart; + result.BContainedInA = false; + } else { + option1 = aEnd - bStart; + option2 = bEnd - aStart; + if (option1 < option2) { + overlap = option1; + } else { + overlap = -option2; + } + } + } else { + result.BContainedInA = false; + if (aEnd > bEnd) { + overlap = aStart - bEnd; + result.AContainedInB = false; + } else { + option1$1 = aEnd - bStart; + option2$1 = bEnd - aStart; + if (option1$1 < option2$1) { + overlap = option1$1; + } else { + overlap = -option2$1; + } + } + } + currentOverlap = result.Overlap; + absoluteOverlap = overlap; + if (overlap < 0) { + absoluteOverlap = -overlap; + } + if (((0 === (x = result.Axis, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0]))) && (0 === (x$1 = result.Axis, (1 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 1])))) || currentOverlap > absoluteOverlap) { + sign = 1; + if (overlap < 0) { + sign = -1; + } + result.Overlap = absoluteOverlap; + result.OverlapX = (0 >= e.$length ? ($throwRuntimeError("index out of range"), undefined) : e.$array[e.$offset + 0]) * sign; + result.OverlapY = (1 >= e.$length ? ($throwRuntimeError("index out of range"), undefined) : e.$array[e.$offset + 1]) * sign; + } + result.Axis = e; + } + return false; + }; + WorldToVirtualGridPos = function(wx, wy, worldToVirtualGridRatio) { + var virtualGridX, virtualGridY, worldToVirtualGridRatio, wx, wy; + virtualGridX = ((math.Floor(wx * worldToVirtualGridRatio) >> 0)); + virtualGridY = ((math.Floor(wy * worldToVirtualGridRatio) >> 0)); + return [virtualGridX, virtualGridY]; + }; + $pkg.WorldToVirtualGridPos = WorldToVirtualGridPos; + VirtualGridToWorldPos = function(vx, vy, virtualGridToWorldRatio) { + var virtualGridToWorldRatio, vx, vy, wx, wy; + wx = (vx) * virtualGridToWorldRatio; + wy = (vy) * virtualGridToWorldRatio; + return [wx, wy]; + }; + $pkg.VirtualGridToWorldPos = VirtualGridToWorldPos; + WorldToPolygonColliderBLPos = function(wx, wy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY) { + var bottomPadding, collisionSpaceOffsetX, collisionSpaceOffsetY, halfBoundingH, halfBoundingW, leftPadding, rightPadding, topPadding, wx, wy; + return [wx - halfBoundingW - leftPadding + collisionSpaceOffsetX, wy - halfBoundingH - bottomPadding + collisionSpaceOffsetY]; + }; + $pkg.WorldToPolygonColliderBLPos = WorldToPolygonColliderBLPos; + PolygonColliderBLToWorldPos = function(cx, cy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY) { + var bottomPadding, collisionSpaceOffsetX, collisionSpaceOffsetY, cx, cy, halfBoundingH, halfBoundingW, leftPadding, rightPadding, topPadding; + return [cx + halfBoundingW + leftPadding - collisionSpaceOffsetX, cy + halfBoundingH + bottomPadding - collisionSpaceOffsetY]; + }; + $pkg.PolygonColliderBLToWorldPos = PolygonColliderBLToWorldPos; + PolygonColliderBLToVirtualGridPos = function(cx, cy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY, worldToVirtualGridRatio) { + var _tuple, bottomPadding, collisionSpaceOffsetX, collisionSpaceOffsetY, cx, cy, halfBoundingH, halfBoundingW, leftPadding, rightPadding, topPadding, worldToVirtualGridRatio, wx, wy; + _tuple = PolygonColliderBLToWorldPos(cx, cy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY); + wx = _tuple[0]; + wy = _tuple[1]; + return WorldToVirtualGridPos(wx, wy, worldToVirtualGridRatio); + }; + $pkg.PolygonColliderBLToVirtualGridPos = PolygonColliderBLToVirtualGridPos; + VirtualGridToPolygonColliderBLPos = function(vx, vy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY, virtualGridToWorldRatio) { + var _tuple, bottomPadding, collisionSpaceOffsetX, collisionSpaceOffsetY, halfBoundingH, halfBoundingW, leftPadding, rightPadding, topPadding, virtualGridToWorldRatio, vx, vy, wx, wy; + _tuple = VirtualGridToWorldPos(vx, vy, virtualGridToWorldRatio); + wx = _tuple[0]; + wy = _tuple[1]; + return WorldToPolygonColliderBLPos(wx, wy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY); + }; + $pkg.VirtualGridToPolygonColliderBLPos = VirtualGridToPolygonColliderBLPos; + calcHardPushbacksNorms = function(joinIndex, playerCollider, playerShape, snapIntoPlatformOverlap, pEffPushback) { + var {_i, _r, _ref, _ref$1, _tmp, _tmp$1, _tuple, barrierShape, collision, isBarrier, joinIndex, obj, overlapResult, overlapped, pEffPushback, playerCollider, playerShape, pushbackX, pushbackY, ret, snapIntoPlatformOverlap, $s, $r, $c} = $restore(this, {joinIndex, playerCollider, playerShape, snapIntoPlatformOverlap, pEffPushback}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + ret = [ret]; + ret[0] = $makeSlice(sliceType$3, 0, 10); + collision = playerCollider.Check(0, 0, new sliceType$4([])); + if (ptrType$1.nil === collision) { + $s = -1; return (ret.$ptr || (ret.$ptr = new ptrType$2(function() { return this.$target[0]; }, function($v) { this.$target[0] = $v; }, ret))); + } + _ref = collision.Objects; + _i = 0; + /* while (true) { */ case 1: + /* if (!(_i < _ref.$length)) { break; } */ if(!(_i < _ref.$length)) { $s = 2; continue; } + obj = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + isBarrier = false; + _ref$1 = obj.Data; + if ($assertType(_ref$1, ptrType$3, true)[1]) { + } else if ($assertType(_ref$1, ptrType$4, true)[1]) { + } else { + isBarrier = true; + } + if (!isBarrier) { + _i++; + /* continue; */ $s = 1; continue; + } + barrierShape = $assertType(obj.Shape, ptrType$5); + _r = CalcPushbacks(0, 0, playerShape, barrierShape); /* */ $s = 3; case 3: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + _tuple = _r; + overlapped = _tuple[0]; + pushbackX = _tuple[1]; + pushbackY = _tuple[2]; + overlapResult = _tuple[3]; + if (!overlapped) { + _i++; + /* continue; */ $s = 1; continue; + } + _tmp = (overlapResult.Overlap - snapIntoPlatformOverlap) * overlapResult.OverlapX; + _tmp$1 = (overlapResult.Overlap - snapIntoPlatformOverlap) * overlapResult.OverlapY; + pushbackX = _tmp; + pushbackY = _tmp$1; + ret[0] = $append(ret[0], new Vec2D.ptr(overlapResult.OverlapX, overlapResult.OverlapY)); + pEffPushback.X = pEffPushback.X + (pushbackX); + pEffPushback.Y = pEffPushback.Y + (pushbackY); + _i++; + $s = 1; continue; + case 2: + $s = -1; return (ret.$ptr || (ret.$ptr = new ptrType$2(function() { return this.$target[0]; }, function($v) { this.$target[0] = $v; }, ret))); + /* */ } return; } var $f = {$blk: calcHardPushbacksNorms, $c: true, $r, _i, _r, _ref, _ref$1, _tmp, _tmp$1, _tuple, barrierShape, collision, isBarrier, joinIndex, obj, overlapResult, overlapped, pEffPushback, playerCollider, playerShape, pushbackX, pushbackY, ret, snapIntoPlatformOverlap, $s};return $f; + }; + deriveOpPattern = function(currPlayerDownsync, thatPlayerInNextFrame, currRenderFrame, inputsBuffer, inputDelayFrames, inputScaleFrames) { + var _entry, _tmp, _tmp$1, _tmp$2, _tmp$3, _tmp$4, _tmp$5, _tuple, currPlayerDownsync, currRenderFrame, decodedInput, delayedInputFrameId, delayedInputFrameIdForPrevRdf, delayedInputList, delayedInputListForPrevRdf, effDx, effDy, existent, inputDelayFrames, inputScaleFrames, inputsBuffer, joinIndex, jumpedOrNot, patternId, prevBtnALevel, prevBtnBLevel, prevDecodedInput, thatPlayerInNextFrame, x, x$1; + delayedInputFrameId = ConvertToInputFrameId(currRenderFrame.Id, inputDelayFrames, inputScaleFrames); + delayedInputFrameIdForPrevRdf = ConvertToInputFrameId(currRenderFrame.Id - 1 >> 0, inputDelayFrames, inputScaleFrames); + if (0 >= delayedInputFrameId) { + return [-2, false, 0, 0]; + } + delayedInputList = $assertType(inputsBuffer.GetByFrameId(delayedInputFrameId), ptrType$6).InputList; + delayedInputListForPrevRdf = sliceType$5.nil; + if (0 < delayedInputFrameIdForPrevRdf) { + delayedInputListForPrevRdf = $assertType(inputsBuffer.GetByFrameId(delayedInputFrameIdForPrevRdf), ptrType$6).InputList; + } + jumpedOrNot = false; + joinIndex = currPlayerDownsync.JoinIndex; + if (0 < currPlayerDownsync.FramesToRecover) { + return [-2, false, 0, 0]; + } + decodedInput = decodeInput((x = joinIndex - 1 >> 0, ((x < 0 || x >= delayedInputList.$length) ? ($throwRuntimeError("index out of range"), undefined) : delayedInputList.$array[delayedInputList.$offset + x]))); + _tmp = decodedInput.Dx; + _tmp$1 = decodedInput.Dy; + effDx = _tmp; + effDy = _tmp$1; + _tmp$2 = 0; + _tmp$3 = 0; + prevBtnALevel = _tmp$2; + prevBtnBLevel = _tmp$3; + if (!(sliceType$5.nil === delayedInputListForPrevRdf)) { + prevDecodedInput = decodeInput((x$1 = joinIndex - 1 >> 0, ((x$1 < 0 || x$1 >= delayedInputListForPrevRdf.$length) ? ($throwRuntimeError("index out of range"), undefined) : delayedInputListForPrevRdf.$array[delayedInputListForPrevRdf.$offset + x$1]))); + prevBtnALevel = prevDecodedInput.BtnALevel; + prevBtnBLevel = prevDecodedInput.BtnBLevel; + } + if (decodedInput.BtnBLevel > prevBtnBLevel) { + _tuple = (_entry = inAirSet[$Int32.keyFor(currPlayerDownsync.CharacterState)], _entry !== undefined ? [_entry.v, true] : [false, false]); + existent = _tuple[1]; + if (!existent) { + jumpedOrNot = true; + } + } + patternId = -1; + if (decodedInput.BtnALevel > prevBtnALevel) { + if (currPlayerDownsync.InAir) { + patternId = 1; + } else { + patternId = 0; + } + _tmp$4 = 0; + _tmp$5 = 0; + effDx = _tmp$4; + effDy = _tmp$5; + } + return [patternId, jumpedOrNot, effDx, effDy]; + }; + ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame = function(inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, playerOpPatternToSkillId, chConfigsOrderedByJoinIndex) { + var {_1, _entry, _entry$1, _entry$2, _entry$3, _entry$4, _i, _i$1, _i$10, _i$2, _i$3, _i$4, _i$5, _i$6, _i$7, _i$8, _i$9, _index, _index$1, _index$2, _index$3, _r, _r$1, _r$2, _r$3, _ref, _ref$1, _ref$10, _ref$11, _ref$12, _ref$2, _ref$3, _ref$4, _ref$5, _ref$6, _ref$7, _ref$8, _ref$9, _tmp, _tmp$1, _tmp$10, _tmp$11, _tmp$12, _tmp$13, _tmp$14, _tmp$15, _tmp$16, _tmp$2, _tmp$3, _tmp$4, _tmp$5, _tmp$6, _tmp$7, _tmp$8, _tmp$9, _tuple, _tuple$1, _tuple$2, _tuple$3, _tuple$4, _tuple$5, _tuple$6, atkedPlayerInCurFrame, atkedPlayerInNextFrame, bShape, bulletCollider, bulletColliders, bulletShape, bulletWx, bulletWy, chConfigsOrderedByJoinIndex, collision, collision$1, collisionPlayerIndex, collisionPlayerIndex$1, collisionPlayerIndex$2, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currPlayerDownsync, currPlayerDownsync$1, currPlayerDownsync$2, currPlayerDownsync$3, currPlayerDownsync$4, currRenderFrame, defenderShape, effDx, effDy, effPushbacks, existent, hardPushbackNorm, hardPushbackNorm$1, hardPushbackNorms, i, i$1, i$2, i$3, i$4, inputsBuffer, isAnotherPlayer, isBarrier, isBullet, joinIndex, joinIndex$1, joinIndex$2, joinIndex$3, joinIndex$4, jumpedOrNot, jumpedOrNotList, landedOnGravityPushback, meleeBullet, meleeBullet$1, newBulletCollider, newMeleeBullet, newVx, newVy, nextRenderFrameMeleeBullets, nextRenderFramePlayers, normAlignmentWithGravity, obj, obj$1, offender, offender$1, offenderWx, offenderWy, oldFramesToRecover, oldNextCharacterState, overlapResult, overlapped, overlapped$1, patternId, playerCollider, playerCollider$1, playerCollider$2, playerOpPatternToSkillId, playerShape, projectedMagnitude, projectedMagnitude$1, pushbackX, pushbackX$1, pushbackY, pushbackY$1, roomCapacity, skillConfig, skillId, t, t$1, thatPlayerInNextFrame, thatPlayerInNextFrame$1, thatPlayerInNextFrame$2, thatPlayerInNextFrame$3, x, x$1, x$10, x$11, x$12, x$13, x$14, x$15, x$2, x$3, x$4, x$5, x$6, x$7, x$8, x$9, xfac, xfac$1, $s, $r, $c} = $restore(this, {inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, playerOpPatternToSkillId, chConfigsOrderedByJoinIndex}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + roomCapacity = currRenderFrame.PlayersArr.$length; + nextRenderFramePlayers = $makeSlice(sliceType$6, roomCapacity); + _ref = currRenderFrame.PlayersArr; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + i = _i; + currPlayerDownsync = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + ((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i] = new PlayerDownsync.ptr(currPlayerDownsync.Id, currPlayerDownsync.VirtualGridX, currPlayerDownsync.VirtualGridY, currPlayerDownsync.DirX, currPlayerDownsync.DirY, currPlayerDownsync.VelX, currPlayerDownsync.VelY, currPlayerDownsync.Speed, currPlayerDownsync.BattleState, currPlayerDownsync.JoinIndex, 0, currPlayerDownsync.Removed, currPlayerDownsync.Score, 0, currPlayerDownsync.FramesToRecover - 1 >> 0, currPlayerDownsync.FramesInChState + 1 >> 0, currPlayerDownsync.Hp, currPlayerDownsync.MaxHp, currPlayerDownsync.CharacterState, true)); + if (((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i]).FramesToRecover < 0) { + ((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i]).FramesToRecover = 0; + } + _i++; + } + nextRenderFrameMeleeBullets = $makeSlice(sliceType$7, 0, currRenderFrame.MeleeBullets.$length); + effPushbacks = $makeSlice(sliceType$3, roomCapacity); + hardPushbackNorms = $makeSlice(sliceType$8, roomCapacity); + jumpedOrNotList = $makeSlice(sliceType$9, roomCapacity); + _ref$1 = currRenderFrame.PlayersArr; + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$1.$length)) { break; } + newMeleeBullet = [newMeleeBullet]; + i$1 = _i$1; + currPlayerDownsync$1 = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); + ((i$1 < 0 || i$1 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$1] = false); + thatPlayerInNextFrame = ((i$1 < 0 || i$1 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$1]); + _tuple = deriveOpPattern(currPlayerDownsync$1, thatPlayerInNextFrame, currRenderFrame, inputsBuffer, 8, 2); + patternId = _tuple[0]; + jumpedOrNot = _tuple[1]; + effDx = _tuple[2]; + effDy = _tuple[3]; + if (-2 === patternId) { + _i$1++; + continue; + } + if (jumpedOrNot) { + thatPlayerInNextFrame.VelY = ((((i$1 < 0 || i$1 >= chConfigsOrderedByJoinIndex.$length) ? ($throwRuntimeError("index out of range"), undefined) : chConfigsOrderedByJoinIndex.$array[chConfigsOrderedByJoinIndex.$offset + i$1]).JumpingInitVelY >> 0)); + ((i$1 < 0 || i$1 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$1] = true); + } + joinIndex = currPlayerDownsync$1.JoinIndex; + if (!((-1 === patternId))) { + _tuple$1 = (_entry = playerOpPatternToSkillId[$Int.keyFor(((((joinIndex >> 0)) << 8 >> 0)) + patternId >> 0)], _entry !== undefined ? [_entry.v, true] : [0, false]); + skillId = _tuple$1[0]; + existent = _tuple$1[1]; + if (existent) { + skillConfig = $assertType((_entry$1 = skillIdToBullet[$Int.keyFor(skillId)], _entry$1 !== undefined ? _entry$1.v : $ifaceNil), ptrType$4); + newMeleeBullet[0] = $clone(skillConfig, MeleeBullet); + newMeleeBullet[0].Bullet.OffenderJoinIndex = joinIndex; + newMeleeBullet[0].Bullet.OffenderPlayerId = currPlayerDownsync$1.Id; + newMeleeBullet[0].Bullet.OriginatedRenderFrameId = currRenderFrame.Id; + nextRenderFrameMeleeBullets = $append(nextRenderFrameMeleeBullets, newMeleeBullet[0]); + thatPlayerInNextFrame.FramesToRecover = newMeleeBullet[0].Bullet.RecoveryFrames; + thatPlayerInNextFrame.CharacterState = 2; + if (false === currPlayerDownsync$1.InAir) { + thatPlayerInNextFrame.VelX = 0; + } + } + _i$1++; + continue; + } + if (!((0 === effDx)) || !((0 === effDy))) { + _tmp = effDx; + _tmp$1 = effDy; + thatPlayerInNextFrame.DirX = _tmp; + thatPlayerInNextFrame.DirY = _tmp$1; + thatPlayerInNextFrame.VelX = $imul(effDx, currPlayerDownsync$1.Speed); + thatPlayerInNextFrame.CharacterState = 1; + } else { + thatPlayerInNextFrame.CharacterState = 0; + thatPlayerInNextFrame.VelX = 0; + } + _i$1++; + } + _ref$2 = currRenderFrame.PlayersArr; + _i$2 = 0; + /* while (true) { */ case 1: + /* if (!(_i$2 < _ref$2.$length)) { break; } */ if(!(_i$2 < _ref$2.$length)) { $s = 2; continue; } + i$2 = _i$2; + currPlayerDownsync$2 = ((_i$2 < 0 || _i$2 >= _ref$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$2.$array[_ref$2.$offset + _i$2]); + joinIndex$1 = currPlayerDownsync$2.JoinIndex; + _tmp$2 = 0; + _tmp$3 = 0; + (x = joinIndex$1 - 1 >> 0, ((x < 0 || x >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x])).X = _tmp$2; + (x$1 = joinIndex$1 - 1 >> 0, ((x$1 < 0 || x$1 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$1])).Y = _tmp$3; + collisionPlayerIndex = 131072 + joinIndex$1 >> 0; + playerCollider = (_entry$2 = collisionSysMap[$Int32.keyFor(collisionPlayerIndex)], _entry$2 !== undefined ? _entry$2.v : ptrType$7.nil); + thatPlayerInNextFrame$1 = ((i$2 < 0 || i$2 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$2]); + _tmp$4 = currPlayerDownsync$2.VirtualGridX + currPlayerDownsync$2.VelX >> 0; + _tmp$5 = currPlayerDownsync$2.VirtualGridY + currPlayerDownsync$2.VelY >> 0; + newVx = _tmp$4; + newVy = _tmp$5; + if (((i$2 < 0 || i$2 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$2])) { + newVy = newVy + (((((i$2 < 0 || i$2 >= chConfigsOrderedByJoinIndex.$length) ? ($throwRuntimeError("index out of range"), undefined) : chConfigsOrderedByJoinIndex.$array[chConfigsOrderedByJoinIndex.$offset + i$2]).JumpingInitVelY >> 0))) >> 0; + } + _tuple$2 = VirtualGridToPolygonColliderBLPos(newVx, newVy, playerCollider.W * 0.5, playerCollider.H * 0.5, 0, 0, 0, 0, collisionSpaceOffsetX, collisionSpaceOffsetY, 0.01); + playerCollider.X = _tuple$2[0]; + playerCollider.Y = _tuple$2[1]; + $r = playerCollider.Update(); /* */ $s = 3; case 3: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + if (currPlayerDownsync$2.InAir) { + thatPlayerInNextFrame$1.VelX = thatPlayerInNextFrame$1.VelX + (0) >> 0; + thatPlayerInNextFrame$1.VelY = thatPlayerInNextFrame$1.VelY + (-50) >> 0; + } + _i$2++; + $s = 1; continue; + case 2: + bulletColliders = $makeSlice(sliceType$10, 0, currRenderFrame.MeleeBullets.$length); + _ref$3 = currRenderFrame.MeleeBullets; + _i$3 = 0; + /* while (true) { */ case 4: + /* if (!(_i$3 < _ref$3.$length)) { break; } */ if(!(_i$3 < _ref$3.$length)) { $s = 5; continue; } + meleeBullet = ((_i$3 < 0 || _i$3 >= _ref$3.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$3.$array[_ref$3.$offset + _i$3]); + /* */ if (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) <= currRenderFrame.Id) && (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) + meleeBullet.Bullet.ActiveFrames >> 0) > currRenderFrame.Id)) { $s = 6; continue; } + /* */ $s = 7; continue; + /* if (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) <= currRenderFrame.Id) && (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) + meleeBullet.Bullet.ActiveFrames >> 0) > currRenderFrame.Id)) { */ case 6: + offender = (x$2 = currRenderFrame.PlayersArr, x$3 = meleeBullet.Bullet.OffenderJoinIndex - 1 >> 0, ((x$3 < 0 || x$3 >= x$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + x$3])); + xfac = 1; + if (0 > offender.DirX) { + xfac = -1; + } + _tuple$3 = VirtualGridToWorldPos(offender.VirtualGridX, offender.VirtualGridY, 0.01); + offenderWx = _tuple$3[0]; + offenderWy = _tuple$3[1]; + _tmp$6 = offenderWx + xfac * meleeBullet.Bullet.HitboxOffset; + _tmp$7 = offenderWy; + bulletWx = _tmp$6; + bulletWy = _tmp$7; + _r = GenerateRectCollider(bulletWx, bulletWy, meleeBullet.Bullet.HitboxSizeX, meleeBullet.Bullet.HitboxSizeY, 0.1, 0.1, 0.1, 0.1, collisionSpaceOffsetX, collisionSpaceOffsetY, meleeBullet, "MeleeBullet"); /* */ $s = 9; case 9: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + newBulletCollider = _r; + $r = collisionSys.Add(new sliceType$10([newBulletCollider])); /* */ $s = 10; case 10: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + bulletColliders = $append(bulletColliders, newBulletCollider); + $s = 8; continue; + /* } else { */ case 7: + nextRenderFrameMeleeBullets = $append(nextRenderFrameMeleeBullets, meleeBullet); + /* } */ case 8: + _i$3++; + $s = 4; continue; + case 5: + _ref$4 = currRenderFrame.PlayersArr; + _i$4 = 0; + /* while (true) { */ case 11: + /* if (!(_i$4 < _ref$4.$length)) { break; } */ if(!(_i$4 < _ref$4.$length)) { $s = 12; continue; } + i$3 = _i$4; + currPlayerDownsync$3 = ((_i$4 < 0 || _i$4 >= _ref$4.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$4.$array[_ref$4.$offset + _i$4]); + joinIndex$2 = currPlayerDownsync$3.JoinIndex; + collisionPlayerIndex$1 = 131072 + joinIndex$2 >> 0; + playerCollider$1 = (_entry$3 = collisionSysMap[$Int32.keyFor(collisionPlayerIndex$1)], _entry$3 !== undefined ? _entry$3.v : ptrType$7.nil); + playerShape = $assertType(playerCollider$1.Shape, ptrType$5); + _r$1 = calcHardPushbacksNorms(joinIndex$2, playerCollider$1, playerShape, 0.1, (x$4 = joinIndex$2 - 1 >> 0, ((x$4 < 0 || x$4 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$4]))); /* */ $s = 13; case 13: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } + (x$5 = joinIndex$2 - 1 >> 0, ((x$5 < 0 || x$5 >= hardPushbackNorms.$length) ? ($throwRuntimeError("index out of range"), undefined) : hardPushbackNorms.$array[hardPushbackNorms.$offset + x$5] = _r$1)); + thatPlayerInNextFrame$2 = ((i$3 < 0 || i$3 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$3]); + landedOnGravityPushback = false; + collision = playerCollider$1.Check(0, 0, new sliceType$4([])); + /* */ if (!(ptrType$1.nil === collision)) { $s = 14; continue; } + /* */ $s = 15; continue; + /* if (!(ptrType$1.nil === collision)) { */ case 14: + _ref$5 = collision.Objects; + _i$5 = 0; + /* while (true) { */ case 16: + /* if (!(_i$5 < _ref$5.$length)) { break; } */ if(!(_i$5 < _ref$5.$length)) { $s = 17; continue; } + obj = ((_i$5 < 0 || _i$5 >= _ref$5.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$5.$array[_ref$5.$offset + _i$5]); + _tmp$8 = false; + _tmp$9 = false; + _tmp$10 = false; + isBarrier = _tmp$8; + isAnotherPlayer = _tmp$9; + isBullet = _tmp$10; + _ref$6 = obj.Data; + if ($assertType(_ref$6, ptrType$3, true)[1]) { + isAnotherPlayer = true; + } else if ($assertType(_ref$6, ptrType$4, true)[1]) { + isBullet = true; + } else { + isBarrier = true; + } + if (isBullet) { + _i$5++; + /* continue; */ $s = 16; continue; + } + bShape = $assertType(obj.Shape, ptrType$5); + _r$2 = CalcPushbacks(0, 0, playerShape, bShape); /* */ $s = 18; case 18: if($c) { $c = false; _r$2 = _r$2.$blk(); } if (_r$2 && _r$2.$blk !== undefined) { break s; } + _tuple$4 = _r$2; + overlapped = _tuple$4[0]; + pushbackX = _tuple$4[1]; + pushbackY = _tuple$4[2]; + overlapResult = _tuple$4[3]; + if (!overlapped) { + _i$5++; + /* continue; */ $s = 16; continue; + } + normAlignmentWithGravity = overlapResult.OverlapX * 0 + overlapResult.OverlapY * -1; + if (isAnotherPlayer) { + _tmp$11 = (overlapResult.Overlap - 0.2) * overlapResult.OverlapX; + _tmp$12 = (overlapResult.Overlap - 0.2) * overlapResult.OverlapY; + pushbackX = _tmp$11; + pushbackY = _tmp$12; + } + _ref$7 = (x$6 = joinIndex$2 - 1 >> 0, ((x$6 < 0 || x$6 >= hardPushbackNorms.$length) ? ($throwRuntimeError("index out of range"), undefined) : hardPushbackNorms.$array[hardPushbackNorms.$offset + x$6])).$get(); + _i$6 = 0; + while (true) { + if (!(_i$6 < _ref$7.$length)) { break; } + hardPushbackNorm = $clone(((_i$6 < 0 || _i$6 >= _ref$7.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$7.$array[_ref$7.$offset + _i$6]), Vec2D); + projectedMagnitude = pushbackX * hardPushbackNorm.X + pushbackY * hardPushbackNorm.Y; + if (isBarrier || (isAnotherPlayer && 0 > projectedMagnitude)) { + pushbackX = pushbackX - (projectedMagnitude * hardPushbackNorm.X); + pushbackY = pushbackY - (projectedMagnitude * hardPushbackNorm.Y); + } + _i$6++; + } + _index = joinIndex$2 - 1 >> 0; + ((_index < 0 || _index >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index]).X = ((_index < 0 || _index >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index]).X + (pushbackX); + _index$1 = joinIndex$2 - 1 >> 0; + ((_index$1 < 0 || _index$1 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index$1]).Y = ((_index$1 < 0 || _index$1 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index$1]).Y + (pushbackY); + if (0.5 < normAlignmentWithGravity) { + landedOnGravityPushback = true; + } + _i$5++; + $s = 16; continue; + case 17: + /* } */ case 15: + if (landedOnGravityPushback) { + thatPlayerInNextFrame$2.InAir = false; + if (currPlayerDownsync$3.InAir && 0 >= currPlayerDownsync$3.VelY) { + thatPlayerInNextFrame$2.VelX = 0; + thatPlayerInNextFrame$2.VelY = 0; + thatPlayerInNextFrame$2.CharacterState = 0; + thatPlayerInNextFrame$2.FramesToRecover = 0; + } + } + if (thatPlayerInNextFrame$2.InAir) { + oldNextCharacterState = thatPlayerInNextFrame$2.CharacterState; + _1 = oldNextCharacterState; + if ((_1 === (0)) || (_1 === (1))) { + if (((i$3 < 0 || i$3 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$3]) || (5 === currPlayerDownsync$3.CharacterState)) { + thatPlayerInNextFrame$2.CharacterState = 5; + } else { + thatPlayerInNextFrame$2.CharacterState = 4; + } + } else if (_1 === (2)) { + thatPlayerInNextFrame$2.CharacterState = 6; + } else if (_1 === (3)) { + thatPlayerInNextFrame$2.CharacterState = 7; + } + } + _i$4++; + $s = 11; continue; + case 12: + _ref$8 = bulletColliders; + _i$7 = 0; + /* while (true) { */ case 19: + /* if (!(_i$7 < _ref$8.$length)) { break; } */ if(!(_i$7 < _ref$8.$length)) { $s = 20; continue; } + bulletCollider = ((_i$7 < 0 || _i$7 >= _ref$8.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$8.$array[_ref$8.$offset + _i$7]); + meleeBullet$1 = $assertType(bulletCollider.Data, ptrType$4); + bulletShape = $assertType(bulletCollider.Shape, ptrType$5); + collision$1 = bulletCollider.Check(0, 0, new sliceType$4([])); + bulletCollider.Space.Remove(new sliceType$10([bulletCollider])); + if (ptrType$1.nil === collision$1) { + nextRenderFrameMeleeBullets = $append(nextRenderFrameMeleeBullets, meleeBullet$1); + _i$7++; + /* continue; */ $s = 19; continue; + } + offender$1 = (x$7 = currRenderFrame.PlayersArr, x$8 = meleeBullet$1.Bullet.OffenderJoinIndex - 1 >> 0, ((x$8 < 0 || x$8 >= x$7.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$7.$array[x$7.$offset + x$8])); + _ref$9 = collision$1.Objects; + _i$8 = 0; + /* while (true) { */ case 21: + /* if (!(_i$8 < _ref$9.$length)) { break; } */ if(!(_i$8 < _ref$9.$length)) { $s = 22; continue; } + obj$1 = ((_i$8 < 0 || _i$8 >= _ref$9.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$9.$array[_ref$9.$offset + _i$8]); + defenderShape = $assertType(obj$1.Shape, ptrType$5); + _ref$10 = obj$1.Data; + /* */ if ($assertType(_ref$10, ptrType$3, true)[1]) { $s = 23; continue; } + /* */ $s = 24; continue; + /* if ($assertType(_ref$10, ptrType$3, true)[1]) { */ case 23: + t = _ref$10.$val; + if (meleeBullet$1.Bullet.OffenderPlayerId === t.Id) { + _i$8++; + /* continue; */ $s = 21; continue; + } + _r$3 = CalcPushbacks(0, 0, bulletShape, defenderShape); /* */ $s = 26; case 26: if($c) { $c = false; _r$3 = _r$3.$blk(); } if (_r$3 && _r$3.$blk !== undefined) { break s; } + _tuple$5 = _r$3; + overlapped$1 = _tuple$5[0]; + if (!overlapped$1) { + _i$8++; + /* continue; */ $s = 21; continue; + } + joinIndex$3 = t.JoinIndex; + xfac$1 = 1; + if (0 > offender$1.DirX) { + xfac$1 = -1; + } + _tmp$13 = -xfac$1 * meleeBullet$1.Bullet.Pushback; + _tmp$14 = 0; + pushbackX$1 = _tmp$13; + pushbackY$1 = _tmp$14; + _ref$11 = (x$9 = joinIndex$3 - 1 >> 0, ((x$9 < 0 || x$9 >= hardPushbackNorms.$length) ? ($throwRuntimeError("index out of range"), undefined) : hardPushbackNorms.$array[hardPushbackNorms.$offset + x$9])).$get(); + _i$9 = 0; + while (true) { + if (!(_i$9 < _ref$11.$length)) { break; } + hardPushbackNorm$1 = $clone(((_i$9 < 0 || _i$9 >= _ref$11.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$11.$array[_ref$11.$offset + _i$9]), Vec2D); + projectedMagnitude$1 = pushbackX$1 * hardPushbackNorm$1.X + pushbackY$1 * hardPushbackNorm$1.Y; + if (0 > projectedMagnitude$1) { + pushbackX$1 = pushbackX$1 - (projectedMagnitude$1 * hardPushbackNorm$1.X); + pushbackY$1 = pushbackY$1 - (projectedMagnitude$1 * hardPushbackNorm$1.Y); + } + _i$9++; + } + _index$2 = joinIndex$3 - 1 >> 0; + ((_index$2 < 0 || _index$2 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index$2]).X = ((_index$2 < 0 || _index$2 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index$2]).X + (pushbackX$1); + _index$3 = joinIndex$3 - 1 >> 0; + ((_index$3 < 0 || _index$3 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index$3]).Y = ((_index$3 < 0 || _index$3 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index$3]).Y + (pushbackY$1); + _tmp$15 = (x$10 = currRenderFrame.PlayersArr, x$11 = t.JoinIndex - 1 >> 0, ((x$11 < 0 || x$11 >= x$10.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$10.$array[x$10.$offset + x$11])); + _tmp$16 = (x$12 = t.JoinIndex - 1 >> 0, ((x$12 < 0 || x$12 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + x$12])); + atkedPlayerInCurFrame = _tmp$15; + atkedPlayerInNextFrame = _tmp$16; + atkedPlayerInNextFrame.CharacterState = 3; + if (atkedPlayerInCurFrame.InAir) { + atkedPlayerInNextFrame.CharacterState = 7; + } + oldFramesToRecover = (x$13 = t.JoinIndex - 1 >> 0, ((x$13 < 0 || x$13 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + x$13])).FramesToRecover; + if (meleeBullet$1.Bullet.HitStunFrames > oldFramesToRecover) { + atkedPlayerInNextFrame.FramesToRecover = meleeBullet$1.Bullet.HitStunFrames; + } + $s = 25; continue; + /* } else { */ case 24: + t$1 = _ref$10; + /* } */ case 25: + _i$8++; + $s = 21; continue; + case 22: + _i$7++; + $s = 19; continue; + case 20: + _ref$12 = currRenderFrame.PlayersArr; + _i$10 = 0; + while (true) { + if (!(_i$10 < _ref$12.$length)) { break; } + i$4 = _i$10; + currPlayerDownsync$4 = ((_i$10 < 0 || _i$10 >= _ref$12.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$12.$array[_ref$12.$offset + _i$10]); + joinIndex$4 = currPlayerDownsync$4.JoinIndex; + collisionPlayerIndex$2 = 131072 + joinIndex$4 >> 0; + playerCollider$2 = (_entry$4 = collisionSysMap[$Int32.keyFor(collisionPlayerIndex$2)], _entry$4 !== undefined ? _entry$4.v : ptrType$7.nil); + thatPlayerInNextFrame$3 = ((i$4 < 0 || i$4 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$4]); + _tuple$6 = PolygonColliderBLToVirtualGridPos(playerCollider$2.X - (x$14 = joinIndex$4 - 1 >> 0, ((x$14 < 0 || x$14 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$14])).X, playerCollider$2.Y - (x$15 = joinIndex$4 - 1 >> 0, ((x$15 < 0 || x$15 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$15])).Y, playerCollider$2.W * 0.5, playerCollider$2.H * 0.5, 0, 0, 0, 0, collisionSpaceOffsetX, collisionSpaceOffsetY, 100); + thatPlayerInNextFrame$3.VirtualGridX = _tuple$6[0]; + thatPlayerInNextFrame$3.VirtualGridY = _tuple$6[1]; + if (!((thatPlayerInNextFrame$3.CharacterState === currPlayerDownsync$4.CharacterState))) { + thatPlayerInNextFrame$3.FramesInChState = 0; + } + _i$10++; + } + $s = -1; return new RoomDownsyncFrame.ptr(currRenderFrame.Id + 1 >> 0, nextRenderFramePlayers, new $Int64(0, 0), nextRenderFrameMeleeBullets, sliceType$11.nil, new $Uint64(0, 0), false, false); + /* */ } return; } var $f = {$blk: ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame, $c: true, $r, _1, _entry, _entry$1, _entry$2, _entry$3, _entry$4, _i, _i$1, _i$10, _i$2, _i$3, _i$4, _i$5, _i$6, _i$7, _i$8, _i$9, _index, _index$1, _index$2, _index$3, _r, _r$1, _r$2, _r$3, _ref, _ref$1, _ref$10, _ref$11, _ref$12, _ref$2, _ref$3, _ref$4, _ref$5, _ref$6, _ref$7, _ref$8, _ref$9, _tmp, _tmp$1, _tmp$10, _tmp$11, _tmp$12, _tmp$13, _tmp$14, _tmp$15, _tmp$16, _tmp$2, _tmp$3, _tmp$4, _tmp$5, _tmp$6, _tmp$7, _tmp$8, _tmp$9, _tuple, _tuple$1, _tuple$2, _tuple$3, _tuple$4, _tuple$5, _tuple$6, atkedPlayerInCurFrame, atkedPlayerInNextFrame, bShape, bulletCollider, bulletColliders, bulletShape, bulletWx, bulletWy, chConfigsOrderedByJoinIndex, collision, collision$1, collisionPlayerIndex, collisionPlayerIndex$1, collisionPlayerIndex$2, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currPlayerDownsync, currPlayerDownsync$1, currPlayerDownsync$2, currPlayerDownsync$3, currPlayerDownsync$4, currRenderFrame, defenderShape, effDx, effDy, effPushbacks, existent, hardPushbackNorm, hardPushbackNorm$1, hardPushbackNorms, i, i$1, i$2, i$3, i$4, inputsBuffer, isAnotherPlayer, isBarrier, isBullet, joinIndex, joinIndex$1, joinIndex$2, joinIndex$3, joinIndex$4, jumpedOrNot, jumpedOrNotList, landedOnGravityPushback, meleeBullet, meleeBullet$1, newBulletCollider, newMeleeBullet, newVx, newVy, nextRenderFrameMeleeBullets, nextRenderFramePlayers, normAlignmentWithGravity, obj, obj$1, offender, offender$1, offenderWx, offenderWy, oldFramesToRecover, oldNextCharacterState, overlapResult, overlapped, overlapped$1, patternId, playerCollider, playerCollider$1, playerCollider$2, playerOpPatternToSkillId, playerShape, projectedMagnitude, projectedMagnitude$1, pushbackX, pushbackX$1, pushbackY, pushbackY$1, roomCapacity, skillConfig, skillId, t, t$1, thatPlayerInNextFrame, thatPlayerInNextFrame$1, thatPlayerInNextFrame$2, thatPlayerInNextFrame$3, x, x$1, x$10, x$11, x$12, x$13, x$14, x$15, x$2, x$3, x$4, x$5, x$6, x$7, x$8, x$9, xfac, xfac$1, $s};return $f; + }; + $pkg.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame = ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame; + GenerateRectCollider = function(wx, wy, w, h, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, data, tag) { + var {$24r, _r, _tuple, blX, blY, bottomPadding, data, h, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, tag, topPadding, w, wx, wy, $s, $r, $c} = $restore(this, {wx, wy, w, h, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, data, tag}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + _tuple = WorldToPolygonColliderBLPos(wx, wy, w * 0.5, h * 0.5, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY); + blX = _tuple[0]; + blY = _tuple[1]; + _r = generateRectColliderInCollisionSpace(blX, blY, leftPadding + w + rightPadding, bottomPadding + h + topPadding, data, tag); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + $24r = _r; + $s = 2; case 2: return $24r; + /* */ } return; } var $f = {$blk: GenerateRectCollider, $c: true, $r, $24r, _r, _tuple, blX, blY, bottomPadding, data, h, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, tag, topPadding, w, wx, wy, $s};return $f; + }; + $pkg.GenerateRectCollider = GenerateRectCollider; + generateRectColliderInCollisionSpace = function(blX, blY, w, h, data, tag) { + var {blX, blY, collider, data, h, shape, tag, w, $s, $r, $c} = $restore(this, {blX, blY, w, h, data, tag}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + collider = resolv.NewObject(blX, blY, w, h, new sliceType$4([tag])); + shape = resolv.NewRectangle(0, 0, w, h); + $r = collider.SetShape(shape); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + collider.Data = data; + $s = -1; return collider; + /* */ } return; } var $f = {$blk: generateRectColliderInCollisionSpace, $c: true, $r, blX, blY, collider, data, h, shape, tag, w, $s};return $f; + }; + GenerateConvexPolygonCollider = function(unalignedSrc, spaceOffsetX, spaceOffsetY, data, tag) { + var {_i, _i$1, _ref, _ref$1, _tmp, _tmp$1, aligned, collider, data, h, i, i$1, j, p, pi, pj, shape, spaceOffsetX, spaceOffsetY, tag, unalignedSrc, w, x, $s, $r, $c} = $restore(this, {unalignedSrc, spaceOffsetX, spaceOffsetY, data, tag}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + aligned = AlignPolygon2DToBoundingBox(unalignedSrc); + _tmp = 0; + _tmp$1 = 0; + w = _tmp; + h = _tmp$1; + shape = resolv.NewConvexPolygon(sliceType$12.nil); + _ref = aligned.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + i = _i; + pi = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + _ref$1 = aligned.Points; + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$1.$length)) { break; } + j = _i$1; + pj = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); + if (i === j) { + _i$1++; + continue; + } + if (math.Abs(pj.X - pi.X) > w) { + w = math.Abs(pj.X - pi.X); + } + if (math.Abs(pj.Y - pi.Y) > h) { + h = math.Abs(pj.Y - pi.Y); + } + _i$1++; + } + _i++; + } + i$1 = 0; + while (true) { + if (!(i$1 < aligned.Points.$length)) { break; } + p = (x = aligned.Points, ((i$1 < 0 || i$1 >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + i$1])); + shape.AddPoints(new sliceType$12([p.X, p.Y])); + i$1 = i$1 + (1) >> 0; + } + collider = resolv.NewObject(aligned.Anchor.X + spaceOffsetX, aligned.Anchor.Y + spaceOffsetY, w, h, new sliceType$4([tag])); + $r = collider.SetShape(shape); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + collider.Data = data; + $s = -1; return collider; + /* */ } return; } var $f = {$blk: GenerateConvexPolygonCollider, $c: true, $r, _i, _i$1, _ref, _ref$1, _tmp, _tmp$1, aligned, collider, data, h, i, i$1, j, p, pi, pj, shape, spaceOffsetX, spaceOffsetY, tag, unalignedSrc, w, x, $s};return $f; + }; + $pkg.GenerateConvexPolygonCollider = GenerateConvexPolygonCollider; + AlignPolygon2DToBoundingBox = function(input) { + var _i, _i$1, _ref, _ref$1, boundingBoxBL, i, input, output, p, p$1, x; + boundingBoxBL = new Vec2D.ptr(1.7e+308, 1.7e+308); + _ref = input.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + p = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (p.X < boundingBoxBL.X) { + boundingBoxBL.X = p.X; + } + if (p.Y < boundingBoxBL.Y) { + boundingBoxBL.Y = p.Y; + } + _i++; + } + output = new Polygon2D.ptr(new Vec2D.ptr(input.Anchor.X + boundingBoxBL.X, input.Anchor.Y + boundingBoxBL.Y), $makeSlice(sliceType$13, input.Points.$length)); + _ref$1 = input.Points; + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$1.$length)) { break; } + i = _i$1; + p$1 = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); + (x = output.Points, ((i < 0 || i >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + i] = new Vec2D.ptr(p$1.X - boundingBoxBL.X, p$1.Y - boundingBoxBL.Y))); + _i$1++; + } + return output; + }; + $pkg.AlignPolygon2DToBoundingBox = AlignPolygon2DToBoundingBox; + ptrType$11.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)}]; + Vec2D.init("", [{prop: "X", name: "X", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "Y", name: "Y", embedded: false, exported: true, typ: $Float64, tag: ""}]); + Polygon2D.init("", [{prop: "Anchor", name: "Anchor", embedded: false, exported: true, typ: ptrType$9, tag: ""}, {prop: "Points", name: "Points", embedded: false, exported: true, typ: sliceType$13, tag: ""}]); + PlayerDownsync.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: "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: ""}]); + InputFrameDecoded.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: ""}]); + Barrier.init("", [{prop: "Boundary", name: "Boundary", embedded: false, exported: true, typ: ptrType$10, tag: ""}]); + Bullet.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: ""}, {prop: "BlowUpVelY", name: "BlowUpVelY", embedded: false, exported: true, typ: $Int32, tag: ""}]); + MeleeBullet.init("", [{prop: "Bullet", name: "Bullet", embedded: true, exported: true, typ: Bullet, tag: ""}]); + FireballBullet.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: Bullet, tag: ""}]); + RoomDownsyncFrame.init("", [{prop: "Id", name: "Id", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "PlayersArr", name: "PlayersArr", embedded: false, exported: true, typ: sliceType$6, tag: ""}, {prop: "CountdownNanos", name: "CountdownNanos", embedded: false, exported: true, typ: $Int64, tag: ""}, {prop: "MeleeBullets", name: "MeleeBullets", embedded: false, exported: true, typ: sliceType$7, tag: ""}, {prop: "FireballBullets", name: "FireballBullets", embedded: false, exported: true, typ: sliceType$11, 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: mapType, tag: ""}]); + InputFrameDownsync.init("", [{prop: "InputFrameId", name: "InputFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "InputList", name: "InputList", embedded: false, exported: true, typ: sliceType$5, tag: ""}, {prop: "ConfirmedList", name: "ConfirmedList", embedded: false, exported: true, typ: $Uint64, tag: ""}]); + CharacterConfig.init("", [{prop: "SpeciesId", name: "SpeciesId", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "SpeciesName", name: "SpeciesName", embedded: false, exported: true, typ: $String, tag: ""}, {prop: "InAirIdleFrameIdxTurningPoint", name: "InAirIdleFrameIdxTurningPoint", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "InAirIdleFrameIdxTurnedCycle", name: "InAirIdleFrameIdxTurnedCycle", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "LayDownFrames", name: "LayDownFrames", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "LayDownFramesToRecover", name: "LayDownFramesToRecover", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "GetUpFrames", name: "GetUpFrames", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "GetUpFramesToRecover", name: "GetUpFramesToRecover", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "JumpingInitVelY", name: "JumpingInitVelY", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "PatternIdToSkillId", name: "PatternIdToSkillId", embedded: false, exported: true, typ: mapType, tag: ""}]); + RingBuffer.init("", [{prop: "Ed", name: "Ed", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "St", name: "St", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "EdFrameId", name: "EdFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "StFrameId", name: "StFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "N", name: "N", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Cnt", name: "Cnt", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Eles", name: "Eles", embedded: false, exported: true, typ: sliceType$2, tag: ""}]); + SatResult.init("", [{prop: "Overlap", name: "Overlap", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "OverlapX", name: "OverlapX", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "OverlapY", name: "OverlapY", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "AContainedInB", name: "AContainedInB", embedded: false, exported: true, typ: $Bool, tag: ""}, {prop: "BContainedInA", name: "BContainedInA", embedded: false, exported: true, typ: $Bool, tag: ""}, {prop: "Axis", name: "Axis", embedded: false, exported: true, typ: resolv.Vector, tag: ""}]); + $init = function() { + $pkg.$init = function() {}; + /* */ 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 = math.$init(); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + $r = resolv.$init(); /* */ $s = 2; case 2: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + $pkg.Characters = $makeMap($Int.keyFor, [{ k: 0, v: new CharacterConfig.ptr(0, "MonkGirl", 11, 1, 16, 16, 33, 30, 800, $makeMap($Int.keyFor, [{ k: 0, v: 1 }, { k: 1, v: 2 }])) }]); + skillIdToBullet = $makeMap($Int.keyFor, [{ k: 1, v: new MeleeBullet.ptr(new Bullet.ptr(0, 5, 10, 34, 34, 34, 12, 0, 18, 9, 8, 1, 5, 0, 0, 0, 0, 24, 32, 0)) }, { k: 2, v: new MeleeBullet.ptr(new Bullet.ptr(0, 3, 20, 34, 34, 34, 16, 0, 18, 9, 6, 1, 5, 0, 0, 0, 0, 32, 24, 300)) }]); + $pkg.DIRECTION_DECODER = new sliceType$1([new sliceType([0, 0]), new sliceType([0, 2]), new sliceType([0, -2]), new sliceType([2, 0]), new sliceType([-2, 0]), new sliceType([1, 1]), new sliceType([-1, -1]), new sliceType([1, -1]), new sliceType([-1, 1])]); + inAirSet = $makeMap($Int32.keyFor, [{ k: 4, v: true }, { k: 5, v: true }, { k: 6, v: true }, { k: 7, v: true }, { k: 8, v: true }]); + /* */ } 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, js, battle, resolv, sliceType, ptrType, sliceType$1, ptrType$1, ptrType$2, sliceType$2, ptrType$3, sliceType$3, ptrType$4, sliceType$4, ptrType$5, sliceType$5, ptrType$6, funcType, funcType$1, funcType$2, funcType$3, funcType$4, funcType$5, funcType$6, funcType$7, funcType$8, funcType$9, funcType$10, ptrType$7, funcType$11, sliceType$6, funcType$12, ptrType$8, ptrType$9, ptrType$10, mapType, mapType$1, sliceType$7, funcType$13, funcType$14, mapType$2, NewInputFrameDownsync, NewRingBufferJs, NewCollisionSpaceJs, NewVec2DJs, NewPolygon2DJs, NewBarrierJs, NewPlayerDownsyncJs, NewMeleeBulletJs, NewRoomDownsyncFrameJs, GetCollisionSpaceObjsJs, GenerateRectColliderJs, GenerateConvexPolygonColliderJs, GetCharacterConfigsOrderedByJoinIndex, ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs, main; + js = $packages["github.com/gopherjs/gopherjs/js"]; + battle = $packages["jsexport/battle"]; + resolv = $packages["resolv"]; + sliceType = $sliceType($Uint64); + ptrType = $ptrType(battle.Vec2D); + sliceType$1 = $sliceType(ptrType); + ptrType$1 = $ptrType(battle.Polygon2D); + ptrType$2 = $ptrType(battle.PlayerDownsync); + sliceType$2 = $sliceType(ptrType$2); + ptrType$3 = $ptrType(battle.MeleeBullet); + sliceType$3 = $sliceType(ptrType$3); + ptrType$4 = $ptrType(battle.FireballBullet); + sliceType$4 = $sliceType(ptrType$4); + ptrType$5 = $ptrType(js.Object); + sliceType$5 = $sliceType(ptrType$5); + ptrType$6 = $ptrType(battle.CharacterConfig); + funcType = $funcType([$Float64, $Float64], [ptrType$5], false); + funcType$1 = $funcType([ptrType, sliceType$1], [ptrType$5], false); + funcType$2 = $funcType([ptrType$1], [ptrType$5], false); + funcType$3 = $funcType([$Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Bool, $Float64], [ptrType$5], false); + funcType$4 = $funcType([$Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64], [ptrType$5], false); + funcType$5 = $funcType([$Int32, sliceType$2, sliceType$3], [ptrType$5], false); + funcType$6 = $funcType([$Int, $Int, $Int, $Int], [ptrType$5], false); + funcType$7 = $funcType([$Int32, sliceType, $Uint64], [ptrType$5], false); + funcType$8 = $funcType([$Int32], [ptrType$5], false); + funcType$9 = $funcType([$Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $emptyInterface, $String], [ptrType$5], false); + funcType$10 = $funcType([ptrType$1, $Float64, $Float64, $emptyInterface, $String], [ptrType$5], false); + ptrType$7 = $ptrType(resolv.Space); + funcType$11 = $funcType([ptrType$7], [sliceType$5], false); + sliceType$6 = $sliceType($Int); + funcType$12 = $funcType([sliceType$6], [sliceType$5], false); + ptrType$8 = $ptrType(battle.RingBuffer); + ptrType$9 = $ptrType(battle.RoomDownsyncFrame); + ptrType$10 = $ptrType(resolv.Object); + mapType = $mapType($Int32, ptrType$10); + mapType$1 = $mapType($Int, $Int); + sliceType$7 = $sliceType(ptrType$6); + funcType$13 = $funcType([ptrType$8, ptrType$9, ptrType$7, mapType, $Float64, $Float64, mapType$1, sliceType$7], [ptrType$5], false); + funcType$14 = $funcType([$Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64], [$Float64, $Float64], false); + mapType$2 = $mapType($String, $emptyInterface); + NewInputFrameDownsync = function(inputFrameId, inputList, confirmedList) { + var {$24r, _r, confirmedList, inputFrameId, inputList, $s, $r, $c} = $restore(this, {inputFrameId, inputList, confirmedList}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + _r = js.MakeFullWrapper(new battle.InputFrameDownsync.ptr(inputFrameId, inputList, confirmedList)); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + $24r = _r; + $s = 2; case 2: return $24r; + /* */ } return; } var $f = {$blk: NewInputFrameDownsync, $c: true, $r, $24r, _r, confirmedList, inputFrameId, inputList, $s};return $f; + }; + $pkg.NewInputFrameDownsync = NewInputFrameDownsync; + NewRingBufferJs = function(n) { + var {$24r, _r, n, $s, $r, $c} = $restore(this, {n}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + _r = js.MakeFullWrapper(battle.NewRingBuffer(n)); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + $24r = _r; + $s = 2; case 2: return $24r; + /* */ } return; } var $f = {$blk: NewRingBufferJs, $c: true, $r, $24r, _r, n, $s};return $f; + }; + $pkg.NewRingBufferJs = NewRingBufferJs; + NewCollisionSpaceJs = function(spaceW, spaceH, minStepW, minStepH) { + var minStepH, minStepW, spaceH, spaceW; + return js.MakeWrapper(resolv.NewSpace(spaceW, spaceH, minStepW, minStepH)); + }; + $pkg.NewCollisionSpaceJs = NewCollisionSpaceJs; + NewVec2DJs = function(x, y) { + var {$24r, _r, x, y, $s, $r, $c} = $restore(this, {x, y}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + _r = js.MakeFullWrapper(new battle.Vec2D.ptr(x, y)); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + $24r = _r; + $s = 2; case 2: return $24r; + /* */ } return; } var $f = {$blk: NewVec2DJs, $c: true, $r, $24r, _r, x, y, $s};return $f; + }; + $pkg.NewVec2DJs = NewVec2DJs; + NewPolygon2DJs = function(anchor, points) { + var {$24r, _r, anchor, points, $s, $r, $c} = $restore(this, {anchor, points}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + _r = js.MakeFullWrapper(new battle.Polygon2D.ptr(anchor, points)); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + $24r = _r; + $s = 2; case 2: return $24r; + /* */ } return; } var $f = {$blk: NewPolygon2DJs, $c: true, $r, $24r, _r, anchor, points, $s};return $f; + }; + $pkg.NewPolygon2DJs = NewPolygon2DJs; + NewBarrierJs = function(boundary) { + var boundary; + return js.MakeWrapper(new battle.Barrier.ptr(boundary)); + }; + $pkg.NewBarrierJs = NewBarrierJs; + NewPlayerDownsyncJs = function(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, framesToRecover, framesInChState, speed, battleState, characterState, joinIndex, hp, maxHp, inAir, colliderRadius) { + var battleState, characterState, colliderRadius, dirX, dirY, framesInChState, framesToRecover, hp, id, inAir, joinIndex, maxHp, speed, velX, velY, virtualGridX, virtualGridY; + return js.MakeWrapper(new battle.PlayerDownsync.ptr(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, speed, battleState, joinIndex, colliderRadius, false, 0, 0, framesToRecover, framesInChState, hp, maxHp, characterState, inAir)); + }; + $pkg.NewPlayerDownsyncJs = NewPlayerDownsyncJs; + NewMeleeBulletJs = function(battleLocalId, startupFrames, activeFrames, recoveryFrames, recoveryFramesOnBlock, recoveryFramesOnHit, hitStunFrames, blockStunFrames, releaseTriggerType, damage, offenderJoinIndex, offenderPlayerId, pushback, hitboxOffset, selfMoveforwardX, selfMoveforwardY, hitboxSizeX, hitboxSizeY) { + var activeFrames, battleLocalId, blockStunFrames, damage, hitStunFrames, hitboxOffset, hitboxSizeX, hitboxSizeY, offenderJoinIndex, offenderPlayerId, pushback, recoveryFrames, recoveryFramesOnBlock, recoveryFramesOnHit, releaseTriggerType, selfMoveforwardX, selfMoveforwardY, startupFrames; + return js.MakeWrapper(new battle.MeleeBullet.ptr(new battle.Bullet.ptr(battleLocalId, startupFrames, activeFrames, recoveryFrames, recoveryFramesOnBlock, recoveryFramesOnHit, hitboxOffset, 0, hitStunFrames, blockStunFrames, pushback, releaseTriggerType, damage, offenderJoinIndex, offenderPlayerId, selfMoveforwardX, selfMoveforwardY, hitboxSizeX, hitboxSizeY, 0))); + }; + $pkg.NewMeleeBulletJs = NewMeleeBulletJs; + NewRoomDownsyncFrameJs = function(id, playersArr, meleeBullets) { + var {$24r, _r, id, meleeBullets, playersArr, $s, $r, $c} = $restore(this, {id, playersArr, meleeBullets}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + _r = js.MakeFullWrapper(new battle.RoomDownsyncFrame.ptr(id, playersArr, new $Int64(0, 0), meleeBullets, sliceType$4.nil, new $Uint64(0, 0), false, false)); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + $24r = _r; + $s = 2; case 2: return $24r; + /* */ } return; } var $f = {$blk: NewRoomDownsyncFrameJs, $c: true, $r, $24r, _r, id, meleeBullets, playersArr, $s};return $f; + }; + $pkg.NewRoomDownsyncFrameJs = NewRoomDownsyncFrameJs; + GetCollisionSpaceObjsJs = function(space) { + var {_i, _r, _ref, obj, objs, ret, space, $s, $r, $c} = $restore(this, {space}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + objs = space.Objects(); + ret = $makeSlice(sliceType$5, 0, objs.$length); + _ref = objs; + _i = 0; + /* while (true) { */ case 1: + /* if (!(_i < _ref.$length)) { break; } */ if(!(_i < _ref.$length)) { $s = 2; continue; } + obj = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + _r = js.MakeFullWrapper(obj); /* */ $s = 3; case 3: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + ret = $append(ret, _r); + _i++; + $s = 1; continue; + case 2: + $s = -1; return ret; + /* */ } return; } var $f = {$blk: GetCollisionSpaceObjsJs, $c: true, $r, _i, _r, _ref, obj, objs, ret, space, $s};return $f; + }; + $pkg.GetCollisionSpaceObjsJs = GetCollisionSpaceObjsJs; + GenerateRectColliderJs = function(wx, wy, w, h, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, data, tag) { + var {$24r, _r, _r$1, bottomPadding, data, h, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, tag, topPadding, w, wx, wy, $s, $r, $c} = $restore(this, {wx, wy, w, h, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, data, tag}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + _r = battle.GenerateRectCollider(wx, wy, w, h, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, data, tag); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + _r$1 = js.MakeFullWrapper(_r); /* */ $s = 2; case 2: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } + $24r = _r$1; + $s = 3; case 3: return $24r; + /* */ } return; } var $f = {$blk: GenerateRectColliderJs, $c: true, $r, $24r, _r, _r$1, bottomPadding, data, h, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, tag, topPadding, w, wx, wy, $s};return $f; + }; + $pkg.GenerateRectColliderJs = GenerateRectColliderJs; + GenerateConvexPolygonColliderJs = function(unalignedSrc, spaceOffsetX, spaceOffsetY, data, tag) { + var {$24r, _r, _r$1, data, spaceOffsetX, spaceOffsetY, tag, unalignedSrc, $s, $r, $c} = $restore(this, {unalignedSrc, spaceOffsetX, spaceOffsetY, data, tag}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + _r = battle.GenerateConvexPolygonCollider(unalignedSrc, spaceOffsetX, spaceOffsetY, data, tag); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + _r$1 = js.MakeFullWrapper(_r); /* */ $s = 2; case 2: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } + $24r = _r$1; + $s = 3; case 3: return $24r; + /* */ } return; } var $f = {$blk: GenerateConvexPolygonColliderJs, $c: true, $r, $24r, _r, _r$1, data, spaceOffsetX, spaceOffsetY, tag, unalignedSrc, $s};return $f; + }; + $pkg.GenerateConvexPolygonColliderJs = GenerateConvexPolygonColliderJs; + GetCharacterConfigsOrderedByJoinIndex = function(speciesIdList) { + var {_entry, _i, _r, _ref, i, ret, speciesId, speciesIdList, $s, $r, $c} = $restore(this, {speciesIdList}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + ret = $makeSlice(sliceType$5, speciesIdList.$length, speciesIdList.$length); + _ref = speciesIdList; + _i = 0; + /* while (true) { */ case 1: + /* if (!(_i < _ref.$length)) { break; } */ if(!(_i < _ref.$length)) { $s = 2; continue; } + i = _i; + speciesId = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + _r = js.MakeFullWrapper((_entry = battle.Characters[$Int.keyFor(speciesId)], _entry !== undefined ? _entry.v : ptrType$6.nil)); /* */ $s = 3; case 3: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + ((i < 0 || i >= ret.$length) ? ($throwRuntimeError("index out of range"), undefined) : ret.$array[ret.$offset + i] = _r); + _i++; + $s = 1; continue; + case 2: + $s = -1; return ret; + /* */ } return; } var $f = {$blk: GetCharacterConfigsOrderedByJoinIndex, $c: true, $r, _entry, _i, _r, _ref, i, ret, speciesId, speciesIdList, $s};return $f; + }; + $pkg.GetCharacterConfigsOrderedByJoinIndex = GetCharacterConfigsOrderedByJoinIndex; + ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs = function(inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, playerOpPatternToSkillId, chConfigsOrderedByJoinIndex) { + var {$24r, _r, _r$1, chConfigsOrderedByJoinIndex, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currRenderFrame, inputsBuffer, playerOpPatternToSkillId, $s, $r, $c} = $restore(this, {inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, playerOpPatternToSkillId, chConfigsOrderedByJoinIndex}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + _r = battle.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, playerOpPatternToSkillId, chConfigsOrderedByJoinIndex); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + _r$1 = js.MakeFullWrapper(_r); /* */ $s = 2; case 2: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } + $24r = _r$1; + $s = 3; case 3: return $24r; + /* */ } return; } var $f = {$blk: ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs, $c: true, $r, $24r, _r, _r$1, chConfigsOrderedByJoinIndex, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currRenderFrame, inputsBuffer, playerOpPatternToSkillId, $s};return $f; + }; + $pkg.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs = ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs; + main = function() { + $global.gopkgs = $externalize($makeMap($String.keyFor, [{ k: "NewVec2DJs", v: new funcType(NewVec2DJs) }, { k: "NewPolygon2DJs", v: new funcType$1(NewPolygon2DJs) }, { k: "NewBarrierJs", v: new funcType$2(NewBarrierJs) }, { k: "NewPlayerDownsyncJs", v: new funcType$3(NewPlayerDownsyncJs) }, { k: "NewMeleeBulletJs", v: new funcType$4(NewMeleeBulletJs) }, { k: "NewRoomDownsyncFrameJs", v: new funcType$5(NewRoomDownsyncFrameJs) }, { k: "NewCollisionSpaceJs", v: new funcType$6(NewCollisionSpaceJs) }, { k: "NewInputFrameDownsync", v: new funcType$7(NewInputFrameDownsync) }, { k: "NewRingBufferJs", v: new funcType$8(NewRingBufferJs) }, { k: "GenerateRectColliderJs", v: new funcType$9(GenerateRectColliderJs) }, { k: "GenerateConvexPolygonColliderJs", v: new funcType$10(GenerateConvexPolygonColliderJs) }, { k: "GetCollisionSpaceObjsJs", v: new funcType$11(GetCollisionSpaceObjsJs) }, { k: "GetCharacterConfigsOrderedByJoinIndex", v: new funcType$12(GetCharacterConfigsOrderedByJoinIndex) }, { k: "ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs", v: new funcType$13(ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs) }, { k: "WorldToPolygonColliderBLPos", v: new funcType$14(battle.WorldToPolygonColliderBLPos) }, { k: "PolygonColliderBLToWorldPos", v: new funcType$14(battle.PolygonColliderBLToWorldPos) }]), mapType$2); + }; + $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 = js.$init(); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + $r = battle.$init(); /* */ $s = 2; case 2: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + $r = resolv.$init(); /* */ $s = 3; case 3: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + if ($pkg === $mainPkg) { + main(); + $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/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..06ab839 --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/Atk1.anim @@ -0,0 +1,49 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "Atk1", + "_objFlags": 0, + "_native": "", + "_duration": 0.36666666666666664, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "a5615ed4-d055-4db5-b924-4c8d8b2d926f" + } + }, + { + "frame": 0.03333333333333333, + "value": { + "__uuid__": "12b90556-58b9-4311-b5d9-820fb76d659b" + } + }, + { + "frame": 0.11666666666666667, + "value": { + "__uuid__": "72bc74a1-6e8c-48bb-9ab2-9b8f502ceffb" + } + }, + { + "frame": 0.31666666666666665, + "value": { + "__uuid__": "7e619896-100d-4903-b256-e30ddb5ad397" + } + }, + { + "frame": 0.35, + "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/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..771e272 --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist @@ -0,0 +1,1211 @@ + + + + + frames + + Atk1_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {62,92} + spriteSourceSize + {62,92} + textureRect + {{777,282},{62,92}} + textureRotated + + + Atk1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {77,99} + spriteSourceSize + {77,99} + textureRect + {{409,214},{77,99}} + textureRotated + + + Atk1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,99} + spriteSourceSize + {112,99} + textureRect + {{184,114},{112,99}} + textureRotated + + + Atk1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,100} + spriteSourceSize + {96,100} + textureRect + {{388,327},{96,100}} + textureRotated + + + Atk1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {62,92} + spriteSourceSize + {62,92} + textureRect + {{777,282},{62,92}} + textureRotated + + + Atked1_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {62,97} + spriteSourceSize + {62,97} + textureRect + {{419,106},{62,97}} + textureRotated + + + Atked1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {73,95} + spriteSourceSize + {73,95} + textureRect + {{727,478},{73,95}} + textureRotated + + + Atked1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {90,89} + spriteSourceSize + {90,89} + textureRect + {{800,472},{90,89}} + textureRotated + + + BlownUp1_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {95,80} + spriteSourceSize + {95,80} + textureRect + {{555,193},{95,80}} + textureRotated + + + BlownUp1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,95} + spriteSourceSize + {80,95} + textureRect + {{554,290},{80,95}} + textureRotated + + + BlownUp1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {83,92} + spriteSourceSize + {83,92} + textureRect + {{748,378},{83,92}} + textureRotated + + + BlownUp1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {92,83} + spriteSourceSize + {92,83} + textureRect + {{900,58},{92,83}} + textureRotated + + + GetUp1_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,45} + spriteSourceSize + {112,45} + textureRect + {{259,0},{112,45}} + textureRotated + + + GetUp1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {88,69} + spriteSourceSize + {88,69} + textureRect + {{919,318},{88,69}} + textureRotated + + + GetUp1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {91,90} + spriteSourceSize + {91,90} + textureRect + {{832,188},{91,90}} + textureRotated + + + GetUp1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {120,93} + spriteSourceSize + {120,93} + textureRect + {{62,248},{120,93}} + textureRotated + + + GetUp1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {100,112} + spriteSourceSize + {100,112} + textureRect + {{155,233},{100,112}} + textureRotated + + + GetUp1_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {106,93} + spriteSourceSize + {106,93} + textureRect + {{316,221},{106,93}} + textureRotated + + + GetUp1_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {106,79} + spriteSourceSize + {106,79} + textureRect + {{340,108},{106,79}} + textureRotated + + + GetUp1_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {73,87} + spriteSourceSize + {73,87} + textureRect + {{922,231},{73,87}} + textureRotated + + + GetUp1_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {67,90} + spriteSourceSize + {67,90} + textureRect + {{889,472},{67,90}} + textureRotated + + + GetUp1_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {58,97} + spriteSourceSize + {58,97} + textureRect + {{433,0},{58,97}} + textureRotated + + + Idle1_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {58,95} + spriteSourceSize + {58,95} + textureRect + {{685,95},{58,95}} + textureRotated + + + Idle1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {58,97} + spriteSourceSize + {58,97} + textureRect + {{481,97},{58,97}} + textureRotated + + + Idle1_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {60,94} + spriteSourceSize + {60,94} + textureRect + {{772,188},{60,94}} + textureRotated + + + Idle1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {58,97} + spriteSourceSize + {58,97} + textureRect + {{491,0},{58,97}} + textureRotated + + + Idle1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {58,97} + spriteSourceSize + {58,97} + textureRect + {{399,427},{58,97}} + textureRotated + + + Idle1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {60,95} + spriteSourceSize + {60,95} + textureRect + {{635,191},{60,95}} + textureRotated + + + Idle1_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {60,94} + spriteSourceSize + {60,94} + textureRect + {{818,94},{60,94}} + textureRotated + + + Idle1_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {59,93} + spriteSourceSize + {59,93} + textureRect + {{609,480},{59,93}} + textureRotated + + + Idle1_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {58,93} + spriteSourceSize + {58,93} + textureRect + {{900,0},{58,93}} + textureRotated + + + Idle1_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {59,93} + spriteSourceSize + {59,93} + textureRect + {{668,480},{59,93}} + textureRotated + + + Idle1_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {60,94} + spriteSourceSize + {60,94} + textureRect + {{840,0},{60,94}} + textureRotated + + + InAirAtk1_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {77,68} + spriteSourceSize + {77,68} + textureRect + {{532,505},{77,68}} + textureRotated + + + InAirAtk1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {118,76} + spriteSourceSize + {118,76} + textureRect + {{64,0},{118,76}} + textureRotated + + + InAirAtk1_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {104,65} + spriteSourceSize + {104,65} + textureRect + {{267,442},{104,65}} + textureRotated + + + InAirAtk1_11.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,66} + spriteSourceSize + {80,66} + textureRect + {{839,279},{80,66}} + textureRotated + + + InAirAtk1_12.png + + aliases + + spriteOffset + {0,0} + spriteSize + {102,67} + spriteSourceSize + {102,67} + textureRect + {{332,431},{102,67}} + textureRotated + + + InAirAtk1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {79,66} + spriteSourceSize + {79,66} + textureRect + {{839,345},{79,66}} + textureRotated + + + InAirAtk1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {124,64} + spriteSourceSize + {124,64} + textureRect + {{0,0},{124,64}} + textureRotated + + + InAirAtk1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {104,64} + spriteSourceSize + {104,64} + textureRect + {{324,327},{104,64}} + textureRotated + + + InAirAtk1_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {79,61} + spriteSourceSize + {79,61} + textureRect + {{831,411},{79,61}} + textureRotated + + + InAirAtk1_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {124,64} + spriteSourceSize + {124,64} + textureRect + {{0,124},{124,64}} + textureRotated + + + InAirAtk1_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {106,67} + spriteSourceSize + {106,67} + textureRect + {{366,0},{106,67}} + textureRotated + + + InAirAtk1_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {79,66} + spriteSourceSize + {79,66} + textureRect + {{918,406},{79,66}} + textureRotated + + + InAirAtk1_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {118,64} + spriteSourceSize + {118,64} + textureRect + {{64,118},{118,64}} + textureRotated + + + InAirIdle1_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {71,119} + spriteSourceSize + {71,119} + textureRect + {{66,368},{71,119}} + textureRotated + + + InAirIdle1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {71,119} + spriteSourceSize + {71,119} + textureRect + {{137,368},{71,119}} + textureRotated + + + InAirIdle1_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {55,114} + spriteSourceSize + {55,114} + textureRect + {{140,0},{55,114}} + textureRotated + + + InAirIdle1_11.png + + aliases + + spriteOffset + {0,0} + spriteSize + {62,124} + spriteSourceSize + {62,124} + textureRect + {{0,248},{62,124}} + textureRotated + + + InAirIdle1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {74,90} + spriteSourceSize + {74,90} + textureRect + {{922,141},{74,90}} + textureRotated + + + InAirIdle1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {110,54} + spriteSourceSize + {110,54} + textureRect + {{208,345},{110,54}} + textureRotated + + + InAirIdle1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {85,88} + spriteSourceSize + {85,88} + textureRect + {{95,487},{85,88}} + textureRotated + + + InAirIdle1_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {64,112} + spriteSourceSize + {64,112} + textureRect + {{195,0},{64,112}} + textureRotated + + + InAirIdle1_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {62,107} + spriteSourceSize + {62,107} + textureRect + {{262,335},{62,107}} + textureRotated + + + InAirIdle1_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {85,84} + spriteSourceSize + {85,84} + textureRect + {{183,487},{85,84}} + textureRotated + + + InAirIdle1_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {109,61} + spriteSourceSize + {109,61} + textureRect + {{255,226},{109,61}} + textureRotated + + + InAirIdle1_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {78,95} + spriteSourceSize + {78,95} + textureRect + {{0,495},{78,95}} + textureRotated + + + LayDown1_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {115,56} + spriteSourceSize + {115,56} + textureRect + {{128,118},{115,56}} + textureRotated + + + LayDown1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {109,57} + spriteSourceSize + {109,57} + textureRect + {{283,112},{109,57}} + textureRotated + + + LayDown1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {108,62} + spriteSourceSize + {108,62} + textureRect + {{304,0},{108,62}} + textureRotated + + + LayDown1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {123,36} + spriteSourceSize + {123,36} + textureRect + {{0,372},{123,36}} + textureRotated + + + LayDown1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {123,30} + spriteSourceSize + {123,30} + textureRect + {{36,372},{123,30}} + textureRotated + + + Walking_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {78,95} + spriteSourceSize + {78,95} + textureRect + {{607,96},{78,95}} + textureRotated + + + Walking_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {75,96} + spriteSourceSize + {75,96} + textureRect + {{457,427},{75,96}} + textureRotated + + + Walking_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {65,96} + spriteSourceSize + {65,96} + textureRect + {{549,0},{65,96}} + textureRotated + + + Walking_11.png + + aliases + + spriteOffset + {0,0} + spriteSize + {65,96} + spriteSourceSize + {65,96} + textureRect + {{532,409},{65,96}} + textureRotated + + + Walking_12.png + + aliases + + spriteOffset + {0,0} + spriteSize + {74,95} + spriteSourceSize + {74,95} + textureRect + {{634,288},{74,95}} + textureRotated + + + Walking_13.png + + aliases + + spriteOffset + {0,0} + spriteSize + {75,94} + spriteSourceSize + {75,94} + textureRect + {{743,94},{75,94}} + textureRotated + + + Walking_14.png + + aliases + + spriteOffset + {0,0} + spriteSize + {70,94} + spriteSourceSize + {70,94} + textureRect + {{770,0},{70,94}} + textureRotated + + + Walking_15.png + + aliases + + spriteOffset + {0,0} + spriteSize + {78,94} + spriteSourceSize + {78,94} + textureRect + {{692,0},{78,94}} + textureRotated + + + Walking_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {69,96} + spriteSourceSize + {69,96} + textureRect + {{486,194},{69,96}} + textureRotated + + + Walking_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {70,96} + spriteSourceSize + {70,96} + textureRect + {{484,313},{70,96}} + textureRotated + + + Walking_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {78,95} + spriteSourceSize + {78,95} + textureRect + {{614,0},{78,95}} + textureRotated + + + Walking_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {77,95} + spriteSourceSize + {77,95} + textureRect + {{597,385},{77,95}} + textureRotated + + + Walking_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {69,94} + spriteSourceSize + {69,94} + textureRect + {{708,284},{69,94}} + textureRotated + + + Walking_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {77,94} + spriteSourceSize + {77,94} + textureRect + {{695,190},{77,94}} + textureRotated + + + Walking_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {74,95} + spriteSourceSize + {74,95} + textureRect + {{674,383},{74,95}} + textureRotated + + + Walking_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {68,96} + spriteSourceSize + {68,96} + textureRect + {{539,97},{68,96}} + textureRotated + + + + metadata + + format + 3 + pixelFormat + RGBA8888 + premultiplyAlpha + + realTextureFileName + MonkGirl.png + size + {997,573} + smartupdate + $TexturePacker:SmartUpdate:6bd11d0c92774f15794781ac24a65022:8606ee60ad6f31ae3d83c8f9fd35f0b6: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..1ee2958 --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist.meta @@ -0,0 +1,1750 @@ +{ + "ver": "1.2.4", + "uuid": "725c90f9-56f8-48ea-9159-4d2949cd3ce0", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "size": { + "width": 997, + "height": 573 + }, + "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": 777, + "trimY": 282, + "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": 409, + "trimY": 214, + "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": 184, + "trimY": 114, + "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": 388, + "trimY": 327, + "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": 777, + "trimY": 282, + "width": 62, + "height": 92, + "rawWidth": 62, + "rawHeight": 92, + "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": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 419, + "trimY": 106, + "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": 727, + "trimY": 478, + "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": 800, + "trimY": 472, + "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": 555, + "trimY": 193, + "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": 554, + "trimY": 290, + "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": 748, + "trimY": 378, + "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": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 900, + "trimY": 58, + "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": 259, + "trimY": 0, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 919, + "trimY": 318, + "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": 832, + "trimY": 188, + "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": 62, + "trimY": 248, + "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": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 155, + "trimY": 233, + "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": 316, + "trimY": 221, + "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": 340, + "trimY": 108, + "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": 922, + "trimY": 231, + "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": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 889, + "trimY": 472, + "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": 433, + "trimY": 0, + "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": 685, + "trimY": 95, + "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": 481, + "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": 772, + "trimY": 188, + "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": 491, + "trimY": 0, + "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": 399, + "trimY": 427, + "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": 635, + "trimY": 191, + "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": 818, + "trimY": 94, + "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": 609, + "trimY": 480, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 900, + "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": 668, + "trimY": 480, + "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": 840, + "trimY": 0, + "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": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 532, + "trimY": 505, + "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": 64, + "trimY": 0, + "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": 267, + "trimY": 442, + "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": 839, + "trimY": 279, + "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": 332, + "trimY": 431, + "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": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 839, + "trimY": 345, + "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": 0, + "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": 324, + "trimY": 327, + "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": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 831, + "trimY": 411, + "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": 0, + "trimY": 124, + "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": 366, + "trimY": 0, + "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": 918, + "trimY": 406, + "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": 64, + "trimY": 118, + "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": 66, + "trimY": 368, + "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": 137, + "trimY": 368, + "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": 140, + "trimY": 0, + "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": 0, + "trimY": 248, + "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": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 922, + "trimY": 141, + "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": 208, + "trimY": 345, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 95, + "trimY": 487, + "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": 195, + "trimY": 0, + "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": 262, + "trimY": 335, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 183, + "trimY": 487, + "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": 255, + "trimY": 226, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 495, + "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": 128, + "trimY": 118, + "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": 283, + "trimY": 112, + "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": 304, + "trimY": 0, + "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": 0, + "trimY": 372, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 36, + "trimY": 372, + "width": 123, + "height": 30, + "rawWidth": 123, + "rawHeight": 30, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_0.png": { + "ver": "1.0.4", + "uuid": "95e3dc3c-ee98-4ae8-899f-3d6539a649cb", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 607, + "trimY": 96, + "width": 78, + "height": 95, + "rawWidth": 78, + "rawHeight": 95, + "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": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 457, + "trimY": 427, + "width": 75, + "height": 96, + "rawWidth": 75, + "rawHeight": 96, + "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": 549, + "trimY": 0, + "width": 65, + "height": 96, + "rawWidth": 65, + "rawHeight": 96, + "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": 532, + "trimY": 409, + "width": 65, + "height": 96, + "rawWidth": 65, + "rawHeight": 96, + "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": 634, + "trimY": 288, + "width": 74, + "height": 95, + "rawWidth": 74, + "rawHeight": 95, + "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": 743, + "trimY": 94, + "width": 75, + "height": 94, + "rawWidth": 75, + "rawHeight": 94, + "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": 770, + "trimY": 0, + "width": 70, + "height": 94, + "rawWidth": 70, + "rawHeight": 94, + "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": 692, + "trimY": 0, + "width": 78, + "height": 94, + "rawWidth": 78, + "rawHeight": 94, + "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": 486, + "trimY": 194, + "width": 69, + "height": 96, + "rawWidth": 69, + "rawHeight": 96, + "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": 484, + "trimY": 313, + "width": 70, + "height": 96, + "rawWidth": 70, + "rawHeight": 96, + "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": 614, + "trimY": 0, + "width": 78, + "height": 95, + "rawWidth": 78, + "rawHeight": 95, + "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": 597, + "trimY": 385, + "width": 77, + "height": 95, + "rawWidth": 77, + "rawHeight": 95, + "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": 708, + "trimY": 284, + "width": 69, + "height": 94, + "rawWidth": 69, + "rawHeight": 94, + "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": 695, + "trimY": 190, + "width": 77, + "height": 94, + "rawWidth": 77, + "rawHeight": 94, + "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": 674, + "trimY": 383, + "width": 74, + "height": 95, + "rawWidth": 74, + "rawHeight": 95, + "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": 539, + "trimY": 97, + "width": 68, + "height": 96, + "rawWidth": 68, + "rawHeight": 96, + "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 0000000000000000000000000000000000000000..4a3db48cd0f0e6ac106a2832b73a180e8cf6dcea GIT binary patch literal 76232 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 M07*qoM6N<$f_Ba+f&c&j literal 0 HcmV?d00001 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..4b11534 --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/Walking.anim @@ -0,0 +1,115 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "Walking", + "_objFlags": 0, + "_native": "", + "_duration": 0.26666666666666666, + "sample": 60, + "speed": 0.25, + "wrapMode": 2, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "275387d0-70fd-47f5-b82e-14165a14c45a" + } + }, + { + "frame": 0.016666666666666666, + "value": { + "__uuid__": "95e3dc3c-ee98-4ae8-899f-3d6539a649cb" + } + }, + { + "frame": 0.03333333333333333, + "value": { + "__uuid__": "7515ef50-3a14-4e58-8811-a0c890fc40f3" + } + }, + { + "frame": 0.05, + "value": { + "__uuid__": "fa3d6703-1cfc-4f40-b61e-7ebf0fdac56a" + } + }, + { + "frame": 0.06666666666666667, + "value": { + "__uuid__": "37eea7f3-5a1d-4172-be38-9b492399ef44" + } + }, + { + "frame": 0.08333333333333333, + "value": { + "__uuid__": "0e2ad2ed-2b21-4e14-9607-5a341d9ed7e4" + } + }, + { + "frame": 0.1, + "value": { + "__uuid__": "e1625aba-a6fc-4883-a696-2d9d56d3050d" + } + }, + { + "frame": 0.11666666666666667, + "value": { + "__uuid__": "86f805a2-a27c-4c96-8e11-acc448b0bdd0" + } + }, + { + "frame": 0.13333333333333333, + "value": { + "__uuid__": "63bcaa39-1cc5-461f-a175-0d7a0abd3510" + } + }, + { + "frame": 0.15, + "value": { + "__uuid__": "691383d5-9199-4bd5-9803-403216331d7f" + } + }, + { + "frame": 0.16666666666666666, + "value": { + "__uuid__": "602818c2-1242-4a24-87ba-77f6accccbc3" + } + }, + { + "frame": 0.18333333333333332, + "value": { + "__uuid__": "650b8ccb-2a82-4972-bb5b-79a2cb4a3503" + } + }, + { + "frame": 0.2, + "value": { + "__uuid__": "b264bcc2-71c7-45a6-8c94-be049bb0d163" + } + }, + { + "frame": 0.21666666666666667, + "value": { + "__uuid__": "a75af05e-3b54-45d8-b7ad-cbcf2b65b2a9" + } + }, + { + "frame": 0.23333333333333334, + "value": { + "__uuid__": "3e2e26f7-007a-4130-8d90-154dfcde96d3" + } + }, + { + "frame": 0.25, + "value": { + "__uuid__": "9cf71d99-7262-4a6c-8c27-06167d841a24" + } + } + ] + } + } + }, + "events": [] +} \ 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/pbfiles/room_downsync_frame.proto b/frontend/assets/resources/pbfiles/room_downsync_frame.proto index f8cc68c..83df929 100644 --- a/frontend/assets/resources/pbfiles/room_downsync_frame.proto +++ b/frontend/assets/resources/pbfiles/room_downsync_frame.proto @@ -24,10 +24,11 @@ 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 - string name = 20; - string displayName = 21; - string avatar = 22; + string name = 997; + string displayName = 998; + string avatar = 999; } message InputFrameDecoded { diff --git a/frontend/assets/resources/prefabs/ControlledCharacter.prefab b/frontend/assets/resources/prefabs/ControlledCharacter.prefab index 07979d3..861ecbe 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__": 27 }, { - "__id__": 24 + "__id__": 28 } ], "_prefab": { - "__id__": 25 + "__id__": 29 }, "_opacity": 255, "_color": { @@ -493,12 +493,15 @@ }, { "__id__": 18 + }, + { + "__id__": 22 } ], "_active": true, "_components": [], "_prefab": { - "__id__": 22 + "__id__": 26 }, "_opacity": 255, "_color": { @@ -922,6 +925,163 @@ "fileId": "17JdhftghBYr81MfV9i6cy", "sync": false }, + { + "__type__": "cc.Node", + "_name": "MonkGirl", + "_objFlags": 0, + "_parent": { + "__id__": 11 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 23 + }, + { + "__id__": 24 + } + ], + "_prefab": { + "__id__": 25 + }, + "_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.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0.7, + 0.7, + 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__": 22 + }, + "_enabled": true, + "_defaultClip": null, + "_clips": [ + { + "__uuid__": "a0d8b9a6-7bf7-4cf5-aecb-54b2908cbfb3" + }, + { + "__uuid__": "768d591b-4467-4a8f-95bf-4f7fcc3835b6" + }, + { + "__uuid__": "c3d4f508-b3a9-4deb-b2d1-8ddc7bf22e0c" + }, + { + "__uuid__": "1ec27664-cd2a-4c7a-838f-953a7713ceca" + }, + { + "__uuid__": "996c218a-9e18-441e-b0f8-e61c5c991b9e" + }, + { + "__uuid__": "170bbc56-3cff-4a81-b48f-a037b9418758" + }, + { + "__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" + } + ], + "playOnLoad": false, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 22 + }, + "_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__": "725c90f9-56f8-48ea-9159-4d2949cd3ce0" + }, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__uuid__": "59bff7a2-23e1-4d69-bce7-afb37eae196a" + }, + "fileId": "6cGpRwF5ZPjpJdtoqbrnta", + "sync": false + }, { "__type__": "cc.PrefabInfo", "root": { diff --git a/frontend/assets/scenes/login.fire b/frontend/assets/scenes/login.fire index 9d76136..d408e2a 100644 --- a/frontend/assets/scenes/login.fire +++ b/frontend/assets/scenes/login.fire @@ -440,7 +440,7 @@ "array": [ 0, 0, - 216.6771387800957, + 216.50135522089343, 0, 0, 0, diff --git a/frontend/assets/scripts/AttackingCharacter.js b/frontend/assets/scripts/AttackingCharacter.js index 04290eb..4d432e6 100644 --- a/frontend/assets/scripts/AttackingCharacter.js +++ b/frontend/assets/scripts/AttackingCharacter.js @@ -5,33 +5,15 @@ 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"], + GetUp1: [10, "GetUp1"], }; -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 +22,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,11 +68,11 @@ 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 @@ -117,29 +105,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 +132,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..e962c68 100644 --- a/frontend/assets/scripts/Map.js +++ b/frontend/assets/scripts/Map.js @@ -590,7 +590,7 @@ 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.speed, pbPlayer.battleState, pbPlayer.characterState, pbPlayer.joinIndex, pbPlayer.hp, pbPlayer.maxHp, pbPlayer.inAir, pbPlayer.colliderRadius); jsPlayersArr[k] = jsPlayer; } const jsMeleeBulletsArr = []; @@ -638,6 +638,7 @@ 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.chConfigsOrderedByJoinIndex = gopkgs.GetCharacterConfigsOrderedByJoinIndex(pbRdf.speciesIdList); self.playerOpPatternToSkillId = pbRdf.playerOpPatternToSkillId; self._initPlayerRichInfoDict(rdf.PlayersArr); @@ -694,18 +695,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; }, @@ -1063,12 +1065,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 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 @@ -1104,7 +1107,7 @@ 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.playerOpPatternToSkillId, self.chConfigsOrderedByJoinIndex); if (true == isChasing) { // [WARNING] Move the cursor "self.chaserRenderFrameId" when "true == isChasing", keep in mind that "self.chaserRenderFrameId" is not monotonic! diff --git a/frontend/assets/scripts/OfflineMap.js b/frontend/assets/scripts/OfflineMap.js index 1959b32..3e9f9da 100644 --- a/frontend/assets/scripts/OfflineMap.js +++ b/frontend/assets/scripts/OfflineMap.js @@ -40,13 +40,13 @@ cc.Class({ self.rollbackEstimatedDtNanos = 16666666; self.tooFastDtIntervalMillis = 0.5 * self.rollbackEstimatedDtMillis; - self.worldToVirtualGridRatio = 1000; + self.worldToVirtualGridRatio = 100; 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; + const playerOpPatternToSkillId = {}; + playerOpPatternToSkillId[opJoinIndexPrefix1 + 0] = 1; + playerOpPatternToSkillId[opJoinIndexPrefix1 + 1] = 2; /* [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 -> ..." @@ -152,7 +152,7 @@ cc.Class({ virtualGridY: boundaryObjs.playerStartingPositions[0].y * self.worldToVirtualGridRatio, speed: 1 * self.worldToVirtualGridRatio, colliderRadius: 12, - characterState: window.ATK_CHARACTER_STATE.InAirIdle1[0], + characterState: window.ATK_CHARACTER_STATE.InAirIdle1NoJump[0], framesToRecover: 0, dirX: 0, dirY: 0, @@ -160,22 +160,9 @@ cc.Class({ velY: 0, inAir: true, }), - 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], - framesToRecover: 0, - dirX: 0, - dirY: 0, - velX: 0, - velY: 0, - inAir: true, - }), - ] + ], + speciesIdList: [0], + playerOpPatternToSkillId: playerOpPatternToSkillId, }); self.selfPlayerInfo = { @@ -221,4 +208,48 @@ cc.Class({ } }, + spawnPlayerNode(joinIndex, vx, vy, playerDownsyncInfo) { + const self = this; + const newPlayerNode = cc.instantiate(self.controlledCharacterPrefab) + const playerScriptIns = newPlayerNode.getComponent("ControlledCharacter"); + if (1 == joinIndex) { + playerScriptIns.setSpecies("MonkGirl"); + } else if (2 == joinIndex) { + playerScriptIns.setSpecies("UltramanTiga"); + } + + const [wx, wy] = self.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}`); + + safelyAddChild(self.node, newPlayerNode); + setLocalZOrder(newPlayerNode, 5); + + newPlayerNode.active = true; + playerScriptIns.updateCharacterAnim(playerDownsyncInfo, null, true); + + return [newPlayerNode, playerScriptIns]; + }, }); 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..3ee05c7 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,7 @@ $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 {string|null} [name] PlayerDownsync name * @property {string|null} [displayName] PlayerDownsync displayName * @property {string|null} [avatar] PlayerDownsync avatar @@ -1382,6 +1383,14 @@ $root.protos = (function() { */ PlayerDownsync.prototype.inAir = false; + /** + * PlayerDownsync framesInChState. + * @member {number} framesInChState + * @memberof protos.PlayerDownsync + * @instance + */ + PlayerDownsync.prototype.framesInChState = 0; + /** * PlayerDownsync name. * @member {string} name @@ -1468,12 +1477,14 @@ $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.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; }; @@ -1585,14 +1596,18 @@ $root.protos = (function() { break; } case 20: { + message.framesInChState = reader.int32(); + break; + } + case 997: { message.name = reader.string(); break; } - case 21: { + case 998: { message.displayName = reader.string(); break; } - case 22: { + case 999: { message.avatar = reader.string(); break; } @@ -1688,6 +1703,9 @@ $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.name != null && message.hasOwnProperty("name")) if (!$util.isString(message.name)) return "name: string expected"; @@ -1750,6 +1768,8 @@ $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.name != null) message.name = String(object.name); if (object.displayName != null) @@ -1792,6 +1812,7 @@ $root.protos = (function() { object.maxHp = 0; object.characterState = 0; object.inAir = false; + object.framesInChState = 0; object.name = ""; object.displayName = ""; object.avatar = ""; @@ -1834,6 +1855,8 @@ $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.name != null && message.hasOwnProperty("name")) object.name = message.name; if (message.displayName != null && message.hasOwnProperty("displayName")) diff --git a/jsexport/battle/battle.go b/jsexport/battle/battle.go index 8d9aee4..f26d8c1 100644 --- a/jsexport/battle/battle.go +++ b/jsexport/battle/battle.go @@ -13,6 +13,19 @@ const ( 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) + NST_DELAY_FRAMES = int32(16) + INPUT_SCALE_FRAMES = uint32(2) + + SNAP_INTO_PLATFORM_OVERLAP = float64(0.1) + SNAP_INTO_PLATFORM_THRESHOLD = float64(0.5) ) // These directions are chosen such that when speed is changed to "(speedX+delta, speedY+delta)" for any of them, the direction is unchanged. @@ -28,42 +41,28 @@ 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) ) +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, +} + func ConvertToInputFrameId(renderFrameId int32, inputDelayFrames int32, inputScaleFrames uint32) int32 { if renderFrameId < inputDelayFrames { return 0 @@ -351,22 +350,18 @@ func deriveOpPattern(currPlayerDownsync, thatPlayerInNextFrame *PlayerDownsync, } 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 { + if _, existent := inAirSet[currPlayerDownsync.CharacterState]; !existent { jumpedOrNot = true } } patternId := PATTERN_ID_NO_OP if decodedInput.BtnALevel > prevBtnALevel { - patternId = 0 + if currPlayerDownsync.InAir { + patternId = 1 + } else { + patternId = 0 + } effDx, effDy = 0, 0 // Most patterns/skills should not allow simultaneous movement } @@ -374,7 +369,7 @@ func deriveOpPattern(currPlayerDownsync, thatPlayerInNextFrame *PlayerDownsync, } // [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, playerOpPatternToSkillId map[int]int, chConfigsOrderedByJoinIndex []*CharacterConfig) *RoomDownsyncFrame { // [WARNING] On backend this function MUST BE called while "InputsBufferLock" is locked! roomCapacity := len(currRenderFrame.PlayersArr) nextRenderFramePlayers := make([]*PlayerDownsync, roomCapacity) @@ -395,9 +390,10 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer Score: currPlayerDownsync.Score, Removed: currPlayerDownsync.Removed, JoinIndex: currPlayerDownsync.JoinIndex, - FramesToRecover: currPlayerDownsync.FramesToRecover - 1, Hp: currPlayerDownsync.Hp, MaxHp: currPlayerDownsync.MaxHp, + FramesToRecover: currPlayerDownsync.FramesToRecover - 1, + FramesInChState: currPlayerDownsync.FramesInChState + 1, } if nextRenderFramePlayers[i].FramesToRecover < 0 { nextRenderFramePlayers[i].FramesToRecover = 0 @@ -407,18 +403,20 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer 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 thatPlayerInNextFrame := nextRenderFramePlayers[i] - patternId, jumpedOrNot, effDx, effDy := deriveOpPattern(currPlayerDownsync, thatPlayerInNextFrame, currRenderFrame, inputsBuffer, inputDelayFrames, inputScaleFrames) + patternId, jumpedOrNot, effDx, effDy := deriveOpPattern(currPlayerDownsync, thatPlayerInNextFrame, currRenderFrame, inputsBuffer, INPUT_DELAY_FRAMES, INPUT_SCALE_FRAMES) if PATTERN_ID_UNABLE_TO_OP == patternId { continue } if jumpedOrNot { - thatPlayerInNextFrame.VelY = jumpingInitVelY - thatPlayerInNextFrame.VirtualGridY += jumpingInitVelY // Immediately gets out of any snapping + thatPlayerInNextFrame.VelY = int32(chConfigsOrderedByJoinIndex[i].JumpingInitVelY) + jumpedOrNotList[i] = true } joinIndex := currPlayerDownsync.JoinIndex if PATTERN_ID_NO_OP != patternId { @@ -457,14 +455,17 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer thatPlayerInNextFrame := nextRenderFramePlayers[i] // Reset playerCollider position from the "virtual grid position" newVx, newVy := currPlayerDownsync.VirtualGridX+currPlayerDownsync.VelX, currPlayerDownsync.VirtualGridY+currPlayerDownsync.VelY + if jumpedOrNotList[i] { + newVy += int32(chConfigsOrderedByJoinIndex[i].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) + playerCollider.X, playerCollider.Y = VirtualGridToPolygonColliderBLPos(newVx, newVy, playerCollider.W*0.5, playerCollider.H*0.5, 0, 0, 0, 0, collisionSpaceOffsetX, collisionSpaceOffsetY, VIRTUAL_GRID_TO_WORLD_RATIO) // Update in the collision system playerCollider.Update() if currPlayerDownsync.InAir { - thatPlayerInNextFrame.VelX += gravityX - thatPlayerInNextFrame.VelY += gravityY + thatPlayerInNextFrame.VelX += GRAVITY_X + thatPlayerInNextFrame.VelY += GRAVITY_Y } } @@ -478,9 +479,9 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer if 0 > offender.DirX { xfac = float64(-1.0) } - offenderWx, offenderWy := VirtualGridToWorldPos(offender.VirtualGridX, offender.VirtualGridY, virtualGridToWorldRatio) + offenderWx, offenderWy := VirtualGridToWorldPos(offender.VirtualGridX, offender.VirtualGridY, VIRTUAL_GRID_TO_WORLD_RATIO) bulletWx, bulletWy := offenderWx+xfac*meleeBullet.HitboxOffset, offenderWy - newBulletCollider := GenerateRectCollider(bulletWx, bulletWy, meleeBullet.HitboxSizeX, meleeBullet.HitboxSizeY, snapIntoPlatformOverlap, snapIntoPlatformOverlap, snapIntoPlatformOverlap, snapIntoPlatformOverlap, collisionSpaceOffsetX, collisionSpaceOffsetY, meleeBullet, "MeleeBullet") + newBulletCollider := GenerateRectCollider(bulletWx, bulletWy, meleeBullet.HitboxSizeX, meleeBullet.HitboxSizeY, 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 { @@ -494,7 +495,7 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer collisionPlayerIndex := COLLISION_PLAYER_INDEX_PREFIX + joinIndex playerCollider := collisionSysMap[collisionPlayerIndex] 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] landedOnGravityPushback := false if collision := playerCollider.Check(0, 0); nil != collision { @@ -521,7 +522,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 +534,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) @@ -550,11 +551,15 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer thatPlayerInNextFrame.FramesToRecover = 0 } } - if currPlayerDownsync.InAir { + if thatPlayerInNextFrame.InAir { oldNextCharacterState := thatPlayerInNextFrame.CharacterState switch oldNextCharacterState { case ATK_CHARACTER_STATE_IDLE1, ATK_CHARACTER_STATE_WALKING: - thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_INAIR_IDLE1 + if jumpedOrNotList[i] || ATK_CHARACTER_STATE_INAIR_IDLE1_BY_JUMP == currPlayerDownsync.CharacterState { + thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_INAIR_IDLE1_BY_JUMP + } else { + thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_INAIR_IDLE1_NO_JUMP + } case ATK_CHARACTER_STATE_ATK1: thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_INAIR_ATK1 case ATK_CHARACTER_STATE_ATKED1: @@ -624,7 +629,10 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer playerCollider := collisionSysMap[collisionPlayerIndex] // 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, WORLD_TO_VIRTUAL_GRID_RATIO) + if thatPlayerInNextFrame.CharacterState != currPlayerDownsync.CharacterState { + thatPlayerInNextFrame.FramesInChState = 0 + } } return &RoomDownsyncFrame{ diff --git a/jsexport/battle/characterConfig.go b/jsexport/battle/characterConfig.go new file mode 100644 index 0000000..631a575 --- /dev/null +++ b/jsexport/battle/characterConfig.go @@ -0,0 +1,74 @@ +package battle + +var Characters = map[int]*CharacterConfig{ + 0: &CharacterConfig{ + SpeciesId: 0, + SpeciesName: "MonkGirl", + + InAirIdleFrameIdxTurningPoint: 11, + InAirIdleFrameIdxTurnedCycle: 1, + + LayDownFrames: 16, + LayDownFramesToRecover: 16, + + GetUpFrames: 33, + GetUpFramesToRecover: 30, // 3 invinsible frames for just-blown-up character to make a comeback + + JumpingInitVelY: int(float64(8) * WORLD_TO_VIRTUAL_GRID_RATIO), + + PatternIdToSkillId: map[int]int{ + 0: 1, // Atk1 + 1: 2, // InAirAtk1 + }, + }, +} + +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, + }, + }, + 2: &MeleeBullet{ + Bullet: Bullet{ + // for offender + StartupFrames: int32(3), + ActiveFrames: int32(20), + RecoveryFrames: int32(34), + RecoveryFramesOnBlock: int32(34), + RecoveryFramesOnHit: int32(34), + HitboxOffset: float64(16.0), // should be about the radius of the PlayerCollider + + // for defender + HitStunFrames: int32(18), + BlockStunFrames: int32(9), + Pushback: float64(6.0), + BlowUpVelY: int32(float64(3) * WORLD_TO_VIRTUAL_GRID_RATIO), + ReleaseTriggerType: int32(1), // 1: rising-edge, 2: falling-edge + Damage: int32(5), + + SelfMoveforwardX: 0, + SelfMoveforwardY: 0, + HitboxSizeX: 32.0, + HitboxSizeY: 24.0, + }, + }, +} diff --git a/jsexport/battle/room_downsync_frame.go b/jsexport/battle/room_downsync_frame.go index 3bc65a7..ca047cd 100644 --- a/jsexport/battle/room_downsync_frame.go +++ b/jsexport/battle/room_downsync_frame.go @@ -28,6 +28,7 @@ type PlayerDownsync struct { Score int32 LastMoveGmtMillis int32 FramesToRecover int32 + FramesInChState int32 Hp int32 MaxHp int32 CharacterState int32 @@ -60,6 +61,7 @@ type Bullet struct { RecoveryFramesOnHit int32 HitboxOffset float64 OriginatedRenderFrameId int32 + // for defender HitStunFrames int32 BlockStunFrames int32 @@ -73,6 +75,8 @@ type Bullet struct { SelfMoveforwardY float64 HitboxSizeX float64 HitboxSizeY float64 + + BlowUpVelY int32 } type MeleeBullet struct { @@ -90,6 +94,10 @@ type FireballBullet struct { Bullet } +type Skill struct { + Hits []Bullet // Hits within a "Skill" are automatically triggered +} + type RoomDownsyncFrame struct { Id int32 PlayersArr []*PlayerDownsync @@ -106,3 +114,21 @@ type InputFrameDownsync struct { InputList []uint64 ConfirmedList uint64 } + +type CharacterConfig struct { + SpeciesId int + SpeciesName string + + InAirIdleFrameIdxTurningPoint int + InAirIdleFrameIdxTurnedCycle int + + LayDownFrames int + LayDownFramesToRecover int + + GetUpFrames int + GetUpFramesToRecover int + + JumpingInitVelY int + + PatternIdToSkillId map[int]int +} diff --git a/jsexport/main.go b/jsexport/main.go index 6f6cf68..c8770eb 100644 --- a/jsexport/main.go +++ b/jsexport/main.go @@ -42,7 +42,7 @@ func NewBarrierJs(boundary *Polygon2D) *js.Object { }) } -func NewPlayerDownsyncJs(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, framesToRecover, speed, battleState, characterState, joinIndex, hp, maxHp int32, inAir bool, colliderRadius float64) *js.Object { +func NewPlayerDownsyncJs(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, framesToRecover, framesInChState, speed, battleState, characterState, joinIndex, hp, maxHp int32, inAir bool, colliderRadius float64) *js.Object { return js.MakeWrapper(&PlayerDownsync{ Id: id, VirtualGridX: virtualGridX, @@ -52,6 +52,7 @@ func NewPlayerDownsyncJs(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, VelX: velX, VelY: velY, FramesToRecover: framesToRecover, + FramesInChState: framesInChState, Speed: speed, BattleState: battleState, JoinIndex: joinIndex, @@ -129,25 +130,34 @@ 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, playerOpPatternToSkillId map[int]int, 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, playerOpPatternToSkillId, 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, + "NewVec2DJs": NewVec2DJs, + "NewPolygon2DJs": NewPolygon2DJs, + "NewBarrierJs": NewBarrierJs, + "NewPlayerDownsyncJs": NewPlayerDownsyncJs, + "NewMeleeBulletJs": NewMeleeBulletJs, + "NewRoomDownsyncFrameJs": NewRoomDownsyncFrameJs, + "NewCollisionSpaceJs": NewCollisionSpaceJs, + "NewInputFrameDownsync": NewInputFrameDownsync, + "NewRingBufferJs": NewRingBufferJs, + "GenerateRectColliderJs": GenerateRectColliderJs, + "GenerateConvexPolygonColliderJs": GenerateConvexPolygonColliderJs, + "GetCollisionSpaceObjsJs": GetCollisionSpaceObjsJs, + "GetCharacterConfigsOrderedByJoinIndex": GetCharacterConfigsOrderedByJoinIndex, "ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs": ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs, "WorldToPolygonColliderBLPos": WorldToPolygonColliderBLPos, // No need to wrap primitive return types "PolygonColliderBLToWorldPos": PolygonColliderBLToWorldPos, 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 From 8b80117d3d94e7a1d617a29d91e6f5fcd78c8d07 Mon Sep 17 00:00:00 2001 From: genxium Date: Sun, 1 Jan 2023 15:43:25 +0800 Subject: [PATCH 02/10] A temp broken commit except for OfflineMap - refactoring character/skill/bullet config hierarchy. --- frontend/assets/plugin_scripts/jsexport.js | 6128 +---------------- .../pbfiles/room_downsync_frame.proto | 52 +- frontend/assets/scripts/Map.js | 43 +- frontend/assets/scripts/OfflineMap.js | 78 +- jsexport/battle/battle.go | 232 +- jsexport/battle/characterConfig.go | 115 +- jsexport/battle/room_downsync_frame.go | 62 +- jsexport/main.go | 80 +- 8 files changed, 310 insertions(+), 6480 deletions(-) diff --git a/frontend/assets/plugin_scripts/jsexport.js b/frontend/assets/plugin_scripts/jsexport.js index 887f469..a973b99 100644 --- a/frontend/assets/plugin_scripts/jsexport.js +++ b/frontend/assets/plugin_scripts/jsexport.js @@ -2,6125 +2,15 @@ (function() { var $goVersion = "go1.18.6"; -Error.stackTraceLimit = Infinity; - -var $NaN = NaN; -var $global, $module; -if (typeof window !== "undefined") { /* web page */ - $global = window; -} else if (typeof self !== "undefined") { /* web worker */ - $global = self; -} else if (typeof global !== "undefined") { /* Node.js */ - $global = global; - $global.require = require; -} else { /* others (e.g. Nashorn) */ - $global = this; -} - -if ($global === undefined || $global.Array === undefined) { - throw new Error("no global object found"); -} -if (typeof module !== "undefined") { - $module = module; -} - -if (!$global.fs && $global.require) { - try { - var fs = $global.require('fs'); - if (typeof fs === "object" && fs !== null && Object.keys(fs).length !== 0) { - $global.fs = fs; - } - } catch(e) { /* Ignore if the module couldn't be loaded. */ } -} - -if (!$global.fs) { - var outputBuf = ""; - var decoder = new TextDecoder("utf-8"); - $global.fs = { - constants: { O_WRONLY: -1, O_RDWR: -1, O_CREAT: -1, O_TRUNC: -1, O_APPEND: -1, O_EXCL: -1 }, // unused - writeSync: function writeSync(fd, buf) { - outputBuf += decoder.decode(buf); - var nl = outputBuf.lastIndexOf("\n"); - if (nl != -1) { - console.log(outputBuf.substr(0, nl)); - outputBuf = outputBuf.substr(nl + 1); - } - return buf.length; - }, - write: function write(fd, buf, offset, length, position, callback) { - if (offset !== 0 || length !== buf.length || position !== null) { - callback(enosys()); - return; - } - var n = this.writeSync(fd, buf); - callback(null, n); - } - }; -} - -var $linknames = {} // Collection of functions referenced by a go:linkname directive. -var $packages = {}, $idCounter = 0; -var $keys = function(m) { return m ? Object.keys(m) : []; }; -var $flushConsole = function() {}; -var $throwRuntimeError; /* set by package "runtime" */ -var $throwNilPointerError = function() { $throwRuntimeError("invalid memory address or nil pointer dereference"); }; -var $call = function(fn, rcvr, args) { return fn.apply(rcvr, args); }; -var $makeFunc = function(fn) { return function() { return $externalize(fn(this, new ($sliceType($jsObjectPtr))($global.Array.prototype.slice.call(arguments, []))), $emptyInterface); }; }; -var $unused = function(v) {}; -var $print = console.log; -// Under Node we can emulate print() more closely by avoiding a newline. -if (($global.process !== undefined) && $global.require) { - try { - var util = $global.require('util'); - $print = function() { $global.process.stderr.write(util.format.apply(this, arguments)); }; - } catch (e) { - // Failed to require util module, keep using console.log(). - } -} -var $println = console.log - -var $initAllLinknames = function() { - var names = $keys($packages); - for (var i = 0; i < names.length; i++) { - var f = $packages[names[i]]["$initLinknames"]; - if (typeof f == 'function') { - f(); - } - } -} - -var $mapArray = function(array, f) { - var newArray = new array.constructor(array.length); - for (var i = 0; i < array.length; i++) { - newArray[i] = f(array[i]); - } - return newArray; -}; - -// Returns a method bound to the receiver instance, safe to invoke as a -// standalone function. Bound function is cached for later reuse. -var $methodVal = function(recv, name) { - var vals = recv.$methodVals || {}; - recv.$methodVals = vals; /* noop for primitives */ - var f = vals[name]; - if (f !== undefined) { - return f; - } - var method = recv[name]; - f = method.bind(recv); - vals[name] = f; - return f; -}; - -var $methodExpr = function(typ, name) { - var method = typ.prototype[name]; - if (method.$expr === undefined) { - method.$expr = function() { - $stackDepthOffset--; - try { - if (typ.wrapped) { - arguments[0] = new typ(arguments[0]); - } - return Function.call.apply(method, arguments); - } finally { - $stackDepthOffset++; - } - }; - } - return method.$expr; -}; - -var $ifaceMethodExprs = {}; -var $ifaceMethodExpr = function(name) { - var expr = $ifaceMethodExprs["$" + name]; - if (expr === undefined) { - expr = $ifaceMethodExprs["$" + name] = function() { - $stackDepthOffset--; - try { - return Function.call.apply(arguments[0][name], arguments); - } finally { - $stackDepthOffset++; - } - }; - } - return expr; -}; - -var $subslice = function(slice, low, high, max) { - if (high === undefined) { - high = slice.$length; - } - if (max === undefined) { - max = slice.$capacity; - } - if (low < 0 || high < low || max < high || high > slice.$capacity || max > slice.$capacity) { - $throwRuntimeError("slice bounds out of range"); - } - if (slice === slice.constructor.nil) { - return slice; - } - var s = new slice.constructor(slice.$array); - s.$offset = slice.$offset + low; - s.$length = high - low; - s.$capacity = max - low; - return s; -}; - -var $substring = function(str, low, high) { - if (low < 0 || high < low || high > str.length) { - $throwRuntimeError("slice bounds out of range"); - } - return str.substring(low, high); -}; - -// Convert Go slice to an equivalent JS array type. -var $sliceToNativeArray = function(slice) { - if (slice.$array.constructor !== Array) { - return slice.$array.subarray(slice.$offset, slice.$offset + slice.$length); - } - return slice.$array.slice(slice.$offset, slice.$offset + slice.$length); -}; - -// Convert Go slice to a pointer to an underlying Go array. -// -// Note that an array pointer can be represented by an "unwrapped" native array -// type, and it will be wrapped back into its Go type when necessary. -var $sliceToGoArray = function(slice, arrayPtrType) { - var arrayType = arrayPtrType.elem; - if (arrayType !== undefined && slice.$length < arrayType.len) { - $throwRuntimeError("cannot convert slice with length " + slice.$length + " to pointer to array with length " + arrayType.len); - } - if (slice == slice.constructor.nil) { - return arrayPtrType.nil; // Nil slice converts to nil array pointer. - } - if (slice.$array.constructor !== Array) { - return slice.$array.subarray(slice.$offset, slice.$offset + arrayType.len); - } - if (slice.$offset == 0 && slice.$length == slice.$capacity && slice.$length == arrayType.len) { - return slice.$array; - } - if (arrayType.len == 0) { - return new arrayType([]); - } - - // Array.slice (unlike TypedArray.subarray) returns a copy of an array range, - // which is not sharing memory with the original one, which violates the spec - // for slice to array conversion. This is incompatible with the Go spec, in - // particular that the assignments to the array elements would be visible in - // the slice. Prefer to fail explicitly instead of creating subtle bugs. - $throwRuntimeError("gopherjs: non-numeric slice to underlying array conversion is not supported for subslices"); -}; - -// Convert between compatible slice types (e.g. native and names). -var $convertSliceType = function(slice, desiredType) { - if (slice == slice.constructor.nil) { - return desiredType.nil; // Preserve nil value. - } - - return $subslice(new desiredType(slice.$array), slice.$offset, slice.$offset + slice.$length); -} - -var $decodeRune = function(str, pos) { - var c0 = str.charCodeAt(pos); - - if (c0 < 0x80) { - return [c0, 1]; - } - - if (c0 !== c0 || c0 < 0xC0) { - return [0xFFFD, 1]; - } - - var c1 = str.charCodeAt(pos + 1); - if (c1 !== c1 || c1 < 0x80 || 0xC0 <= c1) { - return [0xFFFD, 1]; - } - - if (c0 < 0xE0) { - var r = (c0 & 0x1F) << 6 | (c1 & 0x3F); - if (r <= 0x7F) { - return [0xFFFD, 1]; - } - return [r, 2]; - } - - var c2 = str.charCodeAt(pos + 2); - if (c2 !== c2 || c2 < 0x80 || 0xC0 <= c2) { - return [0xFFFD, 1]; - } - - if (c0 < 0xF0) { - var r = (c0 & 0x0F) << 12 | (c1 & 0x3F) << 6 | (c2 & 0x3F); - if (r <= 0x7FF) { - return [0xFFFD, 1]; - } - if (0xD800 <= r && r <= 0xDFFF) { - return [0xFFFD, 1]; - } - return [r, 3]; - } - - var c3 = str.charCodeAt(pos + 3); - if (c3 !== c3 || c3 < 0x80 || 0xC0 <= c3) { - return [0xFFFD, 1]; - } - - if (c0 < 0xF8) { - var r = (c0 & 0x07) << 18 | (c1 & 0x3F) << 12 | (c2 & 0x3F) << 6 | (c3 & 0x3F); - if (r <= 0xFFFF || 0x10FFFF < r) { - return [0xFFFD, 1]; - } - return [r, 4]; - } - - return [0xFFFD, 1]; -}; - -var $encodeRune = function(r) { - if (r < 0 || r > 0x10FFFF || (0xD800 <= r && r <= 0xDFFF)) { - r = 0xFFFD; - } - if (r <= 0x7F) { - return String.fromCharCode(r); - } - if (r <= 0x7FF) { - return String.fromCharCode(0xC0 | r >> 6, 0x80 | (r & 0x3F)); - } - if (r <= 0xFFFF) { - return String.fromCharCode(0xE0 | r >> 12, 0x80 | (r >> 6 & 0x3F), 0x80 | (r & 0x3F)); - } - return String.fromCharCode(0xF0 | r >> 18, 0x80 | (r >> 12 & 0x3F), 0x80 | (r >> 6 & 0x3F), 0x80 | (r & 0x3F)); -}; - -var $stringToBytes = function(str) { - var array = new Uint8Array(str.length); - for (var i = 0; i < str.length; i++) { - array[i] = str.charCodeAt(i); - } - return array; -}; - -var $bytesToString = function(slice) { - if (slice.$length === 0) { - return ""; - } - var str = ""; - for (var i = 0; i < slice.$length; i += 10000) { - str += String.fromCharCode.apply(undefined, slice.$array.subarray(slice.$offset + i, slice.$offset + Math.min(slice.$length, i + 10000))); - } - return str; -}; - -var $stringToRunes = function(str) { - var array = new Int32Array(str.length); - var rune, j = 0; - for (var i = 0; i < str.length; i += rune[1], j++) { - rune = $decodeRune(str, i); - array[j] = rune[0]; - } - return array.subarray(0, j); -}; - -var $runesToString = function(slice) { - if (slice.$length === 0) { - return ""; - } - var str = ""; - for (var i = 0; i < slice.$length; i++) { - str += $encodeRune(slice.$array[slice.$offset + i]); - } - return str; -}; - -var $copyString = function(dst, src) { - var n = Math.min(src.length, dst.$length); - for (var i = 0; i < n; i++) { - dst.$array[dst.$offset + i] = src.charCodeAt(i); - } - return n; -}; - -var $copySlice = function(dst, src) { - var n = Math.min(src.$length, dst.$length); - $copyArray(dst.$array, src.$array, dst.$offset, src.$offset, n, dst.constructor.elem); - return n; -}; - -var $copyArray = function(dst, src, dstOffset, srcOffset, n, elem) { - if (n === 0 || (dst === src && dstOffset === srcOffset)) { - return; - } - - if (src.subarray) { - dst.set(src.subarray(srcOffset, srcOffset + n), dstOffset); - return; - } - - switch (elem.kind) { - case $kindArray: - case $kindStruct: - if (dst === src && dstOffset > srcOffset) { - for (var i = n - 1; i >= 0; i--) { - elem.copy(dst[dstOffset + i], src[srcOffset + i]); - } - return; - } - for (var i = 0; i < n; i++) { - elem.copy(dst[dstOffset + i], src[srcOffset + i]); - } - return; - } - - if (dst === src && dstOffset > srcOffset) { - for (var i = n - 1; i >= 0; i--) { - dst[dstOffset + i] = src[srcOffset + i]; - } - return; - } - for (var i = 0; i < n; i++) { - dst[dstOffset + i] = src[srcOffset + i]; - } -}; - -var $clone = function(src, type) { - var clone = type.zero(); - type.copy(clone, src); - return clone; -}; - -var $pointerOfStructConversion = function(obj, type) { - if(obj.$proxies === undefined) { - obj.$proxies = {}; - obj.$proxies[obj.constructor.string] = obj; - } - var proxy = obj.$proxies[type.string]; - if (proxy === undefined) { - var properties = {}; - for (var i = 0; i < type.elem.fields.length; i++) { - (function(fieldProp) { - properties[fieldProp] = { - get: function() { return obj[fieldProp]; }, - set: function(value) { obj[fieldProp] = value; } - }; - })(type.elem.fields[i].prop); - } - proxy = Object.create(type.prototype, properties); - proxy.$val = proxy; - obj.$proxies[type.string] = proxy; - proxy.$proxies = obj.$proxies; - } - return proxy; -}; - -var $append = function(slice) { - return $internalAppend(slice, arguments, 1, arguments.length - 1); -}; - -var $appendSlice = function(slice, toAppend) { - if (toAppend.constructor === String) { - var bytes = $stringToBytes(toAppend); - return $internalAppend(slice, bytes, 0, bytes.length); - } - return $internalAppend(slice, toAppend.$array, toAppend.$offset, toAppend.$length); -}; - -var $internalAppend = function(slice, array, offset, length) { - if (length === 0) { - return slice; - } - - var newArray = slice.$array; - var newOffset = slice.$offset; - var newLength = slice.$length + length; - var newCapacity = slice.$capacity; - - if (newLength > newCapacity) { - newOffset = 0; - newCapacity = Math.max(newLength, slice.$capacity < 1024 ? slice.$capacity * 2 : Math.floor(slice.$capacity * 5 / 4)); - - if (slice.$array.constructor === Array) { - newArray = slice.$array.slice(slice.$offset, slice.$offset + slice.$length); - newArray.length = newCapacity; - var zero = slice.constructor.elem.zero; - for (var i = slice.$length; i < newCapacity; i++) { - newArray[i] = zero(); - } - } else { - newArray = new slice.$array.constructor(newCapacity); - newArray.set(slice.$array.subarray(slice.$offset, slice.$offset + slice.$length)); - } - } - - $copyArray(newArray, array, newOffset + slice.$length, offset, length, slice.constructor.elem); - - var newSlice = new slice.constructor(newArray); - newSlice.$offset = newOffset; - newSlice.$length = newLength; - newSlice.$capacity = newCapacity; - return newSlice; -}; - -var $equal = function(a, b, type) { - if (type === $jsObjectPtr) { - return a === b; - } - switch (type.kind) { - case $kindComplex64: - case $kindComplex128: - return a.$real === b.$real && a.$imag === b.$imag; - case $kindInt64: - case $kindUint64: - return a.$high === b.$high && a.$low === b.$low; - case $kindArray: - if (a.length !== b.length) { - return false; - } - for (var i = 0; i < a.length; i++) { - if (!$equal(a[i], b[i], type.elem)) { - return false; - } - } - return true; - case $kindStruct: - for (var i = 0; i < type.fields.length; i++) { - var f = type.fields[i]; - if (!$equal(a[f.prop], b[f.prop], f.typ)) { - return false; - } - } - return true; - case $kindInterface: - return $interfaceIsEqual(a, b); - default: - return a === b; - } -}; - -var $interfaceIsEqual = function(a, b) { - if (a === $ifaceNil || b === $ifaceNil) { - return a === b; - } - if (a.constructor !== b.constructor) { - return false; - } - if (a.constructor === $jsObjectPtr) { - return a.object === b.object; - } - if (!a.constructor.comparable) { - $throwRuntimeError("comparing uncomparable type " + a.constructor.string); - } - return $equal(a.$val, b.$val, a.constructor); -}; - -var $min = Math.min; -var $mod = function(x, y) { return x % y; }; -var $parseInt = parseInt; -var $parseFloat = function(f) { - if (f !== undefined && f !== null && f.constructor === Number) { - return f; - } - return parseFloat(f); -}; - -var $froundBuf = new Float32Array(1); -var $fround = Math.fround || function(f) { - $froundBuf[0] = f; - return $froundBuf[0]; -}; - -var $imul = Math.imul || function(a, b) { - var ah = (a >>> 16) & 0xffff; - var al = a & 0xffff; - var bh = (b >>> 16) & 0xffff; - var bl = b & 0xffff; - return ((al * bl) + (((ah * bl + al * bh) << 16) >>> 0) >> 0); -}; - -var $floatKey = function(f) { - if (f !== f) { - $idCounter++; - return "NaN$" + $idCounter; - } - return String(f); -}; - -var $flatten64 = function(x) { - return x.$high * 4294967296 + x.$low; -}; - -var $shiftLeft64 = function(x, y) { - if (y === 0) { - return x; - } - if (y < 32) { - return new x.constructor(x.$high << y | x.$low >>> (32 - y), (x.$low << y) >>> 0); - } - if (y < 64) { - return new x.constructor(x.$low << (y - 32), 0); - } - return new x.constructor(0, 0); -}; - -var $shiftRightInt64 = function(x, y) { - if (y === 0) { - return x; - } - if (y < 32) { - return new x.constructor(x.$high >> y, (x.$low >>> y | x.$high << (32 - y)) >>> 0); - } - if (y < 64) { - return new x.constructor(x.$high >> 31, (x.$high >> (y - 32)) >>> 0); - } - if (x.$high < 0) { - return new x.constructor(-1, 4294967295); - } - return new x.constructor(0, 0); -}; - -var $shiftRightUint64 = function(x, y) { - if (y === 0) { - return x; - } - if (y < 32) { - return new x.constructor(x.$high >>> y, (x.$low >>> y | x.$high << (32 - y)) >>> 0); - } - if (y < 64) { - return new x.constructor(0, x.$high >>> (y - 32)); - } - return new x.constructor(0, 0); -}; - -var $mul64 = function(x, y) { - var x48 = x.$high >>> 16; - var x32 = x.$high & 0xFFFF; - var x16 = x.$low >>> 16; - var x00 = x.$low & 0xFFFF; - - var y48 = y.$high >>> 16; - var y32 = y.$high & 0xFFFF; - var y16 = y.$low >>> 16; - var y00 = y.$low & 0xFFFF; - - var z48 = 0, z32 = 0, z16 = 0, z00 = 0; - z00 += x00 * y00; - z16 += z00 >>> 16; - z00 &= 0xFFFF; - z16 += x16 * y00; - z32 += z16 >>> 16; - z16 &= 0xFFFF; - z16 += x00 * y16; - z32 += z16 >>> 16; - z16 &= 0xFFFF; - z32 += x32 * y00; - z48 += z32 >>> 16; - z32 &= 0xFFFF; - z32 += x16 * y16; - z48 += z32 >>> 16; - z32 &= 0xFFFF; - z32 += x00 * y32; - z48 += z32 >>> 16; - z32 &= 0xFFFF; - z48 += x48 * y00 + x32 * y16 + x16 * y32 + x00 * y48; - z48 &= 0xFFFF; - - var hi = ((z48 << 16) | z32) >>> 0; - var lo = ((z16 << 16) | z00) >>> 0; - - var r = new x.constructor(hi, lo); - return r; -}; - -var $div64 = function(x, y, returnRemainder) { - if (y.$high === 0 && y.$low === 0) { - $throwRuntimeError("integer divide by zero"); - } - - var s = 1; - var rs = 1; - - var xHigh = x.$high; - var xLow = x.$low; - if (xHigh < 0) { - s = -1; - rs = -1; - xHigh = -xHigh; - if (xLow !== 0) { - xHigh--; - xLow = 4294967296 - xLow; - } - } - - var yHigh = y.$high; - var yLow = y.$low; - if (y.$high < 0) { - s *= -1; - yHigh = -yHigh; - if (yLow !== 0) { - yHigh--; - yLow = 4294967296 - yLow; - } - } - - var high = 0, low = 0, n = 0; - while (yHigh < 2147483648 && ((xHigh > yHigh) || (xHigh === yHigh && xLow > yLow))) { - yHigh = (yHigh << 1 | yLow >>> 31) >>> 0; - yLow = (yLow << 1) >>> 0; - n++; - } - for (var i = 0; i <= n; i++) { - high = high << 1 | low >>> 31; - low = (low << 1) >>> 0; - if ((xHigh > yHigh) || (xHigh === yHigh && xLow >= yLow)) { - xHigh = xHigh - yHigh; - xLow = xLow - yLow; - if (xLow < 0) { - xHigh--; - xLow += 4294967296; - } - low++; - if (low === 4294967296) { - high++; - low = 0; - } - } - yLow = (yLow >>> 1 | yHigh << (32 - 1)) >>> 0; - yHigh = yHigh >>> 1; - } - - if (returnRemainder) { - return new x.constructor(xHigh * rs, xLow * rs); - } - return new x.constructor(high * s, low * s); -}; - -var $divComplex = function(n, d) { - var ninf = n.$real === Infinity || n.$real === -Infinity || n.$imag === Infinity || n.$imag === -Infinity; - var dinf = d.$real === Infinity || d.$real === -Infinity || d.$imag === Infinity || d.$imag === -Infinity; - var nnan = !ninf && (n.$real !== n.$real || n.$imag !== n.$imag); - var dnan = !dinf && (d.$real !== d.$real || d.$imag !== d.$imag); - if(nnan || dnan) { - return new n.constructor(NaN, NaN); - } - if (ninf && !dinf) { - return new n.constructor(Infinity, Infinity); - } - if (!ninf && dinf) { - return new n.constructor(0, 0); - } - if (d.$real === 0 && d.$imag === 0) { - if (n.$real === 0 && n.$imag === 0) { - return new n.constructor(NaN, NaN); - } - return new n.constructor(Infinity, Infinity); - } - var a = Math.abs(d.$real); - var b = Math.abs(d.$imag); - if (a <= b) { - var ratio = d.$real / d.$imag; - var denom = d.$real * ratio + d.$imag; - return new n.constructor((n.$real * ratio + n.$imag) / denom, (n.$imag * ratio - n.$real) / denom); - } - var ratio = d.$imag / d.$real; - var denom = d.$imag * ratio + d.$real; - return new n.constructor((n.$imag * ratio + n.$real) / denom, (n.$imag - n.$real * ratio) / denom); -}; - -var $kindBool = 1; -var $kindInt = 2; -var $kindInt8 = 3; -var $kindInt16 = 4; -var $kindInt32 = 5; -var $kindInt64 = 6; -var $kindUint = 7; -var $kindUint8 = 8; -var $kindUint16 = 9; -var $kindUint32 = 10; -var $kindUint64 = 11; -var $kindUintptr = 12; -var $kindFloat32 = 13; -var $kindFloat64 = 14; -var $kindComplex64 = 15; -var $kindComplex128 = 16; -var $kindArray = 17; -var $kindChan = 18; -var $kindFunc = 19; -var $kindInterface = 20; -var $kindMap = 21; -var $kindPtr = 22; -var $kindSlice = 23; -var $kindString = 24; -var $kindStruct = 25; -var $kindUnsafePointer = 26; - -var $methodSynthesizers = []; -var $addMethodSynthesizer = function(f) { - if ($methodSynthesizers === null) { - f(); - return; - } - $methodSynthesizers.push(f); -}; -var $synthesizeMethods = function() { - $methodSynthesizers.forEach(function(f) { f(); }); - $methodSynthesizers = null; -}; - -var $ifaceKeyFor = function(x) { - if (x === $ifaceNil) { - return 'nil'; - } - var c = x.constructor; - return c.string + '$' + c.keyFor(x.$val); -}; - -var $identity = function(x) { return x; }; - -var $typeIDCounter = 0; - -var $idKey = function(x) { - if (x.$id === undefined) { - $idCounter++; - x.$id = $idCounter; - } - return String(x.$id); -}; - -// Creates constructor functions for array pointer types. Returns a new function -// instace each time to make sure each type is independent of the other. -var $arrayPtrCtor = function() { - return function(array) { - this.$get = function() { return array; }; - this.$set = function(v) { typ.copy(this, v); }; - this.$val = array; - } -} - -var $newType = function(size, kind, string, named, pkg, exported, constructor) { - var typ; - switch(kind) { - case $kindBool: - case $kindInt: - case $kindInt8: - case $kindInt16: - case $kindInt32: - case $kindUint: - case $kindUint8: - case $kindUint16: - case $kindUint32: - case $kindUintptr: - case $kindUnsafePointer: - typ = function(v) { this.$val = v; }; - typ.wrapped = true; - typ.keyFor = $identity; - break; - - case $kindString: - typ = function(v) { this.$val = v; }; - typ.wrapped = true; - typ.keyFor = function(x) { return "$" + x; }; - break; - - case $kindFloat32: - case $kindFloat64: - typ = function(v) { this.$val = v; }; - typ.wrapped = true; - typ.keyFor = function(x) { return $floatKey(x); }; - break; - - case $kindInt64: - typ = function(high, low) { - this.$high = (high + Math.floor(Math.ceil(low) / 4294967296)) >> 0; - this.$low = low >>> 0; - this.$val = this; - }; - typ.keyFor = function(x) { return x.$high + "$" + x.$low; }; - break; - - case $kindUint64: - typ = function(high, low) { - this.$high = (high + Math.floor(Math.ceil(low) / 4294967296)) >>> 0; - this.$low = low >>> 0; - this.$val = this; - }; - typ.keyFor = function(x) { return x.$high + "$" + x.$low; }; - break; - - case $kindComplex64: - typ = function(real, imag) { - this.$real = $fround(real); - this.$imag = $fround(imag); - this.$val = this; - }; - typ.keyFor = function(x) { return x.$real + "$" + x.$imag; }; - break; - - case $kindComplex128: - typ = function(real, imag) { - this.$real = real; - this.$imag = imag; - this.$val = this; - }; - typ.keyFor = function(x) { return x.$real + "$" + x.$imag; }; - break; - - case $kindArray: - typ = function(v) { this.$val = v; }; - typ.wrapped = true; - typ.ptr = $newType(4, $kindPtr, "*" + string, false, "", false, $arrayPtrCtor()); - typ.init = function(elem, len) { - typ.elem = elem; - typ.len = len; - typ.comparable = elem.comparable; - typ.keyFor = function(x) { - return Array.prototype.join.call($mapArray(x, function(e) { - return String(elem.keyFor(e)).replace(/\\/g, "\\\\").replace(/\$/g, "\\$"); - }), "$"); - }; - typ.copy = function(dst, src) { - $copyArray(dst, src, 0, 0, src.length, elem); - }; - typ.ptr.init(typ); - Object.defineProperty(typ.ptr.nil, "nilCheck", { get: $throwNilPointerError }); - }; - break; - - case $kindChan: - typ = function(v) { this.$val = v; }; - typ.wrapped = true; - typ.keyFor = $idKey; - typ.init = function(elem, sendOnly, recvOnly) { - typ.elem = elem; - typ.sendOnly = sendOnly; - typ.recvOnly = recvOnly; - }; - break; - - case $kindFunc: - typ = function(v) { this.$val = v; }; - typ.wrapped = true; - typ.init = function(params, results, variadic) { - typ.params = params; - typ.results = results; - typ.variadic = variadic; - typ.comparable = false; - }; - break; - - case $kindInterface: - typ = { implementedBy: {}, missingMethodFor: {} }; - typ.keyFor = $ifaceKeyFor; - typ.init = function(methods) { - typ.methods = methods; - methods.forEach(function(m) { - $ifaceNil[m.prop] = $throwNilPointerError; - }); - }; - break; - - case $kindMap: - typ = function(v) { this.$val = v; }; - typ.wrapped = true; - typ.init = function(key, elem) { - typ.key = key; - typ.elem = elem; - typ.comparable = false; - }; - break; - - case $kindPtr: - typ = constructor || function(getter, setter, target) { - this.$get = getter; - this.$set = setter; - this.$target = target; - this.$val = this; - }; - typ.keyFor = $idKey; - typ.init = function(elem) { - typ.elem = elem; - typ.wrapped = (elem.kind === $kindArray); - typ.nil = new typ($throwNilPointerError, $throwNilPointerError); - }; - break; - - case $kindSlice: - typ = function(array) { - if (array.constructor !== typ.nativeArray) { - array = new typ.nativeArray(array); - } - this.$array = array; - this.$offset = 0; - this.$length = array.length; - this.$capacity = array.length; - this.$val = this; - }; - typ.init = function(elem) { - typ.elem = elem; - typ.comparable = false; - typ.nativeArray = $nativeArray(elem.kind); - typ.nil = new typ([]); - }; - break; - - case $kindStruct: - typ = function(v) { this.$val = v; }; - typ.wrapped = true; - typ.ptr = $newType(4, $kindPtr, "*" + string, false, pkg, exported, constructor); - typ.ptr.elem = typ; - typ.ptr.prototype.$get = function() { return this; }; - typ.ptr.prototype.$set = function(v) { typ.copy(this, v); }; - typ.init = function(pkgPath, fields) { - typ.pkgPath = pkgPath; - typ.fields = fields; - fields.forEach(function(f) { - if (!f.typ.comparable) { - typ.comparable = false; - } - }); - typ.keyFor = function(x) { - var val = x.$val; - return $mapArray(fields, function(f) { - return String(f.typ.keyFor(val[f.prop])).replace(/\\/g, "\\\\").replace(/\$/g, "\\$"); - }).join("$"); - }; - typ.copy = function(dst, src) { - for (var i = 0; i < fields.length; i++) { - var f = fields[i]; - switch (f.typ.kind) { - case $kindArray: - case $kindStruct: - f.typ.copy(dst[f.prop], src[f.prop]); - continue; - default: - dst[f.prop] = src[f.prop]; - continue; - } - } - }; - /* nil value */ - var properties = {}; - fields.forEach(function(f) { - properties[f.prop] = { get: $throwNilPointerError, set: $throwNilPointerError }; - }); - typ.ptr.nil = Object.create(constructor.prototype, properties); - typ.ptr.nil.$val = typ.ptr.nil; - /* methods for embedded fields */ - $addMethodSynthesizer(function() { - var synthesizeMethod = function(target, m, f) { - if (target.prototype[m.prop] !== undefined) { return; } - target.prototype[m.prop] = function() { - var v = this.$val[f.prop]; - if (f.typ === $jsObjectPtr) { - v = new $jsObjectPtr(v); - } - if (v.$val === undefined) { - v = new f.typ(v); - } - return v[m.prop].apply(v, arguments); - }; - }; - fields.forEach(function(f) { - if (f.embedded) { - $methodSet(f.typ).forEach(function(m) { - synthesizeMethod(typ, m, f); - synthesizeMethod(typ.ptr, m, f); - }); - $methodSet($ptrType(f.typ)).forEach(function(m) { - synthesizeMethod(typ.ptr, m, f); - }); - } - }); - }); - }; - break; - - default: - $panic(new $String("invalid kind: " + kind)); - } - - switch (kind) { - case $kindBool: - case $kindMap: - typ.zero = function() { return false; }; - break; - - case $kindInt: - case $kindInt8: - case $kindInt16: - case $kindInt32: - case $kindUint: - case $kindUint8 : - case $kindUint16: - case $kindUint32: - case $kindUintptr: - case $kindUnsafePointer: - case $kindFloat32: - case $kindFloat64: - typ.zero = function() { return 0; }; - break; - - case $kindString: - typ.zero = function() { return ""; }; - break; - - case $kindInt64: - case $kindUint64: - case $kindComplex64: - case $kindComplex128: - var zero = new typ(0, 0); - typ.zero = function() { return zero; }; - break; - - case $kindPtr: - case $kindSlice: - typ.zero = function() { return typ.nil; }; - break; - - case $kindChan: - typ.zero = function() { return $chanNil; }; - break; - - case $kindFunc: - typ.zero = function() { return $throwNilPointerError; }; - break; - - case $kindInterface: - typ.zero = function() { return $ifaceNil; }; - break; - - case $kindArray: - typ.zero = function() { - var arrayClass = $nativeArray(typ.elem.kind); - if (arrayClass !== Array) { - return new arrayClass(typ.len); - } - var array = new Array(typ.len); - for (var i = 0; i < typ.len; i++) { - array[i] = typ.elem.zero(); - } - return array; - }; - break; - - case $kindStruct: - typ.zero = function() { return new typ.ptr(); }; - break; - - default: - $panic(new $String("invalid kind: " + kind)); - } - - typ.id = $typeIDCounter; - $typeIDCounter++; - typ.size = size; - typ.kind = kind; - typ.string = string; - typ.named = named; - typ.pkg = pkg; - typ.exported = exported; - typ.methods = []; - typ.methodSetCache = null; - typ.comparable = true; - return typ; -}; - -var $methodSet = function(typ) { - if (typ.methodSetCache !== null) { - return typ.methodSetCache; - } - var base = {}; - - var isPtr = (typ.kind === $kindPtr); - if (isPtr && typ.elem.kind === $kindInterface) { - typ.methodSetCache = []; - return []; - } - - var current = [{typ: isPtr ? typ.elem : typ, indirect: isPtr}]; - - var seen = {}; - - while (current.length > 0) { - var next = []; - var mset = []; - - current.forEach(function(e) { - if (seen[e.typ.string]) { - return; - } - seen[e.typ.string] = true; - - if (e.typ.named) { - mset = mset.concat(e.typ.methods); - if (e.indirect) { - mset = mset.concat($ptrType(e.typ).methods); - } - } - - switch (e.typ.kind) { - case $kindStruct: - e.typ.fields.forEach(function(f) { - if (f.embedded) { - var fTyp = f.typ; - var fIsPtr = (fTyp.kind === $kindPtr); - next.push({typ: fIsPtr ? fTyp.elem : fTyp, indirect: e.indirect || fIsPtr}); - } - }); - break; - - case $kindInterface: - mset = mset.concat(e.typ.methods); - break; - } - }); - - mset.forEach(function(m) { - if (base[m.name] === undefined) { - base[m.name] = m; - } - }); - - current = next; - } - - typ.methodSetCache = []; - Object.keys(base).sort().forEach(function(name) { - typ.methodSetCache.push(base[name]); - }); - return typ.methodSetCache; -}; - -var $Bool = $newType( 1, $kindBool, "bool", true, "", false, null); -var $Int = $newType( 4, $kindInt, "int", true, "", false, null); -var $Int8 = $newType( 1, $kindInt8, "int8", true, "", false, null); -var $Int16 = $newType( 2, $kindInt16, "int16", true, "", false, null); -var $Int32 = $newType( 4, $kindInt32, "int32", true, "", false, null); -var $Int64 = $newType( 8, $kindInt64, "int64", true, "", false, null); -var $Uint = $newType( 4, $kindUint, "uint", true, "", false, null); -var $Uint8 = $newType( 1, $kindUint8, "uint8", true, "", false, null); -var $Uint16 = $newType( 2, $kindUint16, "uint16", true, "", false, null); -var $Uint32 = $newType( 4, $kindUint32, "uint32", true, "", false, null); -var $Uint64 = $newType( 8, $kindUint64, "uint64", true, "", false, null); -var $Uintptr = $newType( 4, $kindUintptr, "uintptr", true, "", false, null); -var $Float32 = $newType( 4, $kindFloat32, "float32", true, "", false, null); -var $Float64 = $newType( 8, $kindFloat64, "float64", true, "", false, null); -var $Complex64 = $newType( 8, $kindComplex64, "complex64", true, "", false, null); -var $Complex128 = $newType(16, $kindComplex128, "complex128", true, "", false, null); -var $String = $newType( 8, $kindString, "string", true, "", false, null); -var $UnsafePointer = $newType( 4, $kindUnsafePointer, "unsafe.Pointer", true, "unsafe", false, null); - -var $nativeArray = function(elemKind) { - switch (elemKind) { - case $kindInt: - return Int32Array; - case $kindInt8: - return Int8Array; - case $kindInt16: - return Int16Array; - case $kindInt32: - return Int32Array; - case $kindUint: - return Uint32Array; - case $kindUint8: - return Uint8Array; - case $kindUint16: - return Uint16Array; - case $kindUint32: - return Uint32Array; - case $kindUintptr: - return Uint32Array; - case $kindFloat32: - return Float32Array; - case $kindFloat64: - return Float64Array; - default: - return Array; - } -}; -var $toNativeArray = function(elemKind, array) { - var nativeArray = $nativeArray(elemKind); - if (nativeArray === Array) { - return array; - } - return new nativeArray(array); -}; -var $arrayTypes = {}; -var $arrayType = function(elem, len) { - var typeKey = elem.id + "$" + len; - var typ = $arrayTypes[typeKey]; - if (typ === undefined) { - typ = $newType(12, $kindArray, "[" + len + "]" + elem.string, false, "", false, null); - $arrayTypes[typeKey] = typ; - typ.init(elem, len); - } - return typ; -}; - -var $chanType = function(elem, sendOnly, recvOnly) { - var string = (recvOnly ? "<-" : "") + "chan" + (sendOnly ? "<- " : " "); - if (!sendOnly && !recvOnly && (elem.string[0] == "<")) { - string += "(" + elem.string + ")"; - } else { - string += elem.string; - } - var field = sendOnly ? "SendChan" : (recvOnly ? "RecvChan" : "Chan"); - var typ = elem[field]; - if (typ === undefined) { - typ = $newType(4, $kindChan, string, false, "", false, null); - elem[field] = typ; - typ.init(elem, sendOnly, recvOnly); - } - return typ; -}; -var $Chan = function(elem, capacity) { - if (capacity < 0 || capacity > 2147483647) { - $throwRuntimeError("makechan: size out of range"); - } - this.$elem = elem; - this.$capacity = capacity; - this.$buffer = []; - this.$sendQueue = []; - this.$recvQueue = []; - this.$closed = false; -}; -var $chanNil = new $Chan(null, 0); -$chanNil.$sendQueue = $chanNil.$recvQueue = { length: 0, push: function() {}, shift: function() { return undefined; }, indexOf: function() { return -1; } }; - -var $funcTypes = {}; -var $funcType = function(params, results, variadic) { - var typeKey = $mapArray(params, function(p) { return p.id; }).join(",") + "$" + $mapArray(results, function(r) { return r.id; }).join(",") + "$" + variadic; - var typ = $funcTypes[typeKey]; - if (typ === undefined) { - var paramTypes = $mapArray(params, function(p) { return p.string; }); - if (variadic) { - paramTypes[paramTypes.length - 1] = "..." + paramTypes[paramTypes.length - 1].substr(2); - } - var string = "func(" + paramTypes.join(", ") + ")"; - if (results.length === 1) { - string += " " + results[0].string; - } else if (results.length > 1) { - string += " (" + $mapArray(results, function(r) { return r.string; }).join(", ") + ")"; - } - typ = $newType(4, $kindFunc, string, false, "", false, null); - $funcTypes[typeKey] = typ; - typ.init(params, results, variadic); - } - return typ; -}; - -var $interfaceTypes = {}; -var $interfaceType = function(methods) { - var typeKey = $mapArray(methods, function(m) { return m.pkg + "," + m.name + "," + m.typ.id; }).join("$"); - var typ = $interfaceTypes[typeKey]; - if (typ === undefined) { - var string = "interface {}"; - if (methods.length !== 0) { - string = "interface { " + $mapArray(methods, function(m) { - return (m.pkg !== "" ? m.pkg + "." : "") + m.name + m.typ.string.substr(4); - }).join("; ") + " }"; - } - typ = $newType(8, $kindInterface, string, false, "", false, null); - $interfaceTypes[typeKey] = typ; - typ.init(methods); - } - return typ; -}; -var $emptyInterface = $interfaceType([]); -var $ifaceNil = {}; -var $error = $newType(8, $kindInterface, "error", true, "", false, null); -$error.init([{prop: "Error", name: "Error", pkg: "", typ: $funcType([], [$String], false)}]); - -var $mapTypes = {}; -var $mapType = function(key, elem) { - var typeKey = key.id + "$" + elem.id; - var typ = $mapTypes[typeKey]; - if (typ === undefined) { - typ = $newType(4, $kindMap, "map[" + key.string + "]" + elem.string, false, "", false, null); - $mapTypes[typeKey] = typ; - typ.init(key, elem); - } - return typ; -}; -var $makeMap = function(keyForFunc, entries) { - var m = {}; - for (var i = 0; i < entries.length; i++) { - var e = entries[i]; - m[keyForFunc(e.k)] = e; - } - return m; -}; - -var $ptrType = function(elem) { - var typ = elem.ptr; - if (typ === undefined) { - typ = $newType(4, $kindPtr, "*" + elem.string, false, "", elem.exported, null); - elem.ptr = typ; - typ.init(elem); - } - return typ; -}; - -var $newDataPointer = function(data, constructor) { - if (constructor.elem.kind === $kindStruct) { - return data; - } - return new constructor(function() { return data; }, function(v) { data = v; }); -}; - -var $indexPtr = function(array, index, constructor) { - if (array.buffer) { - // Pointers to the same underlying ArrayBuffer share cache. - var cache = array.buffer.$ptr = array.buffer.$ptr || {}; - // Pointers of different primitive types are non-comparable and stored in different caches. - var typeCache = cache[array.name] = cache[array.name] || {}; - var cacheIdx = array.BYTES_PER_ELEMENT * index + array.byteOffset; - return typeCache[cacheIdx] || (typeCache[cacheIdx] = new constructor(function() { return array[index]; }, function(v) { array[index] = v; })); - } else { - array.$ptr = array.$ptr || {}; - return array.$ptr[index] || (array.$ptr[index] = new constructor(function() { return array[index]; }, function(v) { array[index] = v; })); - } -}; - -var $sliceType = function(elem) { - var typ = elem.slice; - if (typ === undefined) { - typ = $newType(12, $kindSlice, "[]" + elem.string, false, "", false, null); - elem.slice = typ; - typ.init(elem); - } - return typ; -}; -var $makeSlice = function(typ, length, capacity) { - capacity = capacity || length; - if (length < 0 || length > 2147483647) { - $throwRuntimeError("makeslice: len out of range"); - } - if (capacity < 0 || capacity < length || capacity > 2147483647) { - $throwRuntimeError("makeslice: cap out of range"); - } - var array = new typ.nativeArray(capacity); - if (typ.nativeArray === Array) { - for (var i = 0; i < capacity; i++) { - array[i] = typ.elem.zero(); - } - } - var slice = new typ(array); - slice.$length = length; - return slice; -}; - -var $structTypes = {}; -var $structType = function(pkgPath, fields) { - var typeKey = $mapArray(fields, function(f) { return f.name + "," + f.typ.id + "," + f.tag; }).join("$"); - var typ = $structTypes[typeKey]; - if (typ === undefined) { - var string = "struct { " + $mapArray(fields, function(f) { - var str = f.typ.string + (f.tag !== "" ? (" \"" + f.tag.replace(/\\/g, "\\\\").replace(/"/g, "\\\"") + "\"") : ""); - if (f.embedded) { - return str; - } - return f.name + " " + str; - }).join("; ") + " }"; - if (fields.length === 0) { - string = "struct {}"; - } - typ = $newType(0, $kindStruct, string, false, "", false, function() { - this.$val = this; - for (var i = 0; i < fields.length; i++) { - var f = fields[i]; - if (f.name == '_') { - continue; - } - var arg = arguments[i]; - this[f.prop] = arg !== undefined ? arg : f.typ.zero(); - } - }); - $structTypes[typeKey] = typ; - typ.init(pkgPath, fields); - } - return typ; -}; - -var $assertType = function(value, type, returnTuple) { - var isInterface = (type.kind === $kindInterface), ok, missingMethod = ""; - if (value === $ifaceNil) { - ok = false; - } else if (!isInterface) { - ok = value.constructor === type; - } else { - var valueTypeString = value.constructor.string; - ok = type.implementedBy[valueTypeString]; - if (ok === undefined) { - ok = true; - var valueMethodSet = $methodSet(value.constructor); - var interfaceMethods = type.methods; - for (var i = 0; i < interfaceMethods.length; i++) { - var tm = interfaceMethods[i]; - var found = false; - for (var j = 0; j < valueMethodSet.length; j++) { - var vm = valueMethodSet[j]; - if (vm.name === tm.name && vm.pkg === tm.pkg && vm.typ === tm.typ) { - found = true; - break; - } - } - if (!found) { - ok = false; - type.missingMethodFor[valueTypeString] = tm.name; - break; - } - } - type.implementedBy[valueTypeString] = ok; - } - if (!ok) { - missingMethod = type.missingMethodFor[valueTypeString]; - } - } - - if (!ok) { - if (returnTuple) { - return [type.zero(), false]; - } - $panic(new $packages["runtime"].TypeAssertionError.ptr( - $packages["runtime"]._type.ptr.nil, - (value === $ifaceNil ? $packages["runtime"]._type.ptr.nil : new $packages["runtime"]._type.ptr(value.constructor.string)), - new $packages["runtime"]._type.ptr(type.string), - missingMethod)); - } - - if (!isInterface) { - value = value.$val; - } - if (type === $jsObjectPtr) { - value = value.object; - } - return returnTuple ? [value, true] : value; -}; - -var $stackDepthOffset = 0; -var $getStackDepth = function() { - var err = new Error(); - if (err.stack === undefined) { - return undefined; - } - return $stackDepthOffset + err.stack.split("\n").length; -}; - -var $panicStackDepth = null, $panicValue; -var $callDeferred = function(deferred, jsErr, fromPanic) { - if (!fromPanic && deferred !== null && $curGoroutine.deferStack.indexOf(deferred) == -1) { - throw jsErr; - } - if (jsErr !== null) { - var newErr = null; - try { - $panic(new $jsErrorPtr(jsErr)); - } catch (err) { - newErr = err; - } - $callDeferred(deferred, newErr); - return; - } - if ($curGoroutine.asleep) { - return; - } - - $stackDepthOffset--; - var outerPanicStackDepth = $panicStackDepth; - var outerPanicValue = $panicValue; - - var localPanicValue = $curGoroutine.panicStack.pop(); - if (localPanicValue !== undefined) { - $panicStackDepth = $getStackDepth(); - $panicValue = localPanicValue; - } - - try { - while (true) { - if (deferred === null) { - deferred = $curGoroutine.deferStack[$curGoroutine.deferStack.length - 1]; - if (deferred === undefined) { - /* The panic reached the top of the stack. Clear it and throw it as a JavaScript error. */ - $panicStackDepth = null; - if (localPanicValue.Object instanceof Error) { - throw localPanicValue.Object; - } - var msg; - if (localPanicValue.constructor === $String) { - msg = localPanicValue.$val; - } else if (localPanicValue.Error !== undefined) { - msg = localPanicValue.Error(); - } else if (localPanicValue.String !== undefined) { - msg = localPanicValue.String(); - } else { - msg = localPanicValue; - } - throw new Error(msg); - } - } - var call = deferred.pop(); - if (call === undefined) { - $curGoroutine.deferStack.pop(); - if (localPanicValue !== undefined) { - deferred = null; - continue; - } - return; - } - var r = call[0].apply(call[2], call[1]); - if (r && r.$blk !== undefined) { - deferred.push([r.$blk, [], r]); - if (fromPanic) { - throw null; - } - return; - } - - if (localPanicValue !== undefined && $panicStackDepth === null) { - /* error was recovered */ - if (fromPanic) { - throw null; - } - return; - } - } - } catch(e) { - // Deferred function threw a JavaScript exception or tries to unwind stack - // to the point where a panic was handled. - if (fromPanic) { - // Re-throw the exception to reach deferral execution call at the end - // of the function. - throw e; - } - // We are at the end of the function, handle the error or re-throw to - // continue unwinding if necessary, or simply stop unwinding if we got far - // enough. - $callDeferred(deferred, e, fromPanic); - } finally { - if (localPanicValue !== undefined) { - if ($panicStackDepth !== null) { - $curGoroutine.panicStack.push(localPanicValue); - } - $panicStackDepth = outerPanicStackDepth; - $panicValue = outerPanicValue; - } - $stackDepthOffset++; - } -}; - -var $panic = function(value) { - $curGoroutine.panicStack.push(value); - $callDeferred(null, null, true); -}; -var $recover = function() { - if ($panicStackDepth === null || ($panicStackDepth !== undefined && $panicStackDepth !== $getStackDepth() - 2)) { - return $ifaceNil; - } - $panicStackDepth = null; - return $panicValue; -}; -var $throw = function(err) { throw err; }; - -var $noGoroutine = { asleep: false, exit: false, deferStack: [], panicStack: [] }; -var $curGoroutine = $noGoroutine, $totalGoroutines = 0, $awakeGoroutines = 0, $checkForDeadlock = true, $exportedFunctions = 0; -var $mainFinished = false; -var $go = function(fun, args) { - $totalGoroutines++; - $awakeGoroutines++; - var $goroutine = function() { - try { - $curGoroutine = $goroutine; - var r = fun.apply(undefined, args); - if (r && r.$blk !== undefined) { - fun = function() { return r.$blk(); }; - args = []; - return; - } - $goroutine.exit = true; - } catch (err) { - if (!$goroutine.exit) { - throw err; - } - } finally { - $curGoroutine = $noGoroutine; - if ($goroutine.exit) { /* also set by runtime.Goexit() */ - $totalGoroutines--; - $goroutine.asleep = true; - } - if ($goroutine.asleep) { - $awakeGoroutines--; - if (!$mainFinished && $awakeGoroutines === 0 && $checkForDeadlock && $exportedFunctions === 0) { - console.error("fatal error: all goroutines are asleep - deadlock!"); - if ($global.process !== undefined) { - $global.process.exit(2); - } - } - } - } - }; - $goroutine.asleep = false; - $goroutine.exit = false; - $goroutine.deferStack = []; - $goroutine.panicStack = []; - $schedule($goroutine); -}; - -var $scheduled = []; -var $runScheduled = function() { - // For nested setTimeout calls browsers enforce 4ms minimum delay. We minimize - // the effect of this penalty by queueing the timer preemptively before we run - // the goroutines, and later cancelling it if it turns out unneeded. See: - // https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#nested_timeouts - var nextRun = setTimeout($runScheduled); - try { - var start = Date.now(); - var r; - while ((r = $scheduled.shift()) !== undefined) { - r(); - // We need to interrupt this loop in order to allow the event loop to - // process timers, IO, etc. However, invoking scheduling through - // setTimeout is ~1000 times more expensive, so we amortize this cost by - // looping until the 4ms minimal delay has elapsed (assuming there are - // scheduled goroutines to run), and then yield to the event loop. - var elapsed = Date.now() - start; - if (elapsed > 4 || elapsed < 0) { break; } - } - } finally { - if ($scheduled.length == 0) { - // Cancel scheduling pass if there's nothing to run. - clearTimeout(nextRun); - } - } -}; - -var $schedule = function(goroutine) { - if (goroutine.asleep) { - goroutine.asleep = false; - $awakeGoroutines++; - } - $scheduled.push(goroutine); - if ($curGoroutine === $noGoroutine) { - $runScheduled(); - } -}; - -var $setTimeout = function(f, t) { - $awakeGoroutines++; - return setTimeout(function() { - $awakeGoroutines--; - f(); - }, t); -}; - -var $block = function() { - if ($curGoroutine === $noGoroutine) { - $throwRuntimeError("cannot block in JavaScript callback, fix by wrapping code in goroutine"); - } - $curGoroutine.asleep = true; -}; - -var $restore = function(context, params) { - if (context !== undefined && context.$blk !== undefined) { - return context; - } - return params; -} - -var $send = function(chan, value) { - if (chan.$closed) { - $throwRuntimeError("send on closed channel"); - } - var queuedRecv = chan.$recvQueue.shift(); - if (queuedRecv !== undefined) { - queuedRecv([value, true]); - return; - } - if (chan.$buffer.length < chan.$capacity) { - chan.$buffer.push(value); - return; - } - - var thisGoroutine = $curGoroutine; - var closedDuringSend; - chan.$sendQueue.push(function(closed) { - closedDuringSend = closed; - $schedule(thisGoroutine); - return value; - }); - $block(); - return { - $blk: function() { - if (closedDuringSend) { - $throwRuntimeError("send on closed channel"); - } - } - }; -}; -var $recv = function(chan) { - var queuedSend = chan.$sendQueue.shift(); - if (queuedSend !== undefined) { - chan.$buffer.push(queuedSend(false)); - } - var bufferedValue = chan.$buffer.shift(); - if (bufferedValue !== undefined) { - return [bufferedValue, true]; - } - if (chan.$closed) { - return [chan.$elem.zero(), false]; - } - - var thisGoroutine = $curGoroutine; - var f = { $blk: function() { return this.value; } }; - var queueEntry = function(v) { - f.value = v; - $schedule(thisGoroutine); - }; - chan.$recvQueue.push(queueEntry); - $block(); - return f; -}; -var $close = function(chan) { - if (chan.$closed) { - $throwRuntimeError("close of closed channel"); - } - chan.$closed = true; - while (true) { - var queuedSend = chan.$sendQueue.shift(); - if (queuedSend === undefined) { - break; - } - queuedSend(true); /* will panic */ - } - while (true) { - var queuedRecv = chan.$recvQueue.shift(); - if (queuedRecv === undefined) { - break; - } - queuedRecv([chan.$elem.zero(), false]); - } -}; -var $select = function(comms) { - var ready = []; - var selection = -1; - for (var i = 0; i < comms.length; i++) { - var comm = comms[i]; - var chan = comm[0]; - switch (comm.length) { - case 0: /* default */ - selection = i; - break; - case 1: /* recv */ - if (chan.$sendQueue.length !== 0 || chan.$buffer.length !== 0 || chan.$closed) { - ready.push(i); - } - break; - case 2: /* send */ - if (chan.$closed) { - $throwRuntimeError("send on closed channel"); - } - if (chan.$recvQueue.length !== 0 || chan.$buffer.length < chan.$capacity) { - ready.push(i); - } - break; - } - } - - if (ready.length !== 0) { - selection = ready[Math.floor(Math.random() * ready.length)]; - } - if (selection !== -1) { - var comm = comms[selection]; - switch (comm.length) { - case 0: /* default */ - return [selection]; - case 1: /* recv */ - return [selection, $recv(comm[0])]; - case 2: /* send */ - $send(comm[0], comm[1]); - return [selection]; - } - } - - var entries = []; - var thisGoroutine = $curGoroutine; - var f = { $blk: function() { return this.selection; } }; - var removeFromQueues = function() { - for (var i = 0; i < entries.length; i++) { - var entry = entries[i]; - var queue = entry[0]; - var index = queue.indexOf(entry[1]); - if (index !== -1) { - queue.splice(index, 1); - } - } - }; - for (var i = 0; i < comms.length; i++) { - (function(i) { - var comm = comms[i]; - switch (comm.length) { - case 1: /* recv */ - var queueEntry = function(value) { - f.selection = [i, value]; - removeFromQueues(); - $schedule(thisGoroutine); - }; - entries.push([comm[0].$recvQueue, queueEntry]); - comm[0].$recvQueue.push(queueEntry); - break; - case 2: /* send */ - var queueEntry = function() { - if (comm[0].$closed) { - $throwRuntimeError("send on closed channel"); - } - f.selection = [i]; - removeFromQueues(); - $schedule(thisGoroutine); - return comm[1]; - }; - entries.push([comm[0].$sendQueue, queueEntry]); - comm[0].$sendQueue.push(queueEntry); - break; - } - })(i); - } - $block(); - return f; -}; - -var $jsObjectPtr, $jsErrorPtr; - -var $needsExternalization = function(t) { - switch (t.kind) { - case $kindBool: - case $kindInt: - case $kindInt8: - case $kindInt16: - case $kindInt32: - case $kindUint: - case $kindUint8: - case $kindUint16: - case $kindUint32: - case $kindUintptr: - case $kindFloat32: - case $kindFloat64: - return false; - default: - return t !== $jsObjectPtr; - } -}; - -var $externalize = function(v, t, makeWrapper) { - if (t === $jsObjectPtr) { - return v; - } - switch (t.kind) { - case $kindBool: - case $kindInt: - case $kindInt8: - case $kindInt16: - case $kindInt32: - case $kindUint: - case $kindUint8: - case $kindUint16: - case $kindUint32: - case $kindUintptr: - case $kindFloat32: - case $kindFloat64: - return v; - case $kindInt64: - case $kindUint64: - return $flatten64(v); - case $kindArray: - if ($needsExternalization(t.elem)) { - return $mapArray(v, function(e) { return $externalize(e, t.elem, makeWrapper); }); - } - return v; - case $kindFunc: - return $externalizeFunction(v, t, false, makeWrapper); - case $kindInterface: - if (v === $ifaceNil) { - return null; - } - if (v.constructor === $jsObjectPtr) { - return v.$val.object; - } - return $externalize(v.$val, v.constructor, makeWrapper); - case $kindMap: - var m = {}; - var keys = $keys(v); - for (var i = 0; i < keys.length; i++) { - var entry = v[keys[i]]; - m[$externalize(entry.k, t.key, makeWrapper)] = $externalize(entry.v, t.elem, makeWrapper); - } - return m; - case $kindPtr: - if (v === t.nil) { - return null; - } - return $externalize(v.$get(), t.elem, makeWrapper); - case $kindSlice: - if ($needsExternalization(t.elem)) { - return $mapArray($sliceToNativeArray(v), function(e) { return $externalize(e, t.elem, makeWrapper); }); - } - return $sliceToNativeArray(v); - case $kindString: - if ($isASCII(v)) { - return v; - } - var s = "", r; - for (var i = 0; i < v.length; i += r[1]) { - r = $decodeRune(v, i); - var c = r[0]; - if (c > 0xFFFF) { - var h = Math.floor((c - 0x10000) / 0x400) + 0xD800; - var l = (c - 0x10000) % 0x400 + 0xDC00; - s += String.fromCharCode(h, l); - continue; - } - s += String.fromCharCode(c); - } - return s; - case $kindStruct: - var timePkg = $packages["time"]; - if (timePkg !== undefined && v.constructor === timePkg.Time.ptr) { - var milli = $div64(v.UnixNano(), new $Int64(0, 1000000)); - return new Date($flatten64(milli)); - } - - var noJsObject = {}; - var searchJsObject = function(v, t) { - if (t === $jsObjectPtr) { - return v; - } - switch (t.kind) { - case $kindPtr: - if (v === t.nil) { - return noJsObject; - } - return searchJsObject(v.$get(), t.elem); - case $kindStruct: - var f = t.fields[0]; - return searchJsObject(v[f.prop], f.typ); - case $kindInterface: - return searchJsObject(v.$val, v.constructor); - default: - return noJsObject; - } - }; - var o = searchJsObject(v, t); - if (o !== noJsObject) { - return o; - } - - if (makeWrapper !== undefined) { - return makeWrapper(v); - } - - o = {}; - for (var i = 0; i < t.fields.length; i++) { - var f = t.fields[i]; - if (!f.exported) { - continue; - } - o[f.name] = $externalize(v[f.prop], f.typ, makeWrapper); - } - return o; - } - $throwRuntimeError("cannot externalize " + t.string); -}; - -var $externalizeFunction = function(v, t, passThis, makeWrapper) { - if (v === $throwNilPointerError) { - return null; - } - if (v.$externalizeWrapper === undefined) { - $checkForDeadlock = false; - v.$externalizeWrapper = function() { - var args = []; - for (var i = 0; i < t.params.length; i++) { - if (t.variadic && i === t.params.length - 1) { - var vt = t.params[i].elem, varargs = []; - for (var j = i; j < arguments.length; j++) { - varargs.push($internalize(arguments[j], vt, makeWrapper)); - } - args.push(new (t.params[i])(varargs)); - break; - } - args.push($internalize(arguments[i], t.params[i], makeWrapper)); - } - var result = v.apply(passThis ? this : undefined, args); - switch (t.results.length) { - case 0: - return; - case 1: - return $externalize($copyIfRequired(result, t.results[0]), t.results[0], makeWrapper); - default: - for (var i = 0; i < t.results.length; i++) { - result[i] = $externalize($copyIfRequired(result[i], t.results[i]), t.results[i], makeWrapper); - } - return result; - } - }; - } - return v.$externalizeWrapper; -}; - -var $internalize = function(v, t, recv, seen, makeWrapper) { - if (t === $jsObjectPtr) { - return v; - } - if (t === $jsObjectPtr.elem) { - $throwRuntimeError("cannot internalize js.Object, use *js.Object instead"); - } - if (v && v.__internal_object__ !== undefined) { - return $assertType(v.__internal_object__, t, false); - } - var timePkg = $packages["time"]; - if (timePkg !== undefined && t === timePkg.Time) { - if (!(v !== null && v !== undefined && v.constructor === Date)) { - $throwRuntimeError("cannot internalize time.Time from " + typeof v + ", must be Date"); - } - return timePkg.Unix(new $Int64(0, 0), new $Int64(0, v.getTime() * 1000000)); - } - - // Cache for values we've already internalized in order to deal with circular - // references. - if (seen === undefined) { seen = new Map(); } - if (!seen.has(t)) { seen.set(t, new Map()); } - if (seen.get(t).has(v)) { return seen.get(t).get(v); } - - switch (t.kind) { - case $kindBool: - return !!v; - case $kindInt: - return parseInt(v); - case $kindInt8: - return parseInt(v) << 24 >> 24; - case $kindInt16: - return parseInt(v) << 16 >> 16; - case $kindInt32: - return parseInt(v) >> 0; - case $kindUint: - return parseInt(v); - case $kindUint8: - return parseInt(v) << 24 >>> 24; - case $kindUint16: - return parseInt(v) << 16 >>> 16; - case $kindUint32: - case $kindUintptr: - return parseInt(v) >>> 0; - case $kindInt64: - case $kindUint64: - return new t(0, v); - case $kindFloat32: - case $kindFloat64: - return parseFloat(v); - case $kindArray: - if (v.length !== t.len) { - $throwRuntimeError("got array with wrong size from JavaScript native"); - } - return $mapArray(v, function(e) { return $internalize(e, t.elem, makeWrapper); }); - case $kindFunc: - return function() { - var args = []; - for (var i = 0; i < t.params.length; i++) { - if (t.variadic && i === t.params.length - 1) { - var vt = t.params[i].elem, varargs = arguments[i]; - for (var j = 0; j < varargs.$length; j++) { - args.push($externalize(varargs.$array[varargs.$offset + j], vt, makeWrapper)); - } - break; - } - args.push($externalize(arguments[i], t.params[i], makeWrapper)); - } - var result = v.apply(recv, args); - switch (t.results.length) { - case 0: - return; - case 1: - return $internalize(result, t.results[0], makeWrapper); - default: - for (var i = 0; i < t.results.length; i++) { - result[i] = $internalize(result[i], t.results[i], makeWrapper); - } - return result; - } - }; - case $kindInterface: - if (t.methods.length !== 0) { - $throwRuntimeError("cannot internalize " + t.string); - } - if (v === null) { - return $ifaceNil; - } - if (v === undefined) { - return new $jsObjectPtr(undefined); - } - switch (v.constructor) { - case Int8Array: - return new ($sliceType($Int8))(v); - case Int16Array: - return new ($sliceType($Int16))(v); - case Int32Array: - return new ($sliceType($Int))(v); - case Uint8Array: - return new ($sliceType($Uint8))(v); - case Uint16Array: - return new ($sliceType($Uint16))(v); - case Uint32Array: - return new ($sliceType($Uint))(v); - case Float32Array: - return new ($sliceType($Float32))(v); - case Float64Array: - return new ($sliceType($Float64))(v); - case Array: - return $internalize(v, $sliceType($emptyInterface), makeWrapper); - case Boolean: - return new $Bool(!!v); - case Date: - if (timePkg === undefined) { - /* time package is not present, internalize as &js.Object{Date} so it can be externalized into original Date. */ - return new $jsObjectPtr(v); - } - return new timePkg.Time($internalize(v, timePkg.Time, makeWrapper)); - case (function () { }).constructor: // is usually Function, but in Chrome extensions it is something else - var funcType = $funcType([$sliceType($emptyInterface)], [$jsObjectPtr], true); - return new funcType($internalize(v, funcType, makeWrapper)); - case Number: - return new $Float64(parseFloat(v)); - case String: - return new $String($internalize(v, $String, makeWrapper)); - default: - if ($global.Node && v instanceof $global.Node) { - return new $jsObjectPtr(v); - } - var mapType = $mapType($String, $emptyInterface); - return new mapType($internalize(v, mapType, recv, seen, makeWrapper)); - } - case $kindMap: - var m = {}; - seen.get(t).set(v, m); - var keys = $keys(v); - for (var i = 0; i < keys.length; i++) { - var k = $internalize(keys[i], t.key, recv, seen, makeWrapper); - m[t.key.keyFor(k)] = { k: k, v: $internalize(v[keys[i]], t.elem, recv, seen, makeWrapper) }; - } - return m; - case $kindPtr: - if (t.elem.kind === $kindStruct) { - return $internalize(v, t.elem, makeWrapper); - } - case $kindSlice: - return new t($mapArray(v, function(e) { return $internalize(e, t.elem, makeWrapper); })); - case $kindString: - v = String(v); - if ($isASCII(v)) { - return v; - } - var s = ""; - var i = 0; - while (i < v.length) { - var h = v.charCodeAt(i); - if (0xD800 <= h && h <= 0xDBFF) { - var l = v.charCodeAt(i + 1); - var c = (h - 0xD800) * 0x400 + l - 0xDC00 + 0x10000; - s += $encodeRune(c); - i += 2; - continue; - } - s += $encodeRune(h); - i++; - } - return s; - case $kindStruct: - var noJsObject = {}; - var searchJsObject = function(t) { - if (t === $jsObjectPtr) { - return v; - } - if (t === $jsObjectPtr.elem) { - $throwRuntimeError("cannot internalize js.Object, use *js.Object instead"); - } - switch (t.kind) { - case $kindPtr: - return searchJsObject(t.elem); - case $kindStruct: - var f = t.fields[0]; - var o = searchJsObject(f.typ); - if (o !== noJsObject) { - var n = new t.ptr(); - n[f.prop] = o; - return n; - } - return noJsObject; - default: - return noJsObject; - } - }; - var o = searchJsObject(t); - if (o !== noJsObject) { - return o; - } - } - $throwRuntimeError("cannot internalize " + t.string); -}; - -var $copyIfRequired = function(v, typ) { - // interface values - if (v && v.constructor && v.constructor.copy) { - return new v.constructor($clone(v.$val, v.constructor)) - } - // array and struct values - if (typ.copy) { - var clone = typ.zero(); - typ.copy(clone, v); - return clone; - } - return v; -} - -/* $isASCII reports whether string s contains only ASCII characters. */ -var $isASCII = function(s) { - for (var i = 0; i < s.length; i++) { - if (s.charCodeAt(i) >= 128) { - return false; - } - } - return true; -}; - -$packages["github.com/gopherjs/gopherjs/js"] = (function() { - var $pkg = {}, $init, Object, Error, M, sliceType, ptrType, sliceType$2, funcType, funcType$1, funcType$2, ptrType$1, MakeWrapper, MakeFullWrapper, init; - Object = $pkg.Object = $newType(0, $kindStruct, "js.Object", true, "github.com/gopherjs/gopherjs/js", true, function(object_) { - this.$val = this; - if (arguments.length === 0) { - this.object = null; - return; - } - this.object = object_; - }); - Error = $pkg.Error = $newType(0, $kindStruct, "js.Error", true, "github.com/gopherjs/gopherjs/js", true, function(Object_) { - this.$val = this; - if (arguments.length === 0) { - this.Object = null; - return; - } - this.Object = Object_; - }); - M = $pkg.M = $newType(4, $kindMap, "js.M", true, "github.com/gopherjs/gopherjs/js", true, null); - sliceType = $sliceType($emptyInterface); - ptrType = $ptrType(Object); - sliceType$2 = $sliceType(ptrType); - funcType = $funcType([sliceType$2], [ptrType], true); - funcType$1 = $funcType([], [ptrType], false); - funcType$2 = $funcType([ptrType], [], false); - ptrType$1 = $ptrType(Error); - Object.ptr.prototype.Get = function(key) { - var key, o; - o = this; - return o.object[$externalize(key, $String)]; - }; - Object.prototype.Get = function(key) { return this.$val.Get(key); }; - Object.ptr.prototype.Set = function(key, value) { - var key, o, value; - o = this; - o.object[$externalize(key, $String)] = $externalize(value, $emptyInterface); - }; - Object.prototype.Set = function(key, value) { return this.$val.Set(key, value); }; - Object.ptr.prototype.Delete = function(key) { - var key, o; - o = this; - delete o.object[$externalize(key, $String)]; - }; - Object.prototype.Delete = function(key) { return this.$val.Delete(key); }; - Object.ptr.prototype.Length = function() { - var o; - o = this; - return $parseInt(o.object.length); - }; - Object.prototype.Length = function() { return this.$val.Length(); }; - Object.ptr.prototype.Index = function(i) { - var i, o; - o = this; - return o.object[i]; - }; - Object.prototype.Index = function(i) { return this.$val.Index(i); }; - Object.ptr.prototype.SetIndex = function(i, value) { - var i, o, value; - o = this; - o.object[i] = $externalize(value, $emptyInterface); - }; - Object.prototype.SetIndex = function(i, value) { return this.$val.SetIndex(i, value); }; - Object.ptr.prototype.Call = function(name, args) { - var args, name, o, obj; - o = this; - return (obj = o.object, obj[$externalize(name, $String)].apply(obj, $externalize(args, sliceType))); - }; - Object.prototype.Call = function(name, args) { return this.$val.Call(name, args); }; - Object.ptr.prototype.Invoke = function(args) { - var args, o; - o = this; - return o.object.apply(undefined, $externalize(args, sliceType)); - }; - Object.prototype.Invoke = function(args) { return this.$val.Invoke(args); }; - Object.ptr.prototype.New = function(args) { - var args, o; - o = this; - return new ($global.Function.prototype.bind.apply(o.object, [undefined].concat($externalize(args, sliceType)))); - }; - Object.prototype.New = function(args) { return this.$val.New(args); }; - Object.ptr.prototype.Bool = function() { - var o; - o = this; - return !!(o.object); - }; - Object.prototype.Bool = function() { return this.$val.Bool(); }; - Object.ptr.prototype.String = function() { - var o; - o = this; - return $internalize(o.object, $String); - }; - Object.prototype.String = function() { return this.$val.String(); }; - Object.ptr.prototype.Int = function() { - var o; - o = this; - return $parseInt(o.object) >> 0; - }; - Object.prototype.Int = function() { return this.$val.Int(); }; - Object.ptr.prototype.Int64 = function() { - var o; - o = this; - return $internalize(o.object, $Int64); - }; - Object.prototype.Int64 = function() { return this.$val.Int64(); }; - Object.ptr.prototype.Uint64 = function() { - var o; - o = this; - return $internalize(o.object, $Uint64); - }; - Object.prototype.Uint64 = function() { return this.$val.Uint64(); }; - Object.ptr.prototype.Float = function() { - var o; - o = this; - return $parseFloat(o.object); - }; - Object.prototype.Float = function() { return this.$val.Float(); }; - Object.ptr.prototype.Interface = function() { - var o; - o = this; - return $internalize(o.object, $emptyInterface); - }; - Object.prototype.Interface = function() { return this.$val.Interface(); }; - Object.ptr.prototype.Unsafe = function() { - var o; - o = this; - return o.object; - }; - Object.prototype.Unsafe = function() { return this.$val.Unsafe(); }; - Error.ptr.prototype.Error = function() { - var err; - err = this; - return "JavaScript error: " + $internalize(err.Object.message, $String); - }; - Error.prototype.Error = function() { return this.$val.Error(); }; - Error.ptr.prototype.Stack = function() { - var err; - err = this; - return $internalize(err.Object.stack, $String); - }; - Error.prototype.Stack = function() { return this.$val.Stack(); }; - MakeWrapper = function(i) { - var i, i$1, m, methods, o, v; - v = i; - o = new ($global.Object)(); - o.__internal_object__ = v; - methods = v.constructor.methods; - i$1 = 0; - while (true) { - if (!(i$1 < $parseInt(methods.length))) { break; } - m = [m]; - m[0] = methods[i$1]; - if (!($internalize(m[0].pkg, $String) === "")) { - i$1 = i$1 + (1) >> 0; - continue; - } - o[$externalize($internalize(m[0].name, $String), $String)] = $externalize((function(m) { return function(args) { - var args; - return $externalizeFunction(v[$externalize($internalize(m[0].prop, $String), $String)], m[0].typ, $externalize(true, $Bool)).apply(v, $externalize(args, sliceType$2)); - }; })(m), funcType); - i$1 = i$1 + (1) >> 0; - } - return o; - }; - $pkg.MakeWrapper = MakeWrapper; - MakeFullWrapper = function(i) { - var {constructor, defineProperty, e, f, fields, i, i$1, i$2, i$3, internalObj, m, methods, ms, pkg, pkgTyp, ptr, typ, wrapperObj, $s, $r, $c} = $restore(this, {i}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - internalObj = [internalObj]; - wrapperObj = [wrapperObj]; - internalObj[0] = i; - constructor = internalObj[0].constructor; - wrapperObj[0] = new ($global.Object)(); - defineProperty = (function(internalObj, wrapperObj) { return function(key, descriptor) { - var descriptor, key; - $global.Object.defineProperty(wrapperObj[0], $externalize(key, $String), $externalize(descriptor, M)); - }; })(internalObj, wrapperObj); - $r = defineProperty("__internal_object__", $makeMap($String.keyFor, [{ k: "value", v: new $jsObjectPtr(internalObj[0]) }])); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - typ = $internalize(constructor.string, $String); - pkg = $internalize(constructor.pkg, $String); - ptr = ""; - if (typ.charCodeAt(0) === 42) { - ptr = "*"; - } - i$1 = 0; - while (true) { - if (!(i$1 < typ.length)) { break; } - if (typ.charCodeAt(i$1) === 46) { - typ = $substring(typ, (i$1 + 1 >> 0)); - break; - } - i$1 = i$1 + (1) >> 0; - } - pkgTyp = pkg + "." + ptr + typ; - $r = defineProperty("$type", $makeMap($String.keyFor, [{ k: "value", v: new $String(pkgTyp) }])); /* */ $s = 2; case 2: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - fields = null; - methods = new ($global.Array)(); - ms = constructor.methods; - if (!(ms === undefined)) { - methods = methods.concat(ms); - } - e = constructor.elem; - if (!(e === undefined)) { - fields = e.fields; - methods = methods.concat(e.methods); - } else { - fields = constructor.fields; - } - i$2 = 0; - /* while (true) { */ case 3: - /* if (!(i$2 < $parseInt(methods.length))) { break; } */ if(!(i$2 < $parseInt(methods.length))) { $s = 4; continue; } - m = [m]; - m[0] = methods[i$2]; - if (!($internalize(m[0].pkg, $String) === "")) { - i$2 = i$2 + (1) >> 0; - /* continue; */ $s = 3; continue; - } - $r = defineProperty($internalize(m[0].prop, $String), $makeMap($String.keyFor, [{ k: "value", v: new funcType((function(internalObj, m, wrapperObj) { return function(args) { - var args; - return $externalizeFunction(internalObj[0][$externalize($internalize(m[0].prop, $String), $String)], m[0].typ, $externalize(true, $Bool), MakeFullWrapper).apply(internalObj[0], $externalize(args, sliceType$2)); - }; })(internalObj, m, wrapperObj)) }])); /* */ $s = 5; case 5: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - i$2 = i$2 + (1) >> 0; - $s = 3; continue; - case 4: - /* */ if (!(fields === undefined)) { $s = 6; continue; } - /* */ $s = 7; continue; - /* if (!(fields === undefined)) { */ case 6: - i$3 = 0; - /* while (true) { */ case 8: - /* if (!(i$3 < $parseInt(fields.length))) { break; } */ if(!(i$3 < $parseInt(fields.length))) { $s = 9; continue; } - f = [f]; - f[0] = fields[i$3]; - if (!!!(f[0].exported)) { - i$3 = i$3 + (1) >> 0; - /* continue; */ $s = 8; continue; - } - $r = defineProperty($internalize(f[0].prop, $String), $makeMap($String.keyFor, [{ k: "get", v: new funcType$1((function(f, internalObj, wrapperObj) { return function() { - var vc; - vc = $copyIfRequired(internalObj[0].$val[$externalize($internalize(f[0].prop, $String), $String)], f[0].typ); - return $externalize(vc, f[0].typ, MakeFullWrapper); - }; })(f, internalObj, wrapperObj)) }, { k: "set", v: new funcType$2((function(f, internalObj, wrapperObj) { return function(jv) { - var gv, jv; - gv = $internalize(jv, f[0].typ, MakeFullWrapper); - internalObj[0].$val[$externalize($internalize(f[0].prop, $String), $String)] = gv; - }; })(f, internalObj, wrapperObj)) }])); /* */ $s = 10; case 10: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - i$3 = i$3 + (1) >> 0; - $s = 8; continue; - case 9: - /* } */ case 7: - $s = -1; return wrapperObj[0]; - /* */ } return; } var $f = {$blk: MakeFullWrapper, $c: true, $r, constructor, defineProperty, e, f, fields, i, i$1, i$2, i$3, internalObj, m, methods, ms, pkg, pkgTyp, ptr, typ, wrapperObj, $s};return $f; - }; - $pkg.MakeFullWrapper = MakeFullWrapper; - init = function() { - var e; - e = new Error.ptr(null); - $unused(e); - }; - ptrType.methods = [{prop: "Get", name: "Get", pkg: "", typ: $funcType([$String], [ptrType], false)}, {prop: "Set", name: "Set", pkg: "", typ: $funcType([$String, $emptyInterface], [], false)}, {prop: "Delete", name: "Delete", pkg: "", typ: $funcType([$String], [], false)}, {prop: "Length", name: "Length", pkg: "", typ: $funcType([], [$Int], false)}, {prop: "Index", name: "Index", pkg: "", typ: $funcType([$Int], [ptrType], false)}, {prop: "SetIndex", name: "SetIndex", pkg: "", typ: $funcType([$Int, $emptyInterface], [], false)}, {prop: "Call", name: "Call", pkg: "", typ: $funcType([$String, sliceType], [ptrType], true)}, {prop: "Invoke", name: "Invoke", pkg: "", typ: $funcType([sliceType], [ptrType], true)}, {prop: "New", name: "New", pkg: "", typ: $funcType([sliceType], [ptrType], true)}, {prop: "Bool", name: "Bool", pkg: "", typ: $funcType([], [$Bool], false)}, {prop: "String", name: "String", pkg: "", typ: $funcType([], [$String], false)}, {prop: "Int", name: "Int", pkg: "", typ: $funcType([], [$Int], false)}, {prop: "Int64", name: "Int64", pkg: "", typ: $funcType([], [$Int64], false)}, {prop: "Uint64", name: "Uint64", pkg: "", typ: $funcType([], [$Uint64], false)}, {prop: "Float", name: "Float", pkg: "", typ: $funcType([], [$Float64], false)}, {prop: "Interface", name: "Interface", pkg: "", typ: $funcType([], [$emptyInterface], false)}, {prop: "Unsafe", name: "Unsafe", pkg: "", typ: $funcType([], [$Uintptr], false)}]; - ptrType$1.methods = [{prop: "Error", name: "Error", pkg: "", typ: $funcType([], [$String], false)}, {prop: "Stack", name: "Stack", pkg: "", typ: $funcType([], [$String], false)}]; - Object.init("github.com/gopherjs/gopherjs/js", [{prop: "object", name: "object", embedded: false, exported: false, typ: ptrType, tag: ""}]); - Error.init("", [{prop: "Object", name: "Object", embedded: true, exported: true, typ: ptrType, tag: ""}]); - M.init($String, $emptyInterface); - $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: - init(); - /* */ } return; } if ($f === undefined) { $f = { $blk: $init }; } $f.$s = $s; $f.$r = $r; return $f; - }; - $pkg.$init = $init; - return $pkg; -})(); -$packages["runtime"] = (function() { - var $pkg = {}, $init, js, _type, TypeAssertionError, errorString, ptrType$1, ptrType$2, buildVersion, init, throw$1; - js = $packages["github.com/gopherjs/gopherjs/js"]; - _type = $pkg._type = $newType(0, $kindStruct, "runtime._type", true, "runtime", false, function(str_) { - this.$val = this; - if (arguments.length === 0) { - this.str = ""; - return; - } - this.str = str_; - }); - TypeAssertionError = $pkg.TypeAssertionError = $newType(0, $kindStruct, "runtime.TypeAssertionError", true, "runtime", true, function(_interface_, concrete_, asserted_, missingMethod_) { - this.$val = this; - if (arguments.length === 0) { - this._interface = ptrType$1.nil; - this.concrete = ptrType$1.nil; - this.asserted = ptrType$1.nil; - this.missingMethod = ""; - return; - } - this._interface = _interface_; - this.concrete = concrete_; - this.asserted = asserted_; - this.missingMethod = missingMethod_; - }); - errorString = $pkg.errorString = $newType(8, $kindString, "runtime.errorString", true, "runtime", false, null); - ptrType$1 = $ptrType(_type); - ptrType$2 = $ptrType(TypeAssertionError); - _type.ptr.prototype.string = function() { - var t; - t = this; - return t.str; - }; - _type.prototype.string = function() { return this.$val.string(); }; - _type.ptr.prototype.pkgpath = function() { - var t; - t = this; - return ""; - }; - _type.prototype.pkgpath = function() { return this.$val.pkgpath(); }; - TypeAssertionError.ptr.prototype.RuntimeError = function() { - }; - TypeAssertionError.prototype.RuntimeError = function() { return this.$val.RuntimeError(); }; - TypeAssertionError.ptr.prototype.Error = function() { - var as, cs, e, inter, msg; - e = this; - inter = "interface"; - if (!(e._interface === ptrType$1.nil)) { - inter = e._interface.string(); - } - as = e.asserted.string(); - if (e.concrete === ptrType$1.nil) { - return "interface conversion: " + inter + " is nil, not " + as; - } - cs = e.concrete.string(); - if (e.missingMethod === "") { - msg = "interface conversion: " + inter + " is " + cs + ", not " + as; - if (cs === as) { - if (!(e.concrete.pkgpath() === e.asserted.pkgpath())) { - msg = msg + (" (types from different packages)"); - } else { - msg = msg + (" (types from different scopes)"); - } - } - return msg; - } - return "interface conversion: " + cs + " is not " + as + ": missing method " + e.missingMethod; - }; - TypeAssertionError.prototype.Error = function() { return this.$val.Error(); }; - init = function() { - var e, jsPkg; - jsPkg = $packages[$externalize("github.com/gopherjs/gopherjs/js", $String)]; - $jsObjectPtr = jsPkg.Object.ptr; - $jsErrorPtr = jsPkg.Error.ptr; - $throwRuntimeError = throw$1; - buildVersion = $internalize($goVersion, $String); - e = $ifaceNil; - e = new TypeAssertionError.ptr(ptrType$1.nil, ptrType$1.nil, ptrType$1.nil, ""); - $unused(e); - }; - errorString.prototype.RuntimeError = function() { - var e; - e = this.$val; - }; - $ptrType(errorString).prototype.RuntimeError = function() { return new errorString(this.$get()).RuntimeError(); }; - errorString.prototype.Error = function() { - var e; - e = this.$val; - return "runtime error: " + (e); - }; - $ptrType(errorString).prototype.Error = function() { return new errorString(this.$get()).Error(); }; - throw$1 = function(s) { - var s; - $panic(new errorString((s))); - }; - ptrType$1.methods = [{prop: "string", name: "string", pkg: "runtime", typ: $funcType([], [$String], false)}, {prop: "pkgpath", name: "pkgpath", pkg: "runtime", typ: $funcType([], [$String], false)}]; - ptrType$2.methods = [{prop: "RuntimeError", name: "RuntimeError", pkg: "", typ: $funcType([], [], false)}, {prop: "Error", name: "Error", pkg: "", typ: $funcType([], [$String], false)}]; - errorString.methods = [{prop: "RuntimeError", name: "RuntimeError", pkg: "", typ: $funcType([], [], false)}, {prop: "Error", name: "Error", pkg: "", typ: $funcType([], [$String], false)}]; - _type.init("runtime", [{prop: "str", name: "str", embedded: false, exported: false, typ: $String, tag: ""}]); - TypeAssertionError.init("runtime", [{prop: "_interface", name: "_interface", embedded: false, exported: false, typ: ptrType$1, tag: ""}, {prop: "concrete", name: "concrete", embedded: false, exported: false, typ: ptrType$1, tag: ""}, {prop: "asserted", name: "asserted", embedded: false, exported: false, typ: ptrType$1, tag: ""}, {prop: "missingMethod", name: "missingMethod", embedded: false, exported: false, typ: $String, 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 = js.$init(); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - buildVersion = ""; - init(); - /* */ } return; } if ($f === undefined) { $f = { $blk: $init }; } $f.$s = $s; $f.$r = $r; return $f; - }; - $pkg.$init = $init; - return $pkg; -})(); -$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, js, bits, arrayType, arrayType$1, arrayType$2, structType, math, _zero, posInf, negInf, nan, buf, max, min, Abs, Cos, Floor, Inf, IsInf, IsNaN, Max, Min, NaN, Pow, Signbit, Sin, Sqrt, init, Float64bits, Float64frombits; - js = $packages["github.com/gopherjs/gopherjs/js"]; - bits = $packages["math/bits"]; - arrayType = $arrayType($Uint32, 2); - arrayType$1 = $arrayType($Float32, 2); - arrayType$2 = $arrayType($Float64, 1); - structType = $structType("math", [{prop: "uint32array", name: "uint32array", embedded: false, exported: false, typ: arrayType, tag: ""}, {prop: "float32array", name: "float32array", embedded: false, exported: false, typ: arrayType$1, tag: ""}, {prop: "float64array", name: "float64array", embedded: false, exported: false, typ: arrayType$2, tag: ""}]); - max = function(x, y) { - var x, y; - if (IsInf(x, 1) || IsInf(y, 1)) { - return Inf(1); - } else if (IsNaN(x) || IsNaN(y)) { - return NaN(); - } else if ((x === 0) && (x === y)) { - if (Signbit(x)) { - return y; - } - return x; - } - if (x > y) { - return x; - } - return y; - }; - min = function(x, y) { - var x, y; - if (IsInf(x, -1) || IsInf(y, -1)) { - return Inf(-1); - } else if (IsNaN(x) || IsNaN(y)) { - return NaN(); - } else if ((x === 0) && (x === y)) { - if (Signbit(x)) { - return x; - } - return y; - } - if (x < y) { - return x; - } - return y; - }; - Abs = function(x) { - var x, x$1; - return Float64frombits((x$1 = Float64bits(x), new $Uint64(x$1.$high & ~2147483648, (x$1.$low & ~0) >>> 0))); - }; - $pkg.Abs = Abs; - Cos = function(x) { - var x; - return $parseFloat(math.cos(x)); - }; - $pkg.Cos = Cos; - Floor = function(x) { - var x; - return $parseFloat(math.floor(x)); - }; - $pkg.Floor = Floor; - Inf = function(sign) { - var sign; - if (sign >= 0) { - return posInf; - } else { - return negInf; - } - }; - $pkg.Inf = Inf; - IsInf = function(f, sign) { - var f, sign; - if (f === posInf) { - return sign >= 0; - } - if (f === negInf) { - return sign <= 0; - } - return false; - }; - $pkg.IsInf = IsInf; - IsNaN = function(f) { - var f, is; - is = false; - is = !((f === f)); - return is; - }; - $pkg.IsNaN = IsNaN; - Max = function(x, y) { - var x, y; - return max(x, y); - }; - $pkg.Max = Max; - Min = function(x, y) { - var x, y; - return min(x, y); - }; - $pkg.Min = Min; - NaN = function() { - return nan; - }; - $pkg.NaN = NaN; - Pow = function(x, y) { - var x, y; - if ((x === 1) || ((x === -1) && ((y === posInf) || (y === negInf)))) { - return 1; - } - return $parseFloat(math.pow(x, y)); - }; - $pkg.Pow = Pow; - Signbit = function(x) { - var x; - return x < 0 || (1 / x === negInf); - }; - $pkg.Signbit = Signbit; - Sin = function(x) { - var x; - return $parseFloat(math.sin(x)); - }; - $pkg.Sin = Sin; - Sqrt = function(x) { - var x; - return $parseFloat(math.sqrt(x)); - }; - $pkg.Sqrt = Sqrt; - init = function() { - var ab; - ab = new ($global.ArrayBuffer)(8); - buf.uint32array = new ($global.Uint32Array)(ab); - buf.float32array = new ($global.Float32Array)(ab); - buf.float64array = new ($global.Float64Array)(ab); - }; - Float64bits = function(f) { - var f, x, x$1; - buf.float64array[0] = f; - return (x = $shiftLeft64((new $Uint64(0, buf.uint32array[1])), 32), x$1 = (new $Uint64(0, buf.uint32array[0])), new $Uint64(x.$high + x$1.$high, x.$low + x$1.$low)); - }; - $pkg.Float64bits = Float64bits; - Float64frombits = function(b) { - var b; - buf.uint32array[0] = ((b.$low >>> 0)); - buf.uint32array[1] = (($shiftRightUint64(b, 32).$low >>> 0)); - return buf.float64array[0]; - }; - $pkg.Float64frombits = Float64frombits; - $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 = js.$init(); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - $r = bits.$init(); /* */ $s = 2; case 2: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - buf = new structType.ptr(arrayType.zero(), arrayType$1.zero(), arrayType$2.zero()); - math = $global.Math; - _zero = 0; - posInf = 1 / _zero; - negInf = -1 / _zero; - nan = $parseFloat($NaN); - init(); - /* */ } 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, math, Vector, Axis, Space, Shape, Line, ConvexPolygon, ContactSet, Circle, Projection, Object, Collision, Cell, sliceType, ptrType, sliceType$1, sliceType$2, ptrType$1, ptrType$2, sliceType$3, sliceType$4, ptrType$3, sliceType$5, ptrType$4, ptrType$5, ptrType$6, sliceType$6, ptrType$7, sliceType$7, mapType, Dot, NewSpace, NewLine, NewConvexPolygon, NewContactSet, NewRectangle, NewCircle, NewObject, axpyUnitaryTo, scalUnitaryTo, NewCollision, newCell; - math = $packages["math"]; - Vector = $pkg.Vector = $newType(12, $kindSlice, "resolv.Vector", true, "resolv", true, null); - Axis = $pkg.Axis = $newType(4, $kindInt, "resolv.Axis", true, "resolv", true, null); - Space = $pkg.Space = $newType(0, $kindStruct, "resolv.Space", true, "resolv", true, function(Cells_, CellWidth_, CellHeight_) { - this.$val = this; - if (arguments.length === 0) { - this.Cells = sliceType$2.nil; - this.CellWidth = 0; - this.CellHeight = 0; - return; - } - this.Cells = Cells_; - this.CellWidth = CellWidth_; - this.CellHeight = CellHeight_; - }); - Shape = $pkg.Shape = $newType(8, $kindInterface, "resolv.Shape", true, "resolv", true, null); - Line = $pkg.Line = $newType(0, $kindStruct, "resolv.Line", true, "resolv", true, function(Start_, End_) { - this.$val = this; - if (arguments.length === 0) { - this.Start = Vector.nil; - this.End = Vector.nil; - return; - } - this.Start = Start_; - this.End = End_; - }); - ConvexPolygon = $pkg.ConvexPolygon = $newType(0, $kindStruct, "resolv.ConvexPolygon", true, "resolv", true, function(Points_, X_, Y_, Closed_) { - this.$val = this; - if (arguments.length === 0) { - this.Points = sliceType$4.nil; - this.X = 0; - this.Y = 0; - this.Closed = false; - return; - } - this.Points = Points_; - this.X = X_; - this.Y = Y_; - this.Closed = Closed_; - }); - ContactSet = $pkg.ContactSet = $newType(0, $kindStruct, "resolv.ContactSet", true, "resolv", true, function(Points_, MTV_, Center_) { - this.$val = this; - if (arguments.length === 0) { - this.Points = sliceType$4.nil; - this.MTV = Vector.nil; - this.Center = Vector.nil; - return; - } - this.Points = Points_; - this.MTV = MTV_; - this.Center = Center_; - }); - Circle = $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_; - }); - Projection = $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_; - }); - Object = $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 = ptrType$1.nil; - this.X = 0; - this.Y = 0; - this.W = 0; - this.H = 0; - this.TouchingCells = sliceType$1.nil; - this.Data = $ifaceNil; - this.ignoreList = false; - this.tags = sliceType$6.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_; - }); - Collision = $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 = ptrType$2.nil; - this.dx = 0; - this.dy = 0; - this.Objects = sliceType$3.nil; - this.Cells = sliceType$1.nil; - return; - } - this.checkingObject = checkingObject_; - this.dx = dx_; - this.dy = dy_; - this.Objects = Objects_; - this.Cells = Cells_; - }); - Cell = $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 = sliceType$3.nil; - return; - } - this.X = X_; - this.Y = Y_; - this.Objects = Objects_; - }); - sliceType = $sliceType($Float64); - ptrType = $ptrType(Cell); - sliceType$1 = $sliceType(ptrType); - sliceType$2 = $sliceType(sliceType$1); - ptrType$1 = $ptrType(Space); - ptrType$2 = $ptrType(Object); - sliceType$3 = $sliceType(ptrType$2); - sliceType$4 = $sliceType(Vector); - ptrType$3 = $ptrType(Line); - sliceType$5 = $sliceType(ptrType$3); - ptrType$4 = $ptrType(Circle); - ptrType$5 = $ptrType(ConvexPolygon); - ptrType$6 = $ptrType(ContactSet); - sliceType$6 = $sliceType($String); - ptrType$7 = $ptrType(Collision); - sliceType$7 = $sliceType(Axis); - mapType = $mapType(ptrType$2, $Bool); - Vector.prototype.Clone = function() { - var clone, v; - v = this; - clone = $makeSlice(Vector, v.$length); - $copySlice(clone, v); - return clone; - }; - $ptrType(Vector).prototype.Clone = function() { return this.$get().Clone(); }; - Vector.prototype.Add = function(vs) { - var _i, _ref, dim, i, v, vs; - v = this; - dim = v.$length; - _ref = vs; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - i = _i; - if (((i < 0 || i >= vs.$length) ? ($throwRuntimeError("index out of range"), undefined) : vs.$array[vs.$offset + i]).$length > dim) { - axpyUnitaryTo($convertSliceType(v, sliceType), 1, $convertSliceType(v, sliceType), $convertSliceType($subslice(((i < 0 || i >= vs.$length) ? ($throwRuntimeError("index out of range"), undefined) : vs.$array[vs.$offset + i]), 0, dim), sliceType)); - } else { - axpyUnitaryTo($convertSliceType(v, sliceType), 1, $convertSliceType(v, sliceType), $convertSliceType(((i < 0 || i >= vs.$length) ? ($throwRuntimeError("index out of range"), undefined) : vs.$array[vs.$offset + i]), sliceType)); - } - _i++; - } - return v; - }; - $ptrType(Vector).prototype.Add = function(vs) { return this.$get().Add(vs); }; - Vector.prototype.Sub = function(vs) { - var _i, _ref, dim, i, v, vs; - v = this; - dim = v.$length; - _ref = vs; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - i = _i; - if (((i < 0 || i >= vs.$length) ? ($throwRuntimeError("index out of range"), undefined) : vs.$array[vs.$offset + i]).$length > dim) { - axpyUnitaryTo($convertSliceType(v, sliceType), -1, $convertSliceType($subslice(((i < 0 || i >= vs.$length) ? ($throwRuntimeError("index out of range"), undefined) : vs.$array[vs.$offset + i]), 0, dim), sliceType), $convertSliceType(v, sliceType)); - } else { - axpyUnitaryTo($convertSliceType(v, sliceType), -1, $convertSliceType(((i < 0 || i >= vs.$length) ? ($throwRuntimeError("index out of range"), undefined) : vs.$array[vs.$offset + i]), sliceType), $convertSliceType(v, sliceType)); - } - _i++; - } - return v; - }; - $ptrType(Vector).prototype.Sub = function(vs) { return this.$get().Sub(vs); }; - Vector.prototype.Scale = function(size) { - var size, v; - v = this; - scalUnitaryTo($convertSliceType(v, sliceType), size, $convertSliceType(v, sliceType)); - return v; - }; - $ptrType(Vector).prototype.Scale = function(size) { return this.$get().Scale(size); }; - Vector.prototype.Equal = function(v2) { - var _i, _ref, i, v, v2; - v = this; - if (!((v.$length === v2.$length))) { - return false; - } - _ref = v; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - i = _i; - if (math.Abs(((i < 0 || i >= v.$length) ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + i]) - ((i < 0 || i >= v2.$length) ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + i])) > 1e-08) { - return false; - } - _i++; - } - return true; - }; - $ptrType(Vector).prototype.Equal = function(v2) { return this.$get().Equal(v2); }; - Vector.prototype.Magnitude = function() { - var v; - v = this; - return math.Sqrt(v.Magnitude2()); - }; - $ptrType(Vector).prototype.Magnitude = function() { return this.$get().Magnitude(); }; - Vector.prototype.Magnitude2 = function() { - var _i, _ref, result, scalar, v; - v = this; - result = 0; - _ref = v; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - scalar = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - result = result + (scalar * scalar); - _i++; - } - return result; - }; - $ptrType(Vector).prototype.Magnitude2 = function() { return this.$get().Magnitude2(); }; - Vector.prototype.Unit = function() { - var _i, _ref, i, l, v; - v = this; - l = v.Magnitude(); - if (l < 1e-08) { - return v; - } - _ref = v; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - i = _i; - ((i < 0 || i >= v.$length) ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + i] = ((i < 0 || i >= v.$length) ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + i]) / l); - _i++; - } - return v; - }; - $ptrType(Vector).prototype.Unit = function() { return this.$get().Unit(); }; - Dot = function(v1, v2) { - var _i, _ref, _tmp, _tmp$1, _tmp$2, dim1, dim2, i, result, v1, v2; - _tmp = 0; - _tmp$1 = v1.$length; - _tmp$2 = v2.$length; - result = _tmp; - dim1 = _tmp$1; - dim2 = _tmp$2; - if (dim1 > dim2) { - v2 = $appendSlice(v2, $convertSliceType($makeSlice(Vector, (dim1 - dim2 >> 0)), sliceType)); - } - if (dim1 < dim2) { - v1 = $appendSlice(v1, $convertSliceType($makeSlice(Vector, (dim2 - dim1 >> 0)), sliceType)); - } - _ref = v1; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - i = _i; - result = result + (((i < 0 || i >= v1.$length) ? ($throwRuntimeError("index out of range"), undefined) : v1.$array[v1.$offset + i]) * ((i < 0 || i >= v2.$length) ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + i])); - _i++; - } - return result; - }; - $pkg.Dot = Dot; - Vector.prototype.Dot = function(v2) { - var v, v2; - v = this; - return Dot(v, v2); - }; - $ptrType(Vector).prototype.Dot = function(v2) { return this.$get().Dot(v2); }; - Vector.prototype.Cross = function(v2) { - var v, v2; - v = this; - if (!((v.$length === 3)) || !((v2.$length === 3))) { - return Vector.nil; - } - return new Vector([(1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1]) * (2 >= v2.$length ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + 2]) - (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2]) * (1 >= v2.$length ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + 1]), (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2]) * (0 >= v2.$length ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + 0]) - (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0]) * (2 >= v2.$length ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + 2]), (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0]) * (2 >= v2.$length ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + 2]) - (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2]) * (0 >= v2.$length ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + 0])]); - }; - $ptrType(Vector).prototype.Cross = function(v2) { return this.$get().Cross(v2); }; - Vector.prototype.Rotate = function(angle, as) { - var _1, _tmp, _tmp$1, _tmp$2, _tmp$3, _tmp$4, _tmp$5, angle, as, axis, cos, dim, sin, v, x, y, z, z$1; - v = this; - _tmp = 2; - _tmp$1 = v.$length; - axis = _tmp; - dim = _tmp$1; - if (dim === 0) { - return v; - } - if (as.$length > 0) { - axis = (0 >= as.$length ? ($throwRuntimeError("index out of range"), undefined) : as.$array[as.$offset + 0]); - } - if ((dim === 1) && !((axis === 2))) { - v = $append(v, 0, 0); - } - if ((dim < 2 && (axis === 2)) || ((dim === 2) && !((axis === 2)))) { - v = $append(v, 0); - } - _tmp$2 = (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0]); - _tmp$3 = (1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1]); - x = _tmp$2; - y = _tmp$3; - _tmp$4 = math.Cos(angle); - _tmp$5 = math.Sin(angle); - cos = _tmp$4; - sin = _tmp$5; - _1 = axis; - if (_1 === (0)) { - z = (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2]); - (1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1] = y * cos - z * sin); - (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2] = y * sin + z * cos); - } else if (_1 === (1)) { - z$1 = (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2]); - (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0] = x * cos + z$1 * sin); - (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2] = -x * sin + z$1 * cos); - } else if (_1 === (2)) { - (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0] = x * cos - y * sin); - (1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1] = x * sin + y * cos); - } - if (dim > 3) { - return $subslice(v, 0, 3); - } - return v; - }; - $ptrType(Vector).prototype.Rotate = function(angle, as) { return this.$get().Rotate(angle, as); }; - Vector.prototype.X = function() { - var v; - v = this; - if (v.$length < 1) { - return 0; - } - return (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0]); - }; - $ptrType(Vector).prototype.X = function() { return this.$get().X(); }; - Vector.prototype.Y = function() { - var v; - v = this; - if (v.$length < 2) { - return 0; - } - return (1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1]); - }; - $ptrType(Vector).prototype.Y = function() { return this.$get().Y(); }; - Vector.prototype.Z = function() { - var v; - v = this; - if (v.$length < 3) { - return 0; - } - return (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2]); - }; - $ptrType(Vector).prototype.Z = function() { return this.$get().Z(); }; - NewSpace = function(spaceWidth, spaceHeight, cellWidth, cellHeight) { - var _q, _q$1, cellHeight, cellWidth, sp, spaceHeight, spaceWidth; - sp = new Space.ptr(sliceType$2.nil, cellWidth, cellHeight); - sp.Resize((_q = spaceWidth / cellWidth, (_q === _q && _q !== 1/0 && _q !== -1/0) ? _q >> 0 : $throwRuntimeError("integer divide by zero")), (_q$1 = spaceHeight / cellHeight, (_q$1 === _q$1 && _q$1 !== 1/0 && _q$1 !== -1/0) ? _q$1 >> 0 : $throwRuntimeError("integer divide by zero"))); - return sp; - }; - $pkg.NewSpace = NewSpace; - Space.ptr.prototype.Add = function(objects) { - var {_i, _ref, obj, objects, sp, $s, $r, $c} = $restore(this, {objects}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - sp = this; - if (sp === ptrType$1.nil) { - $panic(new $String("ERROR: space is nil")); - } - _ref = objects; - _i = 0; - /* while (true) { */ case 1: - /* if (!(_i < _ref.$length)) { break; } */ if(!(_i < _ref.$length)) { $s = 2; continue; } - obj = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - obj.Space = sp; - $r = obj.Update(); /* */ $s = 3; case 3: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - _i++; - $s = 1; continue; - case 2: - $s = -1; return; - /* */ } return; } var $f = {$blk: Space.ptr.prototype.Add, $c: true, $r, _i, _ref, obj, objects, sp, $s};return $f; - }; - Space.prototype.Add = function(objects) { return this.$val.Add(objects); }; - Space.ptr.prototype.Remove = function(objects) { - var _i, _i$1, _ref, _ref$1, cell, obj, objects, sp; - sp = this; - if (sp === ptrType$1.nil) { - $panic(new $String("ERROR: space is nil")); - } - _ref = objects; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - obj = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - _ref$1 = obj.TouchingCells; - _i$1 = 0; - while (true) { - if (!(_i$1 < _ref$1.$length)) { break; } - cell = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); - cell.unregister(obj); - _i$1++; - } - obj.TouchingCells = new sliceType$1([]); - obj.Space = ptrType$1.nil; - _i++; - } - }; - Space.prototype.Remove = function(objects) { return this.$val.Remove(objects); }; - Space.ptr.prototype.Objects = function() { - var _entry, _i, _i$1, _i$2, _key, _ref, _ref$1, _ref$2, _tuple, added, cx, cy, o, objects, objectsAdded, sp, x, x$1, x$2; - sp = this; - objectsAdded = $makeMap(ptrType$2.keyFor, []); - objects = new sliceType$3([]); - _ref = sp.Cells; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - cy = _i; - _ref$1 = (x = sp.Cells, ((cy < 0 || cy >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + cy])); - _i$1 = 0; - while (true) { - if (!(_i$1 < _ref$1.$length)) { break; } - cx = _i$1; - _ref$2 = (x$1 = (x$2 = sp.Cells, ((cy < 0 || cy >= x$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + cy])), ((cx < 0 || cx >= x$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + cx])).Objects; - _i$2 = 0; - while (true) { - if (!(_i$2 < _ref$2.$length)) { break; } - o = ((_i$2 < 0 || _i$2 >= _ref$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$2.$array[_ref$2.$offset + _i$2]); - _tuple = (_entry = objectsAdded[ptrType$2.keyFor(o)], _entry !== undefined ? [_entry.v, true] : [false, false]); - added = _tuple[1]; - if (!added) { - objects = $append(objects, o); - _key = o; (objectsAdded || $throwRuntimeError("assignment to entry in nil map"))[ptrType$2.keyFor(_key)] = { k: _key, v: true }; - } - _i$2++; - } - _i$1++; - } - _i++; - } - return objects; - }; - Space.prototype.Objects = function() { return this.$val.Objects(); }; - Space.ptr.prototype.Resize = function(width, height) { - var height, sp, width, x, x$1, x$2, y; - sp = this; - sp.Cells = new sliceType$2([]); - y = 0; - while (true) { - if (!(y < height)) { break; } - sp.Cells = $append(sp.Cells, new sliceType$1([])); - x = 0; - while (true) { - if (!(x < width)) { break; } - (x$2 = sp.Cells, ((y < 0 || y >= x$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + y] = $append((x$1 = sp.Cells, ((y < 0 || y >= x$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + y])), newCell(x, y)))); - x = x + (1) >> 0; - } - y = y + (1) >> 0; - } - }; - Space.prototype.Resize = function(width, height) { return this.$val.Resize(width, height); }; - Space.ptr.prototype.Cell = function(x, y) { - var sp, x, x$1, x$2, x$3, y; - sp = this; - if (y >= 0 && y < sp.Cells.$length && x >= 0 && x < (x$1 = sp.Cells, ((y < 0 || y >= x$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + y])).$length) { - return (x$2 = (x$3 = sp.Cells, ((y < 0 || y >= x$3.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + y])), ((x < 0 || x >= x$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + x])); - } - return ptrType.nil; - }; - Space.prototype.Cell = function(x, y) { return this.$val.Cell(x, y); }; - Space.ptr.prototype.CheckCells = function(x, y, w, h, tags) { - var _i, _ref, cell, h, ix, iy, obj, sp, tags, w, x, x$1, y; - sp = this; - ix = x; - while (true) { - if (!(ix < (x + w >> 0))) { break; } - iy = y; - while (true) { - if (!(iy < (y + h >> 0))) { break; } - cell = sp.Cell(ix, iy); - if (!(cell === ptrType.nil)) { - if (tags.$length > 0) { - if (cell.ContainsTags(tags)) { - _ref = cell.Objects; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - obj = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (obj.HasTags(tags)) { - return obj; - } - _i++; - } - } - } else if (cell.Occupied()) { - return (x$1 = cell.Objects, (0 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 0])); - } - } - iy = iy + (1) >> 0; - } - ix = ix + (1) >> 0; - } - return ptrType$2.nil; - }; - Space.prototype.CheckCells = function(x, y, w, h, tags) { return this.$val.CheckCells(x, y, w, h, tags); }; - Space.ptr.prototype.CheckCellsWorld = function(x, y, w, h, tags) { - var _tuple, _tuple$1, ch, cw, h, sp, sx, sy, tags, w, x, y; - sp = this; - _tuple = sp.WorldToSpace(x, y); - sx = _tuple[0]; - sy = _tuple[1]; - _tuple$1 = sp.WorldToSpace(w, h); - cw = _tuple$1[0]; - ch = _tuple$1[1]; - return sp.CheckCells(sx, sy, cw, ch, tags); - }; - Space.prototype.CheckCellsWorld = function(x, y, w, h, tags) { return this.$val.CheckCellsWorld(x, y, w, h, tags); }; - Space.ptr.prototype.UnregisterAllObjects = function() { - var cell, sp, x, x$1, x$2, x$3, y; - sp = this; - y = 0; - while (true) { - if (!(y < sp.Cells.$length)) { break; } - x = 0; - while (true) { - if (!(x < (x$1 = sp.Cells, ((y < 0 || y >= x$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + y])).$length)) { break; } - cell = (x$2 = (x$3 = sp.Cells, ((y < 0 || y >= x$3.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + y])), ((x < 0 || x >= x$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + x])); - sp.Remove(cell.Objects); - x = x + (1) >> 0; - } - y = y + (1) >> 0; - } - }; - Space.prototype.UnregisterAllObjects = function() { return this.$val.UnregisterAllObjects(); }; - Space.ptr.prototype.WorldToSpace = function(x, y) { - var fx, fy, sp, x, y; - sp = this; - fx = ((math.Floor(x / (sp.CellWidth)) >> 0)); - fy = ((math.Floor(y / (sp.CellHeight)) >> 0)); - return [fx, fy]; - }; - Space.prototype.WorldToSpace = function(x, y) { return this.$val.WorldToSpace(x, y); }; - Space.ptr.prototype.SpaceToWorld = function(x, y) { - var fx, fy, sp, x, y; - sp = this; - fx = (($imul(x, sp.CellWidth))); - fy = (($imul(y, sp.CellHeight))); - return [fx, fy]; - }; - Space.prototype.SpaceToWorld = function(x, y) { return this.$val.SpaceToWorld(x, y); }; - Space.ptr.prototype.Height = function() { - var sp; - sp = this; - return sp.Cells.$length; - }; - Space.prototype.Height = function() { return this.$val.Height(); }; - Space.ptr.prototype.Width = function() { - var sp, x; - sp = this; - if (sp.Cells.$length > 0) { - return (x = sp.Cells, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])).$length; - } - return 0; - }; - Space.prototype.Width = function() { return this.$val.Width(); }; - Space.ptr.prototype.CellsInLine = function(startX, startY, endX, endY) { - var _q, _q$1, _q$2, _q$3, _tuple, _tuple$1, alternate, c, cell, cells, cx, cy, dv, endCell, endX, endY, p, pX, pY, sp, startX, startY; - sp = this; - cells = new sliceType$1([]); - cell = sp.Cell(startX, startY); - endCell = sp.Cell(endX, endY); - if (!(cell === ptrType.nil) && !(endCell === ptrType.nil)) { - dv = new Vector([((endX - startX >> 0)), ((endY - startY >> 0))]).Unit(); - (0 >= dv.$length ? ($throwRuntimeError("index out of range"), undefined) : dv.$array[dv.$offset + 0] = (0 >= dv.$length ? ($throwRuntimeError("index out of range"), undefined) : dv.$array[dv.$offset + 0]) * (((_q = sp.CellWidth / 2, (_q === _q && _q !== 1/0 && _q !== -1/0) ? _q >> 0 : $throwRuntimeError("integer divide by zero"))))); - (1 >= dv.$length ? ($throwRuntimeError("index out of range"), undefined) : dv.$array[dv.$offset + 1] = (1 >= dv.$length ? ($throwRuntimeError("index out of range"), undefined) : dv.$array[dv.$offset + 1]) * (((_q$1 = sp.CellHeight / 2, (_q$1 === _q$1 && _q$1 !== 1/0 && _q$1 !== -1/0) ? _q$1 >> 0 : $throwRuntimeError("integer divide by zero"))))); - _tuple = sp.SpaceToWorld(startX, startY); - pX = _tuple[0]; - pY = _tuple[1]; - p = new Vector([pX + ((_q$2 = sp.CellWidth / 2, (_q$2 === _q$2 && _q$2 !== 1/0 && _q$2 !== -1/0) ? _q$2 >> 0 : $throwRuntimeError("integer divide by zero"))), pY + ((_q$3 = sp.CellHeight / 2, (_q$3 === _q$3 && _q$3 !== 1/0 && _q$3 !== -1/0) ? _q$3 >> 0 : $throwRuntimeError("integer divide by zero")))]); - alternate = false; - while (true) { - if (!(!(cell === ptrType.nil))) { break; } - if (cell === endCell) { - cells = $append(cells, cell); - break; - } - cells = $append(cells, cell); - if (alternate) { - (1 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 1] = (1 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 1]) + ((1 >= dv.$length ? ($throwRuntimeError("index out of range"), undefined) : dv.$array[dv.$offset + 1]))); - } else { - (0 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 0] = (0 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 0]) + ((0 >= dv.$length ? ($throwRuntimeError("index out of range"), undefined) : dv.$array[dv.$offset + 0]))); - } - _tuple$1 = sp.WorldToSpace((0 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 0]), (1 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 1])); - cx = _tuple$1[0]; - cy = _tuple$1[1]; - c = sp.Cell(cx, cy); - if (!(c === cell)) { - cell = c; - } - alternate = !alternate; - } - } - return cells; - }; - Space.prototype.CellsInLine = function(startX, startY, endX, endY) { return this.$val.CellsInLine(startX, startY, endX, endY); }; - NewLine = function(x, y, x2, y2) { - var x, x2, y, y2; - return new Line.ptr(new Vector([x, y]), new Vector([x2, y2])); - }; - $pkg.NewLine = NewLine; - Line.ptr.prototype.Project = function(axis) { - var axis, line; - line = this; - return line.Vector().Scale(axis.Dot(line.Start.Sub(new sliceType$4([line.End])))); - }; - Line.prototype.Project = function(axis) { return this.$val.Project(axis); }; - Line.ptr.prototype.Normal = function() { - var line, v; - line = this; - v = line.Vector(); - return new Vector([(1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1]), -(0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0])]).Unit(); - }; - Line.prototype.Normal = function() { return this.$val.Normal(); }; - Line.ptr.prototype.Vector = function() { - var line; - line = this; - return line.End.Clone().Sub(new sliceType$4([line.Start])).Unit(); - }; - Line.prototype.Vector = function() { return this.$val.Vector(); }; - Line.ptr.prototype.IntersectionPointsLine = function(other) { - var det, dx, dy, gamma, lambda, line, other, x, x$1, x$10, x$11, x$12, x$13, x$14, x$15, x$16, x$17, x$18, x$19, x$2, x$20, x$21, x$22, x$23, x$24, x$25, x$26, x$27, x$28, x$29, x$3, x$4, x$5, x$6, x$7, x$8, x$9; - line = this; - det = ((x = line.End, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])) - (x$1 = line.Start, (0 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 0]))) * ((x$2 = other.End, (1 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 1])) - (x$3 = other.Start, (1 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 1]))) - ((x$4 = other.End, (0 >= x$4.$length ? ($throwRuntimeError("index out of range"), undefined) : x$4.$array[x$4.$offset + 0])) - (x$5 = other.Start, (0 >= x$5.$length ? ($throwRuntimeError("index out of range"), undefined) : x$5.$array[x$5.$offset + 0]))) * ((x$6 = line.End, (1 >= x$6.$length ? ($throwRuntimeError("index out of range"), undefined) : x$6.$array[x$6.$offset + 1])) - (x$7 = line.Start, (1 >= x$7.$length ? ($throwRuntimeError("index out of range"), undefined) : x$7.$array[x$7.$offset + 1]))); - if (!((det === 0))) { - lambda = ((((x$8 = line.Start, (1 >= x$8.$length ? ($throwRuntimeError("index out of range"), undefined) : x$8.$array[x$8.$offset + 1])) - (x$9 = other.Start, (1 >= x$9.$length ? ($throwRuntimeError("index out of range"), undefined) : x$9.$array[x$9.$offset + 1]))) * ((x$10 = other.End, (0 >= x$10.$length ? ($throwRuntimeError("index out of range"), undefined) : x$10.$array[x$10.$offset + 0])) - (x$11 = other.Start, (0 >= x$11.$length ? ($throwRuntimeError("index out of range"), undefined) : x$11.$array[x$11.$offset + 0])))) - (((x$12 = line.Start, (0 >= x$12.$length ? ($throwRuntimeError("index out of range"), undefined) : x$12.$array[x$12.$offset + 0])) - (x$13 = other.Start, (0 >= x$13.$length ? ($throwRuntimeError("index out of range"), undefined) : x$13.$array[x$13.$offset + 0]))) * ((x$14 = other.End, (1 >= x$14.$length ? ($throwRuntimeError("index out of range"), undefined) : x$14.$array[x$14.$offset + 1])) - (x$15 = other.Start, (1 >= x$15.$length ? ($throwRuntimeError("index out of range"), undefined) : x$15.$array[x$15.$offset + 1])))) + 1) / det; - gamma = ((((x$16 = line.Start, (1 >= x$16.$length ? ($throwRuntimeError("index out of range"), undefined) : x$16.$array[x$16.$offset + 1])) - (x$17 = other.Start, (1 >= x$17.$length ? ($throwRuntimeError("index out of range"), undefined) : x$17.$array[x$17.$offset + 1]))) * ((x$18 = line.End, (0 >= x$18.$length ? ($throwRuntimeError("index out of range"), undefined) : x$18.$array[x$18.$offset + 0])) - (x$19 = line.Start, (0 >= x$19.$length ? ($throwRuntimeError("index out of range"), undefined) : x$19.$array[x$19.$offset + 0])))) - (((x$20 = line.Start, (0 >= x$20.$length ? ($throwRuntimeError("index out of range"), undefined) : x$20.$array[x$20.$offset + 0])) - (x$21 = other.Start, (0 >= x$21.$length ? ($throwRuntimeError("index out of range"), undefined) : x$21.$array[x$21.$offset + 0]))) * ((x$22 = line.End, (1 >= x$22.$length ? ($throwRuntimeError("index out of range"), undefined) : x$22.$array[x$22.$offset + 1])) - (x$23 = line.Start, (1 >= x$23.$length ? ($throwRuntimeError("index out of range"), undefined) : x$23.$array[x$23.$offset + 1])))) + 1) / det; - if ((0 < lambda && lambda < 1) && (0 < gamma && gamma < 1)) { - dx = (x$24 = line.End, (0 >= x$24.$length ? ($throwRuntimeError("index out of range"), undefined) : x$24.$array[x$24.$offset + 0])) - (x$25 = line.Start, (0 >= x$25.$length ? ($throwRuntimeError("index out of range"), undefined) : x$25.$array[x$25.$offset + 0])); - dy = (x$26 = line.End, (1 >= x$26.$length ? ($throwRuntimeError("index out of range"), undefined) : x$26.$array[x$26.$offset + 1])) - (x$27 = line.Start, (1 >= x$27.$length ? ($throwRuntimeError("index out of range"), undefined) : x$27.$array[x$27.$offset + 1])); - return new Vector([(x$28 = line.Start, (0 >= x$28.$length ? ($throwRuntimeError("index out of range"), undefined) : x$28.$array[x$28.$offset + 0])) + (lambda * dx), (x$29 = line.Start, (1 >= x$29.$length ? ($throwRuntimeError("index out of range"), undefined) : x$29.$array[x$29.$offset + 1])) + (lambda * dy)]); - } - } - return Vector.nil; - }; - Line.prototype.IntersectionPointsLine = function(other) { return this.$val.IntersectionPointsLine(other); }; - Line.ptr.prototype.IntersectionPointsCircle = function(circle) { - var a, b, c, circle, cp, det, diff, lEnd, lStart, line, points, t, t$1, x, x$1, x$2, x$3, x$4, x$5; - line = this; - points = new sliceType$4([]); - cp = new Vector([circle.X, circle.Y]); - lStart = line.Start.Sub(new sliceType$4([cp])); - lEnd = line.End.Sub(new sliceType$4([cp])); - diff = lEnd.Sub(new sliceType$4([lStart])); - a = (0 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 0]) * (0 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 0]) + (1 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 1]) * (1 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 1]); - b = 2 * (((0 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 0]) * (0 >= lStart.$length ? ($throwRuntimeError("index out of range"), undefined) : lStart.$array[lStart.$offset + 0])) + ((1 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 1]) * (1 >= lStart.$length ? ($throwRuntimeError("index out of range"), undefined) : lStart.$array[lStart.$offset + 1]))); - c = ((0 >= lStart.$length ? ($throwRuntimeError("index out of range"), undefined) : lStart.$array[lStart.$offset + 0]) * (0 >= lStart.$length ? ($throwRuntimeError("index out of range"), undefined) : lStart.$array[lStart.$offset + 0])) + ((1 >= lStart.$length ? ($throwRuntimeError("index out of range"), undefined) : lStart.$array[lStart.$offset + 1]) * (1 >= lStart.$length ? ($throwRuntimeError("index out of range"), undefined) : lStart.$array[lStart.$offset + 1])) - (circle.Radius * circle.Radius); - det = b * b - (4 * a * c); - if (det < 0) { - } else if (det === 0) { - t = -b / (2 * a); - if (t >= 0 && t <= 1) { - points = $append(points, new Vector([(x = line.Start, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])) + t * (0 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 0]), (x$1 = line.Start, (1 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 1])) + t * (1 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 1])])); - } - } else { - t$1 = (-b + math.Sqrt(det)) / (2 * a); - if (t$1 >= 0 && t$1 <= 1) { - points = $append(points, new Vector([(x$2 = line.Start, (0 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 0])) + t$1 * (0 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 0]), (x$3 = line.Start, (1 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 1])) + t$1 * (1 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 1])])); - } - t$1 = (-b - math.Sqrt(det)) / (2 * a); - if (t$1 >= 0 && t$1 <= 1) { - points = $append(points, new Vector([(x$4 = line.Start, (0 >= x$4.$length ? ($throwRuntimeError("index out of range"), undefined) : x$4.$array[x$4.$offset + 0])) + t$1 * (0 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 0]), (x$5 = line.Start, (1 >= x$5.$length ? ($throwRuntimeError("index out of range"), undefined) : x$5.$array[x$5.$offset + 1])) + t$1 * (1 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 1])])); - } - } - return points; - }; - Line.prototype.IntersectionPointsCircle = function(circle) { return this.$val.IntersectionPointsCircle(circle); }; - NewConvexPolygon = function(points) { - var cp, points; - cp = new ConvexPolygon.ptr(new sliceType$4([]), 0, 0, true); - cp.AddPoints(points); - return cp; - }; - $pkg.NewConvexPolygon = NewConvexPolygon; - ConvexPolygon.ptr.prototype.Clone = function() { - var _i, _ref, cp, newPoly, point, points; - cp = this; - points = new sliceType$4([]); - _ref = cp.Points; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - point = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - points = $append(points, point.Clone()); - _i++; - } - newPoly = NewConvexPolygon(sliceType.nil); - newPoly.X = cp.X; - newPoly.Y = cp.Y; - newPoly.AddPointsVec(points); - newPoly.Closed = cp.Closed; - return newPoly; - }; - ConvexPolygon.prototype.Clone = function() { return this.$val.Clone(); }; - ConvexPolygon.ptr.prototype.AddPointsVec = function(points) { - var cp, points; - cp = this; - cp.Points = $appendSlice(cp.Points, points); - }; - ConvexPolygon.prototype.AddPointsVec = function(points) { return this.$val.AddPointsVec(points); }; - ConvexPolygon.ptr.prototype.AddPoints = function(vertexPositions) { - var cp, v, vertexPositions, x; - cp = this; - v = 0; - while (true) { - if (!(v < vertexPositions.$length)) { break; } - cp.Points = $append(cp.Points, new Vector([((v < 0 || v >= vertexPositions.$length) ? ($throwRuntimeError("index out of range"), undefined) : vertexPositions.$array[vertexPositions.$offset + v]), (x = v + 1 >> 0, ((x < 0 || x >= vertexPositions.$length) ? ($throwRuntimeError("index out of range"), undefined) : vertexPositions.$array[vertexPositions.$offset + x]))])); - v = v + (2) >> 0; - } - }; - ConvexPolygon.prototype.AddPoints = function(vertexPositions) { return this.$val.AddPoints(vertexPositions); }; - ConvexPolygon.ptr.prototype.Lines = function() { - var _tmp, _tmp$1, cp, end, i, line, lines, start, vertices, x; - cp = this; - lines = new sliceType$5([]); - vertices = cp.Transformed(); - i = 0; - while (true) { - if (!(i < vertices.$length)) { break; } - _tmp = ((i < 0 || i >= vertices.$length) ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + i]); - _tmp$1 = (0 >= vertices.$length ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + 0]); - start = _tmp; - end = _tmp$1; - if (i < (vertices.$length - 1 >> 0)) { - end = (x = i + 1 >> 0, ((x < 0 || x >= vertices.$length) ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + x])); - } else if (!cp.Closed) { - break; - } - line = NewLine((0 >= start.$length ? ($throwRuntimeError("index out of range"), undefined) : start.$array[start.$offset + 0]), (1 >= start.$length ? ($throwRuntimeError("index out of range"), undefined) : start.$array[start.$offset + 1]), (0 >= end.$length ? ($throwRuntimeError("index out of range"), undefined) : end.$array[end.$offset + 0]), (1 >= end.$length ? ($throwRuntimeError("index out of range"), undefined) : end.$array[end.$offset + 1])); - lines = $append(lines, line); - i = i + (1) >> 0; - } - return lines; - }; - ConvexPolygon.prototype.Lines = function() { return this.$val.Lines(); }; - ConvexPolygon.ptr.prototype.Transformed = function() { - var _i, _ref, cp, point, transformed; - cp = this; - transformed = new sliceType$4([]); - _ref = cp.Points; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - point = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - transformed = $append(transformed, new Vector([(0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]) + cp.X, (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1]) + cp.Y])); - _i++; - } - return transformed; - }; - ConvexPolygon.prototype.Transformed = function() { return this.$val.Transformed(); }; - ConvexPolygon.ptr.prototype.Bounds = function() { - var bottomRight, cp, i, point, topLeft, transformed, x, x$1; - cp = this; - transformed = cp.Transformed(); - topLeft = new Vector([(x = (0 >= transformed.$length ? ($throwRuntimeError("index out of range"), undefined) : transformed.$array[transformed.$offset + 0]), (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])), (x$1 = (0 >= transformed.$length ? ($throwRuntimeError("index out of range"), undefined) : transformed.$array[transformed.$offset + 0]), (1 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 1]))]); - bottomRight = topLeft.Clone(); - i = 0; - while (true) { - if (!(i < transformed.$length)) { break; } - point = ((i < 0 || i >= transformed.$length) ? ($throwRuntimeError("index out of range"), undefined) : transformed.$array[transformed.$offset + i]); - if ((0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]) < (0 >= topLeft.$length ? ($throwRuntimeError("index out of range"), undefined) : topLeft.$array[topLeft.$offset + 0])) { - (0 >= topLeft.$length ? ($throwRuntimeError("index out of range"), undefined) : topLeft.$array[topLeft.$offset + 0] = (0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0])); - } else if ((0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]) > (0 >= bottomRight.$length ? ($throwRuntimeError("index out of range"), undefined) : bottomRight.$array[bottomRight.$offset + 0])) { - (0 >= bottomRight.$length ? ($throwRuntimeError("index out of range"), undefined) : bottomRight.$array[bottomRight.$offset + 0] = (0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0])); - } - if ((1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1]) < (1 >= topLeft.$length ? ($throwRuntimeError("index out of range"), undefined) : topLeft.$array[topLeft.$offset + 1])) { - (1 >= topLeft.$length ? ($throwRuntimeError("index out of range"), undefined) : topLeft.$array[topLeft.$offset + 1] = (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1])); - } else if ((1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1]) > (1 >= bottomRight.$length ? ($throwRuntimeError("index out of range"), undefined) : bottomRight.$array[bottomRight.$offset + 1])) { - (1 >= bottomRight.$length ? ($throwRuntimeError("index out of range"), undefined) : bottomRight.$array[bottomRight.$offset + 1] = (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1])); - } - i = i + (1) >> 0; - } - return [topLeft, bottomRight]; - }; - ConvexPolygon.prototype.Bounds = function() { return this.$val.Bounds(); }; - ConvexPolygon.ptr.prototype.Position = function() { - var cp; - cp = this; - return [cp.X, cp.Y]; - }; - ConvexPolygon.prototype.Position = function() { return this.$val.Position(); }; - ConvexPolygon.ptr.prototype.SetPosition = function(x, y) { - var cp, x, y; - cp = this; - cp.X = x; - cp.Y = y; - }; - ConvexPolygon.prototype.SetPosition = function(x, y) { return this.$val.SetPosition(x, y); }; - ConvexPolygon.ptr.prototype.SetPositionVec = function(vec) { - var cp, vec; - cp = this; - cp.X = vec.X(); - cp.Y = vec.Y(); - }; - ConvexPolygon.prototype.SetPositionVec = function(vec) { return this.$val.SetPositionVec(vec); }; - ConvexPolygon.ptr.prototype.Move = function(x, y) { - var cp, x, y; - cp = this; - cp.X = cp.X + (x); - cp.Y = cp.Y + (y); - }; - ConvexPolygon.prototype.Move = function(x, y) { return this.$val.Move(x, y); }; - ConvexPolygon.ptr.prototype.MoveVec = function(vec) { - var cp, vec; - cp = this; - cp.X = cp.X + (vec.X()); - cp.Y = cp.Y + (vec.Y()); - }; - ConvexPolygon.prototype.MoveVec = function(vec) { return this.$val.MoveVec(vec); }; - ConvexPolygon.ptr.prototype.Center = function() { - var _i, _ref, cp, pos, v; - cp = this; - pos = new Vector([0, 0]); - _ref = cp.Transformed(); - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - v = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - pos.Add(new sliceType$4([v])); - _i++; - } - (0 >= pos.$length ? ($throwRuntimeError("index out of range"), undefined) : pos.$array[pos.$offset + 0] = (0 >= pos.$length ? ($throwRuntimeError("index out of range"), undefined) : pos.$array[pos.$offset + 0]) / ((cp.Transformed().$length))); - (1 >= pos.$length ? ($throwRuntimeError("index out of range"), undefined) : pos.$array[pos.$offset + 1] = (1 >= pos.$length ? ($throwRuntimeError("index out of range"), undefined) : pos.$array[pos.$offset + 1]) / ((cp.Transformed().$length))); - return pos; - }; - ConvexPolygon.prototype.Center = function() { return this.$val.Center(); }; - ConvexPolygon.ptr.prototype.Project = function(axis) { - var axis, cp, i, max, min, p, vertices, x, x$1, x$2, x$3; - cp = this; - axis = axis.Unit(); - vertices = cp.Transformed(); - min = axis.Dot(new Vector([(x = (0 >= vertices.$length ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + 0]), (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])), (x$1 = (0 >= vertices.$length ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + 0]), (1 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 1]))])); - max = min; - i = 1; - while (true) { - if (!(i < vertices.$length)) { break; } - p = axis.Dot(new Vector([(x$2 = ((i < 0 || i >= vertices.$length) ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + i]), (0 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 0])), (x$3 = ((i < 0 || i >= vertices.$length) ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + i]), (1 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 1]))])); - if (p < min) { - min = p; - } else if (p > max) { - max = p; - } - i = i + (1) >> 0; - } - return new Projection.ptr(min, max); - }; - ConvexPolygon.prototype.Project = function(axis) { return this.$val.Project(axis); }; - ConvexPolygon.ptr.prototype.SATAxes = function() { - var _i, _ref, axes, cp, line; - cp = this; - axes = new sliceType$4([]); - _ref = cp.Lines(); - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - line = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - axes = $append(axes, line.Normal()); - _i++; - } - return axes; - }; - ConvexPolygon.prototype.SATAxes = function() { return this.$val.SATAxes(); }; - ConvexPolygon.ptr.prototype.PointInside = function(point) { - var _i, _ref, contactCount, line, point, pointLine, polygon; - polygon = this; - pointLine = NewLine((0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]), (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1]), (0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]) + 9.99999999999e+11, (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1])); - contactCount = 0; - _ref = polygon.Lines(); - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - line = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (!(line.IntersectionPointsLine(pointLine) === Vector.nil)) { - contactCount = contactCount + (1) >> 0; - } - _i++; - } - return contactCount === 1; - }; - ConvexPolygon.prototype.PointInside = function(point) { return this.$val.PointInside(point); }; - NewContactSet = function() { - return new ContactSet.ptr(new sliceType$4([]), new Vector([0, 0]), new Vector([0, 0])); - }; - $pkg.NewContactSet = NewContactSet; - ContactSet.ptr.prototype.LeftmostPoint = function() { - var _i, _ref, cs, left, point; - cs = this; - left = Vector.nil; - _ref = cs.Points; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - point = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (left === Vector.nil || (0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]) < (0 >= left.$length ? ($throwRuntimeError("index out of range"), undefined) : left.$array[left.$offset + 0])) { - left = point; - } - _i++; - } - return left; - }; - ContactSet.prototype.LeftmostPoint = function() { return this.$val.LeftmostPoint(); }; - ContactSet.ptr.prototype.RightmostPoint = function() { - var _i, _ref, cs, point, right; - cs = this; - right = Vector.nil; - _ref = cs.Points; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - point = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (right === Vector.nil || (0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]) > (0 >= right.$length ? ($throwRuntimeError("index out of range"), undefined) : right.$array[right.$offset + 0])) { - right = point; - } - _i++; - } - return right; - }; - ContactSet.prototype.RightmostPoint = function() { return this.$val.RightmostPoint(); }; - ContactSet.ptr.prototype.TopmostPoint = function() { - var _i, _ref, cs, point, top; - cs = this; - top = Vector.nil; - _ref = cs.Points; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - point = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (top === Vector.nil || (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1]) < (1 >= top.$length ? ($throwRuntimeError("index out of range"), undefined) : top.$array[top.$offset + 1])) { - top = point; - } - _i++; - } - return top; - }; - ContactSet.prototype.TopmostPoint = function() { return this.$val.TopmostPoint(); }; - ContactSet.ptr.prototype.BottommostPoint = function() { - var _i, _ref, bottom, cs, point; - cs = this; - bottom = Vector.nil; - _ref = cs.Points; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - point = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (bottom === Vector.nil || (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1]) > (1 >= bottom.$length ? ($throwRuntimeError("index out of range"), undefined) : bottom.$array[bottom.$offset + 1])) { - bottom = point; - } - _i++; - } - return bottom; - }; - ContactSet.prototype.BottommostPoint = function() { return this.$val.BottommostPoint(); }; - ConvexPolygon.ptr.prototype.Intersection = function(dx, dy, other) { - var _i, _i$1, _i$2, _i$3, _ref, _ref$1, _ref$2, _ref$3, _tuple, _tuple$1, circle, contactSet, cp, deltaMagnitude, dx, dy, isCircle, isPoly, line, line$1, mtv, ogMagnitude, ogX, ogY, other, otherLine, point, point$1, poly, x, x$1, x$2, x$3; - cp = this; - contactSet = NewContactSet(); - ogX = cp.X; - ogY = cp.Y; - cp.X = cp.X + (dx); - cp.Y = cp.Y + (dy); - _tuple = $assertType(other, ptrType$4, true); - circle = _tuple[0]; - isCircle = _tuple[1]; - if (isCircle) { - _ref = cp.Lines(); - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - line = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - contactSet.Points = $appendSlice(contactSet.Points, line.IntersectionPointsCircle(circle)); - _i++; - } - } else { - _tuple$1 = $assertType(other, ptrType$5, true); - poly = _tuple$1[0]; - isPoly = _tuple$1[1]; - if (isPoly) { - _ref$1 = cp.Lines(); - _i$1 = 0; - while (true) { - if (!(_i$1 < _ref$1.$length)) { break; } - line$1 = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); - _ref$2 = poly.Lines(); - _i$2 = 0; - while (true) { - if (!(_i$2 < _ref$2.$length)) { break; } - otherLine = ((_i$2 < 0 || _i$2 >= _ref$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$2.$array[_ref$2.$offset + _i$2]); - point = line$1.IntersectionPointsLine(otherLine); - if (!(point === Vector.nil)) { - contactSet.Points = $append(contactSet.Points, point); - } - _i$2++; - } - _i$1++; - } - } - } - if (contactSet.Points.$length > 0) { - _ref$3 = contactSet.Points; - _i$3 = 0; - while (true) { - if (!(_i$3 < _ref$3.$length)) { break; } - point$1 = ((_i$3 < 0 || _i$3 >= _ref$3.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$3.$array[_ref$3.$offset + _i$3]); - contactSet.Center = contactSet.Center.Add(new sliceType$4([point$1])); - _i$3++; - } - (x$1 = contactSet.Center, (0 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 0] = (x = contactSet.Center, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])) / ((contactSet.Points.$length)))); - (x$3 = contactSet.Center, (1 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 1] = (x$2 = contactSet.Center, (1 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 1])) / ((contactSet.Points.$length)))); - mtv = cp.calculateMTV(contactSet, other); - if (!(mtv === Vector.nil)) { - contactSet.MTV = mtv; - } - } else { - contactSet = ptrType$6.nil; - } - if (!(contactSet === ptrType$6.nil) && (!((dx === 0)) || !((dy === 0)))) { - deltaMagnitude = new Vector([dx, dy]).Magnitude(); - ogMagnitude = contactSet.MTV.Magnitude(); - contactSet.MTV = contactSet.MTV.Unit().Scale(ogMagnitude - deltaMagnitude); - } - cp.X = ogX; - cp.Y = ogY; - return contactSet; - }; - ConvexPolygon.prototype.Intersection = function(dx, dy, other) { return this.$val.Intersection(dx, dy, other); }; - ConvexPolygon.ptr.prototype.calculateMTV = function(contactSet, otherShape) { - var _i, _i$1, _ref, _ref$1, _ref$2, axis, axis$1, contactSet, cp, delta, other, otherShape, overlap, overlap$1, smallest; - cp = this; - delta = new Vector([0, 0]); - smallest = new Vector([1.7976931348623157e+308, 0]); - _ref = otherShape; - if ($assertType(_ref, ptrType$5, true)[1]) { - other = _ref.$val; - _ref$1 = cp.SATAxes(); - _i = 0; - while (true) { - if (!(_i < _ref$1.$length)) { break; } - axis = ((_i < 0 || _i >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i]); - if (!$clone(cp.Project(axis), Projection).Overlapping($clone(other.Project(axis), Projection))) { - return Vector.nil; - } - overlap = $clone(cp.Project(axis), Projection).Overlap($clone(other.Project(axis), Projection)); - if (smallest.Magnitude() > overlap) { - smallest = axis.Scale(overlap); - } - _i++; - } - _ref$2 = other.SATAxes(); - _i$1 = 0; - while (true) { - if (!(_i$1 < _ref$2.$length)) { break; } - axis$1 = ((_i$1 < 0 || _i$1 >= _ref$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$2.$array[_ref$2.$offset + _i$1]); - if (!$clone(cp.Project(axis$1), Projection).Overlapping($clone(other.Project(axis$1), Projection))) { - return Vector.nil; - } - overlap$1 = $clone(cp.Project(axis$1), Projection).Overlap($clone(other.Project(axis$1), Projection)); - if (smallest.Magnitude() > overlap$1) { - smallest = axis$1.Scale(overlap$1); - } - _i$1++; - } - } - (0 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 0] = (0 >= smallest.$length ? ($throwRuntimeError("index out of range"), undefined) : smallest.$array[smallest.$offset + 0])); - (1 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 1] = (1 >= smallest.$length ? ($throwRuntimeError("index out of range"), undefined) : smallest.$array[smallest.$offset + 1])); - return delta; - }; - ConvexPolygon.prototype.calculateMTV = function(contactSet, otherShape) { return this.$val.calculateMTV(contactSet, otherShape); }; - ConvexPolygon.ptr.prototype.ContainedBy = function(otherShape) { - var _i, _i$1, _ref, _ref$1, _ref$2, axis, axis$1, cp, other, otherShape; - cp = this; - _ref = otherShape; - if ($assertType(_ref, ptrType$5, true)[1]) { - other = _ref.$val; - _ref$1 = cp.SATAxes(); - _i = 0; - while (true) { - if (!(_i < _ref$1.$length)) { break; } - axis = ((_i < 0 || _i >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i]); - if (!$clone(cp.Project(axis), Projection).IsInside($clone(other.Project(axis), Projection))) { - return false; - } - _i++; - } - _ref$2 = other.SATAxes(); - _i$1 = 0; - while (true) { - if (!(_i$1 < _ref$2.$length)) { break; } - axis$1 = ((_i$1 < 0 || _i$1 >= _ref$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$2.$array[_ref$2.$offset + _i$1]); - if (!$clone(cp.Project(axis$1), Projection).IsInside($clone(other.Project(axis$1), Projection))) { - return false; - } - _i$1++; - } - } - return true; - }; - ConvexPolygon.prototype.ContainedBy = function(otherShape) { return this.$val.ContainedBy(otherShape); }; - ConvexPolygon.ptr.prototype.FlipH = function() { - var _i, _ref, cp, v; - cp = this; - _ref = cp.Points; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - v = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0] = -(0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0])); - _i++; - } - cp.ReverseVertexOrder(); - }; - ConvexPolygon.prototype.FlipH = function() { return this.$val.FlipH(); }; - ConvexPolygon.ptr.prototype.FlipV = function() { - var _i, _ref, cp, v; - cp = this; - _ref = cp.Points; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - v = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - (1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1] = -(1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1])); - _i++; - } - cp.ReverseVertexOrder(); - }; - ConvexPolygon.prototype.FlipV = function() { return this.$val.FlipV(); }; - ConvexPolygon.ptr.prototype.ReverseVertexOrder = function() { - var cp, i, verts, x, x$1; - cp = this; - verts = new sliceType$4([(x = cp.Points, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0]))]); - i = cp.Points.$length - 1 >> 0; - while (true) { - if (!(i >= 1)) { break; } - verts = $append(verts, (x$1 = cp.Points, ((i < 0 || i >= x$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + i]))); - i = i - (1) >> 0; - } - cp.Points = verts; - }; - ConvexPolygon.prototype.ReverseVertexOrder = function() { return this.$val.ReverseVertexOrder(); }; - NewRectangle = function(x, y, w, h) { - var h, w, x, y; - return NewConvexPolygon(new sliceType([x, y, x + w, y, x + w, y + h, x, y + h])); - }; - $pkg.NewRectangle = NewRectangle; - NewCircle = function(x, y, radius) { - var circle, radius, x, y; - circle = new Circle.ptr(x, y, radius); - return circle; - }; - $pkg.NewCircle = NewCircle; - Circle.ptr.prototype.Clone = function() { - var circle; - circle = this; - return NewCircle(circle.X, circle.Y, circle.Radius); - }; - Circle.prototype.Clone = function() { return this.$val.Clone(); }; - Circle.ptr.prototype.Bounds = function() { - var circle; - circle = this; - return [new Vector([circle.X - circle.Radius, circle.Y - circle.Radius]), new Vector([circle.X + circle.Radius, circle.Y + circle.Radius])]; - }; - Circle.prototype.Bounds = function() { return this.$val.Bounds(); }; - Circle.ptr.prototype.Intersection = function(dx, dy, other) { - var _i, _ref, _ref$1, circle, contactSet, dist, dx, dy, other, ox, oy, point, shape, shape$1, x, x$1, x$2, x$3; - circle = this; - contactSet = ptrType$6.nil; - ox = circle.X; - oy = circle.Y; - circle.X = circle.X + (dx); - circle.Y = circle.Y + (dy); - _ref = other; - if ($assertType(_ref, ptrType$5, true)[1]) { - shape = _ref.$val; - contactSet = shape.Intersection(-dx, -dy, circle); - if (!(contactSet === ptrType$6.nil)) { - contactSet.MTV = contactSet.MTV.Scale(-1); - } - } else if ($assertType(_ref, ptrType$4, true)[1]) { - shape$1 = _ref.$val; - contactSet = NewContactSet(); - contactSet.Points = circle.IntersectionPointsCircle(shape$1); - if (contactSet.Points.$length === 0) { - return ptrType$6.nil; - } - contactSet.MTV = new Vector([circle.X - shape$1.X, circle.Y - shape$1.Y]); - dist = contactSet.MTV.Magnitude(); - contactSet.MTV = contactSet.MTV.Unit().Scale(circle.Radius + shape$1.Radius - dist); - _ref$1 = contactSet.Points; - _i = 0; - while (true) { - if (!(_i < _ref$1.$length)) { break; } - point = ((_i < 0 || _i >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i]); - contactSet.Center = contactSet.Center.Add(new sliceType$4([point])); - _i++; - } - (x$1 = contactSet.Center, (0 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 0] = (x = contactSet.Center, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])) / ((contactSet.Points.$length)))); - (x$3 = contactSet.Center, (1 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 1] = (x$2 = contactSet.Center, (1 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 1])) / ((contactSet.Points.$length)))); - } - circle.X = ox; - circle.Y = oy; - return contactSet; - }; - Circle.prototype.Intersection = function(dx, dy, other) { return this.$val.Intersection(dx, dy, other); }; - Circle.ptr.prototype.Move = function(x, y) { - var circle, x, y; - circle = this; - circle.X = circle.X + (x); - circle.Y = circle.Y + (y); - }; - Circle.prototype.Move = function(x, y) { return this.$val.Move(x, y); }; - Circle.ptr.prototype.MoveVec = function(vec) { - var circle, vec; - circle = this; - circle.X = circle.X + (vec.X()); - circle.Y = circle.Y + (vec.Y()); - }; - Circle.prototype.MoveVec = function(vec) { return this.$val.MoveVec(vec); }; - Circle.ptr.prototype.SetPosition = function(x, y) { - var circle, x, y; - circle = this; - circle.X = x; - circle.Y = y; - }; - Circle.prototype.SetPosition = function(x, y) { return this.$val.SetPosition(x, y); }; - Circle.ptr.prototype.SetPositionVec = function(vec) { - var circle, vec; - circle = this; - circle.X = vec.X(); - circle.Y = vec.Y(); - }; - Circle.prototype.SetPositionVec = function(vec) { return this.$val.SetPositionVec(vec); }; - Circle.ptr.prototype.Position = function() { - var circle; - circle = this; - return [circle.X, circle.Y]; - }; - Circle.prototype.Position = function() { return this.$val.Position(); }; - Circle.ptr.prototype.PointInside = function(point) { - var circle, point; - circle = this; - return point.Sub(new sliceType$4([new Vector([circle.X, circle.Y])])).Magnitude() <= circle.Radius; - }; - Circle.prototype.PointInside = function(point) { return this.$val.PointInside(point); }; - Circle.ptr.prototype.IntersectionPointsCircle = function(other) { - var a, circle, d, h, other, x2, y2; - circle = this; - d = math.Sqrt(math.Pow(other.X - circle.X, 2) + math.Pow(other.Y - circle.Y, 2)); - if (d > circle.Radius + other.Radius || d < math.Abs(circle.Radius - other.Radius) || (d === 0) && (circle.Radius === other.Radius)) { - return sliceType$4.nil; - } - a = (math.Pow(circle.Radius, 2) - math.Pow(other.Radius, 2) + math.Pow(d, 2)) / (2 * d); - h = math.Sqrt(math.Pow(circle.Radius, 2) - math.Pow(a, 2)); - x2 = circle.X + a * (other.X - circle.X) / d; - y2 = circle.Y + a * (other.Y - circle.Y) / d; - return new sliceType$4([new Vector([x2 + h * (other.Y - circle.Y) / d, y2 - h * (other.X - circle.X) / d]), new Vector([x2 - h * (other.Y - circle.Y) / d, y2 + h * (other.X - circle.X) / d])]); - }; - Circle.prototype.IntersectionPointsCircle = function(other) { return this.$val.IntersectionPointsCircle(other); }; - Projection.ptr.prototype.Overlapping = function(other) { - var other, projection; - projection = this; - return $clone(projection, Projection).Overlap($clone(other, Projection)) > 0; - }; - Projection.prototype.Overlapping = function(other) { return this.$val.Overlapping(other); }; - Projection.ptr.prototype.Overlap = function(other) { - var other, projection; - projection = this; - return math.Min(projection.Max, other.Max) - math.Max(projection.Min, other.Min); - }; - Projection.prototype.Overlap = function(other) { return this.$val.Overlap(other); }; - Projection.ptr.prototype.IsInside = function(other) { - var other, projection; - projection = this; - return projection.Min >= other.Min && projection.Max <= other.Max; - }; - Projection.prototype.IsInside = function(other) { return this.$val.IsInside(other); }; - NewObject = function(x, y, w, h, tags) { - var h, o, tags, w, x, y; - o = new Object.ptr($ifaceNil, ptrType$1.nil, x, y, w, h, sliceType$1.nil, $ifaceNil, $makeMap(ptrType$2.keyFor, []), new sliceType$6([])); - if (tags.$length > 0) { - o.AddTags(tags); - } - return o; - }; - $pkg.NewObject = NewObject; - Object.ptr.prototype.Clone = function() { - var {_entry, _i, _keys, _r, _ref, k, newObj, obj, $s, $r, $c} = $restore(this, {}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - obj = this; - newObj = NewObject(obj.X, obj.Y, obj.W, obj.H, obj.Tags()); - newObj.Data = obj.Data; - /* */ if (!($interfaceIsEqual(obj.Shape, $ifaceNil))) { $s = 1; continue; } - /* */ $s = 2; continue; - /* if (!($interfaceIsEqual(obj.Shape, $ifaceNil))) { */ case 1: - _r = obj.Shape.Clone(); /* */ $s = 3; case 3: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - $r = newObj.SetShape(_r); /* */ $s = 4; case 4: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - /* } */ case 2: - _ref = obj.ignoreList; - _i = 0; - _keys = $keys(_ref); - while (true) { - if (!(_i < _keys.length)) { break; } - _entry = _ref[_keys[_i]]; - if (_entry === undefined) { - _i++; - continue; - } - k = _entry.k; - newObj.AddToIgnoreList(k); - _i++; - } - $s = -1; return newObj; - /* */ } return; } var $f = {$blk: Object.ptr.prototype.Clone, $c: true, $r, _entry, _i, _keys, _r, _ref, k, newObj, obj, $s};return $f; - }; - Object.prototype.Clone = function() { return this.$val.Clone(); }; - Object.ptr.prototype.Update = function() { - var {_tuple, c, cx, cy, ex, ey, obj, space, x, y, $s, $r, $c} = $restore(this, {}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - obj = this; - if (!(obj.Space === ptrType$1.nil)) { - space = obj.Space; - obj.Space.Remove(new sliceType$3([obj])); - obj.Space = space; - _tuple = obj.BoundsToSpace(0, 0); - cx = _tuple[0]; - cy = _tuple[1]; - ex = _tuple[2]; - ey = _tuple[3]; - y = cy; - while (true) { - if (!(y <= ey)) { break; } - x = cx; - while (true) { - if (!(x <= ex)) { break; } - c = obj.Space.Cell(x, y); - if (!(c === ptrType.nil)) { - c.register(obj); - obj.TouchingCells = $append(obj.TouchingCells, c); - } - x = x + (1) >> 0; - } - y = y + (1) >> 0; - } - } - /* */ if (!($interfaceIsEqual(obj.Shape, $ifaceNil))) { $s = 1; continue; } - /* */ $s = 2; continue; - /* if (!($interfaceIsEqual(obj.Shape, $ifaceNil))) { */ case 1: - $r = obj.Shape.SetPosition(obj.X, obj.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: Object.ptr.prototype.Update, $c: true, $r, _tuple, c, cx, cy, ex, ey, obj, space, x, y, $s};return $f; - }; - Object.prototype.Update = function() { return this.$val.Update(); }; - Object.ptr.prototype.AddTags = function(tags) { - var obj, tags; - obj = this; - obj.tags = $appendSlice(obj.tags, tags); - }; - Object.prototype.AddTags = function(tags) { return this.$val.AddTags(tags); }; - Object.ptr.prototype.RemoveTags = function(tags) { - var _i, _i$1, _ref, _ref$1, i, obj, t, tag, tags; - obj = this; - _ref = tags; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - tag = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - _ref$1 = obj.tags; - _i$1 = 0; - while (true) { - if (!(_i$1 < _ref$1.$length)) { break; } - i = _i$1; - t = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); - if (t === tag) { - obj.tags = $appendSlice($subslice(obj.tags, 0, i), $subslice(obj.tags, (i + 1 >> 0))); - break; - } - _i$1++; - } - _i++; - } - }; - Object.prototype.RemoveTags = function(tags) { return this.$val.RemoveTags(tags); }; - Object.ptr.prototype.HasTags = function(tags) { - var _i, _i$1, _ref, _ref$1, obj, t, tag, tags; - obj = this; - _ref = tags; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - tag = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - _ref$1 = obj.tags; - _i$1 = 0; - while (true) { - if (!(_i$1 < _ref$1.$length)) { break; } - t = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); - if (t === tag) { - return true; - } - _i$1++; - } - _i++; - } - return false; - }; - Object.prototype.HasTags = function(tags) { return this.$val.HasTags(tags); }; - Object.ptr.prototype.Tags = function() { - var obj; - obj = this; - return $appendSlice(new sliceType$6([]), obj.tags); - }; - Object.prototype.Tags = function() { return this.$val.Tags(); }; - Object.ptr.prototype.SetShape = function(shape) { - var {obj, shape, $s, $r, $c} = $restore(this, {shape}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - obj = this; - /* */ if (!($interfaceIsEqual(obj.Shape, shape))) { $s = 1; continue; } - /* */ $s = 2; continue; - /* if (!($interfaceIsEqual(obj.Shape, shape))) { */ case 1: - obj.Shape = shape; - $r = obj.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: Object.ptr.prototype.SetShape, $c: true, $r, obj, shape, $s};return $f; - }; - Object.prototype.SetShape = function(shape) { return this.$val.SetShape(shape); }; - Object.ptr.prototype.BoundsToSpace = function(dx, dy) { - var _tuple, _tuple$1, cx, cy, dx, dy, ex, ey, obj; - obj = this; - _tuple = obj.Space.WorldToSpace(obj.X + dx, obj.Y + dy); - cx = _tuple[0]; - cy = _tuple[1]; - _tuple$1 = obj.Space.WorldToSpace(obj.X + obj.W + dx - 1, obj.Y + obj.H + dy - 1); - ex = _tuple$1[0]; - ey = _tuple$1[1]; - return [cx, cy, ex, ey]; - }; - Object.prototype.BoundsToSpace = function(dx, dy) { return this.$val.BoundsToSpace(dx, dy); }; - Object.ptr.prototype.SharesCells = function(other) { - var _i, _ref, cell, obj, other; - obj = this; - _ref = obj.TouchingCells; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - cell = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (cell.Contains(other)) { - return true; - } - _i++; - } - return false; - }; - Object.prototype.SharesCells = function(other) { return this.$val.SharesCells(other); }; - Object.ptr.prototype.SharesCellsTags = function(tags) { - var _i, _ref, cell, obj, tags; - obj = this; - _ref = obj.TouchingCells; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - cell = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (cell.ContainsTags(tags)) { - return true; - } - _i++; - } - return false; - }; - Object.prototype.SharesCellsTags = function(tags) { return this.$val.SharesCellsTags(tags); }; - Object.ptr.prototype.Center = function() { - var obj; - obj = this; - return [obj.X + (obj.W / 2), obj.Y + (obj.H / 2)]; - }; - Object.prototype.Center = function() { return this.$val.Center(); }; - Object.ptr.prototype.SetCenter = function(x, y) { - var obj, x, y; - obj = this; - obj.X = x - (obj.W / 2); - obj.Y = y - (obj.H / 2); - }; - Object.prototype.SetCenter = function(x, y) { return this.$val.SetCenter(x, y); }; - Object.ptr.prototype.CellPosition = function() { - var _tuple, obj; - obj = this; - _tuple = obj.Center(); - return obj.Space.WorldToSpace(_tuple[0], _tuple[1]); - }; - Object.prototype.CellPosition = function() { return this.$val.CellPosition(); }; - Object.ptr.prototype.SetRight = function(x) { - var obj, x; - obj = this; - obj.X = x - obj.W; - }; - Object.prototype.SetRight = function(x) { return this.$val.SetRight(x); }; - Object.ptr.prototype.SetBottom = function(y) { - var obj, y; - obj = this; - obj.Y = y - obj.H; - }; - Object.prototype.SetBottom = function(y) { return this.$val.SetBottom(y); }; - Object.ptr.prototype.Bottom = function() { - var obj; - obj = this; - return obj.Y + obj.H; - }; - Object.prototype.Bottom = function() { return this.$val.Bottom(); }; - Object.ptr.prototype.Right = function() { - var obj; - obj = this; - return obj.X + obj.W; - }; - Object.prototype.Right = function() { return this.$val.Right(); }; - Object.ptr.prototype.SetBounds = function(topLeft, bottomRight) { - var bottomRight, obj, topLeft; - obj = this; - obj.X = (0 >= topLeft.$length ? ($throwRuntimeError("index out of range"), undefined) : topLeft.$array[topLeft.$offset + 0]); - obj.Y = (1 >= topLeft.$length ? ($throwRuntimeError("index out of range"), undefined) : topLeft.$array[topLeft.$offset + 1]); - obj.W = (0 >= bottomRight.$length ? ($throwRuntimeError("index out of range"), undefined) : bottomRight.$array[bottomRight.$offset + 0]) - obj.X; - obj.H = (1 >= bottomRight.$length ? ($throwRuntimeError("index out of range"), undefined) : bottomRight.$array[bottomRight.$offset + 1]) - obj.Y; - }; - Object.prototype.SetBounds = function(topLeft, bottomRight) { return this.$val.SetBounds(topLeft, bottomRight); }; - Object.ptr.prototype.Check = function(dx, dy, tags) { - var _entry, _entry$1, _entry$2, _i, _key, _key$1, _ref, _tuple, _tuple$1, _tuple$2, added, added$1, c, cc, cellsAdded, cx, cy, dx, dy, ex, ey, ignored, o, obj, objectsAdded, tags, x, y; - obj = this; - if (obj.Space === ptrType$1.nil) { - return ptrType$7.nil; - } - cc = NewCollision(); - cc.checkingObject = obj; - if (dx < 0) { - dx = math.Min(dx, -1); - } else if (dx > 0) { - dx = math.Max(dx, 1); - } - if (dy < 0) { - dy = math.Min(dy, -1); - } else if (dy > 0) { - dy = math.Max(dy, 1); - } - cc.dx = dx; - cc.dy = dy; - _tuple = obj.BoundsToSpace(dx, dy); - cx = _tuple[0]; - cy = _tuple[1]; - ex = _tuple[2]; - ey = _tuple[3]; - objectsAdded = $makeMap(ptrType$2.keyFor, []); - cellsAdded = $makeMap(ptrType.keyFor, []); - y = cy; - while (true) { - if (!(y <= ey)) { break; } - x = cx; - while (true) { - if (!(x <= ex)) { break; } - c = obj.Space.Cell(x, y); - if (!(c === ptrType.nil)) { - _ref = c.Objects; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - o = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - ignored = (_entry = obj.ignoreList[ptrType$2.keyFor(o)], _entry !== undefined ? _entry.v : false); - if (o === obj || ignored) { - _i++; - continue; - } - _tuple$1 = (_entry$1 = objectsAdded[ptrType$2.keyFor(o)], _entry$1 !== undefined ? [_entry$1.v, true] : [false, false]); - added = _tuple$1[1]; - if (((tags.$length === 0) || o.HasTags(tags)) && !added) { - cc.Objects = $append(cc.Objects, o); - _key = o; (objectsAdded || $throwRuntimeError("assignment to entry in nil map"))[ptrType$2.keyFor(_key)] = { k: _key, v: true }; - _tuple$2 = (_entry$2 = cellsAdded[ptrType.keyFor(c)], _entry$2 !== undefined ? [_entry$2.v, true] : [false, false]); - added$1 = _tuple$2[1]; - if (!added$1) { - cc.Cells = $append(cc.Cells, c); - _key$1 = c; (cellsAdded || $throwRuntimeError("assignment to entry in nil map"))[ptrType.keyFor(_key$1)] = { k: _key$1, v: true }; - } - _i++; - continue; - } - _i++; - } - } - x = x + (1) >> 0; - } - y = y + (1) >> 0; - } - if (cc.Objects.$length === 0) { - return ptrType$7.nil; - } - return cc; - }; - Object.prototype.Check = function(dx, dy, tags) { return this.$val.Check(dx, dy, tags); }; - Object.ptr.prototype.Overlaps = function(other) { - var obj, other; - obj = this; - return other.X <= obj.X + obj.W && other.X + other.W >= obj.X && other.Y <= obj.Y + obj.H && other.Y + other.H >= obj.Y; - }; - Object.prototype.Overlaps = function(other) { return this.$val.Overlaps(other); }; - Object.ptr.prototype.AddToIgnoreList = function(ignoreObj) { - var _key, ignoreObj, obj; - obj = this; - _key = ignoreObj; (obj.ignoreList || $throwRuntimeError("assignment to entry in nil map"))[ptrType$2.keyFor(_key)] = { k: _key, v: true }; - }; - Object.prototype.AddToIgnoreList = function(ignoreObj) { return this.$val.AddToIgnoreList(ignoreObj); }; - Object.ptr.prototype.RemoveFromIgnoreList = function(ignoreObj) { - var ignoreObj, obj; - obj = this; - delete obj.ignoreList[ptrType$2.keyFor(ignoreObj)]; - }; - Object.prototype.RemoveFromIgnoreList = function(ignoreObj) { return this.$val.RemoveFromIgnoreList(ignoreObj); }; - axpyUnitaryTo = function(dst, alpha, x, y) { - var _i, _ref, alpha, dim, dst, i, v, x, y; - dim = y.$length; - _ref = x; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - i = _i; - v = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (i === dim) { - return; - } - ((i < 0 || i >= dst.$length) ? ($throwRuntimeError("index out of range"), undefined) : dst.$array[dst.$offset + i] = alpha * v + ((i < 0 || i >= y.$length) ? ($throwRuntimeError("index out of range"), undefined) : y.$array[y.$offset + i])); - _i++; - } - }; - scalUnitaryTo = function(dst, alpha, x) { - var _i, _ref, alpha, dst, i, x; - _ref = x; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - i = _i; - ((i < 0 || i >= dst.$length) ? ($throwRuntimeError("index out of range"), undefined) : dst.$array[dst.$offset + i] = ((i < 0 || i >= dst.$length) ? ($throwRuntimeError("index out of range"), undefined) : dst.$array[dst.$offset + i]) * (alpha)); - _i++; - } - }; - NewCollision = function() { - return new Collision.ptr(ptrType$2.nil, 0, 0, new sliceType$3([]), sliceType$1.nil); - }; - $pkg.NewCollision = NewCollision; - Collision.ptr.prototype.HasTags = function(tags) { - var _i, _ref, cc, o, tags; - cc = this; - _ref = cc.Objects; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - o = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (o === cc.checkingObject) { - _i++; - continue; - } - if (o.HasTags(tags)) { - return true; - } - _i++; - } - return false; - }; - Collision.prototype.HasTags = function(tags) { return this.$val.HasTags(tags); }; - Collision.ptr.prototype.ObjectsByTags = function(tags) { - var _i, _ref, cc, o, objects, tags; - cc = this; - objects = new sliceType$3([]); - _ref = cc.Objects; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - o = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (o === cc.checkingObject) { - _i++; - continue; - } - if (o.HasTags(tags)) { - objects = $append(objects, o); - } - _i++; - } - return objects; - }; - Collision.prototype.ObjectsByTags = function(tags) { return this.$val.ObjectsByTags(tags); }; - Collision.ptr.prototype.ContactWithObject = function(object) { - var cc, delta, object; - cc = this; - delta = new Vector([0, 0]); - if (cc.dx < 0) { - (0 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 0] = object.X + object.W - cc.checkingObject.X); - } else if (cc.dx > 0) { - (0 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 0] = object.X - cc.checkingObject.W - cc.checkingObject.X); - } - if (cc.dy < 0) { - (1 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 1] = object.Y + object.H - cc.checkingObject.Y); - } else if (cc.dy > 0) { - (1 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 1] = object.Y - cc.checkingObject.H - cc.checkingObject.Y); - } - return delta; - }; - Collision.prototype.ContactWithObject = function(object) { return this.$val.ContactWithObject(object); }; - Collision.ptr.prototype.ContactWithCell = function(cell) { - var cc, cell, cx, cy, delta; - cc = this; - delta = new Vector([0, 0]); - cx = (($imul(cell.X, cc.checkingObject.Space.CellWidth))); - cy = (($imul(cell.Y, cc.checkingObject.Space.CellHeight))); - if (cc.dx < 0) { - (0 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 0] = cx + (cc.checkingObject.Space.CellWidth) - cc.checkingObject.X); - } else if (cc.dx > 0) { - (0 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 0] = cx - cc.checkingObject.W - cc.checkingObject.X); - } - if (cc.dy < 0) { - (1 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 1] = cy + (cc.checkingObject.Space.CellHeight) - cc.checkingObject.Y); - } else if (cc.dy > 0) { - (1 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 1] = cy - cc.checkingObject.H - cc.checkingObject.Y); - } - return delta; - }; - Collision.prototype.ContactWithCell = function(cell) { return this.$val.ContactWithCell(cell); }; - Collision.ptr.prototype.SlideAgainstCell = function(cell, avoidTags) { - var _tuple, _tuple$1, avoidTags, cc, ccX, ccY, cell, collidingCell, diffX, diffY, down, hX, hY, left, oX, oY, right, slide, sp, up, x; - cc = this; - sp = cc.checkingObject.Space; - collidingCell = (x = cc.Cells, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])); - _tuple = sp.SpaceToWorld(collidingCell.X, collidingCell.Y); - ccX = _tuple[0]; - ccY = _tuple[1]; - hX = (sp.CellWidth) / 2; - hY = (sp.CellHeight) / 2; - ccX = ccX + (hX); - ccY = ccY + (hY); - _tuple$1 = cc.checkingObject.Center(); - oX = _tuple$1[0]; - oY = _tuple$1[1]; - diffX = oX - ccX; - diffY = oY - ccY; - left = sp.Cell(collidingCell.X - 1 >> 0, collidingCell.Y); - right = sp.Cell(collidingCell.X + 1 >> 0, collidingCell.Y); - up = sp.Cell(collidingCell.X, collidingCell.Y - 1 >> 0); - down = sp.Cell(collidingCell.X, collidingCell.Y + 1 >> 0); - slide = new Vector([0, 0]); - if (!((cc.dy === 0))) { - if (diffX > 0 && (right === ptrType.nil || !right.ContainsTags(avoidTags))) { - (0 >= slide.$length ? ($throwRuntimeError("index out of range"), undefined) : slide.$array[slide.$offset + 0] = ccX + hX - cc.checkingObject.X); - } else if (diffX < 0 && (left === ptrType.nil || !left.ContainsTags(avoidTags))) { - (0 >= slide.$length ? ($throwRuntimeError("index out of range"), undefined) : slide.$array[slide.$offset + 0] = ccX - hX - (cc.checkingObject.X + cc.checkingObject.W)); - } else { - return Vector.nil; - } - } - if (!((cc.dx === 0))) { - if (diffY > 0 && (down === ptrType.nil || !down.ContainsTags(avoidTags))) { - (1 >= slide.$length ? ($throwRuntimeError("index out of range"), undefined) : slide.$array[slide.$offset + 1] = ccY + hY - cc.checkingObject.Y); - } else if (diffY < 0 && (up === ptrType.nil || !up.ContainsTags(avoidTags))) { - (1 >= slide.$length ? ($throwRuntimeError("index out of range"), undefined) : slide.$array[slide.$offset + 1] = ccY - hY - (cc.checkingObject.Y + cc.checkingObject.H)); - } else { - return Vector.nil; - } - } - return slide; - }; - Collision.prototype.SlideAgainstCell = function(cell, avoidTags) { return this.$val.SlideAgainstCell(cell, avoidTags); }; - newCell = function(x, y) { - var x, y; - return new Cell.ptr(x, y, new sliceType$3([])); - }; - Cell.ptr.prototype.register = function(obj) { - var cell, obj; - cell = this; - if (!cell.Contains(obj)) { - cell.Objects = $append(cell.Objects, obj); - } - }; - Cell.prototype.register = function(obj) { return this.$val.register(obj); }; - Cell.ptr.prototype.unregister = function(obj) { - var _i, _ref, cell, i, o, obj, x, x$1, x$2; - cell = this; - _ref = cell.Objects; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - i = _i; - o = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (o === obj) { - (x$2 = cell.Objects, ((i < 0 || i >= x$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + i] = (x = cell.Objects, x$1 = cell.Objects.$length - 1 >> 0, ((x$1 < 0 || x$1 >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + x$1])))); - cell.Objects = $subslice(cell.Objects, 0, (cell.Objects.$length - 1 >> 0)); - break; - } - _i++; - } - }; - Cell.prototype.unregister = function(obj) { return this.$val.unregister(obj); }; - Cell.ptr.prototype.Contains = function(obj) { - var _i, _ref, cell, o, obj; - cell = this; - _ref = cell.Objects; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - o = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (o === obj) { - return true; - } - _i++; - } - return false; - }; - Cell.prototype.Contains = function(obj) { return this.$val.Contains(obj); }; - Cell.ptr.prototype.ContainsTags = function(tags) { - var _i, _ref, cell, o, tags; - cell = this; - _ref = cell.Objects; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - o = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (o.HasTags(tags)) { - return true; - } - _i++; - } - return false; - }; - Cell.prototype.ContainsTags = function(tags) { return this.$val.ContainsTags(tags); }; - Cell.ptr.prototype.Occupied = function() { - var cell; - cell = this; - return cell.Objects.$length > 0; - }; - Cell.prototype.Occupied = function() { return this.$val.Occupied(); }; - Vector.methods = [{prop: "Clone", name: "Clone", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "Add", name: "Add", pkg: "", typ: $funcType([sliceType$4], [Vector], true)}, {prop: "Sub", name: "Sub", pkg: "", typ: $funcType([sliceType$4], [Vector], true)}, {prop: "Scale", name: "Scale", pkg: "", typ: $funcType([$Float64], [Vector], false)}, {prop: "Equal", name: "Equal", pkg: "", typ: $funcType([Vector], [$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([], [Vector], false)}, {prop: "Dot", name: "Dot", pkg: "", typ: $funcType([Vector], [$Float64], false)}, {prop: "Cross", name: "Cross", pkg: "", typ: $funcType([Vector], [Vector], false)}, {prop: "Rotate", name: "Rotate", pkg: "", typ: $funcType([$Float64, sliceType$7], [Vector], 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)}]; - ptrType$1.methods = [{prop: "Add", name: "Add", pkg: "", typ: $funcType([sliceType$3], [], true)}, {prop: "Remove", name: "Remove", pkg: "", typ: $funcType([sliceType$3], [], true)}, {prop: "Objects", name: "Objects", pkg: "", typ: $funcType([], [sliceType$3], false)}, {prop: "Resize", name: "Resize", pkg: "", typ: $funcType([$Int, $Int], [], false)}, {prop: "Cell", name: "Cell", pkg: "", typ: $funcType([$Int, $Int], [ptrType], false)}, {prop: "CheckCells", name: "CheckCells", pkg: "", typ: $funcType([$Int, $Int, $Int, $Int, sliceType$6], [ptrType$2], true)}, {prop: "CheckCellsWorld", name: "CheckCellsWorld", pkg: "", typ: $funcType([$Float64, $Float64, $Float64, $Float64, sliceType$6], [ptrType$2], 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], [sliceType$1], false)}]; - ptrType$3.methods = [{prop: "Project", name: "Project", pkg: "", typ: $funcType([Vector], [Vector], false)}, {prop: "Normal", name: "Normal", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "Vector", name: "Vector", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "IntersectionPointsLine", name: "IntersectionPointsLine", pkg: "", typ: $funcType([ptrType$3], [Vector], false)}, {prop: "IntersectionPointsCircle", name: "IntersectionPointsCircle", pkg: "", typ: $funcType([ptrType$4], [sliceType$4], false)}]; - ptrType$5.methods = [{prop: "Clone", name: "Clone", pkg: "", typ: $funcType([], [Shape], false)}, {prop: "AddPointsVec", name: "AddPointsVec", pkg: "", typ: $funcType([sliceType$4], [], true)}, {prop: "AddPoints", name: "AddPoints", pkg: "", typ: $funcType([sliceType], [], true)}, {prop: "Lines", name: "Lines", pkg: "", typ: $funcType([], [sliceType$5], false)}, {prop: "Transformed", name: "Transformed", pkg: "", typ: $funcType([], [sliceType$4], false)}, {prop: "Bounds", name: "Bounds", pkg: "", typ: $funcType([], [Vector, Vector], 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([Vector], [], false)}, {prop: "Move", name: "Move", pkg: "", typ: $funcType([$Float64, $Float64], [], false)}, {prop: "MoveVec", name: "MoveVec", pkg: "", typ: $funcType([Vector], [], false)}, {prop: "Center", name: "Center", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "Project", name: "Project", pkg: "", typ: $funcType([Vector], [Projection], false)}, {prop: "SATAxes", name: "SATAxes", pkg: "", typ: $funcType([], [sliceType$4], false)}, {prop: "PointInside", name: "PointInside", pkg: "", typ: $funcType([Vector], [$Bool], false)}, {prop: "Intersection", name: "Intersection", pkg: "", typ: $funcType([$Float64, $Float64, Shape], [ptrType$6], false)}, {prop: "calculateMTV", name: "calculateMTV", pkg: "resolv", typ: $funcType([ptrType$6, Shape], [Vector], false)}, {prop: "ContainedBy", name: "ContainedBy", pkg: "", typ: $funcType([Shape], [$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)}]; - ptrType$6.methods = [{prop: "LeftmostPoint", name: "LeftmostPoint", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "RightmostPoint", name: "RightmostPoint", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "TopmostPoint", name: "TopmostPoint", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "BottommostPoint", name: "BottommostPoint", pkg: "", typ: $funcType([], [Vector], false)}]; - ptrType$4.methods = [{prop: "Clone", name: "Clone", pkg: "", typ: $funcType([], [Shape], false)}, {prop: "Bounds", name: "Bounds", pkg: "", typ: $funcType([], [Vector, Vector], false)}, {prop: "Intersection", name: "Intersection", pkg: "", typ: $funcType([$Float64, $Float64, Shape], [ptrType$6], false)}, {prop: "Move", name: "Move", pkg: "", typ: $funcType([$Float64, $Float64], [], false)}, {prop: "MoveVec", name: "MoveVec", pkg: "", typ: $funcType([Vector], [], false)}, {prop: "SetPosition", name: "SetPosition", pkg: "", typ: $funcType([$Float64, $Float64], [], false)}, {prop: "SetPositionVec", name: "SetPositionVec", pkg: "", typ: $funcType([Vector], [], false)}, {prop: "Position", name: "Position", pkg: "", typ: $funcType([], [$Float64, $Float64], false)}, {prop: "PointInside", name: "PointInside", pkg: "", typ: $funcType([Vector], [$Bool], false)}, {prop: "IntersectionPointsCircle", name: "IntersectionPointsCircle", pkg: "", typ: $funcType([ptrType$4], [sliceType$4], false)}]; - Projection.methods = [{prop: "Overlapping", name: "Overlapping", pkg: "", typ: $funcType([Projection], [$Bool], false)}, {prop: "Overlap", name: "Overlap", pkg: "", typ: $funcType([Projection], [$Float64], false)}, {prop: "IsInside", name: "IsInside", pkg: "", typ: $funcType([Projection], [$Bool], false)}]; - ptrType$2.methods = [{prop: "Clone", name: "Clone", pkg: "", typ: $funcType([], [ptrType$2], false)}, {prop: "Update", name: "Update", pkg: "", typ: $funcType([], [], false)}, {prop: "AddTags", name: "AddTags", pkg: "", typ: $funcType([sliceType$6], [], true)}, {prop: "RemoveTags", name: "RemoveTags", pkg: "", typ: $funcType([sliceType$6], [], true)}, {prop: "HasTags", name: "HasTags", pkg: "", typ: $funcType([sliceType$6], [$Bool], true)}, {prop: "Tags", name: "Tags", pkg: "", typ: $funcType([], [sliceType$6], false)}, {prop: "SetShape", name: "SetShape", pkg: "", typ: $funcType([Shape], [], false)}, {prop: "BoundsToSpace", name: "BoundsToSpace", pkg: "", typ: $funcType([$Float64, $Float64], [$Int, $Int, $Int, $Int], false)}, {prop: "SharesCells", name: "SharesCells", pkg: "", typ: $funcType([ptrType$2], [$Bool], false)}, {prop: "SharesCellsTags", name: "SharesCellsTags", pkg: "", typ: $funcType([sliceType$6], [$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([Vector, Vector], [], false)}, {prop: "Check", name: "Check", pkg: "", typ: $funcType([$Float64, $Float64, sliceType$6], [ptrType$7], true)}, {prop: "Overlaps", name: "Overlaps", pkg: "", typ: $funcType([ptrType$2], [$Bool], false)}, {prop: "AddToIgnoreList", name: "AddToIgnoreList", pkg: "", typ: $funcType([ptrType$2], [], false)}, {prop: "RemoveFromIgnoreList", name: "RemoveFromIgnoreList", pkg: "", typ: $funcType([ptrType$2], [], false)}]; - ptrType$7.methods = [{prop: "HasTags", name: "HasTags", pkg: "", typ: $funcType([sliceType$6], [$Bool], true)}, {prop: "ObjectsByTags", name: "ObjectsByTags", pkg: "", typ: $funcType([sliceType$6], [sliceType$3], true)}, {prop: "ContactWithObject", name: "ContactWithObject", pkg: "", typ: $funcType([ptrType$2], [Vector], false)}, {prop: "ContactWithCell", name: "ContactWithCell", pkg: "", typ: $funcType([ptrType], [Vector], false)}, {prop: "SlideAgainstCell", name: "SlideAgainstCell", pkg: "", typ: $funcType([ptrType, sliceType$6], [Vector], true)}]; - ptrType.methods = [{prop: "register", name: "register", pkg: "resolv", typ: $funcType([ptrType$2], [], false)}, {prop: "unregister", name: "unregister", pkg: "resolv", typ: $funcType([ptrType$2], [], false)}, {prop: "Contains", name: "Contains", pkg: "", typ: $funcType([ptrType$2], [$Bool], false)}, {prop: "ContainsTags", name: "ContainsTags", pkg: "", typ: $funcType([sliceType$6], [$Bool], true)}, {prop: "Occupied", name: "Occupied", pkg: "", typ: $funcType([], [$Bool], false)}]; - Vector.init($Float64); - Space.init("", [{prop: "Cells", name: "Cells", embedded: false, exported: true, typ: sliceType$2, tag: ""}, {prop: "CellWidth", name: "CellWidth", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "CellHeight", name: "CellHeight", embedded: false, exported: true, typ: $Int, tag: ""}]); - Shape.init([{prop: "Bounds", name: "Bounds", pkg: "", typ: $funcType([], [Vector, Vector], false)}, {prop: "Clone", name: "Clone", pkg: "", typ: $funcType([], [Shape], false)}, {prop: "Intersection", name: "Intersection", pkg: "", typ: $funcType([$Float64, $Float64, Shape], [ptrType$6], false)}, {prop: "Position", name: "Position", pkg: "", typ: $funcType([], [$Float64, $Float64], false)}, {prop: "SetPosition", name: "SetPosition", pkg: "", typ: $funcType([$Float64, $Float64], [], false)}]); - Line.init("", [{prop: "Start", name: "Start", embedded: false, exported: true, typ: Vector, tag: ""}, {prop: "End", name: "End", embedded: false, exported: true, typ: Vector, tag: ""}]); - ConvexPolygon.init("", [{prop: "Points", name: "Points", embedded: false, exported: true, typ: sliceType$4, 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: ""}]); - ContactSet.init("", [{prop: "Points", name: "Points", embedded: false, exported: true, typ: sliceType$4, tag: ""}, {prop: "MTV", name: "MTV", embedded: false, exported: true, typ: Vector, tag: ""}, {prop: "Center", name: "Center", embedded: false, exported: true, typ: Vector, tag: ""}]); - Circle.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: ""}]); - Projection.init("", [{prop: "Min", name: "Min", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "Max", name: "Max", embedded: false, exported: true, typ: $Float64, tag: ""}]); - Object.init("resolv", [{prop: "Shape", name: "Shape", embedded: false, exported: true, typ: Shape, tag: ""}, {prop: "Space", name: "Space", embedded: false, exported: true, typ: ptrType$1, 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: sliceType$1, tag: ""}, {prop: "Data", name: "Data", embedded: false, exported: true, typ: $emptyInterface, tag: ""}, {prop: "ignoreList", name: "ignoreList", embedded: false, exported: false, typ: mapType, tag: ""}, {prop: "tags", name: "tags", embedded: false, exported: false, typ: sliceType$6, tag: ""}]); - Collision.init("resolv", [{prop: "checkingObject", name: "checkingObject", embedded: false, exported: false, typ: ptrType$2, 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: sliceType$3, tag: ""}, {prop: "Cells", name: "Cells", embedded: false, exported: true, typ: sliceType$1, tag: ""}]); - Cell.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: sliceType$3, 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 = math.$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, math, resolv, Vec2D, Polygon2D, PlayerDownsync, InputFrameDecoded, Barrier, Bullet, MeleeBullet, FireballBullet, RoomDownsyncFrame, InputFrameDownsync, CharacterConfig, RingBuffer, SatResult, sliceType, sliceType$1, sliceType$2, ptrType, sliceType$3, sliceType$4, ptrType$1, ptrType$2, ptrType$3, ptrType$4, ptrType$5, ptrType$6, sliceType$5, sliceType$6, sliceType$7, sliceType$8, sliceType$9, ptrType$7, sliceType$10, ptrType$8, sliceType$11, sliceType$12, ptrType$9, sliceType$13, ptrType$10, mapType, ptrType$11, skillIdToBullet, inAirSet, NewRingBuffer, ConvertToInputFrameId, decodeInput, CalcPushbacks, isPolygonPairOverlapped, isPolygonPairSeparatedByDir, WorldToVirtualGridPos, VirtualGridToWorldPos, WorldToPolygonColliderBLPos, PolygonColliderBLToWorldPos, PolygonColliderBLToVirtualGridPos, VirtualGridToPolygonColliderBLPos, calcHardPushbacksNorms, deriveOpPattern, ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame, GenerateRectCollider, generateRectColliderInCollisionSpace, GenerateConvexPolygonCollider, AlignPolygon2DToBoundingBox; - math = $packages["math"]; - resolv = $packages["resolv"]; - Vec2D = $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_; - }); - Polygon2D = $pkg.Polygon2D = $newType(0, $kindStruct, "battle.Polygon2D", true, "jsexport/battle", true, function(Anchor_, Points_) { - this.$val = this; - if (arguments.length === 0) { - this.Anchor = ptrType$9.nil; - this.Points = sliceType$13.nil; - return; - } - this.Anchor = Anchor_; - this.Points = Points_; - }); - PlayerDownsync = $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_) { - 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; - 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_; - }); - InputFrameDecoded = $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_; - }); - Barrier = $pkg.Barrier = $newType(0, $kindStruct, "battle.Barrier", true, "jsexport/battle", true, function(Boundary_) { - this.$val = this; - if (arguments.length === 0) { - this.Boundary = ptrType$10.nil; - return; - } - this.Boundary = Boundary_; - }); - Bullet = $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_, BlowUpVelY_) { - 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; - this.BlowUpVelY = 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_; - this.BlowUpVelY = BlowUpVelY_; - }); - MeleeBullet = $pkg.MeleeBullet = $newType(0, $kindStruct, "battle.MeleeBullet", true, "jsexport/battle", true, function(Bullet_) { - this.$val = this; - if (arguments.length === 0) { - this.Bullet = new Bullet.ptr(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - return; - } - this.Bullet = Bullet_; - }); - FireballBullet = $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 Bullet.ptr(0, 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_; - }); - RoomDownsyncFrame = $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 = sliceType$6.nil; - this.CountdownNanos = new $Int64(0, 0); - this.MeleeBullets = sliceType$7.nil; - this.FireballBullets = sliceType$11.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_; - }); - InputFrameDownsync = $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 = sliceType$5.nil; - this.ConfirmedList = new $Uint64(0, 0); - return; - } - this.InputFrameId = InputFrameId_; - this.InputList = InputList_; - this.ConfirmedList = ConfirmedList_; - }); - CharacterConfig = $pkg.CharacterConfig = $newType(0, $kindStruct, "battle.CharacterConfig", true, "jsexport/battle", true, function(SpeciesId_, SpeciesName_, InAirIdleFrameIdxTurningPoint_, InAirIdleFrameIdxTurnedCycle_, LayDownFrames_, LayDownFramesToRecover_, GetUpFrames_, GetUpFramesToRecover_, JumpingInitVelY_, PatternIdToSkillId_) { - 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.GetUpFrames = 0; - this.GetUpFramesToRecover = 0; - this.JumpingInitVelY = 0; - this.PatternIdToSkillId = false; - return; - } - this.SpeciesId = SpeciesId_; - this.SpeciesName = SpeciesName_; - this.InAirIdleFrameIdxTurningPoint = InAirIdleFrameIdxTurningPoint_; - this.InAirIdleFrameIdxTurnedCycle = InAirIdleFrameIdxTurnedCycle_; - this.LayDownFrames = LayDownFrames_; - this.LayDownFramesToRecover = LayDownFramesToRecover_; - this.GetUpFrames = GetUpFrames_; - this.GetUpFramesToRecover = GetUpFramesToRecover_; - this.JumpingInitVelY = JumpingInitVelY_; - this.PatternIdToSkillId = PatternIdToSkillId_; - }); - RingBuffer = $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 = sliceType$2.nil; - return; - } - this.Ed = Ed_; - this.St = St_; - this.EdFrameId = EdFrameId_; - this.StFrameId = StFrameId_; - this.N = N_; - this.Cnt = Cnt_; - this.Eles = Eles_; - }); - SatResult = $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 = resolv.Vector.nil; - return; - } - this.Overlap = Overlap_; - this.OverlapX = OverlapX_; - this.OverlapY = OverlapY_; - this.AContainedInB = AContainedInB_; - this.BContainedInA = BContainedInA_; - this.Axis = Axis_; - }); - sliceType = $sliceType($Int32); - sliceType$1 = $sliceType(sliceType); - sliceType$2 = $sliceType($emptyInterface); - ptrType = $ptrType(SatResult); - sliceType$3 = $sliceType(Vec2D); - sliceType$4 = $sliceType($String); - ptrType$1 = $ptrType(resolv.Collision); - ptrType$2 = $ptrType(sliceType$3); - ptrType$3 = $ptrType(PlayerDownsync); - ptrType$4 = $ptrType(MeleeBullet); - ptrType$5 = $ptrType(resolv.ConvexPolygon); - ptrType$6 = $ptrType(InputFrameDownsync); - sliceType$5 = $sliceType($Uint64); - sliceType$6 = $sliceType(ptrType$3); - sliceType$7 = $sliceType(ptrType$4); - sliceType$8 = $sliceType(ptrType$2); - sliceType$9 = $sliceType($Bool); - ptrType$7 = $ptrType(resolv.Object); - sliceType$10 = $sliceType(ptrType$7); - ptrType$8 = $ptrType(FireballBullet); - sliceType$11 = $sliceType(ptrType$8); - sliceType$12 = $sliceType($Float64); - ptrType$9 = $ptrType(Vec2D); - sliceType$13 = $sliceType(ptrType$9); - ptrType$10 = $ptrType(Polygon2D); - mapType = $mapType($Int, $Int); - ptrType$11 = $ptrType(RingBuffer); - NewRingBuffer = function(n) { - var n; - return new RingBuffer.ptr(0, 0, 0, 0, n, 0, $makeSlice(sliceType$2, n)); - }; - $pkg.NewRingBuffer = NewRingBuffer; - RingBuffer.ptr.prototype.Put = function(pItem) { - var pItem, rb, x, x$1; - rb = this; - while (true) { - if (!(0 < rb.Cnt && rb.Cnt >= rb.N)) { break; } - rb.Pop(); - } - (x = rb.Eles, x$1 = rb.Ed, ((x$1 < 0 || x$1 >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + x$1] = pItem)); - rb.EdFrameId = rb.EdFrameId + (1) >> 0; - rb.Cnt = rb.Cnt + (1) >> 0; - rb.Ed = rb.Ed + (1) >> 0; - if (rb.Ed >= rb.N) { - rb.Ed = rb.Ed - (rb.N) >> 0; - } - }; - RingBuffer.prototype.Put = function(pItem) { return this.$val.Put(pItem); }; - RingBuffer.ptr.prototype.Pop = function() { - var pItem, rb, x, x$1; - rb = this; - if (0 === rb.Cnt) { - return $ifaceNil; - } - pItem = (x = rb.Eles, x$1 = rb.St, ((x$1 < 0 || x$1 >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + x$1])); - rb.StFrameId = rb.StFrameId + (1) >> 0; - rb.Cnt = rb.Cnt - (1) >> 0; - rb.St = rb.St + (1) >> 0; - if (rb.St >= rb.N) { - rb.St = rb.St - (rb.N) >> 0; - } - return pItem; - }; - RingBuffer.prototype.Pop = function() { return this.$val.Pop(); }; - RingBuffer.ptr.prototype.GetArrIdxByOffset = function(offsetFromSt) { - var arrIdx, offsetFromSt, rb; - rb = this; - if ((0 === rb.Cnt) || 0 > offsetFromSt) { - return -1; - } - arrIdx = rb.St + offsetFromSt >> 0; - if (rb.St < rb.Ed) { - if (rb.St <= arrIdx && arrIdx < rb.Ed) { - return arrIdx; - } - } else { - if (arrIdx >= rb.N) { - arrIdx = arrIdx - (rb.N) >> 0; - } - if (arrIdx >= rb.St || arrIdx < rb.Ed) { - return arrIdx; - } - } - return -1; - }; - RingBuffer.prototype.GetArrIdxByOffset = function(offsetFromSt) { return this.$val.GetArrIdxByOffset(offsetFromSt); }; - RingBuffer.ptr.prototype.GetByOffset = function(offsetFromSt) { - var arrIdx, offsetFromSt, rb, x; - rb = this; - arrIdx = rb.GetArrIdxByOffset(offsetFromSt); - if (-1 === arrIdx) { - return $ifaceNil; - } - return (x = rb.Eles, ((arrIdx < 0 || arrIdx >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + arrIdx])); - }; - RingBuffer.prototype.GetByOffset = function(offsetFromSt) { return this.$val.GetByOffset(offsetFromSt); }; - RingBuffer.ptr.prototype.GetByFrameId = function(frameId) { - var frameId, rb; - rb = this; - if (frameId >= rb.EdFrameId || frameId < rb.StFrameId) { - return $ifaceNil; - } - return rb.GetByOffset(frameId - rb.StFrameId >> 0); - }; - RingBuffer.prototype.GetByFrameId = function(frameId) { return this.$val.GetByFrameId(frameId); }; - RingBuffer.ptr.prototype.SetByFrameId = function(pItem, frameId) { - var _tmp, _tmp$1, _tmp$2, _tmp$3, _tmp$4, _tmp$5, arrIdx, frameId, oldEdFrameId, oldStFrameId, pItem, rb, ret, x; - rb = this; - _tmp = rb.StFrameId; - _tmp$1 = rb.EdFrameId; - oldStFrameId = _tmp; - oldEdFrameId = _tmp$1; - if (frameId < oldStFrameId) { - return [2, oldStFrameId, oldEdFrameId]; - } - if (oldEdFrameId > frameId) { - arrIdx = rb.GetArrIdxByOffset(frameId - rb.StFrameId >> 0); - if (!((-1 === arrIdx))) { - (x = rb.Eles, ((arrIdx < 0 || arrIdx >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + arrIdx] = pItem)); - return [0, oldStFrameId, oldEdFrameId]; - } - } - ret = 0; - if (oldEdFrameId < frameId) { - _tmp$2 = 0; - _tmp$3 = 0; - rb.St = _tmp$2; - rb.Ed = _tmp$3; - _tmp$4 = frameId; - _tmp$5 = frameId; - rb.StFrameId = _tmp$4; - rb.EdFrameId = _tmp$5; - rb.Cnt = 0; - ret = 1; - } - rb.Put(pItem); - return [ret, oldStFrameId, oldEdFrameId]; - }; - RingBuffer.prototype.SetByFrameId = function(pItem, frameId) { return this.$val.SetByFrameId(pItem, frameId); }; - ConvertToInputFrameId = function(renderFrameId, inputDelayFrames, inputScaleFrames) { - var inputDelayFrames, inputScaleFrames, renderFrameId; - if (renderFrameId < inputDelayFrames) { - return 0; - } - return ((((renderFrameId - inputDelayFrames >> 0)) >> $min(inputScaleFrames, 31)) >> 0); - }; - $pkg.ConvertToInputFrameId = ConvertToInputFrameId; - decodeInput = function(encodedInput) { - var btnALevel, btnBLevel, encodedDirection, encodedInput, x, x$1, x$2, x$3; - encodedDirection = new $Uint64(encodedInput.$high & 0, (encodedInput.$low & 15) >>> 0); - btnALevel = (((x = $shiftRightUint64(encodedInput, 4), new $Uint64(x.$high & 0, (x.$low & 1) >>> 0)).$low >> 0)); - btnBLevel = (((x$1 = $shiftRightUint64(encodedInput, 5), new $Uint64(x$1.$high & 0, (x$1.$low & 1) >>> 0)).$low >> 0)); - return new InputFrameDecoded.ptr((x$2 = (($flatten64(encodedDirection) < 0 || $flatten64(encodedDirection) >= $pkg.DIRECTION_DECODER.$length) ? ($throwRuntimeError("index out of range"), undefined) : $pkg.DIRECTION_DECODER.$array[$pkg.DIRECTION_DECODER.$offset + $flatten64(encodedDirection)]), (0 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 0])), (x$3 = (($flatten64(encodedDirection) < 0 || $flatten64(encodedDirection) >= $pkg.DIRECTION_DECODER.$length) ? ($throwRuntimeError("index out of range"), undefined) : $pkg.DIRECTION_DECODER.$array[$pkg.DIRECTION_DECODER.$offset + $flatten64(encodedDirection)]), (1 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 1])), btnALevel, btnBLevel); - }; - CalcPushbacks = function(oldDx, oldDy, playerShape, barrierShape) { - var {$24r, $24r$1, _tmp, _tmp$1, _tuple, barrierShape, oldDx, oldDy, origX, origY, overlapResult, overlapped, playerShape, pushbackX, pushbackY, $s, $deferred, $r, $c} = $restore(this, {oldDx, oldDy, playerShape, barrierShape}); - /* */ $s = $s || 0; var $err = null; try { s: while (true) { switch ($s) { case 0: $deferred = []; $curGoroutine.deferStack.push($deferred); - origX = [origX]; - origY = [origY]; - playerShape = [playerShape]; - _tuple = playerShape[0].Position(); - origX[0] = _tuple[0]; - origY[0] = _tuple[1]; - $deferred.push([(function(origX, origY, playerShape) { return function() { - playerShape[0].SetPosition(origX[0], origY[0]); - }; })(origX, origY, playerShape), []]); - playerShape[0].SetPosition(origX[0] + oldDx, origY[0] + oldDy); - overlapResult = new SatResult.ptr(0, 0, 0, true, true, new resolv.Vector([0, 0])); - overlapped = isPolygonPairOverlapped(playerShape[0], barrierShape, overlapResult); - /* */ if (overlapped) { $s = 1; continue; } - /* */ $s = 2; continue; - /* if (overlapped) { */ case 1: - _tmp = overlapResult.Overlap * overlapResult.OverlapX; - _tmp$1 = overlapResult.Overlap * overlapResult.OverlapY; - pushbackX = _tmp; - pushbackY = _tmp$1; - $24r = [true, pushbackX, pushbackY, overlapResult]; - $s = 4; case 4: return $24r; - /* } else { */ case 2: - $24r$1 = [false, 0, 0, overlapResult]; - $s = 5; case 5: return $24r$1; - /* } */ case 3: - $s = -1; return [false, 0, 0, ptrType.nil]; - /* */ } return; } } catch(err) { $err = err; $s = -1; return [false, 0, 0, ptrType.nil]; } finally { $callDeferred($deferred, $err); if($curGoroutine.asleep) { var $f = {$blk: CalcPushbacks, $c: true, $r, $24r, $24r$1, _tmp, _tmp$1, _tuple, barrierShape, oldDx, oldDy, origX, origY, overlapResult, overlapped, playerShape, pushbackX, pushbackY, $s, $deferred};return $f; } } - }; - $pkg.CalcPushbacks = CalcPushbacks; - isPolygonPairOverlapped = function(a, b, result) { - var _i, _i$1, _ref, _ref$1, _tmp, _tmp$1, a, aCnt, axis, axis$1, b, bCnt, result, x, x$1, x$2, x$3, x$4, x$5, x$6, x$7; - _tmp = a.Points.$length; - _tmp$1 = b.Points.$length; - aCnt = _tmp; - bCnt = _tmp$1; - if ((1 === aCnt) && (1 === bCnt)) { - if (!(ptrType.nil === result)) { - result.Overlap = 0; - } - return ((x = (x$1 = a.Points, (0 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 0])), (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])) === (x$2 = (x$3 = b.Points, (0 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 0])), (0 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 0]))) && ((x$4 = (x$5 = a.Points, (0 >= x$5.$length ? ($throwRuntimeError("index out of range"), undefined) : x$5.$array[x$5.$offset + 0])), (1 >= x$4.$length ? ($throwRuntimeError("index out of range"), undefined) : x$4.$array[x$4.$offset + 1])) === (x$6 = (x$7 = b.Points, (0 >= x$7.$length ? ($throwRuntimeError("index out of range"), undefined) : x$7.$array[x$7.$offset + 0])), (1 >= x$6.$length ? ($throwRuntimeError("index out of range"), undefined) : x$6.$array[x$6.$offset + 1]))); - } - if (1 < aCnt) { - _ref = a.SATAxes(); - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - axis = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (isPolygonPairSeparatedByDir(a, b, axis.Unit(), result)) { - return false; - } - _i++; - } - } - if (1 < bCnt) { - _ref$1 = b.SATAxes(); - _i$1 = 0; - while (true) { - if (!(_i$1 < _ref$1.$length)) { break; } - axis$1 = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); - if (isPolygonPairSeparatedByDir(a, b, axis$1.Unit(), result)) { - return false; - } - _i$1++; - } - } - return true; - }; - isPolygonPairSeparatedByDir = function(a, b, e, result) { - var _i, _i$1, _ref, _ref$1, _tmp, _tmp$1, _tmp$2, _tmp$3, a, aEnd, aStart, absoluteOverlap, b, bEnd, bStart, currentOverlap, dot, dot$1, e, option1, option1$1, option2, option2$1, overlap, p, p$1, result, sign, x, x$1; - _tmp = 1.7e+308; - _tmp$1 = -1.7e+308; - _tmp$2 = 1.7e+308; - _tmp$3 = -1.7e+308; - aStart = _tmp; - aEnd = _tmp$1; - bStart = _tmp$2; - bEnd = _tmp$3; - _ref = a.Points; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - p = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - dot = ((0 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 0]) + a.X) * (0 >= e.$length ? ($throwRuntimeError("index out of range"), undefined) : e.$array[e.$offset + 0]) + ((1 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 1]) + a.Y) * (1 >= e.$length ? ($throwRuntimeError("index out of range"), undefined) : e.$array[e.$offset + 1]); - if (aStart > dot) { - aStart = dot; - } - if (aEnd < dot) { - aEnd = dot; - } - _i++; - } - _ref$1 = b.Points; - _i$1 = 0; - while (true) { - if (!(_i$1 < _ref$1.$length)) { break; } - p$1 = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); - dot$1 = ((0 >= p$1.$length ? ($throwRuntimeError("index out of range"), undefined) : p$1.$array[p$1.$offset + 0]) + b.X) * (0 >= e.$length ? ($throwRuntimeError("index out of range"), undefined) : e.$array[e.$offset + 0]) + ((1 >= p$1.$length ? ($throwRuntimeError("index out of range"), undefined) : p$1.$array[p$1.$offset + 1]) + b.Y) * (1 >= e.$length ? ($throwRuntimeError("index out of range"), undefined) : e.$array[e.$offset + 1]); - if (bStart > dot$1) { - bStart = dot$1; - } - if (bEnd < dot$1) { - bEnd = dot$1; - } - _i$1++; - } - if (aStart > bEnd || aEnd < bStart) { - return true; - } - if (!(ptrType.nil === result)) { - overlap = 0; - if (aStart < bStart) { - result.AContainedInB = false; - if (aEnd < bEnd) { - overlap = aEnd - bStart; - result.BContainedInA = false; - } else { - option1 = aEnd - bStart; - option2 = bEnd - aStart; - if (option1 < option2) { - overlap = option1; - } else { - overlap = -option2; - } - } - } else { - result.BContainedInA = false; - if (aEnd > bEnd) { - overlap = aStart - bEnd; - result.AContainedInB = false; - } else { - option1$1 = aEnd - bStart; - option2$1 = bEnd - aStart; - if (option1$1 < option2$1) { - overlap = option1$1; - } else { - overlap = -option2$1; - } - } - } - currentOverlap = result.Overlap; - absoluteOverlap = overlap; - if (overlap < 0) { - absoluteOverlap = -overlap; - } - if (((0 === (x = result.Axis, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0]))) && (0 === (x$1 = result.Axis, (1 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 1])))) || currentOverlap > absoluteOverlap) { - sign = 1; - if (overlap < 0) { - sign = -1; - } - result.Overlap = absoluteOverlap; - result.OverlapX = (0 >= e.$length ? ($throwRuntimeError("index out of range"), undefined) : e.$array[e.$offset + 0]) * sign; - result.OverlapY = (1 >= e.$length ? ($throwRuntimeError("index out of range"), undefined) : e.$array[e.$offset + 1]) * sign; - } - result.Axis = e; - } - return false; - }; - WorldToVirtualGridPos = function(wx, wy, worldToVirtualGridRatio) { - var virtualGridX, virtualGridY, worldToVirtualGridRatio, wx, wy; - virtualGridX = ((math.Floor(wx * worldToVirtualGridRatio) >> 0)); - virtualGridY = ((math.Floor(wy * worldToVirtualGridRatio) >> 0)); - return [virtualGridX, virtualGridY]; - }; - $pkg.WorldToVirtualGridPos = WorldToVirtualGridPos; - VirtualGridToWorldPos = function(vx, vy, virtualGridToWorldRatio) { - var virtualGridToWorldRatio, vx, vy, wx, wy; - wx = (vx) * virtualGridToWorldRatio; - wy = (vy) * virtualGridToWorldRatio; - return [wx, wy]; - }; - $pkg.VirtualGridToWorldPos = VirtualGridToWorldPos; - WorldToPolygonColliderBLPos = function(wx, wy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY) { - var bottomPadding, collisionSpaceOffsetX, collisionSpaceOffsetY, halfBoundingH, halfBoundingW, leftPadding, rightPadding, topPadding, wx, wy; - return [wx - halfBoundingW - leftPadding + collisionSpaceOffsetX, wy - halfBoundingH - bottomPadding + collisionSpaceOffsetY]; - }; - $pkg.WorldToPolygonColliderBLPos = WorldToPolygonColliderBLPos; - PolygonColliderBLToWorldPos = function(cx, cy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY) { - var bottomPadding, collisionSpaceOffsetX, collisionSpaceOffsetY, cx, cy, halfBoundingH, halfBoundingW, leftPadding, rightPadding, topPadding; - return [cx + halfBoundingW + leftPadding - collisionSpaceOffsetX, cy + halfBoundingH + bottomPadding - collisionSpaceOffsetY]; - }; - $pkg.PolygonColliderBLToWorldPos = PolygonColliderBLToWorldPos; - PolygonColliderBLToVirtualGridPos = function(cx, cy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY, worldToVirtualGridRatio) { - var _tuple, bottomPadding, collisionSpaceOffsetX, collisionSpaceOffsetY, cx, cy, halfBoundingH, halfBoundingW, leftPadding, rightPadding, topPadding, worldToVirtualGridRatio, wx, wy; - _tuple = PolygonColliderBLToWorldPos(cx, cy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY); - wx = _tuple[0]; - wy = _tuple[1]; - return WorldToVirtualGridPos(wx, wy, worldToVirtualGridRatio); - }; - $pkg.PolygonColliderBLToVirtualGridPos = PolygonColliderBLToVirtualGridPos; - VirtualGridToPolygonColliderBLPos = function(vx, vy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY, virtualGridToWorldRatio) { - var _tuple, bottomPadding, collisionSpaceOffsetX, collisionSpaceOffsetY, halfBoundingH, halfBoundingW, leftPadding, rightPadding, topPadding, virtualGridToWorldRatio, vx, vy, wx, wy; - _tuple = VirtualGridToWorldPos(vx, vy, virtualGridToWorldRatio); - wx = _tuple[0]; - wy = _tuple[1]; - return WorldToPolygonColliderBLPos(wx, wy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY); - }; - $pkg.VirtualGridToPolygonColliderBLPos = VirtualGridToPolygonColliderBLPos; - calcHardPushbacksNorms = function(joinIndex, playerCollider, playerShape, snapIntoPlatformOverlap, pEffPushback) { - var {_i, _r, _ref, _ref$1, _tmp, _tmp$1, _tuple, barrierShape, collision, isBarrier, joinIndex, obj, overlapResult, overlapped, pEffPushback, playerCollider, playerShape, pushbackX, pushbackY, ret, snapIntoPlatformOverlap, $s, $r, $c} = $restore(this, {joinIndex, playerCollider, playerShape, snapIntoPlatformOverlap, pEffPushback}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - ret = [ret]; - ret[0] = $makeSlice(sliceType$3, 0, 10); - collision = playerCollider.Check(0, 0, new sliceType$4([])); - if (ptrType$1.nil === collision) { - $s = -1; return (ret.$ptr || (ret.$ptr = new ptrType$2(function() { return this.$target[0]; }, function($v) { this.$target[0] = $v; }, ret))); - } - _ref = collision.Objects; - _i = 0; - /* while (true) { */ case 1: - /* if (!(_i < _ref.$length)) { break; } */ if(!(_i < _ref.$length)) { $s = 2; continue; } - obj = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - isBarrier = false; - _ref$1 = obj.Data; - if ($assertType(_ref$1, ptrType$3, true)[1]) { - } else if ($assertType(_ref$1, ptrType$4, true)[1]) { - } else { - isBarrier = true; - } - if (!isBarrier) { - _i++; - /* continue; */ $s = 1; continue; - } - barrierShape = $assertType(obj.Shape, ptrType$5); - _r = CalcPushbacks(0, 0, playerShape, barrierShape); /* */ $s = 3; case 3: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - _tuple = _r; - overlapped = _tuple[0]; - pushbackX = _tuple[1]; - pushbackY = _tuple[2]; - overlapResult = _tuple[3]; - if (!overlapped) { - _i++; - /* continue; */ $s = 1; continue; - } - _tmp = (overlapResult.Overlap - snapIntoPlatformOverlap) * overlapResult.OverlapX; - _tmp$1 = (overlapResult.Overlap - snapIntoPlatformOverlap) * overlapResult.OverlapY; - pushbackX = _tmp; - pushbackY = _tmp$1; - ret[0] = $append(ret[0], new Vec2D.ptr(overlapResult.OverlapX, overlapResult.OverlapY)); - pEffPushback.X = pEffPushback.X + (pushbackX); - pEffPushback.Y = pEffPushback.Y + (pushbackY); - _i++; - $s = 1; continue; - case 2: - $s = -1; return (ret.$ptr || (ret.$ptr = new ptrType$2(function() { return this.$target[0]; }, function($v) { this.$target[0] = $v; }, ret))); - /* */ } return; } var $f = {$blk: calcHardPushbacksNorms, $c: true, $r, _i, _r, _ref, _ref$1, _tmp, _tmp$1, _tuple, barrierShape, collision, isBarrier, joinIndex, obj, overlapResult, overlapped, pEffPushback, playerCollider, playerShape, pushbackX, pushbackY, ret, snapIntoPlatformOverlap, $s};return $f; - }; - deriveOpPattern = function(currPlayerDownsync, thatPlayerInNextFrame, currRenderFrame, inputsBuffer, inputDelayFrames, inputScaleFrames) { - var _entry, _tmp, _tmp$1, _tmp$2, _tmp$3, _tmp$4, _tmp$5, _tuple, currPlayerDownsync, currRenderFrame, decodedInput, delayedInputFrameId, delayedInputFrameIdForPrevRdf, delayedInputList, delayedInputListForPrevRdf, effDx, effDy, existent, inputDelayFrames, inputScaleFrames, inputsBuffer, joinIndex, jumpedOrNot, patternId, prevBtnALevel, prevBtnBLevel, prevDecodedInput, thatPlayerInNextFrame, x, x$1; - delayedInputFrameId = ConvertToInputFrameId(currRenderFrame.Id, inputDelayFrames, inputScaleFrames); - delayedInputFrameIdForPrevRdf = ConvertToInputFrameId(currRenderFrame.Id - 1 >> 0, inputDelayFrames, inputScaleFrames); - if (0 >= delayedInputFrameId) { - return [-2, false, 0, 0]; - } - delayedInputList = $assertType(inputsBuffer.GetByFrameId(delayedInputFrameId), ptrType$6).InputList; - delayedInputListForPrevRdf = sliceType$5.nil; - if (0 < delayedInputFrameIdForPrevRdf) { - delayedInputListForPrevRdf = $assertType(inputsBuffer.GetByFrameId(delayedInputFrameIdForPrevRdf), ptrType$6).InputList; - } - jumpedOrNot = false; - joinIndex = currPlayerDownsync.JoinIndex; - if (0 < currPlayerDownsync.FramesToRecover) { - return [-2, false, 0, 0]; - } - decodedInput = decodeInput((x = joinIndex - 1 >> 0, ((x < 0 || x >= delayedInputList.$length) ? ($throwRuntimeError("index out of range"), undefined) : delayedInputList.$array[delayedInputList.$offset + x]))); - _tmp = decodedInput.Dx; - _tmp$1 = decodedInput.Dy; - effDx = _tmp; - effDy = _tmp$1; - _tmp$2 = 0; - _tmp$3 = 0; - prevBtnALevel = _tmp$2; - prevBtnBLevel = _tmp$3; - if (!(sliceType$5.nil === delayedInputListForPrevRdf)) { - prevDecodedInput = decodeInput((x$1 = joinIndex - 1 >> 0, ((x$1 < 0 || x$1 >= delayedInputListForPrevRdf.$length) ? ($throwRuntimeError("index out of range"), undefined) : delayedInputListForPrevRdf.$array[delayedInputListForPrevRdf.$offset + x$1]))); - prevBtnALevel = prevDecodedInput.BtnALevel; - prevBtnBLevel = prevDecodedInput.BtnBLevel; - } - if (decodedInput.BtnBLevel > prevBtnBLevel) { - _tuple = (_entry = inAirSet[$Int32.keyFor(currPlayerDownsync.CharacterState)], _entry !== undefined ? [_entry.v, true] : [false, false]); - existent = _tuple[1]; - if (!existent) { - jumpedOrNot = true; - } - } - patternId = -1; - if (decodedInput.BtnALevel > prevBtnALevel) { - if (currPlayerDownsync.InAir) { - patternId = 1; - } else { - patternId = 0; - } - _tmp$4 = 0; - _tmp$5 = 0; - effDx = _tmp$4; - effDy = _tmp$5; - } - return [patternId, jumpedOrNot, effDx, effDy]; - }; - ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame = function(inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, playerOpPatternToSkillId, chConfigsOrderedByJoinIndex) { - var {_1, _entry, _entry$1, _entry$2, _entry$3, _entry$4, _i, _i$1, _i$10, _i$2, _i$3, _i$4, _i$5, _i$6, _i$7, _i$8, _i$9, _index, _index$1, _index$2, _index$3, _r, _r$1, _r$2, _r$3, _ref, _ref$1, _ref$10, _ref$11, _ref$12, _ref$2, _ref$3, _ref$4, _ref$5, _ref$6, _ref$7, _ref$8, _ref$9, _tmp, _tmp$1, _tmp$10, _tmp$11, _tmp$12, _tmp$13, _tmp$14, _tmp$15, _tmp$16, _tmp$2, _tmp$3, _tmp$4, _tmp$5, _tmp$6, _tmp$7, _tmp$8, _tmp$9, _tuple, _tuple$1, _tuple$2, _tuple$3, _tuple$4, _tuple$5, _tuple$6, atkedPlayerInCurFrame, atkedPlayerInNextFrame, bShape, bulletCollider, bulletColliders, bulletShape, bulletWx, bulletWy, chConfigsOrderedByJoinIndex, collision, collision$1, collisionPlayerIndex, collisionPlayerIndex$1, collisionPlayerIndex$2, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currPlayerDownsync, currPlayerDownsync$1, currPlayerDownsync$2, currPlayerDownsync$3, currPlayerDownsync$4, currRenderFrame, defenderShape, effDx, effDy, effPushbacks, existent, hardPushbackNorm, hardPushbackNorm$1, hardPushbackNorms, i, i$1, i$2, i$3, i$4, inputsBuffer, isAnotherPlayer, isBarrier, isBullet, joinIndex, joinIndex$1, joinIndex$2, joinIndex$3, joinIndex$4, jumpedOrNot, jumpedOrNotList, landedOnGravityPushback, meleeBullet, meleeBullet$1, newBulletCollider, newMeleeBullet, newVx, newVy, nextRenderFrameMeleeBullets, nextRenderFramePlayers, normAlignmentWithGravity, obj, obj$1, offender, offender$1, offenderWx, offenderWy, oldFramesToRecover, oldNextCharacterState, overlapResult, overlapped, overlapped$1, patternId, playerCollider, playerCollider$1, playerCollider$2, playerOpPatternToSkillId, playerShape, projectedMagnitude, projectedMagnitude$1, pushbackX, pushbackX$1, pushbackY, pushbackY$1, roomCapacity, skillConfig, skillId, t, t$1, thatPlayerInNextFrame, thatPlayerInNextFrame$1, thatPlayerInNextFrame$2, thatPlayerInNextFrame$3, x, x$1, x$10, x$11, x$12, x$13, x$14, x$15, x$2, x$3, x$4, x$5, x$6, x$7, x$8, x$9, xfac, xfac$1, $s, $r, $c} = $restore(this, {inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, playerOpPatternToSkillId, chConfigsOrderedByJoinIndex}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - roomCapacity = currRenderFrame.PlayersArr.$length; - nextRenderFramePlayers = $makeSlice(sliceType$6, roomCapacity); - _ref = currRenderFrame.PlayersArr; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - i = _i; - currPlayerDownsync = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - ((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i] = new PlayerDownsync.ptr(currPlayerDownsync.Id, currPlayerDownsync.VirtualGridX, currPlayerDownsync.VirtualGridY, currPlayerDownsync.DirX, currPlayerDownsync.DirY, currPlayerDownsync.VelX, currPlayerDownsync.VelY, currPlayerDownsync.Speed, currPlayerDownsync.BattleState, currPlayerDownsync.JoinIndex, 0, currPlayerDownsync.Removed, currPlayerDownsync.Score, 0, currPlayerDownsync.FramesToRecover - 1 >> 0, currPlayerDownsync.FramesInChState + 1 >> 0, currPlayerDownsync.Hp, currPlayerDownsync.MaxHp, currPlayerDownsync.CharacterState, true)); - if (((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i]).FramesToRecover < 0) { - ((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i]).FramesToRecover = 0; - } - _i++; - } - nextRenderFrameMeleeBullets = $makeSlice(sliceType$7, 0, currRenderFrame.MeleeBullets.$length); - effPushbacks = $makeSlice(sliceType$3, roomCapacity); - hardPushbackNorms = $makeSlice(sliceType$8, roomCapacity); - jumpedOrNotList = $makeSlice(sliceType$9, roomCapacity); - _ref$1 = currRenderFrame.PlayersArr; - _i$1 = 0; - while (true) { - if (!(_i$1 < _ref$1.$length)) { break; } - newMeleeBullet = [newMeleeBullet]; - i$1 = _i$1; - currPlayerDownsync$1 = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); - ((i$1 < 0 || i$1 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$1] = false); - thatPlayerInNextFrame = ((i$1 < 0 || i$1 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$1]); - _tuple = deriveOpPattern(currPlayerDownsync$1, thatPlayerInNextFrame, currRenderFrame, inputsBuffer, 8, 2); - patternId = _tuple[0]; - jumpedOrNot = _tuple[1]; - effDx = _tuple[2]; - effDy = _tuple[3]; - if (-2 === patternId) { - _i$1++; - continue; - } - if (jumpedOrNot) { - thatPlayerInNextFrame.VelY = ((((i$1 < 0 || i$1 >= chConfigsOrderedByJoinIndex.$length) ? ($throwRuntimeError("index out of range"), undefined) : chConfigsOrderedByJoinIndex.$array[chConfigsOrderedByJoinIndex.$offset + i$1]).JumpingInitVelY >> 0)); - ((i$1 < 0 || i$1 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$1] = true); - } - joinIndex = currPlayerDownsync$1.JoinIndex; - if (!((-1 === patternId))) { - _tuple$1 = (_entry = playerOpPatternToSkillId[$Int.keyFor(((((joinIndex >> 0)) << 8 >> 0)) + patternId >> 0)], _entry !== undefined ? [_entry.v, true] : [0, false]); - skillId = _tuple$1[0]; - existent = _tuple$1[1]; - if (existent) { - skillConfig = $assertType((_entry$1 = skillIdToBullet[$Int.keyFor(skillId)], _entry$1 !== undefined ? _entry$1.v : $ifaceNil), ptrType$4); - newMeleeBullet[0] = $clone(skillConfig, MeleeBullet); - newMeleeBullet[0].Bullet.OffenderJoinIndex = joinIndex; - newMeleeBullet[0].Bullet.OffenderPlayerId = currPlayerDownsync$1.Id; - newMeleeBullet[0].Bullet.OriginatedRenderFrameId = currRenderFrame.Id; - nextRenderFrameMeleeBullets = $append(nextRenderFrameMeleeBullets, newMeleeBullet[0]); - thatPlayerInNextFrame.FramesToRecover = newMeleeBullet[0].Bullet.RecoveryFrames; - thatPlayerInNextFrame.CharacterState = 2; - if (false === currPlayerDownsync$1.InAir) { - thatPlayerInNextFrame.VelX = 0; - } - } - _i$1++; - continue; - } - if (!((0 === effDx)) || !((0 === effDy))) { - _tmp = effDx; - _tmp$1 = effDy; - thatPlayerInNextFrame.DirX = _tmp; - thatPlayerInNextFrame.DirY = _tmp$1; - thatPlayerInNextFrame.VelX = $imul(effDx, currPlayerDownsync$1.Speed); - thatPlayerInNextFrame.CharacterState = 1; - } else { - thatPlayerInNextFrame.CharacterState = 0; - thatPlayerInNextFrame.VelX = 0; - } - _i$1++; - } - _ref$2 = currRenderFrame.PlayersArr; - _i$2 = 0; - /* while (true) { */ case 1: - /* if (!(_i$2 < _ref$2.$length)) { break; } */ if(!(_i$2 < _ref$2.$length)) { $s = 2; continue; } - i$2 = _i$2; - currPlayerDownsync$2 = ((_i$2 < 0 || _i$2 >= _ref$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$2.$array[_ref$2.$offset + _i$2]); - joinIndex$1 = currPlayerDownsync$2.JoinIndex; - _tmp$2 = 0; - _tmp$3 = 0; - (x = joinIndex$1 - 1 >> 0, ((x < 0 || x >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x])).X = _tmp$2; - (x$1 = joinIndex$1 - 1 >> 0, ((x$1 < 0 || x$1 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$1])).Y = _tmp$3; - collisionPlayerIndex = 131072 + joinIndex$1 >> 0; - playerCollider = (_entry$2 = collisionSysMap[$Int32.keyFor(collisionPlayerIndex)], _entry$2 !== undefined ? _entry$2.v : ptrType$7.nil); - thatPlayerInNextFrame$1 = ((i$2 < 0 || i$2 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$2]); - _tmp$4 = currPlayerDownsync$2.VirtualGridX + currPlayerDownsync$2.VelX >> 0; - _tmp$5 = currPlayerDownsync$2.VirtualGridY + currPlayerDownsync$2.VelY >> 0; - newVx = _tmp$4; - newVy = _tmp$5; - if (((i$2 < 0 || i$2 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$2])) { - newVy = newVy + (((((i$2 < 0 || i$2 >= chConfigsOrderedByJoinIndex.$length) ? ($throwRuntimeError("index out of range"), undefined) : chConfigsOrderedByJoinIndex.$array[chConfigsOrderedByJoinIndex.$offset + i$2]).JumpingInitVelY >> 0))) >> 0; - } - _tuple$2 = VirtualGridToPolygonColliderBLPos(newVx, newVy, playerCollider.W * 0.5, playerCollider.H * 0.5, 0, 0, 0, 0, collisionSpaceOffsetX, collisionSpaceOffsetY, 0.01); - playerCollider.X = _tuple$2[0]; - playerCollider.Y = _tuple$2[1]; - $r = playerCollider.Update(); /* */ $s = 3; case 3: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - if (currPlayerDownsync$2.InAir) { - thatPlayerInNextFrame$1.VelX = thatPlayerInNextFrame$1.VelX + (0) >> 0; - thatPlayerInNextFrame$1.VelY = thatPlayerInNextFrame$1.VelY + (-50) >> 0; - } - _i$2++; - $s = 1; continue; - case 2: - bulletColliders = $makeSlice(sliceType$10, 0, currRenderFrame.MeleeBullets.$length); - _ref$3 = currRenderFrame.MeleeBullets; - _i$3 = 0; - /* while (true) { */ case 4: - /* if (!(_i$3 < _ref$3.$length)) { break; } */ if(!(_i$3 < _ref$3.$length)) { $s = 5; continue; } - meleeBullet = ((_i$3 < 0 || _i$3 >= _ref$3.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$3.$array[_ref$3.$offset + _i$3]); - /* */ if (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) <= currRenderFrame.Id) && (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) + meleeBullet.Bullet.ActiveFrames >> 0) > currRenderFrame.Id)) { $s = 6; continue; } - /* */ $s = 7; continue; - /* if (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) <= currRenderFrame.Id) && (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) + meleeBullet.Bullet.ActiveFrames >> 0) > currRenderFrame.Id)) { */ case 6: - offender = (x$2 = currRenderFrame.PlayersArr, x$3 = meleeBullet.Bullet.OffenderJoinIndex - 1 >> 0, ((x$3 < 0 || x$3 >= x$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + x$3])); - xfac = 1; - if (0 > offender.DirX) { - xfac = -1; - } - _tuple$3 = VirtualGridToWorldPos(offender.VirtualGridX, offender.VirtualGridY, 0.01); - offenderWx = _tuple$3[0]; - offenderWy = _tuple$3[1]; - _tmp$6 = offenderWx + xfac * meleeBullet.Bullet.HitboxOffset; - _tmp$7 = offenderWy; - bulletWx = _tmp$6; - bulletWy = _tmp$7; - _r = GenerateRectCollider(bulletWx, bulletWy, meleeBullet.Bullet.HitboxSizeX, meleeBullet.Bullet.HitboxSizeY, 0.1, 0.1, 0.1, 0.1, collisionSpaceOffsetX, collisionSpaceOffsetY, meleeBullet, "MeleeBullet"); /* */ $s = 9; case 9: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - newBulletCollider = _r; - $r = collisionSys.Add(new sliceType$10([newBulletCollider])); /* */ $s = 10; case 10: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - bulletColliders = $append(bulletColliders, newBulletCollider); - $s = 8; continue; - /* } else { */ case 7: - nextRenderFrameMeleeBullets = $append(nextRenderFrameMeleeBullets, meleeBullet); - /* } */ case 8: - _i$3++; - $s = 4; continue; - case 5: - _ref$4 = currRenderFrame.PlayersArr; - _i$4 = 0; - /* while (true) { */ case 11: - /* if (!(_i$4 < _ref$4.$length)) { break; } */ if(!(_i$4 < _ref$4.$length)) { $s = 12; continue; } - i$3 = _i$4; - currPlayerDownsync$3 = ((_i$4 < 0 || _i$4 >= _ref$4.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$4.$array[_ref$4.$offset + _i$4]); - joinIndex$2 = currPlayerDownsync$3.JoinIndex; - collisionPlayerIndex$1 = 131072 + joinIndex$2 >> 0; - playerCollider$1 = (_entry$3 = collisionSysMap[$Int32.keyFor(collisionPlayerIndex$1)], _entry$3 !== undefined ? _entry$3.v : ptrType$7.nil); - playerShape = $assertType(playerCollider$1.Shape, ptrType$5); - _r$1 = calcHardPushbacksNorms(joinIndex$2, playerCollider$1, playerShape, 0.1, (x$4 = joinIndex$2 - 1 >> 0, ((x$4 < 0 || x$4 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$4]))); /* */ $s = 13; case 13: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } - (x$5 = joinIndex$2 - 1 >> 0, ((x$5 < 0 || x$5 >= hardPushbackNorms.$length) ? ($throwRuntimeError("index out of range"), undefined) : hardPushbackNorms.$array[hardPushbackNorms.$offset + x$5] = _r$1)); - thatPlayerInNextFrame$2 = ((i$3 < 0 || i$3 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$3]); - landedOnGravityPushback = false; - collision = playerCollider$1.Check(0, 0, new sliceType$4([])); - /* */ if (!(ptrType$1.nil === collision)) { $s = 14; continue; } - /* */ $s = 15; continue; - /* if (!(ptrType$1.nil === collision)) { */ case 14: - _ref$5 = collision.Objects; - _i$5 = 0; - /* while (true) { */ case 16: - /* if (!(_i$5 < _ref$5.$length)) { break; } */ if(!(_i$5 < _ref$5.$length)) { $s = 17; continue; } - obj = ((_i$5 < 0 || _i$5 >= _ref$5.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$5.$array[_ref$5.$offset + _i$5]); - _tmp$8 = false; - _tmp$9 = false; - _tmp$10 = false; - isBarrier = _tmp$8; - isAnotherPlayer = _tmp$9; - isBullet = _tmp$10; - _ref$6 = obj.Data; - if ($assertType(_ref$6, ptrType$3, true)[1]) { - isAnotherPlayer = true; - } else if ($assertType(_ref$6, ptrType$4, true)[1]) { - isBullet = true; - } else { - isBarrier = true; - } - if (isBullet) { - _i$5++; - /* continue; */ $s = 16; continue; - } - bShape = $assertType(obj.Shape, ptrType$5); - _r$2 = CalcPushbacks(0, 0, playerShape, bShape); /* */ $s = 18; case 18: if($c) { $c = false; _r$2 = _r$2.$blk(); } if (_r$2 && _r$2.$blk !== undefined) { break s; } - _tuple$4 = _r$2; - overlapped = _tuple$4[0]; - pushbackX = _tuple$4[1]; - pushbackY = _tuple$4[2]; - overlapResult = _tuple$4[3]; - if (!overlapped) { - _i$5++; - /* continue; */ $s = 16; continue; - } - normAlignmentWithGravity = overlapResult.OverlapX * 0 + overlapResult.OverlapY * -1; - if (isAnotherPlayer) { - _tmp$11 = (overlapResult.Overlap - 0.2) * overlapResult.OverlapX; - _tmp$12 = (overlapResult.Overlap - 0.2) * overlapResult.OverlapY; - pushbackX = _tmp$11; - pushbackY = _tmp$12; - } - _ref$7 = (x$6 = joinIndex$2 - 1 >> 0, ((x$6 < 0 || x$6 >= hardPushbackNorms.$length) ? ($throwRuntimeError("index out of range"), undefined) : hardPushbackNorms.$array[hardPushbackNorms.$offset + x$6])).$get(); - _i$6 = 0; - while (true) { - if (!(_i$6 < _ref$7.$length)) { break; } - hardPushbackNorm = $clone(((_i$6 < 0 || _i$6 >= _ref$7.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$7.$array[_ref$7.$offset + _i$6]), Vec2D); - projectedMagnitude = pushbackX * hardPushbackNorm.X + pushbackY * hardPushbackNorm.Y; - if (isBarrier || (isAnotherPlayer && 0 > projectedMagnitude)) { - pushbackX = pushbackX - (projectedMagnitude * hardPushbackNorm.X); - pushbackY = pushbackY - (projectedMagnitude * hardPushbackNorm.Y); - } - _i$6++; - } - _index = joinIndex$2 - 1 >> 0; - ((_index < 0 || _index >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index]).X = ((_index < 0 || _index >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index]).X + (pushbackX); - _index$1 = joinIndex$2 - 1 >> 0; - ((_index$1 < 0 || _index$1 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index$1]).Y = ((_index$1 < 0 || _index$1 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index$1]).Y + (pushbackY); - if (0.5 < normAlignmentWithGravity) { - landedOnGravityPushback = true; - } - _i$5++; - $s = 16; continue; - case 17: - /* } */ case 15: - if (landedOnGravityPushback) { - thatPlayerInNextFrame$2.InAir = false; - if (currPlayerDownsync$3.InAir && 0 >= currPlayerDownsync$3.VelY) { - thatPlayerInNextFrame$2.VelX = 0; - thatPlayerInNextFrame$2.VelY = 0; - thatPlayerInNextFrame$2.CharacterState = 0; - thatPlayerInNextFrame$2.FramesToRecover = 0; - } - } - if (thatPlayerInNextFrame$2.InAir) { - oldNextCharacterState = thatPlayerInNextFrame$2.CharacterState; - _1 = oldNextCharacterState; - if ((_1 === (0)) || (_1 === (1))) { - if (((i$3 < 0 || i$3 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$3]) || (5 === currPlayerDownsync$3.CharacterState)) { - thatPlayerInNextFrame$2.CharacterState = 5; - } else { - thatPlayerInNextFrame$2.CharacterState = 4; - } - } else if (_1 === (2)) { - thatPlayerInNextFrame$2.CharacterState = 6; - } else if (_1 === (3)) { - thatPlayerInNextFrame$2.CharacterState = 7; - } - } - _i$4++; - $s = 11; continue; - case 12: - _ref$8 = bulletColliders; - _i$7 = 0; - /* while (true) { */ case 19: - /* if (!(_i$7 < _ref$8.$length)) { break; } */ if(!(_i$7 < _ref$8.$length)) { $s = 20; continue; } - bulletCollider = ((_i$7 < 0 || _i$7 >= _ref$8.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$8.$array[_ref$8.$offset + _i$7]); - meleeBullet$1 = $assertType(bulletCollider.Data, ptrType$4); - bulletShape = $assertType(bulletCollider.Shape, ptrType$5); - collision$1 = bulletCollider.Check(0, 0, new sliceType$4([])); - bulletCollider.Space.Remove(new sliceType$10([bulletCollider])); - if (ptrType$1.nil === collision$1) { - nextRenderFrameMeleeBullets = $append(nextRenderFrameMeleeBullets, meleeBullet$1); - _i$7++; - /* continue; */ $s = 19; continue; - } - offender$1 = (x$7 = currRenderFrame.PlayersArr, x$8 = meleeBullet$1.Bullet.OffenderJoinIndex - 1 >> 0, ((x$8 < 0 || x$8 >= x$7.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$7.$array[x$7.$offset + x$8])); - _ref$9 = collision$1.Objects; - _i$8 = 0; - /* while (true) { */ case 21: - /* if (!(_i$8 < _ref$9.$length)) { break; } */ if(!(_i$8 < _ref$9.$length)) { $s = 22; continue; } - obj$1 = ((_i$8 < 0 || _i$8 >= _ref$9.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$9.$array[_ref$9.$offset + _i$8]); - defenderShape = $assertType(obj$1.Shape, ptrType$5); - _ref$10 = obj$1.Data; - /* */ if ($assertType(_ref$10, ptrType$3, true)[1]) { $s = 23; continue; } - /* */ $s = 24; continue; - /* if ($assertType(_ref$10, ptrType$3, true)[1]) { */ case 23: - t = _ref$10.$val; - if (meleeBullet$1.Bullet.OffenderPlayerId === t.Id) { - _i$8++; - /* continue; */ $s = 21; continue; - } - _r$3 = CalcPushbacks(0, 0, bulletShape, defenderShape); /* */ $s = 26; case 26: if($c) { $c = false; _r$3 = _r$3.$blk(); } if (_r$3 && _r$3.$blk !== undefined) { break s; } - _tuple$5 = _r$3; - overlapped$1 = _tuple$5[0]; - if (!overlapped$1) { - _i$8++; - /* continue; */ $s = 21; continue; - } - joinIndex$3 = t.JoinIndex; - xfac$1 = 1; - if (0 > offender$1.DirX) { - xfac$1 = -1; - } - _tmp$13 = -xfac$1 * meleeBullet$1.Bullet.Pushback; - _tmp$14 = 0; - pushbackX$1 = _tmp$13; - pushbackY$1 = _tmp$14; - _ref$11 = (x$9 = joinIndex$3 - 1 >> 0, ((x$9 < 0 || x$9 >= hardPushbackNorms.$length) ? ($throwRuntimeError("index out of range"), undefined) : hardPushbackNorms.$array[hardPushbackNorms.$offset + x$9])).$get(); - _i$9 = 0; - while (true) { - if (!(_i$9 < _ref$11.$length)) { break; } - hardPushbackNorm$1 = $clone(((_i$9 < 0 || _i$9 >= _ref$11.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$11.$array[_ref$11.$offset + _i$9]), Vec2D); - projectedMagnitude$1 = pushbackX$1 * hardPushbackNorm$1.X + pushbackY$1 * hardPushbackNorm$1.Y; - if (0 > projectedMagnitude$1) { - pushbackX$1 = pushbackX$1 - (projectedMagnitude$1 * hardPushbackNorm$1.X); - pushbackY$1 = pushbackY$1 - (projectedMagnitude$1 * hardPushbackNorm$1.Y); - } - _i$9++; - } - _index$2 = joinIndex$3 - 1 >> 0; - ((_index$2 < 0 || _index$2 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index$2]).X = ((_index$2 < 0 || _index$2 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index$2]).X + (pushbackX$1); - _index$3 = joinIndex$3 - 1 >> 0; - ((_index$3 < 0 || _index$3 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index$3]).Y = ((_index$3 < 0 || _index$3 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index$3]).Y + (pushbackY$1); - _tmp$15 = (x$10 = currRenderFrame.PlayersArr, x$11 = t.JoinIndex - 1 >> 0, ((x$11 < 0 || x$11 >= x$10.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$10.$array[x$10.$offset + x$11])); - _tmp$16 = (x$12 = t.JoinIndex - 1 >> 0, ((x$12 < 0 || x$12 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + x$12])); - atkedPlayerInCurFrame = _tmp$15; - atkedPlayerInNextFrame = _tmp$16; - atkedPlayerInNextFrame.CharacterState = 3; - if (atkedPlayerInCurFrame.InAir) { - atkedPlayerInNextFrame.CharacterState = 7; - } - oldFramesToRecover = (x$13 = t.JoinIndex - 1 >> 0, ((x$13 < 0 || x$13 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + x$13])).FramesToRecover; - if (meleeBullet$1.Bullet.HitStunFrames > oldFramesToRecover) { - atkedPlayerInNextFrame.FramesToRecover = meleeBullet$1.Bullet.HitStunFrames; - } - $s = 25; continue; - /* } else { */ case 24: - t$1 = _ref$10; - /* } */ case 25: - _i$8++; - $s = 21; continue; - case 22: - _i$7++; - $s = 19; continue; - case 20: - _ref$12 = currRenderFrame.PlayersArr; - _i$10 = 0; - while (true) { - if (!(_i$10 < _ref$12.$length)) { break; } - i$4 = _i$10; - currPlayerDownsync$4 = ((_i$10 < 0 || _i$10 >= _ref$12.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$12.$array[_ref$12.$offset + _i$10]); - joinIndex$4 = currPlayerDownsync$4.JoinIndex; - collisionPlayerIndex$2 = 131072 + joinIndex$4 >> 0; - playerCollider$2 = (_entry$4 = collisionSysMap[$Int32.keyFor(collisionPlayerIndex$2)], _entry$4 !== undefined ? _entry$4.v : ptrType$7.nil); - thatPlayerInNextFrame$3 = ((i$4 < 0 || i$4 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$4]); - _tuple$6 = PolygonColliderBLToVirtualGridPos(playerCollider$2.X - (x$14 = joinIndex$4 - 1 >> 0, ((x$14 < 0 || x$14 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$14])).X, playerCollider$2.Y - (x$15 = joinIndex$4 - 1 >> 0, ((x$15 < 0 || x$15 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$15])).Y, playerCollider$2.W * 0.5, playerCollider$2.H * 0.5, 0, 0, 0, 0, collisionSpaceOffsetX, collisionSpaceOffsetY, 100); - thatPlayerInNextFrame$3.VirtualGridX = _tuple$6[0]; - thatPlayerInNextFrame$3.VirtualGridY = _tuple$6[1]; - if (!((thatPlayerInNextFrame$3.CharacterState === currPlayerDownsync$4.CharacterState))) { - thatPlayerInNextFrame$3.FramesInChState = 0; - } - _i$10++; - } - $s = -1; return new RoomDownsyncFrame.ptr(currRenderFrame.Id + 1 >> 0, nextRenderFramePlayers, new $Int64(0, 0), nextRenderFrameMeleeBullets, sliceType$11.nil, new $Uint64(0, 0), false, false); - /* */ } return; } var $f = {$blk: ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame, $c: true, $r, _1, _entry, _entry$1, _entry$2, _entry$3, _entry$4, _i, _i$1, _i$10, _i$2, _i$3, _i$4, _i$5, _i$6, _i$7, _i$8, _i$9, _index, _index$1, _index$2, _index$3, _r, _r$1, _r$2, _r$3, _ref, _ref$1, _ref$10, _ref$11, _ref$12, _ref$2, _ref$3, _ref$4, _ref$5, _ref$6, _ref$7, _ref$8, _ref$9, _tmp, _tmp$1, _tmp$10, _tmp$11, _tmp$12, _tmp$13, _tmp$14, _tmp$15, _tmp$16, _tmp$2, _tmp$3, _tmp$4, _tmp$5, _tmp$6, _tmp$7, _tmp$8, _tmp$9, _tuple, _tuple$1, _tuple$2, _tuple$3, _tuple$4, _tuple$5, _tuple$6, atkedPlayerInCurFrame, atkedPlayerInNextFrame, bShape, bulletCollider, bulletColliders, bulletShape, bulletWx, bulletWy, chConfigsOrderedByJoinIndex, collision, collision$1, collisionPlayerIndex, collisionPlayerIndex$1, collisionPlayerIndex$2, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currPlayerDownsync, currPlayerDownsync$1, currPlayerDownsync$2, currPlayerDownsync$3, currPlayerDownsync$4, currRenderFrame, defenderShape, effDx, effDy, effPushbacks, existent, hardPushbackNorm, hardPushbackNorm$1, hardPushbackNorms, i, i$1, i$2, i$3, i$4, inputsBuffer, isAnotherPlayer, isBarrier, isBullet, joinIndex, joinIndex$1, joinIndex$2, joinIndex$3, joinIndex$4, jumpedOrNot, jumpedOrNotList, landedOnGravityPushback, meleeBullet, meleeBullet$1, newBulletCollider, newMeleeBullet, newVx, newVy, nextRenderFrameMeleeBullets, nextRenderFramePlayers, normAlignmentWithGravity, obj, obj$1, offender, offender$1, offenderWx, offenderWy, oldFramesToRecover, oldNextCharacterState, overlapResult, overlapped, overlapped$1, patternId, playerCollider, playerCollider$1, playerCollider$2, playerOpPatternToSkillId, playerShape, projectedMagnitude, projectedMagnitude$1, pushbackX, pushbackX$1, pushbackY, pushbackY$1, roomCapacity, skillConfig, skillId, t, t$1, thatPlayerInNextFrame, thatPlayerInNextFrame$1, thatPlayerInNextFrame$2, thatPlayerInNextFrame$3, x, x$1, x$10, x$11, x$12, x$13, x$14, x$15, x$2, x$3, x$4, x$5, x$6, x$7, x$8, x$9, xfac, xfac$1, $s};return $f; - }; - $pkg.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame = ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame; - GenerateRectCollider = function(wx, wy, w, h, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, data, tag) { - var {$24r, _r, _tuple, blX, blY, bottomPadding, data, h, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, tag, topPadding, w, wx, wy, $s, $r, $c} = $restore(this, {wx, wy, w, h, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, data, tag}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - _tuple = WorldToPolygonColliderBLPos(wx, wy, w * 0.5, h * 0.5, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY); - blX = _tuple[0]; - blY = _tuple[1]; - _r = generateRectColliderInCollisionSpace(blX, blY, leftPadding + w + rightPadding, bottomPadding + h + topPadding, data, tag); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - $24r = _r; - $s = 2; case 2: return $24r; - /* */ } return; } var $f = {$blk: GenerateRectCollider, $c: true, $r, $24r, _r, _tuple, blX, blY, bottomPadding, data, h, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, tag, topPadding, w, wx, wy, $s};return $f; - }; - $pkg.GenerateRectCollider = GenerateRectCollider; - generateRectColliderInCollisionSpace = function(blX, blY, w, h, data, tag) { - var {blX, blY, collider, data, h, shape, tag, w, $s, $r, $c} = $restore(this, {blX, blY, w, h, data, tag}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - collider = resolv.NewObject(blX, blY, w, h, new sliceType$4([tag])); - shape = resolv.NewRectangle(0, 0, w, h); - $r = collider.SetShape(shape); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - collider.Data = data; - $s = -1; return collider; - /* */ } return; } var $f = {$blk: generateRectColliderInCollisionSpace, $c: true, $r, blX, blY, collider, data, h, shape, tag, w, $s};return $f; - }; - GenerateConvexPolygonCollider = function(unalignedSrc, spaceOffsetX, spaceOffsetY, data, tag) { - var {_i, _i$1, _ref, _ref$1, _tmp, _tmp$1, aligned, collider, data, h, i, i$1, j, p, pi, pj, shape, spaceOffsetX, spaceOffsetY, tag, unalignedSrc, w, x, $s, $r, $c} = $restore(this, {unalignedSrc, spaceOffsetX, spaceOffsetY, data, tag}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - aligned = AlignPolygon2DToBoundingBox(unalignedSrc); - _tmp = 0; - _tmp$1 = 0; - w = _tmp; - h = _tmp$1; - shape = resolv.NewConvexPolygon(sliceType$12.nil); - _ref = aligned.Points; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - i = _i; - pi = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - _ref$1 = aligned.Points; - _i$1 = 0; - while (true) { - if (!(_i$1 < _ref$1.$length)) { break; } - j = _i$1; - pj = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); - if (i === j) { - _i$1++; - continue; - } - if (math.Abs(pj.X - pi.X) > w) { - w = math.Abs(pj.X - pi.X); - } - if (math.Abs(pj.Y - pi.Y) > h) { - h = math.Abs(pj.Y - pi.Y); - } - _i$1++; - } - _i++; - } - i$1 = 0; - while (true) { - if (!(i$1 < aligned.Points.$length)) { break; } - p = (x = aligned.Points, ((i$1 < 0 || i$1 >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + i$1])); - shape.AddPoints(new sliceType$12([p.X, p.Y])); - i$1 = i$1 + (1) >> 0; - } - collider = resolv.NewObject(aligned.Anchor.X + spaceOffsetX, aligned.Anchor.Y + spaceOffsetY, w, h, new sliceType$4([tag])); - $r = collider.SetShape(shape); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - collider.Data = data; - $s = -1; return collider; - /* */ } return; } var $f = {$blk: GenerateConvexPolygonCollider, $c: true, $r, _i, _i$1, _ref, _ref$1, _tmp, _tmp$1, aligned, collider, data, h, i, i$1, j, p, pi, pj, shape, spaceOffsetX, spaceOffsetY, tag, unalignedSrc, w, x, $s};return $f; - }; - $pkg.GenerateConvexPolygonCollider = GenerateConvexPolygonCollider; - AlignPolygon2DToBoundingBox = function(input) { - var _i, _i$1, _ref, _ref$1, boundingBoxBL, i, input, output, p, p$1, x; - boundingBoxBL = new Vec2D.ptr(1.7e+308, 1.7e+308); - _ref = input.Points; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - p = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (p.X < boundingBoxBL.X) { - boundingBoxBL.X = p.X; - } - if (p.Y < boundingBoxBL.Y) { - boundingBoxBL.Y = p.Y; - } - _i++; - } - output = new Polygon2D.ptr(new Vec2D.ptr(input.Anchor.X + boundingBoxBL.X, input.Anchor.Y + boundingBoxBL.Y), $makeSlice(sliceType$13, input.Points.$length)); - _ref$1 = input.Points; - _i$1 = 0; - while (true) { - if (!(_i$1 < _ref$1.$length)) { break; } - i = _i$1; - p$1 = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); - (x = output.Points, ((i < 0 || i >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + i] = new Vec2D.ptr(p$1.X - boundingBoxBL.X, p$1.Y - boundingBoxBL.Y))); - _i$1++; - } - return output; - }; - $pkg.AlignPolygon2DToBoundingBox = AlignPolygon2DToBoundingBox; - ptrType$11.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)}]; - Vec2D.init("", [{prop: "X", name: "X", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "Y", name: "Y", embedded: false, exported: true, typ: $Float64, tag: ""}]); - Polygon2D.init("", [{prop: "Anchor", name: "Anchor", embedded: false, exported: true, typ: ptrType$9, tag: ""}, {prop: "Points", name: "Points", embedded: false, exported: true, typ: sliceType$13, tag: ""}]); - PlayerDownsync.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: "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: ""}]); - InputFrameDecoded.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: ""}]); - Barrier.init("", [{prop: "Boundary", name: "Boundary", embedded: false, exported: true, typ: ptrType$10, tag: ""}]); - Bullet.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: ""}, {prop: "BlowUpVelY", name: "BlowUpVelY", embedded: false, exported: true, typ: $Int32, tag: ""}]); - MeleeBullet.init("", [{prop: "Bullet", name: "Bullet", embedded: true, exported: true, typ: Bullet, tag: ""}]); - FireballBullet.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: Bullet, tag: ""}]); - RoomDownsyncFrame.init("", [{prop: "Id", name: "Id", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "PlayersArr", name: "PlayersArr", embedded: false, exported: true, typ: sliceType$6, tag: ""}, {prop: "CountdownNanos", name: "CountdownNanos", embedded: false, exported: true, typ: $Int64, tag: ""}, {prop: "MeleeBullets", name: "MeleeBullets", embedded: false, exported: true, typ: sliceType$7, tag: ""}, {prop: "FireballBullets", name: "FireballBullets", embedded: false, exported: true, typ: sliceType$11, 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: mapType, tag: ""}]); - InputFrameDownsync.init("", [{prop: "InputFrameId", name: "InputFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "InputList", name: "InputList", embedded: false, exported: true, typ: sliceType$5, tag: ""}, {prop: "ConfirmedList", name: "ConfirmedList", embedded: false, exported: true, typ: $Uint64, tag: ""}]); - CharacterConfig.init("", [{prop: "SpeciesId", name: "SpeciesId", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "SpeciesName", name: "SpeciesName", embedded: false, exported: true, typ: $String, tag: ""}, {prop: "InAirIdleFrameIdxTurningPoint", name: "InAirIdleFrameIdxTurningPoint", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "InAirIdleFrameIdxTurnedCycle", name: "InAirIdleFrameIdxTurnedCycle", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "LayDownFrames", name: "LayDownFrames", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "LayDownFramesToRecover", name: "LayDownFramesToRecover", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "GetUpFrames", name: "GetUpFrames", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "GetUpFramesToRecover", name: "GetUpFramesToRecover", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "JumpingInitVelY", name: "JumpingInitVelY", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "PatternIdToSkillId", name: "PatternIdToSkillId", embedded: false, exported: true, typ: mapType, tag: ""}]); - RingBuffer.init("", [{prop: "Ed", name: "Ed", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "St", name: "St", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "EdFrameId", name: "EdFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "StFrameId", name: "StFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "N", name: "N", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Cnt", name: "Cnt", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Eles", name: "Eles", embedded: false, exported: true, typ: sliceType$2, tag: ""}]); - SatResult.init("", [{prop: "Overlap", name: "Overlap", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "OverlapX", name: "OverlapX", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "OverlapY", name: "OverlapY", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "AContainedInB", name: "AContainedInB", embedded: false, exported: true, typ: $Bool, tag: ""}, {prop: "BContainedInA", name: "BContainedInA", embedded: false, exported: true, typ: $Bool, tag: ""}, {prop: "Axis", name: "Axis", embedded: false, exported: true, typ: resolv.Vector, tag: ""}]); - $init = function() { - $pkg.$init = function() {}; - /* */ 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 = math.$init(); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - $r = resolv.$init(); /* */ $s = 2; case 2: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - $pkg.Characters = $makeMap($Int.keyFor, [{ k: 0, v: new CharacterConfig.ptr(0, "MonkGirl", 11, 1, 16, 16, 33, 30, 800, $makeMap($Int.keyFor, [{ k: 0, v: 1 }, { k: 1, v: 2 }])) }]); - skillIdToBullet = $makeMap($Int.keyFor, [{ k: 1, v: new MeleeBullet.ptr(new Bullet.ptr(0, 5, 10, 34, 34, 34, 12, 0, 18, 9, 8, 1, 5, 0, 0, 0, 0, 24, 32, 0)) }, { k: 2, v: new MeleeBullet.ptr(new Bullet.ptr(0, 3, 20, 34, 34, 34, 16, 0, 18, 9, 6, 1, 5, 0, 0, 0, 0, 32, 24, 300)) }]); - $pkg.DIRECTION_DECODER = new sliceType$1([new sliceType([0, 0]), new sliceType([0, 2]), new sliceType([0, -2]), new sliceType([2, 0]), new sliceType([-2, 0]), new sliceType([1, 1]), new sliceType([-1, -1]), new sliceType([1, -1]), new sliceType([-1, 1])]); - inAirSet = $makeMap($Int32.keyFor, [{ k: 4, v: true }, { k: 5, v: true }, { k: 6, v: true }, { k: 7, v: true }, { k: 8, v: true }]); - /* */ } 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, js, battle, resolv, sliceType, ptrType, sliceType$1, ptrType$1, ptrType$2, sliceType$2, ptrType$3, sliceType$3, ptrType$4, sliceType$4, ptrType$5, sliceType$5, ptrType$6, funcType, funcType$1, funcType$2, funcType$3, funcType$4, funcType$5, funcType$6, funcType$7, funcType$8, funcType$9, funcType$10, ptrType$7, funcType$11, sliceType$6, funcType$12, ptrType$8, ptrType$9, ptrType$10, mapType, mapType$1, sliceType$7, funcType$13, funcType$14, mapType$2, NewInputFrameDownsync, NewRingBufferJs, NewCollisionSpaceJs, NewVec2DJs, NewPolygon2DJs, NewBarrierJs, NewPlayerDownsyncJs, NewMeleeBulletJs, NewRoomDownsyncFrameJs, GetCollisionSpaceObjsJs, GenerateRectColliderJs, GenerateConvexPolygonColliderJs, GetCharacterConfigsOrderedByJoinIndex, ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs, main; - js = $packages["github.com/gopherjs/gopherjs/js"]; - battle = $packages["jsexport/battle"]; - resolv = $packages["resolv"]; - sliceType = $sliceType($Uint64); - ptrType = $ptrType(battle.Vec2D); - sliceType$1 = $sliceType(ptrType); - ptrType$1 = $ptrType(battle.Polygon2D); - ptrType$2 = $ptrType(battle.PlayerDownsync); - sliceType$2 = $sliceType(ptrType$2); - ptrType$3 = $ptrType(battle.MeleeBullet); - sliceType$3 = $sliceType(ptrType$3); - ptrType$4 = $ptrType(battle.FireballBullet); - sliceType$4 = $sliceType(ptrType$4); - ptrType$5 = $ptrType(js.Object); - sliceType$5 = $sliceType(ptrType$5); - ptrType$6 = $ptrType(battle.CharacterConfig); - funcType = $funcType([$Float64, $Float64], [ptrType$5], false); - funcType$1 = $funcType([ptrType, sliceType$1], [ptrType$5], false); - funcType$2 = $funcType([ptrType$1], [ptrType$5], false); - funcType$3 = $funcType([$Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Bool, $Float64], [ptrType$5], false); - funcType$4 = $funcType([$Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64], [ptrType$5], false); - funcType$5 = $funcType([$Int32, sliceType$2, sliceType$3], [ptrType$5], false); - funcType$6 = $funcType([$Int, $Int, $Int, $Int], [ptrType$5], false); - funcType$7 = $funcType([$Int32, sliceType, $Uint64], [ptrType$5], false); - funcType$8 = $funcType([$Int32], [ptrType$5], false); - funcType$9 = $funcType([$Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $emptyInterface, $String], [ptrType$5], false); - funcType$10 = $funcType([ptrType$1, $Float64, $Float64, $emptyInterface, $String], [ptrType$5], false); - ptrType$7 = $ptrType(resolv.Space); - funcType$11 = $funcType([ptrType$7], [sliceType$5], false); - sliceType$6 = $sliceType($Int); - funcType$12 = $funcType([sliceType$6], [sliceType$5], false); - ptrType$8 = $ptrType(battle.RingBuffer); - ptrType$9 = $ptrType(battle.RoomDownsyncFrame); - ptrType$10 = $ptrType(resolv.Object); - mapType = $mapType($Int32, ptrType$10); - mapType$1 = $mapType($Int, $Int); - sliceType$7 = $sliceType(ptrType$6); - funcType$13 = $funcType([ptrType$8, ptrType$9, ptrType$7, mapType, $Float64, $Float64, mapType$1, sliceType$7], [ptrType$5], false); - funcType$14 = $funcType([$Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64], [$Float64, $Float64], false); - mapType$2 = $mapType($String, $emptyInterface); - NewInputFrameDownsync = function(inputFrameId, inputList, confirmedList) { - var {$24r, _r, confirmedList, inputFrameId, inputList, $s, $r, $c} = $restore(this, {inputFrameId, inputList, confirmedList}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - _r = js.MakeFullWrapper(new battle.InputFrameDownsync.ptr(inputFrameId, inputList, confirmedList)); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - $24r = _r; - $s = 2; case 2: return $24r; - /* */ } return; } var $f = {$blk: NewInputFrameDownsync, $c: true, $r, $24r, _r, confirmedList, inputFrameId, inputList, $s};return $f; - }; - $pkg.NewInputFrameDownsync = NewInputFrameDownsync; - NewRingBufferJs = function(n) { - var {$24r, _r, n, $s, $r, $c} = $restore(this, {n}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - _r = js.MakeFullWrapper(battle.NewRingBuffer(n)); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - $24r = _r; - $s = 2; case 2: return $24r; - /* */ } return; } var $f = {$blk: NewRingBufferJs, $c: true, $r, $24r, _r, n, $s};return $f; - }; - $pkg.NewRingBufferJs = NewRingBufferJs; - NewCollisionSpaceJs = function(spaceW, spaceH, minStepW, minStepH) { - var minStepH, minStepW, spaceH, spaceW; - return js.MakeWrapper(resolv.NewSpace(spaceW, spaceH, minStepW, minStepH)); - }; - $pkg.NewCollisionSpaceJs = NewCollisionSpaceJs; - NewVec2DJs = function(x, y) { - var {$24r, _r, x, y, $s, $r, $c} = $restore(this, {x, y}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - _r = js.MakeFullWrapper(new battle.Vec2D.ptr(x, y)); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - $24r = _r; - $s = 2; case 2: return $24r; - /* */ } return; } var $f = {$blk: NewVec2DJs, $c: true, $r, $24r, _r, x, y, $s};return $f; - }; - $pkg.NewVec2DJs = NewVec2DJs; - NewPolygon2DJs = function(anchor, points) { - var {$24r, _r, anchor, points, $s, $r, $c} = $restore(this, {anchor, points}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - _r = js.MakeFullWrapper(new battle.Polygon2D.ptr(anchor, points)); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - $24r = _r; - $s = 2; case 2: return $24r; - /* */ } return; } var $f = {$blk: NewPolygon2DJs, $c: true, $r, $24r, _r, anchor, points, $s};return $f; - }; - $pkg.NewPolygon2DJs = NewPolygon2DJs; - NewBarrierJs = function(boundary) { - var boundary; - return js.MakeWrapper(new battle.Barrier.ptr(boundary)); - }; - $pkg.NewBarrierJs = NewBarrierJs; - NewPlayerDownsyncJs = function(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, framesToRecover, framesInChState, speed, battleState, characterState, joinIndex, hp, maxHp, inAir, colliderRadius) { - var battleState, characterState, colliderRadius, dirX, dirY, framesInChState, framesToRecover, hp, id, inAir, joinIndex, maxHp, speed, velX, velY, virtualGridX, virtualGridY; - return js.MakeWrapper(new battle.PlayerDownsync.ptr(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, speed, battleState, joinIndex, colliderRadius, false, 0, 0, framesToRecover, framesInChState, hp, maxHp, characterState, inAir)); - }; - $pkg.NewPlayerDownsyncJs = NewPlayerDownsyncJs; - NewMeleeBulletJs = function(battleLocalId, startupFrames, activeFrames, recoveryFrames, recoveryFramesOnBlock, recoveryFramesOnHit, hitStunFrames, blockStunFrames, releaseTriggerType, damage, offenderJoinIndex, offenderPlayerId, pushback, hitboxOffset, selfMoveforwardX, selfMoveforwardY, hitboxSizeX, hitboxSizeY) { - var activeFrames, battleLocalId, blockStunFrames, damage, hitStunFrames, hitboxOffset, hitboxSizeX, hitboxSizeY, offenderJoinIndex, offenderPlayerId, pushback, recoveryFrames, recoveryFramesOnBlock, recoveryFramesOnHit, releaseTriggerType, selfMoveforwardX, selfMoveforwardY, startupFrames; - return js.MakeWrapper(new battle.MeleeBullet.ptr(new battle.Bullet.ptr(battleLocalId, startupFrames, activeFrames, recoveryFrames, recoveryFramesOnBlock, recoveryFramesOnHit, hitboxOffset, 0, hitStunFrames, blockStunFrames, pushback, releaseTriggerType, damage, offenderJoinIndex, offenderPlayerId, selfMoveforwardX, selfMoveforwardY, hitboxSizeX, hitboxSizeY, 0))); - }; - $pkg.NewMeleeBulletJs = NewMeleeBulletJs; - NewRoomDownsyncFrameJs = function(id, playersArr, meleeBullets) { - var {$24r, _r, id, meleeBullets, playersArr, $s, $r, $c} = $restore(this, {id, playersArr, meleeBullets}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - _r = js.MakeFullWrapper(new battle.RoomDownsyncFrame.ptr(id, playersArr, new $Int64(0, 0), meleeBullets, sliceType$4.nil, new $Uint64(0, 0), false, false)); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - $24r = _r; - $s = 2; case 2: return $24r; - /* */ } return; } var $f = {$blk: NewRoomDownsyncFrameJs, $c: true, $r, $24r, _r, id, meleeBullets, playersArr, $s};return $f; - }; - $pkg.NewRoomDownsyncFrameJs = NewRoomDownsyncFrameJs; - GetCollisionSpaceObjsJs = function(space) { - var {_i, _r, _ref, obj, objs, ret, space, $s, $r, $c} = $restore(this, {space}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - objs = space.Objects(); - ret = $makeSlice(sliceType$5, 0, objs.$length); - _ref = objs; - _i = 0; - /* while (true) { */ case 1: - /* if (!(_i < _ref.$length)) { break; } */ if(!(_i < _ref.$length)) { $s = 2; continue; } - obj = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - _r = js.MakeFullWrapper(obj); /* */ $s = 3; case 3: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - ret = $append(ret, _r); - _i++; - $s = 1; continue; - case 2: - $s = -1; return ret; - /* */ } return; } var $f = {$blk: GetCollisionSpaceObjsJs, $c: true, $r, _i, _r, _ref, obj, objs, ret, space, $s};return $f; - }; - $pkg.GetCollisionSpaceObjsJs = GetCollisionSpaceObjsJs; - GenerateRectColliderJs = function(wx, wy, w, h, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, data, tag) { - var {$24r, _r, _r$1, bottomPadding, data, h, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, tag, topPadding, w, wx, wy, $s, $r, $c} = $restore(this, {wx, wy, w, h, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, data, tag}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - _r = battle.GenerateRectCollider(wx, wy, w, h, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, data, tag); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - _r$1 = js.MakeFullWrapper(_r); /* */ $s = 2; case 2: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } - $24r = _r$1; - $s = 3; case 3: return $24r; - /* */ } return; } var $f = {$blk: GenerateRectColliderJs, $c: true, $r, $24r, _r, _r$1, bottomPadding, data, h, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, tag, topPadding, w, wx, wy, $s};return $f; - }; - $pkg.GenerateRectColliderJs = GenerateRectColliderJs; - GenerateConvexPolygonColliderJs = function(unalignedSrc, spaceOffsetX, spaceOffsetY, data, tag) { - var {$24r, _r, _r$1, data, spaceOffsetX, spaceOffsetY, tag, unalignedSrc, $s, $r, $c} = $restore(this, {unalignedSrc, spaceOffsetX, spaceOffsetY, data, tag}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - _r = battle.GenerateConvexPolygonCollider(unalignedSrc, spaceOffsetX, spaceOffsetY, data, tag); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - _r$1 = js.MakeFullWrapper(_r); /* */ $s = 2; case 2: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } - $24r = _r$1; - $s = 3; case 3: return $24r; - /* */ } return; } var $f = {$blk: GenerateConvexPolygonColliderJs, $c: true, $r, $24r, _r, _r$1, data, spaceOffsetX, spaceOffsetY, tag, unalignedSrc, $s};return $f; - }; - $pkg.GenerateConvexPolygonColliderJs = GenerateConvexPolygonColliderJs; - GetCharacterConfigsOrderedByJoinIndex = function(speciesIdList) { - var {_entry, _i, _r, _ref, i, ret, speciesId, speciesIdList, $s, $r, $c} = $restore(this, {speciesIdList}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - ret = $makeSlice(sliceType$5, speciesIdList.$length, speciesIdList.$length); - _ref = speciesIdList; - _i = 0; - /* while (true) { */ case 1: - /* if (!(_i < _ref.$length)) { break; } */ if(!(_i < _ref.$length)) { $s = 2; continue; } - i = _i; - speciesId = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - _r = js.MakeFullWrapper((_entry = battle.Characters[$Int.keyFor(speciesId)], _entry !== undefined ? _entry.v : ptrType$6.nil)); /* */ $s = 3; case 3: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - ((i < 0 || i >= ret.$length) ? ($throwRuntimeError("index out of range"), undefined) : ret.$array[ret.$offset + i] = _r); - _i++; - $s = 1; continue; - case 2: - $s = -1; return ret; - /* */ } return; } var $f = {$blk: GetCharacterConfigsOrderedByJoinIndex, $c: true, $r, _entry, _i, _r, _ref, i, ret, speciesId, speciesIdList, $s};return $f; - }; - $pkg.GetCharacterConfigsOrderedByJoinIndex = GetCharacterConfigsOrderedByJoinIndex; - ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs = function(inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, playerOpPatternToSkillId, chConfigsOrderedByJoinIndex) { - var {$24r, _r, _r$1, chConfigsOrderedByJoinIndex, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currRenderFrame, inputsBuffer, playerOpPatternToSkillId, $s, $r, $c} = $restore(this, {inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, playerOpPatternToSkillId, chConfigsOrderedByJoinIndex}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - _r = battle.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, playerOpPatternToSkillId, chConfigsOrderedByJoinIndex); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - _r$1 = js.MakeFullWrapper(_r); /* */ $s = 2; case 2: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } - $24r = _r$1; - $s = 3; case 3: return $24r; - /* */ } return; } var $f = {$blk: ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs, $c: true, $r, $24r, _r, _r$1, chConfigsOrderedByJoinIndex, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currRenderFrame, inputsBuffer, playerOpPatternToSkillId, $s};return $f; - }; - $pkg.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs = ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs; - main = function() { - $global.gopkgs = $externalize($makeMap($String.keyFor, [{ k: "NewVec2DJs", v: new funcType(NewVec2DJs) }, { k: "NewPolygon2DJs", v: new funcType$1(NewPolygon2DJs) }, { k: "NewBarrierJs", v: new funcType$2(NewBarrierJs) }, { k: "NewPlayerDownsyncJs", v: new funcType$3(NewPlayerDownsyncJs) }, { k: "NewMeleeBulletJs", v: new funcType$4(NewMeleeBulletJs) }, { k: "NewRoomDownsyncFrameJs", v: new funcType$5(NewRoomDownsyncFrameJs) }, { k: "NewCollisionSpaceJs", v: new funcType$6(NewCollisionSpaceJs) }, { k: "NewInputFrameDownsync", v: new funcType$7(NewInputFrameDownsync) }, { k: "NewRingBufferJs", v: new funcType$8(NewRingBufferJs) }, { k: "GenerateRectColliderJs", v: new funcType$9(GenerateRectColliderJs) }, { k: "GenerateConvexPolygonColliderJs", v: new funcType$10(GenerateConvexPolygonColliderJs) }, { k: "GetCollisionSpaceObjsJs", v: new funcType$11(GetCollisionSpaceObjsJs) }, { k: "GetCharacterConfigsOrderedByJoinIndex", v: new funcType$12(GetCharacterConfigsOrderedByJoinIndex) }, { k: "ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs", v: new funcType$13(ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs) }, { k: "WorldToPolygonColliderBLPos", v: new funcType$14(battle.WorldToPolygonColliderBLPos) }, { k: "PolygonColliderBLToWorldPos", v: new funcType$14(battle.PolygonColliderBLToWorldPos) }]), mapType$2); - }; - $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 = js.$init(); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - $r = battle.$init(); /* */ $s = 2; case 2: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - $r = resolv.$init(); /* */ $s = 3; case 3: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - if ($pkg === $mainPkg) { - main(); - $mainFinished = true; - } - /* */ } return; } if ($f === undefined) { $f = { $blk: $init }; } $f.$s = $s; $f.$r = $r; return $f; - }; - $pkg.$init = $init; - return $pkg; -})(); +Error.stackTraceLimit=1/0;var $global,$module,$NaN=NaN;if("undefined"!=typeof window?$global=window:"undefined"!=typeof self?$global=self:"undefined"!=typeof global?($global=global).require=require:$global=this,void 0===$global||void 0===$global.Array)throw new Error("no global object found");if("undefined"!=typeof module&&($module=module),!$global.fs&&$global.require)try{var fs=$global.require("fs");"object"==typeof fs&&null!==fs&&0!==Object.keys(fs).length&&($global.fs=fs)}catch(e){}if(!$global.fs){var outputBuf="",decoder=new TextDecoder("utf-8");$global.fs={constants:{O_WRONLY:-1,O_RDWR:-1,O_CREAT:-1,O_TRUNC:-1,O_APPEND:-1,O_EXCL:-1},writeSync:function(e,n){var r=(outputBuf+=decoder.decode(n)).lastIndexOf("\n");return-1!=r&&(console.log(outputBuf.substr(0,r)),outputBuf=outputBuf.substr(r+1)),n.length},write:function(e,n,r,t,i,a){0===r&&t===n.length&&null===i?a(null,this.writeSync(e,n)):a(enosys())}}}var $throwRuntimeError,$linknames={},$packages={},$idCounter=0,$keys=function(e){return e?Object.keys(e):[]},$flushConsole=function(){},$throwNilPointerError=function(){$throwRuntimeError("invalid memory address or nil pointer dereference")},$call=function(e,n,r){return e.apply(n,r)},$makeFunc=function(e){return function(){return $externalize(e(this,new($sliceType($jsObjectPtr))($global.Array.prototype.slice.call(arguments,[]))),$emptyInterface)}},$unused=function(e){},$print=console.log;if(void 0!==$global.process&&$global.require)try{var util=$global.require("util");$print=function(){$global.process.stderr.write(util.format.apply(this,arguments))}}catch(e){}var $println=console.log,$initAllLinknames=function(){for(var e=$keys($packages),n=0;ne.$capacity||t>e.$capacity)&&$throwRuntimeError("slice bounds out of range"),e===e.constructor.nil)return e;var i=new e.constructor(e.$array);return i.$offset=e.$offset+n,i.$length=r-n,i.$capacity=t-n,i},$substring=function(e,n,r){return(n<0||re.length)&&$throwRuntimeError("slice bounds out of range"),e.substring(n,r)},$sliceToNativeArray=function(e){return e.$array.constructor!==Array?e.$array.subarray(e.$offset,e.$offset+e.$length):e.$array.slice(e.$offset,e.$offset+e.$length)},$sliceToGoArray=function(e,n){var r=n.elem;return void 0!==r&&e.$length1114111||55296<=e&&e<=57343)&&(e=65533),e<=127?String.fromCharCode(e):e<=2047?String.fromCharCode(192|e>>6,128|63&e):e<=65535?String.fromCharCode(224|e>>12,128|e>>6&63,128|63&e):String.fromCharCode(240|e>>18,128|e>>12&63,128|e>>6&63,128|63&e)},$stringToBytes=function(e){for(var n=new Uint8Array(e.length),r=0;rt){for(var o=i-1;o>=0;o--)a.copy(e[r+o],n[t+o]);return}for(o=0;ot)for(o=i-1;o>=0;o--)e[r+o]=n[t+o];else for(o=0;oc)if(a=0,c=Math.max(o,e.$capacity<1024?2*e.$capacity:Math.floor(5*e.$capacity/4)),e.$array.constructor===Array){(i=e.$array.slice(e.$offset,e.$offset+e.$length)).length=c;for(var $=e.constructor.elem.zero,u=e.$length;u>>16&65535)*t+r*(n>>>16&65535)<<16>>>0)>>0},$floatKey=function(e){return e!=e?"NaN$"+ ++$idCounter:String(e)},$flatten64=function(e){return 4294967296*e.$high+e.$low},$shiftLeft64=function(e,n){return 0===n?e:n<32?new e.constructor(e.$high<>>32-n,e.$low<>>0):n<64?new e.constructor(e.$low<>n,(e.$low>>>n|e.$high<<32-n)>>>0):n<64?new e.constructor(e.$high>>31,e.$high>>n-32>>>0):e.$high<0?new e.constructor(-1,4294967295):new e.constructor(0,0)},$shiftRightUint64=function(e,n){return 0===n?e:n<32?new e.constructor(e.$high>>>n,(e.$low>>>n|e.$high<<32-n)>>>0):n<64?new e.constructor(0,e.$high>>>n-32):new e.constructor(0,0)},$mul64=function(e,n){var r=e.$high>>>16,t=65535&e.$high,i=e.$low>>>16,a=65535&e.$low,o=n.$high>>>16,c=65535&n.$high,$=n.$low>>>16,u=65535&n.$low,l=0,s=0,f=0,d=0;f+=(d+=a*u)>>>16,s+=(f+=i*u)>>>16,f&=65535,s+=(f+=a*$)>>>16,l+=(s+=t*u)>>>16,s&=65535,l+=(s+=i*$)>>>16,s&=65535,l+=(s+=a*c)>>>16,l+=r*u+t*$+i*c+a*o;var p=((l&=65535)<<16|(s&=65535))>>>0,h=((f&=65535)<<16|(d&=65535))>>>0;return new e.constructor(p,h)},$div64=function(e,n,r){0===n.$high&&0===n.$low&&$throwRuntimeError("integer divide by zero");var t=1,i=1,a=e.$high,o=e.$low;a<0&&(t=-1,i=-1,a=-a,0!==o&&(a--,o=4294967296-o));var c=n.$high,$=n.$low;n.$high<0&&(t*=-1,c=-c,0!==$&&(c--,$=4294967296-$));for(var u=0,l=0,s=0;c<2147483648&&(a>c||a===c&&o>$);)c=(c<<1|$>>>31)>>>0,$=$<<1>>>0,s++;for(var f=0;f<=s;f++)u=u<<1|l>>>31,l=l<<1>>>0,(a>c||a===c&&o>=$)&&(a-=c,(o-=$)<0&&(a--,o+=4294967296),4294967296===++l&&(u++,l=0)),$=($>>>1|c<<31)>>>0,c>>>=1;return r?new e.constructor(a*i,o*i):new e.constructor(u*t,l*t)},$divComplex=function(e,n){var r=e.$real===1/0||e.$real===-1/0||e.$imag===1/0||e.$imag===-1/0,t=n.$real===1/0||n.$real===-1/0||n.$imag===1/0||n.$imag===-1/0,i=!r&&(e.$real!=e.$real||e.$imag!=e.$imag),a=!t&&(n.$real!=n.$real||n.$imag!=n.$imag);if(i||a)return new e.constructor(NaN,NaN);if(r&&!t)return new e.constructor(1/0,1/0);if(!r&&t)return new e.constructor(0,0);if(0===n.$real&&0===n.$imag)return 0===e.$real&&0===e.$imag?new e.constructor(NaN,NaN):new e.constructor(1/0,1/0);if(Math.abs(n.$real)<=Math.abs(n.$imag)){var o=n.$real/n.$imag,c=n.$real*o+n.$imag;return new e.constructor((e.$real*o+e.$imag)/c,(e.$imag*o-e.$real)/c)}o=n.$imag/n.$real,c=n.$imag*o+n.$real;return new e.constructor((e.$imag*o+e.$real)/c,(e.$imag-e.$real*o)/c)},$kindBool=1,$kindInt=2,$kindInt8=3,$kindInt16=4,$kindInt32=5,$kindInt64=6,$kindUint=7,$kindUint8=8,$kindUint16=9,$kindUint32=10,$kindUint64=11,$kindUintptr=12,$kindFloat32=13,$kindFloat64=14,$kindComplex64=15,$kindComplex128=16,$kindArray=17,$kindChan=18,$kindFunc=19,$kindInterface=20,$kindMap=21,$kindPtr=22,$kindSlice=23,$kindString=24,$kindStruct=25,$kindUnsafePointer=26,$methodSynthesizers=[],$addMethodSynthesizer=function(e){null!==$methodSynthesizers?$methodSynthesizers.push(e):e()},$synthesizeMethods=function(){$methodSynthesizers.forEach(function(e){e()}),$methodSynthesizers=null},$ifaceKeyFor=function(e){if(e===$ifaceNil)return"nil";var n=e.constructor;return n.string+"$"+n.keyFor(e.$val)},$identity=function(e){return e},$typeIDCounter=0,$idKey=function(e){return void 0===e.$id&&($idCounter++,e.$id=$idCounter),String(e.$id)},$arrayPtrCtor=function(){return function(e){this.$get=function(){return e},this.$set=function(e){typ.copy(this,e)},this.$val=e}},$newType=function(e,n,r,t,i,a,o){var c;switch(n){case $kindBool:case $kindInt:case $kindInt8:case $kindInt16:case $kindInt32:case $kindUint:case $kindUint8:case $kindUint16:case $kindUint32:case $kindUintptr:case $kindUnsafePointer:(c=function(e){this.$val=e}).wrapped=!0,c.keyFor=$identity;break;case $kindString:(c=function(e){this.$val=e}).wrapped=!0,c.keyFor=function(e){return"$"+e};break;case $kindFloat32:case $kindFloat64:(c=function(e){this.$val=e}).wrapped=!0,c.keyFor=function(e){return $floatKey(e)};break;case $kindInt64:(c=function(e,n){this.$high=e+Math.floor(Math.ceil(n)/4294967296)>>0,this.$low=n>>>0,this.$val=this}).keyFor=function(e){return e.$high+"$"+e.$low};break;case $kindUint64:(c=function(e,n){this.$high=e+Math.floor(Math.ceil(n)/4294967296)>>>0,this.$low=n>>>0,this.$val=this}).keyFor=function(e){return e.$high+"$"+e.$low};break;case $kindComplex64:(c=function(e,n){this.$real=$fround(e),this.$imag=$fround(n),this.$val=this}).keyFor=function(e){return e.$real+"$"+e.$imag};break;case $kindComplex128:(c=function(e,n){this.$real=e,this.$imag=n,this.$val=this}).keyFor=function(e){return e.$real+"$"+e.$imag};break;case $kindArray:(c=function(e){this.$val=e}).wrapped=!0,c.ptr=$newType(4,$kindPtr,"*"+r,!1,"",!1,$arrayPtrCtor()),c.init=function(e,n){c.elem=e,c.len=n,c.comparable=e.comparable,c.keyFor=function(n){return Array.prototype.join.call($mapArray(n,function(n){return String(e.keyFor(n)).replace(/\\/g,"\\\\").replace(/\$/g,"\\$")}),"$")},c.copy=function(n,r){$copyArray(n,r,0,0,r.length,e)},c.ptr.init(c),Object.defineProperty(c.ptr.nil,"nilCheck",{get:$throwNilPointerError})};break;case $kindChan:(c=function(e){this.$val=e}).wrapped=!0,c.keyFor=$idKey,c.init=function(e,n,r){c.elem=e,c.sendOnly=n,c.recvOnly=r};break;case $kindFunc:(c=function(e){this.$val=e}).wrapped=!0,c.init=function(e,n,r){c.params=e,c.results=n,c.variadic=r,c.comparable=!1};break;case $kindInterface:(c={implementedBy:{},missingMethodFor:{}}).keyFor=$ifaceKeyFor,c.init=function(e){c.methods=e,e.forEach(function(e){$ifaceNil[e.prop]=$throwNilPointerError})};break;case $kindMap:(c=function(e){this.$val=e}).wrapped=!0,c.init=function(e,n){c.key=e,c.elem=n,c.comparable=!1};break;case $kindPtr:(c=o||function(e,n,r){this.$get=e,this.$set=n,this.$target=r,this.$val=this}).keyFor=$idKey,c.init=function(e){c.elem=e,c.wrapped=e.kind===$kindArray,c.nil=new c($throwNilPointerError,$throwNilPointerError)};break;case $kindSlice:(c=function(e){e.constructor!==c.nativeArray&&(e=new c.nativeArray(e)),this.$array=e,this.$offset=0,this.$length=e.length,this.$capacity=e.length,this.$val=this}).init=function(e){c.elem=e,c.comparable=!1,c.nativeArray=$nativeArray(e.kind),c.nil=new c([])};break;case $kindStruct:(c=function(e){this.$val=e}).wrapped=!0,c.ptr=$newType(4,$kindPtr,"*"+r,!1,i,a,o),c.ptr.elem=c,c.ptr.prototype.$get=function(){return this},c.ptr.prototype.$set=function(e){c.copy(this,e)},c.init=function(e,n){c.pkgPath=e,c.fields=n,n.forEach(function(e){e.typ.comparable||(c.comparable=!1)}),c.keyFor=function(e){var r=e.$val;return $mapArray(n,function(e){return String(e.typ.keyFor(r[e.prop])).replace(/\\/g,"\\\\").replace(/\$/g,"\\$")}).join("$")},c.copy=function(e,r){for(var t=0;t0;){var a=[],o=[];t.forEach(function(e){if(!i[e.typ.string])switch(i[e.typ.string]=!0,e.typ.named&&(o=o.concat(e.typ.methods),e.indirect&&(o=o.concat($ptrType(e.typ).methods))),e.typ.kind){case $kindStruct:e.typ.fields.forEach(function(n){if(n.embedded){var r=n.typ,t=r.kind===$kindPtr;a.push({typ:t?r.elem:r,indirect:e.indirect||t})}});break;case $kindInterface:o=o.concat(e.typ.methods)}}),o.forEach(function(e){void 0===n[e.name]&&(n[e.name]=e)}),t=a}return e.methodSetCache=[],Object.keys(n).sort().forEach(function(r){e.methodSetCache.push(n[r])}),e.methodSetCache},$Bool=$newType(1,$kindBool,"bool",!0,"",!1,null),$Int=$newType(4,$kindInt,"int",!0,"",!1,null),$Int8=$newType(1,$kindInt8,"int8",!0,"",!1,null),$Int16=$newType(2,$kindInt16,"int16",!0,"",!1,null),$Int32=$newType(4,$kindInt32,"int32",!0,"",!1,null),$Int64=$newType(8,$kindInt64,"int64",!0,"",!1,null),$Uint=$newType(4,$kindUint,"uint",!0,"",!1,null),$Uint8=$newType(1,$kindUint8,"uint8",!0,"",!1,null),$Uint16=$newType(2,$kindUint16,"uint16",!0,"",!1,null),$Uint32=$newType(4,$kindUint32,"uint32",!0,"",!1,null),$Uint64=$newType(8,$kindUint64,"uint64",!0,"",!1,null),$Uintptr=$newType(4,$kindUintptr,"uintptr",!0,"",!1,null),$Float32=$newType(4,$kindFloat32,"float32",!0,"",!1,null),$Float64=$newType(8,$kindFloat64,"float64",!0,"",!1,null),$Complex64=$newType(8,$kindComplex64,"complex64",!0,"",!1,null),$Complex128=$newType(16,$kindComplex128,"complex128",!0,"",!1,null),$String=$newType(8,$kindString,"string",!0,"",!1,null),$UnsafePointer=$newType(4,$kindUnsafePointer,"unsafe.Pointer",!0,"unsafe",!1,null),$nativeArray=function(e){switch(e){case $kindInt:return Int32Array;case $kindInt8:return Int8Array;case $kindInt16:return Int16Array;case $kindInt32:return Int32Array;case $kindUint:return Uint32Array;case $kindUint8:return Uint8Array;case $kindUint16:return Uint16Array;case $kindUint32:case $kindUintptr:return Uint32Array;case $kindFloat32:return Float32Array;case $kindFloat64:return Float64Array;default:return Array}},$toNativeArray=function(e,n){var r=$nativeArray(e);return r===Array?n:new r(n)},$arrayTypes={},$arrayType=function(e,n){var r=e.id+"$"+n,t=$arrayTypes[r];return void 0===t&&(t=$newType(12,$kindArray,"["+n+"]"+e.string,!1,"",!1,null),$arrayTypes[r]=t,t.init(e,n)),t},$chanType=function(e,n,r){var t=(r?"<-":"")+"chan"+(n?"<- ":" ");n||r||"<"!=e.string[0]?t+=e.string:t+="("+e.string+")";var i=n?"SendChan":r?"RecvChan":"Chan",a=e[i];return void 0===a&&(a=$newType(4,$kindChan,t,!1,"",!1,null),e[i]=a,a.init(e,n,r)),a},$Chan=function(e,n){(n<0||n>2147483647)&&$throwRuntimeError("makechan: size out of range"),this.$elem=e,this.$capacity=n,this.$buffer=[],this.$sendQueue=[],this.$recvQueue=[],this.$closed=!1},$chanNil=new $Chan(null,0);$chanNil.$sendQueue=$chanNil.$recvQueue={length:0,push:function(){},shift:function(){},indexOf:function(){return-1}};var $funcTypes={},$funcType=function(e,n,r){var t=$mapArray(e,function(e){return e.id}).join(",")+"$"+$mapArray(n,function(e){return e.id}).join(",")+"$"+r,i=$funcTypes[t];if(void 0===i){var a=$mapArray(e,function(e){return e.string});r&&(a[a.length-1]="..."+a[a.length-1].substr(2));var o="func("+a.join(", ")+")";1===n.length?o+=" "+n[0].string:n.length>1&&(o+=" ("+$mapArray(n,function(e){return e.string}).join(", ")+")"),i=$newType(4,$kindFunc,o,!1,"",!1,null),$funcTypes[t]=i,i.init(e,n,r)}return i},$interfaceTypes={},$interfaceType=function(e){var n=$mapArray(e,function(e){return e.pkg+","+e.name+","+e.typ.id}).join("$"),r=$interfaceTypes[n];if(void 0===r){var t="interface {}";0!==e.length&&(t="interface { "+$mapArray(e,function(e){return(""!==e.pkg?e.pkg+".":"")+e.name+e.typ.string.substr(4)}).join("; ")+" }"),r=$newType(8,$kindInterface,t,!1,"",!1,null),$interfaceTypes[n]=r,r.init(e)}return r},$emptyInterface=$interfaceType([]),$ifaceNil={},$error=$newType(8,$kindInterface,"error",!0,"",!1,null);$error.init([{prop:"Error",name:"Error",pkg:"",typ:$funcType([],[$String],!1)}]);var $panicValue,$jsObjectPtr,$jsErrorPtr,$mapTypes={},$mapType=function(e,n){var r=e.id+"$"+n.id,t=$mapTypes[r];return void 0===t&&(t=$newType(4,$kindMap,"map["+e.string+"]"+n.string,!1,"",!1,null),$mapTypes[r]=t,t.init(e,n)),t},$makeMap=function(e,n){for(var r={},t=0;t2147483647)&&$throwRuntimeError("makeslice: len out of range"),(r<0||r2147483647)&&$throwRuntimeError("makeslice: cap out of range");var t=new e.nativeArray(r);if(e.nativeArray===Array)for(var i=0;i4||t<0)break}}finally{0==$scheduled.length&&clearTimeout(e)}},$schedule=function(e){e.asleep&&(e.asleep=!1,$awakeGoroutines++),$scheduled.push(e),$curGoroutine===$noGoroutine&&$runScheduled()},$setTimeout=function(e,n){return $awakeGoroutines++,setTimeout(function(){$awakeGoroutines--,e()},n)},$block=function(){$curGoroutine===$noGoroutine&&$throwRuntimeError("cannot block in JavaScript callback, fix by wrapping code in goroutine"),$curGoroutine.asleep=!0},$restore=function(e,n){return void 0!==e&&void 0!==e.$blk?e:n},$send=function(e,n){e.$closed&&$throwRuntimeError("send on closed channel");var r=e.$recvQueue.shift();if(void 0===r){if(!(e.$buffer.length65535){var l=Math.floor((u-65536)/1024)+55296,s=(u-65536)%1024+56320;$+=String.fromCharCode(l,s)}else $+=String.fromCharCode(u)}return $;case $kindStruct:var f=$packages.time;if(void 0!==f&&e.constructor===f.Time.ptr){var d=$div64(e.UnixNano(),new $Int64(0,1e6));return new Date($flatten64(d))}var p={},h=function(e,n){if(n===$jsObjectPtr)return e;switch(n.kind){case $kindPtr:return e===n.nil?p:h(e.$get(),n.elem);case $kindStruct:var r=n.fields[0];return h(e[r.prop],r.typ);case $kindInterface:return h(e.$val,e.constructor);default:return p}},k=h(e,n);if(k!==p)return k;if(void 0!==r)return r(e);k={};for(a=0;a>24;case $kindInt16:return parseInt(e)<<16>>16;case $kindInt32:return parseInt(e)>>0;case $kindUint:return parseInt(e);case $kindUint8:return parseInt(e)<<24>>>24;case $kindUint16:return parseInt(e)<<16>>>16;case $kindUint32:case $kindUintptr:return parseInt(e)>>>0;case $kindInt64:case $kindUint64:return new n(0,e);case $kindFloat32:case $kindFloat64:return parseFloat(e);case $kindArray:return e.length!==n.len&&$throwRuntimeError("got array with wrong size from JavaScript native"),$mapArray(e,function(e){return $internalize(e,n.elem,i)});case $kindFunc:return function(){for(var t=[],a=0;a=128)return!1;return!0}; + +$packages["github.com/gopherjs/gopherjs/js"]=(function(){var $pkg={},$init,A,B,J,K,M,O,P,Q,R,S,T,G,H,L;A=$pkg.Object=$newType(0,$kindStruct,"js.Object",true,"github.com/gopherjs/gopherjs/js",true,function(object_){this.$val=this;if(arguments.length===0){this.object=null;return;}this.object=object_;});B=$pkg.Error=$newType(0,$kindStruct,"js.Error",true,"github.com/gopherjs/gopherjs/js",true,function(Object_){this.$val=this;if(arguments.length===0){this.Object=null;return;}this.Object=Object_;});J=$pkg.M=$newType(4,$kindMap,"js.M",true,"github.com/gopherjs/gopherjs/js",true,null);K=$pkg.S=$newType(12,$kindSlice,"js.S",true,"github.com/gopherjs/gopherjs/js",true,null);M=$sliceType($emptyInterface);O=$ptrType(A);P=$sliceType(O);Q=$funcType([P],[O],true);R=$funcType([],[O],false);S=$funcType([O],[],false);T=$ptrType(B);A.ptr.prototype.Get=function(a){var a,b;b=this;return b.object[$externalize(a,$String)];};A.prototype.Get=function(a){return this.$val.Get(a);};A.ptr.prototype.Set=function(a,b){var a,b,c;c=this;c.object[$externalize(a,$String)]=$externalize(b,$emptyInterface);};A.prototype.Set=function(a,b){return this.$val.Set(a,b);};A.ptr.prototype.Delete=function(a){var a,b;b=this;delete b.object[$externalize(a,$String)];};A.prototype.Delete=function(a){return this.$val.Delete(a);};A.ptr.prototype.Length=function(){var a;a=this;return $parseInt(a.object.length);};A.prototype.Length=function(){return this.$val.Length();};A.ptr.prototype.Index=function(a){var a,b;b=this;return b.object[a];};A.prototype.Index=function(a){return this.$val.Index(a);};A.ptr.prototype.SetIndex=function(a,b){var a,b,c;c=this;c.object[a]=$externalize(b,$emptyInterface);};A.prototype.SetIndex=function(a,b){return this.$val.SetIndex(a,b);};A.ptr.prototype.Call=function(a,b){var a,b,c,d;c=this;return(d=c.object,d[$externalize(a,$String)].apply(d,$externalize(b,M)));};A.prototype.Call=function(a,b){return this.$val.Call(a,b);};A.ptr.prototype.Invoke=function(a){var a,b;b=this;return b.object.apply(undefined,$externalize(a,M));};A.prototype.Invoke=function(a){return this.$val.Invoke(a);};A.ptr.prototype.New=function(a){var a,b;b=this;return new($global.Function.prototype.bind.apply(b.object,[undefined].concat($externalize(a,M))));};A.prototype.New=function(a){return this.$val.New(a);};A.ptr.prototype.Bool=function(){var a;a=this;return!!(a.object);};A.prototype.Bool=function(){return this.$val.Bool();};A.ptr.prototype.String=function(){var a;a=this;return $internalize(a.object,$String);};A.prototype.String=function(){return this.$val.String();};A.ptr.prototype.Int=function(){var a;a=this;return $parseInt(a.object)>>0;};A.prototype.Int=function(){return this.$val.Int();};A.ptr.prototype.Int64=function(){var a;a=this;return $internalize(a.object,$Int64);};A.prototype.Int64=function(){return this.$val.Int64();};A.ptr.prototype.Uint64=function(){var a;a=this;return $internalize(a.object,$Uint64);};A.prototype.Uint64=function(){return this.$val.Uint64();};A.ptr.prototype.Float=function(){var a;a=this;return $parseFloat(a.object);};A.prototype.Float=function(){return this.$val.Float();};A.ptr.prototype.Interface=function(){var a;a=this;return $internalize(a.object,$emptyInterface);};A.prototype.Interface=function(){return this.$val.Interface();};A.ptr.prototype.Unsafe=function(){var a;a=this;return a.object;};A.prototype.Unsafe=function(){return this.$val.Unsafe();};B.ptr.prototype.Error=function(){var a;a=this;return"JavaScript error: "+$internalize(a.Object.message,$String);};B.prototype.Error=function(){return this.$val.Error();};B.ptr.prototype.Stack=function(){var a;a=this;return $internalize(a.Object.stack,$String);};B.prototype.Stack=function(){return this.$val.Stack();};G=function(a){var a,b,c,d,e,f;b=a;c=new($global.Object)();c.__internal_object__=b;d=b.constructor.methods;e=0;while(true){if(!(e<$parseInt(d.length))){break;}f=[f];f[0]=d[e];if(!($internalize(f[0].pkg,$String)==="")){e=e+(1)>>0;continue;}c[$externalize($internalize(f[0].name,$String),$String)]=$externalize((function(f){return function(g){var g;return $externalizeFunction(b[$externalize($internalize(f[0].prop,$String),$String)],f[0].typ,$externalize(true,$Bool)).apply(b,$externalize(g,P));};})(f),Q);e=e+(1)>>0;}return c;};$pkg.MakeWrapper=G;H=function(a){var{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,$s,$r,$c}=$restore(this,{a});$s=$s||0;s:while(true){switch($s){case 0:b=[b];c=[c];b[0]=a;d=b[0].constructor;c[0]=new($global.Object)();e=(function(b,c){return function(e,f){var e,f;$global.Object.defineProperty(c[0],$externalize(e,$String),$externalize(f,J));};})(b,c);$r=e("__internal_object__",$makeMap($String.keyFor,[{k:"value",v:new $jsObjectPtr(b[0])}]));$s=1;case 1:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}f=$internalize(d.string,$String);g=$internalize(d.pkg,$String);h="";if(f.charCodeAt(0)===42){h="*";}i=0;while(true){if(!(i>0));break;}i=i+(1)>>0;}j=g+"."+h+f;$r=e("$type",$makeMap($String.keyFor,[{k:"value",v:new $String(j)}]));$s=2;case 2:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}k=null;l=new($global.Array)();m=d.methods;if(!(m===undefined)){l=l.concat(m);}n=d.elem;if(!(n===undefined)){k=n.fields;l=l.concat(n.methods);}else{k=d.fields;}o=0;case 3:if(!(o<$parseInt(l.length))){$s=4;continue;}p=[p];p[0]=l[o];if(!($internalize(p[0].pkg,$String)==="")){o=o+(1)>>0;$s=3;continue;}$r=e($internalize(p[0].prop,$String),$makeMap($String.keyFor,[{k:"value",v:new Q((function(b,c,p){return function(q){var q;return $externalizeFunction(b[0][$externalize($internalize(p[0].prop,$String),$String)],p[0].typ,$externalize(true,$Bool),H).apply(b[0],$externalize(q,P));};})(b,c,p))}]));$s=5;case 5:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}o=o+(1)>>0;$s=3;continue;case 4:if(!(k===undefined)){$s=6;continue;}$s=7;continue;case 6:q=0;case 8:if(!(q<$parseInt(k.length))){$s=9;continue;}r=[r];r[0]=k[q];if(!!!(r[0].exported)){q=q+(1)>>0;$s=8;continue;}$r=e($internalize(r[0].prop,$String),$makeMap($String.keyFor,[{k:"get",v:new R((function(b,c,r){return function(){var s;s=$copyIfRequired(b[0].$val[$externalize($internalize(r[0].prop,$String),$String)],r[0].typ);return $externalize(s,r[0].typ,H);};})(b,c,r))},{k:"set",v:new S((function(b,c,r){return function(s){var s,t;t=$internalize(s,r[0].typ,H);b[0].$val[$externalize($internalize(r[0].prop,$String),$String)]=t;};})(b,c,r))}]));$s=10;case 10:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}q=q+(1)>>0;$s=8;continue;case 9:case 7:$s=-1;return c[0];}return;}var $f={$blk:H,$c:true,$r,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,$s};return $f;};$pkg.MakeFullWrapper=H;L=function(){var a;a=new B.ptr(null);$unused(a);};O.methods=[{prop:"Get",name:"Get",pkg:"",typ:$funcType([$String],[O],false)},{prop:"Set",name:"Set",pkg:"",typ:$funcType([$String,$emptyInterface],[],false)},{prop:"Delete",name:"Delete",pkg:"",typ:$funcType([$String],[],false)},{prop:"Length",name:"Length",pkg:"",typ:$funcType([],[$Int],false)},{prop:"Index",name:"Index",pkg:"",typ:$funcType([$Int],[O],false)},{prop:"SetIndex",name:"SetIndex",pkg:"",typ:$funcType([$Int,$emptyInterface],[],false)},{prop:"Call",name:"Call",pkg:"",typ:$funcType([$String,M],[O],true)},{prop:"Invoke",name:"Invoke",pkg:"",typ:$funcType([M],[O],true)},{prop:"New",name:"New",pkg:"",typ:$funcType([M],[O],true)},{prop:"Bool",name:"Bool",pkg:"",typ:$funcType([],[$Bool],false)},{prop:"String",name:"String",pkg:"",typ:$funcType([],[$String],false)},{prop:"Int",name:"Int",pkg:"",typ:$funcType([],[$Int],false)},{prop:"Int64",name:"Int64",pkg:"",typ:$funcType([],[$Int64],false)},{prop:"Uint64",name:"Uint64",pkg:"",typ:$funcType([],[$Uint64],false)},{prop:"Float",name:"Float",pkg:"",typ:$funcType([],[$Float64],false)},{prop:"Interface",name:"Interface",pkg:"",typ:$funcType([],[$emptyInterface],false)},{prop:"Unsafe",name:"Unsafe",pkg:"",typ:$funcType([],[$Uintptr],false)}];T.methods=[{prop:"Error",name:"Error",pkg:"",typ:$funcType([],[$String],false)},{prop:"Stack",name:"Stack",pkg:"",typ:$funcType([],[$String],false)}];A.init("github.com/gopherjs/gopherjs/js",[{prop:"object",name:"object",embedded:false,exported:false,typ:O,tag:""}]);B.init("",[{prop:"Object",name:"Object",embedded:true,exported:true,typ:O,tag:""}]);J.init($String,$emptyInterface);K.init($emptyInterface);$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:L();}return;}if($f===undefined){$f={$blk:$init};}$f.$s=$s;$f.$r=$r;return $f;};$pkg.$init=$init;return $pkg;})(); +$packages["runtime"]=(function(){var $pkg={},$init,A,C,D,AT,AZ,BD,AM,E,AU;A=$packages["github.com/gopherjs/gopherjs/js"];C=$pkg._type=$newType(0,$kindStruct,"runtime._type",true,"runtime",false,function(str_){this.$val=this;if(arguments.length===0){this.str="";return;}this.str=str_;});D=$pkg.TypeAssertionError=$newType(0,$kindStruct,"runtime.TypeAssertionError",true,"runtime",true,function(_interface_,concrete_,asserted_,missingMethod_){this.$val=this;if(arguments.length===0){this._interface=AZ.nil;this.concrete=AZ.nil;this.asserted=AZ.nil;this.missingMethod="";return;}this._interface=_interface_;this.concrete=concrete_;this.asserted=asserted_;this.missingMethod=missingMethod_;});AT=$pkg.errorString=$newType(8,$kindString,"runtime.errorString",true,"runtime",false,null);AZ=$ptrType(C);BD=$ptrType(D);C.ptr.prototype.string=function(){var a;a=this;return a.str;};C.prototype.string=function(){return this.$val.string();};C.ptr.prototype.pkgpath=function(){var a;a=this;return"";};C.prototype.pkgpath=function(){return this.$val.pkgpath();};D.ptr.prototype.RuntimeError=function(){};D.prototype.RuntimeError=function(){return this.$val.RuntimeError();};D.ptr.prototype.Error=function(){var a,b,c,d,e;a=this;b="interface";if(!(a._interface===AZ.nil)){b=a._interface.string();}c=a.asserted.string();if(a.concrete===AZ.nil){return"interface conversion: "+b+" is nil, not "+c;}d=a.concrete.string();if(a.missingMethod===""){e="interface conversion: "+b+" is "+d+", not "+c;if(d===c){if(!(a.concrete.pkgpath()===a.asserted.pkgpath())){e=e+(" (types from different packages)");}else{e=e+(" (types from different scopes)");}}return e;}return"interface conversion: "+d+" is not "+c+": missing method "+a.missingMethod;};D.prototype.Error=function(){return this.$val.Error();};E=function(){var a,b;a=$packages[$externalize("github.com/gopherjs/gopherjs/js",$String)];$jsObjectPtr=a.Object.ptr;$jsErrorPtr=a.Error.ptr;$throwRuntimeError=AU;AM=$internalize($goVersion,$String);b=$ifaceNil;b=new D.ptr(AZ.nil,AZ.nil,AZ.nil,"");$unused(b);};AT.prototype.RuntimeError=function(){var a;a=this.$val;};$ptrType(AT).prototype.RuntimeError=function(){return new AT(this.$get()).RuntimeError();};AT.prototype.Error=function(){var a;a=this.$val;return"runtime error: "+(a);};$ptrType(AT).prototype.Error=function(){return new AT(this.$get()).Error();};AU=function(a){var a;$panic(new AT((a)));};AZ.methods=[{prop:"string",name:"string",pkg:"runtime",typ:$funcType([],[$String],false)},{prop:"pkgpath",name:"pkgpath",pkg:"runtime",typ:$funcType([],[$String],false)}];BD.methods=[{prop:"RuntimeError",name:"RuntimeError",pkg:"",typ:$funcType([],[],false)},{prop:"Error",name:"Error",pkg:"",typ:$funcType([],[$String],false)}];AT.methods=[{prop:"RuntimeError",name:"RuntimeError",pkg:"",typ:$funcType([],[],false)},{prop:"Error",name:"Error",pkg:"",typ:$funcType([],[$String],false)}];C.init("runtime",[{prop:"str",name:"str",embedded:false,exported:false,typ:$String,tag:""}]);D.init("runtime",[{prop:"_interface",name:"_interface",embedded:false,exported:false,typ:AZ,tag:""},{prop:"concrete",name:"concrete",embedded:false,exported:false,typ:AZ,tag:""},{prop:"asserted",name:"asserted",embedded:false,exported:false,typ:AZ,tag:""},{prop:"missingMethod",name:"missingMethod",embedded:false,exported:false,typ:$String,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;}AM="";E();}return;}if($f===undefined){$f={$blk:$init};}$f.$s=$s;$f.$r=$r;return $f;};$pkg.$init=$init;return $pkg;})(); +$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,O,Q,V,AM,AN,AO,AP,AQ,AR,AS,AT,AU,AV,AW,AX,AY,AZ,BA,BB,BC,BD,BE,BF,BG,BH,BI,BJ,BK,BL,BM,BN,R,S,P,T,U,W,X,Y,Z,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL;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=BJ.nil;this.Points=BK.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_){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;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_;});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=BL.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_,PushbackX_,PushbackY_,Damage_,SelfLockVelX_,SelfLockVelY_,HitboxOffsetX_,HitboxOffsetY_,HitboxSizeX_,HitboxSizeY_,BlowUp_){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.PushbackX=0;this.PushbackY=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;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.PushbackX=PushbackX_;this.PushbackY=PushbackY_;this.Damage=Damage_;this.SelfLockVelX=SelfLockVelX_;this.SelfLockVelY=SelfLockVelY_;this.HitboxOffsetX=HitboxOffsetX_;this.HitboxOffsetY=HitboxOffsetY_;this.HitboxSizeX=HitboxSizeX_;this.HitboxSizeY=HitboxSizeY_;this.BlowUp=BlowUp_;});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);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);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_,Hits_){this.$val=this;if(arguments.length===0){this.BattleLocalId=0;this.RecoveryFrames=0;this.RecoveryFramesOnBlock=0;this.RecoveryFramesOnHit=0;this.ReleaseTriggerType=0;this.Hits=AM.nil;return;}this.BattleLocalId=BattleLocalId_;this.RecoveryFrames=RecoveryFrames_;this.RecoveryFramesOnBlock=RecoveryFramesOnBlock_;this.RecoveryFramesOnHit=RecoveryFramesOnHit_;this.ReleaseTriggerType=ReleaseTriggerType_;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=AZ.nil;this.CountdownNanos=new $Int64(0,0);this.MeleeBullets=BA.nil;this.FireballBullets=BH.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=AY.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=AM.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.CharacterConfig=$newType(0,$kindStruct,"battle.CharacterConfig",true,"jsexport/battle",true,function(SpeciesId_,SpeciesName_,InAirIdleFrameIdxTurningPoint_,InAirIdleFrameIdxTurnedCycle_,LayDownFrames_,LayDownFramesToRecover_,GetUpFrames_,GetUpFramesToRecover_,JumpingInitVelY_,PatternIdToSkillId_){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.GetUpFrames=0;this.GetUpFramesToRecover=0;this.JumpingInitVelY=0;this.PatternIdToSkillId=false;return;}this.SpeciesId=SpeciesId_;this.SpeciesName=SpeciesName_;this.InAirIdleFrameIdxTurningPoint=InAirIdleFrameIdxTurningPoint_;this.InAirIdleFrameIdxTurnedCycle=InAirIdleFrameIdxTurnedCycle_;this.LayDownFrames=LayDownFrames_;this.LayDownFramesToRecover=LayDownFramesToRecover_;this.GetUpFrames=GetUpFrames_;this.GetUpFramesToRecover=GetUpFramesToRecover_;this.JumpingInitVelY=JumpingInitVelY_;this.PatternIdToSkillId=PatternIdToSkillId_;});V=$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_;});AM=$sliceType($emptyInterface);AN=$sliceType($Int32);AO=$sliceType(AN);AP=$ptrType(V);AQ=$sliceType(C);AR=$sliceType($String);AS=$ptrType(B.Collision);AT=$ptrType(AQ);AU=$ptrType(E);AV=$ptrType(J);AW=$ptrType(B.ConvexPolygon);AX=$ptrType(N);AY=$sliceType($Uint64);AZ=$sliceType(AU);BA=$sliceType(AV);BB=$sliceType(AT);BC=$sliceType($Bool);BD=$ptrType(L);BE=$ptrType(B.Object);BF=$sliceType(BE);BG=$ptrType(K);BH=$sliceType(BG);BI=$sliceType($Float64);BJ=$ptrType(C);BK=$sliceType(BJ);BL=$ptrType(D);BM=$mapType($Int,$Int);BN=$ptrType(O);P=function(a){var a;return new O.ptr(0,0,0,0,a,0,$makeSlice(AM,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))>>$min(c,31))>>0);};$pkg.ConvertToInputFrameId=T;U=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);};W=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 V.ptr(0,0,0,true,true,new B.Vector([0,0]));i=X(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,AP.nil];}return;}}catch(err){$err=err;$s=-1;return[false,0,0,AP.nil];}finally{$callDeferred($deferred,$err);if($curGoroutine.asleep){var $f={$blk:W,$c:true,$r,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,$s,$deferred};return $f;}}};$pkg.CalcPushbacks=W;X=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(!(AP.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(Y(a,b,r.Unit(),c)){return false;}q++;}}if(1=s.$length)?($throwRuntimeError("index out of range"),undefined):s.$array[s.$offset+t]);if(Y(a,b,u.Unit(),c)){return false;}t++;}}return true;};Y=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;};Z=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=Z;AA=function(a,b){var a,b,c,d;c=(a)*0.01;d=(b)*0.01;return[c,d];};$pkg.VirtualGridToWorldPos=AA;AB=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=AB;AC=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=AC;AD=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=AC(a,b,c,d,e,f,g,h,i,j);l=k[0];m=k[1];return Z(l,m);};$pkg.PolygonColliderBLToVirtualGridPos=AD;AE=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=AA(a,b);l=k[0];m=k[1];return AB(l,m,c,d,e,f,g,h,i,j);};$pkg.VirtualGridToPolygonColliderBLPos=AE;AF=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(AQ,0,10);g=b.Check(0,0,new AR([]));if(AS.nil===g){$s=-1;return(f.$ptr||(f.$ptr=new AT(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,AU,true)[1]){}else if($assertType(l,AV,true)[1]){}else{k=true;}if(!k){i++;$s=1;continue;}m=$assertType(j.Shape,AW);o=W(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 AT(function(){return this.$target[0];},function($v){this.$target[0]=$v;},f)));}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,r,s,t,u,$s};return $f;};AG=function(a,b,c,d,e,f){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;g=T(c.Id,e,f);h=T(c.Id-1>>0,e,f);if(0>=g){return[-2,false,0,0];}i=$assertType(d.GetByFrameId(g),AX).InputList;j=AY.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(!(AY.nil===j)){x=U((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=(z=S[$Int32.keyFor(a.CharacterState)],z!==undefined?[z.v,true]:[false,false]);aa=y[1];if(!aa){k=true;}}ab=-1;if(n.BtnALevel>u){if(a.InAir){ab=1;}else{ab=0;}ac=0;ad=0;q=ac;r=ad;}return[ab,k,q,r];};AH=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,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});$s=$s||0;s:while(true){switch($s){case 0:h=b.PlayersArr.$length;i=$makeSlice(AZ,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,0,m.Removed,m.Score,0,m.FramesToRecover-1>>0,m.FramesInChState+1>>0,m.Hp,m.MaxHp,m.CharacterState,true));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;}k++;}n=$makeSlice(BA,0,b.MeleeBullets.$length);o=$makeSlice(AQ,h);p=$makeSlice(BB,h);q=$makeSlice(BC,h);r=b.PlayersArr;s=0;while(true){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=AG(v,x,b,a,8,2);z=y[0];aa=y[1];ab=y[2];ac=y[3];if(-2===z){s++;continue;}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;if(!((-1===z))){ae=(af=w.PatternIdToSkillId[$Int.keyFor(z)],af!==undefined?[af.v,true]:[0,false]);ag=ae[0];ah=ae[1];if(ah){aj=(ai=R[$Int.keyFor(ag)],ai!==undefined?ai.v:BD.nil);ak=(al=aj.Hits,(0>=al.$length?($throwRuntimeError("index out of range"),undefined):al.$array[al.$offset+0]));if($assertType(ak,AV,true)[1]){am=ak.$val;t[0]=$clone(am,J);t[0].Bullet.OriginatedRenderFrameId=b.Id;t[0].Bullet.OffenderJoinIndex=ad;n=$append(n,t[0]);x.FramesToRecover=aj.RecoveryFrames;}x.CharacterState=2;if(false===v.InAir){x.VelX=0;}}s++;continue;}if(!((0===ab))||!((0===ac))){an=ab;ao=ac;x.DirX=an;x.DirY=ao;x.VelX=$imul(ab,v.Speed);x.CharacterState=1;}else{x.CharacterState=0;x.VelX=0;}s++;}ap=b.PlayersArr;aq=0;case 1:if(!(aq=ap.$length)?($throwRuntimeError("index out of range"),undefined):ap.$array[ap.$offset+aq]);at=as.JoinIndex;au=0;av=0;(aw=at-1>>0,((aw<0||aw>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+aw])).X=au;(ax=at-1>>0,((ax<0||ax>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+ax])).Y=av;ay=131072+at>>0;ba=(az=d[$Int32.keyFor(ay)],az!==undefined?az.v:BE.nil);bb=((ar<0||ar>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+ar]);bc=((ar<0||ar>=g.$length)?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+ar]);bd=as.VirtualGridX+as.VelX>>0;be=as.VirtualGridY+as.VelY>>0;bf=bd;bg=be;if(((ar<0||ar>=q.$length)?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+ar])){bg=bg+(bc.JumpingInitVelY)>>0;}bh=AE(bf,bg,ba.W*0.5,ba.H*0.5,0,0,0,0,e,f);ba.X=bh[0];ba.Y=bh[1];$r=ba.Update();$s=3;case 3:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}if(as.InAir){bb.VelX=bb.VelX+(0)>>0;bb.VelY=bb.VelY+(-50)>>0;}aq++;$s=1;continue;case 2:bi=$makeSlice(BF,0,b.MeleeBullets.$length);bj=b.MeleeBullets;bk=0;case 4:if(!(bk=bj.$length)?($throwRuntimeError("index out of range"),undefined):bj.$array[bj.$offset+bk]);if(((bl.Bullet.OriginatedRenderFrameId+bl.Bullet.StartupFrames>>0)<=b.Id)&&(((bl.Bullet.OriginatedRenderFrameId+bl.Bullet.StartupFrames>>0)+bl.Bullet.ActiveFrames>>0)>b.Id)){$s=6;continue;}$s=7;continue;case 6:bo=(bm=b.PlayersArr,bn=bl.Bullet.OffenderJoinIndex-1>>0,((bn<0||bn>=bm.$length)?($throwRuntimeError("index out of range"),undefined):bm.$array[bm.$offset+bn]));bp=1;if(0>bo.DirX){bp=-bp;}bq=AA(bo.VirtualGridX+($imul(bp,bl.Bullet.HitboxOffsetX))>>0,bo.VirtualGridY);br=bq[0];bs=bq[1];bt=AA(bl.Bullet.HitboxSizeX,bl.Bullet.HitboxSizeY);bu=bt[0];bv=bt[1];bw=AI(br,bs,bu,bv,0.1,0.1,0.1,0.1,e,f,bl,"MeleeBullet");$s=9;case 9:if($c){$c=false;bw=bw.$blk();}if(bw&&bw.$blk!==undefined){break s;}bx=bw;$r=c.Add(new BF([bx]));$s=10;case 10:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}bi=$append(bi,bx);$s=8;continue;case 7:n=$append(n,bl);case 8:bk++;$s=4;continue;case 5:by=b.PlayersArr;bz=0;case 11:if(!(bz=by.$length)?($throwRuntimeError("index out of range"),undefined):by.$array[by.$offset+bz]);cc=cb.JoinIndex;cd=131072+cc>>0;cf=(ce=d[$Int32.keyFor(cd)],ce!==undefined?ce.v:BE.nil);cg=$assertType(cf.Shape,AW);ci=AF(cc,cf,cg,0.1,(ch=cc-1>>0,((ch<0||ch>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+ch])));$s=13;case 13:if($c){$c=false;ci=ci.$blk();}if(ci&&ci.$blk!==undefined){break s;}(cj=cc-1>>0,((cj<0||cj>=p.$length)?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+cj]=ci));ck=((ca<0||ca>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+ca]);cl=((ca<0||ca>=g.$length)?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+ca]);cm=false;cn=cf.Check(0,0,new AR([]));if(!(AS.nil===cn)){$s=14;continue;}$s=15;continue;case 14:co=cn.Objects;cp=0;case 16:if(!(cp=co.$length)?($throwRuntimeError("index out of range"),undefined):co.$array[co.$offset+cp]);cr=false;cs=false;ct=false;cu=cr;cv=cs;cw=ct;cx=cq.Data;if($assertType(cx,AU,true)[1]){cv=true;}else if($assertType(cx,AV,true)[1]){cw=true;}else{cu=true;}if(cw){cp++;$s=16;continue;}cy=$assertType(cq.Shape,AW);da=W(0,0,cg,cy);$s=18;case 18:if($c){$c=false;da=da.$blk();}if(da&&da.$blk!==undefined){break s;}cz=da;db=cz[0];dc=cz[1];dd=cz[2];de=cz[3];if(!db){cp++;$s=16;continue;}df=de.OverlapX*0+de.OverlapY*-1;if(cv){dg=(de.Overlap-0.2)*de.OverlapX;dh=(de.Overlap-0.2)*de.OverlapY;dc=dg;dd=dh;}di=(dj=cc-1>>0,((dj<0||dj>=p.$length)?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+dj])).$get();dk=0;while(true){if(!(dk=di.$length)?($throwRuntimeError("index out of range"),undefined):di.$array[di.$offset+dk]),C);dm=dc*dl.X+dd*dl.Y;if(cu||(cv&&0>dm)){dc=dc-(dm*dl.X);dd=dd-(dm*dl.Y);}dk++;}dn=cc-1>>0;((dn<0||dn>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+dn]).X=((dn<0||dn>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+dn]).X+(dc);dp=cc-1>>0;((dp<0||dp>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+dp]).Y=((dp<0||dp>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+dp]).Y+(dd);if(0.5=cb.VelY){ck.VelX=0;ck.VelY=0;if(8===ck.CharacterState){ck.CharacterState=9;ck.FramesToRecover=cl.LayDownFramesToRecover;}else{ck.CharacterState=0;ck.FramesToRecover=0;}}else{if(9===ck.CharacterState){if(0===ck.FramesToRecover){ck.CharacterState=10;ck.FramesToRecover=cl.GetUpFramesToRecover;}}else if(10===ck.CharacterState){if(ck.FramesInChState===cl.GetUpFrames){ck.CharacterState=0;}}}}bz++;$s=11;continue;case 12:dq=bi;dr=0;case 19:if(!(dr=dq.$length)?($throwRuntimeError("index out of range"),undefined):dq.$array[dq.$offset+dr]);dt=ds.Check(0,0,new AR([]));ds.Space.Remove(new BF([ds]));du=ds.Data;if($assertType(du,AV,true)[1]){$s=21;continue;}$s=22;continue;case 21:dv=du.$val;if(AS.nil===dt){n=$append(n,dv);dr++;$s=19;continue;}dw=$assertType(ds.Shape,AW);dz=(dx=b.PlayersArr,dy=dv.Bullet.OffenderJoinIndex-1>>0,((dy<0||dy>=dx.$length)?($throwRuntimeError("index out of range"),undefined):dx.$array[dx.$offset+dy]));ea=dt.Objects;eb=0;case 23:if(!(eb=ea.$length)?($throwRuntimeError("index out of range"),undefined):ea.$array[ea.$offset+eb]);ed=$assertType(ec.Shape,AW);ee=ec.Data;if($assertType(ee,AU,true)[1]){$s=25;continue;}$s=26;continue;case 25:ef=ee.$val;if(dv.Bullet.OffenderJoinIndex===ef.JoinIndex){eb++;$s=23;continue;}ei=W(0,0,dw,ed);$s=28;case 28:if($c){$c=false;ei=ei.$blk();}if(ei&&ei.$blk!==undefined){break s;}eh=ei;ej=eh[0];if(!ej){eb++;$s=23;continue;}ek=ef.JoinIndex;el=1;if(0>dz.DirX){el=-el;}em=AA($imul(-el,dv.Bullet.PushbackX),dv.Bullet.PushbackY);en=em[0];eo=em[1];ep=(eq=ek-1>>0,((eq<0||eq>=p.$length)?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+eq])).$get();er=0;while(true){if(!(er=ep.$length)?($throwRuntimeError("index out of range"),undefined):ep.$array[ep.$offset+er]),C);et=en*es.X+eo*es.Y;if(0>et){en=en-(et*es.X);eo=eo-(et*es.Y);}er++;}eu=ek-1>>0;((eu<0||eu>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+eu]).X=((eu<0||eu>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+eu]).X+(en);ev=ek-1>>0;((ev<0||ev>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+ev]).Y=((ev<0||ev>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+ev]).Y+(eo);ex=(ew=ef.JoinIndex-1>>0,((ew<0||ew>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+ew]));if(dv.Bullet.BlowUp){ex.CharacterState=8;}else{ex.CharacterState=3;}ez=(ey=ef.JoinIndex-1>>0,((ey<0||ey>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+ey])).FramesToRecover;if(dv.Bullet.HitStunFrames>ez){ex.FramesToRecover=dv.Bullet.HitStunFrames;}$s=27;continue;case 26:eg=ee;case 27:eb++;$s=23;continue;case 24:case 22:dr++;$s=19;continue;case 20:fa=b.PlayersArr;fb=0;while(true){if(!(fb=fa.$length)?($throwRuntimeError("index out of range"),undefined):fa.$array[fa.$offset+fb]);fe=fd.JoinIndex;ff=131072+fe>>0;fh=(fg=d[$Int32.keyFor(ff)],fg!==undefined?fg.v:BE.nil);fi=((fc<0||fc>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+fc]);fj=AD(fh.X-(fk=fe-1>>0,((fk<0||fk>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+fk])).X,fh.Y-(fl=fe-1>>0,((fl<0||fl>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+fl])).Y,fh.W*0.5,fh.H*0.5,0,0,0,0,e,f);fi.VirtualGridX=fj[0];fi.VirtualGridY=fj[1];if(fi.InAir){fm=fi.CharacterState;fn=fm;if((fn===(0))||(fn===(1))){if(((fc<0||fc>=q.$length)?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+fc])||(5===fd.CharacterState)){fi.CharacterState=5;}else{fi.CharacterState=4;}}else if(fn===(2)){fi.CharacterState=6;}else if(fn===(3)){fi.CharacterState=7;}}if(!((fi.CharacterState===fd.CharacterState))){fi.FramesInChState=0;}fb++;}$s=-1;return new M.ptr(b.Id+1>>0,i,new $Int64(0,0),n,BH.nil,new $Uint64(0,0),false,false);}return;}var $f={$blk:AH,$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,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=AH;AI=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=AB(a,b,c*0.5,d*0.5,e,f,g,h,i,j);n=m[0];o=m[1];p=AJ(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:AI,$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=AI;AJ=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 AR([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:AJ,$c:true,$r,a,b,c,d,e,f,g,h,$s};return $f;};AK=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=AL(a);g=0;h=0;i=g;j=h;k=B.NewConvexPolygon(BI.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 BI([v.X,v.Y]));t=t+(1)>>0;}w=B.NewObject(f.Anchor.X+b,f.Anchor.Y+c,i,j,new AR([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:AK,$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=AK;AL=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=AL;BN.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:BJ,tag:""},{prop:"Points",name:"Points",embedded:false,exported:true,typ:BK,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:"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:""}]);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:BL,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:"PushbackX",name:"PushbackX",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"PushbackY",name:"PushbackY",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:""}]);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:"Hits",name:"Hits",embedded:false,exported:true,typ:AM,tag:""}]);M.init("",[{prop:"Id",name:"Id",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"PlayersArr",name:"PlayersArr",embedded:false,exported:true,typ:AZ,tag:""},{prop:"CountdownNanos",name:"CountdownNanos",embedded:false,exported:true,typ:$Int64,tag:""},{prop:"MeleeBullets",name:"MeleeBullets",embedded:false,exported:true,typ:BA,tag:""},{prop:"FireballBullets",name:"FireballBullets",embedded:false,exported:true,typ:BH,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:BM,tag:""}]);N.init("",[{prop:"InputFrameId",name:"InputFrameId",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"InputList",name:"InputList",embedded:false,exported:true,typ:AY,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:AM,tag:""}]);Q.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:"GetUpFrames",name:"GetUpFrames",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"GetUpFramesToRecover",name:"GetUpFramesToRecover",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"JumpingInitVelY",name:"JumpingInitVelY",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"PatternIdToSkillId",name:"PatternIdToSkillId",embedded:false,exported:true,typ:BM,tag:""}]);V.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.Characters=$makeMap($Int.keyFor,[{k:0,v:new Q.ptr(0,"MonkGirl",11,1,16,16,33,30,800,$makeMap($Int.keyFor,[{k:0,v:1},{k:1,v:2}]))}]);R=$makeMap($Int.keyFor,[{k:1,v:new L.ptr(0,34,34,34,1,new AM([new J.ptr(new I.ptr(0,0,5,0,0,10,18,9,800,0,5,0,0,1200,0,2400,3200,false))]))},{k:2,v:new L.ptr(0,34,34,34,1,new AM([new J.ptr(new I.ptr(0,0,3,0,0,20,18,9,600,0,5,0,0,1200,0,3200,2400,false))]))}]);$pkg.DIRECTION_DECODER=new AO([new AN([0,0]),new AN([0,2]),new AN([0,-2]),new AN([2,0]),new AN([-2,0]),new AN([1,1]),new AN([-1,-1]),new AN([1,-1]),new AN([-1,1])]);S=$makeMap($Int32.keyFor,[{k:4,v:true},{k:5,v:true},{k:6,v:true},{k:7,v:true},{k:8,v:true}]);}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,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,AY,AZ,BA,BB,BC,BD,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R;A=$packages["github.com/gopherjs/gopherjs/js"];B=$packages["jsexport/battle"];C=$packages["resolv"];S=$sliceType($Uint64);T=$ptrType(B.Vec2D);U=$sliceType(T);V=$ptrType(B.Polygon2D);W=$ptrType(B.PlayerDownsync);X=$sliceType(W);Y=$ptrType(B.MeleeBullet);Z=$sliceType(Y);AA=$ptrType(B.FireballBullet);AB=$sliceType(AA);AC=$ptrType(A.Object);AD=$sliceType(AC);AE=$ptrType(B.CharacterConfig);AF=$funcType([$Float64,$Float64],[AC],false);AG=$funcType([T,U],[AC],false);AH=$funcType([V],[AC],false);AI=$funcType([$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Bool,$Float64],[AC],false);AJ=$funcType([$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Bool],[AC],false);AK=$funcType([$Int32,X,Z],[AC],false);AL=$funcType([$Int,$Int,$Int,$Int],[AC],false);AM=$funcType([$Int32,S,$Uint64],[AC],false);AN=$funcType([$Int32],[AC],false);AO=$funcType([$Float64,$Float64,$Float64,$Float64,$Float64,$Float64,$emptyInterface,$String],[AC],false);AP=$funcType([V,$Float64,$Float64,$emptyInterface,$String],[AC],false);AQ=$ptrType(C.Space);AR=$funcType([AQ],[AD],false);AS=$funcType([$Float64,$Float64,$Float64,$Float64,$Float64,$Float64,$Float64,$Float64,$Float64,$Float64],[$Float64,$Float64],false);AT=$funcType([$Float64,$Float64],[$Int32,$Int32],false);AU=$funcType([$Int32,$Int32],[$Float64,$Float64],false);AV=$sliceType($Int);AW=$funcType([AV],[AD],false);AX=$ptrType(B.RingBuffer);AY=$ptrType(B.RoomDownsyncFrame);AZ=$ptrType(C.Object);BA=$mapType($Int32,AZ);BB=$sliceType(AE);BC=$funcType([AX,AY,AQ,BA,$Float64,$Float64,BB],[AC],false);BD=$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,q){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q;return A.MakeWrapper(new B.PlayerDownsync.ptr(a,b,c,d,e,f,g,j,k,m,q,false,0,0,h,i,n,o,l,p));};$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,g,h,i,j,k,l,m,n,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,AB.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(AD,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){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)}]),BD);};$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/pbfiles/room_downsync_frame.proto b/frontend/assets/resources/pbfiles/room_downsync_frame.proto index 83df929..f8b58dd 100644 --- a/frontend/assets/resources/pbfiles/room_downsync_frame.proto +++ b/frontend/assets/resources/pbfiles/room_downsync_frame.proto @@ -97,9 +97,9 @@ message MeleeBullet { // for defender int32 hitStunFrames = 9; int32 blockStunFrames = 10; - double pushback = 11; + double pushbackX = 11; + double pushbackY = 12; - int32 releaseTriggerType = 12; // 1: rising-edge, 2: falling-edge int32 damage = 13; int32 offenderJoinIndex = 14; @@ -108,44 +108,28 @@ message MeleeBullet { double hitboxSizeX = 16; double hitboxSizeY = 17; - double selfMoveforwardX = 18; - double selfMoveforwardY = 19; + double selfLockVelX = 18; + double selfLockVelY = 19; + + int32 releaseTriggerType = 999; // 1: rising-edge, 2: falling-edge } 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; + int32 spaceOffsetX = 11; + int32 spaceOffsetY = 12; + int32 collisionMinStep = 13; bool frameDataLoggingEnabled = 999; } diff --git a/frontend/assets/scripts/Map.js b/frontend/assets/scripts/Map.js index e962c68..61c3de1 100644 --- a/frontend/assets/scripts/Map.js +++ b/frontend/assets/scripts/Map.js @@ -315,11 +315,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 @@ -596,7 +592,7 @@ cc.Class({ 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.pushbackX, pbBullet.pushbackY, pbBullet.damage, pbBullet.selfLockVelX, pbBullet.selfLockVelY, pbBullet.hitboxOffsetX, pbBullet.hitboxOffsetY, pbBullet.hitboxSizeX, pbBullet.hitboxSizeY, pbBullet.blowUp); jsMeleeBulletsArr.push(jsBullet); } @@ -638,8 +634,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) + if (null == pbRdf.speciesIdList) { + console.error(`pbRdf.speciesIdList is required for starting or resyncing battle!`); + } self.chConfigsOrderedByJoinIndex = gopkgs.GetCharacterConfigsOrderedByJoinIndex(pbRdf.speciesIdList); - self.playerOpPatternToSkillId = pbRdf.playerOpPatternToSkillId; self._initPlayerRichInfoDict(rdf.PlayersArr); // Show the top status indicators for IN_BATTLE @@ -831,13 +829,10 @@ batchInputFrameIdRange=[${batch[0].inputFrameId}, ${batch[batch.length - 1].inpu const self = this; const newPlayerNode = cc.instantiate(self.controlledCharacterPrefab) const playerScriptIns = newPlayerNode.getComponent("ControlledCharacter"); - if (1 == joinIndex) { - playerScriptIns.setSpecies("SoldierWaterGhost"); - } else if (2 == joinIndex) { - playerScriptIns.setSpecies("UltramanTiga"); - } + const chConfig = self.chConfigsOrderedByJoinIndex[joinIndex - 1]; + playerScriptIns.setSpecies(chConfig.SpeciesName); - 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; @@ -846,17 +841,7 @@ batchInputFrameIdRange=[${batch[0].inputFrameId}, ${batch[batch.length - 1].inpu 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"); + const newPlayerCollider = gopkgs.GenerateRectColliderJs(wx, wy, colliderWidth, colliderHeight, self.spaceOffsetX, self.spaceOffsetY, playerDownsyncInfo, "Player"); self.gopkgsCollisionSys.Add(newPlayerCollider); const collisionPlayerIndex = self.collisionPlayerIndexPrefix + joinIndex; self.gopkgsCollisionSysMap[collisionPlayerIndex] = newPlayerCollider; @@ -1067,7 +1052,7 @@ othersForcedDownsyncRenderFrame=${JSON.stringify(othersForcedDownsyncRenderFrame 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); @@ -1107,7 +1092,7 @@ othersForcedDownsyncRenderFrame=${JSON.stringify(othersForcedDownsyncRenderFrame }; self.rdfIdToActuallyUsedInput.set(currRdf.Id, inputFrameDownsyncClone); } - const nextRdf = gopkgs.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs(self.recentInputCache, currRdf, collisionSys, collisionSysMap, self.spaceOffsetX, self.spaceOffsetY, self.playerOpPatternToSkillId, self.chConfigsOrderedByJoinIndex); + const nextRdf = gopkgs.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs(self.recentInputCache, currRdf, collisionSys, collisionSysMap, self.spaceOffsetX, self.spaceOffsetY, self.chConfigsOrderedByJoinIndex); if (true == isChasing) { // [WARNING] Move the cursor "self.chaserRenderFrameId" when "true == isChasing", keep in mind that "self.chaserRenderFrameId" is not monotonic! @@ -1236,12 +1221,6 @@ 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, diff --git a/frontend/assets/scripts/OfflineMap.js b/frontend/assets/scripts/OfflineMap.js index 3e9f9da..e8892eb 100644 --- a/frontend/assets/scripts/OfflineMap.js +++ b/frontend/assets/scripts/OfflineMap.js @@ -40,24 +40,6 @@ cc.Class({ self.rollbackEstimatedDtNanos = 16666666; self.tooFastDtIntervalMillis = 0.5 * self.rollbackEstimatedDtMillis; - self.worldToVirtualGridRatio = 100; - self.virtualGridToWorldRatio = 1.0 / self.worldToVirtualGridRatio; - - const opJoinIndexPrefix1 = (1 << 8); - const playerOpPatternToSkillId = {}; - playerOpPatternToSkillId[opJoinIndexPrefix1 + 0] = 1; - playerOpPatternToSkillId[opJoinIndexPrefix1 + 1] = 2; - - /* - [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 +68,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; @@ -142,15 +122,18 @@ cc.Class({ self.gopkgsCollisionSysMap[collisionBarrierIndex] = newBarrierCollider; } + const p1Vpos = gopkgs.WorldToVirtualGridPos(boundaryObjs.playerStartingPositions[0].x, boundaryObjs.playerStartingPositions[0].y); + const speedV = gopkgs.WorldToVirtualGridPos(1.0, 0); + const startRdf = window.pb.protos.RoomDownsyncFrame.create({ id: window.MAGIC_ROOM_DOWNSYNC_FRAME_ID.BATTLE_START, playersArr: [ 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, + virtualGridX: p1Vpos[0], + virtualGridY: p1Vpos[1], + speed: speedV[0], colliderRadius: 12, characterState: window.ATK_CHARACTER_STATE.InAirIdle1NoJump[0], framesToRecover: 0, @@ -162,7 +145,6 @@ cc.Class({ }), ], speciesIdList: [0], - playerOpPatternToSkillId: playerOpPatternToSkillId, }); self.selfPlayerInfo = { @@ -208,48 +190,4 @@ cc.Class({ } }, - spawnPlayerNode(joinIndex, vx, vy, playerDownsyncInfo) { - const self = this; - const newPlayerNode = cc.instantiate(self.controlledCharacterPrefab) - const playerScriptIns = newPlayerNode.getComponent("ControlledCharacter"); - if (1 == joinIndex) { - playerScriptIns.setSpecies("MonkGirl"); - } else if (2 == joinIndex) { - playerScriptIns.setSpecies("UltramanTiga"); - } - - const [wx, wy] = self.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}`); - - safelyAddChild(self.node, newPlayerNode); - setLocalZOrder(newPlayerNode, 5); - - newPlayerNode.active = true; - playerScriptIns.updateCharacterAnim(playerDownsyncInfo, null, true); - - return [newPlayerNode, playerScriptIns]; - }, }); diff --git a/jsexport/battle/battle.go b/jsexport/battle/battle.go index f26d8c1..d93b8ca 100644 --- a/jsexport/battle/battle.go +++ b/jsexport/battle/battle.go @@ -20,9 +20,9 @@ const ( GRAVITY_X = int32(0) GRAVITY_Y = -int32(float64(0.5) * WORLD_TO_VIRTUAL_GRID_RATIO) // makes all "playerCollider.Y" a multiple of 0.5 in all cases - INPUT_DELAY_FRAMES = int32(8) - NST_DELAY_FRAMES = int32(16) - INPUT_SCALE_FRAMES = uint32(2) + 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" SNAP_INTO_PLATFORM_OVERLAP = float64(0.1) SNAP_INTO_PLATFORM_THRESHOLD = float64(0.5) @@ -249,18 +249,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 } @@ -272,13 +272,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) } @@ -357,11 +357,11 @@ func deriveOpPattern(currPlayerDownsync, thatPlayerInNextFrame *PlayerDownsync, patternId := PATTERN_ID_NO_OP if decodedInput.BtnALevel > prevBtnALevel { - if currPlayerDownsync.InAir { - patternId = 1 - } else { - patternId = 0 - } + if currPlayerDownsync.InAir { + patternId = 1 + } else { + patternId = 0 + } effDx, effDy = 0, 0 // Most patterns/skills should not allow simultaneous movement } @@ -369,7 +369,7 @@ func deriveOpPattern(currPlayerDownsync, thatPlayerInNextFrame *PlayerDownsync, } // [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, collisionSpaceOffsetX, collisionSpaceOffsetY float64, playerOpPatternToSkillId map[int]int, chConfigsOrderedByJoinIndex []*CharacterConfig) *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) @@ -408,6 +408,7 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer // 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, INPUT_DELAY_FRAMES, INPUT_SCALE_FRAMES) if PATTERN_ID_UNABLE_TO_OP == patternId { @@ -415,19 +416,22 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer } if jumpedOrNot { - thatPlayerInNextFrame.VelY = int32(chConfigsOrderedByJoinIndex[i].JumpingInitVelY) + thatPlayerInNextFrame.VelY = int32(chConfig.JumpingInitVelY) jumpedOrNotList[i] = true } joinIndex := currPlayerDownsync.JoinIndex if PATTERN_ID_NO_OP != patternId { - if skillId, existent := playerOpPatternToSkillId[(int(joinIndex)< 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, VIRTUAL_GRID_TO_WORLD_RATIO) - bulletWx, bulletWy := offenderWx+xfac*meleeBullet.HitboxOffset, offenderWy - newBulletCollider := GenerateRectCollider(bulletWx, bulletWy, meleeBullet.HitboxSizeX, meleeBullet.HitboxSizeY, SNAP_INTO_PLATFORM_OVERLAP, SNAP_INTO_PLATFORM_OVERLAP, SNAP_INTO_PLATFORM_OVERLAP, SNAP_INTO_PLATFORM_OVERLAP, 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 { @@ -497,7 +502,9 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer playerShape := playerCollider.Shape.(*resolv.ConvexPolygon) 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 @@ -547,10 +554,97 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer // fallStopping thatPlayerInNextFrame.VelX = 0 thatPlayerInNextFrame.VelY = 0 - thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_IDLE1 - thatPlayerInNextFrame.FramesToRecover = 0 + if ATK_CHARACTER_STATE_BLOWN_UP1 == thatPlayerInNextFrame.CharacterState { + thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_LAY_DOWN1 + thatPlayerInNextFrame.FramesToRecover = chConfig.LayDownFramesToRecover + } else { + thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_IDLE1 + thatPlayerInNextFrame.FramesToRecover = 0 + } + } else { + // 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 thatPlayerInNextFrame.FramesInChState == chConfig.GetUpFrames { + // [WARNING] Before reaching here, the player had 3 invinsible frames to either attack or jump, if it ever took any action then this condition wouldn't have been met, thus we hereby only transit it back to IDLE as it took no action + thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_IDLE1 + } + } } } + } + + // 5. Check bullet-anything collisions + for _, bulletCollider := range bulletColliders { + collision := bulletCollider.Check(0, 0) + bulletCollider.Space.Remove(bulletCollider) // Make sure that the bulletCollider is always removed for each renderFrame + 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 + } + overlapped, _, _, _ := CalcPushbacks(0, 0, bulletShape, defenderShape) + if !overlapped { + continue + } + joinIndex := t.JoinIndex + xfac := int32(1) // By now, straight Punch offset doesn't respect "y-axis" + if 0 > offender.DirX { + xfac = -xfac + } + pushbackX, pushbackY := VirtualGridToWorldPos(-xfac*v.PushbackX, v.PushbackY) + + 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 + } + } + + effPushbacks[joinIndex-1].X += pushbackX + effPushbacks[joinIndex-1].Y += pushbackY + atkedPlayerInNextFrame := nextRenderFramePlayers[t.JoinIndex-1] + 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: + } + } + } + } + + // 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] + // 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) + + // Update "CharacterState" if thatPlayerInNextFrame.InAir { oldNextCharacterState := thatPlayerInNextFrame.CharacterState switch oldNextCharacterState { @@ -566,70 +660,6 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_INAIR_ATKED1 } } - } - - // 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 - } - } - - 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: - } - } - } - - // 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] - // 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, WORLD_TO_VIRTUAL_GRID_RATIO) if thatPlayerInNextFrame.CharacterState != currPlayerDownsync.CharacterState { thatPlayerInNextFrame.FramesInChState = 0 } diff --git a/jsexport/battle/characterConfig.go b/jsexport/battle/characterConfig.go index 631a575..b90ca92 100644 --- a/jsexport/battle/characterConfig.go +++ b/jsexport/battle/characterConfig.go @@ -1,5 +1,23 @@ package battle +type CharacterConfig struct { + SpeciesId int + SpeciesName string + + InAirIdleFrameIdxTurningPoint int + InAirIdleFrameIdxTurnedCycle int + + LayDownFrames int32 + LayDownFramesToRecover int32 + + GetUpFrames int32 + GetUpFramesToRecover int32 + + JumpingInitVelY int32 + + PatternIdToSkillId map[int]int +} + var Characters = map[int]*CharacterConfig{ 0: &CharacterConfig{ SpeciesId: 0, @@ -8,13 +26,13 @@ var Characters = map[int]*CharacterConfig{ InAirIdleFrameIdxTurningPoint: 11, InAirIdleFrameIdxTurnedCycle: 1, - LayDownFrames: 16, - LayDownFramesToRecover: 16, + LayDownFrames: int32(16), + LayDownFramesToRecover: int32(16), - GetUpFrames: 33, - GetUpFramesToRecover: 30, // 3 invinsible frames for just-blown-up character to make a comeback + GetUpFrames: int32(33), + GetUpFramesToRecover: int32(30), // 3 invinsible frames for just-blown-up character to make a comeback - JumpingInitVelY: int(float64(8) * WORLD_TO_VIRTUAL_GRID_RATIO), + JumpingInitVelY: int32(float64(8) * WORLD_TO_VIRTUAL_GRID_RATIO), PatternIdToSkillId: map[int]int{ 0: 1, // Atk1 @@ -23,52 +41,51 @@ var Characters = map[int]*CharacterConfig{ }, } -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, +var skills = map[int]*Skill{ + 1: &Skill{ + RecoveryFrames: int32(34), + RecoveryFramesOnBlock: int32(34), + RecoveryFramesOnHit: int32(34), + ReleaseTriggerType: int32(1), + Hits: []interface{}{ + &MeleeBullet{ + Bullet: Bullet{ + StartupFrames: int32(5), + ActiveFrames: int32(10), + HitStunFrames: int32(18), + BlockStunFrames: int32(9), + Damage: int32(5), + PushbackX: int32(float64(8) * WORLD_TO_VIRTUAL_GRID_RATIO), + PushbackY: 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), + }, + }, }, }, - 2: &MeleeBullet{ - Bullet: Bullet{ - // for offender - StartupFrames: int32(3), - ActiveFrames: int32(20), - RecoveryFrames: int32(34), - RecoveryFramesOnBlock: int32(34), - RecoveryFramesOnHit: int32(34), - HitboxOffset: float64(16.0), // should be about the radius of the PlayerCollider - - // for defender - HitStunFrames: int32(18), - BlockStunFrames: int32(9), - Pushback: float64(6.0), - BlowUpVelY: int32(float64(3) * WORLD_TO_VIRTUAL_GRID_RATIO), - ReleaseTriggerType: int32(1), // 1: rising-edge, 2: falling-edge - Damage: int32(5), - - SelfMoveforwardX: 0, - SelfMoveforwardY: 0, - HitboxSizeX: 32.0, - HitboxSizeY: 24.0, + 2: &Skill{ + RecoveryFrames: int32(34), + RecoveryFramesOnBlock: int32(34), + RecoveryFramesOnHit: int32(34), + ReleaseTriggerType: int32(1), + Hits: []interface{}{ + &MeleeBullet{ + Bullet: Bullet{ + StartupFrames: int32(3), + ActiveFrames: int32(20), + HitStunFrames: int32(18), + BlockStunFrames: int32(9), + Damage: int32(5), + PushbackX: int32(float64(6) * WORLD_TO_VIRTUAL_GRID_RATIO), + PushbackY: 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 ca047cd..76e2057 100644 --- a/jsexport/battle/room_downsync_frame.go +++ b/jsexport/battle/room_downsync_frame.go @@ -53,30 +53,29 @@ 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 + HitStunFrames int32 + BlockStunFrames int32 + PushbackX int32 + PushbackY int32 + Damage int32 - SelfMoveforwardX float64 - SelfMoveforwardY float64 - HitboxSizeX float64 - HitboxSizeY float64 + SelfLockVelX int32 + SelfLockVelY int32 - BlowUpVelY int32 + HitboxOffsetX int32 + HitboxOffsetY int32 + HitboxSizeX int32 + HitboxSizeY int32 + + BlowUp bool } type MeleeBullet struct { @@ -95,7 +94,12 @@ type FireballBullet struct { } type Skill struct { - Hits []Bullet // Hits within a "Skill" are automatically triggered + BattleLocalId int32 + RecoveryFrames int32 + RecoveryFramesOnBlock int32 + RecoveryFramesOnHit int32 + ReleaseTriggerType int32 // 1: rising-edge, 2: falling-edge + Hits []interface{} // Hits within a "Skill" are automatically triggered } type RoomDownsyncFrame struct { @@ -114,21 +118,3 @@ type InputFrameDownsync struct { InputList []uint64 ConfirmedList uint64 } - -type CharacterConfig struct { - SpeciesId int - SpeciesName string - - InAirIdleFrameIdxTurningPoint int - InAirIdleFrameIdxTurnedCycle int - - LayDownFrames int - LayDownFramesToRecover int - - GetUpFrames int - GetUpFramesToRecover int - - JumpingInitVelY int - - PatternIdToSkillId map[int]int -} diff --git a/jsexport/main.go b/jsexport/main.go index c8770eb..cc9d9da 100644 --- a/jsexport/main.go +++ b/jsexport/main.go @@ -64,29 +64,32 @@ func NewPlayerDownsyncJs(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, }) } -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, pushbackX, pushbackY, 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, + PushbackX: pushbackX, + PushbackY: pushbackY, + Damage: damage, + + SelfLockVelX: selfLockVelX, + SelfLockVelY: selfLockVelY, + + HitboxOffsetX: hitboxOffsetX, + HitboxOffsetY: hitboxOffsetY, + HitboxSizeX: hitboxSizeX, + HitboxSizeY: hitboxSizeY, + + BlowUp: blowUp, }, }) } @@ -110,18 +113,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)) } @@ -138,28 +142,30 @@ func GetCharacterConfigsOrderedByJoinIndex(speciesIdList []int) []*js.Object { return ret } -func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs(inputsBuffer *RingBuffer, currRenderFrame *RoomDownsyncFrame, collisionSys *resolv.Space, collisionSysMap map[int32]*resolv.Object, collisionSpaceOffsetX, collisionSpaceOffsetY float64, playerOpPatternToSkillId map[int]int, chConfigsOrderedByJoinIndex []*CharacterConfig) *js.Object { +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, collisionSpaceOffsetX, collisionSpaceOffsetY, playerOpPatternToSkillId, chConfigsOrderedByJoinIndex)) + 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, - "GetCharacterConfigsOrderedByJoinIndex": GetCharacterConfigsOrderedByJoinIndex, - "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, }) } From 325dbfb79cbffceb9f21bb8879c3874556550679 Mon Sep 17 00:00:00 2001 From: genxium Date: Sun, 1 Jan 2023 20:18:35 +0800 Subject: [PATCH 03/10] A temp broken commit except for OfflineMap - drafted basic cancellable skills. --- frontend/assets/plugin_scripts/jsexport.js | 6201 ++++++++++++++++- .../resources/animation/MonkGirl/Atk1.anim | 10 +- .../resources/animation/MonkGirl/Atk2.anim | 79 + .../animation/MonkGirl/Atk2.anim.meta | 5 + .../resources/animation/MonkGirl/Atk3.anim | 85 + .../animation/MonkGirl/Atk3.anim.meta | 5 + .../animation/MonkGirl/MonkGirl.plist | 551 +- .../animation/MonkGirl/MonkGirl.plist.meta | 852 ++- .../resources/animation/MonkGirl/MonkGirl.png | Bin 76232 -> 95461 bytes frontend/assets/resources/map/dungeon/map.tmx | 4 +- .../prefabs/ControlledCharacter.prefab | 8 +- frontend/assets/scripts/AttackingCharacter.js | 2 + frontend/assets/scripts/Map.js | 15 +- frontend/assets/scripts/OfflineMap.js | 23 +- jsexport/battle/battle.go | 134 +- jsexport/battle/characterConfig.go | 90 +- jsexport/battle/room_downsync_frame.go | 9 +- jsexport/main.go | 8 +- 18 files changed, 7682 insertions(+), 399 deletions(-) create mode 100644 frontend/assets/resources/animation/MonkGirl/Atk2.anim create mode 100644 frontend/assets/resources/animation/MonkGirl/Atk2.anim.meta create mode 100644 frontend/assets/resources/animation/MonkGirl/Atk3.anim create mode 100644 frontend/assets/resources/animation/MonkGirl/Atk3.anim.meta diff --git a/frontend/assets/plugin_scripts/jsexport.js b/frontend/assets/plugin_scripts/jsexport.js index a973b99..601ee24 100644 --- a/frontend/assets/plugin_scripts/jsexport.js +++ b/frontend/assets/plugin_scripts/jsexport.js @@ -2,15 +2,6200 @@ (function() { var $goVersion = "go1.18.6"; -Error.stackTraceLimit=1/0;var $global,$module,$NaN=NaN;if("undefined"!=typeof window?$global=window:"undefined"!=typeof self?$global=self:"undefined"!=typeof global?($global=global).require=require:$global=this,void 0===$global||void 0===$global.Array)throw new Error("no global object found");if("undefined"!=typeof module&&($module=module),!$global.fs&&$global.require)try{var fs=$global.require("fs");"object"==typeof fs&&null!==fs&&0!==Object.keys(fs).length&&($global.fs=fs)}catch(e){}if(!$global.fs){var outputBuf="",decoder=new TextDecoder("utf-8");$global.fs={constants:{O_WRONLY:-1,O_RDWR:-1,O_CREAT:-1,O_TRUNC:-1,O_APPEND:-1,O_EXCL:-1},writeSync:function(e,n){var r=(outputBuf+=decoder.decode(n)).lastIndexOf("\n");return-1!=r&&(console.log(outputBuf.substr(0,r)),outputBuf=outputBuf.substr(r+1)),n.length},write:function(e,n,r,t,i,a){0===r&&t===n.length&&null===i?a(null,this.writeSync(e,n)):a(enosys())}}}var $throwRuntimeError,$linknames={},$packages={},$idCounter=0,$keys=function(e){return e?Object.keys(e):[]},$flushConsole=function(){},$throwNilPointerError=function(){$throwRuntimeError("invalid memory address or nil pointer dereference")},$call=function(e,n,r){return e.apply(n,r)},$makeFunc=function(e){return function(){return $externalize(e(this,new($sliceType($jsObjectPtr))($global.Array.prototype.slice.call(arguments,[]))),$emptyInterface)}},$unused=function(e){},$print=console.log;if(void 0!==$global.process&&$global.require)try{var util=$global.require("util");$print=function(){$global.process.stderr.write(util.format.apply(this,arguments))}}catch(e){}var $println=console.log,$initAllLinknames=function(){for(var e=$keys($packages),n=0;ne.$capacity||t>e.$capacity)&&$throwRuntimeError("slice bounds out of range"),e===e.constructor.nil)return e;var i=new e.constructor(e.$array);return i.$offset=e.$offset+n,i.$length=r-n,i.$capacity=t-n,i},$substring=function(e,n,r){return(n<0||re.length)&&$throwRuntimeError("slice bounds out of range"),e.substring(n,r)},$sliceToNativeArray=function(e){return e.$array.constructor!==Array?e.$array.subarray(e.$offset,e.$offset+e.$length):e.$array.slice(e.$offset,e.$offset+e.$length)},$sliceToGoArray=function(e,n){var r=n.elem;return void 0!==r&&e.$length1114111||55296<=e&&e<=57343)&&(e=65533),e<=127?String.fromCharCode(e):e<=2047?String.fromCharCode(192|e>>6,128|63&e):e<=65535?String.fromCharCode(224|e>>12,128|e>>6&63,128|63&e):String.fromCharCode(240|e>>18,128|e>>12&63,128|e>>6&63,128|63&e)},$stringToBytes=function(e){for(var n=new Uint8Array(e.length),r=0;rt){for(var o=i-1;o>=0;o--)a.copy(e[r+o],n[t+o]);return}for(o=0;ot)for(o=i-1;o>=0;o--)e[r+o]=n[t+o];else for(o=0;oc)if(a=0,c=Math.max(o,e.$capacity<1024?2*e.$capacity:Math.floor(5*e.$capacity/4)),e.$array.constructor===Array){(i=e.$array.slice(e.$offset,e.$offset+e.$length)).length=c;for(var $=e.constructor.elem.zero,u=e.$length;u>>16&65535)*t+r*(n>>>16&65535)<<16>>>0)>>0},$floatKey=function(e){return e!=e?"NaN$"+ ++$idCounter:String(e)},$flatten64=function(e){return 4294967296*e.$high+e.$low},$shiftLeft64=function(e,n){return 0===n?e:n<32?new e.constructor(e.$high<>>32-n,e.$low<>>0):n<64?new e.constructor(e.$low<>n,(e.$low>>>n|e.$high<<32-n)>>>0):n<64?new e.constructor(e.$high>>31,e.$high>>n-32>>>0):e.$high<0?new e.constructor(-1,4294967295):new e.constructor(0,0)},$shiftRightUint64=function(e,n){return 0===n?e:n<32?new e.constructor(e.$high>>>n,(e.$low>>>n|e.$high<<32-n)>>>0):n<64?new e.constructor(0,e.$high>>>n-32):new e.constructor(0,0)},$mul64=function(e,n){var r=e.$high>>>16,t=65535&e.$high,i=e.$low>>>16,a=65535&e.$low,o=n.$high>>>16,c=65535&n.$high,$=n.$low>>>16,u=65535&n.$low,l=0,s=0,f=0,d=0;f+=(d+=a*u)>>>16,s+=(f+=i*u)>>>16,f&=65535,s+=(f+=a*$)>>>16,l+=(s+=t*u)>>>16,s&=65535,l+=(s+=i*$)>>>16,s&=65535,l+=(s+=a*c)>>>16,l+=r*u+t*$+i*c+a*o;var p=((l&=65535)<<16|(s&=65535))>>>0,h=((f&=65535)<<16|(d&=65535))>>>0;return new e.constructor(p,h)},$div64=function(e,n,r){0===n.$high&&0===n.$low&&$throwRuntimeError("integer divide by zero");var t=1,i=1,a=e.$high,o=e.$low;a<0&&(t=-1,i=-1,a=-a,0!==o&&(a--,o=4294967296-o));var c=n.$high,$=n.$low;n.$high<0&&(t*=-1,c=-c,0!==$&&(c--,$=4294967296-$));for(var u=0,l=0,s=0;c<2147483648&&(a>c||a===c&&o>$);)c=(c<<1|$>>>31)>>>0,$=$<<1>>>0,s++;for(var f=0;f<=s;f++)u=u<<1|l>>>31,l=l<<1>>>0,(a>c||a===c&&o>=$)&&(a-=c,(o-=$)<0&&(a--,o+=4294967296),4294967296===++l&&(u++,l=0)),$=($>>>1|c<<31)>>>0,c>>>=1;return r?new e.constructor(a*i,o*i):new e.constructor(u*t,l*t)},$divComplex=function(e,n){var r=e.$real===1/0||e.$real===-1/0||e.$imag===1/0||e.$imag===-1/0,t=n.$real===1/0||n.$real===-1/0||n.$imag===1/0||n.$imag===-1/0,i=!r&&(e.$real!=e.$real||e.$imag!=e.$imag),a=!t&&(n.$real!=n.$real||n.$imag!=n.$imag);if(i||a)return new e.constructor(NaN,NaN);if(r&&!t)return new e.constructor(1/0,1/0);if(!r&&t)return new e.constructor(0,0);if(0===n.$real&&0===n.$imag)return 0===e.$real&&0===e.$imag?new e.constructor(NaN,NaN):new e.constructor(1/0,1/0);if(Math.abs(n.$real)<=Math.abs(n.$imag)){var o=n.$real/n.$imag,c=n.$real*o+n.$imag;return new e.constructor((e.$real*o+e.$imag)/c,(e.$imag*o-e.$real)/c)}o=n.$imag/n.$real,c=n.$imag*o+n.$real;return new e.constructor((e.$imag*o+e.$real)/c,(e.$imag-e.$real*o)/c)},$kindBool=1,$kindInt=2,$kindInt8=3,$kindInt16=4,$kindInt32=5,$kindInt64=6,$kindUint=7,$kindUint8=8,$kindUint16=9,$kindUint32=10,$kindUint64=11,$kindUintptr=12,$kindFloat32=13,$kindFloat64=14,$kindComplex64=15,$kindComplex128=16,$kindArray=17,$kindChan=18,$kindFunc=19,$kindInterface=20,$kindMap=21,$kindPtr=22,$kindSlice=23,$kindString=24,$kindStruct=25,$kindUnsafePointer=26,$methodSynthesizers=[],$addMethodSynthesizer=function(e){null!==$methodSynthesizers?$methodSynthesizers.push(e):e()},$synthesizeMethods=function(){$methodSynthesizers.forEach(function(e){e()}),$methodSynthesizers=null},$ifaceKeyFor=function(e){if(e===$ifaceNil)return"nil";var n=e.constructor;return n.string+"$"+n.keyFor(e.$val)},$identity=function(e){return e},$typeIDCounter=0,$idKey=function(e){return void 0===e.$id&&($idCounter++,e.$id=$idCounter),String(e.$id)},$arrayPtrCtor=function(){return function(e){this.$get=function(){return e},this.$set=function(e){typ.copy(this,e)},this.$val=e}},$newType=function(e,n,r,t,i,a,o){var c;switch(n){case $kindBool:case $kindInt:case $kindInt8:case $kindInt16:case $kindInt32:case $kindUint:case $kindUint8:case $kindUint16:case $kindUint32:case $kindUintptr:case $kindUnsafePointer:(c=function(e){this.$val=e}).wrapped=!0,c.keyFor=$identity;break;case $kindString:(c=function(e){this.$val=e}).wrapped=!0,c.keyFor=function(e){return"$"+e};break;case $kindFloat32:case $kindFloat64:(c=function(e){this.$val=e}).wrapped=!0,c.keyFor=function(e){return $floatKey(e)};break;case $kindInt64:(c=function(e,n){this.$high=e+Math.floor(Math.ceil(n)/4294967296)>>0,this.$low=n>>>0,this.$val=this}).keyFor=function(e){return e.$high+"$"+e.$low};break;case $kindUint64:(c=function(e,n){this.$high=e+Math.floor(Math.ceil(n)/4294967296)>>>0,this.$low=n>>>0,this.$val=this}).keyFor=function(e){return e.$high+"$"+e.$low};break;case $kindComplex64:(c=function(e,n){this.$real=$fround(e),this.$imag=$fround(n),this.$val=this}).keyFor=function(e){return e.$real+"$"+e.$imag};break;case $kindComplex128:(c=function(e,n){this.$real=e,this.$imag=n,this.$val=this}).keyFor=function(e){return e.$real+"$"+e.$imag};break;case $kindArray:(c=function(e){this.$val=e}).wrapped=!0,c.ptr=$newType(4,$kindPtr,"*"+r,!1,"",!1,$arrayPtrCtor()),c.init=function(e,n){c.elem=e,c.len=n,c.comparable=e.comparable,c.keyFor=function(n){return Array.prototype.join.call($mapArray(n,function(n){return String(e.keyFor(n)).replace(/\\/g,"\\\\").replace(/\$/g,"\\$")}),"$")},c.copy=function(n,r){$copyArray(n,r,0,0,r.length,e)},c.ptr.init(c),Object.defineProperty(c.ptr.nil,"nilCheck",{get:$throwNilPointerError})};break;case $kindChan:(c=function(e){this.$val=e}).wrapped=!0,c.keyFor=$idKey,c.init=function(e,n,r){c.elem=e,c.sendOnly=n,c.recvOnly=r};break;case $kindFunc:(c=function(e){this.$val=e}).wrapped=!0,c.init=function(e,n,r){c.params=e,c.results=n,c.variadic=r,c.comparable=!1};break;case $kindInterface:(c={implementedBy:{},missingMethodFor:{}}).keyFor=$ifaceKeyFor,c.init=function(e){c.methods=e,e.forEach(function(e){$ifaceNil[e.prop]=$throwNilPointerError})};break;case $kindMap:(c=function(e){this.$val=e}).wrapped=!0,c.init=function(e,n){c.key=e,c.elem=n,c.comparable=!1};break;case $kindPtr:(c=o||function(e,n,r){this.$get=e,this.$set=n,this.$target=r,this.$val=this}).keyFor=$idKey,c.init=function(e){c.elem=e,c.wrapped=e.kind===$kindArray,c.nil=new c($throwNilPointerError,$throwNilPointerError)};break;case $kindSlice:(c=function(e){e.constructor!==c.nativeArray&&(e=new c.nativeArray(e)),this.$array=e,this.$offset=0,this.$length=e.length,this.$capacity=e.length,this.$val=this}).init=function(e){c.elem=e,c.comparable=!1,c.nativeArray=$nativeArray(e.kind),c.nil=new c([])};break;case $kindStruct:(c=function(e){this.$val=e}).wrapped=!0,c.ptr=$newType(4,$kindPtr,"*"+r,!1,i,a,o),c.ptr.elem=c,c.ptr.prototype.$get=function(){return this},c.ptr.prototype.$set=function(e){c.copy(this,e)},c.init=function(e,n){c.pkgPath=e,c.fields=n,n.forEach(function(e){e.typ.comparable||(c.comparable=!1)}),c.keyFor=function(e){var r=e.$val;return $mapArray(n,function(e){return String(e.typ.keyFor(r[e.prop])).replace(/\\/g,"\\\\").replace(/\$/g,"\\$")}).join("$")},c.copy=function(e,r){for(var t=0;t0;){var a=[],o=[];t.forEach(function(e){if(!i[e.typ.string])switch(i[e.typ.string]=!0,e.typ.named&&(o=o.concat(e.typ.methods),e.indirect&&(o=o.concat($ptrType(e.typ).methods))),e.typ.kind){case $kindStruct:e.typ.fields.forEach(function(n){if(n.embedded){var r=n.typ,t=r.kind===$kindPtr;a.push({typ:t?r.elem:r,indirect:e.indirect||t})}});break;case $kindInterface:o=o.concat(e.typ.methods)}}),o.forEach(function(e){void 0===n[e.name]&&(n[e.name]=e)}),t=a}return e.methodSetCache=[],Object.keys(n).sort().forEach(function(r){e.methodSetCache.push(n[r])}),e.methodSetCache},$Bool=$newType(1,$kindBool,"bool",!0,"",!1,null),$Int=$newType(4,$kindInt,"int",!0,"",!1,null),$Int8=$newType(1,$kindInt8,"int8",!0,"",!1,null),$Int16=$newType(2,$kindInt16,"int16",!0,"",!1,null),$Int32=$newType(4,$kindInt32,"int32",!0,"",!1,null),$Int64=$newType(8,$kindInt64,"int64",!0,"",!1,null),$Uint=$newType(4,$kindUint,"uint",!0,"",!1,null),$Uint8=$newType(1,$kindUint8,"uint8",!0,"",!1,null),$Uint16=$newType(2,$kindUint16,"uint16",!0,"",!1,null),$Uint32=$newType(4,$kindUint32,"uint32",!0,"",!1,null),$Uint64=$newType(8,$kindUint64,"uint64",!0,"",!1,null),$Uintptr=$newType(4,$kindUintptr,"uintptr",!0,"",!1,null),$Float32=$newType(4,$kindFloat32,"float32",!0,"",!1,null),$Float64=$newType(8,$kindFloat64,"float64",!0,"",!1,null),$Complex64=$newType(8,$kindComplex64,"complex64",!0,"",!1,null),$Complex128=$newType(16,$kindComplex128,"complex128",!0,"",!1,null),$String=$newType(8,$kindString,"string",!0,"",!1,null),$UnsafePointer=$newType(4,$kindUnsafePointer,"unsafe.Pointer",!0,"unsafe",!1,null),$nativeArray=function(e){switch(e){case $kindInt:return Int32Array;case $kindInt8:return Int8Array;case $kindInt16:return Int16Array;case $kindInt32:return Int32Array;case $kindUint:return Uint32Array;case $kindUint8:return Uint8Array;case $kindUint16:return Uint16Array;case $kindUint32:case $kindUintptr:return Uint32Array;case $kindFloat32:return Float32Array;case $kindFloat64:return Float64Array;default:return Array}},$toNativeArray=function(e,n){var r=$nativeArray(e);return r===Array?n:new r(n)},$arrayTypes={},$arrayType=function(e,n){var r=e.id+"$"+n,t=$arrayTypes[r];return void 0===t&&(t=$newType(12,$kindArray,"["+n+"]"+e.string,!1,"",!1,null),$arrayTypes[r]=t,t.init(e,n)),t},$chanType=function(e,n,r){var t=(r?"<-":"")+"chan"+(n?"<- ":" ");n||r||"<"!=e.string[0]?t+=e.string:t+="("+e.string+")";var i=n?"SendChan":r?"RecvChan":"Chan",a=e[i];return void 0===a&&(a=$newType(4,$kindChan,t,!1,"",!1,null),e[i]=a,a.init(e,n,r)),a},$Chan=function(e,n){(n<0||n>2147483647)&&$throwRuntimeError("makechan: size out of range"),this.$elem=e,this.$capacity=n,this.$buffer=[],this.$sendQueue=[],this.$recvQueue=[],this.$closed=!1},$chanNil=new $Chan(null,0);$chanNil.$sendQueue=$chanNil.$recvQueue={length:0,push:function(){},shift:function(){},indexOf:function(){return-1}};var $funcTypes={},$funcType=function(e,n,r){var t=$mapArray(e,function(e){return e.id}).join(",")+"$"+$mapArray(n,function(e){return e.id}).join(",")+"$"+r,i=$funcTypes[t];if(void 0===i){var a=$mapArray(e,function(e){return e.string});r&&(a[a.length-1]="..."+a[a.length-1].substr(2));var o="func("+a.join(", ")+")";1===n.length?o+=" "+n[0].string:n.length>1&&(o+=" ("+$mapArray(n,function(e){return e.string}).join(", ")+")"),i=$newType(4,$kindFunc,o,!1,"",!1,null),$funcTypes[t]=i,i.init(e,n,r)}return i},$interfaceTypes={},$interfaceType=function(e){var n=$mapArray(e,function(e){return e.pkg+","+e.name+","+e.typ.id}).join("$"),r=$interfaceTypes[n];if(void 0===r){var t="interface {}";0!==e.length&&(t="interface { "+$mapArray(e,function(e){return(""!==e.pkg?e.pkg+".":"")+e.name+e.typ.string.substr(4)}).join("; ")+" }"),r=$newType(8,$kindInterface,t,!1,"",!1,null),$interfaceTypes[n]=r,r.init(e)}return r},$emptyInterface=$interfaceType([]),$ifaceNil={},$error=$newType(8,$kindInterface,"error",!0,"",!1,null);$error.init([{prop:"Error",name:"Error",pkg:"",typ:$funcType([],[$String],!1)}]);var $panicValue,$jsObjectPtr,$jsErrorPtr,$mapTypes={},$mapType=function(e,n){var r=e.id+"$"+n.id,t=$mapTypes[r];return void 0===t&&(t=$newType(4,$kindMap,"map["+e.string+"]"+n.string,!1,"",!1,null),$mapTypes[r]=t,t.init(e,n)),t},$makeMap=function(e,n){for(var r={},t=0;t2147483647)&&$throwRuntimeError("makeslice: len out of range"),(r<0||r2147483647)&&$throwRuntimeError("makeslice: cap out of range");var t=new e.nativeArray(r);if(e.nativeArray===Array)for(var i=0;i4||t<0)break}}finally{0==$scheduled.length&&clearTimeout(e)}},$schedule=function(e){e.asleep&&(e.asleep=!1,$awakeGoroutines++),$scheduled.push(e),$curGoroutine===$noGoroutine&&$runScheduled()},$setTimeout=function(e,n){return $awakeGoroutines++,setTimeout(function(){$awakeGoroutines--,e()},n)},$block=function(){$curGoroutine===$noGoroutine&&$throwRuntimeError("cannot block in JavaScript callback, fix by wrapping code in goroutine"),$curGoroutine.asleep=!0},$restore=function(e,n){return void 0!==e&&void 0!==e.$blk?e:n},$send=function(e,n){e.$closed&&$throwRuntimeError("send on closed channel");var r=e.$recvQueue.shift();if(void 0===r){if(!(e.$buffer.length65535){var l=Math.floor((u-65536)/1024)+55296,s=(u-65536)%1024+56320;$+=String.fromCharCode(l,s)}else $+=String.fromCharCode(u)}return $;case $kindStruct:var f=$packages.time;if(void 0!==f&&e.constructor===f.Time.ptr){var d=$div64(e.UnixNano(),new $Int64(0,1e6));return new Date($flatten64(d))}var p={},h=function(e,n){if(n===$jsObjectPtr)return e;switch(n.kind){case $kindPtr:return e===n.nil?p:h(e.$get(),n.elem);case $kindStruct:var r=n.fields[0];return h(e[r.prop],r.typ);case $kindInterface:return h(e.$val,e.constructor);default:return p}},k=h(e,n);if(k!==p)return k;if(void 0!==r)return r(e);k={};for(a=0;a>24;case $kindInt16:return parseInt(e)<<16>>16;case $kindInt32:return parseInt(e)>>0;case $kindUint:return parseInt(e);case $kindUint8:return parseInt(e)<<24>>>24;case $kindUint16:return parseInt(e)<<16>>>16;case $kindUint32:case $kindUintptr:return parseInt(e)>>>0;case $kindInt64:case $kindUint64:return new n(0,e);case $kindFloat32:case $kindFloat64:return parseFloat(e);case $kindArray:return e.length!==n.len&&$throwRuntimeError("got array with wrong size from JavaScript native"),$mapArray(e,function(e){return $internalize(e,n.elem,i)});case $kindFunc:return function(){for(var t=[],a=0;a=128)return!1;return!0}; +Error.stackTraceLimit = Infinity; -$packages["github.com/gopherjs/gopherjs/js"]=(function(){var $pkg={},$init,A,B,J,K,M,O,P,Q,R,S,T,G,H,L;A=$pkg.Object=$newType(0,$kindStruct,"js.Object",true,"github.com/gopherjs/gopherjs/js",true,function(object_){this.$val=this;if(arguments.length===0){this.object=null;return;}this.object=object_;});B=$pkg.Error=$newType(0,$kindStruct,"js.Error",true,"github.com/gopherjs/gopherjs/js",true,function(Object_){this.$val=this;if(arguments.length===0){this.Object=null;return;}this.Object=Object_;});J=$pkg.M=$newType(4,$kindMap,"js.M",true,"github.com/gopherjs/gopherjs/js",true,null);K=$pkg.S=$newType(12,$kindSlice,"js.S",true,"github.com/gopherjs/gopherjs/js",true,null);M=$sliceType($emptyInterface);O=$ptrType(A);P=$sliceType(O);Q=$funcType([P],[O],true);R=$funcType([],[O],false);S=$funcType([O],[],false);T=$ptrType(B);A.ptr.prototype.Get=function(a){var a,b;b=this;return b.object[$externalize(a,$String)];};A.prototype.Get=function(a){return this.$val.Get(a);};A.ptr.prototype.Set=function(a,b){var a,b,c;c=this;c.object[$externalize(a,$String)]=$externalize(b,$emptyInterface);};A.prototype.Set=function(a,b){return this.$val.Set(a,b);};A.ptr.prototype.Delete=function(a){var a,b;b=this;delete b.object[$externalize(a,$String)];};A.prototype.Delete=function(a){return this.$val.Delete(a);};A.ptr.prototype.Length=function(){var a;a=this;return $parseInt(a.object.length);};A.prototype.Length=function(){return this.$val.Length();};A.ptr.prototype.Index=function(a){var a,b;b=this;return b.object[a];};A.prototype.Index=function(a){return this.$val.Index(a);};A.ptr.prototype.SetIndex=function(a,b){var a,b,c;c=this;c.object[a]=$externalize(b,$emptyInterface);};A.prototype.SetIndex=function(a,b){return this.$val.SetIndex(a,b);};A.ptr.prototype.Call=function(a,b){var a,b,c,d;c=this;return(d=c.object,d[$externalize(a,$String)].apply(d,$externalize(b,M)));};A.prototype.Call=function(a,b){return this.$val.Call(a,b);};A.ptr.prototype.Invoke=function(a){var a,b;b=this;return b.object.apply(undefined,$externalize(a,M));};A.prototype.Invoke=function(a){return this.$val.Invoke(a);};A.ptr.prototype.New=function(a){var a,b;b=this;return new($global.Function.prototype.bind.apply(b.object,[undefined].concat($externalize(a,M))));};A.prototype.New=function(a){return this.$val.New(a);};A.ptr.prototype.Bool=function(){var a;a=this;return!!(a.object);};A.prototype.Bool=function(){return this.$val.Bool();};A.ptr.prototype.String=function(){var a;a=this;return $internalize(a.object,$String);};A.prototype.String=function(){return this.$val.String();};A.ptr.prototype.Int=function(){var a;a=this;return $parseInt(a.object)>>0;};A.prototype.Int=function(){return this.$val.Int();};A.ptr.prototype.Int64=function(){var a;a=this;return $internalize(a.object,$Int64);};A.prototype.Int64=function(){return this.$val.Int64();};A.ptr.prototype.Uint64=function(){var a;a=this;return $internalize(a.object,$Uint64);};A.prototype.Uint64=function(){return this.$val.Uint64();};A.ptr.prototype.Float=function(){var a;a=this;return $parseFloat(a.object);};A.prototype.Float=function(){return this.$val.Float();};A.ptr.prototype.Interface=function(){var a;a=this;return $internalize(a.object,$emptyInterface);};A.prototype.Interface=function(){return this.$val.Interface();};A.ptr.prototype.Unsafe=function(){var a;a=this;return a.object;};A.prototype.Unsafe=function(){return this.$val.Unsafe();};B.ptr.prototype.Error=function(){var a;a=this;return"JavaScript error: "+$internalize(a.Object.message,$String);};B.prototype.Error=function(){return this.$val.Error();};B.ptr.prototype.Stack=function(){var a;a=this;return $internalize(a.Object.stack,$String);};B.prototype.Stack=function(){return this.$val.Stack();};G=function(a){var a,b,c,d,e,f;b=a;c=new($global.Object)();c.__internal_object__=b;d=b.constructor.methods;e=0;while(true){if(!(e<$parseInt(d.length))){break;}f=[f];f[0]=d[e];if(!($internalize(f[0].pkg,$String)==="")){e=e+(1)>>0;continue;}c[$externalize($internalize(f[0].name,$String),$String)]=$externalize((function(f){return function(g){var g;return $externalizeFunction(b[$externalize($internalize(f[0].prop,$String),$String)],f[0].typ,$externalize(true,$Bool)).apply(b,$externalize(g,P));};})(f),Q);e=e+(1)>>0;}return c;};$pkg.MakeWrapper=G;H=function(a){var{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,$s,$r,$c}=$restore(this,{a});$s=$s||0;s:while(true){switch($s){case 0:b=[b];c=[c];b[0]=a;d=b[0].constructor;c[0]=new($global.Object)();e=(function(b,c){return function(e,f){var e,f;$global.Object.defineProperty(c[0],$externalize(e,$String),$externalize(f,J));};})(b,c);$r=e("__internal_object__",$makeMap($String.keyFor,[{k:"value",v:new $jsObjectPtr(b[0])}]));$s=1;case 1:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}f=$internalize(d.string,$String);g=$internalize(d.pkg,$String);h="";if(f.charCodeAt(0)===42){h="*";}i=0;while(true){if(!(i>0));break;}i=i+(1)>>0;}j=g+"."+h+f;$r=e("$type",$makeMap($String.keyFor,[{k:"value",v:new $String(j)}]));$s=2;case 2:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}k=null;l=new($global.Array)();m=d.methods;if(!(m===undefined)){l=l.concat(m);}n=d.elem;if(!(n===undefined)){k=n.fields;l=l.concat(n.methods);}else{k=d.fields;}o=0;case 3:if(!(o<$parseInt(l.length))){$s=4;continue;}p=[p];p[0]=l[o];if(!($internalize(p[0].pkg,$String)==="")){o=o+(1)>>0;$s=3;continue;}$r=e($internalize(p[0].prop,$String),$makeMap($String.keyFor,[{k:"value",v:new Q((function(b,c,p){return function(q){var q;return $externalizeFunction(b[0][$externalize($internalize(p[0].prop,$String),$String)],p[0].typ,$externalize(true,$Bool),H).apply(b[0],$externalize(q,P));};})(b,c,p))}]));$s=5;case 5:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}o=o+(1)>>0;$s=3;continue;case 4:if(!(k===undefined)){$s=6;continue;}$s=7;continue;case 6:q=0;case 8:if(!(q<$parseInt(k.length))){$s=9;continue;}r=[r];r[0]=k[q];if(!!!(r[0].exported)){q=q+(1)>>0;$s=8;continue;}$r=e($internalize(r[0].prop,$String),$makeMap($String.keyFor,[{k:"get",v:new R((function(b,c,r){return function(){var s;s=$copyIfRequired(b[0].$val[$externalize($internalize(r[0].prop,$String),$String)],r[0].typ);return $externalize(s,r[0].typ,H);};})(b,c,r))},{k:"set",v:new S((function(b,c,r){return function(s){var s,t;t=$internalize(s,r[0].typ,H);b[0].$val[$externalize($internalize(r[0].prop,$String),$String)]=t;};})(b,c,r))}]));$s=10;case 10:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}q=q+(1)>>0;$s=8;continue;case 9:case 7:$s=-1;return c[0];}return;}var $f={$blk:H,$c:true,$r,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,$s};return $f;};$pkg.MakeFullWrapper=H;L=function(){var a;a=new B.ptr(null);$unused(a);};O.methods=[{prop:"Get",name:"Get",pkg:"",typ:$funcType([$String],[O],false)},{prop:"Set",name:"Set",pkg:"",typ:$funcType([$String,$emptyInterface],[],false)},{prop:"Delete",name:"Delete",pkg:"",typ:$funcType([$String],[],false)},{prop:"Length",name:"Length",pkg:"",typ:$funcType([],[$Int],false)},{prop:"Index",name:"Index",pkg:"",typ:$funcType([$Int],[O],false)},{prop:"SetIndex",name:"SetIndex",pkg:"",typ:$funcType([$Int,$emptyInterface],[],false)},{prop:"Call",name:"Call",pkg:"",typ:$funcType([$String,M],[O],true)},{prop:"Invoke",name:"Invoke",pkg:"",typ:$funcType([M],[O],true)},{prop:"New",name:"New",pkg:"",typ:$funcType([M],[O],true)},{prop:"Bool",name:"Bool",pkg:"",typ:$funcType([],[$Bool],false)},{prop:"String",name:"String",pkg:"",typ:$funcType([],[$String],false)},{prop:"Int",name:"Int",pkg:"",typ:$funcType([],[$Int],false)},{prop:"Int64",name:"Int64",pkg:"",typ:$funcType([],[$Int64],false)},{prop:"Uint64",name:"Uint64",pkg:"",typ:$funcType([],[$Uint64],false)},{prop:"Float",name:"Float",pkg:"",typ:$funcType([],[$Float64],false)},{prop:"Interface",name:"Interface",pkg:"",typ:$funcType([],[$emptyInterface],false)},{prop:"Unsafe",name:"Unsafe",pkg:"",typ:$funcType([],[$Uintptr],false)}];T.methods=[{prop:"Error",name:"Error",pkg:"",typ:$funcType([],[$String],false)},{prop:"Stack",name:"Stack",pkg:"",typ:$funcType([],[$String],false)}];A.init("github.com/gopherjs/gopherjs/js",[{prop:"object",name:"object",embedded:false,exported:false,typ:O,tag:""}]);B.init("",[{prop:"Object",name:"Object",embedded:true,exported:true,typ:O,tag:""}]);J.init($String,$emptyInterface);K.init($emptyInterface);$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:L();}return;}if($f===undefined){$f={$blk:$init};}$f.$s=$s;$f.$r=$r;return $f;};$pkg.$init=$init;return $pkg;})(); -$packages["runtime"]=(function(){var $pkg={},$init,A,C,D,AT,AZ,BD,AM,E,AU;A=$packages["github.com/gopherjs/gopherjs/js"];C=$pkg._type=$newType(0,$kindStruct,"runtime._type",true,"runtime",false,function(str_){this.$val=this;if(arguments.length===0){this.str="";return;}this.str=str_;});D=$pkg.TypeAssertionError=$newType(0,$kindStruct,"runtime.TypeAssertionError",true,"runtime",true,function(_interface_,concrete_,asserted_,missingMethod_){this.$val=this;if(arguments.length===0){this._interface=AZ.nil;this.concrete=AZ.nil;this.asserted=AZ.nil;this.missingMethod="";return;}this._interface=_interface_;this.concrete=concrete_;this.asserted=asserted_;this.missingMethod=missingMethod_;});AT=$pkg.errorString=$newType(8,$kindString,"runtime.errorString",true,"runtime",false,null);AZ=$ptrType(C);BD=$ptrType(D);C.ptr.prototype.string=function(){var a;a=this;return a.str;};C.prototype.string=function(){return this.$val.string();};C.ptr.prototype.pkgpath=function(){var a;a=this;return"";};C.prototype.pkgpath=function(){return this.$val.pkgpath();};D.ptr.prototype.RuntimeError=function(){};D.prototype.RuntimeError=function(){return this.$val.RuntimeError();};D.ptr.prototype.Error=function(){var a,b,c,d,e;a=this;b="interface";if(!(a._interface===AZ.nil)){b=a._interface.string();}c=a.asserted.string();if(a.concrete===AZ.nil){return"interface conversion: "+b+" is nil, not "+c;}d=a.concrete.string();if(a.missingMethod===""){e="interface conversion: "+b+" is "+d+", not "+c;if(d===c){if(!(a.concrete.pkgpath()===a.asserted.pkgpath())){e=e+(" (types from different packages)");}else{e=e+(" (types from different scopes)");}}return e;}return"interface conversion: "+d+" is not "+c+": missing method "+a.missingMethod;};D.prototype.Error=function(){return this.$val.Error();};E=function(){var a,b;a=$packages[$externalize("github.com/gopherjs/gopherjs/js",$String)];$jsObjectPtr=a.Object.ptr;$jsErrorPtr=a.Error.ptr;$throwRuntimeError=AU;AM=$internalize($goVersion,$String);b=$ifaceNil;b=new D.ptr(AZ.nil,AZ.nil,AZ.nil,"");$unused(b);};AT.prototype.RuntimeError=function(){var a;a=this.$val;};$ptrType(AT).prototype.RuntimeError=function(){return new AT(this.$get()).RuntimeError();};AT.prototype.Error=function(){var a;a=this.$val;return"runtime error: "+(a);};$ptrType(AT).prototype.Error=function(){return new AT(this.$get()).Error();};AU=function(a){var a;$panic(new AT((a)));};AZ.methods=[{prop:"string",name:"string",pkg:"runtime",typ:$funcType([],[$String],false)},{prop:"pkgpath",name:"pkgpath",pkg:"runtime",typ:$funcType([],[$String],false)}];BD.methods=[{prop:"RuntimeError",name:"RuntimeError",pkg:"",typ:$funcType([],[],false)},{prop:"Error",name:"Error",pkg:"",typ:$funcType([],[$String],false)}];AT.methods=[{prop:"RuntimeError",name:"RuntimeError",pkg:"",typ:$funcType([],[],false)},{prop:"Error",name:"Error",pkg:"",typ:$funcType([],[$String],false)}];C.init("runtime",[{prop:"str",name:"str",embedded:false,exported:false,typ:$String,tag:""}]);D.init("runtime",[{prop:"_interface",name:"_interface",embedded:false,exported:false,typ:AZ,tag:""},{prop:"concrete",name:"concrete",embedded:false,exported:false,typ:AZ,tag:""},{prop:"asserted",name:"asserted",embedded:false,exported:false,typ:AZ,tag:""},{prop:"missingMethod",name:"missingMethod",embedded:false,exported:false,typ:$String,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;}AM="";E();}return;}if($f===undefined){$f={$blk:$init};}$f.$s=$s;$f.$r=$r;return $f;};$pkg.$init=$init;return $pkg;})(); -$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,O,Q,V,AM,AN,AO,AP,AQ,AR,AS,AT,AU,AV,AW,AX,AY,AZ,BA,BB,BC,BD,BE,BF,BG,BH,BI,BJ,BK,BL,BM,BN,R,S,P,T,U,W,X,Y,Z,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL;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=BJ.nil;this.Points=BK.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_){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;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_;});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=BL.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_,PushbackX_,PushbackY_,Damage_,SelfLockVelX_,SelfLockVelY_,HitboxOffsetX_,HitboxOffsetY_,HitboxSizeX_,HitboxSizeY_,BlowUp_){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.PushbackX=0;this.PushbackY=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;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.PushbackX=PushbackX_;this.PushbackY=PushbackY_;this.Damage=Damage_;this.SelfLockVelX=SelfLockVelX_;this.SelfLockVelY=SelfLockVelY_;this.HitboxOffsetX=HitboxOffsetX_;this.HitboxOffsetY=HitboxOffsetY_;this.HitboxSizeX=HitboxSizeX_;this.HitboxSizeY=HitboxSizeY_;this.BlowUp=BlowUp_;});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);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);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_,Hits_){this.$val=this;if(arguments.length===0){this.BattleLocalId=0;this.RecoveryFrames=0;this.RecoveryFramesOnBlock=0;this.RecoveryFramesOnHit=0;this.ReleaseTriggerType=0;this.Hits=AM.nil;return;}this.BattleLocalId=BattleLocalId_;this.RecoveryFrames=RecoveryFrames_;this.RecoveryFramesOnBlock=RecoveryFramesOnBlock_;this.RecoveryFramesOnHit=RecoveryFramesOnHit_;this.ReleaseTriggerType=ReleaseTriggerType_;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=AZ.nil;this.CountdownNanos=new $Int64(0,0);this.MeleeBullets=BA.nil;this.FireballBullets=BH.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=AY.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=AM.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.CharacterConfig=$newType(0,$kindStruct,"battle.CharacterConfig",true,"jsexport/battle",true,function(SpeciesId_,SpeciesName_,InAirIdleFrameIdxTurningPoint_,InAirIdleFrameIdxTurnedCycle_,LayDownFrames_,LayDownFramesToRecover_,GetUpFrames_,GetUpFramesToRecover_,JumpingInitVelY_,PatternIdToSkillId_){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.GetUpFrames=0;this.GetUpFramesToRecover=0;this.JumpingInitVelY=0;this.PatternIdToSkillId=false;return;}this.SpeciesId=SpeciesId_;this.SpeciesName=SpeciesName_;this.InAirIdleFrameIdxTurningPoint=InAirIdleFrameIdxTurningPoint_;this.InAirIdleFrameIdxTurnedCycle=InAirIdleFrameIdxTurnedCycle_;this.LayDownFrames=LayDownFrames_;this.LayDownFramesToRecover=LayDownFramesToRecover_;this.GetUpFrames=GetUpFrames_;this.GetUpFramesToRecover=GetUpFramesToRecover_;this.JumpingInitVelY=JumpingInitVelY_;this.PatternIdToSkillId=PatternIdToSkillId_;});V=$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_;});AM=$sliceType($emptyInterface);AN=$sliceType($Int32);AO=$sliceType(AN);AP=$ptrType(V);AQ=$sliceType(C);AR=$sliceType($String);AS=$ptrType(B.Collision);AT=$ptrType(AQ);AU=$ptrType(E);AV=$ptrType(J);AW=$ptrType(B.ConvexPolygon);AX=$ptrType(N);AY=$sliceType($Uint64);AZ=$sliceType(AU);BA=$sliceType(AV);BB=$sliceType(AT);BC=$sliceType($Bool);BD=$ptrType(L);BE=$ptrType(B.Object);BF=$sliceType(BE);BG=$ptrType(K);BH=$sliceType(BG);BI=$sliceType($Float64);BJ=$ptrType(C);BK=$sliceType(BJ);BL=$ptrType(D);BM=$mapType($Int,$Int);BN=$ptrType(O);P=function(a){var a;return new O.ptr(0,0,0,0,a,0,$makeSlice(AM,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))>>$min(c,31))>>0);};$pkg.ConvertToInputFrameId=T;U=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);};W=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 V.ptr(0,0,0,true,true,new B.Vector([0,0]));i=X(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,AP.nil];}return;}}catch(err){$err=err;$s=-1;return[false,0,0,AP.nil];}finally{$callDeferred($deferred,$err);if($curGoroutine.asleep){var $f={$blk:W,$c:true,$r,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,$s,$deferred};return $f;}}};$pkg.CalcPushbacks=W;X=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(!(AP.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(Y(a,b,r.Unit(),c)){return false;}q++;}}if(1=s.$length)?($throwRuntimeError("index out of range"),undefined):s.$array[s.$offset+t]);if(Y(a,b,u.Unit(),c)){return false;}t++;}}return true;};Y=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;};Z=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=Z;AA=function(a,b){var a,b,c,d;c=(a)*0.01;d=(b)*0.01;return[c,d];};$pkg.VirtualGridToWorldPos=AA;AB=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=AB;AC=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=AC;AD=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=AC(a,b,c,d,e,f,g,h,i,j);l=k[0];m=k[1];return Z(l,m);};$pkg.PolygonColliderBLToVirtualGridPos=AD;AE=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=AA(a,b);l=k[0];m=k[1];return AB(l,m,c,d,e,f,g,h,i,j);};$pkg.VirtualGridToPolygonColliderBLPos=AE;AF=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(AQ,0,10);g=b.Check(0,0,new AR([]));if(AS.nil===g){$s=-1;return(f.$ptr||(f.$ptr=new AT(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,AU,true)[1]){}else if($assertType(l,AV,true)[1]){}else{k=true;}if(!k){i++;$s=1;continue;}m=$assertType(j.Shape,AW);o=W(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 AT(function(){return this.$target[0];},function($v){this.$target[0]=$v;},f)));}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,r,s,t,u,$s};return $f;};AG=function(a,b,c,d,e,f){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;g=T(c.Id,e,f);h=T(c.Id-1>>0,e,f);if(0>=g){return[-2,false,0,0];}i=$assertType(d.GetByFrameId(g),AX).InputList;j=AY.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(!(AY.nil===j)){x=U((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=(z=S[$Int32.keyFor(a.CharacterState)],z!==undefined?[z.v,true]:[false,false]);aa=y[1];if(!aa){k=true;}}ab=-1;if(n.BtnALevel>u){if(a.InAir){ab=1;}else{ab=0;}ac=0;ad=0;q=ac;r=ad;}return[ab,k,q,r];};AH=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,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});$s=$s||0;s:while(true){switch($s){case 0:h=b.PlayersArr.$length;i=$makeSlice(AZ,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,0,m.Removed,m.Score,0,m.FramesToRecover-1>>0,m.FramesInChState+1>>0,m.Hp,m.MaxHp,m.CharacterState,true));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;}k++;}n=$makeSlice(BA,0,b.MeleeBullets.$length);o=$makeSlice(AQ,h);p=$makeSlice(BB,h);q=$makeSlice(BC,h);r=b.PlayersArr;s=0;while(true){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=AG(v,x,b,a,8,2);z=y[0];aa=y[1];ab=y[2];ac=y[3];if(-2===z){s++;continue;}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;if(!((-1===z))){ae=(af=w.PatternIdToSkillId[$Int.keyFor(z)],af!==undefined?[af.v,true]:[0,false]);ag=ae[0];ah=ae[1];if(ah){aj=(ai=R[$Int.keyFor(ag)],ai!==undefined?ai.v:BD.nil);ak=(al=aj.Hits,(0>=al.$length?($throwRuntimeError("index out of range"),undefined):al.$array[al.$offset+0]));if($assertType(ak,AV,true)[1]){am=ak.$val;t[0]=$clone(am,J);t[0].Bullet.OriginatedRenderFrameId=b.Id;t[0].Bullet.OffenderJoinIndex=ad;n=$append(n,t[0]);x.FramesToRecover=aj.RecoveryFrames;}x.CharacterState=2;if(false===v.InAir){x.VelX=0;}}s++;continue;}if(!((0===ab))||!((0===ac))){an=ab;ao=ac;x.DirX=an;x.DirY=ao;x.VelX=$imul(ab,v.Speed);x.CharacterState=1;}else{x.CharacterState=0;x.VelX=0;}s++;}ap=b.PlayersArr;aq=0;case 1:if(!(aq=ap.$length)?($throwRuntimeError("index out of range"),undefined):ap.$array[ap.$offset+aq]);at=as.JoinIndex;au=0;av=0;(aw=at-1>>0,((aw<0||aw>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+aw])).X=au;(ax=at-1>>0,((ax<0||ax>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+ax])).Y=av;ay=131072+at>>0;ba=(az=d[$Int32.keyFor(ay)],az!==undefined?az.v:BE.nil);bb=((ar<0||ar>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+ar]);bc=((ar<0||ar>=g.$length)?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+ar]);bd=as.VirtualGridX+as.VelX>>0;be=as.VirtualGridY+as.VelY>>0;bf=bd;bg=be;if(((ar<0||ar>=q.$length)?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+ar])){bg=bg+(bc.JumpingInitVelY)>>0;}bh=AE(bf,bg,ba.W*0.5,ba.H*0.5,0,0,0,0,e,f);ba.X=bh[0];ba.Y=bh[1];$r=ba.Update();$s=3;case 3:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}if(as.InAir){bb.VelX=bb.VelX+(0)>>0;bb.VelY=bb.VelY+(-50)>>0;}aq++;$s=1;continue;case 2:bi=$makeSlice(BF,0,b.MeleeBullets.$length);bj=b.MeleeBullets;bk=0;case 4:if(!(bk=bj.$length)?($throwRuntimeError("index out of range"),undefined):bj.$array[bj.$offset+bk]);if(((bl.Bullet.OriginatedRenderFrameId+bl.Bullet.StartupFrames>>0)<=b.Id)&&(((bl.Bullet.OriginatedRenderFrameId+bl.Bullet.StartupFrames>>0)+bl.Bullet.ActiveFrames>>0)>b.Id)){$s=6;continue;}$s=7;continue;case 6:bo=(bm=b.PlayersArr,bn=bl.Bullet.OffenderJoinIndex-1>>0,((bn<0||bn>=bm.$length)?($throwRuntimeError("index out of range"),undefined):bm.$array[bm.$offset+bn]));bp=1;if(0>bo.DirX){bp=-bp;}bq=AA(bo.VirtualGridX+($imul(bp,bl.Bullet.HitboxOffsetX))>>0,bo.VirtualGridY);br=bq[0];bs=bq[1];bt=AA(bl.Bullet.HitboxSizeX,bl.Bullet.HitboxSizeY);bu=bt[0];bv=bt[1];bw=AI(br,bs,bu,bv,0.1,0.1,0.1,0.1,e,f,bl,"MeleeBullet");$s=9;case 9:if($c){$c=false;bw=bw.$blk();}if(bw&&bw.$blk!==undefined){break s;}bx=bw;$r=c.Add(new BF([bx]));$s=10;case 10:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}bi=$append(bi,bx);$s=8;continue;case 7:n=$append(n,bl);case 8:bk++;$s=4;continue;case 5:by=b.PlayersArr;bz=0;case 11:if(!(bz=by.$length)?($throwRuntimeError("index out of range"),undefined):by.$array[by.$offset+bz]);cc=cb.JoinIndex;cd=131072+cc>>0;cf=(ce=d[$Int32.keyFor(cd)],ce!==undefined?ce.v:BE.nil);cg=$assertType(cf.Shape,AW);ci=AF(cc,cf,cg,0.1,(ch=cc-1>>0,((ch<0||ch>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+ch])));$s=13;case 13:if($c){$c=false;ci=ci.$blk();}if(ci&&ci.$blk!==undefined){break s;}(cj=cc-1>>0,((cj<0||cj>=p.$length)?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+cj]=ci));ck=((ca<0||ca>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+ca]);cl=((ca<0||ca>=g.$length)?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+ca]);cm=false;cn=cf.Check(0,0,new AR([]));if(!(AS.nil===cn)){$s=14;continue;}$s=15;continue;case 14:co=cn.Objects;cp=0;case 16:if(!(cp=co.$length)?($throwRuntimeError("index out of range"),undefined):co.$array[co.$offset+cp]);cr=false;cs=false;ct=false;cu=cr;cv=cs;cw=ct;cx=cq.Data;if($assertType(cx,AU,true)[1]){cv=true;}else if($assertType(cx,AV,true)[1]){cw=true;}else{cu=true;}if(cw){cp++;$s=16;continue;}cy=$assertType(cq.Shape,AW);da=W(0,0,cg,cy);$s=18;case 18:if($c){$c=false;da=da.$blk();}if(da&&da.$blk!==undefined){break s;}cz=da;db=cz[0];dc=cz[1];dd=cz[2];de=cz[3];if(!db){cp++;$s=16;continue;}df=de.OverlapX*0+de.OverlapY*-1;if(cv){dg=(de.Overlap-0.2)*de.OverlapX;dh=(de.Overlap-0.2)*de.OverlapY;dc=dg;dd=dh;}di=(dj=cc-1>>0,((dj<0||dj>=p.$length)?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+dj])).$get();dk=0;while(true){if(!(dk=di.$length)?($throwRuntimeError("index out of range"),undefined):di.$array[di.$offset+dk]),C);dm=dc*dl.X+dd*dl.Y;if(cu||(cv&&0>dm)){dc=dc-(dm*dl.X);dd=dd-(dm*dl.Y);}dk++;}dn=cc-1>>0;((dn<0||dn>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+dn]).X=((dn<0||dn>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+dn]).X+(dc);dp=cc-1>>0;((dp<0||dp>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+dp]).Y=((dp<0||dp>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+dp]).Y+(dd);if(0.5=cb.VelY){ck.VelX=0;ck.VelY=0;if(8===ck.CharacterState){ck.CharacterState=9;ck.FramesToRecover=cl.LayDownFramesToRecover;}else{ck.CharacterState=0;ck.FramesToRecover=0;}}else{if(9===ck.CharacterState){if(0===ck.FramesToRecover){ck.CharacterState=10;ck.FramesToRecover=cl.GetUpFramesToRecover;}}else if(10===ck.CharacterState){if(ck.FramesInChState===cl.GetUpFrames){ck.CharacterState=0;}}}}bz++;$s=11;continue;case 12:dq=bi;dr=0;case 19:if(!(dr=dq.$length)?($throwRuntimeError("index out of range"),undefined):dq.$array[dq.$offset+dr]);dt=ds.Check(0,0,new AR([]));ds.Space.Remove(new BF([ds]));du=ds.Data;if($assertType(du,AV,true)[1]){$s=21;continue;}$s=22;continue;case 21:dv=du.$val;if(AS.nil===dt){n=$append(n,dv);dr++;$s=19;continue;}dw=$assertType(ds.Shape,AW);dz=(dx=b.PlayersArr,dy=dv.Bullet.OffenderJoinIndex-1>>0,((dy<0||dy>=dx.$length)?($throwRuntimeError("index out of range"),undefined):dx.$array[dx.$offset+dy]));ea=dt.Objects;eb=0;case 23:if(!(eb=ea.$length)?($throwRuntimeError("index out of range"),undefined):ea.$array[ea.$offset+eb]);ed=$assertType(ec.Shape,AW);ee=ec.Data;if($assertType(ee,AU,true)[1]){$s=25;continue;}$s=26;continue;case 25:ef=ee.$val;if(dv.Bullet.OffenderJoinIndex===ef.JoinIndex){eb++;$s=23;continue;}ei=W(0,0,dw,ed);$s=28;case 28:if($c){$c=false;ei=ei.$blk();}if(ei&&ei.$blk!==undefined){break s;}eh=ei;ej=eh[0];if(!ej){eb++;$s=23;continue;}ek=ef.JoinIndex;el=1;if(0>dz.DirX){el=-el;}em=AA($imul(-el,dv.Bullet.PushbackX),dv.Bullet.PushbackY);en=em[0];eo=em[1];ep=(eq=ek-1>>0,((eq<0||eq>=p.$length)?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+eq])).$get();er=0;while(true){if(!(er=ep.$length)?($throwRuntimeError("index out of range"),undefined):ep.$array[ep.$offset+er]),C);et=en*es.X+eo*es.Y;if(0>et){en=en-(et*es.X);eo=eo-(et*es.Y);}er++;}eu=ek-1>>0;((eu<0||eu>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+eu]).X=((eu<0||eu>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+eu]).X+(en);ev=ek-1>>0;((ev<0||ev>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+ev]).Y=((ev<0||ev>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+ev]).Y+(eo);ex=(ew=ef.JoinIndex-1>>0,((ew<0||ew>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+ew]));if(dv.Bullet.BlowUp){ex.CharacterState=8;}else{ex.CharacterState=3;}ez=(ey=ef.JoinIndex-1>>0,((ey<0||ey>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+ey])).FramesToRecover;if(dv.Bullet.HitStunFrames>ez){ex.FramesToRecover=dv.Bullet.HitStunFrames;}$s=27;continue;case 26:eg=ee;case 27:eb++;$s=23;continue;case 24:case 22:dr++;$s=19;continue;case 20:fa=b.PlayersArr;fb=0;while(true){if(!(fb=fa.$length)?($throwRuntimeError("index out of range"),undefined):fa.$array[fa.$offset+fb]);fe=fd.JoinIndex;ff=131072+fe>>0;fh=(fg=d[$Int32.keyFor(ff)],fg!==undefined?fg.v:BE.nil);fi=((fc<0||fc>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+fc]);fj=AD(fh.X-(fk=fe-1>>0,((fk<0||fk>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+fk])).X,fh.Y-(fl=fe-1>>0,((fl<0||fl>=o.$length)?($throwRuntimeError("index out of range"),undefined):o.$array[o.$offset+fl])).Y,fh.W*0.5,fh.H*0.5,0,0,0,0,e,f);fi.VirtualGridX=fj[0];fi.VirtualGridY=fj[1];if(fi.InAir){fm=fi.CharacterState;fn=fm;if((fn===(0))||(fn===(1))){if(((fc<0||fc>=q.$length)?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+fc])||(5===fd.CharacterState)){fi.CharacterState=5;}else{fi.CharacterState=4;}}else if(fn===(2)){fi.CharacterState=6;}else if(fn===(3)){fi.CharacterState=7;}}if(!((fi.CharacterState===fd.CharacterState))){fi.FramesInChState=0;}fb++;}$s=-1;return new M.ptr(b.Id+1>>0,i,new $Int64(0,0),n,BH.nil,new $Uint64(0,0),false,false);}return;}var $f={$blk:AH,$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,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=AH;AI=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=AB(a,b,c*0.5,d*0.5,e,f,g,h,i,j);n=m[0];o=m[1];p=AJ(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:AI,$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=AI;AJ=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 AR([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:AJ,$c:true,$r,a,b,c,d,e,f,g,h,$s};return $f;};AK=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=AL(a);g=0;h=0;i=g;j=h;k=B.NewConvexPolygon(BI.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 BI([v.X,v.Y]));t=t+(1)>>0;}w=B.NewObject(f.Anchor.X+b,f.Anchor.Y+c,i,j,new AR([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:AK,$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=AK;AL=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=AL;BN.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:BJ,tag:""},{prop:"Points",name:"Points",embedded:false,exported:true,typ:BK,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:"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:""}]);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:BL,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:"PushbackX",name:"PushbackX",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"PushbackY",name:"PushbackY",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:""}]);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:"Hits",name:"Hits",embedded:false,exported:true,typ:AM,tag:""}]);M.init("",[{prop:"Id",name:"Id",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"PlayersArr",name:"PlayersArr",embedded:false,exported:true,typ:AZ,tag:""},{prop:"CountdownNanos",name:"CountdownNanos",embedded:false,exported:true,typ:$Int64,tag:""},{prop:"MeleeBullets",name:"MeleeBullets",embedded:false,exported:true,typ:BA,tag:""},{prop:"FireballBullets",name:"FireballBullets",embedded:false,exported:true,typ:BH,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:BM,tag:""}]);N.init("",[{prop:"InputFrameId",name:"InputFrameId",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"InputList",name:"InputList",embedded:false,exported:true,typ:AY,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:AM,tag:""}]);Q.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:"GetUpFrames",name:"GetUpFrames",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"GetUpFramesToRecover",name:"GetUpFramesToRecover",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"JumpingInitVelY",name:"JumpingInitVelY",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"PatternIdToSkillId",name:"PatternIdToSkillId",embedded:false,exported:true,typ:BM,tag:""}]);V.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.Characters=$makeMap($Int.keyFor,[{k:0,v:new Q.ptr(0,"MonkGirl",11,1,16,16,33,30,800,$makeMap($Int.keyFor,[{k:0,v:1},{k:1,v:2}]))}]);R=$makeMap($Int.keyFor,[{k:1,v:new L.ptr(0,34,34,34,1,new AM([new J.ptr(new I.ptr(0,0,5,0,0,10,18,9,800,0,5,0,0,1200,0,2400,3200,false))]))},{k:2,v:new L.ptr(0,34,34,34,1,new AM([new J.ptr(new I.ptr(0,0,3,0,0,20,18,9,600,0,5,0,0,1200,0,3200,2400,false))]))}]);$pkg.DIRECTION_DECODER=new AO([new AN([0,0]),new AN([0,2]),new AN([0,-2]),new AN([2,0]),new AN([-2,0]),new AN([1,1]),new AN([-1,-1]),new AN([1,-1]),new AN([-1,1])]);S=$makeMap($Int32.keyFor,[{k:4,v:true},{k:5,v:true},{k:6,v:true},{k:7,v:true},{k:8,v:true}]);}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,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,AY,AZ,BA,BB,BC,BD,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R;A=$packages["github.com/gopherjs/gopherjs/js"];B=$packages["jsexport/battle"];C=$packages["resolv"];S=$sliceType($Uint64);T=$ptrType(B.Vec2D);U=$sliceType(T);V=$ptrType(B.Polygon2D);W=$ptrType(B.PlayerDownsync);X=$sliceType(W);Y=$ptrType(B.MeleeBullet);Z=$sliceType(Y);AA=$ptrType(B.FireballBullet);AB=$sliceType(AA);AC=$ptrType(A.Object);AD=$sliceType(AC);AE=$ptrType(B.CharacterConfig);AF=$funcType([$Float64,$Float64],[AC],false);AG=$funcType([T,U],[AC],false);AH=$funcType([V],[AC],false);AI=$funcType([$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Bool,$Float64],[AC],false);AJ=$funcType([$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Int32,$Bool],[AC],false);AK=$funcType([$Int32,X,Z],[AC],false);AL=$funcType([$Int,$Int,$Int,$Int],[AC],false);AM=$funcType([$Int32,S,$Uint64],[AC],false);AN=$funcType([$Int32],[AC],false);AO=$funcType([$Float64,$Float64,$Float64,$Float64,$Float64,$Float64,$emptyInterface,$String],[AC],false);AP=$funcType([V,$Float64,$Float64,$emptyInterface,$String],[AC],false);AQ=$ptrType(C.Space);AR=$funcType([AQ],[AD],false);AS=$funcType([$Float64,$Float64,$Float64,$Float64,$Float64,$Float64,$Float64,$Float64,$Float64,$Float64],[$Float64,$Float64],false);AT=$funcType([$Float64,$Float64],[$Int32,$Int32],false);AU=$funcType([$Int32,$Int32],[$Float64,$Float64],false);AV=$sliceType($Int);AW=$funcType([AV],[AD],false);AX=$ptrType(B.RingBuffer);AY=$ptrType(B.RoomDownsyncFrame);AZ=$ptrType(C.Object);BA=$mapType($Int32,AZ);BB=$sliceType(AE);BC=$funcType([AX,AY,AQ,BA,$Float64,$Float64,BB],[AC],false);BD=$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,q){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q;return A.MakeWrapper(new B.PlayerDownsync.ptr(a,b,c,d,e,f,g,j,k,m,q,false,0,0,h,i,n,o,l,p));};$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,g,h,i,j,k,l,m,n,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,AB.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(AD,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){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)}]),BD);};$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;})(); +var $NaN = NaN; +var $global, $module; +if (typeof window !== "undefined") { /* web page */ + $global = window; +} else if (typeof self !== "undefined") { /* web worker */ + $global = self; +} else if (typeof global !== "undefined") { /* Node.js */ + $global = global; + $global.require = require; +} else { /* others (e.g. Nashorn) */ + $global = this; +} + +if ($global === undefined || $global.Array === undefined) { + throw new Error("no global object found"); +} +if (typeof module !== "undefined") { + $module = module; +} + +if (!$global.fs && $global.require) { + try { + var fs = $global.require('fs'); + if (typeof fs === "object" && fs !== null && Object.keys(fs).length !== 0) { + $global.fs = fs; + } + } catch(e) { /* Ignore if the module couldn't be loaded. */ } +} + +if (!$global.fs) { + var outputBuf = ""; + var decoder = new TextDecoder("utf-8"); + $global.fs = { + constants: { O_WRONLY: -1, O_RDWR: -1, O_CREAT: -1, O_TRUNC: -1, O_APPEND: -1, O_EXCL: -1 }, // unused + writeSync: function writeSync(fd, buf) { + outputBuf += decoder.decode(buf); + var nl = outputBuf.lastIndexOf("\n"); + if (nl != -1) { + console.log(outputBuf.substr(0, nl)); + outputBuf = outputBuf.substr(nl + 1); + } + return buf.length; + }, + write: function write(fd, buf, offset, length, position, callback) { + if (offset !== 0 || length !== buf.length || position !== null) { + callback(enosys()); + return; + } + var n = this.writeSync(fd, buf); + callback(null, n); + } + }; +} + +var $linknames = {} // Collection of functions referenced by a go:linkname directive. +var $packages = {}, $idCounter = 0; +var $keys = function(m) { return m ? Object.keys(m) : []; }; +var $flushConsole = function() {}; +var $throwRuntimeError; /* set by package "runtime" */ +var $throwNilPointerError = function() { $throwRuntimeError("invalid memory address or nil pointer dereference"); }; +var $call = function(fn, rcvr, args) { return fn.apply(rcvr, args); }; +var $makeFunc = function(fn) { return function() { return $externalize(fn(this, new ($sliceType($jsObjectPtr))($global.Array.prototype.slice.call(arguments, []))), $emptyInterface); }; }; +var $unused = function(v) {}; +var $print = console.log; +// Under Node we can emulate print() more closely by avoiding a newline. +if (($global.process !== undefined) && $global.require) { + try { + var util = $global.require('util'); + $print = function() { $global.process.stderr.write(util.format.apply(this, arguments)); }; + } catch (e) { + // Failed to require util module, keep using console.log(). + } +} +var $println = console.log + +var $initAllLinknames = function() { + var names = $keys($packages); + for (var i = 0; i < names.length; i++) { + var f = $packages[names[i]]["$initLinknames"]; + if (typeof f == 'function') { + f(); + } + } +} + +var $mapArray = function(array, f) { + var newArray = new array.constructor(array.length); + for (var i = 0; i < array.length; i++) { + newArray[i] = f(array[i]); + } + return newArray; +}; + +// Returns a method bound to the receiver instance, safe to invoke as a +// standalone function. Bound function is cached for later reuse. +var $methodVal = function(recv, name) { + var vals = recv.$methodVals || {}; + recv.$methodVals = vals; /* noop for primitives */ + var f = vals[name]; + if (f !== undefined) { + return f; + } + var method = recv[name]; + f = method.bind(recv); + vals[name] = f; + return f; +}; + +var $methodExpr = function(typ, name) { + var method = typ.prototype[name]; + if (method.$expr === undefined) { + method.$expr = function() { + $stackDepthOffset--; + try { + if (typ.wrapped) { + arguments[0] = new typ(arguments[0]); + } + return Function.call.apply(method, arguments); + } finally { + $stackDepthOffset++; + } + }; + } + return method.$expr; +}; + +var $ifaceMethodExprs = {}; +var $ifaceMethodExpr = function(name) { + var expr = $ifaceMethodExprs["$" + name]; + if (expr === undefined) { + expr = $ifaceMethodExprs["$" + name] = function() { + $stackDepthOffset--; + try { + return Function.call.apply(arguments[0][name], arguments); + } finally { + $stackDepthOffset++; + } + }; + } + return expr; +}; + +var $subslice = function(slice, low, high, max) { + if (high === undefined) { + high = slice.$length; + } + if (max === undefined) { + max = slice.$capacity; + } + if (low < 0 || high < low || max < high || high > slice.$capacity || max > slice.$capacity) { + $throwRuntimeError("slice bounds out of range"); + } + if (slice === slice.constructor.nil) { + return slice; + } + var s = new slice.constructor(slice.$array); + s.$offset = slice.$offset + low; + s.$length = high - low; + s.$capacity = max - low; + return s; +}; + +var $substring = function(str, low, high) { + if (low < 0 || high < low || high > str.length) { + $throwRuntimeError("slice bounds out of range"); + } + return str.substring(low, high); +}; + +// Convert Go slice to an equivalent JS array type. +var $sliceToNativeArray = function(slice) { + if (slice.$array.constructor !== Array) { + return slice.$array.subarray(slice.$offset, slice.$offset + slice.$length); + } + return slice.$array.slice(slice.$offset, slice.$offset + slice.$length); +}; + +// Convert Go slice to a pointer to an underlying Go array. +// +// Note that an array pointer can be represented by an "unwrapped" native array +// type, and it will be wrapped back into its Go type when necessary. +var $sliceToGoArray = function(slice, arrayPtrType) { + var arrayType = arrayPtrType.elem; + if (arrayType !== undefined && slice.$length < arrayType.len) { + $throwRuntimeError("cannot convert slice with length " + slice.$length + " to pointer to array with length " + arrayType.len); + } + if (slice == slice.constructor.nil) { + return arrayPtrType.nil; // Nil slice converts to nil array pointer. + } + if (slice.$array.constructor !== Array) { + return slice.$array.subarray(slice.$offset, slice.$offset + arrayType.len); + } + if (slice.$offset == 0 && slice.$length == slice.$capacity && slice.$length == arrayType.len) { + return slice.$array; + } + if (arrayType.len == 0) { + return new arrayType([]); + } + + // Array.slice (unlike TypedArray.subarray) returns a copy of an array range, + // which is not sharing memory with the original one, which violates the spec + // for slice to array conversion. This is incompatible with the Go spec, in + // particular that the assignments to the array elements would be visible in + // the slice. Prefer to fail explicitly instead of creating subtle bugs. + $throwRuntimeError("gopherjs: non-numeric slice to underlying array conversion is not supported for subslices"); +}; + +// Convert between compatible slice types (e.g. native and names). +var $convertSliceType = function(slice, desiredType) { + if (slice == slice.constructor.nil) { + return desiredType.nil; // Preserve nil value. + } + + return $subslice(new desiredType(slice.$array), slice.$offset, slice.$offset + slice.$length); +} + +var $decodeRune = function(str, pos) { + var c0 = str.charCodeAt(pos); + + if (c0 < 0x80) { + return [c0, 1]; + } + + if (c0 !== c0 || c0 < 0xC0) { + return [0xFFFD, 1]; + } + + var c1 = str.charCodeAt(pos + 1); + if (c1 !== c1 || c1 < 0x80 || 0xC0 <= c1) { + return [0xFFFD, 1]; + } + + if (c0 < 0xE0) { + var r = (c0 & 0x1F) << 6 | (c1 & 0x3F); + if (r <= 0x7F) { + return [0xFFFD, 1]; + } + return [r, 2]; + } + + var c2 = str.charCodeAt(pos + 2); + if (c2 !== c2 || c2 < 0x80 || 0xC0 <= c2) { + return [0xFFFD, 1]; + } + + if (c0 < 0xF0) { + var r = (c0 & 0x0F) << 12 | (c1 & 0x3F) << 6 | (c2 & 0x3F); + if (r <= 0x7FF) { + return [0xFFFD, 1]; + } + if (0xD800 <= r && r <= 0xDFFF) { + return [0xFFFD, 1]; + } + return [r, 3]; + } + + var c3 = str.charCodeAt(pos + 3); + if (c3 !== c3 || c3 < 0x80 || 0xC0 <= c3) { + return [0xFFFD, 1]; + } + + if (c0 < 0xF8) { + var r = (c0 & 0x07) << 18 | (c1 & 0x3F) << 12 | (c2 & 0x3F) << 6 | (c3 & 0x3F); + if (r <= 0xFFFF || 0x10FFFF < r) { + return [0xFFFD, 1]; + } + return [r, 4]; + } + + return [0xFFFD, 1]; +}; + +var $encodeRune = function(r) { + if (r < 0 || r > 0x10FFFF || (0xD800 <= r && r <= 0xDFFF)) { + r = 0xFFFD; + } + if (r <= 0x7F) { + return String.fromCharCode(r); + } + if (r <= 0x7FF) { + return String.fromCharCode(0xC0 | r >> 6, 0x80 | (r & 0x3F)); + } + if (r <= 0xFFFF) { + return String.fromCharCode(0xE0 | r >> 12, 0x80 | (r >> 6 & 0x3F), 0x80 | (r & 0x3F)); + } + return String.fromCharCode(0xF0 | r >> 18, 0x80 | (r >> 12 & 0x3F), 0x80 | (r >> 6 & 0x3F), 0x80 | (r & 0x3F)); +}; + +var $stringToBytes = function(str) { + var array = new Uint8Array(str.length); + for (var i = 0; i < str.length; i++) { + array[i] = str.charCodeAt(i); + } + return array; +}; + +var $bytesToString = function(slice) { + if (slice.$length === 0) { + return ""; + } + var str = ""; + for (var i = 0; i < slice.$length; i += 10000) { + str += String.fromCharCode.apply(undefined, slice.$array.subarray(slice.$offset + i, slice.$offset + Math.min(slice.$length, i + 10000))); + } + return str; +}; + +var $stringToRunes = function(str) { + var array = new Int32Array(str.length); + var rune, j = 0; + for (var i = 0; i < str.length; i += rune[1], j++) { + rune = $decodeRune(str, i); + array[j] = rune[0]; + } + return array.subarray(0, j); +}; + +var $runesToString = function(slice) { + if (slice.$length === 0) { + return ""; + } + var str = ""; + for (var i = 0; i < slice.$length; i++) { + str += $encodeRune(slice.$array[slice.$offset + i]); + } + return str; +}; + +var $copyString = function(dst, src) { + var n = Math.min(src.length, dst.$length); + for (var i = 0; i < n; i++) { + dst.$array[dst.$offset + i] = src.charCodeAt(i); + } + return n; +}; + +var $copySlice = function(dst, src) { + var n = Math.min(src.$length, dst.$length); + $copyArray(dst.$array, src.$array, dst.$offset, src.$offset, n, dst.constructor.elem); + return n; +}; + +var $copyArray = function(dst, src, dstOffset, srcOffset, n, elem) { + if (n === 0 || (dst === src && dstOffset === srcOffset)) { + return; + } + + if (src.subarray) { + dst.set(src.subarray(srcOffset, srcOffset + n), dstOffset); + return; + } + + switch (elem.kind) { + case $kindArray: + case $kindStruct: + if (dst === src && dstOffset > srcOffset) { + for (var i = n - 1; i >= 0; i--) { + elem.copy(dst[dstOffset + i], src[srcOffset + i]); + } + return; + } + for (var i = 0; i < n; i++) { + elem.copy(dst[dstOffset + i], src[srcOffset + i]); + } + return; + } + + if (dst === src && dstOffset > srcOffset) { + for (var i = n - 1; i >= 0; i--) { + dst[dstOffset + i] = src[srcOffset + i]; + } + return; + } + for (var i = 0; i < n; i++) { + dst[dstOffset + i] = src[srcOffset + i]; + } +}; + +var $clone = function(src, type) { + var clone = type.zero(); + type.copy(clone, src); + return clone; +}; + +var $pointerOfStructConversion = function(obj, type) { + if(obj.$proxies === undefined) { + obj.$proxies = {}; + obj.$proxies[obj.constructor.string] = obj; + } + var proxy = obj.$proxies[type.string]; + if (proxy === undefined) { + var properties = {}; + for (var i = 0; i < type.elem.fields.length; i++) { + (function(fieldProp) { + properties[fieldProp] = { + get: function() { return obj[fieldProp]; }, + set: function(value) { obj[fieldProp] = value; } + }; + })(type.elem.fields[i].prop); + } + proxy = Object.create(type.prototype, properties); + proxy.$val = proxy; + obj.$proxies[type.string] = proxy; + proxy.$proxies = obj.$proxies; + } + return proxy; +}; + +var $append = function(slice) { + return $internalAppend(slice, arguments, 1, arguments.length - 1); +}; + +var $appendSlice = function(slice, toAppend) { + if (toAppend.constructor === String) { + var bytes = $stringToBytes(toAppend); + return $internalAppend(slice, bytes, 0, bytes.length); + } + return $internalAppend(slice, toAppend.$array, toAppend.$offset, toAppend.$length); +}; + +var $internalAppend = function(slice, array, offset, length) { + if (length === 0) { + return slice; + } + + var newArray = slice.$array; + var newOffset = slice.$offset; + var newLength = slice.$length + length; + var newCapacity = slice.$capacity; + + if (newLength > newCapacity) { + newOffset = 0; + newCapacity = Math.max(newLength, slice.$capacity < 1024 ? slice.$capacity * 2 : Math.floor(slice.$capacity * 5 / 4)); + + if (slice.$array.constructor === Array) { + newArray = slice.$array.slice(slice.$offset, slice.$offset + slice.$length); + newArray.length = newCapacity; + var zero = slice.constructor.elem.zero; + for (var i = slice.$length; i < newCapacity; i++) { + newArray[i] = zero(); + } + } else { + newArray = new slice.$array.constructor(newCapacity); + newArray.set(slice.$array.subarray(slice.$offset, slice.$offset + slice.$length)); + } + } + + $copyArray(newArray, array, newOffset + slice.$length, offset, length, slice.constructor.elem); + + var newSlice = new slice.constructor(newArray); + newSlice.$offset = newOffset; + newSlice.$length = newLength; + newSlice.$capacity = newCapacity; + return newSlice; +}; + +var $equal = function(a, b, type) { + if (type === $jsObjectPtr) { + return a === b; + } + switch (type.kind) { + case $kindComplex64: + case $kindComplex128: + return a.$real === b.$real && a.$imag === b.$imag; + case $kindInt64: + case $kindUint64: + return a.$high === b.$high && a.$low === b.$low; + case $kindArray: + if (a.length !== b.length) { + return false; + } + for (var i = 0; i < a.length; i++) { + if (!$equal(a[i], b[i], type.elem)) { + return false; + } + } + return true; + case $kindStruct: + for (var i = 0; i < type.fields.length; i++) { + var f = type.fields[i]; + if (!$equal(a[f.prop], b[f.prop], f.typ)) { + return false; + } + } + return true; + case $kindInterface: + return $interfaceIsEqual(a, b); + default: + return a === b; + } +}; + +var $interfaceIsEqual = function(a, b) { + if (a === $ifaceNil || b === $ifaceNil) { + return a === b; + } + if (a.constructor !== b.constructor) { + return false; + } + if (a.constructor === $jsObjectPtr) { + return a.object === b.object; + } + if (!a.constructor.comparable) { + $throwRuntimeError("comparing uncomparable type " + a.constructor.string); + } + return $equal(a.$val, b.$val, a.constructor); +}; + +var $min = Math.min; +var $mod = function(x, y) { return x % y; }; +var $parseInt = parseInt; +var $parseFloat = function(f) { + if (f !== undefined && f !== null && f.constructor === Number) { + return f; + } + return parseFloat(f); +}; + +var $froundBuf = new Float32Array(1); +var $fround = Math.fround || function(f) { + $froundBuf[0] = f; + return $froundBuf[0]; +}; + +var $imul = Math.imul || function(a, b) { + var ah = (a >>> 16) & 0xffff; + var al = a & 0xffff; + var bh = (b >>> 16) & 0xffff; + var bl = b & 0xffff; + return ((al * bl) + (((ah * bl + al * bh) << 16) >>> 0) >> 0); +}; + +var $floatKey = function(f) { + if (f !== f) { + $idCounter++; + return "NaN$" + $idCounter; + } + return String(f); +}; + +var $flatten64 = function(x) { + return x.$high * 4294967296 + x.$low; +}; + +var $shiftLeft64 = function(x, y) { + if (y === 0) { + return x; + } + if (y < 32) { + return new x.constructor(x.$high << y | x.$low >>> (32 - y), (x.$low << y) >>> 0); + } + if (y < 64) { + return new x.constructor(x.$low << (y - 32), 0); + } + return new x.constructor(0, 0); +}; + +var $shiftRightInt64 = function(x, y) { + if (y === 0) { + return x; + } + if (y < 32) { + return new x.constructor(x.$high >> y, (x.$low >>> y | x.$high << (32 - y)) >>> 0); + } + if (y < 64) { + return new x.constructor(x.$high >> 31, (x.$high >> (y - 32)) >>> 0); + } + if (x.$high < 0) { + return new x.constructor(-1, 4294967295); + } + return new x.constructor(0, 0); +}; + +var $shiftRightUint64 = function(x, y) { + if (y === 0) { + return x; + } + if (y < 32) { + return new x.constructor(x.$high >>> y, (x.$low >>> y | x.$high << (32 - y)) >>> 0); + } + if (y < 64) { + return new x.constructor(0, x.$high >>> (y - 32)); + } + return new x.constructor(0, 0); +}; + +var $mul64 = function(x, y) { + var x48 = x.$high >>> 16; + var x32 = x.$high & 0xFFFF; + var x16 = x.$low >>> 16; + var x00 = x.$low & 0xFFFF; + + var y48 = y.$high >>> 16; + var y32 = y.$high & 0xFFFF; + var y16 = y.$low >>> 16; + var y00 = y.$low & 0xFFFF; + + var z48 = 0, z32 = 0, z16 = 0, z00 = 0; + z00 += x00 * y00; + z16 += z00 >>> 16; + z00 &= 0xFFFF; + z16 += x16 * y00; + z32 += z16 >>> 16; + z16 &= 0xFFFF; + z16 += x00 * y16; + z32 += z16 >>> 16; + z16 &= 0xFFFF; + z32 += x32 * y00; + z48 += z32 >>> 16; + z32 &= 0xFFFF; + z32 += x16 * y16; + z48 += z32 >>> 16; + z32 &= 0xFFFF; + z32 += x00 * y32; + z48 += z32 >>> 16; + z32 &= 0xFFFF; + z48 += x48 * y00 + x32 * y16 + x16 * y32 + x00 * y48; + z48 &= 0xFFFF; + + var hi = ((z48 << 16) | z32) >>> 0; + var lo = ((z16 << 16) | z00) >>> 0; + + var r = new x.constructor(hi, lo); + return r; +}; + +var $div64 = function(x, y, returnRemainder) { + if (y.$high === 0 && y.$low === 0) { + $throwRuntimeError("integer divide by zero"); + } + + var s = 1; + var rs = 1; + + var xHigh = x.$high; + var xLow = x.$low; + if (xHigh < 0) { + s = -1; + rs = -1; + xHigh = -xHigh; + if (xLow !== 0) { + xHigh--; + xLow = 4294967296 - xLow; + } + } + + var yHigh = y.$high; + var yLow = y.$low; + if (y.$high < 0) { + s *= -1; + yHigh = -yHigh; + if (yLow !== 0) { + yHigh--; + yLow = 4294967296 - yLow; + } + } + + var high = 0, low = 0, n = 0; + while (yHigh < 2147483648 && ((xHigh > yHigh) || (xHigh === yHigh && xLow > yLow))) { + yHigh = (yHigh << 1 | yLow >>> 31) >>> 0; + yLow = (yLow << 1) >>> 0; + n++; + } + for (var i = 0; i <= n; i++) { + high = high << 1 | low >>> 31; + low = (low << 1) >>> 0; + if ((xHigh > yHigh) || (xHigh === yHigh && xLow >= yLow)) { + xHigh = xHigh - yHigh; + xLow = xLow - yLow; + if (xLow < 0) { + xHigh--; + xLow += 4294967296; + } + low++; + if (low === 4294967296) { + high++; + low = 0; + } + } + yLow = (yLow >>> 1 | yHigh << (32 - 1)) >>> 0; + yHigh = yHigh >>> 1; + } + + if (returnRemainder) { + return new x.constructor(xHigh * rs, xLow * rs); + } + return new x.constructor(high * s, low * s); +}; + +var $divComplex = function(n, d) { + var ninf = n.$real === Infinity || n.$real === -Infinity || n.$imag === Infinity || n.$imag === -Infinity; + var dinf = d.$real === Infinity || d.$real === -Infinity || d.$imag === Infinity || d.$imag === -Infinity; + var nnan = !ninf && (n.$real !== n.$real || n.$imag !== n.$imag); + var dnan = !dinf && (d.$real !== d.$real || d.$imag !== d.$imag); + if(nnan || dnan) { + return new n.constructor(NaN, NaN); + } + if (ninf && !dinf) { + return new n.constructor(Infinity, Infinity); + } + if (!ninf && dinf) { + return new n.constructor(0, 0); + } + if (d.$real === 0 && d.$imag === 0) { + if (n.$real === 0 && n.$imag === 0) { + return new n.constructor(NaN, NaN); + } + return new n.constructor(Infinity, Infinity); + } + var a = Math.abs(d.$real); + var b = Math.abs(d.$imag); + if (a <= b) { + var ratio = d.$real / d.$imag; + var denom = d.$real * ratio + d.$imag; + return new n.constructor((n.$real * ratio + n.$imag) / denom, (n.$imag * ratio - n.$real) / denom); + } + var ratio = d.$imag / d.$real; + var denom = d.$imag * ratio + d.$real; + return new n.constructor((n.$imag * ratio + n.$real) / denom, (n.$imag - n.$real * ratio) / denom); +}; + +var $kindBool = 1; +var $kindInt = 2; +var $kindInt8 = 3; +var $kindInt16 = 4; +var $kindInt32 = 5; +var $kindInt64 = 6; +var $kindUint = 7; +var $kindUint8 = 8; +var $kindUint16 = 9; +var $kindUint32 = 10; +var $kindUint64 = 11; +var $kindUintptr = 12; +var $kindFloat32 = 13; +var $kindFloat64 = 14; +var $kindComplex64 = 15; +var $kindComplex128 = 16; +var $kindArray = 17; +var $kindChan = 18; +var $kindFunc = 19; +var $kindInterface = 20; +var $kindMap = 21; +var $kindPtr = 22; +var $kindSlice = 23; +var $kindString = 24; +var $kindStruct = 25; +var $kindUnsafePointer = 26; + +var $methodSynthesizers = []; +var $addMethodSynthesizer = function(f) { + if ($methodSynthesizers === null) { + f(); + return; + } + $methodSynthesizers.push(f); +}; +var $synthesizeMethods = function() { + $methodSynthesizers.forEach(function(f) { f(); }); + $methodSynthesizers = null; +}; + +var $ifaceKeyFor = function(x) { + if (x === $ifaceNil) { + return 'nil'; + } + var c = x.constructor; + return c.string + '$' + c.keyFor(x.$val); +}; + +var $identity = function(x) { return x; }; + +var $typeIDCounter = 0; + +var $idKey = function(x) { + if (x.$id === undefined) { + $idCounter++; + x.$id = $idCounter; + } + return String(x.$id); +}; + +// Creates constructor functions for array pointer types. Returns a new function +// instace each time to make sure each type is independent of the other. +var $arrayPtrCtor = function() { + return function(array) { + this.$get = function() { return array; }; + this.$set = function(v) { typ.copy(this, v); }; + this.$val = array; + } +} + +var $newType = function(size, kind, string, named, pkg, exported, constructor) { + var typ; + switch(kind) { + case $kindBool: + case $kindInt: + case $kindInt8: + case $kindInt16: + case $kindInt32: + case $kindUint: + case $kindUint8: + case $kindUint16: + case $kindUint32: + case $kindUintptr: + case $kindUnsafePointer: + typ = function(v) { this.$val = v; }; + typ.wrapped = true; + typ.keyFor = $identity; + break; + + case $kindString: + typ = function(v) { this.$val = v; }; + typ.wrapped = true; + typ.keyFor = function(x) { return "$" + x; }; + break; + + case $kindFloat32: + case $kindFloat64: + typ = function(v) { this.$val = v; }; + typ.wrapped = true; + typ.keyFor = function(x) { return $floatKey(x); }; + break; + + case $kindInt64: + typ = function(high, low) { + this.$high = (high + Math.floor(Math.ceil(low) / 4294967296)) >> 0; + this.$low = low >>> 0; + this.$val = this; + }; + typ.keyFor = function(x) { return x.$high + "$" + x.$low; }; + break; + + case $kindUint64: + typ = function(high, low) { + this.$high = (high + Math.floor(Math.ceil(low) / 4294967296)) >>> 0; + this.$low = low >>> 0; + this.$val = this; + }; + typ.keyFor = function(x) { return x.$high + "$" + x.$low; }; + break; + + case $kindComplex64: + typ = function(real, imag) { + this.$real = $fround(real); + this.$imag = $fround(imag); + this.$val = this; + }; + typ.keyFor = function(x) { return x.$real + "$" + x.$imag; }; + break; + + case $kindComplex128: + typ = function(real, imag) { + this.$real = real; + this.$imag = imag; + this.$val = this; + }; + typ.keyFor = function(x) { return x.$real + "$" + x.$imag; }; + break; + + case $kindArray: + typ = function(v) { this.$val = v; }; + typ.wrapped = true; + typ.ptr = $newType(4, $kindPtr, "*" + string, false, "", false, $arrayPtrCtor()); + typ.init = function(elem, len) { + typ.elem = elem; + typ.len = len; + typ.comparable = elem.comparable; + typ.keyFor = function(x) { + return Array.prototype.join.call($mapArray(x, function(e) { + return String(elem.keyFor(e)).replace(/\\/g, "\\\\").replace(/\$/g, "\\$"); + }), "$"); + }; + typ.copy = function(dst, src) { + $copyArray(dst, src, 0, 0, src.length, elem); + }; + typ.ptr.init(typ); + Object.defineProperty(typ.ptr.nil, "nilCheck", { get: $throwNilPointerError }); + }; + break; + + case $kindChan: + typ = function(v) { this.$val = v; }; + typ.wrapped = true; + typ.keyFor = $idKey; + typ.init = function(elem, sendOnly, recvOnly) { + typ.elem = elem; + typ.sendOnly = sendOnly; + typ.recvOnly = recvOnly; + }; + break; + + case $kindFunc: + typ = function(v) { this.$val = v; }; + typ.wrapped = true; + typ.init = function(params, results, variadic) { + typ.params = params; + typ.results = results; + typ.variadic = variadic; + typ.comparable = false; + }; + break; + + case $kindInterface: + typ = { implementedBy: {}, missingMethodFor: {} }; + typ.keyFor = $ifaceKeyFor; + typ.init = function(methods) { + typ.methods = methods; + methods.forEach(function(m) { + $ifaceNil[m.prop] = $throwNilPointerError; + }); + }; + break; + + case $kindMap: + typ = function(v) { this.$val = v; }; + typ.wrapped = true; + typ.init = function(key, elem) { + typ.key = key; + typ.elem = elem; + typ.comparable = false; + }; + break; + + case $kindPtr: + typ = constructor || function(getter, setter, target) { + this.$get = getter; + this.$set = setter; + this.$target = target; + this.$val = this; + }; + typ.keyFor = $idKey; + typ.init = function(elem) { + typ.elem = elem; + typ.wrapped = (elem.kind === $kindArray); + typ.nil = new typ($throwNilPointerError, $throwNilPointerError); + }; + break; + + case $kindSlice: + typ = function(array) { + if (array.constructor !== typ.nativeArray) { + array = new typ.nativeArray(array); + } + this.$array = array; + this.$offset = 0; + this.$length = array.length; + this.$capacity = array.length; + this.$val = this; + }; + typ.init = function(elem) { + typ.elem = elem; + typ.comparable = false; + typ.nativeArray = $nativeArray(elem.kind); + typ.nil = new typ([]); + }; + break; + + case $kindStruct: + typ = function(v) { this.$val = v; }; + typ.wrapped = true; + typ.ptr = $newType(4, $kindPtr, "*" + string, false, pkg, exported, constructor); + typ.ptr.elem = typ; + typ.ptr.prototype.$get = function() { return this; }; + typ.ptr.prototype.$set = function(v) { typ.copy(this, v); }; + typ.init = function(pkgPath, fields) { + typ.pkgPath = pkgPath; + typ.fields = fields; + fields.forEach(function(f) { + if (!f.typ.comparable) { + typ.comparable = false; + } + }); + typ.keyFor = function(x) { + var val = x.$val; + return $mapArray(fields, function(f) { + return String(f.typ.keyFor(val[f.prop])).replace(/\\/g, "\\\\").replace(/\$/g, "\\$"); + }).join("$"); + }; + typ.copy = function(dst, src) { + for (var i = 0; i < fields.length; i++) { + var f = fields[i]; + switch (f.typ.kind) { + case $kindArray: + case $kindStruct: + f.typ.copy(dst[f.prop], src[f.prop]); + continue; + default: + dst[f.prop] = src[f.prop]; + continue; + } + } + }; + /* nil value */ + var properties = {}; + fields.forEach(function(f) { + properties[f.prop] = { get: $throwNilPointerError, set: $throwNilPointerError }; + }); + typ.ptr.nil = Object.create(constructor.prototype, properties); + typ.ptr.nil.$val = typ.ptr.nil; + /* methods for embedded fields */ + $addMethodSynthesizer(function() { + var synthesizeMethod = function(target, m, f) { + if (target.prototype[m.prop] !== undefined) { return; } + target.prototype[m.prop] = function() { + var v = this.$val[f.prop]; + if (f.typ === $jsObjectPtr) { + v = new $jsObjectPtr(v); + } + if (v.$val === undefined) { + v = new f.typ(v); + } + return v[m.prop].apply(v, arguments); + }; + }; + fields.forEach(function(f) { + if (f.embedded) { + $methodSet(f.typ).forEach(function(m) { + synthesizeMethod(typ, m, f); + synthesizeMethod(typ.ptr, m, f); + }); + $methodSet($ptrType(f.typ)).forEach(function(m) { + synthesizeMethod(typ.ptr, m, f); + }); + } + }); + }); + }; + break; + + default: + $panic(new $String("invalid kind: " + kind)); + } + + switch (kind) { + case $kindBool: + case $kindMap: + typ.zero = function() { return false; }; + break; + + case $kindInt: + case $kindInt8: + case $kindInt16: + case $kindInt32: + case $kindUint: + case $kindUint8 : + case $kindUint16: + case $kindUint32: + case $kindUintptr: + case $kindUnsafePointer: + case $kindFloat32: + case $kindFloat64: + typ.zero = function() { return 0; }; + break; + + case $kindString: + typ.zero = function() { return ""; }; + break; + + case $kindInt64: + case $kindUint64: + case $kindComplex64: + case $kindComplex128: + var zero = new typ(0, 0); + typ.zero = function() { return zero; }; + break; + + case $kindPtr: + case $kindSlice: + typ.zero = function() { return typ.nil; }; + break; + + case $kindChan: + typ.zero = function() { return $chanNil; }; + break; + + case $kindFunc: + typ.zero = function() { return $throwNilPointerError; }; + break; + + case $kindInterface: + typ.zero = function() { return $ifaceNil; }; + break; + + case $kindArray: + typ.zero = function() { + var arrayClass = $nativeArray(typ.elem.kind); + if (arrayClass !== Array) { + return new arrayClass(typ.len); + } + var array = new Array(typ.len); + for (var i = 0; i < typ.len; i++) { + array[i] = typ.elem.zero(); + } + return array; + }; + break; + + case $kindStruct: + typ.zero = function() { return new typ.ptr(); }; + break; + + default: + $panic(new $String("invalid kind: " + kind)); + } + + typ.id = $typeIDCounter; + $typeIDCounter++; + typ.size = size; + typ.kind = kind; + typ.string = string; + typ.named = named; + typ.pkg = pkg; + typ.exported = exported; + typ.methods = []; + typ.methodSetCache = null; + typ.comparable = true; + return typ; +}; + +var $methodSet = function(typ) { + if (typ.methodSetCache !== null) { + return typ.methodSetCache; + } + var base = {}; + + var isPtr = (typ.kind === $kindPtr); + if (isPtr && typ.elem.kind === $kindInterface) { + typ.methodSetCache = []; + return []; + } + + var current = [{typ: isPtr ? typ.elem : typ, indirect: isPtr}]; + + var seen = {}; + + while (current.length > 0) { + var next = []; + var mset = []; + + current.forEach(function(e) { + if (seen[e.typ.string]) { + return; + } + seen[e.typ.string] = true; + + if (e.typ.named) { + mset = mset.concat(e.typ.methods); + if (e.indirect) { + mset = mset.concat($ptrType(e.typ).methods); + } + } + + switch (e.typ.kind) { + case $kindStruct: + e.typ.fields.forEach(function(f) { + if (f.embedded) { + var fTyp = f.typ; + var fIsPtr = (fTyp.kind === $kindPtr); + next.push({typ: fIsPtr ? fTyp.elem : fTyp, indirect: e.indirect || fIsPtr}); + } + }); + break; + + case $kindInterface: + mset = mset.concat(e.typ.methods); + break; + } + }); + + mset.forEach(function(m) { + if (base[m.name] === undefined) { + base[m.name] = m; + } + }); + + current = next; + } + + typ.methodSetCache = []; + Object.keys(base).sort().forEach(function(name) { + typ.methodSetCache.push(base[name]); + }); + return typ.methodSetCache; +}; + +var $Bool = $newType( 1, $kindBool, "bool", true, "", false, null); +var $Int = $newType( 4, $kindInt, "int", true, "", false, null); +var $Int8 = $newType( 1, $kindInt8, "int8", true, "", false, null); +var $Int16 = $newType( 2, $kindInt16, "int16", true, "", false, null); +var $Int32 = $newType( 4, $kindInt32, "int32", true, "", false, null); +var $Int64 = $newType( 8, $kindInt64, "int64", true, "", false, null); +var $Uint = $newType( 4, $kindUint, "uint", true, "", false, null); +var $Uint8 = $newType( 1, $kindUint8, "uint8", true, "", false, null); +var $Uint16 = $newType( 2, $kindUint16, "uint16", true, "", false, null); +var $Uint32 = $newType( 4, $kindUint32, "uint32", true, "", false, null); +var $Uint64 = $newType( 8, $kindUint64, "uint64", true, "", false, null); +var $Uintptr = $newType( 4, $kindUintptr, "uintptr", true, "", false, null); +var $Float32 = $newType( 4, $kindFloat32, "float32", true, "", false, null); +var $Float64 = $newType( 8, $kindFloat64, "float64", true, "", false, null); +var $Complex64 = $newType( 8, $kindComplex64, "complex64", true, "", false, null); +var $Complex128 = $newType(16, $kindComplex128, "complex128", true, "", false, null); +var $String = $newType( 8, $kindString, "string", true, "", false, null); +var $UnsafePointer = $newType( 4, $kindUnsafePointer, "unsafe.Pointer", true, "unsafe", false, null); + +var $nativeArray = function(elemKind) { + switch (elemKind) { + case $kindInt: + return Int32Array; + case $kindInt8: + return Int8Array; + case $kindInt16: + return Int16Array; + case $kindInt32: + return Int32Array; + case $kindUint: + return Uint32Array; + case $kindUint8: + return Uint8Array; + case $kindUint16: + return Uint16Array; + case $kindUint32: + return Uint32Array; + case $kindUintptr: + return Uint32Array; + case $kindFloat32: + return Float32Array; + case $kindFloat64: + return Float64Array; + default: + return Array; + } +}; +var $toNativeArray = function(elemKind, array) { + var nativeArray = $nativeArray(elemKind); + if (nativeArray === Array) { + return array; + } + return new nativeArray(array); +}; +var $arrayTypes = {}; +var $arrayType = function(elem, len) { + var typeKey = elem.id + "$" + len; + var typ = $arrayTypes[typeKey]; + if (typ === undefined) { + typ = $newType(12, $kindArray, "[" + len + "]" + elem.string, false, "", false, null); + $arrayTypes[typeKey] = typ; + typ.init(elem, len); + } + return typ; +}; + +var $chanType = function(elem, sendOnly, recvOnly) { + var string = (recvOnly ? "<-" : "") + "chan" + (sendOnly ? "<- " : " "); + if (!sendOnly && !recvOnly && (elem.string[0] == "<")) { + string += "(" + elem.string + ")"; + } else { + string += elem.string; + } + var field = sendOnly ? "SendChan" : (recvOnly ? "RecvChan" : "Chan"); + var typ = elem[field]; + if (typ === undefined) { + typ = $newType(4, $kindChan, string, false, "", false, null); + elem[field] = typ; + typ.init(elem, sendOnly, recvOnly); + } + return typ; +}; +var $Chan = function(elem, capacity) { + if (capacity < 0 || capacity > 2147483647) { + $throwRuntimeError("makechan: size out of range"); + } + this.$elem = elem; + this.$capacity = capacity; + this.$buffer = []; + this.$sendQueue = []; + this.$recvQueue = []; + this.$closed = false; +}; +var $chanNil = new $Chan(null, 0); +$chanNil.$sendQueue = $chanNil.$recvQueue = { length: 0, push: function() {}, shift: function() { return undefined; }, indexOf: function() { return -1; } }; + +var $funcTypes = {}; +var $funcType = function(params, results, variadic) { + var typeKey = $mapArray(params, function(p) { return p.id; }).join(",") + "$" + $mapArray(results, function(r) { return r.id; }).join(",") + "$" + variadic; + var typ = $funcTypes[typeKey]; + if (typ === undefined) { + var paramTypes = $mapArray(params, function(p) { return p.string; }); + if (variadic) { + paramTypes[paramTypes.length - 1] = "..." + paramTypes[paramTypes.length - 1].substr(2); + } + var string = "func(" + paramTypes.join(", ") + ")"; + if (results.length === 1) { + string += " " + results[0].string; + } else if (results.length > 1) { + string += " (" + $mapArray(results, function(r) { return r.string; }).join(", ") + ")"; + } + typ = $newType(4, $kindFunc, string, false, "", false, null); + $funcTypes[typeKey] = typ; + typ.init(params, results, variadic); + } + return typ; +}; + +var $interfaceTypes = {}; +var $interfaceType = function(methods) { + var typeKey = $mapArray(methods, function(m) { return m.pkg + "," + m.name + "," + m.typ.id; }).join("$"); + var typ = $interfaceTypes[typeKey]; + if (typ === undefined) { + var string = "interface {}"; + if (methods.length !== 0) { + string = "interface { " + $mapArray(methods, function(m) { + return (m.pkg !== "" ? m.pkg + "." : "") + m.name + m.typ.string.substr(4); + }).join("; ") + " }"; + } + typ = $newType(8, $kindInterface, string, false, "", false, null); + $interfaceTypes[typeKey] = typ; + typ.init(methods); + } + return typ; +}; +var $emptyInterface = $interfaceType([]); +var $ifaceNil = {}; +var $error = $newType(8, $kindInterface, "error", true, "", false, null); +$error.init([{prop: "Error", name: "Error", pkg: "", typ: $funcType([], [$String], false)}]); + +var $mapTypes = {}; +var $mapType = function(key, elem) { + var typeKey = key.id + "$" + elem.id; + var typ = $mapTypes[typeKey]; + if (typ === undefined) { + typ = $newType(4, $kindMap, "map[" + key.string + "]" + elem.string, false, "", false, null); + $mapTypes[typeKey] = typ; + typ.init(key, elem); + } + return typ; +}; +var $makeMap = function(keyForFunc, entries) { + var m = {}; + for (var i = 0; i < entries.length; i++) { + var e = entries[i]; + m[keyForFunc(e.k)] = e; + } + return m; +}; + +var $ptrType = function(elem) { + var typ = elem.ptr; + if (typ === undefined) { + typ = $newType(4, $kindPtr, "*" + elem.string, false, "", elem.exported, null); + elem.ptr = typ; + typ.init(elem); + } + return typ; +}; + +var $newDataPointer = function(data, constructor) { + if (constructor.elem.kind === $kindStruct) { + return data; + } + return new constructor(function() { return data; }, function(v) { data = v; }); +}; + +var $indexPtr = function(array, index, constructor) { + if (array.buffer) { + // Pointers to the same underlying ArrayBuffer share cache. + var cache = array.buffer.$ptr = array.buffer.$ptr || {}; + // Pointers of different primitive types are non-comparable and stored in different caches. + var typeCache = cache[array.name] = cache[array.name] || {}; + var cacheIdx = array.BYTES_PER_ELEMENT * index + array.byteOffset; + return typeCache[cacheIdx] || (typeCache[cacheIdx] = new constructor(function() { return array[index]; }, function(v) { array[index] = v; })); + } else { + array.$ptr = array.$ptr || {}; + return array.$ptr[index] || (array.$ptr[index] = new constructor(function() { return array[index]; }, function(v) { array[index] = v; })); + } +}; + +var $sliceType = function(elem) { + var typ = elem.slice; + if (typ === undefined) { + typ = $newType(12, $kindSlice, "[]" + elem.string, false, "", false, null); + elem.slice = typ; + typ.init(elem); + } + return typ; +}; +var $makeSlice = function(typ, length, capacity) { + capacity = capacity || length; + if (length < 0 || length > 2147483647) { + $throwRuntimeError("makeslice: len out of range"); + } + if (capacity < 0 || capacity < length || capacity > 2147483647) { + $throwRuntimeError("makeslice: cap out of range"); + } + var array = new typ.nativeArray(capacity); + if (typ.nativeArray === Array) { + for (var i = 0; i < capacity; i++) { + array[i] = typ.elem.zero(); + } + } + var slice = new typ(array); + slice.$length = length; + return slice; +}; + +var $structTypes = {}; +var $structType = function(pkgPath, fields) { + var typeKey = $mapArray(fields, function(f) { return f.name + "," + f.typ.id + "," + f.tag; }).join("$"); + var typ = $structTypes[typeKey]; + if (typ === undefined) { + var string = "struct { " + $mapArray(fields, function(f) { + var str = f.typ.string + (f.tag !== "" ? (" \"" + f.tag.replace(/\\/g, "\\\\").replace(/"/g, "\\\"") + "\"") : ""); + if (f.embedded) { + return str; + } + return f.name + " " + str; + }).join("; ") + " }"; + if (fields.length === 0) { + string = "struct {}"; + } + typ = $newType(0, $kindStruct, string, false, "", false, function() { + this.$val = this; + for (var i = 0; i < fields.length; i++) { + var f = fields[i]; + if (f.name == '_') { + continue; + } + var arg = arguments[i]; + this[f.prop] = arg !== undefined ? arg : f.typ.zero(); + } + }); + $structTypes[typeKey] = typ; + typ.init(pkgPath, fields); + } + return typ; +}; + +var $assertType = function(value, type, returnTuple) { + var isInterface = (type.kind === $kindInterface), ok, missingMethod = ""; + if (value === $ifaceNil) { + ok = false; + } else if (!isInterface) { + ok = value.constructor === type; + } else { + var valueTypeString = value.constructor.string; + ok = type.implementedBy[valueTypeString]; + if (ok === undefined) { + ok = true; + var valueMethodSet = $methodSet(value.constructor); + var interfaceMethods = type.methods; + for (var i = 0; i < interfaceMethods.length; i++) { + var tm = interfaceMethods[i]; + var found = false; + for (var j = 0; j < valueMethodSet.length; j++) { + var vm = valueMethodSet[j]; + if (vm.name === tm.name && vm.pkg === tm.pkg && vm.typ === tm.typ) { + found = true; + break; + } + } + if (!found) { + ok = false; + type.missingMethodFor[valueTypeString] = tm.name; + break; + } + } + type.implementedBy[valueTypeString] = ok; + } + if (!ok) { + missingMethod = type.missingMethodFor[valueTypeString]; + } + } + + if (!ok) { + if (returnTuple) { + return [type.zero(), false]; + } + $panic(new $packages["runtime"].TypeAssertionError.ptr( + $packages["runtime"]._type.ptr.nil, + (value === $ifaceNil ? $packages["runtime"]._type.ptr.nil : new $packages["runtime"]._type.ptr(value.constructor.string)), + new $packages["runtime"]._type.ptr(type.string), + missingMethod)); + } + + if (!isInterface) { + value = value.$val; + } + if (type === $jsObjectPtr) { + value = value.object; + } + return returnTuple ? [value, true] : value; +}; + +var $stackDepthOffset = 0; +var $getStackDepth = function() { + var err = new Error(); + if (err.stack === undefined) { + return undefined; + } + return $stackDepthOffset + err.stack.split("\n").length; +}; + +var $panicStackDepth = null, $panicValue; +var $callDeferred = function(deferred, jsErr, fromPanic) { + if (!fromPanic && deferred !== null && $curGoroutine.deferStack.indexOf(deferred) == -1) { + throw jsErr; + } + if (jsErr !== null) { + var newErr = null; + try { + $panic(new $jsErrorPtr(jsErr)); + } catch (err) { + newErr = err; + } + $callDeferred(deferred, newErr); + return; + } + if ($curGoroutine.asleep) { + return; + } + + $stackDepthOffset--; + var outerPanicStackDepth = $panicStackDepth; + var outerPanicValue = $panicValue; + + var localPanicValue = $curGoroutine.panicStack.pop(); + if (localPanicValue !== undefined) { + $panicStackDepth = $getStackDepth(); + $panicValue = localPanicValue; + } + + try { + while (true) { + if (deferred === null) { + deferred = $curGoroutine.deferStack[$curGoroutine.deferStack.length - 1]; + if (deferred === undefined) { + /* The panic reached the top of the stack. Clear it and throw it as a JavaScript error. */ + $panicStackDepth = null; + if (localPanicValue.Object instanceof Error) { + throw localPanicValue.Object; + } + var msg; + if (localPanicValue.constructor === $String) { + msg = localPanicValue.$val; + } else if (localPanicValue.Error !== undefined) { + msg = localPanicValue.Error(); + } else if (localPanicValue.String !== undefined) { + msg = localPanicValue.String(); + } else { + msg = localPanicValue; + } + throw new Error(msg); + } + } + var call = deferred.pop(); + if (call === undefined) { + $curGoroutine.deferStack.pop(); + if (localPanicValue !== undefined) { + deferred = null; + continue; + } + return; + } + var r = call[0].apply(call[2], call[1]); + if (r && r.$blk !== undefined) { + deferred.push([r.$blk, [], r]); + if (fromPanic) { + throw null; + } + return; + } + + if (localPanicValue !== undefined && $panicStackDepth === null) { + /* error was recovered */ + if (fromPanic) { + throw null; + } + return; + } + } + } catch(e) { + // Deferred function threw a JavaScript exception or tries to unwind stack + // to the point where a panic was handled. + if (fromPanic) { + // Re-throw the exception to reach deferral execution call at the end + // of the function. + throw e; + } + // We are at the end of the function, handle the error or re-throw to + // continue unwinding if necessary, or simply stop unwinding if we got far + // enough. + $callDeferred(deferred, e, fromPanic); + } finally { + if (localPanicValue !== undefined) { + if ($panicStackDepth !== null) { + $curGoroutine.panicStack.push(localPanicValue); + } + $panicStackDepth = outerPanicStackDepth; + $panicValue = outerPanicValue; + } + $stackDepthOffset++; + } +}; + +var $panic = function(value) { + $curGoroutine.panicStack.push(value); + $callDeferred(null, null, true); +}; +var $recover = function() { + if ($panicStackDepth === null || ($panicStackDepth !== undefined && $panicStackDepth !== $getStackDepth() - 2)) { + return $ifaceNil; + } + $panicStackDepth = null; + return $panicValue; +}; +var $throw = function(err) { throw err; }; + +var $noGoroutine = { asleep: false, exit: false, deferStack: [], panicStack: [] }; +var $curGoroutine = $noGoroutine, $totalGoroutines = 0, $awakeGoroutines = 0, $checkForDeadlock = true, $exportedFunctions = 0; +var $mainFinished = false; +var $go = function(fun, args) { + $totalGoroutines++; + $awakeGoroutines++; + var $goroutine = function() { + try { + $curGoroutine = $goroutine; + var r = fun.apply(undefined, args); + if (r && r.$blk !== undefined) { + fun = function() { return r.$blk(); }; + args = []; + return; + } + $goroutine.exit = true; + } catch (err) { + if (!$goroutine.exit) { + throw err; + } + } finally { + $curGoroutine = $noGoroutine; + if ($goroutine.exit) { /* also set by runtime.Goexit() */ + $totalGoroutines--; + $goroutine.asleep = true; + } + if ($goroutine.asleep) { + $awakeGoroutines--; + if (!$mainFinished && $awakeGoroutines === 0 && $checkForDeadlock && $exportedFunctions === 0) { + console.error("fatal error: all goroutines are asleep - deadlock!"); + if ($global.process !== undefined) { + $global.process.exit(2); + } + } + } + } + }; + $goroutine.asleep = false; + $goroutine.exit = false; + $goroutine.deferStack = []; + $goroutine.panicStack = []; + $schedule($goroutine); +}; + +var $scheduled = []; +var $runScheduled = function() { + // For nested setTimeout calls browsers enforce 4ms minimum delay. We minimize + // the effect of this penalty by queueing the timer preemptively before we run + // the goroutines, and later cancelling it if it turns out unneeded. See: + // https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#nested_timeouts + var nextRun = setTimeout($runScheduled); + try { + var start = Date.now(); + var r; + while ((r = $scheduled.shift()) !== undefined) { + r(); + // We need to interrupt this loop in order to allow the event loop to + // process timers, IO, etc. However, invoking scheduling through + // setTimeout is ~1000 times more expensive, so we amortize this cost by + // looping until the 4ms minimal delay has elapsed (assuming there are + // scheduled goroutines to run), and then yield to the event loop. + var elapsed = Date.now() - start; + if (elapsed > 4 || elapsed < 0) { break; } + } + } finally { + if ($scheduled.length == 0) { + // Cancel scheduling pass if there's nothing to run. + clearTimeout(nextRun); + } + } +}; + +var $schedule = function(goroutine) { + if (goroutine.asleep) { + goroutine.asleep = false; + $awakeGoroutines++; + } + $scheduled.push(goroutine); + if ($curGoroutine === $noGoroutine) { + $runScheduled(); + } +}; + +var $setTimeout = function(f, t) { + $awakeGoroutines++; + return setTimeout(function() { + $awakeGoroutines--; + f(); + }, t); +}; + +var $block = function() { + if ($curGoroutine === $noGoroutine) { + $throwRuntimeError("cannot block in JavaScript callback, fix by wrapping code in goroutine"); + } + $curGoroutine.asleep = true; +}; + +var $restore = function(context, params) { + if (context !== undefined && context.$blk !== undefined) { + return context; + } + return params; +} + +var $send = function(chan, value) { + if (chan.$closed) { + $throwRuntimeError("send on closed channel"); + } + var queuedRecv = chan.$recvQueue.shift(); + if (queuedRecv !== undefined) { + queuedRecv([value, true]); + return; + } + if (chan.$buffer.length < chan.$capacity) { + chan.$buffer.push(value); + return; + } + + var thisGoroutine = $curGoroutine; + var closedDuringSend; + chan.$sendQueue.push(function(closed) { + closedDuringSend = closed; + $schedule(thisGoroutine); + return value; + }); + $block(); + return { + $blk: function() { + if (closedDuringSend) { + $throwRuntimeError("send on closed channel"); + } + } + }; +}; +var $recv = function(chan) { + var queuedSend = chan.$sendQueue.shift(); + if (queuedSend !== undefined) { + chan.$buffer.push(queuedSend(false)); + } + var bufferedValue = chan.$buffer.shift(); + if (bufferedValue !== undefined) { + return [bufferedValue, true]; + } + if (chan.$closed) { + return [chan.$elem.zero(), false]; + } + + var thisGoroutine = $curGoroutine; + var f = { $blk: function() { return this.value; } }; + var queueEntry = function(v) { + f.value = v; + $schedule(thisGoroutine); + }; + chan.$recvQueue.push(queueEntry); + $block(); + return f; +}; +var $close = function(chan) { + if (chan.$closed) { + $throwRuntimeError("close of closed channel"); + } + chan.$closed = true; + while (true) { + var queuedSend = chan.$sendQueue.shift(); + if (queuedSend === undefined) { + break; + } + queuedSend(true); /* will panic */ + } + while (true) { + var queuedRecv = chan.$recvQueue.shift(); + if (queuedRecv === undefined) { + break; + } + queuedRecv([chan.$elem.zero(), false]); + } +}; +var $select = function(comms) { + var ready = []; + var selection = -1; + for (var i = 0; i < comms.length; i++) { + var comm = comms[i]; + var chan = comm[0]; + switch (comm.length) { + case 0: /* default */ + selection = i; + break; + case 1: /* recv */ + if (chan.$sendQueue.length !== 0 || chan.$buffer.length !== 0 || chan.$closed) { + ready.push(i); + } + break; + case 2: /* send */ + if (chan.$closed) { + $throwRuntimeError("send on closed channel"); + } + if (chan.$recvQueue.length !== 0 || chan.$buffer.length < chan.$capacity) { + ready.push(i); + } + break; + } + } + + if (ready.length !== 0) { + selection = ready[Math.floor(Math.random() * ready.length)]; + } + if (selection !== -1) { + var comm = comms[selection]; + switch (comm.length) { + case 0: /* default */ + return [selection]; + case 1: /* recv */ + return [selection, $recv(comm[0])]; + case 2: /* send */ + $send(comm[0], comm[1]); + return [selection]; + } + } + + var entries = []; + var thisGoroutine = $curGoroutine; + var f = { $blk: function() { return this.selection; } }; + var removeFromQueues = function() { + for (var i = 0; i < entries.length; i++) { + var entry = entries[i]; + var queue = entry[0]; + var index = queue.indexOf(entry[1]); + if (index !== -1) { + queue.splice(index, 1); + } + } + }; + for (var i = 0; i < comms.length; i++) { + (function(i) { + var comm = comms[i]; + switch (comm.length) { + case 1: /* recv */ + var queueEntry = function(value) { + f.selection = [i, value]; + removeFromQueues(); + $schedule(thisGoroutine); + }; + entries.push([comm[0].$recvQueue, queueEntry]); + comm[0].$recvQueue.push(queueEntry); + break; + case 2: /* send */ + var queueEntry = function() { + if (comm[0].$closed) { + $throwRuntimeError("send on closed channel"); + } + f.selection = [i]; + removeFromQueues(); + $schedule(thisGoroutine); + return comm[1]; + }; + entries.push([comm[0].$sendQueue, queueEntry]); + comm[0].$sendQueue.push(queueEntry); + break; + } + })(i); + } + $block(); + return f; +}; + +var $jsObjectPtr, $jsErrorPtr; + +var $needsExternalization = function(t) { + switch (t.kind) { + case $kindBool: + case $kindInt: + case $kindInt8: + case $kindInt16: + case $kindInt32: + case $kindUint: + case $kindUint8: + case $kindUint16: + case $kindUint32: + case $kindUintptr: + case $kindFloat32: + case $kindFloat64: + return false; + default: + return t !== $jsObjectPtr; + } +}; + +var $externalize = function(v, t, makeWrapper) { + if (t === $jsObjectPtr) { + return v; + } + switch (t.kind) { + case $kindBool: + case $kindInt: + case $kindInt8: + case $kindInt16: + case $kindInt32: + case $kindUint: + case $kindUint8: + case $kindUint16: + case $kindUint32: + case $kindUintptr: + case $kindFloat32: + case $kindFloat64: + return v; + case $kindInt64: + case $kindUint64: + return $flatten64(v); + case $kindArray: + if ($needsExternalization(t.elem)) { + return $mapArray(v, function(e) { return $externalize(e, t.elem, makeWrapper); }); + } + return v; + case $kindFunc: + return $externalizeFunction(v, t, false, makeWrapper); + case $kindInterface: + if (v === $ifaceNil) { + return null; + } + if (v.constructor === $jsObjectPtr) { + return v.$val.object; + } + return $externalize(v.$val, v.constructor, makeWrapper); + case $kindMap: + var m = {}; + var keys = $keys(v); + for (var i = 0; i < keys.length; i++) { + var entry = v[keys[i]]; + m[$externalize(entry.k, t.key, makeWrapper)] = $externalize(entry.v, t.elem, makeWrapper); + } + return m; + case $kindPtr: + if (v === t.nil) { + return null; + } + return $externalize(v.$get(), t.elem, makeWrapper); + case $kindSlice: + if ($needsExternalization(t.elem)) { + return $mapArray($sliceToNativeArray(v), function(e) { return $externalize(e, t.elem, makeWrapper); }); + } + return $sliceToNativeArray(v); + case $kindString: + if ($isASCII(v)) { + return v; + } + var s = "", r; + for (var i = 0; i < v.length; i += r[1]) { + r = $decodeRune(v, i); + var c = r[0]; + if (c > 0xFFFF) { + var h = Math.floor((c - 0x10000) / 0x400) + 0xD800; + var l = (c - 0x10000) % 0x400 + 0xDC00; + s += String.fromCharCode(h, l); + continue; + } + s += String.fromCharCode(c); + } + return s; + case $kindStruct: + var timePkg = $packages["time"]; + if (timePkg !== undefined && v.constructor === timePkg.Time.ptr) { + var milli = $div64(v.UnixNano(), new $Int64(0, 1000000)); + return new Date($flatten64(milli)); + } + + var noJsObject = {}; + var searchJsObject = function(v, t) { + if (t === $jsObjectPtr) { + return v; + } + switch (t.kind) { + case $kindPtr: + if (v === t.nil) { + return noJsObject; + } + return searchJsObject(v.$get(), t.elem); + case $kindStruct: + var f = t.fields[0]; + return searchJsObject(v[f.prop], f.typ); + case $kindInterface: + return searchJsObject(v.$val, v.constructor); + default: + return noJsObject; + } + }; + var o = searchJsObject(v, t); + if (o !== noJsObject) { + return o; + } + + if (makeWrapper !== undefined) { + return makeWrapper(v); + } + + o = {}; + for (var i = 0; i < t.fields.length; i++) { + var f = t.fields[i]; + if (!f.exported) { + continue; + } + o[f.name] = $externalize(v[f.prop], f.typ, makeWrapper); + } + return o; + } + $throwRuntimeError("cannot externalize " + t.string); +}; + +var $externalizeFunction = function(v, t, passThis, makeWrapper) { + if (v === $throwNilPointerError) { + return null; + } + if (v.$externalizeWrapper === undefined) { + $checkForDeadlock = false; + v.$externalizeWrapper = function() { + var args = []; + for (var i = 0; i < t.params.length; i++) { + if (t.variadic && i === t.params.length - 1) { + var vt = t.params[i].elem, varargs = []; + for (var j = i; j < arguments.length; j++) { + varargs.push($internalize(arguments[j], vt, makeWrapper)); + } + args.push(new (t.params[i])(varargs)); + break; + } + args.push($internalize(arguments[i], t.params[i], makeWrapper)); + } + var result = v.apply(passThis ? this : undefined, args); + switch (t.results.length) { + case 0: + return; + case 1: + return $externalize($copyIfRequired(result, t.results[0]), t.results[0], makeWrapper); + default: + for (var i = 0; i < t.results.length; i++) { + result[i] = $externalize($copyIfRequired(result[i], t.results[i]), t.results[i], makeWrapper); + } + return result; + } + }; + } + return v.$externalizeWrapper; +}; + +var $internalize = function(v, t, recv, seen, makeWrapper) { + if (t === $jsObjectPtr) { + return v; + } + if (t === $jsObjectPtr.elem) { + $throwRuntimeError("cannot internalize js.Object, use *js.Object instead"); + } + if (v && v.__internal_object__ !== undefined) { + return $assertType(v.__internal_object__, t, false); + } + var timePkg = $packages["time"]; + if (timePkg !== undefined && t === timePkg.Time) { + if (!(v !== null && v !== undefined && v.constructor === Date)) { + $throwRuntimeError("cannot internalize time.Time from " + typeof v + ", must be Date"); + } + return timePkg.Unix(new $Int64(0, 0), new $Int64(0, v.getTime() * 1000000)); + } + + // Cache for values we've already internalized in order to deal with circular + // references. + if (seen === undefined) { seen = new Map(); } + if (!seen.has(t)) { seen.set(t, new Map()); } + if (seen.get(t).has(v)) { return seen.get(t).get(v); } + + switch (t.kind) { + case $kindBool: + return !!v; + case $kindInt: + return parseInt(v); + case $kindInt8: + return parseInt(v) << 24 >> 24; + case $kindInt16: + return parseInt(v) << 16 >> 16; + case $kindInt32: + return parseInt(v) >> 0; + case $kindUint: + return parseInt(v); + case $kindUint8: + return parseInt(v) << 24 >>> 24; + case $kindUint16: + return parseInt(v) << 16 >>> 16; + case $kindUint32: + case $kindUintptr: + return parseInt(v) >>> 0; + case $kindInt64: + case $kindUint64: + return new t(0, v); + case $kindFloat32: + case $kindFloat64: + return parseFloat(v); + case $kindArray: + if (v.length !== t.len) { + $throwRuntimeError("got array with wrong size from JavaScript native"); + } + return $mapArray(v, function(e) { return $internalize(e, t.elem, makeWrapper); }); + case $kindFunc: + return function() { + var args = []; + for (var i = 0; i < t.params.length; i++) { + if (t.variadic && i === t.params.length - 1) { + var vt = t.params[i].elem, varargs = arguments[i]; + for (var j = 0; j < varargs.$length; j++) { + args.push($externalize(varargs.$array[varargs.$offset + j], vt, makeWrapper)); + } + break; + } + args.push($externalize(arguments[i], t.params[i], makeWrapper)); + } + var result = v.apply(recv, args); + switch (t.results.length) { + case 0: + return; + case 1: + return $internalize(result, t.results[0], makeWrapper); + default: + for (var i = 0; i < t.results.length; i++) { + result[i] = $internalize(result[i], t.results[i], makeWrapper); + } + return result; + } + }; + case $kindInterface: + if (t.methods.length !== 0) { + $throwRuntimeError("cannot internalize " + t.string); + } + if (v === null) { + return $ifaceNil; + } + if (v === undefined) { + return new $jsObjectPtr(undefined); + } + switch (v.constructor) { + case Int8Array: + return new ($sliceType($Int8))(v); + case Int16Array: + return new ($sliceType($Int16))(v); + case Int32Array: + return new ($sliceType($Int))(v); + case Uint8Array: + return new ($sliceType($Uint8))(v); + case Uint16Array: + return new ($sliceType($Uint16))(v); + case Uint32Array: + return new ($sliceType($Uint))(v); + case Float32Array: + return new ($sliceType($Float32))(v); + case Float64Array: + return new ($sliceType($Float64))(v); + case Array: + return $internalize(v, $sliceType($emptyInterface), makeWrapper); + case Boolean: + return new $Bool(!!v); + case Date: + if (timePkg === undefined) { + /* time package is not present, internalize as &js.Object{Date} so it can be externalized into original Date. */ + return new $jsObjectPtr(v); + } + return new timePkg.Time($internalize(v, timePkg.Time, makeWrapper)); + case (function () { }).constructor: // is usually Function, but in Chrome extensions it is something else + var funcType = $funcType([$sliceType($emptyInterface)], [$jsObjectPtr], true); + return new funcType($internalize(v, funcType, makeWrapper)); + case Number: + return new $Float64(parseFloat(v)); + case String: + return new $String($internalize(v, $String, makeWrapper)); + default: + if ($global.Node && v instanceof $global.Node) { + return new $jsObjectPtr(v); + } + var mapType = $mapType($String, $emptyInterface); + return new mapType($internalize(v, mapType, recv, seen, makeWrapper)); + } + case $kindMap: + var m = {}; + seen.get(t).set(v, m); + var keys = $keys(v); + for (var i = 0; i < keys.length; i++) { + var k = $internalize(keys[i], t.key, recv, seen, makeWrapper); + m[t.key.keyFor(k)] = { k: k, v: $internalize(v[keys[i]], t.elem, recv, seen, makeWrapper) }; + } + return m; + case $kindPtr: + if (t.elem.kind === $kindStruct) { + return $internalize(v, t.elem, makeWrapper); + } + case $kindSlice: + return new t($mapArray(v, function(e) { return $internalize(e, t.elem, makeWrapper); })); + case $kindString: + v = String(v); + if ($isASCII(v)) { + return v; + } + var s = ""; + var i = 0; + while (i < v.length) { + var h = v.charCodeAt(i); + if (0xD800 <= h && h <= 0xDBFF) { + var l = v.charCodeAt(i + 1); + var c = (h - 0xD800) * 0x400 + l - 0xDC00 + 0x10000; + s += $encodeRune(c); + i += 2; + continue; + } + s += $encodeRune(h); + i++; + } + return s; + case $kindStruct: + var noJsObject = {}; + var searchJsObject = function(t) { + if (t === $jsObjectPtr) { + return v; + } + if (t === $jsObjectPtr.elem) { + $throwRuntimeError("cannot internalize js.Object, use *js.Object instead"); + } + switch (t.kind) { + case $kindPtr: + return searchJsObject(t.elem); + case $kindStruct: + var f = t.fields[0]; + var o = searchJsObject(f.typ); + if (o !== noJsObject) { + var n = new t.ptr(); + n[f.prop] = o; + return n; + } + return noJsObject; + default: + return noJsObject; + } + }; + var o = searchJsObject(t); + if (o !== noJsObject) { + return o; + } + } + $throwRuntimeError("cannot internalize " + t.string); +}; + +var $copyIfRequired = function(v, typ) { + // interface values + if (v && v.constructor && v.constructor.copy) { + return new v.constructor($clone(v.$val, v.constructor)) + } + // array and struct values + if (typ.copy) { + var clone = typ.zero(); + typ.copy(clone, v); + return clone; + } + return v; +} + +/* $isASCII reports whether string s contains only ASCII characters. */ +var $isASCII = function(s) { + for (var i = 0; i < s.length; i++) { + if (s.charCodeAt(i) >= 128) { + return false; + } + } + return true; +}; + +$packages["github.com/gopherjs/gopherjs/js"] = (function() { + var $pkg = {}, $init, Object, Error, M, sliceType, ptrType, sliceType$2, funcType, funcType$1, funcType$2, ptrType$1, MakeWrapper, MakeFullWrapper, init; + Object = $pkg.Object = $newType(0, $kindStruct, "js.Object", true, "github.com/gopherjs/gopherjs/js", true, function(object_) { + this.$val = this; + if (arguments.length === 0) { + this.object = null; + return; + } + this.object = object_; + }); + Error = $pkg.Error = $newType(0, $kindStruct, "js.Error", true, "github.com/gopherjs/gopherjs/js", true, function(Object_) { + this.$val = this; + if (arguments.length === 0) { + this.Object = null; + return; + } + this.Object = Object_; + }); + M = $pkg.M = $newType(4, $kindMap, "js.M", true, "github.com/gopherjs/gopherjs/js", true, null); + sliceType = $sliceType($emptyInterface); + ptrType = $ptrType(Object); + sliceType$2 = $sliceType(ptrType); + funcType = $funcType([sliceType$2], [ptrType], true); + funcType$1 = $funcType([], [ptrType], false); + funcType$2 = $funcType([ptrType], [], false); + ptrType$1 = $ptrType(Error); + Object.ptr.prototype.Get = function(key) { + var key, o; + o = this; + return o.object[$externalize(key, $String)]; + }; + Object.prototype.Get = function(key) { return this.$val.Get(key); }; + Object.ptr.prototype.Set = function(key, value) { + var key, o, value; + o = this; + o.object[$externalize(key, $String)] = $externalize(value, $emptyInterface); + }; + Object.prototype.Set = function(key, value) { return this.$val.Set(key, value); }; + Object.ptr.prototype.Delete = function(key) { + var key, o; + o = this; + delete o.object[$externalize(key, $String)]; + }; + Object.prototype.Delete = function(key) { return this.$val.Delete(key); }; + Object.ptr.prototype.Length = function() { + var o; + o = this; + return $parseInt(o.object.length); + }; + Object.prototype.Length = function() { return this.$val.Length(); }; + Object.ptr.prototype.Index = function(i) { + var i, o; + o = this; + return o.object[i]; + }; + Object.prototype.Index = function(i) { return this.$val.Index(i); }; + Object.ptr.prototype.SetIndex = function(i, value) { + var i, o, value; + o = this; + o.object[i] = $externalize(value, $emptyInterface); + }; + Object.prototype.SetIndex = function(i, value) { return this.$val.SetIndex(i, value); }; + Object.ptr.prototype.Call = function(name, args) { + var args, name, o, obj; + o = this; + return (obj = o.object, obj[$externalize(name, $String)].apply(obj, $externalize(args, sliceType))); + }; + Object.prototype.Call = function(name, args) { return this.$val.Call(name, args); }; + Object.ptr.prototype.Invoke = function(args) { + var args, o; + o = this; + return o.object.apply(undefined, $externalize(args, sliceType)); + }; + Object.prototype.Invoke = function(args) { return this.$val.Invoke(args); }; + Object.ptr.prototype.New = function(args) { + var args, o; + o = this; + return new ($global.Function.prototype.bind.apply(o.object, [undefined].concat($externalize(args, sliceType)))); + }; + Object.prototype.New = function(args) { return this.$val.New(args); }; + Object.ptr.prototype.Bool = function() { + var o; + o = this; + return !!(o.object); + }; + Object.prototype.Bool = function() { return this.$val.Bool(); }; + Object.ptr.prototype.String = function() { + var o; + o = this; + return $internalize(o.object, $String); + }; + Object.prototype.String = function() { return this.$val.String(); }; + Object.ptr.prototype.Int = function() { + var o; + o = this; + return $parseInt(o.object) >> 0; + }; + Object.prototype.Int = function() { return this.$val.Int(); }; + Object.ptr.prototype.Int64 = function() { + var o; + o = this; + return $internalize(o.object, $Int64); + }; + Object.prototype.Int64 = function() { return this.$val.Int64(); }; + Object.ptr.prototype.Uint64 = function() { + var o; + o = this; + return $internalize(o.object, $Uint64); + }; + Object.prototype.Uint64 = function() { return this.$val.Uint64(); }; + Object.ptr.prototype.Float = function() { + var o; + o = this; + return $parseFloat(o.object); + }; + Object.prototype.Float = function() { return this.$val.Float(); }; + Object.ptr.prototype.Interface = function() { + var o; + o = this; + return $internalize(o.object, $emptyInterface); + }; + Object.prototype.Interface = function() { return this.$val.Interface(); }; + Object.ptr.prototype.Unsafe = function() { + var o; + o = this; + return o.object; + }; + Object.prototype.Unsafe = function() { return this.$val.Unsafe(); }; + Error.ptr.prototype.Error = function() { + var err; + err = this; + return "JavaScript error: " + $internalize(err.Object.message, $String); + }; + Error.prototype.Error = function() { return this.$val.Error(); }; + Error.ptr.prototype.Stack = function() { + var err; + err = this; + return $internalize(err.Object.stack, $String); + }; + Error.prototype.Stack = function() { return this.$val.Stack(); }; + MakeWrapper = function(i) { + var i, i$1, m, methods, o, v; + v = i; + o = new ($global.Object)(); + o.__internal_object__ = v; + methods = v.constructor.methods; + i$1 = 0; + while (true) { + if (!(i$1 < $parseInt(methods.length))) { break; } + m = [m]; + m[0] = methods[i$1]; + if (!($internalize(m[0].pkg, $String) === "")) { + i$1 = i$1 + (1) >> 0; + continue; + } + o[$externalize($internalize(m[0].name, $String), $String)] = $externalize((function(m) { return function(args) { + var args; + return $externalizeFunction(v[$externalize($internalize(m[0].prop, $String), $String)], m[0].typ, $externalize(true, $Bool)).apply(v, $externalize(args, sliceType$2)); + }; })(m), funcType); + i$1 = i$1 + (1) >> 0; + } + return o; + }; + $pkg.MakeWrapper = MakeWrapper; + MakeFullWrapper = function(i) { + var {constructor, defineProperty, e, f, fields, i, i$1, i$2, i$3, internalObj, m, methods, ms, pkg, pkgTyp, ptr, typ, wrapperObj, $s, $r, $c} = $restore(this, {i}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + internalObj = [internalObj]; + wrapperObj = [wrapperObj]; + internalObj[0] = i; + constructor = internalObj[0].constructor; + wrapperObj[0] = new ($global.Object)(); + defineProperty = (function(internalObj, wrapperObj) { return function(key, descriptor) { + var descriptor, key; + $global.Object.defineProperty(wrapperObj[0], $externalize(key, $String), $externalize(descriptor, M)); + }; })(internalObj, wrapperObj); + $r = defineProperty("__internal_object__", $makeMap($String.keyFor, [{ k: "value", v: new $jsObjectPtr(internalObj[0]) }])); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + typ = $internalize(constructor.string, $String); + pkg = $internalize(constructor.pkg, $String); + ptr = ""; + if (typ.charCodeAt(0) === 42) { + ptr = "*"; + } + i$1 = 0; + while (true) { + if (!(i$1 < typ.length)) { break; } + if (typ.charCodeAt(i$1) === 46) { + typ = $substring(typ, (i$1 + 1 >> 0)); + break; + } + i$1 = i$1 + (1) >> 0; + } + pkgTyp = pkg + "." + ptr + typ; + $r = defineProperty("$type", $makeMap($String.keyFor, [{ k: "value", v: new $String(pkgTyp) }])); /* */ $s = 2; case 2: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + fields = null; + methods = new ($global.Array)(); + ms = constructor.methods; + if (!(ms === undefined)) { + methods = methods.concat(ms); + } + e = constructor.elem; + if (!(e === undefined)) { + fields = e.fields; + methods = methods.concat(e.methods); + } else { + fields = constructor.fields; + } + i$2 = 0; + /* while (true) { */ case 3: + /* if (!(i$2 < $parseInt(methods.length))) { break; } */ if(!(i$2 < $parseInt(methods.length))) { $s = 4; continue; } + m = [m]; + m[0] = methods[i$2]; + if (!($internalize(m[0].pkg, $String) === "")) { + i$2 = i$2 + (1) >> 0; + /* continue; */ $s = 3; continue; + } + $r = defineProperty($internalize(m[0].prop, $String), $makeMap($String.keyFor, [{ k: "value", v: new funcType((function(internalObj, m, wrapperObj) { return function(args) { + var args; + return $externalizeFunction(internalObj[0][$externalize($internalize(m[0].prop, $String), $String)], m[0].typ, $externalize(true, $Bool), MakeFullWrapper).apply(internalObj[0], $externalize(args, sliceType$2)); + }; })(internalObj, m, wrapperObj)) }])); /* */ $s = 5; case 5: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + i$2 = i$2 + (1) >> 0; + $s = 3; continue; + case 4: + /* */ if (!(fields === undefined)) { $s = 6; continue; } + /* */ $s = 7; continue; + /* if (!(fields === undefined)) { */ case 6: + i$3 = 0; + /* while (true) { */ case 8: + /* if (!(i$3 < $parseInt(fields.length))) { break; } */ if(!(i$3 < $parseInt(fields.length))) { $s = 9; continue; } + f = [f]; + f[0] = fields[i$3]; + if (!!!(f[0].exported)) { + i$3 = i$3 + (1) >> 0; + /* continue; */ $s = 8; continue; + } + $r = defineProperty($internalize(f[0].prop, $String), $makeMap($String.keyFor, [{ k: "get", v: new funcType$1((function(f, internalObj, wrapperObj) { return function() { + var vc; + vc = $copyIfRequired(internalObj[0].$val[$externalize($internalize(f[0].prop, $String), $String)], f[0].typ); + return $externalize(vc, f[0].typ, MakeFullWrapper); + }; })(f, internalObj, wrapperObj)) }, { k: "set", v: new funcType$2((function(f, internalObj, wrapperObj) { return function(jv) { + var gv, jv; + gv = $internalize(jv, f[0].typ, MakeFullWrapper); + internalObj[0].$val[$externalize($internalize(f[0].prop, $String), $String)] = gv; + }; })(f, internalObj, wrapperObj)) }])); /* */ $s = 10; case 10: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + i$3 = i$3 + (1) >> 0; + $s = 8; continue; + case 9: + /* } */ case 7: + $s = -1; return wrapperObj[0]; + /* */ } return; } var $f = {$blk: MakeFullWrapper, $c: true, $r, constructor, defineProperty, e, f, fields, i, i$1, i$2, i$3, internalObj, m, methods, ms, pkg, pkgTyp, ptr, typ, wrapperObj, $s};return $f; + }; + $pkg.MakeFullWrapper = MakeFullWrapper; + init = function() { + var e; + e = new Error.ptr(null); + $unused(e); + }; + ptrType.methods = [{prop: "Get", name: "Get", pkg: "", typ: $funcType([$String], [ptrType], false)}, {prop: "Set", name: "Set", pkg: "", typ: $funcType([$String, $emptyInterface], [], false)}, {prop: "Delete", name: "Delete", pkg: "", typ: $funcType([$String], [], false)}, {prop: "Length", name: "Length", pkg: "", typ: $funcType([], [$Int], false)}, {prop: "Index", name: "Index", pkg: "", typ: $funcType([$Int], [ptrType], false)}, {prop: "SetIndex", name: "SetIndex", pkg: "", typ: $funcType([$Int, $emptyInterface], [], false)}, {prop: "Call", name: "Call", pkg: "", typ: $funcType([$String, sliceType], [ptrType], true)}, {prop: "Invoke", name: "Invoke", pkg: "", typ: $funcType([sliceType], [ptrType], true)}, {prop: "New", name: "New", pkg: "", typ: $funcType([sliceType], [ptrType], true)}, {prop: "Bool", name: "Bool", pkg: "", typ: $funcType([], [$Bool], false)}, {prop: "String", name: "String", pkg: "", typ: $funcType([], [$String], false)}, {prop: "Int", name: "Int", pkg: "", typ: $funcType([], [$Int], false)}, {prop: "Int64", name: "Int64", pkg: "", typ: $funcType([], [$Int64], false)}, {prop: "Uint64", name: "Uint64", pkg: "", typ: $funcType([], [$Uint64], false)}, {prop: "Float", name: "Float", pkg: "", typ: $funcType([], [$Float64], false)}, {prop: "Interface", name: "Interface", pkg: "", typ: $funcType([], [$emptyInterface], false)}, {prop: "Unsafe", name: "Unsafe", pkg: "", typ: $funcType([], [$Uintptr], false)}]; + ptrType$1.methods = [{prop: "Error", name: "Error", pkg: "", typ: $funcType([], [$String], false)}, {prop: "Stack", name: "Stack", pkg: "", typ: $funcType([], [$String], false)}]; + Object.init("github.com/gopherjs/gopherjs/js", [{prop: "object", name: "object", embedded: false, exported: false, typ: ptrType, tag: ""}]); + Error.init("", [{prop: "Object", name: "Object", embedded: true, exported: true, typ: ptrType, tag: ""}]); + M.init($String, $emptyInterface); + $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: + init(); + /* */ } return; } if ($f === undefined) { $f = { $blk: $init }; } $f.$s = $s; $f.$r = $r; return $f; + }; + $pkg.$init = $init; + return $pkg; +})(); +$packages["runtime"] = (function() { + var $pkg = {}, $init, js, _type, TypeAssertionError, errorString, ptrType$1, ptrType$2, buildVersion, init, throw$1; + js = $packages["github.com/gopherjs/gopherjs/js"]; + _type = $pkg._type = $newType(0, $kindStruct, "runtime._type", true, "runtime", false, function(str_) { + this.$val = this; + if (arguments.length === 0) { + this.str = ""; + return; + } + this.str = str_; + }); + TypeAssertionError = $pkg.TypeAssertionError = $newType(0, $kindStruct, "runtime.TypeAssertionError", true, "runtime", true, function(_interface_, concrete_, asserted_, missingMethod_) { + this.$val = this; + if (arguments.length === 0) { + this._interface = ptrType$1.nil; + this.concrete = ptrType$1.nil; + this.asserted = ptrType$1.nil; + this.missingMethod = ""; + return; + } + this._interface = _interface_; + this.concrete = concrete_; + this.asserted = asserted_; + this.missingMethod = missingMethod_; + }); + errorString = $pkg.errorString = $newType(8, $kindString, "runtime.errorString", true, "runtime", false, null); + ptrType$1 = $ptrType(_type); + ptrType$2 = $ptrType(TypeAssertionError); + _type.ptr.prototype.string = function() { + var t; + t = this; + return t.str; + }; + _type.prototype.string = function() { return this.$val.string(); }; + _type.ptr.prototype.pkgpath = function() { + var t; + t = this; + return ""; + }; + _type.prototype.pkgpath = function() { return this.$val.pkgpath(); }; + TypeAssertionError.ptr.prototype.RuntimeError = function() { + }; + TypeAssertionError.prototype.RuntimeError = function() { return this.$val.RuntimeError(); }; + TypeAssertionError.ptr.prototype.Error = function() { + var as, cs, e, inter, msg; + e = this; + inter = "interface"; + if (!(e._interface === ptrType$1.nil)) { + inter = e._interface.string(); + } + as = e.asserted.string(); + if (e.concrete === ptrType$1.nil) { + return "interface conversion: " + inter + " is nil, not " + as; + } + cs = e.concrete.string(); + if (e.missingMethod === "") { + msg = "interface conversion: " + inter + " is " + cs + ", not " + as; + if (cs === as) { + if (!(e.concrete.pkgpath() === e.asserted.pkgpath())) { + msg = msg + (" (types from different packages)"); + } else { + msg = msg + (" (types from different scopes)"); + } + } + return msg; + } + return "interface conversion: " + cs + " is not " + as + ": missing method " + e.missingMethod; + }; + TypeAssertionError.prototype.Error = function() { return this.$val.Error(); }; + init = function() { + var e, jsPkg; + jsPkg = $packages[$externalize("github.com/gopherjs/gopherjs/js", $String)]; + $jsObjectPtr = jsPkg.Object.ptr; + $jsErrorPtr = jsPkg.Error.ptr; + $throwRuntimeError = throw$1; + buildVersion = $internalize($goVersion, $String); + e = $ifaceNil; + e = new TypeAssertionError.ptr(ptrType$1.nil, ptrType$1.nil, ptrType$1.nil, ""); + $unused(e); + }; + errorString.prototype.RuntimeError = function() { + var e; + e = this.$val; + }; + $ptrType(errorString).prototype.RuntimeError = function() { return new errorString(this.$get()).RuntimeError(); }; + errorString.prototype.Error = function() { + var e; + e = this.$val; + return "runtime error: " + (e); + }; + $ptrType(errorString).prototype.Error = function() { return new errorString(this.$get()).Error(); }; + throw$1 = function(s) { + var s; + $panic(new errorString((s))); + }; + ptrType$1.methods = [{prop: "string", name: "string", pkg: "runtime", typ: $funcType([], [$String], false)}, {prop: "pkgpath", name: "pkgpath", pkg: "runtime", typ: $funcType([], [$String], false)}]; + ptrType$2.methods = [{prop: "RuntimeError", name: "RuntimeError", pkg: "", typ: $funcType([], [], false)}, {prop: "Error", name: "Error", pkg: "", typ: $funcType([], [$String], false)}]; + errorString.methods = [{prop: "RuntimeError", name: "RuntimeError", pkg: "", typ: $funcType([], [], false)}, {prop: "Error", name: "Error", pkg: "", typ: $funcType([], [$String], false)}]; + _type.init("runtime", [{prop: "str", name: "str", embedded: false, exported: false, typ: $String, tag: ""}]); + TypeAssertionError.init("runtime", [{prop: "_interface", name: "_interface", embedded: false, exported: false, typ: ptrType$1, tag: ""}, {prop: "concrete", name: "concrete", embedded: false, exported: false, typ: ptrType$1, tag: ""}, {prop: "asserted", name: "asserted", embedded: false, exported: false, typ: ptrType$1, tag: ""}, {prop: "missingMethod", name: "missingMethod", embedded: false, exported: false, typ: $String, 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 = js.$init(); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + buildVersion = ""; + init(); + /* */ } return; } if ($f === undefined) { $f = { $blk: $init }; } $f.$s = $s; $f.$r = $r; return $f; + }; + $pkg.$init = $init; + return $pkg; +})(); +$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, js, bits, arrayType, arrayType$1, arrayType$2, structType, math, _zero, posInf, negInf, nan, buf, max, min, Abs, Cos, Floor, Inf, IsInf, IsNaN, Max, Min, NaN, Pow, Signbit, Sin, Sqrt, init, Float64bits, Float64frombits; + js = $packages["github.com/gopherjs/gopherjs/js"]; + bits = $packages["math/bits"]; + arrayType = $arrayType($Uint32, 2); + arrayType$1 = $arrayType($Float32, 2); + arrayType$2 = $arrayType($Float64, 1); + structType = $structType("math", [{prop: "uint32array", name: "uint32array", embedded: false, exported: false, typ: arrayType, tag: ""}, {prop: "float32array", name: "float32array", embedded: false, exported: false, typ: arrayType$1, tag: ""}, {prop: "float64array", name: "float64array", embedded: false, exported: false, typ: arrayType$2, tag: ""}]); + max = function(x, y) { + var x, y; + if (IsInf(x, 1) || IsInf(y, 1)) { + return Inf(1); + } else if (IsNaN(x) || IsNaN(y)) { + return NaN(); + } else if ((x === 0) && (x === y)) { + if (Signbit(x)) { + return y; + } + return x; + } + if (x > y) { + return x; + } + return y; + }; + min = function(x, y) { + var x, y; + if (IsInf(x, -1) || IsInf(y, -1)) { + return Inf(-1); + } else if (IsNaN(x) || IsNaN(y)) { + return NaN(); + } else if ((x === 0) && (x === y)) { + if (Signbit(x)) { + return x; + } + return y; + } + if (x < y) { + return x; + } + return y; + }; + Abs = function(x) { + var x, x$1; + return Float64frombits((x$1 = Float64bits(x), new $Uint64(x$1.$high & ~2147483648, (x$1.$low & ~0) >>> 0))); + }; + $pkg.Abs = Abs; + Cos = function(x) { + var x; + return $parseFloat(math.cos(x)); + }; + $pkg.Cos = Cos; + Floor = function(x) { + var x; + return $parseFloat(math.floor(x)); + }; + $pkg.Floor = Floor; + Inf = function(sign) { + var sign; + if (sign >= 0) { + return posInf; + } else { + return negInf; + } + }; + $pkg.Inf = Inf; + IsInf = function(f, sign) { + var f, sign; + if (f === posInf) { + return sign >= 0; + } + if (f === negInf) { + return sign <= 0; + } + return false; + }; + $pkg.IsInf = IsInf; + IsNaN = function(f) { + var f, is; + is = false; + is = !((f === f)); + return is; + }; + $pkg.IsNaN = IsNaN; + Max = function(x, y) { + var x, y; + return max(x, y); + }; + $pkg.Max = Max; + Min = function(x, y) { + var x, y; + return min(x, y); + }; + $pkg.Min = Min; + NaN = function() { + return nan; + }; + $pkg.NaN = NaN; + Pow = function(x, y) { + var x, y; + if ((x === 1) || ((x === -1) && ((y === posInf) || (y === negInf)))) { + return 1; + } + return $parseFloat(math.pow(x, y)); + }; + $pkg.Pow = Pow; + Signbit = function(x) { + var x; + return x < 0 || (1 / x === negInf); + }; + $pkg.Signbit = Signbit; + Sin = function(x) { + var x; + return $parseFloat(math.sin(x)); + }; + $pkg.Sin = Sin; + Sqrt = function(x) { + var x; + return $parseFloat(math.sqrt(x)); + }; + $pkg.Sqrt = Sqrt; + init = function() { + var ab; + ab = new ($global.ArrayBuffer)(8); + buf.uint32array = new ($global.Uint32Array)(ab); + buf.float32array = new ($global.Float32Array)(ab); + buf.float64array = new ($global.Float64Array)(ab); + }; + Float64bits = function(f) { + var f, x, x$1; + buf.float64array[0] = f; + return (x = $shiftLeft64((new $Uint64(0, buf.uint32array[1])), 32), x$1 = (new $Uint64(0, buf.uint32array[0])), new $Uint64(x.$high + x$1.$high, x.$low + x$1.$low)); + }; + $pkg.Float64bits = Float64bits; + Float64frombits = function(b) { + var b; + buf.uint32array[0] = ((b.$low >>> 0)); + buf.uint32array[1] = (($shiftRightUint64(b, 32).$low >>> 0)); + return buf.float64array[0]; + }; + $pkg.Float64frombits = Float64frombits; + $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 = js.$init(); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + $r = bits.$init(); /* */ $s = 2; case 2: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + buf = new structType.ptr(arrayType.zero(), arrayType$1.zero(), arrayType$2.zero()); + math = $global.Math; + _zero = 0; + posInf = 1 / _zero; + negInf = -1 / _zero; + nan = $parseFloat($NaN); + init(); + /* */ } 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, math, Vector, Axis, Space, Shape, Line, ConvexPolygon, ContactSet, Circle, Projection, Object, Collision, Cell, sliceType, ptrType, sliceType$1, sliceType$2, ptrType$1, ptrType$2, sliceType$3, sliceType$4, ptrType$3, sliceType$5, ptrType$4, ptrType$5, ptrType$6, sliceType$6, ptrType$7, sliceType$7, mapType, Dot, NewSpace, NewLine, NewConvexPolygon, NewContactSet, NewRectangle, NewCircle, NewObject, axpyUnitaryTo, scalUnitaryTo, NewCollision, newCell; + math = $packages["math"]; + Vector = $pkg.Vector = $newType(12, $kindSlice, "resolv.Vector", true, "resolv", true, null); + Axis = $pkg.Axis = $newType(4, $kindInt, "resolv.Axis", true, "resolv", true, null); + Space = $pkg.Space = $newType(0, $kindStruct, "resolv.Space", true, "resolv", true, function(Cells_, CellWidth_, CellHeight_) { + this.$val = this; + if (arguments.length === 0) { + this.Cells = sliceType$2.nil; + this.CellWidth = 0; + this.CellHeight = 0; + return; + } + this.Cells = Cells_; + this.CellWidth = CellWidth_; + this.CellHeight = CellHeight_; + }); + Shape = $pkg.Shape = $newType(8, $kindInterface, "resolv.Shape", true, "resolv", true, null); + Line = $pkg.Line = $newType(0, $kindStruct, "resolv.Line", true, "resolv", true, function(Start_, End_) { + this.$val = this; + if (arguments.length === 0) { + this.Start = Vector.nil; + this.End = Vector.nil; + return; + } + this.Start = Start_; + this.End = End_; + }); + ConvexPolygon = $pkg.ConvexPolygon = $newType(0, $kindStruct, "resolv.ConvexPolygon", true, "resolv", true, function(Points_, X_, Y_, Closed_) { + this.$val = this; + if (arguments.length === 0) { + this.Points = sliceType$4.nil; + this.X = 0; + this.Y = 0; + this.Closed = false; + return; + } + this.Points = Points_; + this.X = X_; + this.Y = Y_; + this.Closed = Closed_; + }); + ContactSet = $pkg.ContactSet = $newType(0, $kindStruct, "resolv.ContactSet", true, "resolv", true, function(Points_, MTV_, Center_) { + this.$val = this; + if (arguments.length === 0) { + this.Points = sliceType$4.nil; + this.MTV = Vector.nil; + this.Center = Vector.nil; + return; + } + this.Points = Points_; + this.MTV = MTV_; + this.Center = Center_; + }); + Circle = $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_; + }); + Projection = $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_; + }); + Object = $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 = ptrType$1.nil; + this.X = 0; + this.Y = 0; + this.W = 0; + this.H = 0; + this.TouchingCells = sliceType$1.nil; + this.Data = $ifaceNil; + this.ignoreList = false; + this.tags = sliceType$6.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_; + }); + Collision = $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 = ptrType$2.nil; + this.dx = 0; + this.dy = 0; + this.Objects = sliceType$3.nil; + this.Cells = sliceType$1.nil; + return; + } + this.checkingObject = checkingObject_; + this.dx = dx_; + this.dy = dy_; + this.Objects = Objects_; + this.Cells = Cells_; + }); + Cell = $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 = sliceType$3.nil; + return; + } + this.X = X_; + this.Y = Y_; + this.Objects = Objects_; + }); + sliceType = $sliceType($Float64); + ptrType = $ptrType(Cell); + sliceType$1 = $sliceType(ptrType); + sliceType$2 = $sliceType(sliceType$1); + ptrType$1 = $ptrType(Space); + ptrType$2 = $ptrType(Object); + sliceType$3 = $sliceType(ptrType$2); + sliceType$4 = $sliceType(Vector); + ptrType$3 = $ptrType(Line); + sliceType$5 = $sliceType(ptrType$3); + ptrType$4 = $ptrType(Circle); + ptrType$5 = $ptrType(ConvexPolygon); + ptrType$6 = $ptrType(ContactSet); + sliceType$6 = $sliceType($String); + ptrType$7 = $ptrType(Collision); + sliceType$7 = $sliceType(Axis); + mapType = $mapType(ptrType$2, $Bool); + Vector.prototype.Clone = function() { + var clone, v; + v = this; + clone = $makeSlice(Vector, v.$length); + $copySlice(clone, v); + return clone; + }; + $ptrType(Vector).prototype.Clone = function() { return this.$get().Clone(); }; + Vector.prototype.Add = function(vs) { + var _i, _ref, dim, i, v, vs; + v = this; + dim = v.$length; + _ref = vs; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + i = _i; + if (((i < 0 || i >= vs.$length) ? ($throwRuntimeError("index out of range"), undefined) : vs.$array[vs.$offset + i]).$length > dim) { + axpyUnitaryTo($convertSliceType(v, sliceType), 1, $convertSliceType(v, sliceType), $convertSliceType($subslice(((i < 0 || i >= vs.$length) ? ($throwRuntimeError("index out of range"), undefined) : vs.$array[vs.$offset + i]), 0, dim), sliceType)); + } else { + axpyUnitaryTo($convertSliceType(v, sliceType), 1, $convertSliceType(v, sliceType), $convertSliceType(((i < 0 || i >= vs.$length) ? ($throwRuntimeError("index out of range"), undefined) : vs.$array[vs.$offset + i]), sliceType)); + } + _i++; + } + return v; + }; + $ptrType(Vector).prototype.Add = function(vs) { return this.$get().Add(vs); }; + Vector.prototype.Sub = function(vs) { + var _i, _ref, dim, i, v, vs; + v = this; + dim = v.$length; + _ref = vs; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + i = _i; + if (((i < 0 || i >= vs.$length) ? ($throwRuntimeError("index out of range"), undefined) : vs.$array[vs.$offset + i]).$length > dim) { + axpyUnitaryTo($convertSliceType(v, sliceType), -1, $convertSliceType($subslice(((i < 0 || i >= vs.$length) ? ($throwRuntimeError("index out of range"), undefined) : vs.$array[vs.$offset + i]), 0, dim), sliceType), $convertSliceType(v, sliceType)); + } else { + axpyUnitaryTo($convertSliceType(v, sliceType), -1, $convertSliceType(((i < 0 || i >= vs.$length) ? ($throwRuntimeError("index out of range"), undefined) : vs.$array[vs.$offset + i]), sliceType), $convertSliceType(v, sliceType)); + } + _i++; + } + return v; + }; + $ptrType(Vector).prototype.Sub = function(vs) { return this.$get().Sub(vs); }; + Vector.prototype.Scale = function(size) { + var size, v; + v = this; + scalUnitaryTo($convertSliceType(v, sliceType), size, $convertSliceType(v, sliceType)); + return v; + }; + $ptrType(Vector).prototype.Scale = function(size) { return this.$get().Scale(size); }; + Vector.prototype.Equal = function(v2) { + var _i, _ref, i, v, v2; + v = this; + if (!((v.$length === v2.$length))) { + return false; + } + _ref = v; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + i = _i; + if (math.Abs(((i < 0 || i >= v.$length) ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + i]) - ((i < 0 || i >= v2.$length) ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + i])) > 1e-08) { + return false; + } + _i++; + } + return true; + }; + $ptrType(Vector).prototype.Equal = function(v2) { return this.$get().Equal(v2); }; + Vector.prototype.Magnitude = function() { + var v; + v = this; + return math.Sqrt(v.Magnitude2()); + }; + $ptrType(Vector).prototype.Magnitude = function() { return this.$get().Magnitude(); }; + Vector.prototype.Magnitude2 = function() { + var _i, _ref, result, scalar, v; + v = this; + result = 0; + _ref = v; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + scalar = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + result = result + (scalar * scalar); + _i++; + } + return result; + }; + $ptrType(Vector).prototype.Magnitude2 = function() { return this.$get().Magnitude2(); }; + Vector.prototype.Unit = function() { + var _i, _ref, i, l, v; + v = this; + l = v.Magnitude(); + if (l < 1e-08) { + return v; + } + _ref = v; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + i = _i; + ((i < 0 || i >= v.$length) ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + i] = ((i < 0 || i >= v.$length) ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + i]) / l); + _i++; + } + return v; + }; + $ptrType(Vector).prototype.Unit = function() { return this.$get().Unit(); }; + Dot = function(v1, v2) { + var _i, _ref, _tmp, _tmp$1, _tmp$2, dim1, dim2, i, result, v1, v2; + _tmp = 0; + _tmp$1 = v1.$length; + _tmp$2 = v2.$length; + result = _tmp; + dim1 = _tmp$1; + dim2 = _tmp$2; + if (dim1 > dim2) { + v2 = $appendSlice(v2, $convertSliceType($makeSlice(Vector, (dim1 - dim2 >> 0)), sliceType)); + } + if (dim1 < dim2) { + v1 = $appendSlice(v1, $convertSliceType($makeSlice(Vector, (dim2 - dim1 >> 0)), sliceType)); + } + _ref = v1; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + i = _i; + result = result + (((i < 0 || i >= v1.$length) ? ($throwRuntimeError("index out of range"), undefined) : v1.$array[v1.$offset + i]) * ((i < 0 || i >= v2.$length) ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + i])); + _i++; + } + return result; + }; + $pkg.Dot = Dot; + Vector.prototype.Dot = function(v2) { + var v, v2; + v = this; + return Dot(v, v2); + }; + $ptrType(Vector).prototype.Dot = function(v2) { return this.$get().Dot(v2); }; + Vector.prototype.Cross = function(v2) { + var v, v2; + v = this; + if (!((v.$length === 3)) || !((v2.$length === 3))) { + return Vector.nil; + } + return new Vector([(1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1]) * (2 >= v2.$length ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + 2]) - (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2]) * (1 >= v2.$length ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + 1]), (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2]) * (0 >= v2.$length ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + 0]) - (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0]) * (2 >= v2.$length ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + 2]), (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0]) * (2 >= v2.$length ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + 2]) - (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2]) * (0 >= v2.$length ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + 0])]); + }; + $ptrType(Vector).prototype.Cross = function(v2) { return this.$get().Cross(v2); }; + Vector.prototype.Rotate = function(angle, as) { + var _1, _tmp, _tmp$1, _tmp$2, _tmp$3, _tmp$4, _tmp$5, angle, as, axis, cos, dim, sin, v, x, y, z, z$1; + v = this; + _tmp = 2; + _tmp$1 = v.$length; + axis = _tmp; + dim = _tmp$1; + if (dim === 0) { + return v; + } + if (as.$length > 0) { + axis = (0 >= as.$length ? ($throwRuntimeError("index out of range"), undefined) : as.$array[as.$offset + 0]); + } + if ((dim === 1) && !((axis === 2))) { + v = $append(v, 0, 0); + } + if ((dim < 2 && (axis === 2)) || ((dim === 2) && !((axis === 2)))) { + v = $append(v, 0); + } + _tmp$2 = (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0]); + _tmp$3 = (1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1]); + x = _tmp$2; + y = _tmp$3; + _tmp$4 = math.Cos(angle); + _tmp$5 = math.Sin(angle); + cos = _tmp$4; + sin = _tmp$5; + _1 = axis; + if (_1 === (0)) { + z = (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2]); + (1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1] = y * cos - z * sin); + (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2] = y * sin + z * cos); + } else if (_1 === (1)) { + z$1 = (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2]); + (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0] = x * cos + z$1 * sin); + (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2] = -x * sin + z$1 * cos); + } else if (_1 === (2)) { + (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0] = x * cos - y * sin); + (1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1] = x * sin + y * cos); + } + if (dim > 3) { + return $subslice(v, 0, 3); + } + return v; + }; + $ptrType(Vector).prototype.Rotate = function(angle, as) { return this.$get().Rotate(angle, as); }; + Vector.prototype.X = function() { + var v; + v = this; + if (v.$length < 1) { + return 0; + } + return (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0]); + }; + $ptrType(Vector).prototype.X = function() { return this.$get().X(); }; + Vector.prototype.Y = function() { + var v; + v = this; + if (v.$length < 2) { + return 0; + } + return (1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1]); + }; + $ptrType(Vector).prototype.Y = function() { return this.$get().Y(); }; + Vector.prototype.Z = function() { + var v; + v = this; + if (v.$length < 3) { + return 0; + } + return (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2]); + }; + $ptrType(Vector).prototype.Z = function() { return this.$get().Z(); }; + NewSpace = function(spaceWidth, spaceHeight, cellWidth, cellHeight) { + var _q, _q$1, cellHeight, cellWidth, sp, spaceHeight, spaceWidth; + sp = new Space.ptr(sliceType$2.nil, cellWidth, cellHeight); + sp.Resize((_q = spaceWidth / cellWidth, (_q === _q && _q !== 1/0 && _q !== -1/0) ? _q >> 0 : $throwRuntimeError("integer divide by zero")), (_q$1 = spaceHeight / cellHeight, (_q$1 === _q$1 && _q$1 !== 1/0 && _q$1 !== -1/0) ? _q$1 >> 0 : $throwRuntimeError("integer divide by zero"))); + return sp; + }; + $pkg.NewSpace = NewSpace; + Space.ptr.prototype.Add = function(objects) { + var {_i, _ref, obj, objects, sp, $s, $r, $c} = $restore(this, {objects}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + sp = this; + if (sp === ptrType$1.nil) { + $panic(new $String("ERROR: space is nil")); + } + _ref = objects; + _i = 0; + /* while (true) { */ case 1: + /* if (!(_i < _ref.$length)) { break; } */ if(!(_i < _ref.$length)) { $s = 2; continue; } + obj = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + obj.Space = sp; + $r = obj.Update(); /* */ $s = 3; case 3: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + _i++; + $s = 1; continue; + case 2: + $s = -1; return; + /* */ } return; } var $f = {$blk: Space.ptr.prototype.Add, $c: true, $r, _i, _ref, obj, objects, sp, $s};return $f; + }; + Space.prototype.Add = function(objects) { return this.$val.Add(objects); }; + Space.ptr.prototype.Remove = function(objects) { + var _i, _i$1, _ref, _ref$1, cell, obj, objects, sp; + sp = this; + if (sp === ptrType$1.nil) { + $panic(new $String("ERROR: space is nil")); + } + _ref = objects; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + obj = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + _ref$1 = obj.TouchingCells; + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$1.$length)) { break; } + cell = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); + cell.unregister(obj); + _i$1++; + } + obj.TouchingCells = new sliceType$1([]); + obj.Space = ptrType$1.nil; + _i++; + } + }; + Space.prototype.Remove = function(objects) { return this.$val.Remove(objects); }; + Space.ptr.prototype.Objects = function() { + var _entry, _i, _i$1, _i$2, _key, _ref, _ref$1, _ref$2, _tuple, added, cx, cy, o, objects, objectsAdded, sp, x, x$1, x$2; + sp = this; + objectsAdded = $makeMap(ptrType$2.keyFor, []); + objects = new sliceType$3([]); + _ref = sp.Cells; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + cy = _i; + _ref$1 = (x = sp.Cells, ((cy < 0 || cy >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + cy])); + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$1.$length)) { break; } + cx = _i$1; + _ref$2 = (x$1 = (x$2 = sp.Cells, ((cy < 0 || cy >= x$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + cy])), ((cx < 0 || cx >= x$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + cx])).Objects; + _i$2 = 0; + while (true) { + if (!(_i$2 < _ref$2.$length)) { break; } + o = ((_i$2 < 0 || _i$2 >= _ref$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$2.$array[_ref$2.$offset + _i$2]); + _tuple = (_entry = objectsAdded[ptrType$2.keyFor(o)], _entry !== undefined ? [_entry.v, true] : [false, false]); + added = _tuple[1]; + if (!added) { + objects = $append(objects, o); + _key = o; (objectsAdded || $throwRuntimeError("assignment to entry in nil map"))[ptrType$2.keyFor(_key)] = { k: _key, v: true }; + } + _i$2++; + } + _i$1++; + } + _i++; + } + return objects; + }; + Space.prototype.Objects = function() { return this.$val.Objects(); }; + Space.ptr.prototype.Resize = function(width, height) { + var height, sp, width, x, x$1, x$2, y; + sp = this; + sp.Cells = new sliceType$2([]); + y = 0; + while (true) { + if (!(y < height)) { break; } + sp.Cells = $append(sp.Cells, new sliceType$1([])); + x = 0; + while (true) { + if (!(x < width)) { break; } + (x$2 = sp.Cells, ((y < 0 || y >= x$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + y] = $append((x$1 = sp.Cells, ((y < 0 || y >= x$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + y])), newCell(x, y)))); + x = x + (1) >> 0; + } + y = y + (1) >> 0; + } + }; + Space.prototype.Resize = function(width, height) { return this.$val.Resize(width, height); }; + Space.ptr.prototype.Cell = function(x, y) { + var sp, x, x$1, x$2, x$3, y; + sp = this; + if (y >= 0 && y < sp.Cells.$length && x >= 0 && x < (x$1 = sp.Cells, ((y < 0 || y >= x$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + y])).$length) { + return (x$2 = (x$3 = sp.Cells, ((y < 0 || y >= x$3.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + y])), ((x < 0 || x >= x$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + x])); + } + return ptrType.nil; + }; + Space.prototype.Cell = function(x, y) { return this.$val.Cell(x, y); }; + Space.ptr.prototype.CheckCells = function(x, y, w, h, tags) { + var _i, _ref, cell, h, ix, iy, obj, sp, tags, w, x, x$1, y; + sp = this; + ix = x; + while (true) { + if (!(ix < (x + w >> 0))) { break; } + iy = y; + while (true) { + if (!(iy < (y + h >> 0))) { break; } + cell = sp.Cell(ix, iy); + if (!(cell === ptrType.nil)) { + if (tags.$length > 0) { + if (cell.ContainsTags(tags)) { + _ref = cell.Objects; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + obj = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (obj.HasTags(tags)) { + return obj; + } + _i++; + } + } + } else if (cell.Occupied()) { + return (x$1 = cell.Objects, (0 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 0])); + } + } + iy = iy + (1) >> 0; + } + ix = ix + (1) >> 0; + } + return ptrType$2.nil; + }; + Space.prototype.CheckCells = function(x, y, w, h, tags) { return this.$val.CheckCells(x, y, w, h, tags); }; + Space.ptr.prototype.CheckCellsWorld = function(x, y, w, h, tags) { + var _tuple, _tuple$1, ch, cw, h, sp, sx, sy, tags, w, x, y; + sp = this; + _tuple = sp.WorldToSpace(x, y); + sx = _tuple[0]; + sy = _tuple[1]; + _tuple$1 = sp.WorldToSpace(w, h); + cw = _tuple$1[0]; + ch = _tuple$1[1]; + return sp.CheckCells(sx, sy, cw, ch, tags); + }; + Space.prototype.CheckCellsWorld = function(x, y, w, h, tags) { return this.$val.CheckCellsWorld(x, y, w, h, tags); }; + Space.ptr.prototype.UnregisterAllObjects = function() { + var cell, sp, x, x$1, x$2, x$3, y; + sp = this; + y = 0; + while (true) { + if (!(y < sp.Cells.$length)) { break; } + x = 0; + while (true) { + if (!(x < (x$1 = sp.Cells, ((y < 0 || y >= x$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + y])).$length)) { break; } + cell = (x$2 = (x$3 = sp.Cells, ((y < 0 || y >= x$3.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + y])), ((x < 0 || x >= x$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + x])); + sp.Remove(cell.Objects); + x = x + (1) >> 0; + } + y = y + (1) >> 0; + } + }; + Space.prototype.UnregisterAllObjects = function() { return this.$val.UnregisterAllObjects(); }; + Space.ptr.prototype.WorldToSpace = function(x, y) { + var fx, fy, sp, x, y; + sp = this; + fx = ((math.Floor(x / (sp.CellWidth)) >> 0)); + fy = ((math.Floor(y / (sp.CellHeight)) >> 0)); + return [fx, fy]; + }; + Space.prototype.WorldToSpace = function(x, y) { return this.$val.WorldToSpace(x, y); }; + Space.ptr.prototype.SpaceToWorld = function(x, y) { + var fx, fy, sp, x, y; + sp = this; + fx = (($imul(x, sp.CellWidth))); + fy = (($imul(y, sp.CellHeight))); + return [fx, fy]; + }; + Space.prototype.SpaceToWorld = function(x, y) { return this.$val.SpaceToWorld(x, y); }; + Space.ptr.prototype.Height = function() { + var sp; + sp = this; + return sp.Cells.$length; + }; + Space.prototype.Height = function() { return this.$val.Height(); }; + Space.ptr.prototype.Width = function() { + var sp, x; + sp = this; + if (sp.Cells.$length > 0) { + return (x = sp.Cells, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])).$length; + } + return 0; + }; + Space.prototype.Width = function() { return this.$val.Width(); }; + Space.ptr.prototype.CellsInLine = function(startX, startY, endX, endY) { + var _q, _q$1, _q$2, _q$3, _tuple, _tuple$1, alternate, c, cell, cells, cx, cy, dv, endCell, endX, endY, p, pX, pY, sp, startX, startY; + sp = this; + cells = new sliceType$1([]); + cell = sp.Cell(startX, startY); + endCell = sp.Cell(endX, endY); + if (!(cell === ptrType.nil) && !(endCell === ptrType.nil)) { + dv = new Vector([((endX - startX >> 0)), ((endY - startY >> 0))]).Unit(); + (0 >= dv.$length ? ($throwRuntimeError("index out of range"), undefined) : dv.$array[dv.$offset + 0] = (0 >= dv.$length ? ($throwRuntimeError("index out of range"), undefined) : dv.$array[dv.$offset + 0]) * (((_q = sp.CellWidth / 2, (_q === _q && _q !== 1/0 && _q !== -1/0) ? _q >> 0 : $throwRuntimeError("integer divide by zero"))))); + (1 >= dv.$length ? ($throwRuntimeError("index out of range"), undefined) : dv.$array[dv.$offset + 1] = (1 >= dv.$length ? ($throwRuntimeError("index out of range"), undefined) : dv.$array[dv.$offset + 1]) * (((_q$1 = sp.CellHeight / 2, (_q$1 === _q$1 && _q$1 !== 1/0 && _q$1 !== -1/0) ? _q$1 >> 0 : $throwRuntimeError("integer divide by zero"))))); + _tuple = sp.SpaceToWorld(startX, startY); + pX = _tuple[0]; + pY = _tuple[1]; + p = new Vector([pX + ((_q$2 = sp.CellWidth / 2, (_q$2 === _q$2 && _q$2 !== 1/0 && _q$2 !== -1/0) ? _q$2 >> 0 : $throwRuntimeError("integer divide by zero"))), pY + ((_q$3 = sp.CellHeight / 2, (_q$3 === _q$3 && _q$3 !== 1/0 && _q$3 !== -1/0) ? _q$3 >> 0 : $throwRuntimeError("integer divide by zero")))]); + alternate = false; + while (true) { + if (!(!(cell === ptrType.nil))) { break; } + if (cell === endCell) { + cells = $append(cells, cell); + break; + } + cells = $append(cells, cell); + if (alternate) { + (1 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 1] = (1 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 1]) + ((1 >= dv.$length ? ($throwRuntimeError("index out of range"), undefined) : dv.$array[dv.$offset + 1]))); + } else { + (0 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 0] = (0 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 0]) + ((0 >= dv.$length ? ($throwRuntimeError("index out of range"), undefined) : dv.$array[dv.$offset + 0]))); + } + _tuple$1 = sp.WorldToSpace((0 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 0]), (1 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 1])); + cx = _tuple$1[0]; + cy = _tuple$1[1]; + c = sp.Cell(cx, cy); + if (!(c === cell)) { + cell = c; + } + alternate = !alternate; + } + } + return cells; + }; + Space.prototype.CellsInLine = function(startX, startY, endX, endY) { return this.$val.CellsInLine(startX, startY, endX, endY); }; + NewLine = function(x, y, x2, y2) { + var x, x2, y, y2; + return new Line.ptr(new Vector([x, y]), new Vector([x2, y2])); + }; + $pkg.NewLine = NewLine; + Line.ptr.prototype.Project = function(axis) { + var axis, line; + line = this; + return line.Vector().Scale(axis.Dot(line.Start.Sub(new sliceType$4([line.End])))); + }; + Line.prototype.Project = function(axis) { return this.$val.Project(axis); }; + Line.ptr.prototype.Normal = function() { + var line, v; + line = this; + v = line.Vector(); + return new Vector([(1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1]), -(0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0])]).Unit(); + }; + Line.prototype.Normal = function() { return this.$val.Normal(); }; + Line.ptr.prototype.Vector = function() { + var line; + line = this; + return line.End.Clone().Sub(new sliceType$4([line.Start])).Unit(); + }; + Line.prototype.Vector = function() { return this.$val.Vector(); }; + Line.ptr.prototype.IntersectionPointsLine = function(other) { + var det, dx, dy, gamma, lambda, line, other, x, x$1, x$10, x$11, x$12, x$13, x$14, x$15, x$16, x$17, x$18, x$19, x$2, x$20, x$21, x$22, x$23, x$24, x$25, x$26, x$27, x$28, x$29, x$3, x$4, x$5, x$6, x$7, x$8, x$9; + line = this; + det = ((x = line.End, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])) - (x$1 = line.Start, (0 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 0]))) * ((x$2 = other.End, (1 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 1])) - (x$3 = other.Start, (1 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 1]))) - ((x$4 = other.End, (0 >= x$4.$length ? ($throwRuntimeError("index out of range"), undefined) : x$4.$array[x$4.$offset + 0])) - (x$5 = other.Start, (0 >= x$5.$length ? ($throwRuntimeError("index out of range"), undefined) : x$5.$array[x$5.$offset + 0]))) * ((x$6 = line.End, (1 >= x$6.$length ? ($throwRuntimeError("index out of range"), undefined) : x$6.$array[x$6.$offset + 1])) - (x$7 = line.Start, (1 >= x$7.$length ? ($throwRuntimeError("index out of range"), undefined) : x$7.$array[x$7.$offset + 1]))); + if (!((det === 0))) { + lambda = ((((x$8 = line.Start, (1 >= x$8.$length ? ($throwRuntimeError("index out of range"), undefined) : x$8.$array[x$8.$offset + 1])) - (x$9 = other.Start, (1 >= x$9.$length ? ($throwRuntimeError("index out of range"), undefined) : x$9.$array[x$9.$offset + 1]))) * ((x$10 = other.End, (0 >= x$10.$length ? ($throwRuntimeError("index out of range"), undefined) : x$10.$array[x$10.$offset + 0])) - (x$11 = other.Start, (0 >= x$11.$length ? ($throwRuntimeError("index out of range"), undefined) : x$11.$array[x$11.$offset + 0])))) - (((x$12 = line.Start, (0 >= x$12.$length ? ($throwRuntimeError("index out of range"), undefined) : x$12.$array[x$12.$offset + 0])) - (x$13 = other.Start, (0 >= x$13.$length ? ($throwRuntimeError("index out of range"), undefined) : x$13.$array[x$13.$offset + 0]))) * ((x$14 = other.End, (1 >= x$14.$length ? ($throwRuntimeError("index out of range"), undefined) : x$14.$array[x$14.$offset + 1])) - (x$15 = other.Start, (1 >= x$15.$length ? ($throwRuntimeError("index out of range"), undefined) : x$15.$array[x$15.$offset + 1])))) + 1) / det; + gamma = ((((x$16 = line.Start, (1 >= x$16.$length ? ($throwRuntimeError("index out of range"), undefined) : x$16.$array[x$16.$offset + 1])) - (x$17 = other.Start, (1 >= x$17.$length ? ($throwRuntimeError("index out of range"), undefined) : x$17.$array[x$17.$offset + 1]))) * ((x$18 = line.End, (0 >= x$18.$length ? ($throwRuntimeError("index out of range"), undefined) : x$18.$array[x$18.$offset + 0])) - (x$19 = line.Start, (0 >= x$19.$length ? ($throwRuntimeError("index out of range"), undefined) : x$19.$array[x$19.$offset + 0])))) - (((x$20 = line.Start, (0 >= x$20.$length ? ($throwRuntimeError("index out of range"), undefined) : x$20.$array[x$20.$offset + 0])) - (x$21 = other.Start, (0 >= x$21.$length ? ($throwRuntimeError("index out of range"), undefined) : x$21.$array[x$21.$offset + 0]))) * ((x$22 = line.End, (1 >= x$22.$length ? ($throwRuntimeError("index out of range"), undefined) : x$22.$array[x$22.$offset + 1])) - (x$23 = line.Start, (1 >= x$23.$length ? ($throwRuntimeError("index out of range"), undefined) : x$23.$array[x$23.$offset + 1])))) + 1) / det; + if ((0 < lambda && lambda < 1) && (0 < gamma && gamma < 1)) { + dx = (x$24 = line.End, (0 >= x$24.$length ? ($throwRuntimeError("index out of range"), undefined) : x$24.$array[x$24.$offset + 0])) - (x$25 = line.Start, (0 >= x$25.$length ? ($throwRuntimeError("index out of range"), undefined) : x$25.$array[x$25.$offset + 0])); + dy = (x$26 = line.End, (1 >= x$26.$length ? ($throwRuntimeError("index out of range"), undefined) : x$26.$array[x$26.$offset + 1])) - (x$27 = line.Start, (1 >= x$27.$length ? ($throwRuntimeError("index out of range"), undefined) : x$27.$array[x$27.$offset + 1])); + return new Vector([(x$28 = line.Start, (0 >= x$28.$length ? ($throwRuntimeError("index out of range"), undefined) : x$28.$array[x$28.$offset + 0])) + (lambda * dx), (x$29 = line.Start, (1 >= x$29.$length ? ($throwRuntimeError("index out of range"), undefined) : x$29.$array[x$29.$offset + 1])) + (lambda * dy)]); + } + } + return Vector.nil; + }; + Line.prototype.IntersectionPointsLine = function(other) { return this.$val.IntersectionPointsLine(other); }; + Line.ptr.prototype.IntersectionPointsCircle = function(circle) { + var a, b, c, circle, cp, det, diff, lEnd, lStart, line, points, t, t$1, x, x$1, x$2, x$3, x$4, x$5; + line = this; + points = new sliceType$4([]); + cp = new Vector([circle.X, circle.Y]); + lStart = line.Start.Sub(new sliceType$4([cp])); + lEnd = line.End.Sub(new sliceType$4([cp])); + diff = lEnd.Sub(new sliceType$4([lStart])); + a = (0 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 0]) * (0 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 0]) + (1 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 1]) * (1 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 1]); + b = 2 * (((0 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 0]) * (0 >= lStart.$length ? ($throwRuntimeError("index out of range"), undefined) : lStart.$array[lStart.$offset + 0])) + ((1 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 1]) * (1 >= lStart.$length ? ($throwRuntimeError("index out of range"), undefined) : lStart.$array[lStart.$offset + 1]))); + c = ((0 >= lStart.$length ? ($throwRuntimeError("index out of range"), undefined) : lStart.$array[lStart.$offset + 0]) * (0 >= lStart.$length ? ($throwRuntimeError("index out of range"), undefined) : lStart.$array[lStart.$offset + 0])) + ((1 >= lStart.$length ? ($throwRuntimeError("index out of range"), undefined) : lStart.$array[lStart.$offset + 1]) * (1 >= lStart.$length ? ($throwRuntimeError("index out of range"), undefined) : lStart.$array[lStart.$offset + 1])) - (circle.Radius * circle.Radius); + det = b * b - (4 * a * c); + if (det < 0) { + } else if (det === 0) { + t = -b / (2 * a); + if (t >= 0 && t <= 1) { + points = $append(points, new Vector([(x = line.Start, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])) + t * (0 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 0]), (x$1 = line.Start, (1 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 1])) + t * (1 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 1])])); + } + } else { + t$1 = (-b + math.Sqrt(det)) / (2 * a); + if (t$1 >= 0 && t$1 <= 1) { + points = $append(points, new Vector([(x$2 = line.Start, (0 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 0])) + t$1 * (0 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 0]), (x$3 = line.Start, (1 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 1])) + t$1 * (1 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 1])])); + } + t$1 = (-b - math.Sqrt(det)) / (2 * a); + if (t$1 >= 0 && t$1 <= 1) { + points = $append(points, new Vector([(x$4 = line.Start, (0 >= x$4.$length ? ($throwRuntimeError("index out of range"), undefined) : x$4.$array[x$4.$offset + 0])) + t$1 * (0 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 0]), (x$5 = line.Start, (1 >= x$5.$length ? ($throwRuntimeError("index out of range"), undefined) : x$5.$array[x$5.$offset + 1])) + t$1 * (1 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 1])])); + } + } + return points; + }; + Line.prototype.IntersectionPointsCircle = function(circle) { return this.$val.IntersectionPointsCircle(circle); }; + NewConvexPolygon = function(points) { + var cp, points; + cp = new ConvexPolygon.ptr(new sliceType$4([]), 0, 0, true); + cp.AddPoints(points); + return cp; + }; + $pkg.NewConvexPolygon = NewConvexPolygon; + ConvexPolygon.ptr.prototype.Clone = function() { + var _i, _ref, cp, newPoly, point, points; + cp = this; + points = new sliceType$4([]); + _ref = cp.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + point = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + points = $append(points, point.Clone()); + _i++; + } + newPoly = NewConvexPolygon(sliceType.nil); + newPoly.X = cp.X; + newPoly.Y = cp.Y; + newPoly.AddPointsVec(points); + newPoly.Closed = cp.Closed; + return newPoly; + }; + ConvexPolygon.prototype.Clone = function() { return this.$val.Clone(); }; + ConvexPolygon.ptr.prototype.AddPointsVec = function(points) { + var cp, points; + cp = this; + cp.Points = $appendSlice(cp.Points, points); + }; + ConvexPolygon.prototype.AddPointsVec = function(points) { return this.$val.AddPointsVec(points); }; + ConvexPolygon.ptr.prototype.AddPoints = function(vertexPositions) { + var cp, v, vertexPositions, x; + cp = this; + v = 0; + while (true) { + if (!(v < vertexPositions.$length)) { break; } + cp.Points = $append(cp.Points, new Vector([((v < 0 || v >= vertexPositions.$length) ? ($throwRuntimeError("index out of range"), undefined) : vertexPositions.$array[vertexPositions.$offset + v]), (x = v + 1 >> 0, ((x < 0 || x >= vertexPositions.$length) ? ($throwRuntimeError("index out of range"), undefined) : vertexPositions.$array[vertexPositions.$offset + x]))])); + v = v + (2) >> 0; + } + }; + ConvexPolygon.prototype.AddPoints = function(vertexPositions) { return this.$val.AddPoints(vertexPositions); }; + ConvexPolygon.ptr.prototype.Lines = function() { + var _tmp, _tmp$1, cp, end, i, line, lines, start, vertices, x; + cp = this; + lines = new sliceType$5([]); + vertices = cp.Transformed(); + i = 0; + while (true) { + if (!(i < vertices.$length)) { break; } + _tmp = ((i < 0 || i >= vertices.$length) ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + i]); + _tmp$1 = (0 >= vertices.$length ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + 0]); + start = _tmp; + end = _tmp$1; + if (i < (vertices.$length - 1 >> 0)) { + end = (x = i + 1 >> 0, ((x < 0 || x >= vertices.$length) ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + x])); + } else if (!cp.Closed) { + break; + } + line = NewLine((0 >= start.$length ? ($throwRuntimeError("index out of range"), undefined) : start.$array[start.$offset + 0]), (1 >= start.$length ? ($throwRuntimeError("index out of range"), undefined) : start.$array[start.$offset + 1]), (0 >= end.$length ? ($throwRuntimeError("index out of range"), undefined) : end.$array[end.$offset + 0]), (1 >= end.$length ? ($throwRuntimeError("index out of range"), undefined) : end.$array[end.$offset + 1])); + lines = $append(lines, line); + i = i + (1) >> 0; + } + return lines; + }; + ConvexPolygon.prototype.Lines = function() { return this.$val.Lines(); }; + ConvexPolygon.ptr.prototype.Transformed = function() { + var _i, _ref, cp, point, transformed; + cp = this; + transformed = new sliceType$4([]); + _ref = cp.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + point = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + transformed = $append(transformed, new Vector([(0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]) + cp.X, (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1]) + cp.Y])); + _i++; + } + return transformed; + }; + ConvexPolygon.prototype.Transformed = function() { return this.$val.Transformed(); }; + ConvexPolygon.ptr.prototype.Bounds = function() { + var bottomRight, cp, i, point, topLeft, transformed, x, x$1; + cp = this; + transformed = cp.Transformed(); + topLeft = new Vector([(x = (0 >= transformed.$length ? ($throwRuntimeError("index out of range"), undefined) : transformed.$array[transformed.$offset + 0]), (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])), (x$1 = (0 >= transformed.$length ? ($throwRuntimeError("index out of range"), undefined) : transformed.$array[transformed.$offset + 0]), (1 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 1]))]); + bottomRight = topLeft.Clone(); + i = 0; + while (true) { + if (!(i < transformed.$length)) { break; } + point = ((i < 0 || i >= transformed.$length) ? ($throwRuntimeError("index out of range"), undefined) : transformed.$array[transformed.$offset + i]); + if ((0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]) < (0 >= topLeft.$length ? ($throwRuntimeError("index out of range"), undefined) : topLeft.$array[topLeft.$offset + 0])) { + (0 >= topLeft.$length ? ($throwRuntimeError("index out of range"), undefined) : topLeft.$array[topLeft.$offset + 0] = (0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0])); + } else if ((0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]) > (0 >= bottomRight.$length ? ($throwRuntimeError("index out of range"), undefined) : bottomRight.$array[bottomRight.$offset + 0])) { + (0 >= bottomRight.$length ? ($throwRuntimeError("index out of range"), undefined) : bottomRight.$array[bottomRight.$offset + 0] = (0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0])); + } + if ((1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1]) < (1 >= topLeft.$length ? ($throwRuntimeError("index out of range"), undefined) : topLeft.$array[topLeft.$offset + 1])) { + (1 >= topLeft.$length ? ($throwRuntimeError("index out of range"), undefined) : topLeft.$array[topLeft.$offset + 1] = (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1])); + } else if ((1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1]) > (1 >= bottomRight.$length ? ($throwRuntimeError("index out of range"), undefined) : bottomRight.$array[bottomRight.$offset + 1])) { + (1 >= bottomRight.$length ? ($throwRuntimeError("index out of range"), undefined) : bottomRight.$array[bottomRight.$offset + 1] = (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1])); + } + i = i + (1) >> 0; + } + return [topLeft, bottomRight]; + }; + ConvexPolygon.prototype.Bounds = function() { return this.$val.Bounds(); }; + ConvexPolygon.ptr.prototype.Position = function() { + var cp; + cp = this; + return [cp.X, cp.Y]; + }; + ConvexPolygon.prototype.Position = function() { return this.$val.Position(); }; + ConvexPolygon.ptr.prototype.SetPosition = function(x, y) { + var cp, x, y; + cp = this; + cp.X = x; + cp.Y = y; + }; + ConvexPolygon.prototype.SetPosition = function(x, y) { return this.$val.SetPosition(x, y); }; + ConvexPolygon.ptr.prototype.SetPositionVec = function(vec) { + var cp, vec; + cp = this; + cp.X = vec.X(); + cp.Y = vec.Y(); + }; + ConvexPolygon.prototype.SetPositionVec = function(vec) { return this.$val.SetPositionVec(vec); }; + ConvexPolygon.ptr.prototype.Move = function(x, y) { + var cp, x, y; + cp = this; + cp.X = cp.X + (x); + cp.Y = cp.Y + (y); + }; + ConvexPolygon.prototype.Move = function(x, y) { return this.$val.Move(x, y); }; + ConvexPolygon.ptr.prototype.MoveVec = function(vec) { + var cp, vec; + cp = this; + cp.X = cp.X + (vec.X()); + cp.Y = cp.Y + (vec.Y()); + }; + ConvexPolygon.prototype.MoveVec = function(vec) { return this.$val.MoveVec(vec); }; + ConvexPolygon.ptr.prototype.Center = function() { + var _i, _ref, cp, pos, v; + cp = this; + pos = new Vector([0, 0]); + _ref = cp.Transformed(); + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + v = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + pos.Add(new sliceType$4([v])); + _i++; + } + (0 >= pos.$length ? ($throwRuntimeError("index out of range"), undefined) : pos.$array[pos.$offset + 0] = (0 >= pos.$length ? ($throwRuntimeError("index out of range"), undefined) : pos.$array[pos.$offset + 0]) / ((cp.Transformed().$length))); + (1 >= pos.$length ? ($throwRuntimeError("index out of range"), undefined) : pos.$array[pos.$offset + 1] = (1 >= pos.$length ? ($throwRuntimeError("index out of range"), undefined) : pos.$array[pos.$offset + 1]) / ((cp.Transformed().$length))); + return pos; + }; + ConvexPolygon.prototype.Center = function() { return this.$val.Center(); }; + ConvexPolygon.ptr.prototype.Project = function(axis) { + var axis, cp, i, max, min, p, vertices, x, x$1, x$2, x$3; + cp = this; + axis = axis.Unit(); + vertices = cp.Transformed(); + min = axis.Dot(new Vector([(x = (0 >= vertices.$length ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + 0]), (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])), (x$1 = (0 >= vertices.$length ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + 0]), (1 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 1]))])); + max = min; + i = 1; + while (true) { + if (!(i < vertices.$length)) { break; } + p = axis.Dot(new Vector([(x$2 = ((i < 0 || i >= vertices.$length) ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + i]), (0 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 0])), (x$3 = ((i < 0 || i >= vertices.$length) ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + i]), (1 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 1]))])); + if (p < min) { + min = p; + } else if (p > max) { + max = p; + } + i = i + (1) >> 0; + } + return new Projection.ptr(min, max); + }; + ConvexPolygon.prototype.Project = function(axis) { return this.$val.Project(axis); }; + ConvexPolygon.ptr.prototype.SATAxes = function() { + var _i, _ref, axes, cp, line; + cp = this; + axes = new sliceType$4([]); + _ref = cp.Lines(); + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + line = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + axes = $append(axes, line.Normal()); + _i++; + } + return axes; + }; + ConvexPolygon.prototype.SATAxes = function() { return this.$val.SATAxes(); }; + ConvexPolygon.ptr.prototype.PointInside = function(point) { + var _i, _ref, contactCount, line, point, pointLine, polygon; + polygon = this; + pointLine = NewLine((0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]), (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1]), (0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]) + 9.99999999999e+11, (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1])); + contactCount = 0; + _ref = polygon.Lines(); + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + line = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (!(line.IntersectionPointsLine(pointLine) === Vector.nil)) { + contactCount = contactCount + (1) >> 0; + } + _i++; + } + return contactCount === 1; + }; + ConvexPolygon.prototype.PointInside = function(point) { return this.$val.PointInside(point); }; + NewContactSet = function() { + return new ContactSet.ptr(new sliceType$4([]), new Vector([0, 0]), new Vector([0, 0])); + }; + $pkg.NewContactSet = NewContactSet; + ContactSet.ptr.prototype.LeftmostPoint = function() { + var _i, _ref, cs, left, point; + cs = this; + left = Vector.nil; + _ref = cs.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + point = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (left === Vector.nil || (0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]) < (0 >= left.$length ? ($throwRuntimeError("index out of range"), undefined) : left.$array[left.$offset + 0])) { + left = point; + } + _i++; + } + return left; + }; + ContactSet.prototype.LeftmostPoint = function() { return this.$val.LeftmostPoint(); }; + ContactSet.ptr.prototype.RightmostPoint = function() { + var _i, _ref, cs, point, right; + cs = this; + right = Vector.nil; + _ref = cs.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + point = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (right === Vector.nil || (0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]) > (0 >= right.$length ? ($throwRuntimeError("index out of range"), undefined) : right.$array[right.$offset + 0])) { + right = point; + } + _i++; + } + return right; + }; + ContactSet.prototype.RightmostPoint = function() { return this.$val.RightmostPoint(); }; + ContactSet.ptr.prototype.TopmostPoint = function() { + var _i, _ref, cs, point, top; + cs = this; + top = Vector.nil; + _ref = cs.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + point = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (top === Vector.nil || (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1]) < (1 >= top.$length ? ($throwRuntimeError("index out of range"), undefined) : top.$array[top.$offset + 1])) { + top = point; + } + _i++; + } + return top; + }; + ContactSet.prototype.TopmostPoint = function() { return this.$val.TopmostPoint(); }; + ContactSet.ptr.prototype.BottommostPoint = function() { + var _i, _ref, bottom, cs, point; + cs = this; + bottom = Vector.nil; + _ref = cs.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + point = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (bottom === Vector.nil || (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1]) > (1 >= bottom.$length ? ($throwRuntimeError("index out of range"), undefined) : bottom.$array[bottom.$offset + 1])) { + bottom = point; + } + _i++; + } + return bottom; + }; + ContactSet.prototype.BottommostPoint = function() { return this.$val.BottommostPoint(); }; + ConvexPolygon.ptr.prototype.Intersection = function(dx, dy, other) { + var _i, _i$1, _i$2, _i$3, _ref, _ref$1, _ref$2, _ref$3, _tuple, _tuple$1, circle, contactSet, cp, deltaMagnitude, dx, dy, isCircle, isPoly, line, line$1, mtv, ogMagnitude, ogX, ogY, other, otherLine, point, point$1, poly, x, x$1, x$2, x$3; + cp = this; + contactSet = NewContactSet(); + ogX = cp.X; + ogY = cp.Y; + cp.X = cp.X + (dx); + cp.Y = cp.Y + (dy); + _tuple = $assertType(other, ptrType$4, true); + circle = _tuple[0]; + isCircle = _tuple[1]; + if (isCircle) { + _ref = cp.Lines(); + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + line = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + contactSet.Points = $appendSlice(contactSet.Points, line.IntersectionPointsCircle(circle)); + _i++; + } + } else { + _tuple$1 = $assertType(other, ptrType$5, true); + poly = _tuple$1[0]; + isPoly = _tuple$1[1]; + if (isPoly) { + _ref$1 = cp.Lines(); + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$1.$length)) { break; } + line$1 = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); + _ref$2 = poly.Lines(); + _i$2 = 0; + while (true) { + if (!(_i$2 < _ref$2.$length)) { break; } + otherLine = ((_i$2 < 0 || _i$2 >= _ref$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$2.$array[_ref$2.$offset + _i$2]); + point = line$1.IntersectionPointsLine(otherLine); + if (!(point === Vector.nil)) { + contactSet.Points = $append(contactSet.Points, point); + } + _i$2++; + } + _i$1++; + } + } + } + if (contactSet.Points.$length > 0) { + _ref$3 = contactSet.Points; + _i$3 = 0; + while (true) { + if (!(_i$3 < _ref$3.$length)) { break; } + point$1 = ((_i$3 < 0 || _i$3 >= _ref$3.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$3.$array[_ref$3.$offset + _i$3]); + contactSet.Center = contactSet.Center.Add(new sliceType$4([point$1])); + _i$3++; + } + (x$1 = contactSet.Center, (0 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 0] = (x = contactSet.Center, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])) / ((contactSet.Points.$length)))); + (x$3 = contactSet.Center, (1 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 1] = (x$2 = contactSet.Center, (1 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 1])) / ((contactSet.Points.$length)))); + mtv = cp.calculateMTV(contactSet, other); + if (!(mtv === Vector.nil)) { + contactSet.MTV = mtv; + } + } else { + contactSet = ptrType$6.nil; + } + if (!(contactSet === ptrType$6.nil) && (!((dx === 0)) || !((dy === 0)))) { + deltaMagnitude = new Vector([dx, dy]).Magnitude(); + ogMagnitude = contactSet.MTV.Magnitude(); + contactSet.MTV = contactSet.MTV.Unit().Scale(ogMagnitude - deltaMagnitude); + } + cp.X = ogX; + cp.Y = ogY; + return contactSet; + }; + ConvexPolygon.prototype.Intersection = function(dx, dy, other) { return this.$val.Intersection(dx, dy, other); }; + ConvexPolygon.ptr.prototype.calculateMTV = function(contactSet, otherShape) { + var _i, _i$1, _ref, _ref$1, _ref$2, axis, axis$1, contactSet, cp, delta, other, otherShape, overlap, overlap$1, smallest; + cp = this; + delta = new Vector([0, 0]); + smallest = new Vector([1.7976931348623157e+308, 0]); + _ref = otherShape; + if ($assertType(_ref, ptrType$5, true)[1]) { + other = _ref.$val; + _ref$1 = cp.SATAxes(); + _i = 0; + while (true) { + if (!(_i < _ref$1.$length)) { break; } + axis = ((_i < 0 || _i >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i]); + if (!$clone(cp.Project(axis), Projection).Overlapping($clone(other.Project(axis), Projection))) { + return Vector.nil; + } + overlap = $clone(cp.Project(axis), Projection).Overlap($clone(other.Project(axis), Projection)); + if (smallest.Magnitude() > overlap) { + smallest = axis.Scale(overlap); + } + _i++; + } + _ref$2 = other.SATAxes(); + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$2.$length)) { break; } + axis$1 = ((_i$1 < 0 || _i$1 >= _ref$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$2.$array[_ref$2.$offset + _i$1]); + if (!$clone(cp.Project(axis$1), Projection).Overlapping($clone(other.Project(axis$1), Projection))) { + return Vector.nil; + } + overlap$1 = $clone(cp.Project(axis$1), Projection).Overlap($clone(other.Project(axis$1), Projection)); + if (smallest.Magnitude() > overlap$1) { + smallest = axis$1.Scale(overlap$1); + } + _i$1++; + } + } + (0 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 0] = (0 >= smallest.$length ? ($throwRuntimeError("index out of range"), undefined) : smallest.$array[smallest.$offset + 0])); + (1 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 1] = (1 >= smallest.$length ? ($throwRuntimeError("index out of range"), undefined) : smallest.$array[smallest.$offset + 1])); + return delta; + }; + ConvexPolygon.prototype.calculateMTV = function(contactSet, otherShape) { return this.$val.calculateMTV(contactSet, otherShape); }; + ConvexPolygon.ptr.prototype.ContainedBy = function(otherShape) { + var _i, _i$1, _ref, _ref$1, _ref$2, axis, axis$1, cp, other, otherShape; + cp = this; + _ref = otherShape; + if ($assertType(_ref, ptrType$5, true)[1]) { + other = _ref.$val; + _ref$1 = cp.SATAxes(); + _i = 0; + while (true) { + if (!(_i < _ref$1.$length)) { break; } + axis = ((_i < 0 || _i >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i]); + if (!$clone(cp.Project(axis), Projection).IsInside($clone(other.Project(axis), Projection))) { + return false; + } + _i++; + } + _ref$2 = other.SATAxes(); + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$2.$length)) { break; } + axis$1 = ((_i$1 < 0 || _i$1 >= _ref$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$2.$array[_ref$2.$offset + _i$1]); + if (!$clone(cp.Project(axis$1), Projection).IsInside($clone(other.Project(axis$1), Projection))) { + return false; + } + _i$1++; + } + } + return true; + }; + ConvexPolygon.prototype.ContainedBy = function(otherShape) { return this.$val.ContainedBy(otherShape); }; + ConvexPolygon.ptr.prototype.FlipH = function() { + var _i, _ref, cp, v; + cp = this; + _ref = cp.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + v = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0] = -(0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0])); + _i++; + } + cp.ReverseVertexOrder(); + }; + ConvexPolygon.prototype.FlipH = function() { return this.$val.FlipH(); }; + ConvexPolygon.ptr.prototype.FlipV = function() { + var _i, _ref, cp, v; + cp = this; + _ref = cp.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + v = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + (1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1] = -(1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1])); + _i++; + } + cp.ReverseVertexOrder(); + }; + ConvexPolygon.prototype.FlipV = function() { return this.$val.FlipV(); }; + ConvexPolygon.ptr.prototype.ReverseVertexOrder = function() { + var cp, i, verts, x, x$1; + cp = this; + verts = new sliceType$4([(x = cp.Points, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0]))]); + i = cp.Points.$length - 1 >> 0; + while (true) { + if (!(i >= 1)) { break; } + verts = $append(verts, (x$1 = cp.Points, ((i < 0 || i >= x$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + i]))); + i = i - (1) >> 0; + } + cp.Points = verts; + }; + ConvexPolygon.prototype.ReverseVertexOrder = function() { return this.$val.ReverseVertexOrder(); }; + NewRectangle = function(x, y, w, h) { + var h, w, x, y; + return NewConvexPolygon(new sliceType([x, y, x + w, y, x + w, y + h, x, y + h])); + }; + $pkg.NewRectangle = NewRectangle; + NewCircle = function(x, y, radius) { + var circle, radius, x, y; + circle = new Circle.ptr(x, y, radius); + return circle; + }; + $pkg.NewCircle = NewCircle; + Circle.ptr.prototype.Clone = function() { + var circle; + circle = this; + return NewCircle(circle.X, circle.Y, circle.Radius); + }; + Circle.prototype.Clone = function() { return this.$val.Clone(); }; + Circle.ptr.prototype.Bounds = function() { + var circle; + circle = this; + return [new Vector([circle.X - circle.Radius, circle.Y - circle.Radius]), new Vector([circle.X + circle.Radius, circle.Y + circle.Radius])]; + }; + Circle.prototype.Bounds = function() { return this.$val.Bounds(); }; + Circle.ptr.prototype.Intersection = function(dx, dy, other) { + var _i, _ref, _ref$1, circle, contactSet, dist, dx, dy, other, ox, oy, point, shape, shape$1, x, x$1, x$2, x$3; + circle = this; + contactSet = ptrType$6.nil; + ox = circle.X; + oy = circle.Y; + circle.X = circle.X + (dx); + circle.Y = circle.Y + (dy); + _ref = other; + if ($assertType(_ref, ptrType$5, true)[1]) { + shape = _ref.$val; + contactSet = shape.Intersection(-dx, -dy, circle); + if (!(contactSet === ptrType$6.nil)) { + contactSet.MTV = contactSet.MTV.Scale(-1); + } + } else if ($assertType(_ref, ptrType$4, true)[1]) { + shape$1 = _ref.$val; + contactSet = NewContactSet(); + contactSet.Points = circle.IntersectionPointsCircle(shape$1); + if (contactSet.Points.$length === 0) { + return ptrType$6.nil; + } + contactSet.MTV = new Vector([circle.X - shape$1.X, circle.Y - shape$1.Y]); + dist = contactSet.MTV.Magnitude(); + contactSet.MTV = contactSet.MTV.Unit().Scale(circle.Radius + shape$1.Radius - dist); + _ref$1 = contactSet.Points; + _i = 0; + while (true) { + if (!(_i < _ref$1.$length)) { break; } + point = ((_i < 0 || _i >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i]); + contactSet.Center = contactSet.Center.Add(new sliceType$4([point])); + _i++; + } + (x$1 = contactSet.Center, (0 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 0] = (x = contactSet.Center, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])) / ((contactSet.Points.$length)))); + (x$3 = contactSet.Center, (1 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 1] = (x$2 = contactSet.Center, (1 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 1])) / ((contactSet.Points.$length)))); + } + circle.X = ox; + circle.Y = oy; + return contactSet; + }; + Circle.prototype.Intersection = function(dx, dy, other) { return this.$val.Intersection(dx, dy, other); }; + Circle.ptr.prototype.Move = function(x, y) { + var circle, x, y; + circle = this; + circle.X = circle.X + (x); + circle.Y = circle.Y + (y); + }; + Circle.prototype.Move = function(x, y) { return this.$val.Move(x, y); }; + Circle.ptr.prototype.MoveVec = function(vec) { + var circle, vec; + circle = this; + circle.X = circle.X + (vec.X()); + circle.Y = circle.Y + (vec.Y()); + }; + Circle.prototype.MoveVec = function(vec) { return this.$val.MoveVec(vec); }; + Circle.ptr.prototype.SetPosition = function(x, y) { + var circle, x, y; + circle = this; + circle.X = x; + circle.Y = y; + }; + Circle.prototype.SetPosition = function(x, y) { return this.$val.SetPosition(x, y); }; + Circle.ptr.prototype.SetPositionVec = function(vec) { + var circle, vec; + circle = this; + circle.X = vec.X(); + circle.Y = vec.Y(); + }; + Circle.prototype.SetPositionVec = function(vec) { return this.$val.SetPositionVec(vec); }; + Circle.ptr.prototype.Position = function() { + var circle; + circle = this; + return [circle.X, circle.Y]; + }; + Circle.prototype.Position = function() { return this.$val.Position(); }; + Circle.ptr.prototype.PointInside = function(point) { + var circle, point; + circle = this; + return point.Sub(new sliceType$4([new Vector([circle.X, circle.Y])])).Magnitude() <= circle.Radius; + }; + Circle.prototype.PointInside = function(point) { return this.$val.PointInside(point); }; + Circle.ptr.prototype.IntersectionPointsCircle = function(other) { + var a, circle, d, h, other, x2, y2; + circle = this; + d = math.Sqrt(math.Pow(other.X - circle.X, 2) + math.Pow(other.Y - circle.Y, 2)); + if (d > circle.Radius + other.Radius || d < math.Abs(circle.Radius - other.Radius) || (d === 0) && (circle.Radius === other.Radius)) { + return sliceType$4.nil; + } + a = (math.Pow(circle.Radius, 2) - math.Pow(other.Radius, 2) + math.Pow(d, 2)) / (2 * d); + h = math.Sqrt(math.Pow(circle.Radius, 2) - math.Pow(a, 2)); + x2 = circle.X + a * (other.X - circle.X) / d; + y2 = circle.Y + a * (other.Y - circle.Y) / d; + return new sliceType$4([new Vector([x2 + h * (other.Y - circle.Y) / d, y2 - h * (other.X - circle.X) / d]), new Vector([x2 - h * (other.Y - circle.Y) / d, y2 + h * (other.X - circle.X) / d])]); + }; + Circle.prototype.IntersectionPointsCircle = function(other) { return this.$val.IntersectionPointsCircle(other); }; + Projection.ptr.prototype.Overlapping = function(other) { + var other, projection; + projection = this; + return $clone(projection, Projection).Overlap($clone(other, Projection)) > 0; + }; + Projection.prototype.Overlapping = function(other) { return this.$val.Overlapping(other); }; + Projection.ptr.prototype.Overlap = function(other) { + var other, projection; + projection = this; + return math.Min(projection.Max, other.Max) - math.Max(projection.Min, other.Min); + }; + Projection.prototype.Overlap = function(other) { return this.$val.Overlap(other); }; + Projection.ptr.prototype.IsInside = function(other) { + var other, projection; + projection = this; + return projection.Min >= other.Min && projection.Max <= other.Max; + }; + Projection.prototype.IsInside = function(other) { return this.$val.IsInside(other); }; + NewObject = function(x, y, w, h, tags) { + var h, o, tags, w, x, y; + o = new Object.ptr($ifaceNil, ptrType$1.nil, x, y, w, h, sliceType$1.nil, $ifaceNil, $makeMap(ptrType$2.keyFor, []), new sliceType$6([])); + if (tags.$length > 0) { + o.AddTags(tags); + } + return o; + }; + $pkg.NewObject = NewObject; + Object.ptr.prototype.Clone = function() { + var {_entry, _i, _keys, _r, _ref, k, newObj, obj, $s, $r, $c} = $restore(this, {}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + obj = this; + newObj = NewObject(obj.X, obj.Y, obj.W, obj.H, obj.Tags()); + newObj.Data = obj.Data; + /* */ if (!($interfaceIsEqual(obj.Shape, $ifaceNil))) { $s = 1; continue; } + /* */ $s = 2; continue; + /* if (!($interfaceIsEqual(obj.Shape, $ifaceNil))) { */ case 1: + _r = obj.Shape.Clone(); /* */ $s = 3; case 3: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + $r = newObj.SetShape(_r); /* */ $s = 4; case 4: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + /* } */ case 2: + _ref = obj.ignoreList; + _i = 0; + _keys = $keys(_ref); + while (true) { + if (!(_i < _keys.length)) { break; } + _entry = _ref[_keys[_i]]; + if (_entry === undefined) { + _i++; + continue; + } + k = _entry.k; + newObj.AddToIgnoreList(k); + _i++; + } + $s = -1; return newObj; + /* */ } return; } var $f = {$blk: Object.ptr.prototype.Clone, $c: true, $r, _entry, _i, _keys, _r, _ref, k, newObj, obj, $s};return $f; + }; + Object.prototype.Clone = function() { return this.$val.Clone(); }; + Object.ptr.prototype.Update = function() { + var {_tuple, c, cx, cy, ex, ey, obj, space, x, y, $s, $r, $c} = $restore(this, {}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + obj = this; + if (!(obj.Space === ptrType$1.nil)) { + space = obj.Space; + obj.Space.Remove(new sliceType$3([obj])); + obj.Space = space; + _tuple = obj.BoundsToSpace(0, 0); + cx = _tuple[0]; + cy = _tuple[1]; + ex = _tuple[2]; + ey = _tuple[3]; + y = cy; + while (true) { + if (!(y <= ey)) { break; } + x = cx; + while (true) { + if (!(x <= ex)) { break; } + c = obj.Space.Cell(x, y); + if (!(c === ptrType.nil)) { + c.register(obj); + obj.TouchingCells = $append(obj.TouchingCells, c); + } + x = x + (1) >> 0; + } + y = y + (1) >> 0; + } + } + /* */ if (!($interfaceIsEqual(obj.Shape, $ifaceNil))) { $s = 1; continue; } + /* */ $s = 2; continue; + /* if (!($interfaceIsEqual(obj.Shape, $ifaceNil))) { */ case 1: + $r = obj.Shape.SetPosition(obj.X, obj.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: Object.ptr.prototype.Update, $c: true, $r, _tuple, c, cx, cy, ex, ey, obj, space, x, y, $s};return $f; + }; + Object.prototype.Update = function() { return this.$val.Update(); }; + Object.ptr.prototype.AddTags = function(tags) { + var obj, tags; + obj = this; + obj.tags = $appendSlice(obj.tags, tags); + }; + Object.prototype.AddTags = function(tags) { return this.$val.AddTags(tags); }; + Object.ptr.prototype.RemoveTags = function(tags) { + var _i, _i$1, _ref, _ref$1, i, obj, t, tag, tags; + obj = this; + _ref = tags; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + tag = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + _ref$1 = obj.tags; + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$1.$length)) { break; } + i = _i$1; + t = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); + if (t === tag) { + obj.tags = $appendSlice($subslice(obj.tags, 0, i), $subslice(obj.tags, (i + 1 >> 0))); + break; + } + _i$1++; + } + _i++; + } + }; + Object.prototype.RemoveTags = function(tags) { return this.$val.RemoveTags(tags); }; + Object.ptr.prototype.HasTags = function(tags) { + var _i, _i$1, _ref, _ref$1, obj, t, tag, tags; + obj = this; + _ref = tags; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + tag = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + _ref$1 = obj.tags; + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$1.$length)) { break; } + t = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); + if (t === tag) { + return true; + } + _i$1++; + } + _i++; + } + return false; + }; + Object.prototype.HasTags = function(tags) { return this.$val.HasTags(tags); }; + Object.ptr.prototype.Tags = function() { + var obj; + obj = this; + return $appendSlice(new sliceType$6([]), obj.tags); + }; + Object.prototype.Tags = function() { return this.$val.Tags(); }; + Object.ptr.prototype.SetShape = function(shape) { + var {obj, shape, $s, $r, $c} = $restore(this, {shape}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + obj = this; + /* */ if (!($interfaceIsEqual(obj.Shape, shape))) { $s = 1; continue; } + /* */ $s = 2; continue; + /* if (!($interfaceIsEqual(obj.Shape, shape))) { */ case 1: + obj.Shape = shape; + $r = obj.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: Object.ptr.prototype.SetShape, $c: true, $r, obj, shape, $s};return $f; + }; + Object.prototype.SetShape = function(shape) { return this.$val.SetShape(shape); }; + Object.ptr.prototype.BoundsToSpace = function(dx, dy) { + var _tuple, _tuple$1, cx, cy, dx, dy, ex, ey, obj; + obj = this; + _tuple = obj.Space.WorldToSpace(obj.X + dx, obj.Y + dy); + cx = _tuple[0]; + cy = _tuple[1]; + _tuple$1 = obj.Space.WorldToSpace(obj.X + obj.W + dx - 1, obj.Y + obj.H + dy - 1); + ex = _tuple$1[0]; + ey = _tuple$1[1]; + return [cx, cy, ex, ey]; + }; + Object.prototype.BoundsToSpace = function(dx, dy) { return this.$val.BoundsToSpace(dx, dy); }; + Object.ptr.prototype.SharesCells = function(other) { + var _i, _ref, cell, obj, other; + obj = this; + _ref = obj.TouchingCells; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + cell = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (cell.Contains(other)) { + return true; + } + _i++; + } + return false; + }; + Object.prototype.SharesCells = function(other) { return this.$val.SharesCells(other); }; + Object.ptr.prototype.SharesCellsTags = function(tags) { + var _i, _ref, cell, obj, tags; + obj = this; + _ref = obj.TouchingCells; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + cell = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (cell.ContainsTags(tags)) { + return true; + } + _i++; + } + return false; + }; + Object.prototype.SharesCellsTags = function(tags) { return this.$val.SharesCellsTags(tags); }; + Object.ptr.prototype.Center = function() { + var obj; + obj = this; + return [obj.X + (obj.W / 2), obj.Y + (obj.H / 2)]; + }; + Object.prototype.Center = function() { return this.$val.Center(); }; + Object.ptr.prototype.SetCenter = function(x, y) { + var obj, x, y; + obj = this; + obj.X = x - (obj.W / 2); + obj.Y = y - (obj.H / 2); + }; + Object.prototype.SetCenter = function(x, y) { return this.$val.SetCenter(x, y); }; + Object.ptr.prototype.CellPosition = function() { + var _tuple, obj; + obj = this; + _tuple = obj.Center(); + return obj.Space.WorldToSpace(_tuple[0], _tuple[1]); + }; + Object.prototype.CellPosition = function() { return this.$val.CellPosition(); }; + Object.ptr.prototype.SetRight = function(x) { + var obj, x; + obj = this; + obj.X = x - obj.W; + }; + Object.prototype.SetRight = function(x) { return this.$val.SetRight(x); }; + Object.ptr.prototype.SetBottom = function(y) { + var obj, y; + obj = this; + obj.Y = y - obj.H; + }; + Object.prototype.SetBottom = function(y) { return this.$val.SetBottom(y); }; + Object.ptr.prototype.Bottom = function() { + var obj; + obj = this; + return obj.Y + obj.H; + }; + Object.prototype.Bottom = function() { return this.$val.Bottom(); }; + Object.ptr.prototype.Right = function() { + var obj; + obj = this; + return obj.X + obj.W; + }; + Object.prototype.Right = function() { return this.$val.Right(); }; + Object.ptr.prototype.SetBounds = function(topLeft, bottomRight) { + var bottomRight, obj, topLeft; + obj = this; + obj.X = (0 >= topLeft.$length ? ($throwRuntimeError("index out of range"), undefined) : topLeft.$array[topLeft.$offset + 0]); + obj.Y = (1 >= topLeft.$length ? ($throwRuntimeError("index out of range"), undefined) : topLeft.$array[topLeft.$offset + 1]); + obj.W = (0 >= bottomRight.$length ? ($throwRuntimeError("index out of range"), undefined) : bottomRight.$array[bottomRight.$offset + 0]) - obj.X; + obj.H = (1 >= bottomRight.$length ? ($throwRuntimeError("index out of range"), undefined) : bottomRight.$array[bottomRight.$offset + 1]) - obj.Y; + }; + Object.prototype.SetBounds = function(topLeft, bottomRight) { return this.$val.SetBounds(topLeft, bottomRight); }; + Object.ptr.prototype.Check = function(dx, dy, tags) { + var _entry, _entry$1, _entry$2, _i, _key, _key$1, _ref, _tuple, _tuple$1, _tuple$2, added, added$1, c, cc, cellsAdded, cx, cy, dx, dy, ex, ey, ignored, o, obj, objectsAdded, tags, x, y; + obj = this; + if (obj.Space === ptrType$1.nil) { + return ptrType$7.nil; + } + cc = NewCollision(); + cc.checkingObject = obj; + if (dx < 0) { + dx = math.Min(dx, -1); + } else if (dx > 0) { + dx = math.Max(dx, 1); + } + if (dy < 0) { + dy = math.Min(dy, -1); + } else if (dy > 0) { + dy = math.Max(dy, 1); + } + cc.dx = dx; + cc.dy = dy; + _tuple = obj.BoundsToSpace(dx, dy); + cx = _tuple[0]; + cy = _tuple[1]; + ex = _tuple[2]; + ey = _tuple[3]; + objectsAdded = $makeMap(ptrType$2.keyFor, []); + cellsAdded = $makeMap(ptrType.keyFor, []); + y = cy; + while (true) { + if (!(y <= ey)) { break; } + x = cx; + while (true) { + if (!(x <= ex)) { break; } + c = obj.Space.Cell(x, y); + if (!(c === ptrType.nil)) { + _ref = c.Objects; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + o = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + ignored = (_entry = obj.ignoreList[ptrType$2.keyFor(o)], _entry !== undefined ? _entry.v : false); + if (o === obj || ignored) { + _i++; + continue; + } + _tuple$1 = (_entry$1 = objectsAdded[ptrType$2.keyFor(o)], _entry$1 !== undefined ? [_entry$1.v, true] : [false, false]); + added = _tuple$1[1]; + if (((tags.$length === 0) || o.HasTags(tags)) && !added) { + cc.Objects = $append(cc.Objects, o); + _key = o; (objectsAdded || $throwRuntimeError("assignment to entry in nil map"))[ptrType$2.keyFor(_key)] = { k: _key, v: true }; + _tuple$2 = (_entry$2 = cellsAdded[ptrType.keyFor(c)], _entry$2 !== undefined ? [_entry$2.v, true] : [false, false]); + added$1 = _tuple$2[1]; + if (!added$1) { + cc.Cells = $append(cc.Cells, c); + _key$1 = c; (cellsAdded || $throwRuntimeError("assignment to entry in nil map"))[ptrType.keyFor(_key$1)] = { k: _key$1, v: true }; + } + _i++; + continue; + } + _i++; + } + } + x = x + (1) >> 0; + } + y = y + (1) >> 0; + } + if (cc.Objects.$length === 0) { + return ptrType$7.nil; + } + return cc; + }; + Object.prototype.Check = function(dx, dy, tags) { return this.$val.Check(dx, dy, tags); }; + Object.ptr.prototype.Overlaps = function(other) { + var obj, other; + obj = this; + return other.X <= obj.X + obj.W && other.X + other.W >= obj.X && other.Y <= obj.Y + obj.H && other.Y + other.H >= obj.Y; + }; + Object.prototype.Overlaps = function(other) { return this.$val.Overlaps(other); }; + Object.ptr.prototype.AddToIgnoreList = function(ignoreObj) { + var _key, ignoreObj, obj; + obj = this; + _key = ignoreObj; (obj.ignoreList || $throwRuntimeError("assignment to entry in nil map"))[ptrType$2.keyFor(_key)] = { k: _key, v: true }; + }; + Object.prototype.AddToIgnoreList = function(ignoreObj) { return this.$val.AddToIgnoreList(ignoreObj); }; + Object.ptr.prototype.RemoveFromIgnoreList = function(ignoreObj) { + var ignoreObj, obj; + obj = this; + delete obj.ignoreList[ptrType$2.keyFor(ignoreObj)]; + }; + Object.prototype.RemoveFromIgnoreList = function(ignoreObj) { return this.$val.RemoveFromIgnoreList(ignoreObj); }; + axpyUnitaryTo = function(dst, alpha, x, y) { + var _i, _ref, alpha, dim, dst, i, v, x, y; + dim = y.$length; + _ref = x; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + i = _i; + v = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (i === dim) { + return; + } + ((i < 0 || i >= dst.$length) ? ($throwRuntimeError("index out of range"), undefined) : dst.$array[dst.$offset + i] = alpha * v + ((i < 0 || i >= y.$length) ? ($throwRuntimeError("index out of range"), undefined) : y.$array[y.$offset + i])); + _i++; + } + }; + scalUnitaryTo = function(dst, alpha, x) { + var _i, _ref, alpha, dst, i, x; + _ref = x; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + i = _i; + ((i < 0 || i >= dst.$length) ? ($throwRuntimeError("index out of range"), undefined) : dst.$array[dst.$offset + i] = ((i < 0 || i >= dst.$length) ? ($throwRuntimeError("index out of range"), undefined) : dst.$array[dst.$offset + i]) * (alpha)); + _i++; + } + }; + NewCollision = function() { + return new Collision.ptr(ptrType$2.nil, 0, 0, new sliceType$3([]), sliceType$1.nil); + }; + $pkg.NewCollision = NewCollision; + Collision.ptr.prototype.HasTags = function(tags) { + var _i, _ref, cc, o, tags; + cc = this; + _ref = cc.Objects; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + o = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (o === cc.checkingObject) { + _i++; + continue; + } + if (o.HasTags(tags)) { + return true; + } + _i++; + } + return false; + }; + Collision.prototype.HasTags = function(tags) { return this.$val.HasTags(tags); }; + Collision.ptr.prototype.ObjectsByTags = function(tags) { + var _i, _ref, cc, o, objects, tags; + cc = this; + objects = new sliceType$3([]); + _ref = cc.Objects; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + o = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (o === cc.checkingObject) { + _i++; + continue; + } + if (o.HasTags(tags)) { + objects = $append(objects, o); + } + _i++; + } + return objects; + }; + Collision.prototype.ObjectsByTags = function(tags) { return this.$val.ObjectsByTags(tags); }; + Collision.ptr.prototype.ContactWithObject = function(object) { + var cc, delta, object; + cc = this; + delta = new Vector([0, 0]); + if (cc.dx < 0) { + (0 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 0] = object.X + object.W - cc.checkingObject.X); + } else if (cc.dx > 0) { + (0 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 0] = object.X - cc.checkingObject.W - cc.checkingObject.X); + } + if (cc.dy < 0) { + (1 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 1] = object.Y + object.H - cc.checkingObject.Y); + } else if (cc.dy > 0) { + (1 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 1] = object.Y - cc.checkingObject.H - cc.checkingObject.Y); + } + return delta; + }; + Collision.prototype.ContactWithObject = function(object) { return this.$val.ContactWithObject(object); }; + Collision.ptr.prototype.ContactWithCell = function(cell) { + var cc, cell, cx, cy, delta; + cc = this; + delta = new Vector([0, 0]); + cx = (($imul(cell.X, cc.checkingObject.Space.CellWidth))); + cy = (($imul(cell.Y, cc.checkingObject.Space.CellHeight))); + if (cc.dx < 0) { + (0 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 0] = cx + (cc.checkingObject.Space.CellWidth) - cc.checkingObject.X); + } else if (cc.dx > 0) { + (0 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 0] = cx - cc.checkingObject.W - cc.checkingObject.X); + } + if (cc.dy < 0) { + (1 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 1] = cy + (cc.checkingObject.Space.CellHeight) - cc.checkingObject.Y); + } else if (cc.dy > 0) { + (1 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 1] = cy - cc.checkingObject.H - cc.checkingObject.Y); + } + return delta; + }; + Collision.prototype.ContactWithCell = function(cell) { return this.$val.ContactWithCell(cell); }; + Collision.ptr.prototype.SlideAgainstCell = function(cell, avoidTags) { + var _tuple, _tuple$1, avoidTags, cc, ccX, ccY, cell, collidingCell, diffX, diffY, down, hX, hY, left, oX, oY, right, slide, sp, up, x; + cc = this; + sp = cc.checkingObject.Space; + collidingCell = (x = cc.Cells, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])); + _tuple = sp.SpaceToWorld(collidingCell.X, collidingCell.Y); + ccX = _tuple[0]; + ccY = _tuple[1]; + hX = (sp.CellWidth) / 2; + hY = (sp.CellHeight) / 2; + ccX = ccX + (hX); + ccY = ccY + (hY); + _tuple$1 = cc.checkingObject.Center(); + oX = _tuple$1[0]; + oY = _tuple$1[1]; + diffX = oX - ccX; + diffY = oY - ccY; + left = sp.Cell(collidingCell.X - 1 >> 0, collidingCell.Y); + right = sp.Cell(collidingCell.X + 1 >> 0, collidingCell.Y); + up = sp.Cell(collidingCell.X, collidingCell.Y - 1 >> 0); + down = sp.Cell(collidingCell.X, collidingCell.Y + 1 >> 0); + slide = new Vector([0, 0]); + if (!((cc.dy === 0))) { + if (diffX > 0 && (right === ptrType.nil || !right.ContainsTags(avoidTags))) { + (0 >= slide.$length ? ($throwRuntimeError("index out of range"), undefined) : slide.$array[slide.$offset + 0] = ccX + hX - cc.checkingObject.X); + } else if (diffX < 0 && (left === ptrType.nil || !left.ContainsTags(avoidTags))) { + (0 >= slide.$length ? ($throwRuntimeError("index out of range"), undefined) : slide.$array[slide.$offset + 0] = ccX - hX - (cc.checkingObject.X + cc.checkingObject.W)); + } else { + return Vector.nil; + } + } + if (!((cc.dx === 0))) { + if (diffY > 0 && (down === ptrType.nil || !down.ContainsTags(avoidTags))) { + (1 >= slide.$length ? ($throwRuntimeError("index out of range"), undefined) : slide.$array[slide.$offset + 1] = ccY + hY - cc.checkingObject.Y); + } else if (diffY < 0 && (up === ptrType.nil || !up.ContainsTags(avoidTags))) { + (1 >= slide.$length ? ($throwRuntimeError("index out of range"), undefined) : slide.$array[slide.$offset + 1] = ccY - hY - (cc.checkingObject.Y + cc.checkingObject.H)); + } else { + return Vector.nil; + } + } + return slide; + }; + Collision.prototype.SlideAgainstCell = function(cell, avoidTags) { return this.$val.SlideAgainstCell(cell, avoidTags); }; + newCell = function(x, y) { + var x, y; + return new Cell.ptr(x, y, new sliceType$3([])); + }; + Cell.ptr.prototype.register = function(obj) { + var cell, obj; + cell = this; + if (!cell.Contains(obj)) { + cell.Objects = $append(cell.Objects, obj); + } + }; + Cell.prototype.register = function(obj) { return this.$val.register(obj); }; + Cell.ptr.prototype.unregister = function(obj) { + var _i, _ref, cell, i, o, obj, x, x$1, x$2; + cell = this; + _ref = cell.Objects; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + i = _i; + o = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (o === obj) { + (x$2 = cell.Objects, ((i < 0 || i >= x$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + i] = (x = cell.Objects, x$1 = cell.Objects.$length - 1 >> 0, ((x$1 < 0 || x$1 >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + x$1])))); + cell.Objects = $subslice(cell.Objects, 0, (cell.Objects.$length - 1 >> 0)); + break; + } + _i++; + } + }; + Cell.prototype.unregister = function(obj) { return this.$val.unregister(obj); }; + Cell.ptr.prototype.Contains = function(obj) { + var _i, _ref, cell, o, obj; + cell = this; + _ref = cell.Objects; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + o = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (o === obj) { + return true; + } + _i++; + } + return false; + }; + Cell.prototype.Contains = function(obj) { return this.$val.Contains(obj); }; + Cell.ptr.prototype.ContainsTags = function(tags) { + var _i, _ref, cell, o, tags; + cell = this; + _ref = cell.Objects; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + o = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (o.HasTags(tags)) { + return true; + } + _i++; + } + return false; + }; + Cell.prototype.ContainsTags = function(tags) { return this.$val.ContainsTags(tags); }; + Cell.ptr.prototype.Occupied = function() { + var cell; + cell = this; + return cell.Objects.$length > 0; + }; + Cell.prototype.Occupied = function() { return this.$val.Occupied(); }; + Vector.methods = [{prop: "Clone", name: "Clone", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "Add", name: "Add", pkg: "", typ: $funcType([sliceType$4], [Vector], true)}, {prop: "Sub", name: "Sub", pkg: "", typ: $funcType([sliceType$4], [Vector], true)}, {prop: "Scale", name: "Scale", pkg: "", typ: $funcType([$Float64], [Vector], false)}, {prop: "Equal", name: "Equal", pkg: "", typ: $funcType([Vector], [$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([], [Vector], false)}, {prop: "Dot", name: "Dot", pkg: "", typ: $funcType([Vector], [$Float64], false)}, {prop: "Cross", name: "Cross", pkg: "", typ: $funcType([Vector], [Vector], false)}, {prop: "Rotate", name: "Rotate", pkg: "", typ: $funcType([$Float64, sliceType$7], [Vector], 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)}]; + ptrType$1.methods = [{prop: "Add", name: "Add", pkg: "", typ: $funcType([sliceType$3], [], true)}, {prop: "Remove", name: "Remove", pkg: "", typ: $funcType([sliceType$3], [], true)}, {prop: "Objects", name: "Objects", pkg: "", typ: $funcType([], [sliceType$3], false)}, {prop: "Resize", name: "Resize", pkg: "", typ: $funcType([$Int, $Int], [], false)}, {prop: "Cell", name: "Cell", pkg: "", typ: $funcType([$Int, $Int], [ptrType], false)}, {prop: "CheckCells", name: "CheckCells", pkg: "", typ: $funcType([$Int, $Int, $Int, $Int, sliceType$6], [ptrType$2], true)}, {prop: "CheckCellsWorld", name: "CheckCellsWorld", pkg: "", typ: $funcType([$Float64, $Float64, $Float64, $Float64, sliceType$6], [ptrType$2], 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], [sliceType$1], false)}]; + ptrType$3.methods = [{prop: "Project", name: "Project", pkg: "", typ: $funcType([Vector], [Vector], false)}, {prop: "Normal", name: "Normal", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "Vector", name: "Vector", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "IntersectionPointsLine", name: "IntersectionPointsLine", pkg: "", typ: $funcType([ptrType$3], [Vector], false)}, {prop: "IntersectionPointsCircle", name: "IntersectionPointsCircle", pkg: "", typ: $funcType([ptrType$4], [sliceType$4], false)}]; + ptrType$5.methods = [{prop: "Clone", name: "Clone", pkg: "", typ: $funcType([], [Shape], false)}, {prop: "AddPointsVec", name: "AddPointsVec", pkg: "", typ: $funcType([sliceType$4], [], true)}, {prop: "AddPoints", name: "AddPoints", pkg: "", typ: $funcType([sliceType], [], true)}, {prop: "Lines", name: "Lines", pkg: "", typ: $funcType([], [sliceType$5], false)}, {prop: "Transformed", name: "Transformed", pkg: "", typ: $funcType([], [sliceType$4], false)}, {prop: "Bounds", name: "Bounds", pkg: "", typ: $funcType([], [Vector, Vector], 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([Vector], [], false)}, {prop: "Move", name: "Move", pkg: "", typ: $funcType([$Float64, $Float64], [], false)}, {prop: "MoveVec", name: "MoveVec", pkg: "", typ: $funcType([Vector], [], false)}, {prop: "Center", name: "Center", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "Project", name: "Project", pkg: "", typ: $funcType([Vector], [Projection], false)}, {prop: "SATAxes", name: "SATAxes", pkg: "", typ: $funcType([], [sliceType$4], false)}, {prop: "PointInside", name: "PointInside", pkg: "", typ: $funcType([Vector], [$Bool], false)}, {prop: "Intersection", name: "Intersection", pkg: "", typ: $funcType([$Float64, $Float64, Shape], [ptrType$6], false)}, {prop: "calculateMTV", name: "calculateMTV", pkg: "resolv", typ: $funcType([ptrType$6, Shape], [Vector], false)}, {prop: "ContainedBy", name: "ContainedBy", pkg: "", typ: $funcType([Shape], [$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)}]; + ptrType$6.methods = [{prop: "LeftmostPoint", name: "LeftmostPoint", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "RightmostPoint", name: "RightmostPoint", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "TopmostPoint", name: "TopmostPoint", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "BottommostPoint", name: "BottommostPoint", pkg: "", typ: $funcType([], [Vector], false)}]; + ptrType$4.methods = [{prop: "Clone", name: "Clone", pkg: "", typ: $funcType([], [Shape], false)}, {prop: "Bounds", name: "Bounds", pkg: "", typ: $funcType([], [Vector, Vector], false)}, {prop: "Intersection", name: "Intersection", pkg: "", typ: $funcType([$Float64, $Float64, Shape], [ptrType$6], false)}, {prop: "Move", name: "Move", pkg: "", typ: $funcType([$Float64, $Float64], [], false)}, {prop: "MoveVec", name: "MoveVec", pkg: "", typ: $funcType([Vector], [], false)}, {prop: "SetPosition", name: "SetPosition", pkg: "", typ: $funcType([$Float64, $Float64], [], false)}, {prop: "SetPositionVec", name: "SetPositionVec", pkg: "", typ: $funcType([Vector], [], false)}, {prop: "Position", name: "Position", pkg: "", typ: $funcType([], [$Float64, $Float64], false)}, {prop: "PointInside", name: "PointInside", pkg: "", typ: $funcType([Vector], [$Bool], false)}, {prop: "IntersectionPointsCircle", name: "IntersectionPointsCircle", pkg: "", typ: $funcType([ptrType$4], [sliceType$4], false)}]; + Projection.methods = [{prop: "Overlapping", name: "Overlapping", pkg: "", typ: $funcType([Projection], [$Bool], false)}, {prop: "Overlap", name: "Overlap", pkg: "", typ: $funcType([Projection], [$Float64], false)}, {prop: "IsInside", name: "IsInside", pkg: "", typ: $funcType([Projection], [$Bool], false)}]; + ptrType$2.methods = [{prop: "Clone", name: "Clone", pkg: "", typ: $funcType([], [ptrType$2], false)}, {prop: "Update", name: "Update", pkg: "", typ: $funcType([], [], false)}, {prop: "AddTags", name: "AddTags", pkg: "", typ: $funcType([sliceType$6], [], true)}, {prop: "RemoveTags", name: "RemoveTags", pkg: "", typ: $funcType([sliceType$6], [], true)}, {prop: "HasTags", name: "HasTags", pkg: "", typ: $funcType([sliceType$6], [$Bool], true)}, {prop: "Tags", name: "Tags", pkg: "", typ: $funcType([], [sliceType$6], false)}, {prop: "SetShape", name: "SetShape", pkg: "", typ: $funcType([Shape], [], false)}, {prop: "BoundsToSpace", name: "BoundsToSpace", pkg: "", typ: $funcType([$Float64, $Float64], [$Int, $Int, $Int, $Int], false)}, {prop: "SharesCells", name: "SharesCells", pkg: "", typ: $funcType([ptrType$2], [$Bool], false)}, {prop: "SharesCellsTags", name: "SharesCellsTags", pkg: "", typ: $funcType([sliceType$6], [$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([Vector, Vector], [], false)}, {prop: "Check", name: "Check", pkg: "", typ: $funcType([$Float64, $Float64, sliceType$6], [ptrType$7], true)}, {prop: "Overlaps", name: "Overlaps", pkg: "", typ: $funcType([ptrType$2], [$Bool], false)}, {prop: "AddToIgnoreList", name: "AddToIgnoreList", pkg: "", typ: $funcType([ptrType$2], [], false)}, {prop: "RemoveFromIgnoreList", name: "RemoveFromIgnoreList", pkg: "", typ: $funcType([ptrType$2], [], false)}]; + ptrType$7.methods = [{prop: "HasTags", name: "HasTags", pkg: "", typ: $funcType([sliceType$6], [$Bool], true)}, {prop: "ObjectsByTags", name: "ObjectsByTags", pkg: "", typ: $funcType([sliceType$6], [sliceType$3], true)}, {prop: "ContactWithObject", name: "ContactWithObject", pkg: "", typ: $funcType([ptrType$2], [Vector], false)}, {prop: "ContactWithCell", name: "ContactWithCell", pkg: "", typ: $funcType([ptrType], [Vector], false)}, {prop: "SlideAgainstCell", name: "SlideAgainstCell", pkg: "", typ: $funcType([ptrType, sliceType$6], [Vector], true)}]; + ptrType.methods = [{prop: "register", name: "register", pkg: "resolv", typ: $funcType([ptrType$2], [], false)}, {prop: "unregister", name: "unregister", pkg: "resolv", typ: $funcType([ptrType$2], [], false)}, {prop: "Contains", name: "Contains", pkg: "", typ: $funcType([ptrType$2], [$Bool], false)}, {prop: "ContainsTags", name: "ContainsTags", pkg: "", typ: $funcType([sliceType$6], [$Bool], true)}, {prop: "Occupied", name: "Occupied", pkg: "", typ: $funcType([], [$Bool], false)}]; + Vector.init($Float64); + Space.init("", [{prop: "Cells", name: "Cells", embedded: false, exported: true, typ: sliceType$2, tag: ""}, {prop: "CellWidth", name: "CellWidth", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "CellHeight", name: "CellHeight", embedded: false, exported: true, typ: $Int, tag: ""}]); + Shape.init([{prop: "Bounds", name: "Bounds", pkg: "", typ: $funcType([], [Vector, Vector], false)}, {prop: "Clone", name: "Clone", pkg: "", typ: $funcType([], [Shape], false)}, {prop: "Intersection", name: "Intersection", pkg: "", typ: $funcType([$Float64, $Float64, Shape], [ptrType$6], false)}, {prop: "Position", name: "Position", pkg: "", typ: $funcType([], [$Float64, $Float64], false)}, {prop: "SetPosition", name: "SetPosition", pkg: "", typ: $funcType([$Float64, $Float64], [], false)}]); + Line.init("", [{prop: "Start", name: "Start", embedded: false, exported: true, typ: Vector, tag: ""}, {prop: "End", name: "End", embedded: false, exported: true, typ: Vector, tag: ""}]); + ConvexPolygon.init("", [{prop: "Points", name: "Points", embedded: false, exported: true, typ: sliceType$4, 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: ""}]); + ContactSet.init("", [{prop: "Points", name: "Points", embedded: false, exported: true, typ: sliceType$4, tag: ""}, {prop: "MTV", name: "MTV", embedded: false, exported: true, typ: Vector, tag: ""}, {prop: "Center", name: "Center", embedded: false, exported: true, typ: Vector, tag: ""}]); + Circle.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: ""}]); + Projection.init("", [{prop: "Min", name: "Min", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "Max", name: "Max", embedded: false, exported: true, typ: $Float64, tag: ""}]); + Object.init("resolv", [{prop: "Shape", name: "Shape", embedded: false, exported: true, typ: Shape, tag: ""}, {prop: "Space", name: "Space", embedded: false, exported: true, typ: ptrType$1, 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: sliceType$1, tag: ""}, {prop: "Data", name: "Data", embedded: false, exported: true, typ: $emptyInterface, tag: ""}, {prop: "ignoreList", name: "ignoreList", embedded: false, exported: false, typ: mapType, tag: ""}, {prop: "tags", name: "tags", embedded: false, exported: false, typ: sliceType$6, tag: ""}]); + Collision.init("resolv", [{prop: "checkingObject", name: "checkingObject", embedded: false, exported: false, typ: ptrType$2, 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: sliceType$3, tag: ""}, {prop: "Cells", name: "Cells", embedded: false, exported: true, typ: sliceType$1, tag: ""}]); + Cell.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: sliceType$3, 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 = math.$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, math, resolv, Vec2D, Polygon2D, PlayerDownsync, InputFrameDecoded, Barrier, Bullet, MeleeBullet, FireballBullet, Skill, RoomDownsyncFrame, InputFrameDownsync, RingBuffer, CharacterConfig, SatResult, sliceType, sliceType$1, sliceType$2, ptrType, sliceType$3, sliceType$4, ptrType$1, ptrType$2, ptrType$3, ptrType$4, ptrType$5, ptrType$6, sliceType$5, ptrType$7, sliceType$6, sliceType$7, sliceType$8, sliceType$9, ptrType$8, sliceType$10, ptrType$9, sliceType$11, sliceType$12, ptrType$10, sliceType$13, ptrType$11, mapType, ptrType$12, skills, inAirSet, noOpSet, invinsibleSet, nonAttackingSet, NewRingBuffer, ConvertToInputFrameId, decodeInput, CalcPushbacks, isPolygonPairOverlapped, isPolygonPairSeparatedByDir, WorldToVirtualGridPos, VirtualGridToWorldPos, WorldToPolygonColliderBLPos, PolygonColliderBLToWorldPos, PolygonColliderBLToVirtualGridPos, VirtualGridToPolygonColliderBLPos, calcHardPushbacksNorms, deriveOpPattern, ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame, GenerateRectCollider, generateRectColliderInCollisionSpace, GenerateConvexPolygonCollider, AlignPolygon2DToBoundingBox; + math = $packages["math"]; + resolv = $packages["resolv"]; + Vec2D = $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_; + }); + Polygon2D = $pkg.Polygon2D = $newType(0, $kindStruct, "battle.Polygon2D", true, "jsexport/battle", true, function(Anchor_, Points_) { + this.$val = this; + if (arguments.length === 0) { + this.Anchor = ptrType$10.nil; + this.Points = sliceType$13.nil; + return; + } + this.Anchor = Anchor_; + this.Points = Points_; + }); + PlayerDownsync = $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_) { + 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; + 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_; + }); + InputFrameDecoded = $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_; + }); + Barrier = $pkg.Barrier = $newType(0, $kindStruct, "battle.Barrier", true, "jsexport/battle", true, function(Boundary_) { + this.$val = this; + if (arguments.length === 0) { + this.Boundary = ptrType$11.nil; + return; + } + this.Boundary = Boundary_; + }); + Bullet = $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_) { + 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; + 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_; + }); + MeleeBullet = $pkg.MeleeBullet = $newType(0, $kindStruct, "battle.MeleeBullet", true, "jsexport/battle", true, function(Bullet_) { + this.$val = this; + if (arguments.length === 0) { + this.Bullet = new Bullet.ptr(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, false); + return; + } + this.Bullet = Bullet_; + }); + FireballBullet = $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 Bullet.ptr(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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_; + }); + Skill = $pkg.Skill = $newType(0, $kindStruct, "battle.Skill", true, "jsexport/battle", true, function(BattleLocalId_, RecoveryFrames_, RecoveryFramesOnBlock_, RecoveryFramesOnHit_, ReleaseTriggerType_, Hits_) { + this.$val = this; + if (arguments.length === 0) { + this.BattleLocalId = 0; + this.RecoveryFrames = 0; + this.RecoveryFramesOnBlock = 0; + this.RecoveryFramesOnHit = 0; + this.ReleaseTriggerType = 0; + this.Hits = sliceType.nil; + return; + } + this.BattleLocalId = BattleLocalId_; + this.RecoveryFrames = RecoveryFrames_; + this.RecoveryFramesOnBlock = RecoveryFramesOnBlock_; + this.RecoveryFramesOnHit = RecoveryFramesOnHit_; + this.ReleaseTriggerType = ReleaseTriggerType_; + this.Hits = Hits_; + }); + RoomDownsyncFrame = $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 = sliceType$6.nil; + this.CountdownNanos = new $Int64(0, 0); + this.MeleeBullets = sliceType$7.nil; + this.FireballBullets = sliceType$11.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_; + }); + InputFrameDownsync = $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 = sliceType$5.nil; + this.ConfirmedList = new $Uint64(0, 0); + return; + } + this.InputFrameId = InputFrameId_; + this.InputList = InputList_; + this.ConfirmedList = ConfirmedList_; + }); + RingBuffer = $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 = sliceType.nil; + return; + } + this.Ed = Ed_; + this.St = St_; + this.EdFrameId = EdFrameId_; + this.StFrameId = StFrameId_; + this.N = N_; + this.Cnt = Cnt_; + this.Eles = Eles_; + }); + CharacterConfig = $pkg.CharacterConfig = $newType(0, $kindStruct, "battle.CharacterConfig", true, "jsexport/battle", true, function(SpeciesId_, SpeciesName_, InAirIdleFrameIdxTurningPoint_, InAirIdleFrameIdxTurnedCycle_, LayDownFrames_, LayDownFramesToRecover_, GetUpFrames_, GetUpFramesToRecover_, JumpingInitVelY_, PatternIdToSkillId_) { + 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.GetUpFrames = 0; + this.GetUpFramesToRecover = 0; + this.JumpingInitVelY = 0; + this.PatternIdToSkillId = false; + return; + } + this.SpeciesId = SpeciesId_; + this.SpeciesName = SpeciesName_; + this.InAirIdleFrameIdxTurningPoint = InAirIdleFrameIdxTurningPoint_; + this.InAirIdleFrameIdxTurnedCycle = InAirIdleFrameIdxTurnedCycle_; + this.LayDownFrames = LayDownFrames_; + this.LayDownFramesToRecover = LayDownFramesToRecover_; + this.GetUpFrames = GetUpFrames_; + this.GetUpFramesToRecover = GetUpFramesToRecover_; + this.JumpingInitVelY = JumpingInitVelY_; + this.PatternIdToSkillId = PatternIdToSkillId_; + }); + SatResult = $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 = resolv.Vector.nil; + return; + } + this.Overlap = Overlap_; + this.OverlapX = OverlapX_; + this.OverlapY = OverlapY_; + this.AContainedInB = AContainedInB_; + this.BContainedInA = BContainedInA_; + this.Axis = Axis_; + }); + sliceType = $sliceType($emptyInterface); + sliceType$1 = $sliceType($Int32); + sliceType$2 = $sliceType(sliceType$1); + ptrType = $ptrType(SatResult); + sliceType$3 = $sliceType(Vec2D); + sliceType$4 = $sliceType($String); + ptrType$1 = $ptrType(resolv.Collision); + ptrType$2 = $ptrType(sliceType$3); + ptrType$3 = $ptrType(PlayerDownsync); + ptrType$4 = $ptrType(MeleeBullet); + ptrType$5 = $ptrType(resolv.ConvexPolygon); + ptrType$6 = $ptrType(InputFrameDownsync); + sliceType$5 = $sliceType($Uint64); + ptrType$7 = $ptrType(Skill); + sliceType$6 = $sliceType(ptrType$3); + sliceType$7 = $sliceType(ptrType$4); + sliceType$8 = $sliceType(ptrType$2); + sliceType$9 = $sliceType($Bool); + ptrType$8 = $ptrType(resolv.Object); + sliceType$10 = $sliceType(ptrType$8); + ptrType$9 = $ptrType(FireballBullet); + sliceType$11 = $sliceType(ptrType$9); + sliceType$12 = $sliceType($Float64); + ptrType$10 = $ptrType(Vec2D); + sliceType$13 = $sliceType(ptrType$10); + ptrType$11 = $ptrType(Polygon2D); + mapType = $mapType($Int, $Int); + ptrType$12 = $ptrType(RingBuffer); + NewRingBuffer = function(n) { + var n; + return new RingBuffer.ptr(0, 0, 0, 0, n, 0, $makeSlice(sliceType, n)); + }; + $pkg.NewRingBuffer = NewRingBuffer; + RingBuffer.ptr.prototype.Put = function(pItem) { + var pItem, rb, x, x$1; + rb = this; + while (true) { + if (!(0 < rb.Cnt && rb.Cnt >= rb.N)) { break; } + rb.Pop(); + } + (x = rb.Eles, x$1 = rb.Ed, ((x$1 < 0 || x$1 >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + x$1] = pItem)); + rb.EdFrameId = rb.EdFrameId + (1) >> 0; + rb.Cnt = rb.Cnt + (1) >> 0; + rb.Ed = rb.Ed + (1) >> 0; + if (rb.Ed >= rb.N) { + rb.Ed = rb.Ed - (rb.N) >> 0; + } + }; + RingBuffer.prototype.Put = function(pItem) { return this.$val.Put(pItem); }; + RingBuffer.ptr.prototype.Pop = function() { + var pItem, rb, x, x$1; + rb = this; + if (0 === rb.Cnt) { + return $ifaceNil; + } + pItem = (x = rb.Eles, x$1 = rb.St, ((x$1 < 0 || x$1 >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + x$1])); + rb.StFrameId = rb.StFrameId + (1) >> 0; + rb.Cnt = rb.Cnt - (1) >> 0; + rb.St = rb.St + (1) >> 0; + if (rb.St >= rb.N) { + rb.St = rb.St - (rb.N) >> 0; + } + return pItem; + }; + RingBuffer.prototype.Pop = function() { return this.$val.Pop(); }; + RingBuffer.ptr.prototype.GetArrIdxByOffset = function(offsetFromSt) { + var arrIdx, offsetFromSt, rb; + rb = this; + if ((0 === rb.Cnt) || 0 > offsetFromSt) { + return -1; + } + arrIdx = rb.St + offsetFromSt >> 0; + if (rb.St < rb.Ed) { + if (rb.St <= arrIdx && arrIdx < rb.Ed) { + return arrIdx; + } + } else { + if (arrIdx >= rb.N) { + arrIdx = arrIdx - (rb.N) >> 0; + } + if (arrIdx >= rb.St || arrIdx < rb.Ed) { + return arrIdx; + } + } + return -1; + }; + RingBuffer.prototype.GetArrIdxByOffset = function(offsetFromSt) { return this.$val.GetArrIdxByOffset(offsetFromSt); }; + RingBuffer.ptr.prototype.GetByOffset = function(offsetFromSt) { + var arrIdx, offsetFromSt, rb, x; + rb = this; + arrIdx = rb.GetArrIdxByOffset(offsetFromSt); + if (-1 === arrIdx) { + return $ifaceNil; + } + return (x = rb.Eles, ((arrIdx < 0 || arrIdx >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + arrIdx])); + }; + RingBuffer.prototype.GetByOffset = function(offsetFromSt) { return this.$val.GetByOffset(offsetFromSt); }; + RingBuffer.ptr.prototype.GetByFrameId = function(frameId) { + var frameId, rb; + rb = this; + if (frameId >= rb.EdFrameId || frameId < rb.StFrameId) { + return $ifaceNil; + } + return rb.GetByOffset(frameId - rb.StFrameId >> 0); + }; + RingBuffer.prototype.GetByFrameId = function(frameId) { return this.$val.GetByFrameId(frameId); }; + RingBuffer.ptr.prototype.SetByFrameId = function(pItem, frameId) { + var _tmp, _tmp$1, _tmp$2, _tmp$3, _tmp$4, _tmp$5, arrIdx, frameId, oldEdFrameId, oldStFrameId, pItem, rb, ret, x; + rb = this; + _tmp = rb.StFrameId; + _tmp$1 = rb.EdFrameId; + oldStFrameId = _tmp; + oldEdFrameId = _tmp$1; + if (frameId < oldStFrameId) { + return [2, oldStFrameId, oldEdFrameId]; + } + if (oldEdFrameId > frameId) { + arrIdx = rb.GetArrIdxByOffset(frameId - rb.StFrameId >> 0); + if (!((-1 === arrIdx))) { + (x = rb.Eles, ((arrIdx < 0 || arrIdx >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + arrIdx] = pItem)); + return [0, oldStFrameId, oldEdFrameId]; + } + } + ret = 0; + if (oldEdFrameId < frameId) { + _tmp$2 = 0; + _tmp$3 = 0; + rb.St = _tmp$2; + rb.Ed = _tmp$3; + _tmp$4 = frameId; + _tmp$5 = frameId; + rb.StFrameId = _tmp$4; + rb.EdFrameId = _tmp$5; + rb.Cnt = 0; + ret = 1; + } + rb.Put(pItem); + return [ret, oldStFrameId, oldEdFrameId]; + }; + RingBuffer.prototype.SetByFrameId = function(pItem, frameId) { return this.$val.SetByFrameId(pItem, frameId); }; + ConvertToInputFrameId = function(renderFrameId, inputDelayFrames, inputScaleFrames) { + var inputDelayFrames, inputScaleFrames, renderFrameId; + if (renderFrameId < inputDelayFrames) { + return 0; + } + return ((((renderFrameId - inputDelayFrames >> 0)) >> $min(inputScaleFrames, 31)) >> 0); + }; + $pkg.ConvertToInputFrameId = ConvertToInputFrameId; + decodeInput = function(encodedInput) { + var btnALevel, btnBLevel, encodedDirection, encodedInput, x, x$1, x$2, x$3; + encodedDirection = new $Uint64(encodedInput.$high & 0, (encodedInput.$low & 15) >>> 0); + btnALevel = (((x = $shiftRightUint64(encodedInput, 4), new $Uint64(x.$high & 0, (x.$low & 1) >>> 0)).$low >> 0)); + btnBLevel = (((x$1 = $shiftRightUint64(encodedInput, 5), new $Uint64(x$1.$high & 0, (x$1.$low & 1) >>> 0)).$low >> 0)); + return new InputFrameDecoded.ptr((x$2 = (($flatten64(encodedDirection) < 0 || $flatten64(encodedDirection) >= $pkg.DIRECTION_DECODER.$length) ? ($throwRuntimeError("index out of range"), undefined) : $pkg.DIRECTION_DECODER.$array[$pkg.DIRECTION_DECODER.$offset + $flatten64(encodedDirection)]), (0 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 0])), (x$3 = (($flatten64(encodedDirection) < 0 || $flatten64(encodedDirection) >= $pkg.DIRECTION_DECODER.$length) ? ($throwRuntimeError("index out of range"), undefined) : $pkg.DIRECTION_DECODER.$array[$pkg.DIRECTION_DECODER.$offset + $flatten64(encodedDirection)]), (1 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 1])), btnALevel, btnBLevel); + }; + CalcPushbacks = function(oldDx, oldDy, playerShape, barrierShape) { + var {$24r, $24r$1, _tmp, _tmp$1, _tuple, barrierShape, oldDx, oldDy, origX, origY, overlapResult, overlapped, playerShape, pushbackX, pushbackY, $s, $deferred, $r, $c} = $restore(this, {oldDx, oldDy, playerShape, barrierShape}); + /* */ $s = $s || 0; var $err = null; try { s: while (true) { switch ($s) { case 0: $deferred = []; $curGoroutine.deferStack.push($deferred); + origX = [origX]; + origY = [origY]; + playerShape = [playerShape]; + _tuple = playerShape[0].Position(); + origX[0] = _tuple[0]; + origY[0] = _tuple[1]; + $deferred.push([(function(origX, origY, playerShape) { return function() { + playerShape[0].SetPosition(origX[0], origY[0]); + }; })(origX, origY, playerShape), []]); + playerShape[0].SetPosition(origX[0] + oldDx, origY[0] + oldDy); + overlapResult = new SatResult.ptr(0, 0, 0, true, true, new resolv.Vector([0, 0])); + overlapped = isPolygonPairOverlapped(playerShape[0], barrierShape, overlapResult); + /* */ if (overlapped) { $s = 1; continue; } + /* */ $s = 2; continue; + /* if (overlapped) { */ case 1: + _tmp = overlapResult.Overlap * overlapResult.OverlapX; + _tmp$1 = overlapResult.Overlap * overlapResult.OverlapY; + pushbackX = _tmp; + pushbackY = _tmp$1; + $24r = [true, pushbackX, pushbackY, overlapResult]; + $s = 4; case 4: return $24r; + /* } else { */ case 2: + $24r$1 = [false, 0, 0, overlapResult]; + $s = 5; case 5: return $24r$1; + /* } */ case 3: + $s = -1; return [false, 0, 0, ptrType.nil]; + /* */ } return; } } catch(err) { $err = err; $s = -1; return [false, 0, 0, ptrType.nil]; } finally { $callDeferred($deferred, $err); if($curGoroutine.asleep) { var $f = {$blk: CalcPushbacks, $c: true, $r, $24r, $24r$1, _tmp, _tmp$1, _tuple, barrierShape, oldDx, oldDy, origX, origY, overlapResult, overlapped, playerShape, pushbackX, pushbackY, $s, $deferred};return $f; } } + }; + $pkg.CalcPushbacks = CalcPushbacks; + isPolygonPairOverlapped = function(a, b, result) { + var _i, _i$1, _ref, _ref$1, _tmp, _tmp$1, a, aCnt, axis, axis$1, b, bCnt, result, x, x$1, x$2, x$3, x$4, x$5, x$6, x$7; + _tmp = a.Points.$length; + _tmp$1 = b.Points.$length; + aCnt = _tmp; + bCnt = _tmp$1; + if ((1 === aCnt) && (1 === bCnt)) { + if (!(ptrType.nil === result)) { + result.Overlap = 0; + } + return ((x = (x$1 = a.Points, (0 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 0])), (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])) === (x$2 = (x$3 = b.Points, (0 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 0])), (0 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 0]))) && ((x$4 = (x$5 = a.Points, (0 >= x$5.$length ? ($throwRuntimeError("index out of range"), undefined) : x$5.$array[x$5.$offset + 0])), (1 >= x$4.$length ? ($throwRuntimeError("index out of range"), undefined) : x$4.$array[x$4.$offset + 1])) === (x$6 = (x$7 = b.Points, (0 >= x$7.$length ? ($throwRuntimeError("index out of range"), undefined) : x$7.$array[x$7.$offset + 0])), (1 >= x$6.$length ? ($throwRuntimeError("index out of range"), undefined) : x$6.$array[x$6.$offset + 1]))); + } + if (1 < aCnt) { + _ref = a.SATAxes(); + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + axis = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (isPolygonPairSeparatedByDir(a, b, axis.Unit(), result)) { + return false; + } + _i++; + } + } + if (1 < bCnt) { + _ref$1 = b.SATAxes(); + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$1.$length)) { break; } + axis$1 = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); + if (isPolygonPairSeparatedByDir(a, b, axis$1.Unit(), result)) { + return false; + } + _i$1++; + } + } + return true; + }; + isPolygonPairSeparatedByDir = function(a, b, e, result) { + var _i, _i$1, _ref, _ref$1, _tmp, _tmp$1, _tmp$2, _tmp$3, a, aEnd, aStart, absoluteOverlap, b, bEnd, bStart, currentOverlap, dot, dot$1, e, option1, option1$1, option2, option2$1, overlap, p, p$1, result, sign, x, x$1; + _tmp = 1.7e+308; + _tmp$1 = -1.7e+308; + _tmp$2 = 1.7e+308; + _tmp$3 = -1.7e+308; + aStart = _tmp; + aEnd = _tmp$1; + bStart = _tmp$2; + bEnd = _tmp$3; + _ref = a.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + p = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + dot = ((0 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 0]) + a.X) * (0 >= e.$length ? ($throwRuntimeError("index out of range"), undefined) : e.$array[e.$offset + 0]) + ((1 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 1]) + a.Y) * (1 >= e.$length ? ($throwRuntimeError("index out of range"), undefined) : e.$array[e.$offset + 1]); + if (aStart > dot) { + aStart = dot; + } + if (aEnd < dot) { + aEnd = dot; + } + _i++; + } + _ref$1 = b.Points; + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$1.$length)) { break; } + p$1 = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); + dot$1 = ((0 >= p$1.$length ? ($throwRuntimeError("index out of range"), undefined) : p$1.$array[p$1.$offset + 0]) + b.X) * (0 >= e.$length ? ($throwRuntimeError("index out of range"), undefined) : e.$array[e.$offset + 0]) + ((1 >= p$1.$length ? ($throwRuntimeError("index out of range"), undefined) : p$1.$array[p$1.$offset + 1]) + b.Y) * (1 >= e.$length ? ($throwRuntimeError("index out of range"), undefined) : e.$array[e.$offset + 1]); + if (bStart > dot$1) { + bStart = dot$1; + } + if (bEnd < dot$1) { + bEnd = dot$1; + } + _i$1++; + } + if (aStart > bEnd || aEnd < bStart) { + return true; + } + if (!(ptrType.nil === result)) { + overlap = 0; + if (aStart < bStart) { + result.AContainedInB = false; + if (aEnd < bEnd) { + overlap = aEnd - bStart; + result.BContainedInA = false; + } else { + option1 = aEnd - bStart; + option2 = bEnd - aStart; + if (option1 < option2) { + overlap = option1; + } else { + overlap = -option2; + } + } + } else { + result.BContainedInA = false; + if (aEnd > bEnd) { + overlap = aStart - bEnd; + result.AContainedInB = false; + } else { + option1$1 = aEnd - bStart; + option2$1 = bEnd - aStart; + if (option1$1 < option2$1) { + overlap = option1$1; + } else { + overlap = -option2$1; + } + } + } + currentOverlap = result.Overlap; + absoluteOverlap = overlap; + if (overlap < 0) { + absoluteOverlap = -overlap; + } + if (((0 === (x = result.Axis, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0]))) && (0 === (x$1 = result.Axis, (1 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 1])))) || currentOverlap > absoluteOverlap) { + sign = 1; + if (overlap < 0) { + sign = -1; + } + result.Overlap = absoluteOverlap; + result.OverlapX = (0 >= e.$length ? ($throwRuntimeError("index out of range"), undefined) : e.$array[e.$offset + 0]) * sign; + result.OverlapY = (1 >= e.$length ? ($throwRuntimeError("index out of range"), undefined) : e.$array[e.$offset + 1]) * sign; + } + result.Axis = e; + } + return false; + }; + WorldToVirtualGridPos = function(wx, wy) { + var virtualGridX, virtualGridY, wx, wy; + virtualGridX = ((math.Floor(wx * 100) >> 0)); + virtualGridY = ((math.Floor(wy * 100) >> 0)); + return [virtualGridX, virtualGridY]; + }; + $pkg.WorldToVirtualGridPos = WorldToVirtualGridPos; + VirtualGridToWorldPos = function(vx, vy) { + var vx, vy, wx, wy; + wx = (vx) * 0.01; + wy = (vy) * 0.01; + return [wx, wy]; + }; + $pkg.VirtualGridToWorldPos = VirtualGridToWorldPos; + WorldToPolygonColliderBLPos = function(wx, wy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY) { + var bottomPadding, collisionSpaceOffsetX, collisionSpaceOffsetY, halfBoundingH, halfBoundingW, leftPadding, rightPadding, topPadding, wx, wy; + return [wx - halfBoundingW - leftPadding + collisionSpaceOffsetX, wy - halfBoundingH - bottomPadding + collisionSpaceOffsetY]; + }; + $pkg.WorldToPolygonColliderBLPos = WorldToPolygonColliderBLPos; + PolygonColliderBLToWorldPos = function(cx, cy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY) { + var bottomPadding, collisionSpaceOffsetX, collisionSpaceOffsetY, cx, cy, halfBoundingH, halfBoundingW, leftPadding, rightPadding, topPadding; + return [cx + halfBoundingW + leftPadding - collisionSpaceOffsetX, cy + halfBoundingH + bottomPadding - collisionSpaceOffsetY]; + }; + $pkg.PolygonColliderBLToWorldPos = PolygonColliderBLToWorldPos; + PolygonColliderBLToVirtualGridPos = function(cx, cy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY) { + var _tuple, bottomPadding, collisionSpaceOffsetX, collisionSpaceOffsetY, cx, cy, halfBoundingH, halfBoundingW, leftPadding, rightPadding, topPadding, wx, wy; + _tuple = PolygonColliderBLToWorldPos(cx, cy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY); + wx = _tuple[0]; + wy = _tuple[1]; + return WorldToVirtualGridPos(wx, wy); + }; + $pkg.PolygonColliderBLToVirtualGridPos = PolygonColliderBLToVirtualGridPos; + VirtualGridToPolygonColliderBLPos = function(vx, vy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY) { + var _tuple, bottomPadding, collisionSpaceOffsetX, collisionSpaceOffsetY, halfBoundingH, halfBoundingW, leftPadding, rightPadding, topPadding, vx, vy, wx, wy; + _tuple = VirtualGridToWorldPos(vx, vy); + wx = _tuple[0]; + wy = _tuple[1]; + return WorldToPolygonColliderBLPos(wx, wy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY); + }; + $pkg.VirtualGridToPolygonColliderBLPos = VirtualGridToPolygonColliderBLPos; + calcHardPushbacksNorms = function(joinIndex, playerCollider, playerShape, snapIntoPlatformOverlap, pEffPushback) { + var {_i, _r, _ref, _ref$1, _tmp, _tmp$1, _tuple, barrierShape, collision, isBarrier, joinIndex, obj, overlapResult, overlapped, pEffPushback, playerCollider, playerShape, pushbackX, pushbackY, ret, snapIntoPlatformOverlap, $s, $r, $c} = $restore(this, {joinIndex, playerCollider, playerShape, snapIntoPlatformOverlap, pEffPushback}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + ret = [ret]; + ret[0] = $makeSlice(sliceType$3, 0, 10); + collision = playerCollider.Check(0, 0, new sliceType$4([])); + if (ptrType$1.nil === collision) { + $s = -1; return (ret.$ptr || (ret.$ptr = new ptrType$2(function() { return this.$target[0]; }, function($v) { this.$target[0] = $v; }, ret))); + } + _ref = collision.Objects; + _i = 0; + /* while (true) { */ case 1: + /* if (!(_i < _ref.$length)) { break; } */ if(!(_i < _ref.$length)) { $s = 2; continue; } + obj = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + isBarrier = false; + _ref$1 = obj.Data; + if ($assertType(_ref$1, ptrType$3, true)[1]) { + } else if ($assertType(_ref$1, ptrType$4, true)[1]) { + } else { + isBarrier = true; + } + if (!isBarrier) { + _i++; + /* continue; */ $s = 1; continue; + } + barrierShape = $assertType(obj.Shape, ptrType$5); + _r = CalcPushbacks(0, 0, playerShape, barrierShape); /* */ $s = 3; case 3: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + _tuple = _r; + overlapped = _tuple[0]; + pushbackX = _tuple[1]; + pushbackY = _tuple[2]; + overlapResult = _tuple[3]; + if (!overlapped) { + _i++; + /* continue; */ $s = 1; continue; + } + _tmp = (overlapResult.Overlap - snapIntoPlatformOverlap) * overlapResult.OverlapX; + _tmp$1 = (overlapResult.Overlap - snapIntoPlatformOverlap) * overlapResult.OverlapY; + pushbackX = _tmp; + pushbackY = _tmp$1; + ret[0] = $append(ret[0], new Vec2D.ptr(overlapResult.OverlapX, overlapResult.OverlapY)); + pEffPushback.X = pEffPushback.X + (pushbackX); + pEffPushback.Y = pEffPushback.Y + (pushbackY); + _i++; + $s = 1; continue; + case 2: + $s = -1; return (ret.$ptr || (ret.$ptr = new ptrType$2(function() { return this.$target[0]; }, function($v) { this.$target[0] = $v; }, ret))); + /* */ } return; } var $f = {$blk: calcHardPushbacksNorms, $c: true, $r, _i, _r, _ref, _ref$1, _tmp, _tmp$1, _tuple, barrierShape, collision, isBarrier, joinIndex, obj, overlapResult, overlapped, pEffPushback, playerCollider, playerShape, pushbackX, pushbackY, ret, snapIntoPlatformOverlap, $s};return $f; + }; + deriveOpPattern = function(currPlayerDownsync, thatPlayerInNextFrame, currRenderFrame, inputsBuffer, inputDelayFrames, inputScaleFrames) { + var _entry, _entry$1, _entry$2, _ref, _tmp, _tmp$1, _tmp$2, _tmp$3, _tmp$4, _tmp$5, _tuple, _tuple$1, currPlayerDownsync, currRenderFrame, decodedInput, delayedInputFrameId, delayedInputFrameIdForPrevRdf, delayedInputList, delayedInputListForPrevRdf, effDx, effDy, existent, existent$1, inputDelayFrames, inputScaleFrames, inputsBuffer, joinIndex, jumpedOrNot, patternId, prevBtnALevel, prevBtnBLevel, prevDecodedInput, skillConfig, thatPlayerInNextFrame, v, x, x$1, x$2, x$3; + delayedInputFrameId = ConvertToInputFrameId(currRenderFrame.Id, inputDelayFrames, inputScaleFrames); + delayedInputFrameIdForPrevRdf = ConvertToInputFrameId(currRenderFrame.Id - 1 >> 0, inputDelayFrames, inputScaleFrames); + if (0 >= delayedInputFrameId) { + return [-2, false, 0, 0]; + } + _tuple = (_entry = noOpSet[$Int32.keyFor(currPlayerDownsync.CharacterState)], _entry !== undefined ? [_entry.v, true] : [false, false]); + existent = _tuple[1]; + if (existent) { + return [-2, false, 0, 0]; + } + delayedInputList = $assertType(inputsBuffer.GetByFrameId(delayedInputFrameId), ptrType$6).InputList; + delayedInputListForPrevRdf = sliceType$5.nil; + if (0 < delayedInputFrameIdForPrevRdf) { + delayedInputListForPrevRdf = $assertType(inputsBuffer.GetByFrameId(delayedInputFrameIdForPrevRdf), ptrType$6).InputList; + } + jumpedOrNot = false; + joinIndex = currPlayerDownsync.JoinIndex; + decodedInput = decodeInput((x = joinIndex - 1 >> 0, ((x < 0 || x >= delayedInputList.$length) ? ($throwRuntimeError("index out of range"), undefined) : delayedInputList.$array[delayedInputList.$offset + x]))); + _tmp = 0; + _tmp$1 = 0; + effDx = _tmp; + effDy = _tmp$1; + _tmp$2 = 0; + _tmp$3 = 0; + prevBtnALevel = _tmp$2; + prevBtnBLevel = _tmp$3; + if (!(sliceType$5.nil === delayedInputListForPrevRdf)) { + prevDecodedInput = decodeInput((x$1 = joinIndex - 1 >> 0, ((x$1 < 0 || x$1 >= delayedInputListForPrevRdf.$length) ? ($throwRuntimeError("index out of range"), undefined) : delayedInputListForPrevRdf.$array[delayedInputListForPrevRdf.$offset + x$1]))); + prevBtnALevel = prevDecodedInput.BtnALevel; + prevBtnBLevel = prevDecodedInput.BtnBLevel; + } + if (0 === currPlayerDownsync.FramesToRecover) { + _tmp$4 = decodedInput.Dx; + _tmp$5 = decodedInput.Dy; + effDx = _tmp$4; + effDy = _tmp$5; + if (decodedInput.BtnBLevel > prevBtnBLevel) { + _tuple$1 = (_entry$1 = inAirSet[$Int32.keyFor(currPlayerDownsync.CharacterState)], _entry$1 !== undefined ? [_entry$1.v, true] : [false, false]); + existent$1 = _tuple$1[1]; + if (!existent$1) { + jumpedOrNot = true; + } + } + } + patternId = -1; + if (decodedInput.BtnALevel > prevBtnALevel) { + if (currPlayerDownsync.InAir) { + patternId = 255; + } else { + patternId = 1; + } + } + if (!((-1 === patternId)) && 0 < currPlayerDownsync.FramesToRecover) { + patternId = -1; + skillConfig = (_entry$2 = skills[$Int.keyFor(((currPlayerDownsync.ActiveSkillId >> 0)))], _entry$2 !== undefined ? _entry$2.v : ptrType$7.nil); + _ref = (x$2 = skillConfig.Hits, x$3 = currPlayerDownsync.ActiveSkillHit, ((x$3 < 0 || x$3 >= x$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + x$3])); + if ($assertType(_ref, ptrType$4, true)[1]) { + v = _ref.$val; + if (v.Bullet.CancellableStFrame <= currPlayerDownsync.FramesInChState && currPlayerDownsync.FramesInChState < v.Bullet.CancellableEdFrame) { + patternId = (((currPlayerDownsync.ActiveSkillId + 1 >> 0) >> 0)); + } + } + } + return [patternId, jumpedOrNot, effDx, effDy]; + }; + ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame = function(inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, chConfigsOrderedByJoinIndex) { + var {_1, _2, _entry, _entry$1, _entry$2, _entry$3, _entry$4, _entry$5, _entry$6, _i, _i$1, _i$2, _i$3, _i$4, _i$5, _i$6, _i$7, _i$8, _i$9, _index, _index$1, _r, _r$1, _r$2, _r$3, _ref, _ref$1, _ref$10, _ref$11, _ref$12, _ref$13, _ref$2, _ref$3, _ref$4, _ref$5, _ref$6, _ref$7, _ref$8, _ref$9, _tmp, _tmp$1, _tmp$10, _tmp$11, _tmp$12, _tmp$2, _tmp$3, _tmp$4, _tmp$5, _tmp$6, _tmp$7, _tmp$8, _tmp$9, _tuple, _tuple$1, _tuple$2, _tuple$3, _tuple$4, _tuple$5, _tuple$6, _tuple$7, _tuple$8, _tuple$9, atkedPlayerInNextFrame, bShape, bulletCollider, bulletColliders, bulletShape, bulletWx, bulletWy, chConfig, chConfig$1, chConfig$2, chConfigsOrderedByJoinIndex, collision, collision$1, collisionPlayerIndex, collisionPlayerIndex$1, collisionPlayerIndex$2, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currPlayerDownsync, currPlayerDownsync$1, currPlayerDownsync$2, currPlayerDownsync$3, currPlayerDownsync$4, currRenderFrame, defenderShape, effDx, effDy, effPushbacks, existent, existent$1, existent$2, hardPushbackNorm, hardPushbackNorms, hitboxSizeWx, hitboxSizeWy, i, i$1, i$2, i$3, i$4, inputsBuffer, isAnotherPlayer, isBarrier, isBullet, joinIndex, joinIndex$1, joinIndex$2, joinIndex$3, jumpedOrNot, jumpedOrNotList, landedOnGravityPushback, meleeBullet, newBullet, newBulletCollider, newVx, newVy, nextRenderFrameMeleeBullets, nextRenderFramePlayers, normAlignmentWithGravity, obj, obj$1, offender, offender$1, oldFramesToRecover, oldNextCharacterState, overlapResult, overlapped, overlapped$1, patternId, playerCollider, playerCollider$1, playerCollider$2, playerShape, projectedMagnitude, pushbackVelX, pushbackVelY, pushbackX, pushbackY, roomCapacity, skillConfig, skillId, t, t$1, thatPlayerInNextFrame, thatPlayerInNextFrame$1, thatPlayerInNextFrame$2, thatPlayerInNextFrame$3, v, v$1, x, x$1, x$10, x$11, x$12, x$13, x$14, x$2, x$3, x$4, x$5, x$6, x$7, x$8, x$9, xfac, xfac$1, $s, $r, $c} = $restore(this, {inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, chConfigsOrderedByJoinIndex}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + roomCapacity = currRenderFrame.PlayersArr.$length; + nextRenderFramePlayers = $makeSlice(sliceType$6, roomCapacity); + _ref = currRenderFrame.PlayersArr; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + i = _i; + currPlayerDownsync = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + ((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i] = new PlayerDownsync.ptr(currPlayerDownsync.Id, currPlayerDownsync.VirtualGridX, currPlayerDownsync.VirtualGridY, currPlayerDownsync.DirX, currPlayerDownsync.DirY, currPlayerDownsync.VelX, currPlayerDownsync.VelY, currPlayerDownsync.Speed, currPlayerDownsync.BattleState, currPlayerDownsync.JoinIndex, 0, currPlayerDownsync.Removed, currPlayerDownsync.Score, 0, currPlayerDownsync.FramesToRecover - 1 >> 0, currPlayerDownsync.FramesInChState + 1 >> 0, currPlayerDownsync.Hp, currPlayerDownsync.MaxHp, currPlayerDownsync.CharacterState, true, currPlayerDownsync.ActiveSkillId, currPlayerDownsync.ActiveSkillHit)); + if (((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i]).FramesToRecover < 0) { + ((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i]).FramesToRecover = 0; + } + _i++; + } + nextRenderFrameMeleeBullets = $makeSlice(sliceType$7, 0, currRenderFrame.MeleeBullets.$length); + effPushbacks = $makeSlice(sliceType$3, roomCapacity); + hardPushbackNorms = $makeSlice(sliceType$8, roomCapacity); + jumpedOrNotList = $makeSlice(sliceType$9, roomCapacity); + _ref$1 = currRenderFrame.PlayersArr; + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$1.$length)) { break; } + newBullet = [newBullet]; + i$1 = _i$1; + currPlayerDownsync$1 = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); + ((i$1 < 0 || i$1 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$1] = false); + chConfig = ((i$1 < 0 || i$1 >= chConfigsOrderedByJoinIndex.$length) ? ($throwRuntimeError("index out of range"), undefined) : chConfigsOrderedByJoinIndex.$array[chConfigsOrderedByJoinIndex.$offset + i$1]); + thatPlayerInNextFrame = ((i$1 < 0 || i$1 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$1]); + _tuple = deriveOpPattern(currPlayerDownsync$1, thatPlayerInNextFrame, currRenderFrame, inputsBuffer, 8, 2); + patternId = _tuple[0]; + jumpedOrNot = _tuple[1]; + effDx = _tuple[2]; + effDy = _tuple[3]; + if (jumpedOrNot) { + thatPlayerInNextFrame.VelY = (chConfig.JumpingInitVelY); + ((i$1 < 0 || i$1 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$1] = true); + } + joinIndex = currPlayerDownsync$1.JoinIndex; + if (!((-1 === patternId))) { + _tuple$1 = (_entry = chConfig.PatternIdToSkillId[$Int.keyFor(patternId)], _entry !== undefined ? [_entry.v, true] : [0, false]); + skillId = _tuple$1[0]; + existent = _tuple$1[1]; + if (existent) { + skillConfig = (_entry$1 = skills[$Int.keyFor(skillId)], _entry$1 !== undefined ? _entry$1.v : ptrType$7.nil); + thatPlayerInNextFrame.ActiveSkillId = ((skillId >> 0)); + thatPlayerInNextFrame.ActiveSkillHit = 0; + _ref$2 = (x = skillConfig.Hits, x$1 = thatPlayerInNextFrame.ActiveSkillHit, ((x$1 < 0 || x$1 >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + x$1])); + if ($assertType(_ref$2, ptrType$4, true)[1]) { + v = _ref$2.$val; + newBullet[0] = $clone(v, MeleeBullet); + newBullet[0].Bullet.OriginatedRenderFrameId = currRenderFrame.Id; + newBullet[0].Bullet.OffenderJoinIndex = joinIndex; + nextRenderFrameMeleeBullets = $append(nextRenderFrameMeleeBullets, newBullet[0]); + thatPlayerInNextFrame.FramesToRecover = skillConfig.RecoveryFrames; + } + _1 = skillId; + if (_1 === (1)) { + thatPlayerInNextFrame.CharacterState = 2; + } else if (_1 === (2)) { + thatPlayerInNextFrame.CharacterState = 11; + } else if (_1 === (3)) { + thatPlayerInNextFrame.CharacterState = 12; + } + if (false === currPlayerDownsync$1.InAir) { + thatPlayerInNextFrame.VelX = 0; + } + _i$1++; + continue; + } + } + if (0 === currPlayerDownsync$1.FramesToRecover) { + if (!((0 === effDx)) || !((0 === effDy))) { + _tmp = effDx; + _tmp$1 = effDy; + thatPlayerInNextFrame.DirX = _tmp; + thatPlayerInNextFrame.DirY = _tmp$1; + thatPlayerInNextFrame.VelX = $imul(effDx, currPlayerDownsync$1.Speed); + thatPlayerInNextFrame.CharacterState = 1; + } else { + thatPlayerInNextFrame.CharacterState = 0; + thatPlayerInNextFrame.VelX = 0; + } + } + _i$1++; + } + _ref$3 = currRenderFrame.PlayersArr; + _i$2 = 0; + /* while (true) { */ case 1: + /* if (!(_i$2 < _ref$3.$length)) { break; } */ if(!(_i$2 < _ref$3.$length)) { $s = 2; continue; } + i$2 = _i$2; + currPlayerDownsync$2 = ((_i$2 < 0 || _i$2 >= _ref$3.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$3.$array[_ref$3.$offset + _i$2]); + joinIndex$1 = currPlayerDownsync$2.JoinIndex; + _tmp$2 = 0; + _tmp$3 = 0; + (x$2 = joinIndex$1 - 1 >> 0, ((x$2 < 0 || x$2 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$2])).X = _tmp$2; + (x$3 = joinIndex$1 - 1 >> 0, ((x$3 < 0 || x$3 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$3])).Y = _tmp$3; + collisionPlayerIndex = 131072 + joinIndex$1 >> 0; + playerCollider = (_entry$2 = collisionSysMap[$Int32.keyFor(collisionPlayerIndex)], _entry$2 !== undefined ? _entry$2.v : ptrType$8.nil); + thatPlayerInNextFrame$1 = ((i$2 < 0 || i$2 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$2]); + chConfig$1 = ((i$2 < 0 || i$2 >= chConfigsOrderedByJoinIndex.$length) ? ($throwRuntimeError("index out of range"), undefined) : chConfigsOrderedByJoinIndex.$array[chConfigsOrderedByJoinIndex.$offset + i$2]); + _tmp$4 = currPlayerDownsync$2.VirtualGridX + currPlayerDownsync$2.VelX >> 0; + _tmp$5 = currPlayerDownsync$2.VirtualGridY + currPlayerDownsync$2.VelY >> 0; + newVx = _tmp$4; + newVy = _tmp$5; + if (((i$2 < 0 || i$2 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$2])) { + newVy = newVy + (chConfig$1.JumpingInitVelY) >> 0; + } + _tuple$2 = VirtualGridToPolygonColliderBLPos(newVx, newVy, playerCollider.W * 0.5, playerCollider.H * 0.5, 0, 0, 0, 0, collisionSpaceOffsetX, collisionSpaceOffsetY); + playerCollider.X = _tuple$2[0]; + playerCollider.Y = _tuple$2[1]; + $r = playerCollider.Update(); /* */ $s = 3; case 3: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + if (currPlayerDownsync$2.InAir) { + thatPlayerInNextFrame$1.VelX = thatPlayerInNextFrame$1.VelX + (0) >> 0; + thatPlayerInNextFrame$1.VelY = thatPlayerInNextFrame$1.VelY + (-50) >> 0; + } + _i$2++; + $s = 1; continue; + case 2: + bulletColliders = $makeSlice(sliceType$10, 0, currRenderFrame.MeleeBullets.$length); + _ref$4 = currRenderFrame.MeleeBullets; + _i$3 = 0; + /* while (true) { */ case 4: + /* if (!(_i$3 < _ref$4.$length)) { break; } */ if(!(_i$3 < _ref$4.$length)) { $s = 5; continue; } + meleeBullet = ((_i$3 < 0 || _i$3 >= _ref$4.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$4.$array[_ref$4.$offset + _i$3]); + /* */ if (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) <= currRenderFrame.Id) && (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) + meleeBullet.Bullet.ActiveFrames >> 0) > currRenderFrame.Id)) { $s = 6; continue; } + /* */ $s = 7; continue; + /* if (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) <= currRenderFrame.Id) && (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) + meleeBullet.Bullet.ActiveFrames >> 0) > currRenderFrame.Id)) { */ case 6: + offender = (x$4 = currRenderFrame.PlayersArr, x$5 = meleeBullet.Bullet.OffenderJoinIndex - 1 >> 0, ((x$5 < 0 || x$5 >= x$4.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$4.$array[x$4.$offset + x$5])); + xfac = 1; + if (0 > offender.DirX) { + xfac = -xfac; + } + _tuple$3 = VirtualGridToWorldPos(offender.VirtualGridX + ($imul(xfac, meleeBullet.Bullet.HitboxOffsetX)) >> 0, offender.VirtualGridY); + bulletWx = _tuple$3[0]; + bulletWy = _tuple$3[1]; + _tuple$4 = VirtualGridToWorldPos(meleeBullet.Bullet.HitboxSizeX, meleeBullet.Bullet.HitboxSizeY); + hitboxSizeWx = _tuple$4[0]; + hitboxSizeWy = _tuple$4[1]; + _r = GenerateRectCollider(bulletWx, bulletWy, hitboxSizeWx, hitboxSizeWy, 0.1, 0.1, 0.1, 0.1, collisionSpaceOffsetX, collisionSpaceOffsetY, meleeBullet, "MeleeBullet"); /* */ $s = 9; case 9: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + newBulletCollider = _r; + $r = collisionSys.Add(new sliceType$10([newBulletCollider])); /* */ $s = 10; case 10: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + bulletColliders = $append(bulletColliders, newBulletCollider); + $s = 8; continue; + /* } else { */ case 7: + nextRenderFrameMeleeBullets = $append(nextRenderFrameMeleeBullets, meleeBullet); + /* } */ case 8: + _i$3++; + $s = 4; continue; + case 5: + _ref$5 = currRenderFrame.PlayersArr; + _i$4 = 0; + /* while (true) { */ case 11: + /* if (!(_i$4 < _ref$5.$length)) { break; } */ if(!(_i$4 < _ref$5.$length)) { $s = 12; continue; } + i$3 = _i$4; + currPlayerDownsync$3 = ((_i$4 < 0 || _i$4 >= _ref$5.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$5.$array[_ref$5.$offset + _i$4]); + joinIndex$2 = currPlayerDownsync$3.JoinIndex; + collisionPlayerIndex$1 = 131072 + joinIndex$2 >> 0; + playerCollider$1 = (_entry$3 = collisionSysMap[$Int32.keyFor(collisionPlayerIndex$1)], _entry$3 !== undefined ? _entry$3.v : ptrType$8.nil); + playerShape = $assertType(playerCollider$1.Shape, ptrType$5); + _r$1 = calcHardPushbacksNorms(joinIndex$2, playerCollider$1, playerShape, 0.1, (x$6 = joinIndex$2 - 1 >> 0, ((x$6 < 0 || x$6 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$6]))); /* */ $s = 13; case 13: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } + (x$7 = joinIndex$2 - 1 >> 0, ((x$7 < 0 || x$7 >= hardPushbackNorms.$length) ? ($throwRuntimeError("index out of range"), undefined) : hardPushbackNorms.$array[hardPushbackNorms.$offset + x$7] = _r$1)); + thatPlayerInNextFrame$2 = ((i$3 < 0 || i$3 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$3]); + chConfig$2 = ((i$3 < 0 || i$3 >= chConfigsOrderedByJoinIndex.$length) ? ($throwRuntimeError("index out of range"), undefined) : chConfigsOrderedByJoinIndex.$array[chConfigsOrderedByJoinIndex.$offset + i$3]); + landedOnGravityPushback = false; + collision = playerCollider$1.Check(0, 0, new sliceType$4([])); + /* */ if (!(ptrType$1.nil === collision)) { $s = 14; continue; } + /* */ $s = 15; continue; + /* if (!(ptrType$1.nil === collision)) { */ case 14: + _ref$6 = collision.Objects; + _i$5 = 0; + /* while (true) { */ case 16: + /* if (!(_i$5 < _ref$6.$length)) { break; } */ if(!(_i$5 < _ref$6.$length)) { $s = 17; continue; } + obj = ((_i$5 < 0 || _i$5 >= _ref$6.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$6.$array[_ref$6.$offset + _i$5]); + _tmp$6 = false; + _tmp$7 = false; + _tmp$8 = false; + isBarrier = _tmp$6; + isAnotherPlayer = _tmp$7; + isBullet = _tmp$8; + _ref$7 = obj.Data; + if ($assertType(_ref$7, ptrType$3, true)[1]) { + isAnotherPlayer = true; + } else if ($assertType(_ref$7, ptrType$4, true)[1]) { + isBullet = true; + } else { + isBarrier = true; + } + if (isBullet) { + _i$5++; + /* continue; */ $s = 16; continue; + } + bShape = $assertType(obj.Shape, ptrType$5); + _r$2 = CalcPushbacks(0, 0, playerShape, bShape); /* */ $s = 18; case 18: if($c) { $c = false; _r$2 = _r$2.$blk(); } if (_r$2 && _r$2.$blk !== undefined) { break s; } + _tuple$5 = _r$2; + overlapped = _tuple$5[0]; + pushbackX = _tuple$5[1]; + pushbackY = _tuple$5[2]; + overlapResult = _tuple$5[3]; + if (!overlapped) { + _i$5++; + /* continue; */ $s = 16; continue; + } + normAlignmentWithGravity = overlapResult.OverlapX * 0 + overlapResult.OverlapY * -1; + if (isAnotherPlayer) { + _tmp$9 = (overlapResult.Overlap - 0.2) * overlapResult.OverlapX; + _tmp$10 = (overlapResult.Overlap - 0.2) * overlapResult.OverlapY; + pushbackX = _tmp$9; + pushbackY = _tmp$10; + } + _ref$8 = (x$8 = joinIndex$2 - 1 >> 0, ((x$8 < 0 || x$8 >= hardPushbackNorms.$length) ? ($throwRuntimeError("index out of range"), undefined) : hardPushbackNorms.$array[hardPushbackNorms.$offset + x$8])).$get(); + _i$6 = 0; + while (true) { + if (!(_i$6 < _ref$8.$length)) { break; } + hardPushbackNorm = $clone(((_i$6 < 0 || _i$6 >= _ref$8.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$8.$array[_ref$8.$offset + _i$6]), Vec2D); + projectedMagnitude = pushbackX * hardPushbackNorm.X + pushbackY * hardPushbackNorm.Y; + if (isBarrier || (isAnotherPlayer && 0 > projectedMagnitude)) { + pushbackX = pushbackX - (projectedMagnitude * hardPushbackNorm.X); + pushbackY = pushbackY - (projectedMagnitude * hardPushbackNorm.Y); + } + _i$6++; + } + _index = joinIndex$2 - 1 >> 0; + ((_index < 0 || _index >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index]).X = ((_index < 0 || _index >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index]).X + (pushbackX); + _index$1 = joinIndex$2 - 1 >> 0; + ((_index$1 < 0 || _index$1 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index$1]).Y = ((_index$1 < 0 || _index$1 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index$1]).Y + (pushbackY); + if (0.5 < normAlignmentWithGravity) { + landedOnGravityPushback = true; + } + _i$5++; + $s = 16; continue; + case 17: + /* } */ case 15: + if (landedOnGravityPushback) { + thatPlayerInNextFrame$2.InAir = false; + if (currPlayerDownsync$3.InAir && 0 >= currPlayerDownsync$3.VelY) { + thatPlayerInNextFrame$2.VelX = 0; + thatPlayerInNextFrame$2.VelY = 0; + if (8 === thatPlayerInNextFrame$2.CharacterState) { + thatPlayerInNextFrame$2.CharacterState = 9; + thatPlayerInNextFrame$2.FramesToRecover = chConfig$2.LayDownFramesToRecover; + } else { + thatPlayerInNextFrame$2.CharacterState = 0; + thatPlayerInNextFrame$2.FramesToRecover = 0; + } + } else { + if (9 === thatPlayerInNextFrame$2.CharacterState) { + if (0 === thatPlayerInNextFrame$2.FramesToRecover) { + thatPlayerInNextFrame$2.CharacterState = 10; + thatPlayerInNextFrame$2.FramesToRecover = chConfig$2.GetUpFramesToRecover; + } + } else if (10 === thatPlayerInNextFrame$2.CharacterState) { + if (thatPlayerInNextFrame$2.FramesInChState === chConfig$2.GetUpFrames) { + thatPlayerInNextFrame$2.CharacterState = 0; + } + } + } + } + _i$4++; + $s = 11; continue; + case 12: + _ref$9 = bulletColliders; + _i$7 = 0; + /* while (true) { */ case 19: + /* if (!(_i$7 < _ref$9.$length)) { break; } */ if(!(_i$7 < _ref$9.$length)) { $s = 20; continue; } + bulletCollider = ((_i$7 < 0 || _i$7 >= _ref$9.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$9.$array[_ref$9.$offset + _i$7]); + collision$1 = bulletCollider.Check(0, 0, new sliceType$4([])); + bulletCollider.Space.Remove(new sliceType$10([bulletCollider])); + _ref$10 = bulletCollider.Data; + /* */ if ($assertType(_ref$10, ptrType$4, true)[1]) { $s = 21; continue; } + /* */ $s = 22; continue; + /* if ($assertType(_ref$10, ptrType$4, true)[1]) { */ case 21: + v$1 = _ref$10.$val; + if (ptrType$1.nil === collision$1) { + nextRenderFrameMeleeBullets = $append(nextRenderFrameMeleeBullets, v$1); + _i$7++; + /* continue; */ $s = 19; continue; + } + bulletShape = $assertType(bulletCollider.Shape, ptrType$5); + offender$1 = (x$9 = currRenderFrame.PlayersArr, x$10 = v$1.Bullet.OffenderJoinIndex - 1 >> 0, ((x$10 < 0 || x$10 >= x$9.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$9.$array[x$9.$offset + x$10])); + _ref$11 = collision$1.Objects; + _i$8 = 0; + /* while (true) { */ case 23: + /* if (!(_i$8 < _ref$11.$length)) { break; } */ if(!(_i$8 < _ref$11.$length)) { $s = 24; continue; } + obj$1 = ((_i$8 < 0 || _i$8 >= _ref$11.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$11.$array[_ref$11.$offset + _i$8]); + defenderShape = $assertType(obj$1.Shape, ptrType$5); + _ref$12 = obj$1.Data; + /* */ if ($assertType(_ref$12, ptrType$3, true)[1]) { $s = 25; continue; } + /* */ $s = 26; continue; + /* if ($assertType(_ref$12, ptrType$3, true)[1]) { */ case 25: + t = _ref$12.$val; + if (v$1.Bullet.OffenderJoinIndex === t.JoinIndex) { + _i$8++; + /* continue; */ $s = 23; continue; + } + _tuple$6 = (_entry$4 = invinsibleSet[$Int32.keyFor(t.CharacterState)], _entry$4 !== undefined ? [_entry$4.v, true] : [false, false]); + existent$1 = _tuple$6[1]; + if (existent$1) { + _i$8++; + /* continue; */ $s = 23; continue; + } + _r$3 = CalcPushbacks(0, 0, bulletShape, defenderShape); /* */ $s = 28; case 28: if($c) { $c = false; _r$3 = _r$3.$blk(); } if (_r$3 && _r$3.$blk !== undefined) { break s; } + _tuple$7 = _r$3; + overlapped$1 = _tuple$7[0]; + if (!overlapped$1) { + _i$8++; + /* continue; */ $s = 23; continue; + } + xfac$1 = 1; + if (0 > offender$1.DirX) { + xfac$1 = -xfac$1; + } + _tmp$11 = $imul(xfac$1, v$1.Bullet.PushbackVelX); + _tmp$12 = v$1.Bullet.PushbackVelY; + pushbackVelX = _tmp$11; + pushbackVelY = _tmp$12; + atkedPlayerInNextFrame = (x$11 = t.JoinIndex - 1 >> 0, ((x$11 < 0 || x$11 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + x$11])); + atkedPlayerInNextFrame.VelX = pushbackVelX; + atkedPlayerInNextFrame.VelY = pushbackVelY; + if (v$1.Bullet.BlowUp) { + atkedPlayerInNextFrame.CharacterState = 8; + } else { + atkedPlayerInNextFrame.CharacterState = 3; + } + oldFramesToRecover = (x$12 = t.JoinIndex - 1 >> 0, ((x$12 < 0 || x$12 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + x$12])).FramesToRecover; + if (v$1.Bullet.HitStunFrames > oldFramesToRecover) { + atkedPlayerInNextFrame.FramesToRecover = v$1.Bullet.HitStunFrames; + } + $s = 27; continue; + /* } else { */ case 26: + t$1 = _ref$12; + /* } */ case 27: + _i$8++; + $s = 23; continue; + case 24: + /* } */ case 22: + _i$7++; + $s = 19; continue; + case 20: + _ref$13 = currRenderFrame.PlayersArr; + _i$9 = 0; + while (true) { + if (!(_i$9 < _ref$13.$length)) { break; } + i$4 = _i$9; + currPlayerDownsync$4 = ((_i$9 < 0 || _i$9 >= _ref$13.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$13.$array[_ref$13.$offset + _i$9]); + joinIndex$3 = currPlayerDownsync$4.JoinIndex; + collisionPlayerIndex$2 = 131072 + joinIndex$3 >> 0; + playerCollider$2 = (_entry$5 = collisionSysMap[$Int32.keyFor(collisionPlayerIndex$2)], _entry$5 !== undefined ? _entry$5.v : ptrType$8.nil); + thatPlayerInNextFrame$3 = ((i$4 < 0 || i$4 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$4]); + _tuple$8 = PolygonColliderBLToVirtualGridPos(playerCollider$2.X - (x$13 = joinIndex$3 - 1 >> 0, ((x$13 < 0 || x$13 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$13])).X, playerCollider$2.Y - (x$14 = joinIndex$3 - 1 >> 0, ((x$14 < 0 || x$14 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$14])).Y, playerCollider$2.W * 0.5, playerCollider$2.H * 0.5, 0, 0, 0, 0, collisionSpaceOffsetX, collisionSpaceOffsetY); + thatPlayerInNextFrame$3.VirtualGridX = _tuple$8[0]; + thatPlayerInNextFrame$3.VirtualGridY = _tuple$8[1]; + if (thatPlayerInNextFrame$3.InAir) { + oldNextCharacterState = thatPlayerInNextFrame$3.CharacterState; + _2 = oldNextCharacterState; + if ((_2 === (0)) || (_2 === (1))) { + if (((i$4 < 0 || i$4 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$4]) || (5 === currPlayerDownsync$4.CharacterState)) { + thatPlayerInNextFrame$3.CharacterState = 5; + } else { + thatPlayerInNextFrame$3.CharacterState = 4; + } + } else if (_2 === (2)) { + thatPlayerInNextFrame$3.CharacterState = 6; + } else if (_2 === (3)) { + thatPlayerInNextFrame$3.CharacterState = 7; + } + } + if (!((thatPlayerInNextFrame$3.CharacterState === currPlayerDownsync$4.CharacterState))) { + thatPlayerInNextFrame$3.FramesInChState = 0; + } + _tuple$9 = (_entry$6 = nonAttackingSet[$Int32.keyFor(thatPlayerInNextFrame$3.CharacterState)], _entry$6 !== undefined ? [_entry$6.v, true] : [false, false]); + existent$2 = _tuple$9[1]; + if (existent$2) { + thatPlayerInNextFrame$3.ActiveSkillId = -1; + thatPlayerInNextFrame$3.ActiveSkillHit = -1; + } + _i$9++; + } + $s = -1; return new RoomDownsyncFrame.ptr(currRenderFrame.Id + 1 >> 0, nextRenderFramePlayers, new $Int64(0, 0), nextRenderFrameMeleeBullets, sliceType$11.nil, new $Uint64(0, 0), false, false); + /* */ } return; } var $f = {$blk: ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame, $c: true, $r, _1, _2, _entry, _entry$1, _entry$2, _entry$3, _entry$4, _entry$5, _entry$6, _i, _i$1, _i$2, _i$3, _i$4, _i$5, _i$6, _i$7, _i$8, _i$9, _index, _index$1, _r, _r$1, _r$2, _r$3, _ref, _ref$1, _ref$10, _ref$11, _ref$12, _ref$13, _ref$2, _ref$3, _ref$4, _ref$5, _ref$6, _ref$7, _ref$8, _ref$9, _tmp, _tmp$1, _tmp$10, _tmp$11, _tmp$12, _tmp$2, _tmp$3, _tmp$4, _tmp$5, _tmp$6, _tmp$7, _tmp$8, _tmp$9, _tuple, _tuple$1, _tuple$2, _tuple$3, _tuple$4, _tuple$5, _tuple$6, _tuple$7, _tuple$8, _tuple$9, atkedPlayerInNextFrame, bShape, bulletCollider, bulletColliders, bulletShape, bulletWx, bulletWy, chConfig, chConfig$1, chConfig$2, chConfigsOrderedByJoinIndex, collision, collision$1, collisionPlayerIndex, collisionPlayerIndex$1, collisionPlayerIndex$2, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currPlayerDownsync, currPlayerDownsync$1, currPlayerDownsync$2, currPlayerDownsync$3, currPlayerDownsync$4, currRenderFrame, defenderShape, effDx, effDy, effPushbacks, existent, existent$1, existent$2, hardPushbackNorm, hardPushbackNorms, hitboxSizeWx, hitboxSizeWy, i, i$1, i$2, i$3, i$4, inputsBuffer, isAnotherPlayer, isBarrier, isBullet, joinIndex, joinIndex$1, joinIndex$2, joinIndex$3, jumpedOrNot, jumpedOrNotList, landedOnGravityPushback, meleeBullet, newBullet, newBulletCollider, newVx, newVy, nextRenderFrameMeleeBullets, nextRenderFramePlayers, normAlignmentWithGravity, obj, obj$1, offender, offender$1, oldFramesToRecover, oldNextCharacterState, overlapResult, overlapped, overlapped$1, patternId, playerCollider, playerCollider$1, playerCollider$2, playerShape, projectedMagnitude, pushbackVelX, pushbackVelY, pushbackX, pushbackY, roomCapacity, skillConfig, skillId, t, t$1, thatPlayerInNextFrame, thatPlayerInNextFrame$1, thatPlayerInNextFrame$2, thatPlayerInNextFrame$3, v, v$1, x, x$1, x$10, x$11, x$12, x$13, x$14, x$2, x$3, x$4, x$5, x$6, x$7, x$8, x$9, xfac, xfac$1, $s};return $f; + }; + $pkg.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame = ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame; + GenerateRectCollider = function(wx, wy, w, h, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, data, tag) { + var {$24r, _r, _tuple, blX, blY, bottomPadding, data, h, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, tag, topPadding, w, wx, wy, $s, $r, $c} = $restore(this, {wx, wy, w, h, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, data, tag}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + _tuple = WorldToPolygonColliderBLPos(wx, wy, w * 0.5, h * 0.5, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY); + blX = _tuple[0]; + blY = _tuple[1]; + _r = generateRectColliderInCollisionSpace(blX, blY, leftPadding + w + rightPadding, bottomPadding + h + topPadding, data, tag); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + $24r = _r; + $s = 2; case 2: return $24r; + /* */ } return; } var $f = {$blk: GenerateRectCollider, $c: true, $r, $24r, _r, _tuple, blX, blY, bottomPadding, data, h, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, tag, topPadding, w, wx, wy, $s};return $f; + }; + $pkg.GenerateRectCollider = GenerateRectCollider; + generateRectColliderInCollisionSpace = function(blX, blY, w, h, data, tag) { + var {blX, blY, collider, data, h, shape, tag, w, $s, $r, $c} = $restore(this, {blX, blY, w, h, data, tag}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + collider = resolv.NewObject(blX, blY, w, h, new sliceType$4([tag])); + shape = resolv.NewRectangle(0, 0, w, h); + $r = collider.SetShape(shape); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + collider.Data = data; + $s = -1; return collider; + /* */ } return; } var $f = {$blk: generateRectColliderInCollisionSpace, $c: true, $r, blX, blY, collider, data, h, shape, tag, w, $s};return $f; + }; + GenerateConvexPolygonCollider = function(unalignedSrc, spaceOffsetX, spaceOffsetY, data, tag) { + var {_i, _i$1, _ref, _ref$1, _tmp, _tmp$1, aligned, collider, data, h, i, i$1, j, p, pi, pj, shape, spaceOffsetX, spaceOffsetY, tag, unalignedSrc, w, x, $s, $r, $c} = $restore(this, {unalignedSrc, spaceOffsetX, spaceOffsetY, data, tag}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + aligned = AlignPolygon2DToBoundingBox(unalignedSrc); + _tmp = 0; + _tmp$1 = 0; + w = _tmp; + h = _tmp$1; + shape = resolv.NewConvexPolygon(sliceType$12.nil); + _ref = aligned.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + i = _i; + pi = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + _ref$1 = aligned.Points; + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$1.$length)) { break; } + j = _i$1; + pj = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); + if (i === j) { + _i$1++; + continue; + } + if (math.Abs(pj.X - pi.X) > w) { + w = math.Abs(pj.X - pi.X); + } + if (math.Abs(pj.Y - pi.Y) > h) { + h = math.Abs(pj.Y - pi.Y); + } + _i$1++; + } + _i++; + } + i$1 = 0; + while (true) { + if (!(i$1 < aligned.Points.$length)) { break; } + p = (x = aligned.Points, ((i$1 < 0 || i$1 >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + i$1])); + shape.AddPoints(new sliceType$12([p.X, p.Y])); + i$1 = i$1 + (1) >> 0; + } + collider = resolv.NewObject(aligned.Anchor.X + spaceOffsetX, aligned.Anchor.Y + spaceOffsetY, w, h, new sliceType$4([tag])); + $r = collider.SetShape(shape); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + collider.Data = data; + $s = -1; return collider; + /* */ } return; } var $f = {$blk: GenerateConvexPolygonCollider, $c: true, $r, _i, _i$1, _ref, _ref$1, _tmp, _tmp$1, aligned, collider, data, h, i, i$1, j, p, pi, pj, shape, spaceOffsetX, spaceOffsetY, tag, unalignedSrc, w, x, $s};return $f; + }; + $pkg.GenerateConvexPolygonCollider = GenerateConvexPolygonCollider; + AlignPolygon2DToBoundingBox = function(input) { + var _i, _i$1, _ref, _ref$1, boundingBoxBL, i, input, output, p, p$1, x; + boundingBoxBL = new Vec2D.ptr(1.7e+308, 1.7e+308); + _ref = input.Points; + _i = 0; + while (true) { + if (!(_i < _ref.$length)) { break; } + p = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + if (p.X < boundingBoxBL.X) { + boundingBoxBL.X = p.X; + } + if (p.Y < boundingBoxBL.Y) { + boundingBoxBL.Y = p.Y; + } + _i++; + } + output = new Polygon2D.ptr(new Vec2D.ptr(input.Anchor.X + boundingBoxBL.X, input.Anchor.Y + boundingBoxBL.Y), $makeSlice(sliceType$13, input.Points.$length)); + _ref$1 = input.Points; + _i$1 = 0; + while (true) { + if (!(_i$1 < _ref$1.$length)) { break; } + i = _i$1; + p$1 = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); + (x = output.Points, ((i < 0 || i >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + i] = new Vec2D.ptr(p$1.X - boundingBoxBL.X, p$1.Y - boundingBoxBL.Y))); + _i$1++; + } + return output; + }; + $pkg.AlignPolygon2DToBoundingBox = AlignPolygon2DToBoundingBox; + ptrType$12.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)}]; + Vec2D.init("", [{prop: "X", name: "X", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "Y", name: "Y", embedded: false, exported: true, typ: $Float64, tag: ""}]); + Polygon2D.init("", [{prop: "Anchor", name: "Anchor", embedded: false, exported: true, typ: ptrType$10, tag: ""}, {prop: "Points", name: "Points", embedded: false, exported: true, typ: sliceType$13, tag: ""}]); + PlayerDownsync.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: ""}]); + InputFrameDecoded.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: ""}]); + Barrier.init("", [{prop: "Boundary", name: "Boundary", embedded: false, exported: true, typ: ptrType$11, tag: ""}]); + Bullet.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: ""}]); + MeleeBullet.init("", [{prop: "Bullet", name: "Bullet", embedded: true, exported: true, typ: Bullet, tag: ""}]); + FireballBullet.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: Bullet, tag: ""}]); + Skill.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: "Hits", name: "Hits", embedded: false, exported: true, typ: sliceType, tag: ""}]); + RoomDownsyncFrame.init("", [{prop: "Id", name: "Id", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "PlayersArr", name: "PlayersArr", embedded: false, exported: true, typ: sliceType$6, tag: ""}, {prop: "CountdownNanos", name: "CountdownNanos", embedded: false, exported: true, typ: $Int64, tag: ""}, {prop: "MeleeBullets", name: "MeleeBullets", embedded: false, exported: true, typ: sliceType$7, tag: ""}, {prop: "FireballBullets", name: "FireballBullets", embedded: false, exported: true, typ: sliceType$11, 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: mapType, tag: ""}]); + InputFrameDownsync.init("", [{prop: "InputFrameId", name: "InputFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "InputList", name: "InputList", embedded: false, exported: true, typ: sliceType$5, tag: ""}, {prop: "ConfirmedList", name: "ConfirmedList", embedded: false, exported: true, typ: $Uint64, tag: ""}]); + RingBuffer.init("", [{prop: "Ed", name: "Ed", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "St", name: "St", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "EdFrameId", name: "EdFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "StFrameId", name: "StFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "N", name: "N", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Cnt", name: "Cnt", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Eles", name: "Eles", embedded: false, exported: true, typ: sliceType, tag: ""}]); + CharacterConfig.init("", [{prop: "SpeciesId", name: "SpeciesId", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "SpeciesName", name: "SpeciesName", embedded: false, exported: true, typ: $String, tag: ""}, {prop: "InAirIdleFrameIdxTurningPoint", name: "InAirIdleFrameIdxTurningPoint", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "InAirIdleFrameIdxTurnedCycle", name: "InAirIdleFrameIdxTurnedCycle", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "LayDownFrames", name: "LayDownFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "LayDownFramesToRecover", name: "LayDownFramesToRecover", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "GetUpFrames", name: "GetUpFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "GetUpFramesToRecover", name: "GetUpFramesToRecover", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "JumpingInitVelY", name: "JumpingInitVelY", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "PatternIdToSkillId", name: "PatternIdToSkillId", embedded: false, exported: true, typ: mapType, tag: ""}]); + SatResult.init("", [{prop: "Overlap", name: "Overlap", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "OverlapX", name: "OverlapX", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "OverlapY", name: "OverlapY", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "AContainedInB", name: "AContainedInB", embedded: false, exported: true, typ: $Bool, tag: ""}, {prop: "BContainedInA", name: "BContainedInA", embedded: false, exported: true, typ: $Bool, tag: ""}, {prop: "Axis", name: "Axis", embedded: false, exported: true, typ: resolv.Vector, tag: ""}]); + $init = function() { + $pkg.$init = function() {}; + /* */ 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 = math.$init(); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + $r = resolv.$init(); /* */ $s = 2; case 2: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + $pkg.Characters = $makeMap($Int.keyFor, [{ k: 0, v: new CharacterConfig.ptr(0, "MonkGirl", 11, 1, 16, 16, 33, 30, 800, $makeMap($Int.keyFor, [{ k: 1, v: 1 }, { k: 2, v: 2 }, { k: 3, v: 3 }, { k: 255, v: 255 }])) }]); + skills = $makeMap($Int.keyFor, [{ k: 1, v: new Skill.ptr(0, 20, 20, 20, 1, new sliceType([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 5, 8, 20, 10, 13, 9, 50, 0, 5, 0, 0, 1200, 0, 2400, 3200, false))])) }, { k: 2, v: new Skill.ptr(0, 36, 36, 36, 1, new sliceType([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 3, 18, 36, 20, 18, 9, 50, 0, 5, 0, 0, 1800, 0, 2400, 3200, false))])) }, { k: 3, v: new Skill.ptr(0, 60, 60, 60, 1, new sliceType([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 1, 0, 0, 30, 999999999, 9, 100, 400, 10, 0, 0, 2400, 0, 3200, 3200, true))])) }, { k: 255, v: new Skill.ptr(0, 34, 34, 34, 1, new sliceType([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 3, 0, 0, 20, 18, 9, 50, 0, 5, 0, 0, 1200, 0, 3200, 2400, false))])) }]); + $pkg.DIRECTION_DECODER = new sliceType$2([new sliceType$1([0, 0]), new sliceType$1([0, 2]), new sliceType$1([0, -2]), new sliceType$1([2, 0]), new sliceType$1([-2, 0]), new sliceType$1([1, 1]), new sliceType$1([-1, -1]), new sliceType$1([1, -1]), new sliceType$1([-1, 1])]); + inAirSet = $makeMap($Int32.keyFor, [{ k: 4, v: true }, { k: 5, v: true }, { k: 6, v: true }, { k: 7, v: true }, { k: 8, v: true }]); + noOpSet = $makeMap($Int32.keyFor, [{ k: 3, v: true }, { k: 7, v: true }, { k: 8, v: true }, { k: 9, v: true }]); + invinsibleSet = $makeMap($Int32.keyFor, [{ k: 8, v: true }, { k: 9, v: true }, { k: 10, v: true }]); + nonAttackingSet = $makeMap($Int32.keyFor, []); + /* */ } 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, js, battle, resolv, sliceType, ptrType, sliceType$1, ptrType$1, ptrType$2, sliceType$2, ptrType$3, sliceType$3, ptrType$4, sliceType$4, ptrType$5, sliceType$5, ptrType$6, funcType, funcType$1, funcType$2, funcType$3, funcType$4, funcType$5, funcType$6, funcType$7, funcType$8, funcType$9, funcType$10, ptrType$7, funcType$11, funcType$12, funcType$13, funcType$14, sliceType$6, funcType$15, ptrType$8, ptrType$9, ptrType$10, mapType, sliceType$7, funcType$16, mapType$1, NewInputFrameDownsync, NewRingBufferJs, NewCollisionSpaceJs, NewVec2DJs, NewPolygon2DJs, NewBarrierJs, NewPlayerDownsyncJs, NewMeleeBulletJs, NewRoomDownsyncFrameJs, GetCollisionSpaceObjsJs, GenerateRectColliderJs, GenerateConvexPolygonColliderJs, GetCharacterConfigsOrderedByJoinIndex, ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs, main; + js = $packages["github.com/gopherjs/gopherjs/js"]; + battle = $packages["jsexport/battle"]; + resolv = $packages["resolv"]; + sliceType = $sliceType($Uint64); + ptrType = $ptrType(battle.Vec2D); + sliceType$1 = $sliceType(ptrType); + ptrType$1 = $ptrType(battle.Polygon2D); + ptrType$2 = $ptrType(battle.PlayerDownsync); + sliceType$2 = $sliceType(ptrType$2); + ptrType$3 = $ptrType(battle.MeleeBullet); + sliceType$3 = $sliceType(ptrType$3); + ptrType$4 = $ptrType(battle.FireballBullet); + sliceType$4 = $sliceType(ptrType$4); + ptrType$5 = $ptrType(js.Object); + sliceType$5 = $sliceType(ptrType$5); + ptrType$6 = $ptrType(battle.CharacterConfig); + funcType = $funcType([$Float64, $Float64], [ptrType$5], false); + funcType$1 = $funcType([ptrType, sliceType$1], [ptrType$5], false); + funcType$2 = $funcType([ptrType$1], [ptrType$5], false); + funcType$3 = $funcType([$Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Bool], [ptrType$5], false); + funcType$4 = $funcType([$Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Bool], [ptrType$5], false); + funcType$5 = $funcType([$Int32, sliceType$2, sliceType$3], [ptrType$5], false); + funcType$6 = $funcType([$Int, $Int, $Int, $Int], [ptrType$5], false); + funcType$7 = $funcType([$Int32, sliceType, $Uint64], [ptrType$5], false); + funcType$8 = $funcType([$Int32], [ptrType$5], false); + funcType$9 = $funcType([$Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $emptyInterface, $String], [ptrType$5], false); + funcType$10 = $funcType([ptrType$1, $Float64, $Float64, $emptyInterface, $String], [ptrType$5], false); + ptrType$7 = $ptrType(resolv.Space); + funcType$11 = $funcType([ptrType$7], [sliceType$5], false); + funcType$12 = $funcType([$Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64], [$Float64, $Float64], false); + funcType$13 = $funcType([$Float64, $Float64], [$Int32, $Int32], false); + funcType$14 = $funcType([$Int32, $Int32], [$Float64, $Float64], false); + sliceType$6 = $sliceType($Int); + funcType$15 = $funcType([sliceType$6], [sliceType$5], false); + ptrType$8 = $ptrType(battle.RingBuffer); + ptrType$9 = $ptrType(battle.RoomDownsyncFrame); + ptrType$10 = $ptrType(resolv.Object); + mapType = $mapType($Int32, ptrType$10); + sliceType$7 = $sliceType(ptrType$6); + funcType$16 = $funcType([ptrType$8, ptrType$9, ptrType$7, mapType, $Float64, $Float64, sliceType$7], [ptrType$5], false); + mapType$1 = $mapType($String, $emptyInterface); + NewInputFrameDownsync = function(inputFrameId, inputList, confirmedList) { + var {$24r, _r, confirmedList, inputFrameId, inputList, $s, $r, $c} = $restore(this, {inputFrameId, inputList, confirmedList}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + _r = js.MakeFullWrapper(new battle.InputFrameDownsync.ptr(inputFrameId, inputList, confirmedList)); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + $24r = _r; + $s = 2; case 2: return $24r; + /* */ } return; } var $f = {$blk: NewInputFrameDownsync, $c: true, $r, $24r, _r, confirmedList, inputFrameId, inputList, $s};return $f; + }; + $pkg.NewInputFrameDownsync = NewInputFrameDownsync; + NewRingBufferJs = function(n) { + var {$24r, _r, n, $s, $r, $c} = $restore(this, {n}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + _r = js.MakeFullWrapper(battle.NewRingBuffer(n)); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + $24r = _r; + $s = 2; case 2: return $24r; + /* */ } return; } var $f = {$blk: NewRingBufferJs, $c: true, $r, $24r, _r, n, $s};return $f; + }; + $pkg.NewRingBufferJs = NewRingBufferJs; + NewCollisionSpaceJs = function(spaceW, spaceH, minStepW, minStepH) { + var minStepH, minStepW, spaceH, spaceW; + return js.MakeWrapper(resolv.NewSpace(spaceW, spaceH, minStepW, minStepH)); + }; + $pkg.NewCollisionSpaceJs = NewCollisionSpaceJs; + NewVec2DJs = function(x, y) { + var {$24r, _r, x, y, $s, $r, $c} = $restore(this, {x, y}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + _r = js.MakeFullWrapper(new battle.Vec2D.ptr(x, y)); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + $24r = _r; + $s = 2; case 2: return $24r; + /* */ } return; } var $f = {$blk: NewVec2DJs, $c: true, $r, $24r, _r, x, y, $s};return $f; + }; + $pkg.NewVec2DJs = NewVec2DJs; + NewPolygon2DJs = function(anchor, points) { + var {$24r, _r, anchor, points, $s, $r, $c} = $restore(this, {anchor, points}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + _r = js.MakeFullWrapper(new battle.Polygon2D.ptr(anchor, points)); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + $24r = _r; + $s = 2; case 2: return $24r; + /* */ } return; } var $f = {$blk: NewPolygon2DJs, $c: true, $r, $24r, _r, anchor, points, $s};return $f; + }; + $pkg.NewPolygon2DJs = NewPolygon2DJs; + NewBarrierJs = function(boundary) { + var boundary; + return js.MakeWrapper(new battle.Barrier.ptr(boundary)); + }; + $pkg.NewBarrierJs = NewBarrierJs; + NewPlayerDownsyncJs = function(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, framesToRecover, framesInChState, speed, battleState, characterState, joinIndex, hp, maxHp, colliderRadius, inAir) { + var battleState, characterState, colliderRadius, dirX, dirY, framesInChState, framesToRecover, hp, id, inAir, joinIndex, maxHp, speed, velX, velY, virtualGridX, virtualGridY; + return js.MakeWrapper(new battle.PlayerDownsync.ptr(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, speed, battleState, joinIndex, colliderRadius, false, 0, 0, framesToRecover, framesInChState, hp, maxHp, characterState, inAir, 0, 0)); + }; + $pkg.NewPlayerDownsyncJs = NewPlayerDownsyncJs; + NewMeleeBulletJs = function(originatedRenderFrameId, offenderJoinIndex, startupFrames, cancellableStFrame, cancellableEdFrame, activeFrames, hitStunFrames, blockStunFrames, pushbackVelX, pushbackVelY, damage, selfLockVelX, selfLockVelY, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY, blowUp) { + var activeFrames, blockStunFrames, blowUp, cancellableEdFrame, cancellableStFrame, damage, hitStunFrames, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY, offenderJoinIndex, originatedRenderFrameId, pushbackVelX, pushbackVelY, selfLockVelX, selfLockVelY, startupFrames; + return js.MakeWrapper(new battle.MeleeBullet.ptr(new battle.Bullet.ptr(originatedRenderFrameId, offenderJoinIndex, startupFrames, cancellableStFrame, cancellableEdFrame, activeFrames, hitStunFrames, blockStunFrames, pushbackVelX, pushbackVelY, damage, selfLockVelX, selfLockVelY, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY, blowUp))); + }; + $pkg.NewMeleeBulletJs = NewMeleeBulletJs; + NewRoomDownsyncFrameJs = function(id, playersArr, meleeBullets) { + var {$24r, _r, id, meleeBullets, playersArr, $s, $r, $c} = $restore(this, {id, playersArr, meleeBullets}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + _r = js.MakeFullWrapper(new battle.RoomDownsyncFrame.ptr(id, playersArr, new $Int64(0, 0), meleeBullets, sliceType$4.nil, new $Uint64(0, 0), false, false)); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + $24r = _r; + $s = 2; case 2: return $24r; + /* */ } return; } var $f = {$blk: NewRoomDownsyncFrameJs, $c: true, $r, $24r, _r, id, meleeBullets, playersArr, $s};return $f; + }; + $pkg.NewRoomDownsyncFrameJs = NewRoomDownsyncFrameJs; + GetCollisionSpaceObjsJs = function(space) { + var {_i, _r, _ref, obj, objs, ret, space, $s, $r, $c} = $restore(this, {space}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + objs = space.Objects(); + ret = $makeSlice(sliceType$5, 0, objs.$length); + _ref = objs; + _i = 0; + /* while (true) { */ case 1: + /* if (!(_i < _ref.$length)) { break; } */ if(!(_i < _ref.$length)) { $s = 2; continue; } + obj = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + _r = js.MakeFullWrapper(obj); /* */ $s = 3; case 3: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + ret = $append(ret, _r); + _i++; + $s = 1; continue; + case 2: + $s = -1; return ret; + /* */ } return; } var $f = {$blk: GetCollisionSpaceObjsJs, $c: true, $r, _i, _r, _ref, obj, objs, ret, space, $s};return $f; + }; + $pkg.GetCollisionSpaceObjsJs = GetCollisionSpaceObjsJs; + GenerateRectColliderJs = function(wx, wy, w, h, spaceOffsetX, spaceOffsetY, data, tag) { + var {$24r, _r, _r$1, _tmp, _tmp$1, _tmp$2, _tmp$3, bottomPadding, data, h, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, tag, topPadding, w, wx, wy, $s, $r, $c} = $restore(this, {wx, wy, w, h, spaceOffsetX, spaceOffsetY, data, tag}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + _tmp = 0.1; + _tmp$1 = 0.1; + _tmp$2 = 0.1; + _tmp$3 = 0.1; + topPadding = _tmp; + bottomPadding = _tmp$1; + leftPadding = _tmp$2; + rightPadding = _tmp$3; + _r = battle.GenerateRectCollider(wx, wy, w, h, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, data, tag); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + _r$1 = js.MakeFullWrapper(_r); /* */ $s = 2; case 2: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } + $24r = _r$1; + $s = 3; case 3: return $24r; + /* */ } return; } var $f = {$blk: GenerateRectColliderJs, $c: true, $r, $24r, _r, _r$1, _tmp, _tmp$1, _tmp$2, _tmp$3, bottomPadding, data, h, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, tag, topPadding, w, wx, wy, $s};return $f; + }; + $pkg.GenerateRectColliderJs = GenerateRectColliderJs; + GenerateConvexPolygonColliderJs = function(unalignedSrc, spaceOffsetX, spaceOffsetY, data, tag) { + var {$24r, _r, _r$1, data, spaceOffsetX, spaceOffsetY, tag, unalignedSrc, $s, $r, $c} = $restore(this, {unalignedSrc, spaceOffsetX, spaceOffsetY, data, tag}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + _r = battle.GenerateConvexPolygonCollider(unalignedSrc, spaceOffsetX, spaceOffsetY, data, tag); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + _r$1 = js.MakeFullWrapper(_r); /* */ $s = 2; case 2: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } + $24r = _r$1; + $s = 3; case 3: return $24r; + /* */ } return; } var $f = {$blk: GenerateConvexPolygonColliderJs, $c: true, $r, $24r, _r, _r$1, data, spaceOffsetX, spaceOffsetY, tag, unalignedSrc, $s};return $f; + }; + $pkg.GenerateConvexPolygonColliderJs = GenerateConvexPolygonColliderJs; + GetCharacterConfigsOrderedByJoinIndex = function(speciesIdList) { + var {_entry, _i, _r, _ref, i, ret, speciesId, speciesIdList, $s, $r, $c} = $restore(this, {speciesIdList}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + ret = $makeSlice(sliceType$5, speciesIdList.$length, speciesIdList.$length); + _ref = speciesIdList; + _i = 0; + /* while (true) { */ case 1: + /* if (!(_i < _ref.$length)) { break; } */ if(!(_i < _ref.$length)) { $s = 2; continue; } + i = _i; + speciesId = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); + _r = js.MakeFullWrapper((_entry = battle.Characters[$Int.keyFor(speciesId)], _entry !== undefined ? _entry.v : ptrType$6.nil)); /* */ $s = 3; case 3: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + ((i < 0 || i >= ret.$length) ? ($throwRuntimeError("index out of range"), undefined) : ret.$array[ret.$offset + i] = _r); + _i++; + $s = 1; continue; + case 2: + $s = -1; return ret; + /* */ } return; } var $f = {$blk: GetCharacterConfigsOrderedByJoinIndex, $c: true, $r, _entry, _i, _r, _ref, i, ret, speciesId, speciesIdList, $s};return $f; + }; + $pkg.GetCharacterConfigsOrderedByJoinIndex = GetCharacterConfigsOrderedByJoinIndex; + ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs = function(inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, chConfigsOrderedByJoinIndex) { + var {$24r, _r, _r$1, chConfigsOrderedByJoinIndex, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currRenderFrame, inputsBuffer, $s, $r, $c} = $restore(this, {inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, chConfigsOrderedByJoinIndex}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + _r = battle.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, chConfigsOrderedByJoinIndex); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + _r$1 = js.MakeFullWrapper(_r); /* */ $s = 2; case 2: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } + $24r = _r$1; + $s = 3; case 3: return $24r; + /* */ } return; } var $f = {$blk: ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs, $c: true, $r, $24r, _r, _r$1, chConfigsOrderedByJoinIndex, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currRenderFrame, inputsBuffer, $s};return $f; + }; + $pkg.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs = ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs; + main = function() { + $global.gopkgs = $externalize($makeMap($String.keyFor, [{ k: "NewVec2DJs", v: new funcType(NewVec2DJs) }, { k: "NewPolygon2DJs", v: new funcType$1(NewPolygon2DJs) }, { k: "NewBarrierJs", v: new funcType$2(NewBarrierJs) }, { k: "NewPlayerDownsyncJs", v: new funcType$3(NewPlayerDownsyncJs) }, { k: "NewMeleeBulletJs", v: new funcType$4(NewMeleeBulletJs) }, { k: "NewRoomDownsyncFrameJs", v: new funcType$5(NewRoomDownsyncFrameJs) }, { k: "NewCollisionSpaceJs", v: new funcType$6(NewCollisionSpaceJs) }, { k: "NewInputFrameDownsync", v: new funcType$7(NewInputFrameDownsync) }, { k: "NewRingBufferJs", v: new funcType$8(NewRingBufferJs) }, { k: "GenerateRectColliderJs", v: new funcType$9(GenerateRectColliderJs) }, { k: "GenerateConvexPolygonColliderJs", v: new funcType$10(GenerateConvexPolygonColliderJs) }, { k: "GetCollisionSpaceObjsJs", v: new funcType$11(GetCollisionSpaceObjsJs) }, { k: "WorldToPolygonColliderBLPos", v: new funcType$12(battle.WorldToPolygonColliderBLPos) }, { k: "PolygonColliderBLToWorldPos", v: new funcType$12(battle.PolygonColliderBLToWorldPos) }, { k: "WorldToVirtualGridPos", v: new funcType$13(battle.WorldToVirtualGridPos) }, { k: "VirtualGridToWorldPos", v: new funcType$14(battle.VirtualGridToWorldPos) }, { k: "GetCharacterConfigsOrderedByJoinIndex", v: new funcType$15(GetCharacterConfigsOrderedByJoinIndex) }, { k: "ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs", v: new funcType$16(ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs) }]), mapType$1); + }; + $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 = js.$init(); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + $r = battle.$init(); /* */ $s = 2; case 2: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + $r = resolv.$init(); /* */ $s = 3; case 3: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + if ($pkg === $mainPkg) { + main(); + $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/MonkGirl/Atk1.anim b/frontend/assets/resources/animation/MonkGirl/Atk1.anim index 06ab839..0a2dc11 100644 --- a/frontend/assets/resources/animation/MonkGirl/Atk1.anim +++ b/frontend/assets/resources/animation/MonkGirl/Atk1.anim @@ -3,7 +3,7 @@ "_name": "Atk1", "_objFlags": 0, "_native": "", - "_duration": 0.36666666666666664, + "_duration": 0.2833333333333333, "sample": 60, "speed": 1, "wrapMode": 1, @@ -18,25 +18,25 @@ } }, { - "frame": 0.03333333333333333, + "frame": 0.05, "value": { "__uuid__": "12b90556-58b9-4311-b5d9-820fb76d659b" } }, { - "frame": 0.11666666666666667, + "frame": 0.1, "value": { "__uuid__": "72bc74a1-6e8c-48bb-9ab2-9b8f502ceffb" } }, { - "frame": 0.31666666666666665, + "frame": 0.25, "value": { "__uuid__": "7e619896-100d-4903-b256-e30ddb5ad397" } }, { - "frame": 0.35, + "frame": 0.26666666666666666, "value": { "__uuid__": "4a35e0f5-95c4-445b-8f9b-6514a060a72d" } 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..ebf6cfd --- /dev/null +++ b/frontend/assets/resources/animation/MonkGirl/Atk3.anim @@ -0,0 +1,85 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "Atk3", + "_objFlags": 0, + "_native": "", + "_duration": 1, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "4e1a3e61-dc3e-4de1-9385-bce2c5f54764" + } + }, + { + "frame": 0.05, + "value": { + "__uuid__": "39ba4413-6f4a-49a5-a7ca-d11140dfe7dd" + } + }, + { + "frame": 0.11666666666666667, + "value": { + "__uuid__": "26b646c7-bdbc-495e-adaf-9d52ef1b5c84" + } + }, + { + "frame": 0.21666666666666667, + "value": { + "__uuid__": "5a5208a0-1c29-446f-8375-739aef09fe65" + } + }, + { + "frame": 0.3, + "value": { + "__uuid__": "414628f0-13ec-4f01-83a0-b94f6a13fff1" + } + }, + { + "frame": 0.43333333333333335, + "value": { + "__uuid__": "c494965a-e7e6-4c99-ac61-60642e6247dc" + } + }, + { + "frame": 0.5666666666666667, + "value": { + "__uuid__": "04cafb17-39ab-4f2b-9830-3eaf42cab254" + } + }, + { + "frame": 0.7166666666666667, + "value": { + "__uuid__": "fd9c7d8a-1038-4cab-a0e6-699e404701db" + } + }, + { + "frame": 0.8333333333333334, + "value": { + "__uuid__": "2447c6b3-292b-43b4-84e5-acc35df0c1f5" + } + }, + { + "frame": 0.9333333333333333, + "value": { + "__uuid__": "00275818-b9b6-41ab-a792-f21ff10747fa" + } + }, + { + "frame": 0.9833333333333333, + "value": { + "__uuid__": "11a06f33-cdfa-46cf-aae4-41e72a6711c2" + } + } + ] + } + } + }, + "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/MonkGirl.plist b/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist index 771e272..cec6563 100644 --- a/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist +++ b/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist @@ -15,7 +15,7 @@ spriteSourceSize {62,92} textureRect - {{777,282},{62,92}} + {{551,127},{62,92}} textureRotated @@ -30,7 +30,7 @@ spriteSourceSize {77,99} textureRect - {{409,214},{77,99}} + {{93,594},{77,99}} textureRotated @@ -45,7 +45,7 @@ spriteSourceSize {112,99} textureRect - {{184,114},{112,99}} + {{0,359},{112,99}} textureRotated @@ -60,7 +60,7 @@ spriteSourceSize {96,100} textureRect - {{388,327},{96,100}} + {{240,88},{96,100}} textureRotated @@ -75,7 +75,322 @@ spriteSourceSize {62,92} textureRect - {{777,282},{62,92}} + {{551,127},{62,92}} + textureRotated + + + Atk2_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {58,97} + spriteSourceSize + {58,97} + textureRect + {{170,675},{58,97}} + textureRotated + + + Atk2_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {60,90} + spriteSourceSize + {60,90} + textureRect + {{743,537},{60,90}} + textureRotated + + + Atk2_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {84,96} + spriteSourceSize + {84,96} + textureRect + {{920,215},{84,96}} + textureRotated + + + Atk2_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {55,100} + spriteSourceSize + {55,100} + textureRect + {{302,365},{55,100}} + textureRotated + + + Atk2_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {63,100} + spriteSourceSize + {63,100} + textureRect + {{312,562},{63,100}} + textureRotated + + + Atk2_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {66,101} + spriteSourceSize + {66,101} + textureRect + {{915,299},{66,101}} + textureRotated + + + Atk2_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,95} + spriteSourceSize + {80,95} + textureRect + {{548,461},{80,95}} + textureRotated + + + Atk2_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {116,109} + spriteSourceSize + {116,109} + textureRect + {{0,0},{116,109}} + textureRotated + + + Atk2_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {102,96} + spriteSourceSize + {102,96} + textureRect + {{144,93},{102,96}} + textureRotated + + + Atk2_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {75,102} + spriteSourceSize + {75,102} + textureRect + {{170,573},{75,102}} + textureRotated + + + Atk3_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {51,131} + spriteSourceSize + {51,131} + textureRect + {{93,109},{51,131}} + textureRotated + + + Atk3_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {53,103} + spriteSourceSize + {53,103} + textureRect + {{162,470},{53,103}} + textureRotated + + + Atk3_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {74,100} + spriteSourceSize + {74,100} + textureRect + {{357,365},{74,100}} + textureRotated + + + Atk3_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {70,109} + spriteSourceSize + {70,109} + textureRect + {{442,127},{70,109}} + textureRotated + + + Atk3_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {131,93} + spriteSourceSize + {131,93} + textureRect + {{0,109},{131,93}} + textureRotated + + + Atk3_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {89,119} + spriteSourceSize + {89,119} + textureRect + {{0,240},{89,119}} + textureRotated + + + Atk3_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {88,119} + spriteSourceSize + {88,119} + textureRect + {{236,0},{88,119}} + textureRotated + + + Atk3_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {57,120} + spriteSourceSize + {57,120} + textureRect + {{959,0},{57,120}} + textureRotated + + + Atk3_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {59,122} + spriteSourceSize + {59,122} + textureRect + {{243,350},{59,122}} + textureRotated + + + Atk3_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,111} + spriteSourceSize + {80,111} + textureRect + {{163,350},{80,111}} + textureRotated + + + Atk3_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {82,110} + spriteSourceSize + {82,110} + textureRect + {{153,240},{82,110}} textureRotated @@ -90,7 +405,7 @@ spriteSourceSize {62,97} textureRect - {{419,106},{62,97}} + {{305,465},{62,97}} textureRotated @@ -105,7 +420,7 @@ spriteSourceSize {73,95} textureRect - {{727,478},{73,95}} + {{943,120},{73,95}} textureRotated @@ -120,9 +435,9 @@ spriteSourceSize {90,89} textureRect - {{800,472},{90,89}} + {{706,356},{90,89}} textureRotated - + BlownUp1_0.png @@ -135,9 +450,9 @@ spriteSourceSize {95,80} textureRect - {{555,193},{95,80}} + {{564,653},{95,80}} textureRotated - + BlownUp1_1.png @@ -150,7 +465,7 @@ spriteSourceSize {80,95} textureRect - {{554,290},{80,95}} + {{578,556},{80,95}} textureRotated @@ -165,7 +480,7 @@ spriteSourceSize {83,92} textureRect - {{748,378},{83,92}} + {{623,349},{83,92}} textureRotated @@ -180,9 +495,9 @@ spriteSourceSize {92,83} textureRect - {{900,58},{92,83}} + {{706,445},{92,83}} textureRotated - + GetUp1_0.png @@ -195,9 +510,9 @@ spriteSourceSize {112,45} textureRect - {{259,0},{112,45}} + {{144,195},{112,45}} textureRotated - + GetUp1_1.png @@ -210,9 +525,9 @@ spriteSourceSize {88,69} textureRect - {{919,318},{88,69}} + {{355,284},{88,69}} textureRotated - + GetUp1_2.png @@ -225,7 +540,7 @@ spriteSourceSize {91,90} textureRect - {{832,188},{91,90}} + {{215,472},{91,90}} textureRotated @@ -240,9 +555,9 @@ spriteSourceSize {120,93} textureRect - {{62,248},{120,93}} + {{116,0},{120,93}} textureRotated - + GetUp1_4.png @@ -255,7 +570,7 @@ spriteSourceSize {100,112} textureRect - {{155,233},{100,112}} + {{0,471},{100,112}} textureRotated @@ -270,7 +585,7 @@ spriteSourceSize {106,93} textureRect - {{316,221},{106,93}} + {{0,583},{106,93}} textureRotated @@ -285,9 +600,9 @@ spriteSourceSize {106,79} textureRect - {{340,108},{106,79}} + {{336,112},{106,79}} textureRotated - + GetUp1_7.png @@ -300,9 +615,9 @@ spriteSourceSize {73,87} textureRect - {{922,231},{73,87}} + {{289,191},{73,87}} textureRotated - + GetUp1_8.png @@ -315,7 +630,7 @@ spriteSourceSize {67,90} textureRect - {{889,472},{67,90}} + {{736,627},{67,90}} textureRotated @@ -330,9 +645,9 @@ spriteSourceSize {58,97} textureRect - {{433,0},{58,97}} + {{170,675},{58,97}} textureRotated - + Idle1_0.png @@ -345,7 +660,7 @@ spriteSourceSize {58,95} textureRect - {{685,95},{58,95}} + {{565,365},{58,95}} textureRotated @@ -360,7 +675,7 @@ spriteSourceSize {58,97} textureRect - {{481,97},{58,97}} + {{367,465},{58,97}} textureRotated @@ -375,9 +690,9 @@ spriteSourceSize {60,94} textureRect - {{772,188},{60,94}} + {{613,204},{60,94}} textureRotated - + Idle1_2.png @@ -390,7 +705,7 @@ spriteSourceSize {58,97} textureRect - {{491,0},{58,97}} + {{375,562},{58,97}} textureRotated @@ -405,7 +720,7 @@ spriteSourceSize {58,97} textureRect - {{399,427},{58,97}} + {{425,465},{58,97}} textureRotated @@ -420,9 +735,9 @@ spriteSourceSize {60,95} textureRect - {{635,191},{60,95}} + {{802,318},{60,95}} textureRotated - + Idle1_5.png @@ -435,7 +750,7 @@ spriteSourceSize {60,94} textureRect - {{818,94},{60,94}} + {{877,533},{60,94}} textureRotated @@ -450,7 +765,7 @@ spriteSourceSize {59,93} textureRect - {{609,480},{59,93}} + {{376,191},{59,93}} textureRotated @@ -465,9 +780,9 @@ spriteSourceSize {58,93} textureRect - {{900,0},{58,93}} + {{502,266},{58,93}} textureRotated - + Idle1_8.png @@ -480,7 +795,7 @@ spriteSourceSize {59,93} textureRect - {{668,480},{59,93}} + {{443,266},{59,93}} textureRotated @@ -495,7 +810,7 @@ spriteSourceSize {60,94} textureRect - {{840,0},{60,94}} + {{877,627},{60,94}} textureRotated @@ -510,7 +825,7 @@ spriteSourceSize {77,68} textureRect - {{532,505},{77,68}} + {{937,652},{77,68}} textureRotated @@ -525,9 +840,9 @@ spriteSourceSize {118,76} textureRect - {{64,0},{118,76}} + {{355,0},{118,76}} textureRotated - + InAirAtk1_10.png @@ -540,9 +855,9 @@ spriteSourceSize {104,65} textureRect - {{267,442},{104,65}} + {{707,213},{104,65}} textureRotated - + InAirAtk1_11.png @@ -555,9 +870,9 @@ spriteSourceSize {80,66} textureRect - {{839,279},{80,66}} + {{289,264},{80,66}} textureRotated - + InAirAtk1_12.png @@ -570,7 +885,7 @@ spriteSourceSize {102,67} textureRect - {{332,431},{102,67}} + {{245,563},{102,67}} textureRotated @@ -585,7 +900,7 @@ spriteSourceSize {79,66} textureRect - {{839,345},{79,66}} + {{937,365},{79,66}} textureRotated @@ -600,9 +915,9 @@ spriteSourceSize {124,64} textureRect - {{0,0},{124,64}} + {{711,0},{124,64}} textureRotated - + InAirAtk1_4.png @@ -615,9 +930,9 @@ spriteSourceSize {104,64} textureRect - {{324,327},{104,64}} + {{811,254},{104,64}} textureRotated - + InAirAtk1_5.png @@ -630,7 +945,7 @@ spriteSourceSize {79,61} textureRect - {{831,411},{79,61}} + {{937,497},{79,61}} textureRotated @@ -645,9 +960,9 @@ spriteSourceSize {124,64} textureRect - {{0,124},{124,64}} + {{835,0},{124,64}} textureRotated - + InAirAtk1_7.png @@ -660,9 +975,9 @@ spriteSourceSize {106,67} textureRect - {{366,0},{106,67}} + {{814,187},{106,67}} textureRotated - + InAirAtk1_8.png @@ -675,7 +990,7 @@ spriteSourceSize {79,66} textureRect - {{918,406},{79,66}} + {{937,431},{79,66}} textureRotated @@ -690,7 +1005,7 @@ spriteSourceSize {118,64} textureRect - {{64,118},{118,64}} + {{89,240},{118,64}} textureRotated @@ -705,9 +1020,9 @@ spriteSourceSize {71,119} textureRect - {{66,368},{71,119}} + {{473,0},{71,119}} textureRotated - + InAirIdle1_1.png @@ -720,9 +1035,9 @@ spriteSourceSize {71,119} textureRect - {{137,368},{71,119}} + {{592,0},{71,119}} textureRotated - + InAirIdle1_10.png @@ -735,9 +1050,9 @@ spriteSourceSize {55,114} textureRect - {{140,0},{55,114}} + {{593,71},{55,114}} textureRotated - + InAirIdle1_11.png @@ -750,7 +1065,7 @@ spriteSourceSize {62,124} textureRect - {{0,248},{62,124}} + {{100,470},{62,124}} textureRotated @@ -765,7 +1080,7 @@ spriteSourceSize {74,90} textureRect - {{922,141},{74,90}} + {{803,628},{74,90}} textureRotated @@ -780,7 +1095,7 @@ spriteSourceSize {110,54} textureRect - {{208,345},{110,54}} + {{235,240},{110,54}} textureRotated @@ -795,9 +1110,9 @@ spriteSourceSize {85,88} textureRect - {{95,487},{85,88}} + {{658,537},{85,88}} textureRotated - + InAirIdle1_5.png @@ -810,7 +1125,7 @@ spriteSourceSize {64,112} textureRect - {{195,0},{64,112}} + {{99,358},{64,112}} textureRotated @@ -825,9 +1140,9 @@ spriteSourceSize {62,107} textureRect - {{262,335},{62,107}} + {{707,151},{62,107}} textureRotated - + InAirIdle1_7.png @@ -840,7 +1155,7 @@ spriteSourceSize {85,84} textureRect - {{183,487},{85,84}} + {{623,264},{85,84}} textureRotated @@ -855,9 +1170,9 @@ spriteSourceSize {109,61} textureRect - {{255,226},{109,61}} + {{834,64},{109,61}} textureRotated - + InAirIdle1_9.png @@ -870,7 +1185,7 @@ spriteSourceSize {78,95} textureRect - {{0,495},{78,95}} + {{707,278},{78,95}} textureRotated @@ -885,9 +1200,9 @@ spriteSourceSize {115,56} textureRect - {{128,118},{115,56}} + {{478,71},{115,56}} textureRotated - + LayDown1_1.png @@ -900,9 +1215,9 @@ spriteSourceSize {109,57} textureRect - {{283,112},{109,57}} + {{707,94},{109,57}} textureRotated - + LayDown1_2.png @@ -915,9 +1230,9 @@ spriteSourceSize {108,62} textureRect - {{304,0},{108,62}} + {{816,125},{108,62}} textureRotated - + LayDown1_3.png @@ -930,9 +1245,9 @@ spriteSourceSize {123,36} textureRect - {{0,372},{123,36}} + {{355,76},{123,36}} textureRotated - + LayDown1_4.png @@ -945,9 +1260,9 @@ spriteSourceSize {123,30} textureRect - {{36,372},{123,30}} + {{711,64},{123,30}} textureRotated - + Walking_0.png @@ -960,7 +1275,7 @@ spriteSourceSize {78,95} textureRect - {{607,96},{78,95}} + {{628,441},{78,95}} textureRotated @@ -975,7 +1290,7 @@ spriteSourceSize {75,96} textureRect - {{457,427},{75,96}} + {{433,562},{75,96}} textureRotated @@ -990,7 +1305,7 @@ spriteSourceSize {65,96} textureRect - {{549,0},{65,96}} + {{431,365},{65,96}} textureRotated @@ -1005,7 +1320,7 @@ spriteSourceSize {65,96} textureRect - {{532,409},{65,96}} + {{483,461},{65,96}} textureRotated @@ -1020,9 +1335,9 @@ spriteSourceSize {74,95} textureRect - {{634,288},{74,95}} + {{375,659},{74,95}} textureRotated - + Walking_13.png @@ -1035,9 +1350,9 @@ spriteSourceSize {75,94} textureRect - {{743,94},{75,94}} + {{470,658},{75,94}} textureRotated - + Walking_14.png @@ -1050,7 +1365,7 @@ spriteSourceSize {70,94} textureRect - {{770,0},{70,94}} + {{937,558},{70,94}} textureRotated @@ -1065,9 +1380,9 @@ spriteSourceSize {78,94} textureRect - {{692,0},{78,94}} + {{613,126},{78,94}} textureRotated - + Walking_2.png @@ -1080,7 +1395,7 @@ spriteSourceSize {69,96} textureRect - {{486,194},{69,96}} + {{496,365},{69,96}} textureRotated @@ -1095,7 +1410,7 @@ spriteSourceSize {70,96} textureRect - {{484,313},{70,96}} + {{508,557},{70,96}} textureRotated @@ -1110,9 +1425,9 @@ spriteSourceSize {78,95} textureRect - {{614,0},{78,95}} + {{796,378},{78,95}} textureRotated - + Walking_5.png @@ -1125,9 +1440,9 @@ spriteSourceSize {77,95} textureRect - {{597,385},{77,95}} + {{789,456},{77,95}} textureRotated - + Walking_6.png @@ -1140,9 +1455,9 @@ spriteSourceSize {69,94} textureRect - {{708,284},{69,94}} + {{435,197},{69,94}} textureRotated - + Walking_7.png @@ -1155,7 +1470,7 @@ spriteSourceSize {77,94} textureRect - {{695,190},{77,94}} + {{659,625},{77,94}} textureRotated @@ -1170,7 +1485,7 @@ spriteSourceSize {74,95} textureRect - {{674,383},{74,95}} + {{803,533},{74,95}} textureRotated @@ -1185,9 +1500,9 @@ spriteSourceSize {68,96} textureRect - {{539,97},{68,96}} + {{267,665},{68,96}} textureRotated - + metadata @@ -1201,9 +1516,9 @@ realTextureFileName MonkGirl.png size - {997,573} + {1016,733} smartupdate - $TexturePacker:SmartUpdate:6bd11d0c92774f15794781ac24a65022:8606ee60ad6f31ae3d83c8f9fd35f0b6:7b088363a1f16e4f4ff313aecc52227b$ + $TexturePacker:SmartUpdate:278efbee9ca246d0ea7209b427040c71:0ee1cca010fb9c74ab24ae28995c20de:7b088363a1f16e4f4ff313aecc52227b$ textureFileName MonkGirl.png diff --git a/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist.meta b/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist.meta index 1ee2958..2b6411b 100644 --- a/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist.meta +++ b/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist.meta @@ -3,8 +3,8 @@ "uuid": "725c90f9-56f8-48ea-9159-4d2949cd3ce0", "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "size": { - "width": 997, - "height": 573 + "width": 1016, + "height": 733 }, "type": "Texture Packer", "subMetas": { @@ -17,8 +17,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 777, - "trimY": 282, + "trimX": 551, + "trimY": 127, "width": 62, "height": 92, "rawWidth": 62, @@ -39,8 +39,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 409, - "trimY": 214, + "trimX": 93, + "trimY": 594, "width": 77, "height": 99, "rawWidth": 77, @@ -61,8 +61,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 184, - "trimY": 114, + "trimX": 0, + "trimY": 359, "width": 112, "height": 99, "rawWidth": 112, @@ -83,8 +83,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 388, - "trimY": 327, + "trimX": 240, + "trimY": 88, "width": 96, "height": 100, "rawWidth": 96, @@ -105,8 +105,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 777, - "trimY": 282, + "trimX": 551, + "trimY": 127, "width": 62, "height": 92, "rawWidth": 62, @@ -118,6 +118,468 @@ "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 170, + "trimY": 675, + "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": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 743, + "trimY": 537, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 920, + "trimY": 215, + "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": 302, + "trimY": 365, + "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": 312, + "trimY": 562, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 915, + "trimY": 299, + "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": 548, + "trimY": 461, + "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": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "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": 144, + "trimY": 93, + "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": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 170, + "trimY": 573, + "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": 93, + "trimY": 109, + "width": 51, + "height": 131, + "rawWidth": 51, + "rawHeight": 131, + "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": 162, + "trimY": 470, + "width": 53, + "height": 103, + "rawWidth": 53, + "rawHeight": 103, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_10.png": { + "ver": "1.0.4", + "uuid": "4e1a3e61-dc3e-4de1-9385-bce2c5f54764", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 357, + "trimY": 365, + "width": 74, + "height": 100, + "rawWidth": 74, + "rawHeight": 100, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 442, + "trimY": 127, + "width": 70, + "height": 109, + "rawWidth": 70, + "rawHeight": 109, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 109, + "width": 131, + "height": 93, + "rawWidth": 131, + "rawHeight": 93, + "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": 240, + "width": 89, + "height": 119, + "rawWidth": 89, + "rawHeight": 119, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 236, + "trimY": 0, + "width": 88, + "height": 119, + "rawWidth": 88, + "rawHeight": 119, + "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": 959, + "trimY": 0, + "width": 57, + "height": 120, + "rawWidth": 57, + "rawHeight": 120, + "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": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 243, + "trimY": 350, + "width": 59, + "height": 122, + "rawWidth": 59, + "rawHeight": 122, + "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": 163, + "trimY": 350, + "width": 80, + "height": 111, + "rawWidth": 80, + "rawHeight": 111, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_9.png": { + "ver": "1.0.4", + "uuid": "11a06f33-cdfa-46cf-aae4-41e72a6711c2", + "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 153, + "trimY": 240, + "width": 82, + "height": 110, + "rawWidth": 82, + "rawHeight": 110, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, "Atked1_0.png": { "ver": "1.0.4", "uuid": "df446561-abb9-4d91-aa79-636bdf3d9335", @@ -127,8 +589,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 419, - "trimY": 106, + "trimX": 305, + "trimY": 465, "width": 62, "height": 97, "rawWidth": 62, @@ -149,8 +611,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 727, - "trimY": 478, + "trimX": 943, + "trimY": 120, "width": 73, "height": 95, "rawWidth": 73, @@ -168,11 +630,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 800, - "trimY": 472, + "trimX": 706, + "trimY": 356, "width": 90, "height": 89, "rawWidth": 90, @@ -190,11 +652,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 555, - "trimY": 193, + "trimX": 564, + "trimY": 653, "width": 95, "height": 80, "rawWidth": 95, @@ -215,8 +677,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 554, - "trimY": 290, + "trimX": 578, + "trimY": 556, "width": 80, "height": 95, "rawWidth": 80, @@ -237,8 +699,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 748, - "trimY": 378, + "trimX": 623, + "trimY": 349, "width": 83, "height": 92, "rawWidth": 83, @@ -256,11 +718,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 900, - "trimY": 58, + "trimX": 706, + "trimY": 445, "width": 92, "height": 83, "rawWidth": 92, @@ -278,11 +740,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 259, - "trimY": 0, + "trimX": 144, + "trimY": 195, "width": 112, "height": 45, "rawWidth": 112, @@ -300,11 +762,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 919, - "trimY": 318, + "trimX": 355, + "trimY": 284, "width": 88, "height": 69, "rawWidth": 88, @@ -325,8 +787,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 832, - "trimY": 188, + "trimX": 215, + "trimY": 472, "width": 91, "height": 90, "rawWidth": 91, @@ -344,11 +806,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 62, - "trimY": 248, + "trimX": 116, + "trimY": 0, "width": 120, "height": 93, "rawWidth": 120, @@ -369,8 +831,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 155, - "trimY": 233, + "trimX": 0, + "trimY": 471, "width": 100, "height": 112, "rawWidth": 100, @@ -391,8 +853,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 316, - "trimY": 221, + "trimX": 0, + "trimY": 583, "width": 106, "height": 93, "rawWidth": 106, @@ -410,11 +872,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 340, - "trimY": 108, + "trimX": 336, + "trimY": 112, "width": 106, "height": 79, "rawWidth": 106, @@ -432,11 +894,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 922, - "trimY": 231, + "trimX": 289, + "trimY": 191, "width": 73, "height": 87, "rawWidth": 73, @@ -457,8 +919,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 889, - "trimY": 472, + "trimX": 736, + "trimY": 627, "width": 67, "height": 90, "rawWidth": 67, @@ -476,11 +938,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 433, - "trimY": 0, + "trimX": 170, + "trimY": 675, "width": 58, "height": 97, "rawWidth": 58, @@ -501,8 +963,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 685, - "trimY": 95, + "trimX": 565, + "trimY": 365, "width": 58, "height": 95, "rawWidth": 58, @@ -523,8 +985,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 481, - "trimY": 97, + "trimX": 367, + "trimY": 465, "width": 58, "height": 97, "rawWidth": 58, @@ -542,11 +1004,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 772, - "trimY": 188, + "trimX": 613, + "trimY": 204, "width": 60, "height": 94, "rawWidth": 60, @@ -567,8 +1029,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 491, - "trimY": 0, + "trimX": 375, + "trimY": 562, "width": 58, "height": 97, "rawWidth": 58, @@ -589,8 +1051,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 399, - "trimY": 427, + "trimX": 425, + "trimY": 465, "width": 58, "height": 97, "rawWidth": 58, @@ -608,11 +1070,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 635, - "trimY": 191, + "trimX": 802, + "trimY": 318, "width": 60, "height": 95, "rawWidth": 60, @@ -633,8 +1095,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 818, - "trimY": 94, + "trimX": 877, + "trimY": 533, "width": 60, "height": 94, "rawWidth": 60, @@ -655,8 +1117,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 609, - "trimY": 480, + "trimX": 376, + "trimY": 191, "width": 59, "height": 93, "rawWidth": 59, @@ -674,11 +1136,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 900, - "trimY": 0, + "trimX": 502, + "trimY": 266, "width": 58, "height": 93, "rawWidth": 58, @@ -699,8 +1161,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 668, - "trimY": 480, + "trimX": 443, + "trimY": 266, "width": 59, "height": 93, "rawWidth": 59, @@ -721,8 +1183,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 840, - "trimY": 0, + "trimX": 877, + "trimY": 627, "width": 60, "height": 94, "rawWidth": 60, @@ -743,8 +1205,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 532, - "trimY": 505, + "trimX": 937, + "trimY": 652, "width": 77, "height": 68, "rawWidth": 77, @@ -762,10 +1224,10 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 64, + "trimX": 355, "trimY": 0, "width": 118, "height": 76, @@ -784,11 +1246,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 267, - "trimY": 442, + "trimX": 707, + "trimY": 213, "width": 104, "height": 65, "rawWidth": 104, @@ -806,11 +1268,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 839, - "trimY": 279, + "trimX": 289, + "trimY": 264, "width": 80, "height": 66, "rawWidth": 80, @@ -831,8 +1293,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 332, - "trimY": 431, + "trimX": 245, + "trimY": 563, "width": 102, "height": 67, "rawWidth": 102, @@ -853,8 +1315,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 839, - "trimY": 345, + "trimX": 937, + "trimY": 365, "width": 79, "height": 66, "rawWidth": 79, @@ -872,10 +1334,10 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 0, + "trimX": 711, "trimY": 0, "width": 124, "height": 64, @@ -894,11 +1356,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 324, - "trimY": 327, + "trimX": 811, + "trimY": 254, "width": 104, "height": 64, "rawWidth": 104, @@ -919,8 +1381,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 831, - "trimY": 411, + "trimX": 937, + "trimY": 497, "width": 79, "height": 61, "rawWidth": 79, @@ -938,11 +1400,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 0, - "trimY": 124, + "trimX": 835, + "trimY": 0, "width": 124, "height": 64, "rawWidth": 124, @@ -960,11 +1422,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 366, - "trimY": 0, + "trimX": 814, + "trimY": 187, "width": 106, "height": 67, "rawWidth": 106, @@ -985,8 +1447,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 918, - "trimY": 406, + "trimX": 937, + "trimY": 431, "width": 79, "height": 66, "rawWidth": 79, @@ -1007,8 +1469,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 64, - "trimY": 118, + "trimX": 89, + "trimY": 240, "width": 118, "height": 64, "rawWidth": 118, @@ -1026,11 +1488,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 66, - "trimY": 368, + "trimX": 473, + "trimY": 0, "width": 71, "height": 119, "rawWidth": 71, @@ -1048,11 +1510,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 137, - "trimY": 368, + "trimX": 592, + "trimY": 0, "width": 71, "height": 119, "rawWidth": 71, @@ -1070,11 +1532,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 140, - "trimY": 0, + "trimX": 593, + "trimY": 71, "width": 55, "height": 114, "rawWidth": 55, @@ -1095,8 +1557,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 0, - "trimY": 248, + "trimX": 100, + "trimY": 470, "width": 62, "height": 124, "rawWidth": 62, @@ -1117,8 +1579,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 922, - "trimY": 141, + "trimX": 803, + "trimY": 628, "width": 74, "height": 90, "rawWidth": 74, @@ -1139,8 +1601,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 208, - "trimY": 345, + "trimX": 235, + "trimY": 240, "width": 110, "height": 54, "rawWidth": 110, @@ -1158,11 +1620,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 95, - "trimY": 487, + "trimX": 658, + "trimY": 537, "width": 85, "height": 88, "rawWidth": 85, @@ -1183,8 +1645,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 195, - "trimY": 0, + "trimX": 99, + "trimY": 358, "width": 64, "height": 112, "rawWidth": 64, @@ -1202,11 +1664,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 262, - "trimY": 335, + "trimX": 707, + "trimY": 151, "width": 62, "height": 107, "rawWidth": 62, @@ -1227,8 +1689,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 183, - "trimY": 487, + "trimX": 623, + "trimY": 264, "width": 85, "height": 84, "rawWidth": 85, @@ -1246,11 +1708,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 255, - "trimY": 226, + "trimX": 834, + "trimY": 64, "width": 109, "height": 61, "rawWidth": 109, @@ -1271,8 +1733,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 0, - "trimY": 495, + "trimX": 707, + "trimY": 278, "width": 78, "height": 95, "rawWidth": 78, @@ -1290,11 +1752,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 128, - "trimY": 118, + "trimX": 478, + "trimY": 71, "width": 115, "height": 56, "rawWidth": 115, @@ -1312,11 +1774,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 283, - "trimY": 112, + "trimX": 707, + "trimY": 94, "width": 109, "height": 57, "rawWidth": 109, @@ -1334,11 +1796,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 304, - "trimY": 0, + "trimX": 816, + "trimY": 125, "width": 108, "height": 62, "rawWidth": 108, @@ -1356,11 +1818,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 0, - "trimY": 372, + "trimX": 355, + "trimY": 76, "width": 123, "height": 36, "rawWidth": 123, @@ -1378,11 +1840,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 36, - "trimY": 372, + "trimX": 711, + "trimY": 64, "width": 123, "height": 30, "rawWidth": 123, @@ -1403,8 +1865,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 607, - "trimY": 96, + "trimX": 628, + "trimY": 441, "width": 78, "height": 95, "rawWidth": 78, @@ -1425,8 +1887,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 457, - "trimY": 427, + "trimX": 433, + "trimY": 562, "width": 75, "height": 96, "rawWidth": 75, @@ -1447,8 +1909,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 549, - "trimY": 0, + "trimX": 431, + "trimY": 365, "width": 65, "height": 96, "rawWidth": 65, @@ -1469,8 +1931,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 532, - "trimY": 409, + "trimX": 483, + "trimY": 461, "width": 65, "height": 96, "rawWidth": 65, @@ -1488,11 +1950,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 634, - "trimY": 288, + "trimX": 375, + "trimY": 659, "width": 74, "height": 95, "rawWidth": 74, @@ -1510,11 +1972,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 743, - "trimY": 94, + "trimX": 470, + "trimY": 658, "width": 75, "height": 94, "rawWidth": 75, @@ -1535,8 +1997,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 770, - "trimY": 0, + "trimX": 937, + "trimY": 558, "width": 70, "height": 94, "rawWidth": 70, @@ -1554,11 +2016,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 692, - "trimY": 0, + "trimX": 613, + "trimY": 126, "width": 78, "height": 94, "rawWidth": 78, @@ -1579,8 +2041,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 486, - "trimY": 194, + "trimX": 496, + "trimY": 365, "width": 69, "height": 96, "rawWidth": 69, @@ -1601,8 +2063,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 484, - "trimY": 313, + "trimX": 508, + "trimY": 557, "width": 70, "height": 96, "rawWidth": 70, @@ -1620,11 +2082,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 614, - "trimY": 0, + "trimX": 796, + "trimY": 378, "width": 78, "height": 95, "rawWidth": 78, @@ -1642,11 +2104,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 597, - "trimY": 385, + "trimX": 789, + "trimY": 456, "width": 77, "height": 95, "rawWidth": 77, @@ -1664,11 +2126,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 708, - "trimY": 284, + "trimX": 435, + "trimY": 197, "width": 69, "height": 94, "rawWidth": 69, @@ -1689,8 +2151,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 695, - "trimY": 190, + "trimX": 659, + "trimY": 625, "width": 77, "height": 94, "rawWidth": 77, @@ -1711,8 +2173,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 674, - "trimY": 383, + "trimX": 803, + "trimY": 533, "width": 74, "height": 95, "rawWidth": 74, @@ -1730,11 +2192,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 539, - "trimY": 97, + "trimX": 267, + "trimY": 665, "width": 68, "height": 96, "rawWidth": 68, diff --git a/frontend/assets/resources/animation/MonkGirl/MonkGirl.png b/frontend/assets/resources/animation/MonkGirl/MonkGirl.png index 4a3db48cd0f0e6ac106a2832b73a180e8cf6dcea..dc9467c9b141b704893c6ba82cce0081d96f6449 100644 GIT binary patch literal 95461 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 literal 76232 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 M07*qoM6N<$f_Ba+f&c&j diff --git a/frontend/assets/resources/map/dungeon/map.tmx b/frontend/assets/resources/map/dungeon/map.tmx index b7e54a3..6e24f2a 100644 --- a/frontend/assets/resources/map/dungeon/map.tmx +++ b/frontend/assets/resources/map/dungeon/map.tmx @@ -9,10 +9,10 @@ - + - + diff --git a/frontend/assets/resources/prefabs/ControlledCharacter.prefab b/frontend/assets/resources/prefabs/ControlledCharacter.prefab index 861ecbe..1e75df0 100644 --- a/frontend/assets/resources/prefabs/ControlledCharacter.prefab +++ b/frontend/assets/resources/prefabs/ControlledCharacter.prefab @@ -933,7 +933,7 @@ "__id__": 11 }, "_children": [], - "_active": false, + "_active": true, "_components": [ { "__id__": 23 @@ -1034,6 +1034,12 @@ }, { "__uuid__": "7cb4d395-c68f-4643-9e2e-8cb8e200d3a5" + }, + { + "__uuid__": "e6e1d62a-de7d-4fe7-858c-2d2725b7c2e8" + }, + { + "__uuid__": "e8247e2a-1b5b-4618-86f8-224b25246b55" } ], "playOnLoad": false, diff --git a/frontend/assets/scripts/AttackingCharacter.js b/frontend/assets/scripts/AttackingCharacter.js index 4d432e6..672b997 100644 --- a/frontend/assets/scripts/AttackingCharacter.js +++ b/frontend/assets/scripts/AttackingCharacter.js @@ -12,6 +12,8 @@ window.ATK_CHARACTER_STATE = { BlownUp1: [8, "BlownUp1"], LayDown1: [9, "LayDown1"], GetUp1: [10, "GetUp1"], + Atk2: [11, "Atk2"], + Atk3: [12, "Atk3"], }; window.ATK_CHARACTER_STATE_ARR = []; diff --git a/frontend/assets/scripts/Map.js b/frontend/assets/scripts/Map.js index 61c3de1..9a5dc06 100644 --- a/frontend/assets/scripts/Map.js +++ b/frontend/assets/scripts/Map.js @@ -586,13 +586,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.framesInChState, 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.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.originatedRenderFrameId, pbBullet.offenderJoinIndex, pbBullet.startupFrames, pbBullet.cancellableStFrame, pbBullet.cancellableEdFrame, pbBullet.activeFrames, pbBullet.hitStunFrames, pbBullet.blockStunFrames, pbBullet.pushbackX, pbBullet.pushbackY, pbBullet.damage, pbBullet.selfLockVelX, pbBullet.selfLockVelY, pbBullet.hitboxOffsetX, pbBullet.hitboxOffsetY, pbBullet.hitboxSizeX, pbBullet.hitboxSizeY, pbBullet.blowUp); + 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); } @@ -832,12 +832,17 @@ batchInputFrameIdRange=[${batch[0].inputFrameId}, ${batch[batch.length - 1].inpu const chConfig = self.chConfigsOrderedByJoinIndex[joinIndex - 1]; playerScriptIns.setSpecies(chConfig.SpeciesName); + if (1 == joinIndex) { + newPlayerNode.color = cc.Color.RED; + } else { + newPlayerNode.color = cc.Color.BLUE; + } + 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 [halfColliderWidth, halfColliderHeight] = gopkgs.VirtualGridToWorldPos(colliderRadius, colliderRadius + colliderRadius); // avoid multiplying const colliderWidth = halfColliderWidth + halfColliderWidth, colliderHeight = halfColliderHeight + halfColliderHeight; // avoid multiplying @@ -846,7 +851,7 @@ batchInputFrameIdRange=[${batch[0].inputFrameId}, ${batch[batch.length - 1].inpu 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 collider: joinIndex=${joinIndex}`); safelyAddChild(self.node, newPlayerNode); setLocalZOrder(newPlayerNode, 5); diff --git a/frontend/assets/scripts/OfflineMap.js b/frontend/assets/scripts/OfflineMap.js index e8892eb..166ffde 100644 --- a/frontend/assets/scripts/OfflineMap.js +++ b/frontend/assets/scripts/OfflineMap.js @@ -123,7 +123,9 @@ cc.Class({ } 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, @@ -134,17 +136,32 @@ cc.Class({ virtualGridX: p1Vpos[0], virtualGridY: p1Vpos[1], speed: speedV[0], - colliderRadius: 12, + colliderRadius: colliderRadiusV[0], characterState: window.ATK_CHARACTER_STATE.InAirIdle1NoJump[0], framesToRecover: 0, - dirX: 0, + dirX: +2, + dirY: 0, + velX: 0, + velY: 0, + inAir: true, + }), + window.pb.protos.PlayerDownsync.create({ + id: 11, + joinIndex: 2, + virtualGridX: p2Vpos[0], + virtualGridY: p2Vpos[1], + speed: speedV[0], + colliderRadius: colliderRadiusV[0], + characterState: window.ATK_CHARACTER_STATE.InAirIdle1NoJump[0], + framesToRecover: 0, + dirX: -2, dirY: 0, velX: 0, velY: 0, inAir: true, }), ], - speciesIdList: [0], + speciesIdList: [0, 0], }); self.selfPlayerInfo = { diff --git a/jsexport/battle/battle.go b/jsexport/battle/battle.go index d93b8ca..e59d3e9 100644 --- a/jsexport/battle/battle.go +++ b/jsexport/battle/battle.go @@ -7,6 +7,7 @@ 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) @@ -26,6 +27,9 @@ const ( SNAP_INTO_PLATFORM_OVERLAP = float64(0.1) SNAP_INTO_PLATFORM_THRESHOLD = float64(0.5) + + NO_SKILL = int32(-1) + NO_SKILL_HIT = 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. @@ -53,6 +57,9 @@ const ( 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) ) var inAirSet = map[int32]bool{ @@ -63,6 +70,22 @@ var inAirSet = map[int32]bool{ 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{} + func ConvertToInputFrameId(renderFrameId int32, inputDelayFrames int32, inputScaleFrames uint32) int32 { if renderFrameId < inputDelayFrames { return 0 @@ -329,6 +352,10 @@ func deriveOpPattern(currPlayerDownsync, thatPlayerInNextFrame *PlayerDownsync, 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 { @@ -337,11 +364,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]) @@ -349,20 +373,40 @@ func deriveOpPattern(currPlayerDownsync, thatPlayerInNextFrame *PlayerDownsync, prevBtnBLevel = prevDecodedInput.BtnBLevel } - if decodedInput.BtnBLevel > prevBtnBLevel { - if _, existent := inAirSet[currPlayerDownsync.CharacterState]; !existent { - 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 + } } } + /* + As long as the current "CharacterState" is not in "noOpSet", we have 2 cases where attacking is allowed: + 1. it happens when the player is IDLE or Walking, i.e. "0 == currPlayerDownsync.FramesToRecover", which is just the normal case + 2. it happens when the player is having non-empty "ActiveSkillId" which might be cancellable + */ patternId := PATTERN_ID_NO_OP if decodedInput.BtnALevel > prevBtnALevel { if currPlayerDownsync.InAir { - patternId = 1 + patternId = 255 } else { - patternId = 0 + patternId = 1 + } + } + + if PATTERN_ID_NO_OP != patternId && 0 < currPlayerDownsync.FramesToRecover { + // [WARN] Handle skill cancellation + patternId = PATTERN_ID_NO_OP // First, reset the patternId to no-op as it should be by default not cancelling anything + skillConfig := skills[int(currPlayerDownsync.ActiveSkillId)] + switch v := skillConfig.Hits[currPlayerDownsync.ActiveSkillHit].(type) { + case *MeleeBullet: + if v.CancellableStFrame <= currPlayerDownsync.FramesInChState && currPlayerDownsync.FramesInChState < v.CancellableEdFrame { + patternId = int(currPlayerDownsync.ActiveSkillId + 1) // if "currPlayerDownsync.InAir", it won't map to a valid skill in the next step and thus act as PATTERN_ID_NO_OP + } } - effDx, effDy = 0, 0 // Most patterns/skills should not allow simultaneous movement } return patternId, jumpedOrNot, effDx, effDy @@ -394,6 +438,8 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer MaxHp: currPlayerDownsync.MaxHp, FramesToRecover: currPlayerDownsync.FramesToRecover - 1, FramesInChState: currPlayerDownsync.FramesInChState + 1, + ActiveSkillId: currPlayerDownsync.ActiveSkillId, + ActiveSkillHit: currPlayerDownsync.ActiveSkillHit, } if nextRenderFramePlayers[i].FramesToRecover < 0 { nextRenderFramePlayers[i].FramesToRecover = 0 @@ -411,9 +457,6 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer chConfig := chConfigsOrderedByJoinIndex[i] thatPlayerInNextFrame := nextRenderFramePlayers[i] patternId, jumpedOrNot, effDx, effDy := deriveOpPattern(currPlayerDownsync, thatPlayerInNextFrame, currRenderFrame, inputsBuffer, INPUT_DELAY_FRAMES, INPUT_SCALE_FRAMES) - if PATTERN_ID_UNABLE_TO_OP == patternId { - continue - } if jumpedOrNot { thatPlayerInNextFrame.VelY = int32(chConfig.JumpingInitVelY) @@ -423,8 +466,13 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer if PATTERN_ID_NO_OP != patternId { if skillId, existent := chConfig.PatternIdToSkillId[patternId]; existent { skillConfig := skills[skillId] + thatPlayerInNextFrame.ActiveSkillId = int32(skillId) + thatPlayerInNextFrame.ActiveSkillHit = 0 + + // TODO: Respect non-zero "selfLockVel" + // Hardcoded to use only the first hit for now - switch v := skillConfig.Hits[0].(type) { + switch v := skillConfig.Hits[thatPlayerInNextFrame.ActiveSkillHit].(type) { case *MeleeBullet: var newBullet MeleeBullet = *v // Copied primitive fields into an onstack variable newBullet.OriginatedRenderFrameId = currRenderFrame.Id @@ -432,21 +480,32 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer nextRenderFrameMeleeBullets = append(nextRenderFrameMeleeBullets, &newBullet) thatPlayerInNextFrame.FramesToRecover = skillConfig.RecoveryFrames } - thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_ATK1 + + // TODO: How to differentiate skill cancellable among different characters, e.g. some characters might be allowed to have 4-cancellation-combo or more? + switch skillId { + case 1: + thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_ATK1 + case 2: + thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_ATK2 + case 3: + thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_ATK3 + } if false == currPlayerDownsync.InAir { thatPlayerInNextFrame.VelX = 0 } + continue // Don't allow movement if skill is used } - continue } - 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 + } } } @@ -597,29 +656,21 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer if v.OffenderJoinIndex == t.JoinIndex { continue } + if _, existent := invinsibleSet[t.CharacterState]; existent { + continue + } overlapped, _, _, _ := CalcPushbacks(0, 0, bulletShape, defenderShape) if !overlapped { continue } - joinIndex := t.JoinIndex xfac := int32(1) // By now, straight Punch offset doesn't respect "y-axis" if 0 > offender.DirX { xfac = -xfac } - pushbackX, pushbackY := VirtualGridToWorldPos(-xfac*v.PushbackX, v.PushbackY) - - 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 - } - } - - effPushbacks[joinIndex-1].X += pushbackX - effPushbacks[joinIndex-1].Y += pushbackY + 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 { @@ -656,13 +707,22 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer } 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 = NO_SKILL + thatPlayerInNextFrame.ActiveSkillHit = NO_SKILL_HIT + } } return &RoomDownsyncFrame{ diff --git a/jsexport/battle/characterConfig.go b/jsexport/battle/characterConfig.go index b90ca92..4c30c39 100644 --- a/jsexport/battle/characterConfig.go +++ b/jsexport/battle/characterConfig.go @@ -35,37 +35,91 @@ var Characters = map[int]*CharacterConfig{ JumpingInitVelY: int32(float64(8) * WORLD_TO_VIRTUAL_GRID_RATIO), PatternIdToSkillId: map[int]int{ - 0: 1, // Atk1 - 1: 2, // InAirAtk1 + 1: 1, // Atk1 + 2: 2, // Atk2 + 3: 3, // Atk3 + 255: 255, // InAirAtk1 }, }, } var skills = map[int]*Skill{ 1: &Skill{ - RecoveryFrames: int32(34), - RecoveryFramesOnBlock: int32(34), - RecoveryFramesOnHit: int32(34), + RecoveryFrames: int32(20), + RecoveryFramesOnBlock: int32(20), + RecoveryFramesOnHit: int32(20), ReleaseTriggerType: int32(1), Hits: []interface{}{ &MeleeBullet{ Bullet: Bullet{ - StartupFrames: int32(5), - ActiveFrames: int32(10), - HitStunFrames: int32(18), - BlockStunFrames: int32(9), - Damage: int32(5), - PushbackX: int32(float64(8) * WORLD_TO_VIRTUAL_GRID_RATIO), - PushbackY: 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), + StartupFrames: int32(5), + ActiveFrames: int32(10), + HitStunFrames: int32(13), + BlockStunFrames: int32(9), + Damage: int32(5), + 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(8), + CancellableEdFrame: int32(20), + // TODO: Use non-zero "selfLockVel" }, }, }, }, 2: &Skill{ + RecoveryFrames: int32(36), + RecoveryFramesOnBlock: int32(36), + RecoveryFramesOnHit: int32(36), + ReleaseTriggerType: int32(1), + Hits: []interface{}{ + &MeleeBullet{ + Bullet: Bullet{ + StartupFrames: int32(3), + ActiveFrames: int32(20), + HitStunFrames: int32(18), + BlockStunFrames: int32(9), + Damage: int32(5), + 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(18), + CancellableEdFrame: int32(36), + }, + }, + }, + }, + 3: &Skill{ + RecoveryFrames: int32(60), + RecoveryFramesOnBlock: int32(60), + RecoveryFramesOnHit: int32(60), + ReleaseTriggerType: int32(1), + Hits: []interface{}{ + &MeleeBullet{ + Bullet: Bullet{ + StartupFrames: int32(1), + ActiveFrames: int32(30), + HitStunFrames: MAX_INT32, + BlockStunFrames: int32(9), + Damage: int32(10), + PushbackVelX: int32(float64(1) * WORLD_TO_VIRTUAL_GRID_RATIO), + PushbackVelY: int32(float64(4) * 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(34), RecoveryFramesOnBlock: int32(34), RecoveryFramesOnHit: int32(34), @@ -78,8 +132,8 @@ var skills = map[int]*Skill{ HitStunFrames: int32(18), BlockStunFrames: int32(9), Damage: int32(5), - PushbackX: int32(float64(6) * WORLD_TO_VIRTUAL_GRID_RATIO), - PushbackY: int32(0), + 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), diff --git a/jsexport/battle/room_downsync_frame.go b/jsexport/battle/room_downsync_frame.go index 76e2057..f411c0e 100644 --- a/jsexport/battle/room_downsync_frame.go +++ b/jsexport/battle/room_downsync_frame.go @@ -23,7 +23,7 @@ type PlayerDownsync struct { Speed int32 BattleState int32 JoinIndex int32 - ColliderRadius float64 + ColliderRadius int32 Removed bool Score int32 LastMoveGmtMillis int32 @@ -33,6 +33,9 @@ type PlayerDownsync struct { MaxHp int32 CharacterState int32 InAir bool + + ActiveSkillId int32 + ActiveSkillHit int32 } type InputFrameDecoded struct { @@ -63,8 +66,8 @@ type Bullet struct { // for defender HitStunFrames int32 BlockStunFrames int32 - PushbackX int32 - PushbackY int32 + PushbackVelX int32 + PushbackVelY int32 Damage int32 SelfLockVelX int32 diff --git a/jsexport/main.go b/jsexport/main.go index cc9d9da..3cc8ceb 100644 --- a/jsexport/main.go +++ b/jsexport/main.go @@ -42,7 +42,7 @@ func NewBarrierJs(boundary *Polygon2D) *js.Object { }) } -func NewPlayerDownsyncJs(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, framesToRecover, framesInChState, speed, battleState, characterState, joinIndex, hp, maxHp int32, inAir bool, colliderRadius float64) *js.Object { +func NewPlayerDownsyncJs(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, framesToRecover, framesInChState, speed, battleState, characterState, joinIndex, hp, maxHp, colliderRadius int32, inAir bool) *js.Object { return js.MakeWrapper(&PlayerDownsync{ Id: id, VirtualGridX: virtualGridX, @@ -64,7 +64,7 @@ func NewPlayerDownsyncJs(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, }) } -func NewMeleeBulletJs(originatedRenderFrameId, offenderJoinIndex, startupFrames, cancellableStFrame, cancellableEdFrame, activeFrames, hitStunFrames, blockStunFrames, pushbackX, pushbackY, damage, selfLockVelX, selfLockVelY, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY int32, blowUp bool) *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{ OriginatedRenderFrameId: originatedRenderFrameId, @@ -77,8 +77,8 @@ func NewMeleeBulletJs(originatedRenderFrameId, offenderJoinIndex, startupFrames, HitStunFrames: hitStunFrames, BlockStunFrames: blockStunFrames, - PushbackX: pushbackX, - PushbackY: pushbackY, + PushbackVelX: pushbackVelX, + PushbackVelY: pushbackVelY, Damage: damage, SelfLockVelX: selfLockVelX, From 4c64c1984c29c24ac178db956885e02463b86acc Mon Sep 17 00:00:00 2001 From: genxium Date: Sun, 1 Jan 2023 22:51:46 +0800 Subject: [PATCH 04/10] Enhanced multihit config. --- battle_srv/models/room.go | 11 +- frontend/assets/plugin_scripts/jsexport.js | 390 +-- .../assets/resources/animation/KnifeGirl.meta | 7 + .../resources/animation/KnifeGirl/Atk1.anim | 91 + .../animation/KnifeGirl/Atk1.anim.meta | 5 + .../resources/animation/KnifeGirl/Atk2.anim | 91 + .../animation/KnifeGirl/Atk2.anim.meta | 5 + .../resources/animation/KnifeGirl/Atk3.anim | 97 + .../animation/KnifeGirl/Atk3.anim.meta | 5 + .../resources/animation/KnifeGirl/Atked1.anim | 43 + .../animation/KnifeGirl/Atked1.anim.meta | 5 + .../animation/KnifeGirl/BlownUp1.anim | 43 + .../animation/KnifeGirl/BlownUp1.anim.meta | 5 + .../resources/animation/KnifeGirl/GetUp1.anim | 49 + .../animation/KnifeGirl/GetUp1.anim.meta | 5 + .../resources/animation/KnifeGirl/Idle1.anim | 85 + .../animation/KnifeGirl/Idle1.anim.meta | 5 + .../animation/KnifeGirl/InAirAtk1.anim | 55 + .../animation/KnifeGirl/InAirAtk1.anim.meta | 5 + .../animation/KnifeGirl/InAirAtked1.anim | 31 + .../animation/KnifeGirl/InAirAtked1.anim.meta | 5 + .../animation/KnifeGirl/InAirIdle1ByJump.anim | 79 + .../KnifeGirl/InAirIdle1ByJump.anim.meta | 5 + .../animation/KnifeGirl/InAirIdle1NoJump.anim | 25 + .../KnifeGirl/InAirIdle1NoJump.anim.meta | 5 + .../animation/KnifeGirl/KnifeGirl.plist | 1451 ++++++++++++ .../animation/KnifeGirl/KnifeGirl.plist.meta | 2102 +++++++++++++++++ .../animation/KnifeGirl/KnifeGirl.png | Bin 0 -> 111905 bytes .../animation/KnifeGirl/KnifeGirl.png.meta | 12 + .../animation/KnifeGirl/LayDown1.anim | 37 + .../animation/KnifeGirl/LayDown1.anim.meta | 5 + .../animation/KnifeGirl/Walking.anim | 97 + .../animation/KnifeGirl/Walking.anim.meta | 5 + .../resources/animation/MonkGirl/Atk1.anim | 8 +- .../resources/animation/MonkGirl/Atk3.anim | 30 +- .../animation/MonkGirl/MonkGirl.plist | 362 ++- .../animation/MonkGirl/MonkGirl.plist.meta | 594 +++-- .../resources/animation/MonkGirl/MonkGirl.png | Bin 95461 -> 97644 bytes .../prefabs/ControlledCharacter.prefab | 566 ++--- frontend/assets/scenes/offline_map.fire | 2 +- frontend/assets/scripts/AttackingCharacter.js | 4 +- frontend/assets/scripts/OfflineMap.js | 2 +- jsexport/battle/battle.go | 79 +- jsexport/battle/characterConfig.go | 224 +- jsexport/battle/room_downsync_frame.go | 5 +- 45 files changed, 5542 insertions(+), 1195 deletions(-) create mode 100644 frontend/assets/resources/animation/KnifeGirl.meta create mode 100644 frontend/assets/resources/animation/KnifeGirl/Atk1.anim create mode 100644 frontend/assets/resources/animation/KnifeGirl/Atk1.anim.meta create mode 100644 frontend/assets/resources/animation/KnifeGirl/Atk2.anim create mode 100644 frontend/assets/resources/animation/KnifeGirl/Atk2.anim.meta create mode 100644 frontend/assets/resources/animation/KnifeGirl/Atk3.anim create mode 100644 frontend/assets/resources/animation/KnifeGirl/Atk3.anim.meta create mode 100644 frontend/assets/resources/animation/KnifeGirl/Atked1.anim create mode 100644 frontend/assets/resources/animation/KnifeGirl/Atked1.anim.meta create mode 100644 frontend/assets/resources/animation/KnifeGirl/BlownUp1.anim create mode 100644 frontend/assets/resources/animation/KnifeGirl/BlownUp1.anim.meta create mode 100644 frontend/assets/resources/animation/KnifeGirl/GetUp1.anim create mode 100644 frontend/assets/resources/animation/KnifeGirl/GetUp1.anim.meta create mode 100644 frontend/assets/resources/animation/KnifeGirl/Idle1.anim create mode 100644 frontend/assets/resources/animation/KnifeGirl/Idle1.anim.meta create mode 100644 frontend/assets/resources/animation/KnifeGirl/InAirAtk1.anim create mode 100644 frontend/assets/resources/animation/KnifeGirl/InAirAtk1.anim.meta create mode 100644 frontend/assets/resources/animation/KnifeGirl/InAirAtked1.anim create mode 100644 frontend/assets/resources/animation/KnifeGirl/InAirAtked1.anim.meta create mode 100644 frontend/assets/resources/animation/KnifeGirl/InAirIdle1ByJump.anim create mode 100644 frontend/assets/resources/animation/KnifeGirl/InAirIdle1ByJump.anim.meta create mode 100644 frontend/assets/resources/animation/KnifeGirl/InAirIdle1NoJump.anim create mode 100644 frontend/assets/resources/animation/KnifeGirl/InAirIdle1NoJump.anim.meta create mode 100644 frontend/assets/resources/animation/KnifeGirl/KnifeGirl.plist create mode 100644 frontend/assets/resources/animation/KnifeGirl/KnifeGirl.plist.meta create mode 100644 frontend/assets/resources/animation/KnifeGirl/KnifeGirl.png create mode 100644 frontend/assets/resources/animation/KnifeGirl/KnifeGirl.png.meta create mode 100644 frontend/assets/resources/animation/KnifeGirl/LayDown1.anim create mode 100644 frontend/assets/resources/animation/KnifeGirl/LayDown1.anim.meta create mode 100644 frontend/assets/resources/animation/KnifeGirl/Walking.anim create mode 100644 frontend/assets/resources/animation/KnifeGirl/Walking.anim.meta diff --git a/battle_srv/models/room.go b/battle_srv/models/room.go index 68c9cd0..fe69ed2 100644 --- a/battle_srv/models/room.go +++ b/battle_srv/models/room.go @@ -92,7 +92,6 @@ type Room struct { Capacity int collisionSpaceOffsetX float64 collisionSpaceOffsetY float64 - playerOpPatternToSkillId map[int]int Players map[int32]*Player PlayersArr []*Player // ordered by joinIndex Space *resolv.Space @@ -397,18 +396,11 @@ 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 - } - // 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, } pR.RenderFrameBuffer.Put(kickoffFrameJs) @@ -1270,7 +1262,7 @@ func (pR *Room) applyInputFrameDownsyncDynamics(fromRenderFrameId int32, toRende } } - nextRenderFrame := battle.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(pR.InputsBuffer, currRenderFrame, pR.Space, pR.CollisionSysMap, 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.collisionSpaceOffsetX, pR.collisionSpaceOffsetY) pR.RenderFrameBuffer.Put(nextRenderFrame) pR.CurDynamicsRenderFrameId++ } @@ -1467,7 +1459,6 @@ 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 } diff --git a/frontend/assets/plugin_scripts/jsexport.js b/frontend/assets/plugin_scripts/jsexport.js index 601ee24..1d8605f 100644 --- a/frontend/assets/plugin_scripts/jsexport.js +++ b/frontend/assets/plugin_scripts/jsexport.js @@ -4724,7 +4724,7 @@ $packages["resolv"] = (function() { return $pkg; })(); $packages["jsexport/battle"] = (function() { - var $pkg = {}, $init, math, resolv, Vec2D, Polygon2D, PlayerDownsync, InputFrameDecoded, Barrier, Bullet, MeleeBullet, FireballBullet, Skill, RoomDownsyncFrame, InputFrameDownsync, RingBuffer, CharacterConfig, SatResult, sliceType, sliceType$1, sliceType$2, ptrType, sliceType$3, sliceType$4, ptrType$1, ptrType$2, ptrType$3, ptrType$4, ptrType$5, ptrType$6, sliceType$5, ptrType$7, sliceType$6, sliceType$7, sliceType$8, sliceType$9, ptrType$8, sliceType$10, ptrType$9, sliceType$11, sliceType$12, ptrType$10, sliceType$13, ptrType$11, mapType, ptrType$12, skills, inAirSet, noOpSet, invinsibleSet, nonAttackingSet, NewRingBuffer, ConvertToInputFrameId, decodeInput, CalcPushbacks, isPolygonPairOverlapped, isPolygonPairSeparatedByDir, WorldToVirtualGridPos, VirtualGridToWorldPos, WorldToPolygonColliderBLPos, PolygonColliderBLToWorldPos, PolygonColliderBLToVirtualGridPos, VirtualGridToPolygonColliderBLPos, calcHardPushbacksNorms, deriveOpPattern, ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame, GenerateRectCollider, generateRectColliderInCollisionSpace, GenerateConvexPolygonCollider, AlignPolygon2DToBoundingBox; + var $pkg = {}, $init, math, resolv, Vec2D, Polygon2D, PlayerDownsync, InputFrameDecoded, Barrier, Bullet, MeleeBullet, FireballBullet, Skill, RoomDownsyncFrame, InputFrameDownsync, RingBuffer, SkillMapperType, CharacterConfig, SatResult, sliceType, sliceType$1, sliceType$2, ptrType, ptrType$1, ptrType$2, sliceType$3, sliceType$4, ptrType$3, ptrType$4, ptrType$5, ptrType$6, ptrType$7, sliceType$5, sliceType$6, sliceType$7, sliceType$8, sliceType$9, ptrType$8, sliceType$10, ptrType$9, sliceType$11, sliceType$12, ptrType$10, sliceType$13, ptrType$11, mapType, ptrType$12, skills, inAirSet, noOpSet, invinsibleSet, nonAttackingSet, NewRingBuffer, ConvertToInputFrameId, decodeInput, CalcPushbacks, isPolygonPairOverlapped, isPolygonPairSeparatedByDir, WorldToVirtualGridPos, VirtualGridToWorldPos, WorldToPolygonColliderBLPos, PolygonColliderBLToWorldPos, PolygonColliderBLToVirtualGridPos, VirtualGridToPolygonColliderBLPos, calcHardPushbacksNorms, deriveOpPattern, ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame, GenerateRectCollider, generateRectColliderInCollisionSpace, GenerateConvexPolygonCollider, AlignPolygon2DToBoundingBox; math = $packages["math"]; resolv = $packages["resolv"]; Vec2D = $pkg.Vec2D = $newType(0, $kindStruct, "battle.Vec2D", true, "jsexport/battle", true, function(X_, Y_) { @@ -4819,7 +4819,7 @@ $packages["jsexport/battle"] = (function() { } this.Boundary = Boundary_; }); - Bullet = $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_) { + Bullet = $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; @@ -4840,6 +4840,7 @@ $packages["jsexport/battle"] = (function() { this.HitboxSizeX = 0; this.HitboxSizeY = 0; this.BlowUp = false; + this.CancelTransit = false; return; } this.OriginatedRenderFrameId = OriginatedRenderFrameId_; @@ -4860,11 +4861,12 @@ $packages["jsexport/battle"] = (function() { this.HitboxSizeX = HitboxSizeX_; this.HitboxSizeY = HitboxSizeY_; this.BlowUp = BlowUp_; + this.CancelTransit = CancelTransit_; }); MeleeBullet = $pkg.MeleeBullet = $newType(0, $kindStruct, "battle.MeleeBullet", true, "jsexport/battle", true, function(Bullet_) { this.$val = this; if (arguments.length === 0) { - this.Bullet = new Bullet.ptr(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, false); + this.Bullet = new Bullet.ptr(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, false, false); return; } this.Bullet = Bullet_; @@ -4879,7 +4881,7 @@ $packages["jsexport/battle"] = (function() { this.VelX = 0; this.VelY = 0; this.Speed = 0; - this.Bullet = new Bullet.ptr(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, false); + this.Bullet = new Bullet.ptr(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, false, false); return; } this.VirtualGridX = VirtualGridX_; @@ -4891,7 +4893,7 @@ $packages["jsexport/battle"] = (function() { this.Speed = Speed_; this.Bullet = Bullet_; }); - Skill = $pkg.Skill = $newType(0, $kindStruct, "battle.Skill", true, "jsexport/battle", true, function(BattleLocalId_, RecoveryFrames_, RecoveryFramesOnBlock_, RecoveryFramesOnHit_, ReleaseTriggerType_, Hits_) { + Skill = $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; @@ -4899,7 +4901,8 @@ $packages["jsexport/battle"] = (function() { this.RecoveryFramesOnBlock = 0; this.RecoveryFramesOnHit = 0; this.ReleaseTriggerType = 0; - this.Hits = sliceType.nil; + this.BoundChState = 0; + this.Hits = sliceType$2.nil; return; } this.BattleLocalId = BattleLocalId_; @@ -4907,6 +4910,7 @@ $packages["jsexport/battle"] = (function() { this.RecoveryFramesOnBlock = RecoveryFramesOnBlock_; this.RecoveryFramesOnHit = RecoveryFramesOnHit_; this.ReleaseTriggerType = ReleaseTriggerType_; + this.BoundChState = BoundChState_; this.Hits = Hits_; }); RoomDownsyncFrame = $pkg.RoomDownsyncFrame = $newType(0, $kindStruct, "battle.RoomDownsyncFrame", true, "jsexport/battle", true, function(Id_, PlayersArr_, CountdownNanos_, MeleeBullets_, FireballBullets_, BackendUnconfirmedMask_, ShouldForceResync_, PlayerOpPatternToSkillId_) { @@ -4952,7 +4956,7 @@ $packages["jsexport/battle"] = (function() { this.StFrameId = 0; this.N = 0; this.Cnt = 0; - this.Eles = sliceType.nil; + this.Eles = sliceType$2.nil; return; } this.Ed = Ed_; @@ -4963,7 +4967,8 @@ $packages["jsexport/battle"] = (function() { this.Cnt = Cnt_; this.Eles = Eles_; }); - CharacterConfig = $pkg.CharacterConfig = $newType(0, $kindStruct, "battle.CharacterConfig", true, "jsexport/battle", true, function(SpeciesId_, SpeciesName_, InAirIdleFrameIdxTurningPoint_, InAirIdleFrameIdxTurnedCycle_, LayDownFrames_, LayDownFramesToRecover_, GetUpFrames_, GetUpFramesToRecover_, JumpingInitVelY_, PatternIdToSkillId_) { + SkillMapperType = $pkg.SkillMapperType = $newType(4, $kindFunc, "battle.SkillMapperType", true, "jsexport/battle", true, null); + CharacterConfig = $pkg.CharacterConfig = $newType(0, $kindStruct, "battle.CharacterConfig", true, "jsexport/battle", true, function(SpeciesId_, SpeciesName_, InAirIdleFrameIdxTurningPoint_, InAirIdleFrameIdxTurnedCycle_, LayDownFrames_, LayDownFramesToRecover_, GetUpFrames_, GetUpFramesToRecover_, JumpingInitVelY_, SkillMapper_) { this.$val = this; if (arguments.length === 0) { this.SpeciesId = 0; @@ -4975,7 +4980,7 @@ $packages["jsexport/battle"] = (function() { this.GetUpFrames = 0; this.GetUpFramesToRecover = 0; this.JumpingInitVelY = 0; - this.PatternIdToSkillId = false; + this.SkillMapper = $throwNilPointerError; return; } this.SpeciesId = SpeciesId_; @@ -4987,7 +4992,7 @@ $packages["jsexport/battle"] = (function() { this.GetUpFrames = GetUpFrames_; this.GetUpFramesToRecover = GetUpFramesToRecover_; this.JumpingInitVelY = JumpingInitVelY_; - this.PatternIdToSkillId = PatternIdToSkillId_; + this.SkillMapper = SkillMapper_; }); SatResult = $pkg.SatResult = $newType(0, $kindStruct, "battle.SatResult", true, "jsexport/battle", true, function(Overlap_, OverlapX_, OverlapY_, AContainedInB_, BContainedInA_, Axis_) { this.$val = this; @@ -5007,23 +5012,23 @@ $packages["jsexport/battle"] = (function() { this.BContainedInA = BContainedInA_; this.Axis = Axis_; }); - sliceType = $sliceType($emptyInterface); - sliceType$1 = $sliceType($Int32); - sliceType$2 = $sliceType(sliceType$1); - ptrType = $ptrType(SatResult); + sliceType = $sliceType($Int32); + sliceType$1 = $sliceType(sliceType); + sliceType$2 = $sliceType($emptyInterface); + ptrType = $ptrType(Skill); + ptrType$1 = $ptrType(MeleeBullet); + ptrType$2 = $ptrType(SatResult); sliceType$3 = $sliceType(Vec2D); sliceType$4 = $sliceType($String); - ptrType$1 = $ptrType(resolv.Collision); - ptrType$2 = $ptrType(sliceType$3); - ptrType$3 = $ptrType(PlayerDownsync); - ptrType$4 = $ptrType(MeleeBullet); - ptrType$5 = $ptrType(resolv.ConvexPolygon); - ptrType$6 = $ptrType(InputFrameDownsync); + ptrType$3 = $ptrType(resolv.Collision); + ptrType$4 = $ptrType(sliceType$3); + ptrType$5 = $ptrType(PlayerDownsync); + ptrType$6 = $ptrType(resolv.ConvexPolygon); + ptrType$7 = $ptrType(InputFrameDownsync); sliceType$5 = $sliceType($Uint64); - ptrType$7 = $ptrType(Skill); - sliceType$6 = $sliceType(ptrType$3); - sliceType$7 = $sliceType(ptrType$4); - sliceType$8 = $sliceType(ptrType$2); + sliceType$6 = $sliceType(ptrType$5); + sliceType$7 = $sliceType(ptrType$1); + sliceType$8 = $sliceType(ptrType$4); sliceType$9 = $sliceType($Bool); ptrType$8 = $ptrType(resolv.Object); sliceType$10 = $sliceType(ptrType$8); @@ -5037,7 +5042,7 @@ $packages["jsexport/battle"] = (function() { ptrType$12 = $ptrType(RingBuffer); NewRingBuffer = function(n) { var n; - return new RingBuffer.ptr(0, 0, 0, 0, n, 0, $makeSlice(sliceType, n)); + return new RingBuffer.ptr(0, 0, 0, 0, n, 0, $makeSlice(sliceType$2, n)); }; $pkg.NewRingBuffer = NewRingBuffer; RingBuffer.ptr.prototype.Put = function(pItem) { @@ -5190,8 +5195,8 @@ $packages["jsexport/battle"] = (function() { $24r$1 = [false, 0, 0, overlapResult]; $s = 5; case 5: return $24r$1; /* } */ case 3: - $s = -1; return [false, 0, 0, ptrType.nil]; - /* */ } return; } } catch(err) { $err = err; $s = -1; return [false, 0, 0, ptrType.nil]; } finally { $callDeferred($deferred, $err); if($curGoroutine.asleep) { var $f = {$blk: CalcPushbacks, $c: true, $r, $24r, $24r$1, _tmp, _tmp$1, _tuple, barrierShape, oldDx, oldDy, origX, origY, overlapResult, overlapped, playerShape, pushbackX, pushbackY, $s, $deferred};return $f; } } + $s = -1; return [false, 0, 0, ptrType$2.nil]; + /* */ } return; } } catch(err) { $err = err; $s = -1; return [false, 0, 0, ptrType$2.nil]; } finally { $callDeferred($deferred, $err); if($curGoroutine.asleep) { var $f = {$blk: CalcPushbacks, $c: true, $r, $24r, $24r$1, _tmp, _tmp$1, _tuple, barrierShape, oldDx, oldDy, origX, origY, overlapResult, overlapped, playerShape, pushbackX, pushbackY, $s, $deferred};return $f; } } }; $pkg.CalcPushbacks = CalcPushbacks; isPolygonPairOverlapped = function(a, b, result) { @@ -5201,7 +5206,7 @@ $packages["jsexport/battle"] = (function() { aCnt = _tmp; bCnt = _tmp$1; if ((1 === aCnt) && (1 === bCnt)) { - if (!(ptrType.nil === result)) { + if (!(ptrType$2.nil === result)) { result.Overlap = 0; } return ((x = (x$1 = a.Points, (0 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 0])), (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])) === (x$2 = (x$3 = b.Points, (0 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 0])), (0 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 0]))) && ((x$4 = (x$5 = a.Points, (0 >= x$5.$length ? ($throwRuntimeError("index out of range"), undefined) : x$5.$array[x$5.$offset + 0])), (1 >= x$4.$length ? ($throwRuntimeError("index out of range"), undefined) : x$4.$array[x$4.$offset + 1])) === (x$6 = (x$7 = b.Points, (0 >= x$7.$length ? ($throwRuntimeError("index out of range"), undefined) : x$7.$array[x$7.$offset + 0])), (1 >= x$6.$length ? ($throwRuntimeError("index out of range"), undefined) : x$6.$array[x$6.$offset + 1]))); @@ -5273,7 +5278,7 @@ $packages["jsexport/battle"] = (function() { if (aStart > bEnd || aEnd < bStart) { return true; } - if (!(ptrType.nil === result)) { + if (!(ptrType$2.nil === result)) { overlap = 0; if (aStart < bStart) { result.AContainedInB = false; @@ -5368,8 +5373,8 @@ $packages["jsexport/battle"] = (function() { ret = [ret]; ret[0] = $makeSlice(sliceType$3, 0, 10); collision = playerCollider.Check(0, 0, new sliceType$4([])); - if (ptrType$1.nil === collision) { - $s = -1; return (ret.$ptr || (ret.$ptr = new ptrType$2(function() { return this.$target[0]; }, function($v) { this.$target[0] = $v; }, ret))); + if (ptrType$3.nil === collision) { + $s = -1; return (ret.$ptr || (ret.$ptr = new ptrType$4(function() { return this.$target[0]; }, function($v) { this.$target[0] = $v; }, ret))); } _ref = collision.Objects; _i = 0; @@ -5378,8 +5383,8 @@ $packages["jsexport/battle"] = (function() { obj = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); isBarrier = false; _ref$1 = obj.Data; - if ($assertType(_ref$1, ptrType$3, true)[1]) { - } else if ($assertType(_ref$1, ptrType$4, true)[1]) { + if ($assertType(_ref$1, ptrType$5, true)[1]) { + } else if ($assertType(_ref$1, ptrType$1, true)[1]) { } else { isBarrier = true; } @@ -5387,7 +5392,7 @@ $packages["jsexport/battle"] = (function() { _i++; /* continue; */ $s = 1; continue; } - barrierShape = $assertType(obj.Shape, ptrType$5); + barrierShape = $assertType(obj.Shape, ptrType$6); _r = CalcPushbacks(0, 0, playerShape, barrierShape); /* */ $s = 3; case 3: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } _tuple = _r; overlapped = _tuple[0]; @@ -5408,11 +5413,11 @@ $packages["jsexport/battle"] = (function() { _i++; $s = 1; continue; case 2: - $s = -1; return (ret.$ptr || (ret.$ptr = new ptrType$2(function() { return this.$target[0]; }, function($v) { this.$target[0] = $v; }, ret))); + $s = -1; return (ret.$ptr || (ret.$ptr = new ptrType$4(function() { return this.$target[0]; }, function($v) { this.$target[0] = $v; }, ret))); /* */ } return; } var $f = {$blk: calcHardPushbacksNorms, $c: true, $r, _i, _r, _ref, _ref$1, _tmp, _tmp$1, _tuple, barrierShape, collision, isBarrier, joinIndex, obj, overlapResult, overlapped, pEffPushback, playerCollider, playerShape, pushbackX, pushbackY, ret, snapIntoPlatformOverlap, $s};return $f; }; deriveOpPattern = function(currPlayerDownsync, thatPlayerInNextFrame, currRenderFrame, inputsBuffer, inputDelayFrames, inputScaleFrames) { - var _entry, _entry$1, _entry$2, _ref, _tmp, _tmp$1, _tmp$2, _tmp$3, _tmp$4, _tmp$5, _tuple, _tuple$1, currPlayerDownsync, currRenderFrame, decodedInput, delayedInputFrameId, delayedInputFrameIdForPrevRdf, delayedInputList, delayedInputListForPrevRdf, effDx, effDy, existent, existent$1, inputDelayFrames, inputScaleFrames, inputsBuffer, joinIndex, jumpedOrNot, patternId, prevBtnALevel, prevBtnBLevel, prevDecodedInput, skillConfig, thatPlayerInNextFrame, v, x, x$1, x$2, x$3; + var _entry, _entry$1, _tmp, _tmp$1, _tmp$2, _tmp$3, _tmp$4, _tmp$5, _tuple, _tuple$1, currPlayerDownsync, currRenderFrame, decodedInput, delayedInputFrameId, delayedInputFrameIdForPrevRdf, delayedInputList, delayedInputListForPrevRdf, effDx, effDy, existent, existent$1, inputDelayFrames, inputScaleFrames, inputsBuffer, joinIndex, jumpedOrNot, patternId, prevBtnALevel, prevBtnBLevel, prevDecodedInput, thatPlayerInNextFrame, x, x$1; delayedInputFrameId = ConvertToInputFrameId(currRenderFrame.Id, inputDelayFrames, inputScaleFrames); delayedInputFrameIdForPrevRdf = ConvertToInputFrameId(currRenderFrame.Id - 1 >> 0, inputDelayFrames, inputScaleFrames); if (0 >= delayedInputFrameId) { @@ -5423,10 +5428,10 @@ $packages["jsexport/battle"] = (function() { if (existent) { return [-2, false, 0, 0]; } - delayedInputList = $assertType(inputsBuffer.GetByFrameId(delayedInputFrameId), ptrType$6).InputList; + delayedInputList = $assertType(inputsBuffer.GetByFrameId(delayedInputFrameId), ptrType$7).InputList; delayedInputListForPrevRdf = sliceType$5.nil; if (0 < delayedInputFrameIdForPrevRdf) { - delayedInputListForPrevRdf = $assertType(inputsBuffer.GetByFrameId(delayedInputFrameIdForPrevRdf), ptrType$6).InputList; + delayedInputListForPrevRdf = $assertType(inputsBuffer.GetByFrameId(delayedInputFrameIdForPrevRdf), ptrType$7).InputList; } jumpedOrNot = false; joinIndex = currPlayerDownsync.JoinIndex; @@ -5459,27 +5464,12 @@ $packages["jsexport/battle"] = (function() { } patternId = -1; if (decodedInput.BtnALevel > prevBtnALevel) { - if (currPlayerDownsync.InAir) { - patternId = 255; - } else { - patternId = 1; - } - } - if (!((-1 === patternId)) && 0 < currPlayerDownsync.FramesToRecover) { - patternId = -1; - skillConfig = (_entry$2 = skills[$Int.keyFor(((currPlayerDownsync.ActiveSkillId >> 0)))], _entry$2 !== undefined ? _entry$2.v : ptrType$7.nil); - _ref = (x$2 = skillConfig.Hits, x$3 = currPlayerDownsync.ActiveSkillHit, ((x$3 < 0 || x$3 >= x$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + x$3])); - if ($assertType(_ref, ptrType$4, true)[1]) { - v = _ref.$val; - if (v.Bullet.CancellableStFrame <= currPlayerDownsync.FramesInChState && currPlayerDownsync.FramesInChState < v.Bullet.CancellableEdFrame) { - patternId = (((currPlayerDownsync.ActiveSkillId + 1 >> 0) >> 0)); - } - } + patternId = 1; } return [patternId, jumpedOrNot, effDx, effDy]; }; ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame = function(inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, chConfigsOrderedByJoinIndex) { - var {_1, _2, _entry, _entry$1, _entry$2, _entry$3, _entry$4, _entry$5, _entry$6, _i, _i$1, _i$2, _i$3, _i$4, _i$5, _i$6, _i$7, _i$8, _i$9, _index, _index$1, _r, _r$1, _r$2, _r$3, _ref, _ref$1, _ref$10, _ref$11, _ref$12, _ref$13, _ref$2, _ref$3, _ref$4, _ref$5, _ref$6, _ref$7, _ref$8, _ref$9, _tmp, _tmp$1, _tmp$10, _tmp$11, _tmp$12, _tmp$2, _tmp$3, _tmp$4, _tmp$5, _tmp$6, _tmp$7, _tmp$8, _tmp$9, _tuple, _tuple$1, _tuple$2, _tuple$3, _tuple$4, _tuple$5, _tuple$6, _tuple$7, _tuple$8, _tuple$9, atkedPlayerInNextFrame, bShape, bulletCollider, bulletColliders, bulletShape, bulletWx, bulletWy, chConfig, chConfig$1, chConfig$2, chConfigsOrderedByJoinIndex, collision, collision$1, collisionPlayerIndex, collisionPlayerIndex$1, collisionPlayerIndex$2, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currPlayerDownsync, currPlayerDownsync$1, currPlayerDownsync$2, currPlayerDownsync$3, currPlayerDownsync$4, currRenderFrame, defenderShape, effDx, effDy, effPushbacks, existent, existent$1, existent$2, hardPushbackNorm, hardPushbackNorms, hitboxSizeWx, hitboxSizeWy, i, i$1, i$2, i$3, i$4, inputsBuffer, isAnotherPlayer, isBarrier, isBullet, joinIndex, joinIndex$1, joinIndex$2, joinIndex$3, jumpedOrNot, jumpedOrNotList, landedOnGravityPushback, meleeBullet, newBullet, newBulletCollider, newVx, newVy, nextRenderFrameMeleeBullets, nextRenderFramePlayers, normAlignmentWithGravity, obj, obj$1, offender, offender$1, oldFramesToRecover, oldNextCharacterState, overlapResult, overlapped, overlapped$1, patternId, playerCollider, playerCollider$1, playerCollider$2, playerShape, projectedMagnitude, pushbackVelX, pushbackVelY, pushbackX, pushbackY, roomCapacity, skillConfig, skillId, t, t$1, thatPlayerInNextFrame, thatPlayerInNextFrame$1, thatPlayerInNextFrame$2, thatPlayerInNextFrame$3, v, v$1, x, x$1, x$10, x$11, x$12, x$13, x$14, x$2, x$3, x$4, x$5, x$6, x$7, x$8, x$9, xfac, xfac$1, $s, $r, $c} = $restore(this, {inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, chConfigsOrderedByJoinIndex}); + var {_1, _entry, _entry$1, _entry$2, _entry$3, _entry$4, _entry$5, _i, _i$1, _i$2, _i$3, _i$4, _i$5, _i$6, _i$7, _i$8, _i$9, _index, _index$1, _r, _r$1, _r$2, _r$3, _r$4, _ref, _ref$1, _ref$10, _ref$11, _ref$12, _ref$13, _ref$2, _ref$3, _ref$4, _ref$5, _ref$6, _ref$7, _ref$8, _ref$9, _tmp, _tmp$1, _tmp$10, _tmp$11, _tmp$12, _tmp$2, _tmp$3, _tmp$4, _tmp$5, _tmp$6, _tmp$7, _tmp$8, _tmp$9, _tuple, _tuple$1, _tuple$2, _tuple$3, _tuple$4, _tuple$5, _tuple$6, _tuple$7, _tuple$8, _tuple$9, atkedPlayerInNextFrame, bShape, bulletCollider, bulletColliders, bulletShape, bulletWx, bulletWy, chConfig, chConfig$1, chConfig$2, chConfigsOrderedByJoinIndex, collision, collision$1, collisionPlayerIndex, collisionPlayerIndex$1, collisionPlayerIndex$2, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currPlayerDownsync, currPlayerDownsync$1, currPlayerDownsync$2, currPlayerDownsync$3, currPlayerDownsync$4, currRenderFrame, defenderShape, effDx, effDy, effPushbacks, existent, existent$1, existent$2, hardPushbackNorm, hardPushbackNorms, hitboxSizeWx, hitboxSizeWy, i, i$1, i$2, i$3, i$4, inputsBuffer, isAnotherPlayer, isBarrier, isBullet, joinIndex, joinIndex$1, joinIndex$2, joinIndex$3, jumpedOrNot, jumpedOrNotList, landedOnGravityPushback, meleeBullet, newBullet, newBulletCollider, newVx, newVy, nextRenderFrameMeleeBullets, nextRenderFramePlayers, normAlignmentWithGravity, obj, obj$1, offender, offender$1, oldFramesToRecover, oldNextCharacterState, overlapResult, overlapped, overlapped$1, patternId, playerCollider, playerCollider$1, playerCollider$2, playerShape, projectedMagnitude, pushbackVelX, pushbackVelY, pushbackX, pushbackY, roomCapacity, skillConfig, skillId, t, t$1, thatPlayerInNextFrame, thatPlayerInNextFrame$1, thatPlayerInNextFrame$2, thatPlayerInNextFrame$3, v, v$1, x, x$1, x$10, x$11, x$12, x$13, x$14, x$2, x$3, x$4, x$5, x$6, x$7, x$8, x$9, xfac, xfac$1, $s, $r, $c} = $restore(this, {inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, chConfigsOrderedByJoinIndex}); /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: roomCapacity = currRenderFrame.PlayersArr.$length; nextRenderFramePlayers = $makeSlice(sliceType$6, roomCapacity); @@ -5501,8 +5491,8 @@ $packages["jsexport/battle"] = (function() { jumpedOrNotList = $makeSlice(sliceType$9, roomCapacity); _ref$1 = currRenderFrame.PlayersArr; _i$1 = 0; - while (true) { - if (!(_i$1 < _ref$1.$length)) { break; } + /* while (true) { */ case 1: + /* if (!(_i$1 < _ref$1.$length)) { break; } */ if(!(_i$1 < _ref$1.$length)) { $s = 2; continue; } newBullet = [newBullet]; i$1 = _i$1; currPlayerDownsync$1 = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); @@ -5519,37 +5509,29 @@ $packages["jsexport/battle"] = (function() { ((i$1 < 0 || i$1 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$1] = true); } joinIndex = currPlayerDownsync$1.JoinIndex; - if (!((-1 === patternId))) { - _tuple$1 = (_entry = chConfig.PatternIdToSkillId[$Int.keyFor(patternId)], _entry !== undefined ? [_entry.v, true] : [0, false]); - skillId = _tuple$1[0]; - existent = _tuple$1[1]; - if (existent) { - skillConfig = (_entry$1 = skills[$Int.keyFor(skillId)], _entry$1 !== undefined ? _entry$1.v : ptrType$7.nil); - thatPlayerInNextFrame.ActiveSkillId = ((skillId >> 0)); - thatPlayerInNextFrame.ActiveSkillHit = 0; - _ref$2 = (x = skillConfig.Hits, x$1 = thatPlayerInNextFrame.ActiveSkillHit, ((x$1 < 0 || x$1 >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + x$1])); - if ($assertType(_ref$2, ptrType$4, true)[1]) { - v = _ref$2.$val; - newBullet[0] = $clone(v, MeleeBullet); - newBullet[0].Bullet.OriginatedRenderFrameId = currRenderFrame.Id; - newBullet[0].Bullet.OffenderJoinIndex = joinIndex; - nextRenderFrameMeleeBullets = $append(nextRenderFrameMeleeBullets, newBullet[0]); - thatPlayerInNextFrame.FramesToRecover = skillConfig.RecoveryFrames; - } - _1 = skillId; - if (_1 === (1)) { - thatPlayerInNextFrame.CharacterState = 2; - } else if (_1 === (2)) { - thatPlayerInNextFrame.CharacterState = 11; - } else if (_1 === (3)) { - thatPlayerInNextFrame.CharacterState = 12; - } - if (false === currPlayerDownsync$1.InAir) { - thatPlayerInNextFrame.VelX = 0; - } - _i$1++; - continue; + _r = chConfig.SkillMapper(patternId, currPlayerDownsync$1); /* */ $s = 3; case 3: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } + skillId = _r; + _tuple$1 = (_entry = skills[$Int.keyFor(skillId)], _entry !== undefined ? [_entry.v, true] : [ptrType.nil, false]); + skillConfig = _tuple$1[0]; + existent = _tuple$1[1]; + if (existent) { + thatPlayerInNextFrame.ActiveSkillId = ((skillId >> 0)); + thatPlayerInNextFrame.ActiveSkillHit = 0; + _ref$2 = (x = skillConfig.Hits, x$1 = thatPlayerInNextFrame.ActiveSkillHit, ((x$1 < 0 || x$1 >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + x$1])); + if ($assertType(_ref$2, ptrType$1, true)[1]) { + v = _ref$2.$val; + newBullet[0] = $clone(v, MeleeBullet); + newBullet[0].Bullet.OriginatedRenderFrameId = currRenderFrame.Id; + newBullet[0].Bullet.OffenderJoinIndex = joinIndex; + nextRenderFrameMeleeBullets = $append(nextRenderFrameMeleeBullets, newBullet[0]); + thatPlayerInNextFrame.FramesToRecover = skillConfig.RecoveryFrames; } + thatPlayerInNextFrame.CharacterState = skillConfig.BoundChState; + if (false === currPlayerDownsync$1.InAir) { + thatPlayerInNextFrame.VelX = 0; + } + _i$1++; + /* continue; */ $s = 1; continue; } if (0 === currPlayerDownsync$1.FramesToRecover) { if (!((0 === effDx)) || !((0 === effDy))) { @@ -5565,11 +5547,12 @@ $packages["jsexport/battle"] = (function() { } } _i$1++; - } + $s = 1; continue; + case 2: _ref$3 = currRenderFrame.PlayersArr; _i$2 = 0; - /* while (true) { */ case 1: - /* if (!(_i$2 < _ref$3.$length)) { break; } */ if(!(_i$2 < _ref$3.$length)) { $s = 2; continue; } + /* while (true) { */ case 4: + /* if (!(_i$2 < _ref$3.$length)) { break; } */ if(!(_i$2 < _ref$3.$length)) { $s = 5; continue; } i$2 = _i$2; currPlayerDownsync$2 = ((_i$2 < 0 || _i$2 >= _ref$3.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$3.$array[_ref$3.$offset + _i$2]); joinIndex$1 = currPlayerDownsync$2.JoinIndex; @@ -5578,7 +5561,7 @@ $packages["jsexport/battle"] = (function() { (x$2 = joinIndex$1 - 1 >> 0, ((x$2 < 0 || x$2 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$2])).X = _tmp$2; (x$3 = joinIndex$1 - 1 >> 0, ((x$3 < 0 || x$3 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$3])).Y = _tmp$3; collisionPlayerIndex = 131072 + joinIndex$1 >> 0; - playerCollider = (_entry$2 = collisionSysMap[$Int32.keyFor(collisionPlayerIndex)], _entry$2 !== undefined ? _entry$2.v : ptrType$8.nil); + playerCollider = (_entry$1 = collisionSysMap[$Int32.keyFor(collisionPlayerIndex)], _entry$1 !== undefined ? _entry$1.v : ptrType$8.nil); thatPlayerInNextFrame$1 = ((i$2 < 0 || i$2 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$2]); chConfig$1 = ((i$2 < 0 || i$2 >= chConfigsOrderedByJoinIndex.$length) ? ($throwRuntimeError("index out of range"), undefined) : chConfigsOrderedByJoinIndex.$array[chConfigsOrderedByJoinIndex.$offset + i$2]); _tmp$4 = currPlayerDownsync$2.VirtualGridX + currPlayerDownsync$2.VelX >> 0; @@ -5591,23 +5574,23 @@ $packages["jsexport/battle"] = (function() { _tuple$2 = VirtualGridToPolygonColliderBLPos(newVx, newVy, playerCollider.W * 0.5, playerCollider.H * 0.5, 0, 0, 0, 0, collisionSpaceOffsetX, collisionSpaceOffsetY); playerCollider.X = _tuple$2[0]; playerCollider.Y = _tuple$2[1]; - $r = playerCollider.Update(); /* */ $s = 3; case 3: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + $r = playerCollider.Update(); /* */ $s = 6; case 6: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } if (currPlayerDownsync$2.InAir) { thatPlayerInNextFrame$1.VelX = thatPlayerInNextFrame$1.VelX + (0) >> 0; thatPlayerInNextFrame$1.VelY = thatPlayerInNextFrame$1.VelY + (-50) >> 0; } _i$2++; - $s = 1; continue; - case 2: + $s = 4; continue; + case 5: bulletColliders = $makeSlice(sliceType$10, 0, currRenderFrame.MeleeBullets.$length); _ref$4 = currRenderFrame.MeleeBullets; _i$3 = 0; - /* while (true) { */ case 4: - /* if (!(_i$3 < _ref$4.$length)) { break; } */ if(!(_i$3 < _ref$4.$length)) { $s = 5; continue; } + /* while (true) { */ case 7: + /* if (!(_i$3 < _ref$4.$length)) { break; } */ if(!(_i$3 < _ref$4.$length)) { $s = 8; continue; } meleeBullet = ((_i$3 < 0 || _i$3 >= _ref$4.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$4.$array[_ref$4.$offset + _i$3]); - /* */ if (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) <= currRenderFrame.Id) && (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) + meleeBullet.Bullet.ActiveFrames >> 0) > currRenderFrame.Id)) { $s = 6; continue; } - /* */ $s = 7; continue; - /* if (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) <= currRenderFrame.Id) && (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) + meleeBullet.Bullet.ActiveFrames >> 0) > currRenderFrame.Id)) { */ case 6: + /* */ if (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) <= currRenderFrame.Id) && (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) + meleeBullet.Bullet.ActiveFrames >> 0) > currRenderFrame.Id)) { $s = 9; continue; } + /* */ $s = 10; continue; + /* if (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) <= currRenderFrame.Id) && (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) + meleeBullet.Bullet.ActiveFrames >> 0) > currRenderFrame.Id)) { */ case 9: offender = (x$4 = currRenderFrame.PlayersArr, x$5 = meleeBullet.Bullet.OffenderJoinIndex - 1 >> 0, ((x$5 < 0 || x$5 >= x$4.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$4.$array[x$4.$offset + x$5])); xfac = 1; if (0 > offender.DirX) { @@ -5619,40 +5602,40 @@ $packages["jsexport/battle"] = (function() { _tuple$4 = VirtualGridToWorldPos(meleeBullet.Bullet.HitboxSizeX, meleeBullet.Bullet.HitboxSizeY); hitboxSizeWx = _tuple$4[0]; hitboxSizeWy = _tuple$4[1]; - _r = GenerateRectCollider(bulletWx, bulletWy, hitboxSizeWx, hitboxSizeWy, 0.1, 0.1, 0.1, 0.1, collisionSpaceOffsetX, collisionSpaceOffsetY, meleeBullet, "MeleeBullet"); /* */ $s = 9; case 9: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - newBulletCollider = _r; - $r = collisionSys.Add(new sliceType$10([newBulletCollider])); /* */ $s = 10; case 10: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + _r$1 = GenerateRectCollider(bulletWx, bulletWy, hitboxSizeWx, hitboxSizeWy, 0.1, 0.1, 0.1, 0.1, collisionSpaceOffsetX, collisionSpaceOffsetY, meleeBullet, "MeleeBullet"); /* */ $s = 12; case 12: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } + newBulletCollider = _r$1; + $r = collisionSys.Add(new sliceType$10([newBulletCollider])); /* */ $s = 13; case 13: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } bulletColliders = $append(bulletColliders, newBulletCollider); - $s = 8; continue; - /* } else { */ case 7: + $s = 11; continue; + /* } else { */ case 10: nextRenderFrameMeleeBullets = $append(nextRenderFrameMeleeBullets, meleeBullet); - /* } */ case 8: + /* } */ case 11: _i$3++; - $s = 4; continue; - case 5: + $s = 7; continue; + case 8: _ref$5 = currRenderFrame.PlayersArr; _i$4 = 0; - /* while (true) { */ case 11: - /* if (!(_i$4 < _ref$5.$length)) { break; } */ if(!(_i$4 < _ref$5.$length)) { $s = 12; continue; } + /* while (true) { */ case 14: + /* if (!(_i$4 < _ref$5.$length)) { break; } */ if(!(_i$4 < _ref$5.$length)) { $s = 15; continue; } i$3 = _i$4; currPlayerDownsync$3 = ((_i$4 < 0 || _i$4 >= _ref$5.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$5.$array[_ref$5.$offset + _i$4]); joinIndex$2 = currPlayerDownsync$3.JoinIndex; collisionPlayerIndex$1 = 131072 + joinIndex$2 >> 0; - playerCollider$1 = (_entry$3 = collisionSysMap[$Int32.keyFor(collisionPlayerIndex$1)], _entry$3 !== undefined ? _entry$3.v : ptrType$8.nil); - playerShape = $assertType(playerCollider$1.Shape, ptrType$5); - _r$1 = calcHardPushbacksNorms(joinIndex$2, playerCollider$1, playerShape, 0.1, (x$6 = joinIndex$2 - 1 >> 0, ((x$6 < 0 || x$6 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$6]))); /* */ $s = 13; case 13: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } - (x$7 = joinIndex$2 - 1 >> 0, ((x$7 < 0 || x$7 >= hardPushbackNorms.$length) ? ($throwRuntimeError("index out of range"), undefined) : hardPushbackNorms.$array[hardPushbackNorms.$offset + x$7] = _r$1)); + playerCollider$1 = (_entry$2 = collisionSysMap[$Int32.keyFor(collisionPlayerIndex$1)], _entry$2 !== undefined ? _entry$2.v : ptrType$8.nil); + playerShape = $assertType(playerCollider$1.Shape, ptrType$6); + _r$2 = calcHardPushbacksNorms(joinIndex$2, playerCollider$1, playerShape, 0.1, (x$6 = joinIndex$2 - 1 >> 0, ((x$6 < 0 || x$6 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$6]))); /* */ $s = 16; case 16: if($c) { $c = false; _r$2 = _r$2.$blk(); } if (_r$2 && _r$2.$blk !== undefined) { break s; } + (x$7 = joinIndex$2 - 1 >> 0, ((x$7 < 0 || x$7 >= hardPushbackNorms.$length) ? ($throwRuntimeError("index out of range"), undefined) : hardPushbackNorms.$array[hardPushbackNorms.$offset + x$7] = _r$2)); thatPlayerInNextFrame$2 = ((i$3 < 0 || i$3 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$3]); chConfig$2 = ((i$3 < 0 || i$3 >= chConfigsOrderedByJoinIndex.$length) ? ($throwRuntimeError("index out of range"), undefined) : chConfigsOrderedByJoinIndex.$array[chConfigsOrderedByJoinIndex.$offset + i$3]); landedOnGravityPushback = false; collision = playerCollider$1.Check(0, 0, new sliceType$4([])); - /* */ if (!(ptrType$1.nil === collision)) { $s = 14; continue; } - /* */ $s = 15; continue; - /* if (!(ptrType$1.nil === collision)) { */ case 14: + /* */ if (!(ptrType$3.nil === collision)) { $s = 17; continue; } + /* */ $s = 18; continue; + /* if (!(ptrType$3.nil === collision)) { */ case 17: _ref$6 = collision.Objects; _i$5 = 0; - /* while (true) { */ case 16: - /* if (!(_i$5 < _ref$6.$length)) { break; } */ if(!(_i$5 < _ref$6.$length)) { $s = 17; continue; } + /* while (true) { */ case 19: + /* if (!(_i$5 < _ref$6.$length)) { break; } */ if(!(_i$5 < _ref$6.$length)) { $s = 20; continue; } obj = ((_i$5 < 0 || _i$5 >= _ref$6.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$6.$array[_ref$6.$offset + _i$5]); _tmp$6 = false; _tmp$7 = false; @@ -5661,27 +5644,27 @@ $packages["jsexport/battle"] = (function() { isAnotherPlayer = _tmp$7; isBullet = _tmp$8; _ref$7 = obj.Data; - if ($assertType(_ref$7, ptrType$3, true)[1]) { + if ($assertType(_ref$7, ptrType$5, true)[1]) { isAnotherPlayer = true; - } else if ($assertType(_ref$7, ptrType$4, true)[1]) { + } else if ($assertType(_ref$7, ptrType$1, true)[1]) { isBullet = true; } else { isBarrier = true; } if (isBullet) { _i$5++; - /* continue; */ $s = 16; continue; + /* continue; */ $s = 19; continue; } - bShape = $assertType(obj.Shape, ptrType$5); - _r$2 = CalcPushbacks(0, 0, playerShape, bShape); /* */ $s = 18; case 18: if($c) { $c = false; _r$2 = _r$2.$blk(); } if (_r$2 && _r$2.$blk !== undefined) { break s; } - _tuple$5 = _r$2; + bShape = $assertType(obj.Shape, ptrType$6); + _r$3 = CalcPushbacks(0, 0, playerShape, bShape); /* */ $s = 21; case 21: if($c) { $c = false; _r$3 = _r$3.$blk(); } if (_r$3 && _r$3.$blk !== undefined) { break s; } + _tuple$5 = _r$3; overlapped = _tuple$5[0]; pushbackX = _tuple$5[1]; pushbackY = _tuple$5[2]; overlapResult = _tuple$5[3]; if (!overlapped) { _i$5++; - /* continue; */ $s = 16; continue; + /* continue; */ $s = 19; continue; } normAlignmentWithGravity = overlapResult.OverlapX * 0 + overlapResult.OverlapY * -1; if (isAnotherPlayer) { @@ -5710,9 +5693,9 @@ $packages["jsexport/battle"] = (function() { landedOnGravityPushback = true; } _i$5++; - $s = 16; continue; - case 17: - /* } */ case 15: + $s = 19; continue; + case 20: + /* } */ case 18: if (landedOnGravityPushback) { thatPlayerInNextFrame$2.InAir = false; if (currPlayerDownsync$3.InAir && 0 >= currPlayerDownsync$3.VelY) { @@ -5739,54 +5722,54 @@ $packages["jsexport/battle"] = (function() { } } _i$4++; - $s = 11; continue; - case 12: + $s = 14; continue; + case 15: _ref$9 = bulletColliders; _i$7 = 0; - /* while (true) { */ case 19: - /* if (!(_i$7 < _ref$9.$length)) { break; } */ if(!(_i$7 < _ref$9.$length)) { $s = 20; continue; } + /* while (true) { */ case 22: + /* if (!(_i$7 < _ref$9.$length)) { break; } */ if(!(_i$7 < _ref$9.$length)) { $s = 23; continue; } bulletCollider = ((_i$7 < 0 || _i$7 >= _ref$9.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$9.$array[_ref$9.$offset + _i$7]); collision$1 = bulletCollider.Check(0, 0, new sliceType$4([])); bulletCollider.Space.Remove(new sliceType$10([bulletCollider])); _ref$10 = bulletCollider.Data; - /* */ if ($assertType(_ref$10, ptrType$4, true)[1]) { $s = 21; continue; } - /* */ $s = 22; continue; - /* if ($assertType(_ref$10, ptrType$4, true)[1]) { */ case 21: + /* */ if ($assertType(_ref$10, ptrType$1, true)[1]) { $s = 24; continue; } + /* */ $s = 25; continue; + /* if ($assertType(_ref$10, ptrType$1, true)[1]) { */ case 24: v$1 = _ref$10.$val; - if (ptrType$1.nil === collision$1) { + if (ptrType$3.nil === collision$1) { nextRenderFrameMeleeBullets = $append(nextRenderFrameMeleeBullets, v$1); _i$7++; - /* continue; */ $s = 19; continue; + /* continue; */ $s = 22; continue; } - bulletShape = $assertType(bulletCollider.Shape, ptrType$5); + bulletShape = $assertType(bulletCollider.Shape, ptrType$6); offender$1 = (x$9 = currRenderFrame.PlayersArr, x$10 = v$1.Bullet.OffenderJoinIndex - 1 >> 0, ((x$10 < 0 || x$10 >= x$9.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$9.$array[x$9.$offset + x$10])); _ref$11 = collision$1.Objects; _i$8 = 0; - /* while (true) { */ case 23: - /* if (!(_i$8 < _ref$11.$length)) { break; } */ if(!(_i$8 < _ref$11.$length)) { $s = 24; continue; } + /* while (true) { */ case 26: + /* if (!(_i$8 < _ref$11.$length)) { break; } */ if(!(_i$8 < _ref$11.$length)) { $s = 27; continue; } obj$1 = ((_i$8 < 0 || _i$8 >= _ref$11.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$11.$array[_ref$11.$offset + _i$8]); - defenderShape = $assertType(obj$1.Shape, ptrType$5); + defenderShape = $assertType(obj$1.Shape, ptrType$6); _ref$12 = obj$1.Data; - /* */ if ($assertType(_ref$12, ptrType$3, true)[1]) { $s = 25; continue; } - /* */ $s = 26; continue; - /* if ($assertType(_ref$12, ptrType$3, true)[1]) { */ case 25: + /* */ if ($assertType(_ref$12, ptrType$5, true)[1]) { $s = 28; continue; } + /* */ $s = 29; continue; + /* if ($assertType(_ref$12, ptrType$5, true)[1]) { */ case 28: t = _ref$12.$val; if (v$1.Bullet.OffenderJoinIndex === t.JoinIndex) { _i$8++; - /* continue; */ $s = 23; continue; + /* continue; */ $s = 26; continue; } - _tuple$6 = (_entry$4 = invinsibleSet[$Int32.keyFor(t.CharacterState)], _entry$4 !== undefined ? [_entry$4.v, true] : [false, false]); + _tuple$6 = (_entry$3 = invinsibleSet[$Int32.keyFor(t.CharacterState)], _entry$3 !== undefined ? [_entry$3.v, true] : [false, false]); existent$1 = _tuple$6[1]; if (existent$1) { _i$8++; - /* continue; */ $s = 23; continue; + /* continue; */ $s = 26; continue; } - _r$3 = CalcPushbacks(0, 0, bulletShape, defenderShape); /* */ $s = 28; case 28: if($c) { $c = false; _r$3 = _r$3.$blk(); } if (_r$3 && _r$3.$blk !== undefined) { break s; } - _tuple$7 = _r$3; + _r$4 = CalcPushbacks(0, 0, bulletShape, defenderShape); /* */ $s = 31; case 31: if($c) { $c = false; _r$4 = _r$4.$blk(); } if (_r$4 && _r$4.$blk !== undefined) { break s; } + _tuple$7 = _r$4; overlapped$1 = _tuple$7[0]; if (!overlapped$1) { _i$8++; - /* continue; */ $s = 23; continue; + /* continue; */ $s = 26; continue; } xfac$1 = 1; if (0 > offender$1.DirX) { @@ -5808,17 +5791,17 @@ $packages["jsexport/battle"] = (function() { if (v$1.Bullet.HitStunFrames > oldFramesToRecover) { atkedPlayerInNextFrame.FramesToRecover = v$1.Bullet.HitStunFrames; } - $s = 27; continue; - /* } else { */ case 26: + $s = 30; continue; + /* } else { */ case 29: t$1 = _ref$12; - /* } */ case 27: + /* } */ case 30: _i$8++; - $s = 23; continue; - case 24: - /* } */ case 22: + $s = 26; continue; + case 27: + /* } */ case 25: _i$7++; - $s = 19; continue; - case 20: + $s = 22; continue; + case 23: _ref$13 = currRenderFrame.PlayersArr; _i$9 = 0; while (true) { @@ -5827,30 +5810,30 @@ $packages["jsexport/battle"] = (function() { currPlayerDownsync$4 = ((_i$9 < 0 || _i$9 >= _ref$13.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$13.$array[_ref$13.$offset + _i$9]); joinIndex$3 = currPlayerDownsync$4.JoinIndex; collisionPlayerIndex$2 = 131072 + joinIndex$3 >> 0; - playerCollider$2 = (_entry$5 = collisionSysMap[$Int32.keyFor(collisionPlayerIndex$2)], _entry$5 !== undefined ? _entry$5.v : ptrType$8.nil); + playerCollider$2 = (_entry$4 = collisionSysMap[$Int32.keyFor(collisionPlayerIndex$2)], _entry$4 !== undefined ? _entry$4.v : ptrType$8.nil); thatPlayerInNextFrame$3 = ((i$4 < 0 || i$4 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$4]); _tuple$8 = PolygonColliderBLToVirtualGridPos(playerCollider$2.X - (x$13 = joinIndex$3 - 1 >> 0, ((x$13 < 0 || x$13 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$13])).X, playerCollider$2.Y - (x$14 = joinIndex$3 - 1 >> 0, ((x$14 < 0 || x$14 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$14])).Y, playerCollider$2.W * 0.5, playerCollider$2.H * 0.5, 0, 0, 0, 0, collisionSpaceOffsetX, collisionSpaceOffsetY); thatPlayerInNextFrame$3.VirtualGridX = _tuple$8[0]; thatPlayerInNextFrame$3.VirtualGridY = _tuple$8[1]; if (thatPlayerInNextFrame$3.InAir) { oldNextCharacterState = thatPlayerInNextFrame$3.CharacterState; - _2 = oldNextCharacterState; - if ((_2 === (0)) || (_2 === (1))) { + _1 = oldNextCharacterState; + if ((_1 === (0)) || (_1 === (1))) { if (((i$4 < 0 || i$4 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$4]) || (5 === currPlayerDownsync$4.CharacterState)) { thatPlayerInNextFrame$3.CharacterState = 5; } else { thatPlayerInNextFrame$3.CharacterState = 4; } - } else if (_2 === (2)) { + } else if (_1 === (2)) { thatPlayerInNextFrame$3.CharacterState = 6; - } else if (_2 === (3)) { + } else if (_1 === (3)) { thatPlayerInNextFrame$3.CharacterState = 7; } } if (!((thatPlayerInNextFrame$3.CharacterState === currPlayerDownsync$4.CharacterState))) { thatPlayerInNextFrame$3.FramesInChState = 0; } - _tuple$9 = (_entry$6 = nonAttackingSet[$Int32.keyFor(thatPlayerInNextFrame$3.CharacterState)], _entry$6 !== undefined ? [_entry$6.v, true] : [false, false]); + _tuple$9 = (_entry$5 = nonAttackingSet[$Int32.keyFor(thatPlayerInNextFrame$3.CharacterState)], _entry$5 !== undefined ? [_entry$5.v, true] : [false, false]); existent$2 = _tuple$9[1]; if (existent$2) { thatPlayerInNextFrame$3.ActiveSkillId = -1; @@ -5859,7 +5842,7 @@ $packages["jsexport/battle"] = (function() { _i$9++; } $s = -1; return new RoomDownsyncFrame.ptr(currRenderFrame.Id + 1 >> 0, nextRenderFramePlayers, new $Int64(0, 0), nextRenderFrameMeleeBullets, sliceType$11.nil, new $Uint64(0, 0), false, false); - /* */ } return; } var $f = {$blk: ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame, $c: true, $r, _1, _2, _entry, _entry$1, _entry$2, _entry$3, _entry$4, _entry$5, _entry$6, _i, _i$1, _i$2, _i$3, _i$4, _i$5, _i$6, _i$7, _i$8, _i$9, _index, _index$1, _r, _r$1, _r$2, _r$3, _ref, _ref$1, _ref$10, _ref$11, _ref$12, _ref$13, _ref$2, _ref$3, _ref$4, _ref$5, _ref$6, _ref$7, _ref$8, _ref$9, _tmp, _tmp$1, _tmp$10, _tmp$11, _tmp$12, _tmp$2, _tmp$3, _tmp$4, _tmp$5, _tmp$6, _tmp$7, _tmp$8, _tmp$9, _tuple, _tuple$1, _tuple$2, _tuple$3, _tuple$4, _tuple$5, _tuple$6, _tuple$7, _tuple$8, _tuple$9, atkedPlayerInNextFrame, bShape, bulletCollider, bulletColliders, bulletShape, bulletWx, bulletWy, chConfig, chConfig$1, chConfig$2, chConfigsOrderedByJoinIndex, collision, collision$1, collisionPlayerIndex, collisionPlayerIndex$1, collisionPlayerIndex$2, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currPlayerDownsync, currPlayerDownsync$1, currPlayerDownsync$2, currPlayerDownsync$3, currPlayerDownsync$4, currRenderFrame, defenderShape, effDx, effDy, effPushbacks, existent, existent$1, existent$2, hardPushbackNorm, hardPushbackNorms, hitboxSizeWx, hitboxSizeWy, i, i$1, i$2, i$3, i$4, inputsBuffer, isAnotherPlayer, isBarrier, isBullet, joinIndex, joinIndex$1, joinIndex$2, joinIndex$3, jumpedOrNot, jumpedOrNotList, landedOnGravityPushback, meleeBullet, newBullet, newBulletCollider, newVx, newVy, nextRenderFrameMeleeBullets, nextRenderFramePlayers, normAlignmentWithGravity, obj, obj$1, offender, offender$1, oldFramesToRecover, oldNextCharacterState, overlapResult, overlapped, overlapped$1, patternId, playerCollider, playerCollider$1, playerCollider$2, playerShape, projectedMagnitude, pushbackVelX, pushbackVelY, pushbackX, pushbackY, roomCapacity, skillConfig, skillId, t, t$1, thatPlayerInNextFrame, thatPlayerInNextFrame$1, thatPlayerInNextFrame$2, thatPlayerInNextFrame$3, v, v$1, x, x$1, x$10, x$11, x$12, x$13, x$14, x$2, x$3, x$4, x$5, x$6, x$7, x$8, x$9, xfac, xfac$1, $s};return $f; + /* */ } return; } var $f = {$blk: ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame, $c: true, $r, _1, _entry, _entry$1, _entry$2, _entry$3, _entry$4, _entry$5, _i, _i$1, _i$2, _i$3, _i$4, _i$5, _i$6, _i$7, _i$8, _i$9, _index, _index$1, _r, _r$1, _r$2, _r$3, _r$4, _ref, _ref$1, _ref$10, _ref$11, _ref$12, _ref$13, _ref$2, _ref$3, _ref$4, _ref$5, _ref$6, _ref$7, _ref$8, _ref$9, _tmp, _tmp$1, _tmp$10, _tmp$11, _tmp$12, _tmp$2, _tmp$3, _tmp$4, _tmp$5, _tmp$6, _tmp$7, _tmp$8, _tmp$9, _tuple, _tuple$1, _tuple$2, _tuple$3, _tuple$4, _tuple$5, _tuple$6, _tuple$7, _tuple$8, _tuple$9, atkedPlayerInNextFrame, bShape, bulletCollider, bulletColliders, bulletShape, bulletWx, bulletWy, chConfig, chConfig$1, chConfig$2, chConfigsOrderedByJoinIndex, collision, collision$1, collisionPlayerIndex, collisionPlayerIndex$1, collisionPlayerIndex$2, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currPlayerDownsync, currPlayerDownsync$1, currPlayerDownsync$2, currPlayerDownsync$3, currPlayerDownsync$4, currRenderFrame, defenderShape, effDx, effDy, effPushbacks, existent, existent$1, existent$2, hardPushbackNorm, hardPushbackNorms, hitboxSizeWx, hitboxSizeWy, i, i$1, i$2, i$3, i$4, inputsBuffer, isAnotherPlayer, isBarrier, isBullet, joinIndex, joinIndex$1, joinIndex$2, joinIndex$3, jumpedOrNot, jumpedOrNotList, landedOnGravityPushback, meleeBullet, newBullet, newBulletCollider, newVx, newVy, nextRenderFrameMeleeBullets, nextRenderFramePlayers, normAlignmentWithGravity, obj, obj$1, offender, offender$1, oldFramesToRecover, oldNextCharacterState, overlapResult, overlapped, overlapped$1, patternId, playerCollider, playerCollider$1, playerCollider$2, playerShape, projectedMagnitude, pushbackVelX, pushbackVelY, pushbackX, pushbackY, roomCapacity, skillConfig, skillId, t, t$1, thatPlayerInNextFrame, thatPlayerInNextFrame$1, thatPlayerInNextFrame$2, thatPlayerInNextFrame$3, v, v$1, x, x$1, x$10, x$11, x$12, x$13, x$14, x$2, x$3, x$4, x$5, x$6, x$7, x$8, x$9, xfac, xfac$1, $s};return $f; }; $pkg.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame = ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame; GenerateRectCollider = function(wx, wy, w, h, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, data, tag) { @@ -5968,23 +5951,84 @@ $packages["jsexport/battle"] = (function() { PlayerDownsync.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: ""}]); InputFrameDecoded.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: ""}]); Barrier.init("", [{prop: "Boundary", name: "Boundary", embedded: false, exported: true, typ: ptrType$11, tag: ""}]); - Bullet.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: ""}]); + Bullet.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: mapType, tag: ""}]); MeleeBullet.init("", [{prop: "Bullet", name: "Bullet", embedded: true, exported: true, typ: Bullet, tag: ""}]); FireballBullet.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: Bullet, tag: ""}]); - Skill.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: "Hits", name: "Hits", embedded: false, exported: true, typ: sliceType, tag: ""}]); + Skill.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: sliceType$2, tag: ""}]); RoomDownsyncFrame.init("", [{prop: "Id", name: "Id", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "PlayersArr", name: "PlayersArr", embedded: false, exported: true, typ: sliceType$6, tag: ""}, {prop: "CountdownNanos", name: "CountdownNanos", embedded: false, exported: true, typ: $Int64, tag: ""}, {prop: "MeleeBullets", name: "MeleeBullets", embedded: false, exported: true, typ: sliceType$7, tag: ""}, {prop: "FireballBullets", name: "FireballBullets", embedded: false, exported: true, typ: sliceType$11, 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: mapType, tag: ""}]); InputFrameDownsync.init("", [{prop: "InputFrameId", name: "InputFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "InputList", name: "InputList", embedded: false, exported: true, typ: sliceType$5, tag: ""}, {prop: "ConfirmedList", name: "ConfirmedList", embedded: false, exported: true, typ: $Uint64, tag: ""}]); - RingBuffer.init("", [{prop: "Ed", name: "Ed", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "St", name: "St", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "EdFrameId", name: "EdFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "StFrameId", name: "StFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "N", name: "N", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Cnt", name: "Cnt", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Eles", name: "Eles", embedded: false, exported: true, typ: sliceType, tag: ""}]); - CharacterConfig.init("", [{prop: "SpeciesId", name: "SpeciesId", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "SpeciesName", name: "SpeciesName", embedded: false, exported: true, typ: $String, tag: ""}, {prop: "InAirIdleFrameIdxTurningPoint", name: "InAirIdleFrameIdxTurningPoint", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "InAirIdleFrameIdxTurnedCycle", name: "InAirIdleFrameIdxTurnedCycle", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "LayDownFrames", name: "LayDownFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "LayDownFramesToRecover", name: "LayDownFramesToRecover", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "GetUpFrames", name: "GetUpFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "GetUpFramesToRecover", name: "GetUpFramesToRecover", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "JumpingInitVelY", name: "JumpingInitVelY", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "PatternIdToSkillId", name: "PatternIdToSkillId", embedded: false, exported: true, typ: mapType, tag: ""}]); + RingBuffer.init("", [{prop: "Ed", name: "Ed", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "St", name: "St", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "EdFrameId", name: "EdFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "StFrameId", name: "StFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "N", name: "N", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Cnt", name: "Cnt", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Eles", name: "Eles", embedded: false, exported: true, typ: sliceType$2, tag: ""}]); + SkillMapperType.init([$Int, ptrType$5], [$Int], false); + CharacterConfig.init("", [{prop: "SpeciesId", name: "SpeciesId", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "SpeciesName", name: "SpeciesName", embedded: false, exported: true, typ: $String, tag: ""}, {prop: "InAirIdleFrameIdxTurningPoint", name: "InAirIdleFrameIdxTurningPoint", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "InAirIdleFrameIdxTurnedCycle", name: "InAirIdleFrameIdxTurnedCycle", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "LayDownFrames", name: "LayDownFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "LayDownFramesToRecover", name: "LayDownFramesToRecover", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "GetUpFrames", name: "GetUpFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "GetUpFramesToRecover", name: "GetUpFramesToRecover", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "JumpingInitVelY", name: "JumpingInitVelY", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "SkillMapper", name: "SkillMapper", embedded: false, exported: true, typ: SkillMapperType, tag: ""}]); SatResult.init("", [{prop: "Overlap", name: "Overlap", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "OverlapX", name: "OverlapX", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "OverlapY", name: "OverlapY", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "AContainedInB", name: "AContainedInB", embedded: false, exported: true, typ: $Bool, tag: ""}, {prop: "BContainedInA", name: "BContainedInA", embedded: false, exported: true, typ: $Bool, tag: ""}, {prop: "Axis", name: "Axis", embedded: false, exported: true, typ: resolv.Vector, tag: ""}]); $init = function() { $pkg.$init = function() {}; /* */ 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 = math.$init(); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } $r = resolv.$init(); /* */ $s = 2; case 2: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - $pkg.Characters = $makeMap($Int.keyFor, [{ k: 0, v: new CharacterConfig.ptr(0, "MonkGirl", 11, 1, 16, 16, 33, 30, 800, $makeMap($Int.keyFor, [{ k: 1, v: 1 }, { k: 2, v: 2 }, { k: 3, v: 3 }, { k: 255, v: 255 }])) }]); - skills = $makeMap($Int.keyFor, [{ k: 1, v: new Skill.ptr(0, 20, 20, 20, 1, new sliceType([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 5, 8, 20, 10, 13, 9, 50, 0, 5, 0, 0, 1200, 0, 2400, 3200, false))])) }, { k: 2, v: new Skill.ptr(0, 36, 36, 36, 1, new sliceType([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 3, 18, 36, 20, 18, 9, 50, 0, 5, 0, 0, 1800, 0, 2400, 3200, false))])) }, { k: 3, v: new Skill.ptr(0, 60, 60, 60, 1, new sliceType([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 1, 0, 0, 30, 999999999, 9, 100, 400, 10, 0, 0, 2400, 0, 3200, 3200, true))])) }, { k: 255, v: new Skill.ptr(0, 34, 34, 34, 1, new sliceType([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 3, 0, 0, 20, 18, 9, 50, 0, 5, 0, 0, 1200, 0, 3200, 2400, false))])) }]); - $pkg.DIRECTION_DECODER = new sliceType$2([new sliceType$1([0, 0]), new sliceType$1([0, 2]), new sliceType$1([0, -2]), new sliceType$1([2, 0]), new sliceType$1([-2, 0]), new sliceType$1([1, 1]), new sliceType$1([-1, -1]), new sliceType$1([1, -1]), new sliceType$1([-1, 1])]); + $pkg.DIRECTION_DECODER = new sliceType$1([new sliceType([0, 0]), new sliceType([0, 2]), new sliceType([0, -2]), new sliceType([2, 0]), new sliceType([-2, 0]), new sliceType([1, 1]), new sliceType([-1, -1]), new sliceType([1, -1]), new sliceType([-1, 1])]); + skills = $makeMap($Int.keyFor, [{ k: 1, v: new Skill.ptr(0, 30, 30, 30, 1, 2, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 7, 13, 30, 22, 13, 9, 50, 0, 5, 0, 0, 1200, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 2 }])))])) }, { k: 2, v: new Skill.ptr(0, 36, 36, 36, 1, 11, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 18, 22, 36, 18, 18, 9, 50, 0, 5, 0, 0, 1800, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 3 }])))])) }, { k: 3, v: new Skill.ptr(0, 60, 60, 60, 1, 12, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 15, 0, 0, 40, 999999999, 9, 200, 700, 10, 0, 0, 2400, 0, 3200, 3200, true, false))])) }, { k: 4, v: new Skill.ptr(0, 30, 30, 30, 1, 2, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 7, 13, 30, 22, 13, 9, 50, 0, 5, 0, 0, 1200, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 5 }])))])) }, { k: 5, v: new Skill.ptr(0, 36, 36, 36, 1, 11, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 18, 22, 36, 18, 18, 9, 50, 0, 5, 0, 0, 1800, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 6 }])))])) }, { k: 6, v: new Skill.ptr(0, 60, 60, 60, 1, 12, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 15, 0, 0, 40, 999999999, 9, 200, 700, 10, 0, 0, 2400, 0, 3200, 3200, true, false))])) }, { k: 255, v: new Skill.ptr(0, 34, 34, 34, 1, 6, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 3, 0, 0, 20, 18, 9, 50, 0, 5, 0, 0, 1200, 0, 3200, 2400, false, false))])) }, { k: 256, v: new Skill.ptr(0, 34, 34, 34, 1, 6, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 3, 0, 0, 20, 18, 9, 50, 0, 5, 0, 0, 1200, 0, 3200, 2400, false, false))])) }]); + $pkg.Characters = $makeMap($Int.keyFor, [{ k: 0, v: new CharacterConfig.ptr(0, "MonkGirl", 11, 1, 16, 16, 33, 30, 800, (function(patternId, currPlayerDownsync) { + var _entry, _entry$1, _ref, _tuple, _tuple$1, currPlayerDownsync, existent1, existent2, nextSkillId, patternId, skillConfig, v, x, x$1; + if (1 === patternId) { + if (0 === currPlayerDownsync.FramesToRecover) { + if (currPlayerDownsync.InAir) { + return 255; + } else { + return 1; + } + } else { + _tuple = (_entry = skills[$Int.keyFor(((currPlayerDownsync.ActiveSkillId >> 0)))], _entry !== undefined ? [_entry.v, true] : [ptrType.nil, false]); + skillConfig = _tuple[0]; + existent1 = _tuple[1]; + if (existent1) { + _ref = (x = skillConfig.Hits, x$1 = currPlayerDownsync.ActiveSkillHit, ((x$1 < 0 || x$1 >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + x$1])); + if ($assertType(_ref, ptrType$1, true)[1]) { + v = _ref.$val; + if (v.Bullet.CancellableStFrame <= currPlayerDownsync.FramesInChState && currPlayerDownsync.FramesInChState < v.Bullet.CancellableEdFrame) { + _tuple$1 = (_entry$1 = v.Bullet.CancelTransit[$Int.keyFor(patternId)], _entry$1 !== undefined ? [_entry$1.v, true] : [0, false]); + nextSkillId = _tuple$1[0]; + existent2 = _tuple$1[1]; + if (existent2) { + return nextSkillId; + } + } + } + } + } + } + return -1; + })) }, { k: 1, v: new CharacterConfig.ptr(1, "KnifeGirl", 9, 1, 16, 16, 30, 27, 750, (function(patternId, currPlayerDownsync) { + var _entry, _entry$1, _ref, _tuple, _tuple$1, currPlayerDownsync, existent1, existent2, nextSkillId, patternId, skillConfig, v, x, x$1; + if (1 === patternId) { + if (0 === currPlayerDownsync.FramesToRecover) { + if (currPlayerDownsync.InAir) { + return 256; + } else { + return 4; + } + } else { + _tuple = (_entry = skills[$Int.keyFor(((currPlayerDownsync.ActiveSkillId >> 0)))], _entry !== undefined ? [_entry.v, true] : [ptrType.nil, false]); + skillConfig = _tuple[0]; + existent1 = _tuple[1]; + if (existent1) { + _ref = (x = skillConfig.Hits, x$1 = currPlayerDownsync.ActiveSkillHit, ((x$1 < 0 || x$1 >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + x$1])); + if ($assertType(_ref, ptrType$1, true)[1]) { + v = _ref.$val; + if (v.Bullet.CancellableStFrame <= currPlayerDownsync.FramesInChState && currPlayerDownsync.FramesInChState < v.Bullet.CancellableEdFrame) { + _tuple$1 = (_entry$1 = v.Bullet.CancelTransit[$Int.keyFor(patternId)], _entry$1 !== undefined ? [_entry$1.v, true] : [0, false]); + nextSkillId = _tuple$1[0]; + existent2 = _tuple$1[1]; + if (existent2) { + return nextSkillId; + } + } + } + } + } + } + return -1; + })) }]); inAirSet = $makeMap($Int32.keyFor, [{ k: 4, v: true }, { k: 5, v: true }, { k: 6, v: true }, { k: 7, v: true }, { k: 8, v: true }]); noOpSet = $makeMap($Int32.keyFor, [{ k: 3, v: true }, { k: 7, v: true }, { k: 8, v: true }, { k: 9, v: true }]); invinsibleSet = $makeMap($Int32.keyFor, [{ k: 8, v: true }, { k: 9, v: true }, { k: 10, v: true }]); @@ -6090,7 +6134,7 @@ $packages["jsexport"] = (function() { $pkg.NewPlayerDownsyncJs = NewPlayerDownsyncJs; NewMeleeBulletJs = function(originatedRenderFrameId, offenderJoinIndex, startupFrames, cancellableStFrame, cancellableEdFrame, activeFrames, hitStunFrames, blockStunFrames, pushbackVelX, pushbackVelY, damage, selfLockVelX, selfLockVelY, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY, blowUp) { var activeFrames, blockStunFrames, blowUp, cancellableEdFrame, cancellableStFrame, damage, hitStunFrames, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY, offenderJoinIndex, originatedRenderFrameId, pushbackVelX, pushbackVelY, selfLockVelX, selfLockVelY, startupFrames; - return js.MakeWrapper(new battle.MeleeBullet.ptr(new battle.Bullet.ptr(originatedRenderFrameId, offenderJoinIndex, startupFrames, cancellableStFrame, cancellableEdFrame, activeFrames, hitStunFrames, blockStunFrames, pushbackVelX, pushbackVelY, damage, selfLockVelX, selfLockVelY, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY, blowUp))); + return js.MakeWrapper(new battle.MeleeBullet.ptr(new battle.Bullet.ptr(originatedRenderFrameId, offenderJoinIndex, startupFrames, cancellableStFrame, cancellableEdFrame, activeFrames, hitStunFrames, blockStunFrames, pushbackVelX, pushbackVelY, damage, selfLockVelX, selfLockVelY, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY, blowUp, false))); }; $pkg.NewMeleeBulletJs = NewMeleeBulletJs; NewRoomDownsyncFrameJs = function(id, playersArr, meleeBullets) { 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..b6c9190 --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/Atk3.anim @@ -0,0 +1,97 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "Atk3", + "_objFlags": 0, + "_native": "", + "_duration": 1.0333333333333334, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "98276733-6f8d-4cac-8a7e-31883834c240" + } + }, + { + "frame": 0.06666666666666667, + "value": { + "__uuid__": "51ab185b-2271-48b5-a897-af79721d566c" + } + }, + { + "frame": 0.15, + "value": { + "__uuid__": "c29fd95d-7467-4138-9e01-6421af63dd68" + } + }, + { + "frame": 0.21666666666666667, + "value": { + "__uuid__": "3285b5eb-c6be-4cb9-ac60-c506645fee4b" + } + }, + { + "frame": 0.3, + "value": { + "__uuid__": "13fd4a87-71f4-4b69-a5b3-413d564c35e6" + } + }, + { + "frame": 0.38333333333333336, + "value": { + "__uuid__": "7189e229-00d6-427a-8ea1-d05fbd97824f" + } + }, + { + "frame": 0.4666666666666667, + "value": { + "__uuid__": "d9ccfe33-3db7-4b3a-807c-adb2121fb7c7" + } + }, + { + "frame": 0.55, + "value": { + "__uuid__": "a51cbc29-0826-46f7-a38b-8b0f996fbace" + } + }, + { + "frame": 0.65, + "value": { + "__uuid__": "7e9f3a24-6abc-4b49-a5c5-a0c100865ffc" + } + }, + { + "frame": 0.7333333333333333, + "value": { + "__uuid__": "ecbaeb43-1118-483a-91c9-ff1ff01b7b33" + } + }, + { + "frame": 0.8166666666666667, + "value": { + "__uuid__": "58afa365-a916-4ec6-aab3-1c87f5332b12" + } + }, + { + "frame": 0.9166666666666666, + "value": { + "__uuid__": "7ada26fa-c72d-46f6-9b3a-ae9d7ba5eaf4" + } + }, + { + "frame": 1.0166666666666666, + "value": { + "__uuid__": "ee5e4a85-6dda-4d1e-a469-5be1db6a8913" + } + } + ] + } + } + }, + "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..186d692 --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/BlownUp1.anim @@ -0,0 +1,43 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "BlownUp1", + "_objFlags": 0, + "_native": "", + "_duration": 0.45, + "sample": 60, + "speed": 1, + "wrapMode": 2, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "8e2e03e0-7e2f-4bbb-b039-e232ef586232" + } + }, + { + "frame": 0.15, + "value": { + "__uuid__": "0ea84f61-4a2f-4ca2-a0b8-b580e027c142" + } + }, + { + "frame": 0.3, + "value": { + "__uuid__": "a3a31fcd-a162-456a-9c26-1f32413f87f3" + } + }, + { + "frame": 0.43333333333333335, + "value": { + "__uuid__": "da4ee0a0-ba66-455c-99d3-9c803a3d0f17" + } + } + ] + } + } + }, + "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..3d7ca5f --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/GetUp1.anim @@ -0,0 +1,49 @@ +{ + "__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__": "57640cd8-17eb-4279-a118-1ea40174da3c" + } + }, + { + "frame": 0.15, + "value": { + "__uuid__": "d08a4f50-8707-4da2-8b12-83d1bf4fa2ca" + } + }, + { + "frame": 0.3, + "value": { + "__uuid__": "3f26b0a4-db13-4a14-b885-5a812073eccf" + } + }, + { + "frame": 0.4, + "value": { + "__uuid__": "23eb42d6-52a2-458d-98a3-2f692dd79398" + } + }, + { + "frame": 0.5, + "value": { + "__uuid__": "7bd4428c-44f9-4ff8-8d00-d3448a27a0c4" + } + } + ] + } + } + }, + "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..24396b6 --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/Idle1.anim @@ -0,0 +1,85 @@ +{ + "__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__": "9ecbf97e-34bc-4c5e-b9e8-4d885a02e0d3" + } + }, + { + "frame": 0.21666666666666667, + "value": { + "__uuid__": "92852885-b66d-42fe-a8e0-153e6c494bd2" + } + }, + { + "frame": 0.4166666666666667, + "value": { + "__uuid__": "b0f1ecf7-be41-46a8-bccb-92ee53b4ef88" + } + }, + { + "frame": 0.6166666666666667, + "value": { + "__uuid__": "944adaee-5e11-4c55-9573-1d529f21ed4b" + } + }, + { + "frame": 0.8, + "value": { + "__uuid__": "ede36130-8312-46a2-abe5-ba102bc97822" + } + }, + { + "frame": 1.0166666666666666, + "value": { + "__uuid__": "32dbb977-301c-4fbd-a19c-14a5ce0e2f5b" + } + }, + { + "frame": 1.2, + "value": { + "__uuid__": "581c7ab1-451d-46b0-9eeb-24cf3b898924" + } + }, + { + "frame": 1.4, + "value": { + "__uuid__": "27005132-eda8-4c3f-9f4a-3a6004245e9f" + } + }, + { + "frame": 1.5833333333333333, + "value": { + "__uuid__": "2b339657-aa80-4ab6-a4dd-83e9c12b6a54" + } + }, + { + "frame": 1.7833333333333334, + "value": { + "__uuid__": "08e25a99-158d-4159-8152-6c9047fe9d54" + } + }, + { + "frame": 2, + "value": { + "__uuid__": "ab739541-39b5-4758-9b93-6681d6038730" + } + } + ] + } + } + }, + "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..f5c8b15 --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.plist @@ -0,0 +1,1451 @@ + + + + + frames + + Atk1_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,128} + spriteSourceSize + {112,128} + textureRect + {{288,640},{112,128}} + textureRotated + + + Atk1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,128} + spriteSourceSize + {112,128} + textureRect + {{352,768},{112,128}} + textureRotated + + + Atk1_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {64,128} + spriteSourceSize + {64,128} + textureRect + {{784,288},{64,128}} + textureRotated + + + Atk1_11.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,128} + spriteSourceSize + {80,128} + textureRect + {{592,256},{80,128}} + textureRotated + + + Atk1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,128} + spriteSourceSize + {80,128} + textureRect + {{672,256},{80,128}} + textureRotated + + + Atk1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,128} + spriteSourceSize + {112,128} + textureRect + {{416,896},{112,128}} + textureRotated + + + Atk1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,128} + spriteSourceSize + {112,128} + textureRect + {{368,128},{112,128}} + textureRotated + + + Atk1_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,128} + spriteSourceSize + {96,128} + textureRect + {{480,384},{96,128}} + textureRotated + + + Atk1_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,128} + spriteSourceSize + {96,128} + textureRect + {{496,512},{96,128}} + textureRotated + + + Atk1_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,128} + spriteSourceSize + {80,128} + textureRect + {{688,128},{80,128}} + textureRotated + + + Atk1_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,128} + spriteSourceSize + {80,128} + textureRect + {{752,0},{80,128}} + textureRotated + + + Atk1_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,128} + spriteSourceSize + {80,128} + textureRect + {{672,384},{80,128}} + textureRotated + + + Atk2_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,128} + spriteSourceSize + {80,128} + textureRect + {{688,512},{80,128}} + textureRotated + + + Atk2_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,128} + spriteSourceSize + {96,128} + textureRect + {{576,384},{96,128}} + textureRotated + + + Atk2_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {128,112} + spriteSourceSize + {128,112} + textureRect + {{256,528},{128,112}} + textureRotated + + + Atk2_11.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,96} + spriteSourceSize + {96,96} + textureRect + {{1024,720},{96,96}} + textureRotated + + + Atk2_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,112} + spriteSourceSize + {96,112} + textureRect + {{816,352},{96,112}} + textureRotated + + + Atk2_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,112} + spriteSourceSize + {96,112} + textureRect + {{816,464},{96,112}} + textureRotated + + + Atk2_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,112} + spriteSourceSize + {96,112} + textureRect + {{1040,448},{96,112}} + textureRotated + + + Atk2_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,112} + spriteSourceSize + {96,112} + textureRect + {{912,480},{96,112}} + textureRotated + + + Atk2_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {144,112} + spriteSourceSize + {144,112} + textureRect + {{176,640},{144,112}} + textureRotated + + + Atk2_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {128,112} + spriteSourceSize + {128,112} + textureRect + {{480,128},{128,112}} + textureRotated + + + Atk2_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {160,112} + spriteSourceSize + {160,112} + textureRect + {{0,160},{160,112}} + textureRotated + + + Atk2_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {144,112} + spriteSourceSize + {144,112} + textureRect + {{240,784},{144,112}} + textureRotated + + + Atk3_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,128} + spriteSourceSize + {80,128} + textureRect + {{704,640},{80,128}} + textureRotated + + + Atk3_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,128} + spriteSourceSize + {96,128} + textureRect + {{512,640},{96,128}} + textureRotated + + + Atk3_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,128} + spriteSourceSize + {80,128} + textureRect + {{768,768},{80,128}} + textureRotated + + + Atk3_11.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,128} + spriteSourceSize + {80,128} + textureRect + {{832,896},{80,128}} + textureRotated + + + Atk3_12.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,128} + spriteSourceSize + {112,128} + textureRect + {{432,0},{112,128}} + textureRotated + + + Atk3_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,128} + spriteSourceSize + {96,128} + textureRect + {{592,512},{96,128}} + textureRotated + + + Atk3_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,128} + spriteSourceSize + {112,128} + textureRect + {{368,256},{112,128}} + textureRotated + + + Atk3_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {144,128} + spriteSourceSize + {144,128} + textureRect + {{112,0},{144,128}} + textureRotated + + + Atk3_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {144,144} + spriteSourceSize + {144,144} + textureRect + {{96,800},{144,144}} + textureRotated + + + Atk3_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,160} + spriteSourceSize + {96,160} + textureRect + {{0,640},{96,160}} + textureRotated + + + Atk3_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,160} + spriteSourceSize + {96,160} + textureRect + {{0,800},{96,160}} + textureRotated + + + Atk3_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,160} + spriteSourceSize + {112,160} + textureRect + {{0,0},{112,160}} + textureRotated + + + Atk3_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,160} + spriteSourceSize + {80,160} + textureRect + {{96,640},{80,160}} + textureRotated + + + Atked1_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,128} + spriteSourceSize + {96,128} + textureRect + {{576,768},{96,128}} + textureRotated + + + Atked1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,112} + spriteSourceSize + {112,112} + textureRect + {{1040,0},{112,112}} + textureRotated + + + Atked1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,112} + spriteSourceSize + {96,112} + textureRect + {{1024,544},{96,112}} + textureRotated + + + Atked1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {128,112} + spriteSourceSize + {128,112} + textureRect + {{544,0},{128,112}} + textureRotated + + + BlownUp1_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {160,112} + spriteSourceSize + {160,112} + textureRect + {{0,320},{160,112}} + textureRotated + + + BlownUp1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {160,112} + spriteSourceSize + {160,112} + textureRect + {{0,480},{160,112}} + textureRotated + + + BlownUp1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {128,96} + spriteSourceSize + {128,96} + textureRect + {{592,128},{128,96}} + textureRotated + + + BlownUp1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {144,96} + spriteSourceSize + {144,96} + textureRect + {{272,928},{144,96}} + textureRotated + + + GetUp1_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {144,64} + spriteSourceSize + {144,64} + textureRect + {{0,960},{144,64}} + textureRotated + + + GetUp1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {144,64} + spriteSourceSize + {144,64} + textureRect + {{112,576},{144,64}} + textureRotated + + + GetUp1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {128,80} + spriteSourceSize + {128,80} + textureRect + {{144,944},{128,80}} + textureRotated + + + GetUp1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,80} + spriteSourceSize + {96,80} + textureRect + {{928,768},{96,80}} + textureRotated + + + GetUp1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,80} + spriteSourceSize + {80,80} + textureRect + {{992,928},{80,80}} + textureRotated + + + Idle1_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,128} + spriteSourceSize + {96,128} + textureRect + {{640,896},{96,128}} + textureRotated + + + Idle1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {128,128} + spriteSourceSize + {128,128} + textureRect + {{240,144},{128,128}} + textureRotated + + + Idle1_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,128} + spriteSourceSize + {112,128} + textureRect + {{368,384},{112,128}} + textureRotated + + + Idle1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {128,128} + spriteSourceSize + {128,128} + textureRect + {{304,0},{128,128}} + textureRotated + + + Idle1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {144,128} + spriteSourceSize + {144,128} + textureRect + {{112,144},{144,128}} + textureRotated + + + Idle1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {144,128} + spriteSourceSize + {144,128} + textureRect + {{112,288},{144,128}} + textureRotated + + + Idle1_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {144,128} + spriteSourceSize + {144,128} + textureRect + {{112,432},{144,128}} + textureRotated + + + Idle1_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {128,128} + spriteSourceSize + {128,128} + textureRect + {{240,272},{128,128}} + textureRotated + + + Idle1_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {128,128} + spriteSourceSize + {128,128} + textureRect + {{240,400},{128,128}} + textureRotated + + + Idle1_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,128} + spriteSourceSize + {112,128} + textureRect + {{384,512},{112,128}} + textureRotated + + + Idle1_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,128} + spriteSourceSize + {112,128} + textureRect + {{400,640},{112,128}} + textureRotated + + + InAirAtk1_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,80} + spriteSourceSize + {80,80} + textureRect + {{1072,896},{80,80}} + textureRotated + + + InAirAtk1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,80} + spriteSourceSize + {96,80} + textureRect + {{1024,816},{96,80}} + textureRotated + + + InAirAtk1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,112} + spriteSourceSize + {112,112} + textureRect + {{1040,112},{112,112}} + textureRotated + + + InAirAtk1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,112} + spriteSourceSize + {112,112} + textureRect + {{1040,224},{112,112}} + textureRotated + + + InAirAtk1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {128,112} + spriteSourceSize + {128,112} + textureRect + {{480,256},{128,112}} + textureRotated + + + InAirAtk1_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,80} + spriteSourceSize + {112,80} + textureRect + {{832,688},{112,80}} + textureRotated + + + InAirAtked1_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,112} + spriteSourceSize + {112,112} + textureRect + {{1040,336},{112,112}} + textureRotated + + + InAirAtked1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {128,96} + spriteSourceSize + {128,96} + textureRect + {{656,0},{128,96}} + textureRotated + + + InAirIdle1_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,112} + spriteSourceSize + {80,112} + textureRect + {{832,576},{80,112}} + textureRotated + + + InAirIdle1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,112} + spriteSourceSize + {80,112} + textureRect + {{848,768},{80,112}} + textureRotated + + + InAirIdle1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {64,128} + spriteSourceSize + {64,128} + textureRect + {{912,320},{64,128}} + textureRotated + + + InAirIdle1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,112} + spriteSourceSize + {80,112} + textureRect + {{1024,640},{80,112}} + textureRotated + + + InAirIdle1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,96} + spriteSourceSize + {80,96} + textureRect + {{944,672},{80,96}} + textureRotated + + + InAirIdle1_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,96} + spriteSourceSize + {80,96} + textureRect + {{928,848},{80,96}} + textureRotated + + + InAirIdle1_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,96} + spriteSourceSize + {80,96} + textureRect + {{912,928},{80,96}} + textureRotated + + + InAirIdle1_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,112} + spriteSourceSize + {96,112} + textureRect + {{912,576},{96,112}} + textureRotated + + + InAirIdle1_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,128} + spriteSourceSize + {96,128} + textureRect + {{608,640},{96,128}} + textureRotated + + + InAirIdle1_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,128} + spriteSourceSize + {96,128} + textureRect + {{672,768},{96,128}} + textureRotated + + + LayDown1_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {144,64} + spriteSourceSize + {144,64} + textureRect + {{240,0},{144,64}} + textureRotated + + + LayDown1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {128,48} + spriteSourceSize + {128,48} + textureRect + {{912,384},{128,48}} + textureRotated + + + LayDown1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {128,48} + spriteSourceSize + {128,48} + textureRect + {{912,432},{128,48}} + textureRotated + + + Walking_0.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,128} + spriteSourceSize + {112,128} + textureRect + {{464,768},{112,128}} + textureRotated + + + Walking_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,128} + spriteSourceSize + {112,128} + textureRect + {{528,896},{112,128}} + textureRotated + + + Walking_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,128} + spriteSourceSize + {80,128} + textureRect + {{912,0},{80,128}} + textureRotated + + + Walking_11.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,128} + spriteSourceSize + {80,128} + textureRect + {{832,0},{80,128}} + textureRotated + + + Walking_12.png + + aliases + + spriteOffset + {0,0} + spriteSize + {96,128} + spriteSourceSize + {96,128} + textureRect + {{736,896},{96,128}} + textureRotated + + + Walking_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,128} + spriteSourceSize + {80,128} + textureRect + {{912,80},{80,128}} + textureRotated + + + Walking_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {48,128} + spriteSourceSize + {48,128} + textureRect + {{768,512},{48,128}} + textureRotated + + + Walking_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {48,128} + spriteSourceSize + {48,128} + textureRect + {{784,640},{48,128}} + textureRotated + + + Walking_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,128} + spriteSourceSize + {80,128} + textureRect + {{784,128},{80,128}} + textureRotated + + + Walking_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {64,128} + spriteSourceSize + {64,128} + textureRect + {{752,384},{64,128}} + textureRotated + + + Walking_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,128} + spriteSourceSize + {80,128} + textureRect + {{912,160},{80,128}} + textureRotated + + + Walking_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,128} + spriteSourceSize + {80,128} + textureRect + {{784,208},{80,128}} + textureRotated + + + Walking_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {80,128} + spriteSourceSize + {80,128} + textureRect + {{912,240},{80,128}} + textureRotated + + + + metadata + + format + 3 + pixelFormat + RGBA8888 + premultiplyAlpha + + realTextureFileName + KnifeGirl.png + size + {1152,1024} + smartupdate + $TexturePacker:SmartUpdate:43c720e0426fad1631b1b033ca007c9b:6efe60d7637a19764428580eac5c940c: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..14176d3 --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.plist.meta @@ -0,0 +1,2102 @@ +{ + "ver": "1.2.4", + "uuid": "579bc0c1-f5e2-4a5d-889b-9d567e53b0e6", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "size": { + "width": 1152, + "height": 1024 + }, + "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": 288, + "trimY": 640, + "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": 352, + "trimY": 768, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 784, + "trimY": 288, + "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": 592, + "trimY": 256, + "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": 672, + "trimY": 256, + "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": 416, + "trimY": 896, + "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": 368, + "trimY": 128, + "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": 480, + "trimY": 384, + "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": 496, + "trimY": 512, + "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": 688, + "trimY": 128, + "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": 752, + "trimY": 0, + "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": 672, + "trimY": 384, + "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": 688, + "trimY": 512, + "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": 576, + "trimY": 384, + "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": 256, + "trimY": 528, + "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": 1024, + "trimY": 720, + "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": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 816, + "trimY": 352, + "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": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 816, + "trimY": 464, + "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": 1040, + "trimY": 448, + "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": 912, + "trimY": 480, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 176, + "trimY": 640, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 480, + "trimY": 128, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 160, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 240, + "trimY": 784, + "width": 144, + "height": 112, + "rawWidth": 144, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_0.png": { + "ver": "1.0.4", + "uuid": "98276733-6f8d-4cac-8a7e-31883834c240", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 704, + "trimY": 640, + "width": 80, + "height": 128, + "rawWidth": 80, + "rawHeight": 128, + "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": 512, + "trimY": 640, + "width": 96, + "height": 128, + "rawWidth": 96, + "rawHeight": 128, + "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": 768, + "trimY": 768, + "width": 80, + "height": 128, + "rawWidth": 80, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_11.png": { + "ver": "1.0.4", + "uuid": "7ada26fa-c72d-46f6-9b3a-ae9d7ba5eaf4", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 832, + "trimY": 896, + "width": 80, + "height": 128, + "rawWidth": 80, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_12.png": { + "ver": "1.0.4", + "uuid": "ee5e4a85-6dda-4d1e-a469-5be1db6a8913", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 432, + "trimY": 0, + "width": 112, + "height": 128, + "rawWidth": 112, + "rawHeight": 128, + "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": 592, + "trimY": 512, + "width": 96, + "height": 128, + "rawWidth": 96, + "rawHeight": 128, + "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": 368, + "trimY": 256, + "width": 112, + "height": 128, + "rawWidth": 112, + "rawHeight": 128, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 112, + "trimY": 0, + "width": 144, + "height": 128, + "rawWidth": 144, + "rawHeight": 128, + "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": 96, + "trimY": 800, + "width": 144, + "height": 144, + "rawWidth": 144, + "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": 0, + "trimY": 640, + "width": 96, + "height": 160, + "rawWidth": 96, + "rawHeight": 160, + "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": 0, + "trimY": 800, + "width": 96, + "height": 160, + "rawWidth": 96, + "rawHeight": 160, + "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": 0, + "trimY": 0, + "width": 112, + "height": 160, + "rawWidth": 112, + "rawHeight": 160, + "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": 96, + "trimY": 640, + "width": 80, + "height": 160, + "rawWidth": 80, + "rawHeight": 160, + "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": 576, + "trimY": 768, + "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": 1040, + "trimY": 0, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 1024, + "trimY": 544, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 544, + "trimY": 0, + "width": 128, + "height": 112, + "rawWidth": 128, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "BlownUp1_0.png": { + "ver": "1.0.4", + "uuid": "8e2e03e0-7e2f-4bbb-b039-e232ef586232", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 320, + "width": 160, + "height": 112, + "rawWidth": 160, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 480, + "width": 160, + "height": 112, + "rawWidth": 160, + "rawHeight": 112, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 592, + "trimY": 128, + "width": 128, + "height": 96, + "rawWidth": 128, + "rawHeight": 96, + "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": 272, + "trimY": 928, + "width": 144, + "height": 96, + "rawWidth": 144, + "rawHeight": 96, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "GetUp1_0.png": { + "ver": "1.0.4", + "uuid": "d08a4f50-8707-4da2-8b12-83d1bf4fa2ca", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 960, + "width": 144, + "height": 64, + "rawWidth": 144, + "rawHeight": 64, + "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": 112, + "trimY": 576, + "width": 144, + "height": 64, + "rawWidth": 144, + "rawHeight": 64, + "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": 144, + "trimY": 944, + "width": 128, + "height": 80, + "rawWidth": 128, + "rawHeight": 80, + "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": 928, + "trimY": 768, + "width": 96, + "height": 80, + "rawWidth": 96, + "rawHeight": 80, + "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": 992, + "trimY": 928, + "width": 80, + "height": 80, + "rawWidth": 80, + "rawHeight": 80, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_0.png": { + "ver": "1.0.4", + "uuid": "92852885-b66d-42fe-a8e0-153e6c494bd2", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 640, + "trimY": 896, + "width": 96, + "height": 128, + "rawWidth": 96, + "rawHeight": 128, + "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": 240, + "trimY": 144, + "width": 128, + "height": 128, + "rawWidth": 128, + "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": 368, + "trimY": 384, + "width": 112, + "height": 128, + "rawWidth": 112, + "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": 304, + "trimY": 0, + "width": 128, + "height": 128, + "rawWidth": 128, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 112, + "trimY": 144, + "width": 144, + "height": 128, + "rawWidth": 144, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 112, + "trimY": 288, + "width": 144, + "height": 128, + "rawWidth": 144, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 112, + "trimY": 432, + "width": 144, + "height": 128, + "rawWidth": 144, + "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": 240, + "trimY": 272, + "width": 128, + "height": 128, + "rawWidth": 128, + "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": 240, + "trimY": 400, + "width": 128, + "height": 128, + "rawWidth": 128, + "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": 384, + "trimY": 512, + "width": 112, + "height": 128, + "rawWidth": 112, + "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": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 400, + "trimY": 640, + "width": 112, + "height": 128, + "rawWidth": 112, + "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": 1072, + "trimY": 896, + "width": 80, + "height": 80, + "rawWidth": 80, + "rawHeight": 80, + "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": 1024, + "trimY": 816, + "width": 96, + "height": 80, + "rawWidth": 96, + "rawHeight": 80, + "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": 1040, + "trimY": 112, + "width": 112, + "height": 112, + "rawWidth": 112, + "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": 1040, + "trimY": 224, + "width": 112, + "height": 112, + "rawWidth": 112, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 480, + "trimY": 256, + "width": 128, + "height": 112, + "rawWidth": 128, + "rawHeight": 112, + "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": 832, + "trimY": 688, + "width": 112, + "height": 80, + "rawWidth": 112, + "rawHeight": 80, + "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": 1040, + "trimY": 336, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 656, + "trimY": 0, + "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": 832, + "trimY": 576, + "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": 848, + "trimY": 768, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 912, + "trimY": 320, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 1024, + "trimY": 640, + "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": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 944, + "trimY": 672, + "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": 928, + "trimY": 848, + "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": 912, + "trimY": 928, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 912, + "trimY": 576, + "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": 608, + "trimY": 640, + "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": 672, + "trimY": 768, + "width": 96, + "height": 128, + "rawWidth": 96, + "rawHeight": 128, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "LayDown1_0.png": { + "ver": "1.0.4", + "uuid": "7effc101-0b6c-4399-beea-7c9ef6e9df7e", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 240, + "trimY": 0, + "width": 144, + "height": 64, + "rawWidth": 144, + "rawHeight": 64, + "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": 912, + "trimY": 384, + "width": 128, + "height": 48, + "rawWidth": 128, + "rawHeight": 48, + "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": 912, + "trimY": 432, + "width": 128, + "height": 48, + "rawWidth": 128, + "rawHeight": 48, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_0.png": { + "ver": "1.0.4", + "uuid": "cbbd2ddc-9ed3-40bf-ab87-2f9d26c2dd85", + "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 464, + "trimY": 768, + "width": 112, + "height": 128, + "rawWidth": 112, + "rawHeight": 128, + "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": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 528, + "trimY": 896, + "width": 112, + "height": 128, + "rawWidth": 112, + "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": 912, + "trimY": 0, + "width": 80, + "height": 128, + "rawWidth": 80, + "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": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 832, + "trimY": 0, + "width": 80, + "height": 128, + "rawWidth": 80, + "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": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 736, + "trimY": 896, + "width": 96, + "height": 128, + "rawWidth": 96, + "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": 912, + "trimY": 80, + "width": 80, + "height": 128, + "rawWidth": 80, + "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": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 768, + "trimY": 512, + "width": 48, + "height": 128, + "rawWidth": 48, + "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": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 784, + "trimY": 640, + "width": 48, + "height": 128, + "rawWidth": 48, + "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": 784, + "trimY": 128, + "width": 80, + "height": 128, + "rawWidth": 80, + "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": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 752, + "trimY": 384, + "width": 64, + "height": 128, + "rawWidth": 64, + "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": 912, + "trimY": 160, + "width": 80, + "height": 128, + "rawWidth": 80, + "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": 784, + "trimY": 208, + "width": 80, + "height": 128, + "rawWidth": 80, + "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": 912, + "trimY": 240, + "width": 80, + "height": 128, + "rawWidth": 80, + "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 0000000000000000000000000000000000000000..ce49a1c910476f43c30c8735f5799c47f62ea0dd GIT binary patch literal 111905 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�xRihY$sW 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 literal 0 HcmV?d00001 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..a0cd4e2 --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/LayDown1.anim @@ -0,0 +1,37 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "LayDown1", + "_objFlags": 0, + "_native": "", + "_duration": 0.25, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "7effc101-0b6c-4399-beea-7c9ef6e9df7e" + } + }, + { + "frame": 0.11666666666666667, + "value": { + "__uuid__": "4e8a4f3c-5406-4700-9230-b2abc29a1093" + } + }, + { + "frame": 0.23333333333333334, + "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..ef50177 --- /dev/null +++ b/frontend/assets/resources/animation/KnifeGirl/Walking.anim @@ -0,0 +1,97 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "Walking", + "_objFlags": 0, + "_native": "", + "_duration": 1.1166666666666667, + "sample": 60, + "speed": 1.2, + "wrapMode": 2, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "30546064-1a11-499e-8523-a82c83951c73" + } + }, + { + "frame": 0.08333333333333333, + "value": { + "__uuid__": "cbbd2ddc-9ed3-40bf-ab87-2f9d26c2dd85" + } + }, + { + "frame": 0.16666666666666666, + "value": { + "__uuid__": "9435195e-4560-495e-b1ae-083c0c87e8a0" + } + }, + { + "frame": 0.25, + "value": { + "__uuid__": "ec048360-7a17-4f22-ba52-eb86ec1acae8" + } + }, + { + "frame": 0.3333333333333333, + "value": { + "__uuid__": "82bb81e3-667c-4280-8710-211f4904ef2f" + } + }, + { + "frame": 0.4166666666666667, + "value": { + "__uuid__": "c3b14ecc-a6d9-4cb3-8637-ca7b407a0f5c" + } + }, + { + "frame": 0.5166666666666667, + "value": { + "__uuid__": "f958fb7f-ef5a-4918-81f3-564004572f45" + } + }, + { + "frame": 0.6166666666666667, + "value": { + "__uuid__": "8a0ecf92-db26-4206-9a80-20e749055def" + } + }, + { + "frame": 0.7333333333333333, + "value": { + "__uuid__": "942f2e02-a700-4fbf-877e-08c93e4d4010" + } + }, + { + "frame": 0.8333333333333334, + "value": { + "__uuid__": "515bb75f-7a1f-4500-8aa9-c895915ce19f" + } + }, + { + "frame": 0.9166666666666666, + "value": { + "__uuid__": "9100da6b-7582-4afb-9698-3d67d3b2012d" + } + }, + { + "frame": 1.0166666666666666, + "value": { + "__uuid__": "1257f72d-0cb3-4750-ae70-13c2d8eb2269" + } + }, + { + "frame": 1.1, + "value": { + "__uuid__": "1d34b6db-27ba-4e26-864d-0f00d501765e" + } + } + ] + } + } + }, + "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/Atk1.anim b/frontend/assets/resources/animation/MonkGirl/Atk1.anim index 0a2dc11..2a20d16 100644 --- a/frontend/assets/resources/animation/MonkGirl/Atk1.anim +++ b/frontend/assets/resources/animation/MonkGirl/Atk1.anim @@ -3,7 +3,7 @@ "_name": "Atk1", "_objFlags": 0, "_native": "", - "_duration": 0.2833333333333333, + "_duration": 0.5, "sample": 60, "speed": 1, "wrapMode": 1, @@ -24,19 +24,19 @@ } }, { - "frame": 0.1, + "frame": 0.11666666666666667, "value": { "__uuid__": "72bc74a1-6e8c-48bb-9ab2-9b8f502ceffb" } }, { - "frame": 0.25, + "frame": 0.43333333333333335, "value": { "__uuid__": "7e619896-100d-4903-b256-e30ddb5ad397" } }, { - "frame": 0.26666666666666666, + "frame": 0.48333333333333334, "value": { "__uuid__": "4a35e0f5-95c4-445b-8f9b-6514a060a72d" } diff --git a/frontend/assets/resources/animation/MonkGirl/Atk3.anim b/frontend/assets/resources/animation/MonkGirl/Atk3.anim index ebf6cfd..1c7c16b 100644 --- a/frontend/assets/resources/animation/MonkGirl/Atk3.anim +++ b/frontend/assets/resources/animation/MonkGirl/Atk3.anim @@ -3,7 +3,7 @@ "_name": "Atk3", "_objFlags": 0, "_native": "", - "_duration": 1, + "_duration": 1.0166666666666666, "sample": 60, "speed": 1, "wrapMode": 1, @@ -13,69 +13,57 @@ "spriteFrame": [ { "frame": 0, - "value": { - "__uuid__": "4e1a3e61-dc3e-4de1-9385-bce2c5f54764" - } - }, - { - "frame": 0.05, "value": { "__uuid__": "39ba4413-6f4a-49a5-a7ca-d11140dfe7dd" } }, { - "frame": 0.11666666666666667, + "frame": 0.08333333333333333, "value": { "__uuid__": "26b646c7-bdbc-495e-adaf-9d52ef1b5c84" } }, { - "frame": 0.21666666666666667, + "frame": 0.16666666666666666, "value": { "__uuid__": "5a5208a0-1c29-446f-8375-739aef09fe65" } }, { - "frame": 0.3, + "frame": 0.2833333333333333, "value": { "__uuid__": "414628f0-13ec-4f01-83a0-b94f6a13fff1" } }, { - "frame": 0.43333333333333335, + "frame": 0.4166666666666667, "value": { "__uuid__": "c494965a-e7e6-4c99-ac61-60642e6247dc" } }, { - "frame": 0.5666666666666667, + "frame": 0.5333333333333333, "value": { "__uuid__": "04cafb17-39ab-4f2b-9830-3eaf42cab254" } }, { - "frame": 0.7166666666666667, + "frame": 0.6666666666666666, "value": { "__uuid__": "fd9c7d8a-1038-4cab-a0e6-699e404701db" } }, { - "frame": 0.8333333333333334, + "frame": 0.8, "value": { "__uuid__": "2447c6b3-292b-43b4-84e5-acc35df0c1f5" } }, { - "frame": 0.9333333333333333, + "frame": 1, "value": { "__uuid__": "00275818-b9b6-41ab-a792-f21ff10747fa" } - }, - { - "frame": 0.9833333333333333, - "value": { - "__uuid__": "11a06f33-cdfa-46cf-aae4-41e72a6711c2" - } } ] } diff --git a/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist b/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist index cec6563..a7ecf2c 100644 --- a/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist +++ b/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist @@ -15,7 +15,7 @@ spriteSourceSize {62,92} textureRect - {{551,127},{62,92}} + {{1211,188},{62,92}} textureRotated @@ -30,9 +30,9 @@ spriteSourceSize {77,99} textureRect - {{93,594},{77,99}} + {{603,325},{77,99}} textureRotated - + Atk1_2.png @@ -45,7 +45,7 @@ spriteSourceSize {112,99} textureRect - {{0,359},{112,99}} + {{407,227},{112,99}} textureRotated @@ -60,7 +60,7 @@ spriteSourceSize {96,100} textureRect - {{240,88},{96,100}} + {{727,101},{96,100}} textureRotated @@ -75,7 +75,7 @@ spriteSourceSize {62,92} textureRect - {{551,127},{62,92}} + {{1211,188},{62,92}} textureRotated @@ -90,9 +90,9 @@ spriteSourceSize {58,97} textureRect - {{170,675},{58,97}} + {{770,402},{58,97}} textureRotated - + Atk2_1.png @@ -105,9 +105,9 @@ spriteSourceSize {60,90} textureRect - {{743,537},{60,90}} + {{1324,435},{60,90}} textureRotated - + Atk2_2.png @@ -120,9 +120,9 @@ spriteSourceSize {84,96} textureRect - {{920,215},{84,96}} + {{823,100},{84,96}} textureRotated - + Atk2_3.png @@ -135,7 +135,7 @@ spriteSourceSize {55,100} textureRect - {{302,365},{55,100}} + {{776,0},{55,100}} textureRotated @@ -150,9 +150,9 @@ spriteSourceSize {63,100} textureRect - {{312,562},{63,100}} + {{407,339},{63,100}} textureRotated - + Atk2_5.png @@ -165,9 +165,9 @@ spriteSourceSize {66,101} textureRect - {{915,299},{66,101}} + {{710,0},{66,101}} textureRotated - + Atk2_6.png @@ -180,7 +180,7 @@ spriteSourceSize {80,95} textureRect - {{548,461},{80,95}} + {{907,96},{80,95}} textureRotated @@ -195,7 +195,7 @@ spriteSourceSize {116,109} textureRect - {{0,0},{116,109}} + {{340,402},{116,109}} textureRotated @@ -210,7 +210,7 @@ spriteSourceSize {102,96} textureRect - {{144,93},{102,96}} + {{646,210},{102,96}} textureRotated @@ -225,9 +225,9 @@ spriteSourceSize {75,102} textureRect - {{170,573},{75,102}} + {{0,437},{75,102}} textureRotated - + Atk3_0.png @@ -236,11 +236,11 @@ spriteOffset {0,0} spriteSize - {51,131} + {66,109} spriteSourceSize - {51,131} + {66,109} textureRect - {{93,109},{51,131}} + {{456,402},{66,109}} textureRotated @@ -251,26 +251,11 @@ spriteOffset {0,0} spriteSize - {53,103} + {66,113} spriteSourceSize - {53,103} + {66,113} textureRect - {{162,470},{53,103}} - textureRotated - - - Atk3_10.png - - aliases - - spriteOffset - {0,0} - spriteSize - {74,100} - spriteSourceSize - {74,100} - textureRect - {{357,365},{74,100}} + {{403,114},{66,113}} textureRotated @@ -281,13 +266,13 @@ spriteOffset {0,0} spriteSize - {70,109} + {78,151} spriteSourceSize - {70,109} + {78,151} textureRect - {{442,127},{70,109}} + {{0,0},{78,151}} textureRotated - + Atk3_3.png @@ -296,13 +281,13 @@ spriteOffset {0,0} spriteSize - {131,93} + {77,144} spriteSourceSize - {131,93} + {77,144} textureRect - {{0,109},{131,93}} + {{0,151},{77,144}} textureRotated - + Atk3_4.png @@ -311,11 +296,11 @@ spriteOffset {0,0} spriteSize - {89,119} + {78,142} spriteSourceSize - {89,119} + {78,142} textureRect - {{0,240},{89,119}} + {{0,295},{78,142}} textureRotated @@ -326,13 +311,13 @@ spriteOffset {0,0} spriteSize - {88,119} + {83,139} spriteSourceSize - {88,119} + {83,139} textureRect - {{236,0},{88,119}} + {{77,151},{83,139}} textureRotated - + Atk3_6.png @@ -341,11 +326,11 @@ spriteOffset {0,0} spriteSize - {57,120} + {78,131} spriteSourceSize - {57,120} + {78,131} textureRect - {{959,0},{57,120}} + {{78,0},{78,131}} textureRotated @@ -356,11 +341,11 @@ spriteOffset {0,0} spriteSize - {59,122} + {59,139} spriteSourceSize - {59,122} + {59,139} textureRect - {{243,350},{59,122}} + {{78,290},{59,139}} textureRotated @@ -371,26 +356,11 @@ spriteOffset {0,0} spriteSize - {80,111} + {59,139} spriteSourceSize - {80,111} + {59,139} textureRect - {{163,350},{80,111}} - textureRotated - - - Atk3_9.png - - aliases - - spriteOffset - {0,0} - spriteSize - {82,110} - spriteSourceSize - {82,110} - textureRect - {{153,240},{82,110}} + {{137,290},{59,139}} textureRotated @@ -405,7 +375,7 @@ spriteSourceSize {62,97} textureRect - {{305,465},{62,97}} + {{708,402},{62,97}} textureRotated @@ -420,7 +390,7 @@ spriteSourceSize {73,95} textureRect - {{943,120},{73,95}} + {{1001,190},{73,95}} textureRotated @@ -435,9 +405,9 @@ spriteSourceSize {90,89} textureRect - {{706,356},{90,89}} + {{1260,93},{90,89}} textureRotated - + BlownUp1_0.png @@ -450,9 +420,9 @@ spriteSourceSize {95,80} textureRect - {{564,653},{95,80}} + {{896,394},{95,80}} textureRotated - + BlownUp1_1.png @@ -465,7 +435,7 @@ spriteSourceSize {80,95} textureRect - {{578,556},{80,95}} + {{976,0},{80,95}} textureRotated @@ -480,9 +450,9 @@ spriteSourceSize {83,92} textureRect - {{623,349},{83,92}} + {{194,429},{83,92}} textureRotated - + BlownUp1_3.png @@ -495,9 +465,9 @@ spriteSourceSize {92,83} textureRect - {{706,445},{92,83}} + {{102,429},{92,83}} textureRotated - + GetUp1_0.png @@ -510,9 +480,9 @@ spriteSourceSize {112,45} textureRect - {{144,195},{112,45}} + {{508,0},{112,45}} textureRotated - + GetUp1_1.png @@ -525,7 +495,7 @@ spriteSourceSize {88,69} textureRect - {{355,284},{88,69}} + {{1236,435},{88,69}} textureRotated @@ -540,9 +510,9 @@ spriteSourceSize {91,90} textureRect - {{215,472},{91,90}} + {{702,312},{91,90}} textureRotated - + GetUp1_3.png @@ -555,9 +525,9 @@ spriteSourceSize {120,93} textureRect - {{116,0},{120,93}} + {{254,124},{120,93}} textureRotated - + GetUp1_4.png @@ -570,7 +540,7 @@ spriteSourceSize {100,112} textureRect - {{0,471},{100,112}} + {{408,0},{100,112}} textureRotated @@ -585,7 +555,7 @@ spriteSourceSize {106,93} textureRect - {{0,583},{106,93}} + {{553,0},{106,93}} textureRotated @@ -600,9 +570,9 @@ spriteSourceSize {106,79} textureRect - {{336,112},{106,79}} + {{567,219},{106,79}} textureRotated - + GetUp1_7.png @@ -615,7 +585,7 @@ spriteSourceSize {73,87} textureRect - {{289,191},{73,87}} + {{1262,0},{73,87}} textureRotated @@ -630,9 +600,9 @@ spriteSourceSize {67,90} textureRect - {{736,627},{67,90}} + {{1341,368},{67,90}} textureRotated - + GetUp1_9.png @@ -645,9 +615,9 @@ spriteSourceSize {58,97} textureRect - {{170,675},{58,97}} + {{770,402},{58,97}} textureRotated - + Idle1_0.png @@ -660,7 +630,7 @@ spriteSourceSize {58,95} textureRect - {{565,365},{58,95}} + {{1050,381},{58,95}} textureRotated @@ -675,7 +645,7 @@ spriteSourceSize {58,97} textureRect - {{367,465},{58,97}} + {{742,201},{58,97}} textureRotated @@ -690,9 +660,9 @@ spriteSourceSize {60,94} textureRect - {{613,204},{60,94}} + {{1146,284},{60,94}} textureRotated - + Idle1_2.png @@ -705,7 +675,7 @@ spriteSourceSize {58,97} textureRect - {{375,562},{58,97}} + {{793,298},{58,97}} textureRotated @@ -720,7 +690,7 @@ spriteSourceSize {58,97} textureRect - {{425,465},{58,97}} + {{800,201},{58,97}} textureRotated @@ -735,9 +705,9 @@ spriteSourceSize {60,95} textureRect - {{802,318},{60,95}} + {{1065,95},{60,95}} textureRotated - + Idle1_5.png @@ -750,7 +720,7 @@ spriteSourceSize {60,94} textureRect - {{877,533},{60,94}} + {{1151,189},{60,94}} textureRotated @@ -765,7 +735,7 @@ spriteSourceSize {59,93} textureRect - {{376,191},{59,93}} + {{1203,0},{59,93}} textureRotated @@ -780,7 +750,7 @@ spriteSourceSize {58,93} textureRect - {{502,266},{58,93}} + {{1206,283},{58,93}} textureRotated @@ -795,7 +765,7 @@ spriteSourceSize {59,93} textureRect - {{443,266},{59,93}} + {{1177,378},{59,93}} textureRotated @@ -810,7 +780,7 @@ spriteSourceSize {60,94} textureRect - {{877,627},{60,94}} + {{1200,94},{60,94}} textureRotated @@ -825,7 +795,7 @@ spriteSourceSize {77,68} textureRect - {{937,652},{77,68}} + {{1264,341},{77,68}} textureRotated @@ -840,9 +810,9 @@ spriteSourceSize {118,76} textureRect - {{355,0},{118,76}} + {{267,284},{118,76}} textureRotated - + InAirAtk1_10.png @@ -855,9 +825,9 @@ spriteSourceSize {104,65} textureRect - {{707,213},{104,65}} + {{595,106},{104,65}} textureRotated - + InAirAtk1_11.png @@ -870,9 +840,9 @@ spriteSourceSize {80,66} textureRect - {{289,264},{80,66}} + {{1349,0},{80,66}} textureRotated - + InAirAtk1_12.png @@ -885,7 +855,7 @@ spriteSourceSize {102,67} textureRect - {{245,563},{102,67}} + {{660,104},{102,67}} textureRotated @@ -900,7 +870,7 @@ spriteSourceSize {79,66} textureRect - {{937,365},{79,66}} + {{1349,66},{79,66}} textureRotated @@ -915,9 +885,9 @@ spriteSourceSize {124,64} textureRect - {{711,0},{124,64}} + {{156,0},{124,64}} textureRotated - + InAirAtk1_4.png @@ -930,9 +900,9 @@ spriteSourceSize {104,64} textureRect - {{811,254},{104,64}} + {{646,0},{104,64}} textureRotated - + InAirAtk1_5.png @@ -945,7 +915,7 @@ spriteSourceSize {79,61} textureRect - {{937,497},{79,61}} + {{1264,280},{79,61}} textureRotated @@ -960,9 +930,9 @@ spriteSourceSize {124,64} textureRect - {{835,0},{124,64}} + {{160,124},{124,64}} textureRotated - + InAirAtk1_7.png @@ -975,9 +945,9 @@ spriteSourceSize {106,67} textureRect - {{814,187},{106,67}} + {{641,402},{106,67}} textureRotated - + InAirAtk1_8.png @@ -990,7 +960,7 @@ spriteSourceSize {79,66} textureRect - {{937,431},{79,66}} + {{1349,132},{79,66}} textureRotated @@ -1005,7 +975,7 @@ spriteSourceSize {118,64} textureRect - {{89,240},{118,64}} + {{343,244},{118,64}} textureRotated @@ -1020,9 +990,9 @@ spriteSourceSize {71,119} textureRect - {{473,0},{71,119}} + {{282,0},{71,119}} textureRotated - + InAirIdle1_1.png @@ -1035,9 +1005,9 @@ spriteSourceSize {71,119} textureRect - {{592,0},{71,119}} + {{196,284},{71,119}} textureRotated - + InAirIdle1_10.png @@ -1050,9 +1020,9 @@ spriteSourceSize {55,114} textureRect - {{593,71},{55,114}} + {{353,0},{55,114}} textureRotated - + InAirIdle1_11.png @@ -1065,7 +1035,7 @@ spriteSourceSize {62,124} textureRect - {{100,470},{62,124}} + {{220,0},{62,124}} textureRotated @@ -1080,7 +1050,7 @@ spriteSourceSize {74,90} textureRect - {{803,628},{74,90}} + {{1273,183},{74,90}} textureRotated @@ -1095,7 +1065,7 @@ spriteSourceSize {110,54} textureRect - {{235,240},{110,54}} + {{286,402},{110,54}} textureRotated @@ -1110,9 +1080,9 @@ spriteSourceSize {85,88} textureRect - {{658,537},{85,88}} + {{1343,283},{85,88}} textureRotated - + InAirIdle1_5.png @@ -1125,7 +1095,7 @@ spriteSourceSize {64,112} textureRect - {{99,358},{64,112}} + {{469,112},{64,112}} textureRotated @@ -1140,9 +1110,9 @@ spriteSourceSize {62,107} textureRect - {{707,151},{62,107}} + {{533,112},{62,107}} textureRotated - + InAirIdle1_7.png @@ -1155,7 +1125,7 @@ spriteSourceSize {85,84} textureRect - {{623,264},{85,84}} + {{1347,198},{85,84}} textureRotated @@ -1170,9 +1140,9 @@ spriteSourceSize {109,61} textureRect - {{834,64},{109,61}} + {{506,224},{109,61}} textureRotated - + InAirIdle1_9.png @@ -1185,9 +1155,9 @@ spriteSourceSize {78,95} textureRect - {{707,278},{78,95}} + {{916,292},{78,95}} textureRotated - + LayDown1_0.png @@ -1200,9 +1170,9 @@ spriteSourceSize {115,56} textureRect - {{478,71},{115,56}} + {{347,119},{115,56}} textureRotated - + LayDown1_1.png @@ -1215,9 +1185,9 @@ spriteSourceSize {109,57} textureRect - {{707,94},{109,57}} + {{522,402},{109,57}} textureRotated - + LayDown1_2.png @@ -1230,9 +1200,9 @@ spriteSourceSize {108,62} textureRect - {{816,125},{108,62}} + {{579,402},{108,62}} textureRotated - + LayDown1_3.png @@ -1245,7 +1215,7 @@ spriteSourceSize {123,36} textureRect - {{355,76},{123,36}} + {{160,248},{123,36}} textureRotated @@ -1260,9 +1230,9 @@ spriteSourceSize {123,30} textureRect - {{711,64},{123,30}} + {{224,124},{123,30}} textureRotated - + Walking_0.png @@ -1275,7 +1245,7 @@ spriteSourceSize {78,95} textureRect - {{628,441},{78,95}} + {{923,191},{78,95}} textureRotated @@ -1290,7 +1260,7 @@ spriteSourceSize {75,96} textureRect - {{433,562},{75,96}} + {{831,0},{75,96}} textureRotated @@ -1305,7 +1275,7 @@ spriteSourceSize {65,96} textureRect - {{431,365},{65,96}} + {{851,298},{65,96}} textureRotated @@ -1320,7 +1290,7 @@ spriteSourceSize {65,96} textureRect - {{483,461},{65,96}} + {{858,196},{65,96}} textureRotated @@ -1335,9 +1305,9 @@ spriteSourceSize {74,95} textureRect - {{375,659},{74,95}} + {{976,387},{74,95}} textureRotated - + Walking_13.png @@ -1350,9 +1320,9 @@ spriteSourceSize {75,94} textureRect - {{470,658},{75,94}} + {{1125,95},{75,94}} textureRotated - + Walking_14.png @@ -1365,7 +1335,7 @@ spriteSourceSize {70,94} textureRect - {{937,558},{70,94}} + {{1133,0},{70,94}} textureRotated @@ -1380,9 +1350,9 @@ spriteSourceSize {78,94} textureRect - {{613,126},{78,94}} + {{1068,285},{78,94}} textureRotated - + Walking_2.png @@ -1395,9 +1365,9 @@ spriteSourceSize {69,96} textureRect - {{496,365},{69,96}} + {{507,333},{69,96}} textureRotated - + Walking_3.png @@ -1410,7 +1380,7 @@ spriteSourceSize {70,96} textureRect - {{508,557},{70,96}} + {{906,0},{70,96}} textureRotated @@ -1425,9 +1395,9 @@ spriteSourceSize {78,95} textureRect - {{796,378},{78,95}} + {{987,95},{78,95}} textureRotated - + Walking_5.png @@ -1440,9 +1410,9 @@ spriteSourceSize {77,95} textureRect - {{789,456},{77,95}} + {{1056,0},{77,95}} textureRotated - + Walking_6.png @@ -1455,9 +1425,9 @@ spriteSourceSize {69,94} textureRect - {{435,197},{69,94}} + {{1108,379},{69,94}} textureRotated - + Walking_7.png @@ -1470,7 +1440,7 @@ spriteSourceSize {77,94} textureRect - {{659,625},{77,94}} + {{1074,190},{77,94}} textureRotated @@ -1485,7 +1455,7 @@ spriteSourceSize {74,95} textureRect - {{803,533},{74,95}} + {{994,286},{74,95}} textureRotated @@ -1500,9 +1470,9 @@ spriteSourceSize {68,96} textureRect - {{267,665},{68,96}} + {{828,395},{68,96}} textureRotated - + metadata @@ -1516,9 +1486,9 @@ realTextureFileName MonkGirl.png size - {1016,733} + {1431,512} smartupdate - $TexturePacker:SmartUpdate:278efbee9ca246d0ea7209b427040c71:0ee1cca010fb9c74ab24ae28995c20de:7b088363a1f16e4f4ff313aecc52227b$ + $TexturePacker:SmartUpdate:b61c8127138360fc5127f38c3072d44e:e6a91336f913f21d08fc641d99741429:7b088363a1f16e4f4ff313aecc52227b$ textureFileName MonkGirl.png diff --git a/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist.meta b/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist.meta index 2b6411b..d76ba3e 100644 --- a/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist.meta +++ b/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist.meta @@ -3,8 +3,8 @@ "uuid": "725c90f9-56f8-48ea-9159-4d2949cd3ce0", "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "size": { - "width": 1016, - "height": 733 + "width": 1431, + "height": 512 }, "type": "Texture Packer", "subMetas": { @@ -17,8 +17,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 551, - "trimY": 127, + "trimX": 1211, + "trimY": 188, "width": 62, "height": 92, "rawWidth": 62, @@ -36,11 +36,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 93, - "trimY": 594, + "trimX": 603, + "trimY": 325, "width": 77, "height": 99, "rawWidth": 77, @@ -61,8 +61,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 0, - "trimY": 359, + "trimX": 407, + "trimY": 227, "width": 112, "height": 99, "rawWidth": 112, @@ -83,8 +83,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 240, - "trimY": 88, + "trimX": 727, + "trimY": 101, "width": 96, "height": 100, "rawWidth": 96, @@ -105,8 +105,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 551, - "trimY": 127, + "trimX": 1211, + "trimY": 188, "width": 62, "height": 92, "rawWidth": 62, @@ -124,11 +124,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 170, - "trimY": 675, + "trimX": 770, + "trimY": 402, "width": 58, "height": 97, "rawWidth": 58, @@ -146,11 +146,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 743, - "trimY": 537, + "trimX": 1324, + "trimY": 435, "width": 60, "height": 90, "rawWidth": 60, @@ -168,11 +168,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 920, - "trimY": 215, + "trimX": 823, + "trimY": 100, "width": 84, "height": 96, "rawWidth": 84, @@ -193,8 +193,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 302, - "trimY": 365, + "trimX": 776, + "trimY": 0, "width": 55, "height": 100, "rawWidth": 55, @@ -212,11 +212,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 312, - "trimY": 562, + "trimX": 407, + "trimY": 339, "width": 63, "height": 100, "rawWidth": 63, @@ -234,11 +234,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 915, - "trimY": 299, + "trimX": 710, + "trimY": 0, "width": 66, "height": 101, "rawWidth": 66, @@ -259,8 +259,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 548, - "trimY": 461, + "trimX": 907, + "trimY": 96, "width": 80, "height": 95, "rawWidth": 80, @@ -281,8 +281,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 0, - "trimY": 0, + "trimX": 340, + "trimY": 402, "width": 116, "height": 109, "rawWidth": 116, @@ -303,8 +303,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 144, - "trimY": 93, + "trimX": 646, + "trimY": 210, "width": 102, "height": 96, "rawWidth": 102, @@ -322,11 +322,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 170, - "trimY": 573, + "trimX": 0, + "trimY": 437, "width": 75, "height": 102, "rawWidth": 75, @@ -347,12 +347,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 93, - "trimY": 109, - "width": 51, - "height": 131, - "rawWidth": 51, - "rawHeight": 131, + "trimX": 456, + "trimY": 402, + "width": 66, + "height": 109, + "rawWidth": 66, + "rawHeight": 109, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -369,34 +369,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 162, - "trimY": 470, - "width": 53, - "height": 103, - "rawWidth": 53, - "rawHeight": 103, - "borderTop": 0, - "borderBottom": 0, - "borderLeft": 0, - "borderRight": 0, - "spriteType": "normal", - "subMetas": {} - }, - "Atk3_10.png": { - "ver": "1.0.4", - "uuid": "4e1a3e61-dc3e-4de1-9385-bce2c5f54764", - "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", - "trimType": "auto", - "trimThreshold": 1, - "rotated": false, - "offsetX": 0, - "offsetY": 0, - "trimX": 357, - "trimY": 365, - "width": 74, - "height": 100, - "rawWidth": 74, - "rawHeight": 100, + "trimX": 403, + "trimY": 114, + "width": 66, + "height": 113, + "rawWidth": 66, + "rawHeight": 113, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -410,15 +388,15 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 442, - "trimY": 127, - "width": 70, - "height": 109, - "rawWidth": 70, - "rawHeight": 109, + "trimX": 0, + "trimY": 0, + "width": 78, + "height": 151, + "rawWidth": 78, + "rawHeight": 151, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -432,15 +410,15 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, "trimX": 0, - "trimY": 109, - "width": 131, - "height": 93, - "rawWidth": 131, - "rawHeight": 93, + "trimY": 151, + "width": 77, + "height": 144, + "rawWidth": 77, + "rawHeight": 144, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -458,11 +436,11 @@ "offsetX": 0, "offsetY": 0, "trimX": 0, - "trimY": 240, - "width": 89, - "height": 119, - "rawWidth": 89, - "rawHeight": 119, + "trimY": 295, + "width": 78, + "height": 142, + "rawWidth": 78, + "rawHeight": 142, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -476,15 +454,15 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 236, - "trimY": 0, - "width": 88, - "height": 119, - "rawWidth": 88, - "rawHeight": 119, + "trimX": 77, + "trimY": 151, + "width": 83, + "height": 139, + "rawWidth": 83, + "rawHeight": 139, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -501,12 +479,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 959, + "trimX": 78, "trimY": 0, - "width": 57, - "height": 120, - "rawWidth": 57, - "rawHeight": 120, + "width": 78, + "height": 131, + "rawWidth": 78, + "rawHeight": 131, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -523,12 +501,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 243, - "trimY": 350, + "trimX": 78, + "trimY": 290, "width": 59, - "height": 122, + "height": 139, "rawWidth": 59, - "rawHeight": 122, + "rawHeight": 139, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -545,34 +523,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 163, - "trimY": 350, - "width": 80, - "height": 111, - "rawWidth": 80, - "rawHeight": 111, - "borderTop": 0, - "borderBottom": 0, - "borderLeft": 0, - "borderRight": 0, - "spriteType": "normal", - "subMetas": {} - }, - "Atk3_9.png": { - "ver": "1.0.4", - "uuid": "11a06f33-cdfa-46cf-aae4-41e72a6711c2", - "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", - "trimType": "auto", - "trimThreshold": 1, - "rotated": false, - "offsetX": 0, - "offsetY": 0, - "trimX": 153, - "trimY": 240, - "width": 82, - "height": 110, - "rawWidth": 82, - "rawHeight": 110, + "trimX": 137, + "trimY": 290, + "width": 59, + "height": 139, + "rawWidth": 59, + "rawHeight": 139, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -589,8 +545,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 305, - "trimY": 465, + "trimX": 708, + "trimY": 402, "width": 62, "height": 97, "rawWidth": 62, @@ -611,8 +567,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 943, - "trimY": 120, + "trimX": 1001, + "trimY": 190, "width": 73, "height": 95, "rawWidth": 73, @@ -630,11 +586,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 706, - "trimY": 356, + "trimX": 1260, + "trimY": 93, "width": 90, "height": 89, "rawWidth": 90, @@ -652,11 +608,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 564, - "trimY": 653, + "trimX": 896, + "trimY": 394, "width": 95, "height": 80, "rawWidth": 95, @@ -677,8 +633,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 578, - "trimY": 556, + "trimX": 976, + "trimY": 0, "width": 80, "height": 95, "rawWidth": 80, @@ -696,11 +652,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 623, - "trimY": 349, + "trimX": 194, + "trimY": 429, "width": 83, "height": 92, "rawWidth": 83, @@ -718,11 +674,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 706, - "trimY": 445, + "trimX": 102, + "trimY": 429, "width": 92, "height": 83, "rawWidth": 92, @@ -740,11 +696,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 144, - "trimY": 195, + "trimX": 508, + "trimY": 0, "width": 112, "height": 45, "rawWidth": 112, @@ -765,8 +721,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 355, - "trimY": 284, + "trimX": 1236, + "trimY": 435, "width": 88, "height": 69, "rawWidth": 88, @@ -784,11 +740,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 215, - "trimY": 472, + "trimX": 702, + "trimY": 312, "width": 91, "height": 90, "rawWidth": 91, @@ -806,11 +762,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 116, - "trimY": 0, + "trimX": 254, + "trimY": 124, "width": 120, "height": 93, "rawWidth": 120, @@ -831,8 +787,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 0, - "trimY": 471, + "trimX": 408, + "trimY": 0, "width": 100, "height": 112, "rawWidth": 100, @@ -853,8 +809,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 0, - "trimY": 583, + "trimX": 553, + "trimY": 0, "width": 106, "height": 93, "rawWidth": 106, @@ -872,11 +828,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 336, - "trimY": 112, + "trimX": 567, + "trimY": 219, "width": 106, "height": 79, "rawWidth": 106, @@ -897,8 +853,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 289, - "trimY": 191, + "trimX": 1262, + "trimY": 0, "width": 73, "height": 87, "rawWidth": 73, @@ -916,11 +872,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 736, - "trimY": 627, + "trimX": 1341, + "trimY": 368, "width": 67, "height": 90, "rawWidth": 67, @@ -938,11 +894,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 170, - "trimY": 675, + "trimX": 770, + "trimY": 402, "width": 58, "height": 97, "rawWidth": 58, @@ -963,8 +919,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 565, - "trimY": 365, + "trimX": 1050, + "trimY": 381, "width": 58, "height": 95, "rawWidth": 58, @@ -985,8 +941,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 367, - "trimY": 465, + "trimX": 742, + "trimY": 201, "width": 58, "height": 97, "rawWidth": 58, @@ -1004,11 +960,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 613, - "trimY": 204, + "trimX": 1146, + "trimY": 284, "width": 60, "height": 94, "rawWidth": 60, @@ -1029,8 +985,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 375, - "trimY": 562, + "trimX": 793, + "trimY": 298, "width": 58, "height": 97, "rawWidth": 58, @@ -1051,8 +1007,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 425, - "trimY": 465, + "trimX": 800, + "trimY": 201, "width": 58, "height": 97, "rawWidth": 58, @@ -1070,11 +1026,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 802, - "trimY": 318, + "trimX": 1065, + "trimY": 95, "width": 60, "height": 95, "rawWidth": 60, @@ -1095,8 +1051,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 877, - "trimY": 533, + "trimX": 1151, + "trimY": 189, "width": 60, "height": 94, "rawWidth": 60, @@ -1117,8 +1073,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 376, - "trimY": 191, + "trimX": 1203, + "trimY": 0, "width": 59, "height": 93, "rawWidth": 59, @@ -1139,8 +1095,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 502, - "trimY": 266, + "trimX": 1206, + "trimY": 283, "width": 58, "height": 93, "rawWidth": 58, @@ -1161,8 +1117,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 443, - "trimY": 266, + "trimX": 1177, + "trimY": 378, "width": 59, "height": 93, "rawWidth": 59, @@ -1183,8 +1139,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 877, - "trimY": 627, + "trimX": 1200, + "trimY": 94, "width": 60, "height": 94, "rawWidth": 60, @@ -1205,8 +1161,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 937, - "trimY": 652, + "trimX": 1264, + "trimY": 341, "width": 77, "height": 68, "rawWidth": 77, @@ -1224,11 +1180,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 355, - "trimY": 0, + "trimX": 267, + "trimY": 284, "width": 118, "height": 76, "rawWidth": 118, @@ -1246,11 +1202,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 707, - "trimY": 213, + "trimX": 595, + "trimY": 106, "width": 104, "height": 65, "rawWidth": 104, @@ -1268,11 +1224,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 289, - "trimY": 264, + "trimX": 1349, + "trimY": 0, "width": 80, "height": 66, "rawWidth": 80, @@ -1293,8 +1249,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 245, - "trimY": 563, + "trimX": 660, + "trimY": 104, "width": 102, "height": 67, "rawWidth": 102, @@ -1315,8 +1271,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 937, - "trimY": 365, + "trimX": 1349, + "trimY": 66, "width": 79, "height": 66, "rawWidth": 79, @@ -1334,10 +1290,10 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 711, + "trimX": 156, "trimY": 0, "width": 124, "height": 64, @@ -1356,11 +1312,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 811, - "trimY": 254, + "trimX": 646, + "trimY": 0, "width": 104, "height": 64, "rawWidth": 104, @@ -1381,8 +1337,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 937, - "trimY": 497, + "trimX": 1264, + "trimY": 280, "width": 79, "height": 61, "rawWidth": 79, @@ -1400,11 +1356,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 835, - "trimY": 0, + "trimX": 160, + "trimY": 124, "width": 124, "height": 64, "rawWidth": 124, @@ -1422,11 +1378,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 814, - "trimY": 187, + "trimX": 641, + "trimY": 402, "width": 106, "height": 67, "rawWidth": 106, @@ -1447,8 +1403,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 937, - "trimY": 431, + "trimX": 1349, + "trimY": 132, "width": 79, "height": 66, "rawWidth": 79, @@ -1469,8 +1425,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 89, - "trimY": 240, + "trimX": 343, + "trimY": 244, "width": 118, "height": 64, "rawWidth": 118, @@ -1488,10 +1444,10 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 473, + "trimX": 282, "trimY": 0, "width": 71, "height": 119, @@ -1510,11 +1466,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 592, - "trimY": 0, + "trimX": 196, + "trimY": 284, "width": 71, "height": 119, "rawWidth": 71, @@ -1532,11 +1488,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 593, - "trimY": 71, + "trimX": 353, + "trimY": 0, "width": 55, "height": 114, "rawWidth": 55, @@ -1557,8 +1513,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 100, - "trimY": 470, + "trimX": 220, + "trimY": 0, "width": 62, "height": 124, "rawWidth": 62, @@ -1579,8 +1535,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 803, - "trimY": 628, + "trimX": 1273, + "trimY": 183, "width": 74, "height": 90, "rawWidth": 74, @@ -1601,8 +1557,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 235, - "trimY": 240, + "trimX": 286, + "trimY": 402, "width": 110, "height": 54, "rawWidth": 110, @@ -1620,11 +1576,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 658, - "trimY": 537, + "trimX": 1343, + "trimY": 283, "width": 85, "height": 88, "rawWidth": 85, @@ -1645,8 +1601,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 99, - "trimY": 358, + "trimX": 469, + "trimY": 112, "width": 64, "height": 112, "rawWidth": 64, @@ -1664,11 +1620,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 707, - "trimY": 151, + "trimX": 533, + "trimY": 112, "width": 62, "height": 107, "rawWidth": 62, @@ -1689,8 +1645,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 623, - "trimY": 264, + "trimX": 1347, + "trimY": 198, "width": 85, "height": 84, "rawWidth": 85, @@ -1708,11 +1664,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 834, - "trimY": 64, + "trimX": 506, + "trimY": 224, "width": 109, "height": 61, "rawWidth": 109, @@ -1730,11 +1686,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 707, - "trimY": 278, + "trimX": 916, + "trimY": 292, "width": 78, "height": 95, "rawWidth": 78, @@ -1752,11 +1708,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 478, - "trimY": 71, + "trimX": 347, + "trimY": 119, "width": 115, "height": 56, "rawWidth": 115, @@ -1774,11 +1730,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 707, - "trimY": 94, + "trimX": 522, + "trimY": 402, "width": 109, "height": 57, "rawWidth": 109, @@ -1796,11 +1752,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 816, - "trimY": 125, + "trimX": 579, + "trimY": 402, "width": 108, "height": 62, "rawWidth": 108, @@ -1821,8 +1777,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 355, - "trimY": 76, + "trimX": 160, + "trimY": 248, "width": 123, "height": 36, "rawWidth": 123, @@ -1840,11 +1796,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 711, - "trimY": 64, + "trimX": 224, + "trimY": 124, "width": 123, "height": 30, "rawWidth": 123, @@ -1865,8 +1821,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 628, - "trimY": 441, + "trimX": 923, + "trimY": 191, "width": 78, "height": 95, "rawWidth": 78, @@ -1887,8 +1843,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 433, - "trimY": 562, + "trimX": 831, + "trimY": 0, "width": 75, "height": 96, "rawWidth": 75, @@ -1909,8 +1865,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 431, - "trimY": 365, + "trimX": 851, + "trimY": 298, "width": 65, "height": 96, "rawWidth": 65, @@ -1931,8 +1887,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 483, - "trimY": 461, + "trimX": 858, + "trimY": 196, "width": 65, "height": 96, "rawWidth": 65, @@ -1950,11 +1906,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 375, - "trimY": 659, + "trimX": 976, + "trimY": 387, "width": 74, "height": 95, "rawWidth": 74, @@ -1972,11 +1928,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 470, - "trimY": 658, + "trimX": 1125, + "trimY": 95, "width": 75, "height": 94, "rawWidth": 75, @@ -1997,8 +1953,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 937, - "trimY": 558, + "trimX": 1133, + "trimY": 0, "width": 70, "height": 94, "rawWidth": 70, @@ -2016,11 +1972,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 613, - "trimY": 126, + "trimX": 1068, + "trimY": 285, "width": 78, "height": 94, "rawWidth": 78, @@ -2038,11 +1994,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 496, - "trimY": 365, + "trimX": 507, + "trimY": 333, "width": 69, "height": 96, "rawWidth": 69, @@ -2063,8 +2019,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 508, - "trimY": 557, + "trimX": 906, + "trimY": 0, "width": 70, "height": 96, "rawWidth": 70, @@ -2082,11 +2038,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 796, - "trimY": 378, + "trimX": 987, + "trimY": 95, "width": 78, "height": 95, "rawWidth": 78, @@ -2104,11 +2060,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 789, - "trimY": 456, + "trimX": 1056, + "trimY": 0, "width": 77, "height": 95, "rawWidth": 77, @@ -2126,11 +2082,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 435, - "trimY": 197, + "trimX": 1108, + "trimY": 379, "width": 69, "height": 94, "rawWidth": 69, @@ -2151,8 +2107,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 659, - "trimY": 625, + "trimX": 1074, + "trimY": 190, "width": 77, "height": 94, "rawWidth": 77, @@ -2173,8 +2129,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 803, - "trimY": 533, + "trimX": 994, + "trimY": 286, "width": 74, "height": 95, "rawWidth": 74, @@ -2192,11 +2148,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 267, - "trimY": 665, + "trimX": 828, + "trimY": 395, "width": 68, "height": 96, "rawWidth": 68, diff --git a/frontend/assets/resources/animation/MonkGirl/MonkGirl.png b/frontend/assets/resources/animation/MonkGirl/MonkGirl.png index dc9467c9b141b704893c6ba82cce0081d96f6449..9c31fbdc9b8f11fdec03a24e0efc099f5441f01b 100644 GIT binary patch literal 97644 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 $>udZ@KF@B$ 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 literal 95461 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 diff --git a/frontend/assets/resources/prefabs/ControlledCharacter.prefab b/frontend/assets/resources/prefabs/ControlledCharacter.prefab index 1e75df0..f768285 100644 --- a/frontend/assets/resources/prefabs/ControlledCharacter.prefab +++ b/frontend/assets/resources/prefabs/ControlledCharacter.prefab @@ -33,14 +33,14 @@ "_active": true, "_components": [ { - "__id__": 27 + "__id__": 21 }, { - "__id__": 28 + "__id__": 22 } ], "_prefab": { - "__id__": 29 + "__id__": 23 }, "_opacity": 255, "_color": { @@ -489,19 +489,13 @@ "__id__": 12 }, { - "__id__": 15 - }, - { - "__id__": 18 - }, - { - "__id__": 22 + "__id__": 16 } ], "_active": true, "_components": [], "_prefab": { - "__id__": 26 + "__id__": 20 }, "_opacity": 255, "_color": { @@ -550,381 +544,6 @@ "groupIndex": 0, "_id": "" }, - { - "__type__": "cc.Node", - "_name": "SoldierWaterGhost", - "_objFlags": 0, - "_parent": { - "__id__": 11 - }, - "_children": [], - "_active": false, - "_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 - } - ], - "_prefab": { - "__id__": 21 - }, - "_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.5 - }, - "_trs": { - "__type__": "TypedArray", - "ctor": "Float64Array", - "array": [ - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0.7, - 0.7, - 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__": 18 - }, - "_enabled": true, - "_defaultClip": null, - "_clips": [ - { - "__uuid__": "252b321f-81f4-485c-85bd-ea44d298cb76" - }, - { - "__uuid__": "f51bb583-0010-48f3-a6a1-451a78ac2d65" - }, - { - "__uuid__": "c738236a-0702-45f8-aa38-99457b051997" - }, - { - "__uuid__": "c69bcceb-d7d1-4e33-9623-e2a374a0a6b6" - }, - { - "__uuid__": "43dbf141-be76-48c3-bdef-29233ccbe30d" - }, - { - "__uuid__": "8710591c-3f5e-4911-83e7-42cc18be6af9" - }, - { - "__uuid__": "c69bcceb-d7d1-4e33-9623-e2a374a0a6b6" - } - ], - "playOnLoad": false, - "_id": "" - }, - { - "__type__": "cc.Sprite", - "_name": "", - "_objFlags": 0, - "node": { - "__id__": 18 - }, - "_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__": "5d522f7b-359b-4f38-ac35-55fdbee56cae" - }, - "_id": "" - }, - { - "__type__": "cc.PrefabInfo", - "root": { - "__id__": 1 - }, - "asset": { - "__uuid__": "59bff7a2-23e1-4d69-bce7-afb37eae196a" - }, - "fileId": "17JdhftghBYr81MfV9i6cy", - "sync": false - }, { "__type__": "cc.Node", "_name": "MonkGirl", @@ -933,17 +552,17 @@ "__id__": 11 }, "_children": [], - "_active": true, + "_active": false, "_components": [ { - "__id__": 23 + "__id__": 13 }, { - "__id__": 24 + "__id__": 14 } ], "_prefab": { - "__id__": 25 + "__id__": 15 }, "_opacity": 255, "_color": { @@ -997,7 +616,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 22 + "__id__": 12 }, "_enabled": true, "_defaultClip": null, @@ -1050,7 +669,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 22 + "__id__": 12 }, "_enabled": true, "_materials": [ @@ -1088,6 +707,169 @@ "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.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0.7, + 0.7, + 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 + }, { "__type__": "cc.PrefabInfo", "root": { diff --git a/frontend/assets/scenes/offline_map.fire b/frontend/assets/scenes/offline_map.fire index 7059ef0..6ba3709 100644 --- a/frontend/assets/scenes/offline_map.fire +++ b/frontend/assets/scenes/offline_map.fire @@ -461,7 +461,7 @@ "array": [ 0, 0, - 216.50635094610968, + 216.05530045313827, 0, 0, 0, diff --git a/frontend/assets/scripts/AttackingCharacter.js b/frontend/assets/scripts/AttackingCharacter.js index 672b997..ca81472 100644 --- a/frontend/assets/scripts/AttackingCharacter.js +++ b/frontend/assets/scripts/AttackingCharacter.js @@ -80,9 +80,9 @@ cc.Class({ // 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); } } diff --git a/frontend/assets/scripts/OfflineMap.js b/frontend/assets/scripts/OfflineMap.js index 166ffde..061ee53 100644 --- a/frontend/assets/scripts/OfflineMap.js +++ b/frontend/assets/scripts/OfflineMap.js @@ -161,7 +161,7 @@ cc.Class({ inAir: true, }), ], - speciesIdList: [0, 0], + speciesIdList: [1, 0], }); self.selfPlayerInfo = { diff --git a/jsexport/battle/battle.go b/jsexport/battle/battle.go index e59d3e9..e8917d5 100644 --- a/jsexport/battle/battle.go +++ b/jsexport/battle/battle.go @@ -28,8 +28,8 @@ const ( SNAP_INTO_PLATFORM_OVERLAP = float64(0.1) SNAP_INTO_PLATFORM_THRESHOLD = float64(0.5) - NO_SKILL = int32(-1) - NO_SKILL_HIT = int32(-1) + NO_SKILL = -1 + NO_SKILL_HIT = -1 ) // These directions are chosen such that when speed is changed to "(speedX+delta, speedY+delta)" for any of them, the direction is unchanged. @@ -383,30 +383,9 @@ func deriveOpPattern(currPlayerDownsync, thatPlayerInNextFrame *PlayerDownsync, } } - /* - As long as the current "CharacterState" is not in "noOpSet", we have 2 cases where attacking is allowed: - 1. it happens when the player is IDLE or Walking, i.e. "0 == currPlayerDownsync.FramesToRecover", which is just the normal case - 2. it happens when the player is having non-empty "ActiveSkillId" which might be cancellable - */ patternId := PATTERN_ID_NO_OP if decodedInput.BtnALevel > prevBtnALevel { - if currPlayerDownsync.InAir { - patternId = 255 - } else { - patternId = 1 - } - } - - if PATTERN_ID_NO_OP != patternId && 0 < currPlayerDownsync.FramesToRecover { - // [WARN] Handle skill cancellation - patternId = PATTERN_ID_NO_OP // First, reset the patternId to no-op as it should be by default not cancelling anything - skillConfig := skills[int(currPlayerDownsync.ActiveSkillId)] - switch v := skillConfig.Hits[currPlayerDownsync.ActiveSkillHit].(type) { - case *MeleeBullet: - if v.CancellableStFrame <= currPlayerDownsync.FramesInChState && currPlayerDownsync.FramesInChState < v.CancellableEdFrame { - patternId = int(currPlayerDownsync.ActiveSkillId + 1) // if "currPlayerDownsync.InAir", it won't map to a valid skill in the next step and thus act as PATTERN_ID_NO_OP - } - } + patternId = 1 } return patternId, jumpedOrNot, effDx, effDy @@ -463,38 +442,28 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer jumpedOrNotList[i] = true } joinIndex := currPlayerDownsync.JoinIndex - if PATTERN_ID_NO_OP != patternId { - if skillId, existent := chConfig.PatternIdToSkillId[patternId]; existent { - skillConfig := skills[skillId] - thatPlayerInNextFrame.ActiveSkillId = int32(skillId) - thatPlayerInNextFrame.ActiveSkillHit = 0 + skillId := chConfig.SkillMapper(patternId, currPlayerDownsync) + if skillConfig, existent := skills[skillId]; existent { + thatPlayerInNextFrame.ActiveSkillId = int32(skillId) + thatPlayerInNextFrame.ActiveSkillHit = 0 - // TODO: Respect non-zero "selfLockVel" + // TODO: Respect non-zero "selfLockVel" - // Hardcoded to use only the first hit for now - switch v := skillConfig.Hits[thatPlayerInNextFrame.ActiveSkillHit].(type) { - case *MeleeBullet: - var newBullet MeleeBullet = *v // Copied primitive fields into an onstack variable - newBullet.OriginatedRenderFrameId = currRenderFrame.Id - newBullet.OffenderJoinIndex = joinIndex - nextRenderFrameMeleeBullets = append(nextRenderFrameMeleeBullets, &newBullet) - thatPlayerInNextFrame.FramesToRecover = skillConfig.RecoveryFrames - } - - // TODO: How to differentiate skill cancellable among different characters, e.g. some characters might be allowed to have 4-cancellation-combo or more? - switch skillId { - case 1: - thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_ATK1 - case 2: - thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_ATK2 - case 3: - thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_ATK3 - } - if false == currPlayerDownsync.InAir { - thatPlayerInNextFrame.VelX = 0 - } - continue // Don't allow movement if skill is used + // Hardcoded to use only the first hit for now + switch v := skillConfig.Hits[thatPlayerInNextFrame.ActiveSkillHit].(type) { + case *MeleeBullet: + var newBullet MeleeBullet = *v // Copied primitive fields into an onstack variable + newBullet.OriginatedRenderFrameId = currRenderFrame.Id + newBullet.OffenderJoinIndex = joinIndex + nextRenderFrameMeleeBullets = append(nextRenderFrameMeleeBullets, &newBullet) + thatPlayerInNextFrame.FramesToRecover = skillConfig.RecoveryFrames } + + thatPlayerInNextFrame.CharacterState = skillConfig.BoundChState + if false == currPlayerDownsync.InAir { + thatPlayerInNextFrame.VelX = 0 + } + continue // Don't allow movement if skill is used } if 0 == currPlayerDownsync.FramesToRecover { @@ -720,8 +689,8 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer // Remove any active skill if not attacking if _, existent := nonAttackingSet[thatPlayerInNextFrame.CharacterState]; existent { - thatPlayerInNextFrame.ActiveSkillId = NO_SKILL - thatPlayerInNextFrame.ActiveSkillHit = NO_SKILL_HIT + thatPlayerInNextFrame.ActiveSkillId = int32(NO_SKILL) + thatPlayerInNextFrame.ActiveSkillHit = int32(NO_SKILL_HIT) } } diff --git a/jsexport/battle/characterConfig.go b/jsexport/battle/characterConfig.go index 4c30c39..165882a 100644 --- a/jsexport/battle/characterConfig.go +++ b/jsexport/battle/characterConfig.go @@ -1,5 +1,7 @@ package battle +type SkillMapperType func(patternId int, currPlayerDownsync *PlayerDownsync) int + type CharacterConfig struct { SpeciesId int SpeciesName string @@ -15,7 +17,7 @@ type CharacterConfig struct { JumpingInitVelY int32 - PatternIdToSkillId map[int]int + SkillMapper SkillMapperType } var Characters = map[int]*CharacterConfig{ @@ -34,26 +36,89 @@ var Characters = map[int]*CharacterConfig{ JumpingInitVelY: int32(float64(8) * WORLD_TO_VIRTUAL_GRID_RATIO), - PatternIdToSkillId: map[int]int{ - 1: 1, // Atk1 - 2: 2, // Atk2 - 3: 3, // Atk3 - 255: 255, // InAirAtk1 + 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), + + GetUpFrames: int32(30), + GetUpFramesToRecover: int32(27), // 3 invinsible frames for just-blown-up character to make a comeback + + 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(20), - RecoveryFramesOnBlock: int32(20), - RecoveryFramesOnHit: int32(20), + RecoveryFrames: int32(30), + RecoveryFramesOnBlock: int32(30), + RecoveryFramesOnHit: int32(30), ReleaseTriggerType: int32(1), + BoundChState: ATK_CHARACTER_STATE_ATK1, Hits: []interface{}{ &MeleeBullet{ Bullet: Bullet{ - StartupFrames: int32(5), - ActiveFrames: int32(10), + StartupFrames: int32(7), + ActiveFrames: int32(22), HitStunFrames: int32(13), BlockStunFrames: int32(9), Damage: int32(5), @@ -63,8 +128,12 @@ var skills = map[int]*Skill{ HitboxOffsetY: int32(0), HitboxSizeX: int32(float64(24) * WORLD_TO_VIRTUAL_GRID_RATIO), HitboxSizeY: int32(float64(32) * WORLD_TO_VIRTUAL_GRID_RATIO), - CancellableStFrame: int32(8), - CancellableEdFrame: int32(20), + CancellableStFrame: int32(13), + CancellableEdFrame: int32(30), + + CancelTransit: map[int]int{ + 1: 2, + }, // TODO: Use non-zero "selfLockVel" }, }, @@ -75,11 +144,12 @@ var skills = map[int]*Skill{ RecoveryFramesOnBlock: int32(36), RecoveryFramesOnHit: int32(36), ReleaseTriggerType: int32(1), + BoundChState: ATK_CHARACTER_STATE_ATK2, Hits: []interface{}{ &MeleeBullet{ Bullet: Bullet{ - StartupFrames: int32(3), - ActiveFrames: int32(20), + StartupFrames: int32(18), + ActiveFrames: int32(18), HitStunFrames: int32(18), BlockStunFrames: int32(9), Damage: int32(5), @@ -89,8 +159,11 @@ var skills = map[int]*Skill{ HitboxOffsetY: int32(0), HitboxSizeX: int32(float64(24) * WORLD_TO_VIRTUAL_GRID_RATIO), HitboxSizeY: int32(float64(32) * WORLD_TO_VIRTUAL_GRID_RATIO), - CancellableStFrame: int32(18), + CancellableStFrame: int32(22), CancellableEdFrame: int32(36), + CancelTransit: map[int]int{ + 1: 3, + }, }, }, }, @@ -100,16 +173,102 @@ var skills = map[int]*Skill{ RecoveryFramesOnBlock: int32(60), RecoveryFramesOnHit: int32(60), ReleaseTriggerType: int32(1), + BoundChState: ATK_CHARACTER_STATE_ATK3, Hits: []interface{}{ &MeleeBullet{ Bullet: Bullet{ - StartupFrames: int32(1), - ActiveFrames: int32(30), + StartupFrames: int32(15), + ActiveFrames: int32(40), HitStunFrames: MAX_INT32, BlockStunFrames: int32(9), Damage: int32(10), - PushbackVelX: int32(float64(1) * WORLD_TO_VIRTUAL_GRID_RATIO), - PushbackVelY: int32(float64(4) * 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(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, + }, + }, + }, + }, + 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), + 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), + 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(60), + RecoveryFramesOnBlock: int32(60), + RecoveryFramesOnHit: int32(60), + ReleaseTriggerType: int32(1), + BoundChState: ATK_CHARACTER_STATE_ATK3, + Hits: []interface{}{ + &MeleeBullet{ + Bullet: Bullet{ + StartupFrames: int32(15), + ActiveFrames: int32(40), + HitStunFrames: MAX_INT32, + BlockStunFrames: int32(9), + Damage: int32(10), + 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), @@ -124,6 +283,31 @@ var skills = map[int]*Skill{ RecoveryFramesOnBlock: int32(34), RecoveryFramesOnHit: int32(34), 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), + 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(34), + RecoveryFramesOnBlock: int32(34), + RecoveryFramesOnHit: int32(34), + ReleaseTriggerType: int32(1), + BoundChState: ATK_CHARACTER_STATE_INAIR_ATK1, Hits: []interface{}{ &MeleeBullet{ Bullet: Bullet{ diff --git a/jsexport/battle/room_downsync_frame.go b/jsexport/battle/room_downsync_frame.go index f411c0e..110bf99 100644 --- a/jsexport/battle/room_downsync_frame.go +++ b/jsexport/battle/room_downsync_frame.go @@ -79,6 +79,8 @@ type Bullet struct { HitboxSizeY int32 BlowUp bool + + CancelTransit map[int]int } type MeleeBullet struct { @@ -101,7 +103,8 @@ type Skill struct { RecoveryFrames int32 RecoveryFramesOnBlock int32 RecoveryFramesOnHit int32 - ReleaseTriggerType int32 // 1: rising-edge, 2: falling-edge + ReleaseTriggerType int32 // 1: rising-edge, 2: falling-edge + BoundChState int32 Hits []interface{} // Hits within a "Skill" are automatically triggered } From 915bbcae3dfcf4d55410c61ab813dc8cc785636b Mon Sep 17 00:00:00 2001 From: genxium Date: Mon, 2 Jan 2023 12:23:15 +0800 Subject: [PATCH 05/10] Fixes for KnifeGirl anim. --- charts/README.md | 7 + .../resources/animation/KnifeGirl/Atk3.anim | 38 +- .../animation/KnifeGirl/BlownUp1.anim | 18 +- .../resources/animation/KnifeGirl/GetUp1.anim | 40 +- .../resources/animation/KnifeGirl/Idle1.anim | 56 +- .../animation/KnifeGirl/KnifeGirl.plist | 632 ++++++----- .../animation/KnifeGirl/KnifeGirl.plist.meta | 1006 +++++++++-------- .../animation/KnifeGirl/KnifeGirl.png | Bin 111905 -> 109211 bytes .../animation/KnifeGirl/LayDown1.anim | 16 +- .../animation/KnifeGirl/Walking.anim | 46 +- .../prefabs/ControlledCharacter.prefab | 6 +- frontend/assets/scenes/offline_map.fire | 2 +- frontend/assets/scripts/OfflineMap.js | 2 +- 13 files changed, 984 insertions(+), 885 deletions(-) diff --git a/charts/README.md b/charts/README.md index cd6fc7d..84ff63f 100644 --- a/charts/README.md +++ b/charts/README.md @@ -14,3 +14,10 @@ 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. diff --git a/frontend/assets/resources/animation/KnifeGirl/Atk3.anim b/frontend/assets/resources/animation/KnifeGirl/Atk3.anim index b6c9190..6497ec2 100644 --- a/frontend/assets/resources/animation/KnifeGirl/Atk3.anim +++ b/frontend/assets/resources/animation/KnifeGirl/Atk3.anim @@ -3,7 +3,7 @@ "_name": "Atk3", "_objFlags": 0, "_native": "", - "_duration": 1.0333333333333334, + "_duration": 1.0166666666666666, "sample": 60, "speed": 1, "wrapMode": 1, @@ -13,81 +13,63 @@ "spriteFrame": [ { "frame": 0, - "value": { - "__uuid__": "98276733-6f8d-4cac-8a7e-31883834c240" - } - }, - { - "frame": 0.06666666666666667, "value": { "__uuid__": "51ab185b-2271-48b5-a897-af79721d566c" } }, { - "frame": 0.15, + "frame": 0.05, "value": { "__uuid__": "c29fd95d-7467-4138-9e01-6421af63dd68" } }, { - "frame": 0.21666666666666667, + "frame": 0.1, "value": { "__uuid__": "3285b5eb-c6be-4cb9-ac60-c506645fee4b" } }, { - "frame": 0.3, + "frame": 0.16666666666666666, "value": { "__uuid__": "13fd4a87-71f4-4b69-a5b3-413d564c35e6" } }, { - "frame": 0.38333333333333336, + "frame": 0.25, "value": { "__uuid__": "7189e229-00d6-427a-8ea1-d05fbd97824f" } }, { - "frame": 0.4666666666666667, + "frame": 0.45, "value": { "__uuid__": "d9ccfe33-3db7-4b3a-807c-adb2121fb7c7" } }, { - "frame": 0.55, + "frame": 0.6833333333333333, "value": { "__uuid__": "a51cbc29-0826-46f7-a38b-8b0f996fbace" } }, { - "frame": 0.65, + "frame": 0.8833333333333333, "value": { "__uuid__": "7e9f3a24-6abc-4b49-a5c5-a0c100865ffc" } }, { - "frame": 0.7333333333333333, + "frame": 0.95, "value": { "__uuid__": "ecbaeb43-1118-483a-91c9-ff1ff01b7b33" } }, { - "frame": 0.8166666666666667, + "frame": 1, "value": { "__uuid__": "58afa365-a916-4ec6-aab3-1c87f5332b12" } - }, - { - "frame": 0.9166666666666666, - "value": { - "__uuid__": "7ada26fa-c72d-46f6-9b3a-ae9d7ba5eaf4" - } - }, - { - "frame": 1.0166666666666666, - "value": { - "__uuid__": "ee5e4a85-6dda-4d1e-a469-5be1db6a8913" - } } ] } diff --git a/frontend/assets/resources/animation/KnifeGirl/BlownUp1.anim b/frontend/assets/resources/animation/KnifeGirl/BlownUp1.anim index 186d692..e0d6272 100644 --- a/frontend/assets/resources/animation/KnifeGirl/BlownUp1.anim +++ b/frontend/assets/resources/animation/KnifeGirl/BlownUp1.anim @@ -3,7 +3,7 @@ "_name": "BlownUp1", "_objFlags": 0, "_native": "", - "_duration": 0.45, + "_duration": 0.4166666666666667, "sample": 60, "speed": 1, "wrapMode": 2, @@ -13,27 +13,27 @@ "spriteFrame": [ { "frame": 0, - "value": { - "__uuid__": "8e2e03e0-7e2f-4bbb-b039-e232ef586232" - } - }, - { - "frame": 0.15, "value": { "__uuid__": "0ea84f61-4a2f-4ca2-a0b8-b580e027c142" } }, { - "frame": 0.3, + "frame": 0.11666666666666667, "value": { "__uuid__": "a3a31fcd-a162-456a-9c26-1f32413f87f3" } }, { - "frame": 0.43333333333333335, + "frame": 0.25, "value": { "__uuid__": "da4ee0a0-ba66-455c-99d3-9c803a3d0f17" } + }, + { + "frame": 0.4, + "value": { + "__uuid__": "4c058d60-e727-4438-b058-6e51969df458" + } } ] } diff --git a/frontend/assets/resources/animation/KnifeGirl/GetUp1.anim b/frontend/assets/resources/animation/KnifeGirl/GetUp1.anim index 3d7ca5f..20a9ef3 100644 --- a/frontend/assets/resources/animation/KnifeGirl/GetUp1.anim +++ b/frontend/assets/resources/animation/KnifeGirl/GetUp1.anim @@ -13,33 +13,45 @@ "spriteFrame": [ { "frame": 0, - "value": { - "__uuid__": "57640cd8-17eb-4279-a118-1ea40174da3c" - } - }, - { - "frame": 0.15, - "value": { - "__uuid__": "d08a4f50-8707-4da2-8b12-83d1bf4fa2ca" - } - }, - { - "frame": 0.3, "value": { "__uuid__": "3f26b0a4-db13-4a14-b885-5a812073eccf" } }, { - "frame": 0.4, + "frame": 0.08333333333333333, "value": { "__uuid__": "23eb42d6-52a2-458d-98a3-2f692dd79398" } }, { - "frame": 0.5, + "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" + } } ] } diff --git a/frontend/assets/resources/animation/KnifeGirl/Idle1.anim b/frontend/assets/resources/animation/KnifeGirl/Idle1.anim index 24396b6..19dd6bd 100644 --- a/frontend/assets/resources/animation/KnifeGirl/Idle1.anim +++ b/frontend/assets/resources/animation/KnifeGirl/Idle1.anim @@ -14,68 +14,92 @@ { "frame": 0, "value": { - "__uuid__": "9ecbf97e-34bc-4c5e-b9e8-4d885a02e0d3" + "__uuid__": "51ede1f1-5e65-4b69-8fbc-5b7df2a7c90f" } }, { - "frame": 0.21666666666666667, - "value": { - "__uuid__": "92852885-b66d-42fe-a8e0-153e6c494bd2" - } - }, - { - "frame": 0.4166666666666667, + "frame": 0.11666666666666667, "value": { "__uuid__": "b0f1ecf7-be41-46a8-bccb-92ee53b4ef88" } }, { - "frame": 0.6166666666666667, + "frame": 0.21666666666666667, "value": { "__uuid__": "944adaee-5e11-4c55-9573-1d529f21ed4b" } }, { - "frame": 0.8, + "frame": 0.31666666666666665, "value": { "__uuid__": "ede36130-8312-46a2-abe5-ba102bc97822" } }, { - "frame": 1.0166666666666666, + "frame": 0.45, "value": { "__uuid__": "32dbb977-301c-4fbd-a19c-14a5ce0e2f5b" } }, { - "frame": 1.2, + "frame": 0.6, "value": { "__uuid__": "581c7ab1-451d-46b0-9eeb-24cf3b898924" } }, { - "frame": 1.4, + "frame": 0.7666666666666667, "value": { "__uuid__": "27005132-eda8-4c3f-9f4a-3a6004245e9f" } }, { - "frame": 1.5833333333333333, + "frame": 0.9166666666666666, "value": { "__uuid__": "2b339657-aa80-4ab6-a4dd-83e9c12b6a54" } }, { - "frame": 1.7833333333333334, + "frame": 1.0666666666666667, "value": { "__uuid__": "08e25a99-158d-4159-8152-6c9047fe9d54" } }, { - "frame": 2, + "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" + } } ] } diff --git a/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.plist b/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.plist index f5c8b15..07d55f2 100644 --- a/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.plist +++ b/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.plist @@ -15,7 +15,7 @@ spriteSourceSize {112,128} textureRect - {{288,640},{112,128}} + {{524,699},{112,128}} textureRotated @@ -30,7 +30,7 @@ spriteSourceSize {112,128} textureRect - {{352,768},{112,128}} + {{524,827},{112,128}} textureRotated @@ -45,9 +45,9 @@ spriteSourceSize {64,128} textureRect - {{784,288},{64,128}} + {{932,144},{64,128}} textureRotated - + Atk1_11.png @@ -60,7 +60,7 @@ spriteSourceSize {80,128} textureRect - {{592,256},{80,128}} + {{927,272},{80,128}} textureRotated @@ -75,7 +75,7 @@ spriteSourceSize {80,128} textureRect - {{672,256},{80,128}} + {{927,400},{80,128}} textureRotated @@ -90,7 +90,7 @@ spriteSourceSize {112,128} textureRect - {{416,896},{112,128}} + {{412,933},{112,128}} textureRotated @@ -105,7 +105,7 @@ spriteSourceSize {112,128} textureRect - {{368,128},{112,128}} + {{412,1061},{112,128}} textureRotated @@ -120,7 +120,7 @@ spriteSourceSize {96,128} textureRect - {{480,384},{96,128}} + {{540,443},{96,128}} textureRotated @@ -135,7 +135,7 @@ spriteSourceSize {96,128} textureRect - {{496,512},{96,128}} + {{540,571},{96,128}} textureRotated @@ -150,7 +150,7 @@ spriteSourceSize {80,128} textureRect - {{688,128},{80,128}} + {{924,528},{80,128}} textureRotated @@ -165,7 +165,7 @@ spriteSourceSize {80,128} textureRect - {{752,0},{80,128}} + {{316,553},{80,128}} textureRotated @@ -180,7 +180,7 @@ spriteSourceSize {80,128} textureRect - {{672,384},{80,128}} + {{316,681},{80,128}} textureRotated @@ -195,7 +195,7 @@ spriteSourceSize {80,128} textureRect - {{688,512},{80,128}} + {{316,809},{80,128}} textureRotated @@ -210,7 +210,7 @@ spriteSourceSize {96,128} textureRect - {{576,384},{96,128}} + {{316,937},{96,128}} textureRotated @@ -225,7 +225,7 @@ spriteSourceSize {128,112} textureRect - {{256,528},{128,112}} + {{799,387},{128,112}} textureRotated @@ -240,7 +240,7 @@ spriteSourceSize {96,96} textureRect - {{1024,720},{96,96}} + {{316,1321},{96,96}} textureRotated @@ -255,7 +255,7 @@ spriteSourceSize {96,112} textureRect - {{816,352},{96,112}} + {{328,1417},{96,112}} textureRotated @@ -270,7 +270,7 @@ spriteSourceSize {96,112} textureRect - {{816,464},{96,112}} + {{424,1413},{96,112}} textureRotated @@ -285,7 +285,7 @@ spriteSourceSize {96,112} textureRect - {{1040,448},{96,112}} + {{520,1419},{96,112}} textureRotated @@ -300,7 +300,7 @@ spriteSourceSize {96,112} textureRect - {{912,480},{96,112}} + {{764,1075},{96,112}} textureRotated @@ -315,9 +315,9 @@ spriteSourceSize {144,112} textureRect - {{176,640},{144,112}} + {{396,471},{144,112}} textureRotated - + Atk2_7.png @@ -330,9 +330,9 @@ spriteSourceSize {128,112} textureRect - {{480,128},{128,112}} + {{636,611},{128,112}} textureRotated - + Atk2_8.png @@ -345,7 +345,7 @@ spriteSourceSize {160,112} textureRect - {{0,160},{160,112}} + {{527,283},{160,112}} textureRotated @@ -360,22 +360,7 @@ spriteSourceSize {144,112} textureRect - {{240,784},{144,112}} - textureRotated - - - Atk3_0.png - - aliases - - spriteOffset - {0,0} - spriteSize - {80,128} - spriteSourceSize - {80,128} - textureRect - {{704,640},{80,128}} + {{636,499},{144,112}} textureRotated @@ -386,11 +371,11 @@ spriteOffset {0,0} spriteSize - {96,128} + {188,144} spriteSourceSize - {96,128} + {188,144} textureRect - {{512,640},{96,128}} + {{208,278},{188,144}} textureRotated @@ -401,41 +386,11 @@ spriteOffset {0,0} spriteSize - {80,128} + {188,144} spriteSourceSize - {80,128} + {188,144} textureRect - {{768,768},{80,128}} - textureRotated - - - Atk3_11.png - - aliases - - spriteOffset - {0,0} - spriteSize - {80,128} - spriteSourceSize - {80,128} - textureRect - {{832,896},{80,128}} - textureRotated - - - Atk3_12.png - - aliases - - spriteOffset - {0,0} - spriteSize - {112,128} - spriteSourceSize - {112,128} - textureRect - {{432,0},{112,128}} + {{0,556},{188,144}} textureRotated @@ -446,11 +401,11 @@ spriteOffset {0,0} spriteSize - {96,128} + {188,144} spriteSourceSize - {96,128} + {188,144} textureRect - {{592,512},{96,128}} + {{0,700},{188,144}} textureRotated @@ -461,11 +416,11 @@ spriteOffset {0,0} spriteSize - {112,128} + {188,144} spriteSourceSize - {112,128} + {188,144} textureRect - {{368,256},{112,128}} + {{0,844},{188,144}} textureRotated @@ -476,13 +431,13 @@ spriteOffset {0,0} spriteSize - {144,128} + {188,144} spriteSourceSize - {144,128} + {188,144} textureRect - {{112,0},{144,128}} + {{0,988},{188,144}} textureRotated - + Atk3_5.png @@ -491,11 +446,11 @@ spriteOffset {0,0} spriteSize - {144,144} + {188,144} spriteSourceSize - {144,144} + {188,144} textureRect - {{96,800},{144,144}} + {{0,1132},{188,144}} textureRotated @@ -506,11 +461,11 @@ spriteOffset {0,0} spriteSize - {96,160} + {188,144} spriteSourceSize - {96,160} + {188,144} textureRect - {{0,640},{96,160}} + {{0,1276},{188,144}} textureRotated @@ -521,11 +476,11 @@ spriteOffset {0,0} spriteSize - {96,160} + {188,144} spriteSourceSize - {96,160} + {188,144} textureRect - {{0,800},{96,160}} + {{416,139},{188,144}} textureRotated @@ -536,11 +491,11 @@ spriteOffset {0,0} spriteSize - {112,160} + {188,144} spriteSourceSize - {112,160} + {188,144} textureRect - {{0,0},{112,160}} + {{624,0},{188,144}} textureRotated @@ -551,11 +506,11 @@ spriteOffset {0,0} spriteSize - {80,160} + {188,144} spriteSourceSize - {80,160} + {188,144} textureRect - {{96,640},{80,160}} + {{812,0},{188,144}} textureRotated @@ -570,7 +525,7 @@ spriteSourceSize {96,128} textureRect - {{576,768},{96,128}} + {{316,1065},{96,128}} textureRotated @@ -585,7 +540,7 @@ spriteSourceSize {112,112} textureRect - {{1040,0},{112,112}} + {{540,1307},{112,112}} textureRotated @@ -600,9 +555,9 @@ spriteSourceSize {96,112} textureRect - {{1024,544},{96,112}} + {{769,1171},{96,112}} textureRotated - + Atked1_3.png @@ -615,24 +570,9 @@ spriteSourceSize {128,112} textureRect - {{544,0},{128,112}} + {{636,723},{128,112}} textureRotated - - - BlownUp1_0.png - - aliases - - spriteOffset - {0,0} - spriteSize - {160,112} - spriteSourceSize - {160,112} - textureRect - {{0,320},{160,112}} - textureRotated - + BlownUp1_1.png @@ -641,13 +581,13 @@ spriteOffset {0,0} spriteSize - {160,112} + {164,115} spriteSourceSize - {160,112} + {164,115} textureRect - {{0,480},{160,112}} + {{0,1420},{164,115}} textureRotated - + BlownUp1_2.png @@ -656,13 +596,13 @@ spriteOffset {0,0} spriteSize - {128,96} + {164,115} spriteSourceSize - {128,96} + {164,115} textureRect - {{592,128},{128,96}} + {{164,1420},{164,115}} textureRotated - + BlownUp1_3.png @@ -671,26 +611,26 @@ spriteOffset {0,0} spriteSize - {144,96} + {164,115} spriteSourceSize - {144,96} + {164,115} textureRect - {{272,928},{144,96}} + {{604,144},{164,115}} textureRotated - GetUp1_0.png + BlownUp1_4.png aliases spriteOffset {0,0} spriteSize - {144,64} + {164,115} spriteSourceSize - {144,64} + {164,115} textureRect - {{0,960},{144,64}} + {{768,144},{164,115}} textureRotated @@ -701,11 +641,11 @@ spriteOffset {0,0} spriteSize - {144,64} + {208,139} spriteSourceSize - {144,64} + {208,139} textureRect - {{112,576},{144,64}} + {{0,0},{208,139}} textureRotated @@ -716,11 +656,11 @@ spriteOffset {0,0} spriteSize - {128,80} + {208,139} spriteSourceSize - {128,80} + {208,139} textureRect - {{144,944},{128,80}} + {{0,139},{208,139}} textureRotated @@ -731,11 +671,11 @@ spriteOffset {0,0} spriteSize - {96,80} + {208,139} spriteSourceSize - {96,80} + {208,139} textureRect - {{928,768},{96,80}} + {{208,0},{208,139}} textureRotated @@ -746,26 +686,56 @@ spriteOffset {0,0} spriteSize - {80,80} + {208,139} spriteSourceSize - {80,80} + {208,139} textureRect - {{992,928},{80,80}} + {{0,278},{208,139}} textureRotated - Idle1_0.png + GetUp1_5.png aliases spriteOffset {0,0} spriteSize - {96,128} + {208,139} spriteSourceSize - {96,128} + {208,139} textureRect - {{640,896},{96,128}} + {{208,139},{208,139}} + textureRotated + + + GetUp1_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {208,139} + spriteSourceSize + {208,139} + textureRect + {{416,0},{208,139}} + textureRotated + + + GetUp1_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {208,139} + spriteSourceSize + {208,139} + textureRect + {{0,417},{208,139}} textureRotated @@ -776,11 +746,11 @@ spriteOffset {0,0} spriteSize - {128,128} + {144,128} spriteSourceSize - {128,128} + {144,128} textureRect - {{240,144},{128,128}} + {{639,259},{144,128}} textureRotated @@ -791,14 +761,89 @@ spriteOffset {0,0} spriteSize - {112,128} + {144,128} spriteSourceSize - {112,128} + {144,128} textureRect - {{368,384},{112,128}} + {{783,259},{144,128}} textureRotated + Idle1_11.png + + aliases + + spriteOffset + {0,0} + spriteSize + {144,128} + spriteSourceSize + {144,128} + textureRect + {{780,499},{144,128}} + textureRotated + + + Idle1_12.png + + aliases + + spriteOffset + {0,0} + spriteSize + {144,128} + spriteSourceSize + {144,128} + textureRect + {{188,556},{144,128}} + textureRotated + + + Idle1_13.png + + aliases + + spriteOffset + {0,0} + spriteSize + {144,128} + spriteSourceSize + {144,128} + textureRect + {{188,700},{144,128}} + textureRotated + + + Idle1_14.png + + aliases + + spriteOffset + {0,0} + spriteSize + {144,128} + spriteSourceSize + {144,128} + textureRect + {{188,844},{144,128}} + textureRotated + + + Idle1_15.png + + aliases + + spriteOffset + {0,0} + spriteSize + {144,128} + spriteSourceSize + {144,128} + textureRect + {{188,988},{144,128}} + textureRotated + + Idle1_2.png aliases @@ -806,13 +851,13 @@ spriteOffset {0,0} spriteSize - {128,128} + {144,128} spriteSourceSize - {128,128} + {144,128} textureRect - {{304,0},{128,128}} + {{188,988},{144,128}} textureRotated - + Idle1_3.png @@ -825,7 +870,7 @@ spriteSourceSize {144,128} textureRect - {{112,144},{144,128}} + {{188,844},{144,128}} textureRotated @@ -840,7 +885,7 @@ spriteSourceSize {144,128} textureRect - {{112,288},{144,128}} + {{188,700},{144,128}} textureRotated @@ -855,7 +900,7 @@ spriteSourceSize {144,128} textureRect - {{112,432},{144,128}} + {{188,556},{144,128}} textureRotated @@ -866,11 +911,11 @@ spriteOffset {0,0} spriteSize - {128,128} + {144,128} spriteSourceSize - {128,128} + {144,128} textureRect - {{240,272},{128,128}} + {{780,499},{144,128}} textureRotated @@ -881,11 +926,11 @@ spriteOffset {0,0} spriteSize - {128,128} + {144,128} spriteSourceSize - {128,128} + {144,128} textureRect - {{240,400},{128,128}} + {{783,259},{144,128}} textureRotated @@ -896,13 +941,13 @@ spriteOffset {0,0} spriteSize - {112,128} + {144,128} spriteSourceSize - {112,128} + {144,128} textureRect - {{384,512},{112,128}} + {{188,1132},{144,128}} textureRotated - + Idle1_9.png @@ -911,13 +956,13 @@ spriteOffset {0,0} spriteSize - {112,128} + {144,128} spriteSourceSize - {112,128} + {144,128} textureRect - {{400,640},{112,128}} + {{188,1276},{144,128}} textureRotated - + InAirAtk1_0.png @@ -926,11 +971,11 @@ spriteOffset {0,0} spriteSize - {80,80} + {112,96} spriteSourceSize - {80,80} + {112,96} textureRect - {{1072,896},{80,80}} + {{524,1083},{112,96}} textureRotated @@ -941,11 +986,11 @@ spriteOffset {0,0} spriteSize - {96,80} + {160,112} spriteSourceSize - {96,80} + {160,112} textureRect - {{1024,816},{96,80}} + {{639,387},{160,112}} textureRotated @@ -956,11 +1001,11 @@ spriteOffset {0,0} spriteSize - {112,112} + {144,112} spriteSourceSize - {112,112} + {144,112} textureRect - {{1040,112},{112,112}} + {{396,583},{144,112}} textureRotated @@ -971,13 +1016,13 @@ spriteOffset {0,0} spriteSize - {112,112} + {128,112} spriteSourceSize - {112,112} + {128,112} textureRect - {{1040,224},{112,112}} + {{524,955},{128,112}} textureRotated - + InAirAtk1_4.png @@ -986,13 +1031,13 @@ spriteOffset {0,0} spriteSize - {128,112} + {96,96} spriteSourceSize - {128,112} + {96,96} textureRect - {{480,256},{128,112}} + {{769,1283},{96,96}} textureRotated - + InAirAtk1_5.png @@ -1001,13 +1046,13 @@ spriteOffset {0,0} spriteSize - {112,80} + {80,96} spriteSourceSize - {112,80} + {80,96} textureRect - {{832,688},{112,80}} + {{764,1379},{80,96}} textureRotated - + InAirAtked1_0.png @@ -1020,7 +1065,7 @@ spriteSourceSize {112,112} textureRect - {{1040,336},{112,112}} + {{652,1306},{112,112}} textureRotated @@ -1035,9 +1080,9 @@ spriteSourceSize {128,96} textureRect - {{656,0},{128,96}} + {{636,1082},{128,96}} textureRotated - + InAirIdle1_0.png @@ -1050,9 +1095,9 @@ spriteSourceSize {80,112} textureRect - {{832,576},{80,112}} + {{883,1013},{80,112}} textureRotated - + InAirIdle1_1.png @@ -1065,9 +1110,9 @@ spriteSourceSize {80,112} textureRect - {{848,768},{80,112}} + {{876,1093},{80,112}} textureRotated - + InAirIdle1_2.png @@ -1080,7 +1125,7 @@ spriteSourceSize {64,128} textureRect - {{912,320},{64,128}} + {{755,1011},{64,128}} textureRotated @@ -1095,7 +1140,7 @@ spriteSourceSize {80,112} textureRect - {{1024,640},{80,112}} + {{865,1269},{80,112}} textureRotated @@ -1110,9 +1155,9 @@ spriteSourceSize {80,96} textureRect - {{944,672},{80,96}} + {{865,1349},{80,96}} textureRotated - + InAirIdle1_5.png @@ -1125,7 +1170,7 @@ spriteSourceSize {80,96} textureRect - {{928,848},{80,96}} + {{860,1429},{80,96}} textureRotated @@ -1140,7 +1185,7 @@ spriteSourceSize {80,96} textureRect - {{912,928},{80,96}} + {{632,1419},{80,96}} textureRotated @@ -1155,7 +1200,7 @@ spriteSourceSize {96,112} textureRect - {{912,576},{96,112}} + {{865,1173},{96,112}} textureRotated @@ -1170,7 +1215,7 @@ spriteSourceSize {96,128} textureRect - {{608,640},{96,128}} + {{316,1193},{96,128}} textureRotated @@ -1185,22 +1230,7 @@ spriteSourceSize {96,128} textureRect - {{672,768},{96,128}} - textureRotated - - - LayDown1_0.png - - aliases - - spriteOffset - {0,0} - spriteSize - {144,64} - spriteSourceSize - {144,64} - textureRect - {{240,0},{144,64}} + {{412,1317},{96,128}} textureRotated @@ -1211,13 +1241,13 @@ spriteOffset {0,0} spriteSize - {128,48} + {131,188} spriteSourceSize - {128,48} + {131,188} textureRect - {{912,384},{128,48}} + {{208,422},{131,188}} textureRotated - + LayDown1_2.png @@ -1226,26 +1256,11 @@ spriteOffset {0,0} spriteSize - {128,48} + {131,188} spriteSourceSize - {128,48} + {131,188} textureRect - {{912,432},{128,48}} - textureRotated - - - Walking_0.png - - aliases - - spriteOffset - {0,0} - spriteSize - {112,128} - spriteSourceSize - {112,128} - textureRect - {{464,768},{112,128}} + {{396,283},{131,188}} textureRotated @@ -1256,13 +1271,13 @@ spriteOffset {0,0} spriteSize - {112,128} + {119,128} spriteSourceSize - {112,128} + {119,128} textureRect - {{528,896},{112,128}} + {{396,695},{119,128}} textureRotated - + Walking_10.png @@ -1271,13 +1286,13 @@ spriteOffset {0,0} spriteSize - {80,128} + {119,128} spriteSourceSize - {80,128} + {119,128} textureRect - {{912,0},{80,128}} + {{764,627},{119,128}} textureRotated - + Walking_11.png @@ -1286,13 +1301,13 @@ spriteOffset {0,0} spriteSize - {80,128} + {119,128} spriteSourceSize - {80,128} + {119,128} textureRect - {{832,0},{80,128}} + {{883,656},{119,128}} textureRotated - + Walking_12.png @@ -1301,14 +1316,29 @@ spriteOffset {0,0} spriteSize - {96,128} + {119,128} spriteSourceSize - {96,128} + {119,128} textureRect - {{736,896},{96,128}} + {{764,755},{119,128}} textureRotated + Walking_13.png + + aliases + + spriteOffset + {0,0} + spriteSize + {119,128} + spriteSourceSize + {119,128} + textureRect + {{883,775},{119,128}} + textureRotated + + Walking_2.png aliases @@ -1316,11 +1346,11 @@ spriteOffset {0,0} spriteSize - {80,128} + {119,128} spriteSourceSize - {80,128} + {119,128} textureRect - {{912,80},{80,128}} + {{396,814},{119,128}} textureRotated @@ -1331,13 +1361,13 @@ spriteOffset {0,0} spriteSize - {48,128} + {119,128} spriteSourceSize - {48,128} + {119,128} textureRect - {{768,512},{48,128}} + {{636,835},{119,128}} textureRotated - + Walking_4.png @@ -1346,11 +1376,11 @@ spriteOffset {0,0} spriteSize - {48,128} + {119,128} spriteSourceSize - {48,128} + {119,128} textureRect - {{784,640},{48,128}} + {{636,954},{119,128}} textureRotated @@ -1361,13 +1391,13 @@ spriteOffset {0,0} spriteSize - {80,128} + {119,128} spriteSourceSize - {80,128} + {119,128} textureRect - {{784,128},{80,128}} + {{412,1189},{119,128}} textureRotated - + Walking_6.png @@ -1376,11 +1406,11 @@ spriteOffset {0,0} spriteSize - {64,128} + {119,128} spriteSourceSize - {64,128} + {119,128} textureRect - {{752,384},{64,128}} + {{531,1179},{119,128}} textureRotated @@ -1391,13 +1421,13 @@ spriteOffset {0,0} spriteSize - {80,128} + {119,128} spriteSourceSize - {80,128} + {119,128} textureRect - {{912,160},{80,128}} + {{650,1178},{119,128}} textureRotated - + Walking_8.png @@ -1406,13 +1436,13 @@ spriteOffset {0,0} spriteSize - {80,128} + {119,128} spriteSourceSize - {80,128} + {119,128} textureRect - {{784,208},{80,128}} + {{764,883},{119,128}} textureRotated - + Walking_9.png @@ -1421,11 +1451,11 @@ spriteOffset {0,0} spriteSize - {80,128} + {119,128} spriteSourceSize - {80,128} + {119,128} textureRect - {{912,240},{80,128}} + {{883,894},{119,128}} textureRotated @@ -1441,9 +1471,9 @@ realTextureFileName KnifeGirl.png size - {1152,1024} + {1011,1535} smartupdate - $TexturePacker:SmartUpdate:43c720e0426fad1631b1b033ca007c9b:6efe60d7637a19764428580eac5c940c:1ae107e0c6667a1ecb5ed98687517e0e$ + $TexturePacker:SmartUpdate:f252fe395c8b73eac036cce868bca4bd:cc7b2dcbe80e2927a14b4c2409462644:1ae107e0c6667a1ecb5ed98687517e0e$ textureFileName KnifeGirl.png diff --git a/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.plist.meta b/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.plist.meta index 14176d3..566abdd 100644 --- a/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.plist.meta +++ b/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.plist.meta @@ -3,8 +3,8 @@ "uuid": "579bc0c1-f5e2-4a5d-889b-9d567e53b0e6", "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "size": { - "width": 1152, - "height": 1024 + "width": 1011, + "height": 1535 }, "type": "Texture Packer", "subMetas": { @@ -17,8 +17,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 288, - "trimY": 640, + "trimX": 524, + "trimY": 699, "width": 112, "height": 128, "rawWidth": 112, @@ -39,8 +39,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 352, - "trimY": 768, + "trimX": 524, + "trimY": 827, "width": 112, "height": 128, "rawWidth": 112, @@ -58,11 +58,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 784, - "trimY": 288, + "trimX": 932, + "trimY": 144, "width": 64, "height": 128, "rawWidth": 64, @@ -83,8 +83,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 592, - "trimY": 256, + "trimX": 927, + "trimY": 272, "width": 80, "height": 128, "rawWidth": 80, @@ -105,8 +105,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 672, - "trimY": 256, + "trimX": 927, + "trimY": 400, "width": 80, "height": 128, "rawWidth": 80, @@ -127,8 +127,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 416, - "trimY": 896, + "trimX": 412, + "trimY": 933, "width": 112, "height": 128, "rawWidth": 112, @@ -149,8 +149,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 368, - "trimY": 128, + "trimX": 412, + "trimY": 1061, "width": 112, "height": 128, "rawWidth": 112, @@ -171,8 +171,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 480, - "trimY": 384, + "trimX": 540, + "trimY": 443, "width": 96, "height": 128, "rawWidth": 96, @@ -193,8 +193,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 496, - "trimY": 512, + "trimX": 540, + "trimY": 571, "width": 96, "height": 128, "rawWidth": 96, @@ -215,8 +215,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 688, - "trimY": 128, + "trimX": 924, + "trimY": 528, "width": 80, "height": 128, "rawWidth": 80, @@ -237,8 +237,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 752, - "trimY": 0, + "trimX": 316, + "trimY": 553, "width": 80, "height": 128, "rawWidth": 80, @@ -259,8 +259,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 672, - "trimY": 384, + "trimX": 316, + "trimY": 681, "width": 80, "height": 128, "rawWidth": 80, @@ -281,8 +281,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 688, - "trimY": 512, + "trimX": 316, + "trimY": 809, "width": 80, "height": 128, "rawWidth": 80, @@ -303,8 +303,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 576, - "trimY": 384, + "trimX": 316, + "trimY": 937, "width": 96, "height": 128, "rawWidth": 96, @@ -325,8 +325,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 256, - "trimY": 528, + "trimX": 799, + "trimY": 387, "width": 128, "height": 112, "rawWidth": 128, @@ -347,8 +347,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 1024, - "trimY": 720, + "trimX": 316, + "trimY": 1321, "width": 96, "height": 96, "rawWidth": 96, @@ -369,8 +369,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 816, - "trimY": 352, + "trimX": 328, + "trimY": 1417, "width": 96, "height": 112, "rawWidth": 96, @@ -391,8 +391,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 816, - "trimY": 464, + "trimX": 424, + "trimY": 1413, "width": 96, "height": 112, "rawWidth": 96, @@ -413,8 +413,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 1040, - "trimY": 448, + "trimX": 520, + "trimY": 1419, "width": 96, "height": 112, "rawWidth": 96, @@ -435,8 +435,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 912, - "trimY": 480, + "trimX": 764, + "trimY": 1075, "width": 96, "height": 112, "rawWidth": 96, @@ -454,11 +454,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 176, - "trimY": 640, + "trimX": 396, + "trimY": 471, "width": 144, "height": 112, "rawWidth": 144, @@ -476,11 +476,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 480, - "trimY": 128, + "trimX": 636, + "trimY": 611, "width": 128, "height": 112, "rawWidth": 128, @@ -501,8 +501,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 0, - "trimY": 160, + "trimX": 527, + "trimY": 283, "width": 160, "height": 112, "rawWidth": 160, @@ -520,11 +520,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 240, - "trimY": 784, + "trimX": 636, + "trimY": 499, "width": 144, "height": 112, "rawWidth": 144, @@ -536,28 +536,6 @@ "spriteType": "normal", "subMetas": {} }, - "Atk3_0.png": { - "ver": "1.0.4", - "uuid": "98276733-6f8d-4cac-8a7e-31883834c240", - "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", - "trimType": "auto", - "trimThreshold": 1, - "rotated": false, - "offsetX": 0, - "offsetY": 0, - "trimX": 704, - "trimY": 640, - "width": 80, - "height": 128, - "rawWidth": 80, - "rawHeight": 128, - "borderTop": 0, - "borderBottom": 0, - "borderLeft": 0, - "borderRight": 0, - "spriteType": "normal", - "subMetas": {} - }, "Atk3_1.png": { "ver": "1.0.4", "uuid": "51ab185b-2271-48b5-a897-af79721d566c", @@ -567,12 +545,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 512, - "trimY": 640, - "width": 96, - "height": 128, - "rawWidth": 96, - "rawHeight": 128, + "trimX": 208, + "trimY": 278, + "width": 188, + "height": 144, + "rawWidth": 188, + "rawHeight": 144, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -589,56 +567,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 768, - "trimY": 768, - "width": 80, - "height": 128, - "rawWidth": 80, - "rawHeight": 128, - "borderTop": 0, - "borderBottom": 0, - "borderLeft": 0, - "borderRight": 0, - "spriteType": "normal", - "subMetas": {} - }, - "Atk3_11.png": { - "ver": "1.0.4", - "uuid": "7ada26fa-c72d-46f6-9b3a-ae9d7ba5eaf4", - "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", - "trimType": "auto", - "trimThreshold": 1, - "rotated": false, - "offsetX": 0, - "offsetY": 0, - "trimX": 832, - "trimY": 896, - "width": 80, - "height": 128, - "rawWidth": 80, - "rawHeight": 128, - "borderTop": 0, - "borderBottom": 0, - "borderLeft": 0, - "borderRight": 0, - "spriteType": "normal", - "subMetas": {} - }, - "Atk3_12.png": { - "ver": "1.0.4", - "uuid": "ee5e4a85-6dda-4d1e-a469-5be1db6a8913", - "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", - "trimType": "auto", - "trimThreshold": 1, - "rotated": false, - "offsetX": 0, - "offsetY": 0, - "trimX": 432, - "trimY": 0, - "width": 112, - "height": 128, - "rawWidth": 112, - "rawHeight": 128, + "trimX": 0, + "trimY": 556, + "width": 188, + "height": 144, + "rawWidth": 188, + "rawHeight": 144, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -655,12 +589,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 592, - "trimY": 512, - "width": 96, - "height": 128, - "rawWidth": 96, - "rawHeight": 128, + "trimX": 0, + "trimY": 700, + "width": 188, + "height": 144, + "rawWidth": 188, + "rawHeight": 144, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -677,12 +611,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 368, - "trimY": 256, - "width": 112, - "height": 128, - "rawWidth": 112, - "rawHeight": 128, + "trimX": 0, + "trimY": 844, + "width": 188, + "height": 144, + "rawWidth": 188, + "rawHeight": 144, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -696,15 +630,15 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 112, - "trimY": 0, - "width": 144, - "height": 128, - "rawWidth": 144, - "rawHeight": 128, + "trimX": 0, + "trimY": 988, + "width": 188, + "height": 144, + "rawWidth": 188, + "rawHeight": 144, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -721,11 +655,11 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 96, - "trimY": 800, - "width": 144, + "trimX": 0, + "trimY": 1132, + "width": 188, "height": 144, - "rawWidth": 144, + "rawWidth": 188, "rawHeight": 144, "borderTop": 0, "borderBottom": 0, @@ -744,11 +678,11 @@ "offsetX": 0, "offsetY": 0, "trimX": 0, - "trimY": 640, - "width": 96, - "height": 160, - "rawWidth": 96, - "rawHeight": 160, + "trimY": 1276, + "width": 188, + "height": 144, + "rawWidth": 188, + "rawHeight": 144, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -765,12 +699,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 0, - "trimY": 800, - "width": 96, - "height": 160, - "rawWidth": 96, - "rawHeight": 160, + "trimX": 416, + "trimY": 139, + "width": 188, + "height": 144, + "rawWidth": 188, + "rawHeight": 144, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -787,12 +721,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 0, + "trimX": 624, "trimY": 0, - "width": 112, - "height": 160, - "rawWidth": 112, - "rawHeight": 160, + "width": 188, + "height": 144, + "rawWidth": 188, + "rawHeight": 144, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -809,12 +743,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 96, - "trimY": 640, - "width": 80, - "height": 160, - "rawWidth": 80, - "rawHeight": 160, + "trimX": 812, + "trimY": 0, + "width": 188, + "height": 144, + "rawWidth": 188, + "rawHeight": 144, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -831,8 +765,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 576, - "trimY": 768, + "trimX": 316, + "trimY": 1065, "width": 96, "height": 128, "rawWidth": 96, @@ -853,8 +787,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 1040, - "trimY": 0, + "trimX": 540, + "trimY": 1307, "width": 112, "height": 112, "rawWidth": 112, @@ -872,11 +806,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 1024, - "trimY": 544, + "trimX": 769, + "trimY": 1171, "width": 96, "height": 112, "rawWidth": 96, @@ -894,11 +828,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 544, - "trimY": 0, + "trimX": 636, + "trimY": 723, "width": 128, "height": 112, "rawWidth": 128, @@ -910,43 +844,21 @@ "spriteType": "normal", "subMetas": {} }, - "BlownUp1_0.png": { - "ver": "1.0.4", - "uuid": "8e2e03e0-7e2f-4bbb-b039-e232ef586232", - "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", - "trimType": "auto", - "trimThreshold": 1, - "rotated": true, - "offsetX": 0, - "offsetY": 0, - "trimX": 0, - "trimY": 320, - "width": 160, - "height": 112, - "rawWidth": 160, - "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": true, + "rotated": false, "offsetX": 0, "offsetY": 0, "trimX": 0, - "trimY": 480, - "width": 160, - "height": 112, - "rawWidth": 160, - "rawHeight": 112, + "trimY": 1420, + "width": 164, + "height": 115, + "rawWidth": 164, + "rawHeight": 115, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -960,15 +872,15 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 592, - "trimY": 128, - "width": 128, - "height": 96, - "rawWidth": 128, - "rawHeight": 96, + "trimX": 164, + "trimY": 1420, + "width": 164, + "height": 115, + "rawWidth": 164, + "rawHeight": 115, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -985,12 +897,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 272, - "trimY": 928, - "width": 144, - "height": 96, - "rawWidth": 144, - "rawHeight": 96, + "trimX": 604, + "trimY": 144, + "width": 164, + "height": 115, + "rawWidth": 164, + "rawHeight": 115, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -998,21 +910,21 @@ "spriteType": "normal", "subMetas": {} }, - "GetUp1_0.png": { + "BlownUp1_4.png": { "ver": "1.0.4", - "uuid": "d08a4f50-8707-4da2-8b12-83d1bf4fa2ca", + "uuid": "4c058d60-e727-4438-b058-6e51969df458", "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 0, - "trimY": 960, - "width": 144, - "height": 64, - "rawWidth": 144, - "rawHeight": 64, + "trimX": 768, + "trimY": 144, + "width": 164, + "height": 115, + "rawWidth": 164, + "rawHeight": 115, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -1029,12 +941,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 112, - "trimY": 576, - "width": 144, - "height": 64, - "rawWidth": 144, - "rawHeight": 64, + "trimX": 0, + "trimY": 0, + "width": 208, + "height": 139, + "rawWidth": 208, + "rawHeight": 139, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -1051,12 +963,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 144, - "trimY": 944, - "width": 128, - "height": 80, - "rawWidth": 128, - "rawHeight": 80, + "trimX": 0, + "trimY": 139, + "width": 208, + "height": 139, + "rawWidth": 208, + "rawHeight": 139, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -1073,12 +985,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 928, - "trimY": 768, - "width": 96, - "height": 80, - "rawWidth": 96, - "rawHeight": 80, + "trimX": 208, + "trimY": 0, + "width": 208, + "height": 139, + "rawWidth": 208, + "rawHeight": 139, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -1095,12 +1007,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 992, - "trimY": 928, - "width": 80, - "height": 80, - "rawWidth": 80, - "rawHeight": 80, + "trimX": 0, + "trimY": 278, + "width": 208, + "height": 139, + "rawWidth": 208, + "rawHeight": 139, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -1108,21 +1020,65 @@ "spriteType": "normal", "subMetas": {} }, - "Idle1_0.png": { + "GetUp1_5.png": { "ver": "1.0.4", - "uuid": "92852885-b66d-42fe-a8e0-153e6c494bd2", + "uuid": "56a2c954-6d04-433c-8ae4-f1bc7a0e9469", "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 640, - "trimY": 896, - "width": 96, - "height": 128, - "rawWidth": 96, - "rawHeight": 128, + "trimX": 208, + "trimY": 139, + "width": 208, + "height": 139, + "rawWidth": 208, + "rawHeight": 139, + "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": 416, + "trimY": 0, + "width": 208, + "height": 139, + "rawWidth": 208, + "rawHeight": 139, + "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": 0, + "trimY": 417, + "width": 208, + "height": 139, + "rawWidth": 208, + "rawHeight": 139, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -1139,11 +1095,11 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 240, - "trimY": 144, - "width": 128, + "trimX": 639, + "trimY": 259, + "width": 144, "height": 128, - "rawWidth": 128, + "rawWidth": 144, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -1161,11 +1117,121 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 368, - "trimY": 384, - "width": 112, + "trimX": 783, + "trimY": 259, + "width": 144, "height": 128, - "rawWidth": 112, + "rawWidth": 144, + "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": 780, + "trimY": 499, + "width": 144, + "height": 128, + "rawWidth": 144, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 188, + "trimY": 556, + "width": 144, + "height": 128, + "rawWidth": 144, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 188, + "trimY": 700, + "width": 144, + "height": 128, + "rawWidth": 144, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 188, + "trimY": 844, + "width": 144, + "height": 128, + "rawWidth": 144, + "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": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 188, + "trimY": 988, + "width": 144, + "height": 128, + "rawWidth": 144, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -1180,14 +1246,14 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 304, - "trimY": 0, - "width": 128, + "trimX": 188, + "trimY": 988, + "width": 144, "height": 128, - "rawWidth": 128, + "rawWidth": 144, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -1205,8 +1271,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 112, - "trimY": 144, + "trimX": 188, + "trimY": 844, "width": 144, "height": 128, "rawWidth": 144, @@ -1227,8 +1293,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 112, - "trimY": 288, + "trimX": 188, + "trimY": 700, "width": 144, "height": 128, "rawWidth": 144, @@ -1249,8 +1315,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 112, - "trimY": 432, + "trimX": 188, + "trimY": 556, "width": 144, "height": 128, "rawWidth": 144, @@ -1271,11 +1337,11 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 240, - "trimY": 272, - "width": 128, + "trimX": 780, + "trimY": 499, + "width": 144, "height": 128, - "rawWidth": 128, + "rawWidth": 144, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -1293,11 +1359,11 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 240, - "trimY": 400, - "width": 128, + "trimX": 783, + "trimY": 259, + "width": 144, "height": 128, - "rawWidth": 128, + "rawWidth": 144, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -1312,14 +1378,14 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 384, - "trimY": 512, - "width": 112, + "trimX": 188, + "trimY": 1132, + "width": 144, "height": 128, - "rawWidth": 112, + "rawWidth": 144, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -1334,14 +1400,14 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 400, - "trimY": 640, - "width": 112, + "trimX": 188, + "trimY": 1276, + "width": 144, "height": 128, - "rawWidth": 112, + "rawWidth": 144, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -1359,12 +1425,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 1072, - "trimY": 896, - "width": 80, - "height": 80, - "rawWidth": 80, - "rawHeight": 80, + "trimX": 524, + "trimY": 1083, + "width": 112, + "height": 96, + "rawWidth": 112, + "rawHeight": 96, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -1381,12 +1447,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 1024, - "trimY": 816, - "width": 96, - "height": 80, - "rawWidth": 96, - "rawHeight": 80, + "trimX": 639, + "trimY": 387, + "width": 160, + "height": 112, + "rawWidth": 160, + "rawHeight": 112, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -1403,11 +1469,11 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 1040, - "trimY": 112, - "width": 112, + "trimX": 396, + "trimY": 583, + "width": 144, "height": 112, - "rawWidth": 112, + "rawWidth": 144, "rawHeight": 112, "borderTop": 0, "borderBottom": 0, @@ -1422,14 +1488,14 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 1040, - "trimY": 224, - "width": 112, + "trimX": 524, + "trimY": 955, + "width": 128, "height": 112, - "rawWidth": 112, + "rawWidth": 128, "rawHeight": 112, "borderTop": 0, "borderBottom": 0, @@ -1444,15 +1510,15 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 480, - "trimY": 256, - "width": 128, - "height": 112, - "rawWidth": 128, - "rawHeight": 112, + "trimX": 769, + "trimY": 1283, + "width": 96, + "height": 96, + "rawWidth": 96, + "rawHeight": 96, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -1466,15 +1532,15 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 832, - "trimY": 688, - "width": 112, - "height": 80, - "rawWidth": 112, - "rawHeight": 80, + "trimX": 764, + "trimY": 1379, + "width": 80, + "height": 96, + "rawWidth": 80, + "rawHeight": 96, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -1491,8 +1557,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 1040, - "trimY": 336, + "trimX": 652, + "trimY": 1306, "width": 112, "height": 112, "rawWidth": 112, @@ -1510,11 +1576,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 656, - "trimY": 0, + "trimX": 636, + "trimY": 1082, "width": 128, "height": 96, "rawWidth": 128, @@ -1532,11 +1598,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 832, - "trimY": 576, + "trimX": 883, + "trimY": 1013, "width": 80, "height": 112, "rawWidth": 80, @@ -1554,11 +1620,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 848, - "trimY": 768, + "trimX": 876, + "trimY": 1093, "width": 80, "height": 112, "rawWidth": 80, @@ -1579,8 +1645,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 912, - "trimY": 320, + "trimX": 755, + "trimY": 1011, "width": 64, "height": 128, "rawWidth": 64, @@ -1601,8 +1667,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 1024, - "trimY": 640, + "trimX": 865, + "trimY": 1269, "width": 80, "height": 112, "rawWidth": 80, @@ -1620,11 +1686,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 944, - "trimY": 672, + "trimX": 865, + "trimY": 1349, "width": 80, "height": 96, "rawWidth": 80, @@ -1645,8 +1711,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 928, - "trimY": 848, + "trimX": 860, + "trimY": 1429, "width": 80, "height": 96, "rawWidth": 80, @@ -1667,8 +1733,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 912, - "trimY": 928, + "trimX": 632, + "trimY": 1419, "width": 80, "height": 96, "rawWidth": 80, @@ -1689,8 +1755,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 912, - "trimY": 576, + "trimX": 865, + "trimY": 1173, "width": 96, "height": 112, "rawWidth": 96, @@ -1711,8 +1777,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 608, - "trimY": 640, + "trimX": 316, + "trimY": 1193, "width": 96, "height": 128, "rawWidth": 96, @@ -1730,11 +1796,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 672, - "trimY": 768, + "trimX": 412, + "trimY": 1317, "width": 96, "height": 128, "rawWidth": 96, @@ -1746,43 +1812,21 @@ "spriteType": "normal", "subMetas": {} }, - "LayDown1_0.png": { - "ver": "1.0.4", - "uuid": "7effc101-0b6c-4399-beea-7c9ef6e9df7e", - "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", - "trimType": "auto", - "trimThreshold": 1, - "rotated": true, - "offsetX": 0, - "offsetY": 0, - "trimX": 240, - "trimY": 0, - "width": 144, - "height": 64, - "rawWidth": 144, - "rawHeight": 64, - "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, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 912, - "trimY": 384, - "width": 128, - "height": 48, - "rawWidth": 128, - "rawHeight": 48, + "trimX": 208, + "trimY": 422, + "width": 131, + "height": 188, + "rawWidth": 131, + "rawHeight": 188, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -1799,34 +1843,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 912, - "trimY": 432, - "width": 128, - "height": 48, - "rawWidth": 128, - "rawHeight": 48, - "borderTop": 0, - "borderBottom": 0, - "borderLeft": 0, - "borderRight": 0, - "spriteType": "normal", - "subMetas": {} - }, - "Walking_0.png": { - "ver": "1.0.4", - "uuid": "cbbd2ddc-9ed3-40bf-ab87-2f9d26c2dd85", - "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", - "trimType": "auto", - "trimThreshold": 1, - "rotated": false, - "offsetX": 0, - "offsetY": 0, - "trimX": 464, - "trimY": 768, - "width": 112, - "height": 128, - "rawWidth": 112, - "rawHeight": 128, + "trimX": 396, + "trimY": 283, + "width": 131, + "height": 188, + "rawWidth": 131, + "rawHeight": 188, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -1840,14 +1862,14 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 528, - "trimY": 896, - "width": 112, + "trimX": 396, + "trimY": 695, + "width": 119, "height": 128, - "rawWidth": 112, + "rawWidth": 119, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -1862,14 +1884,14 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 912, - "trimY": 0, - "width": 80, + "trimX": 764, + "trimY": 627, + "width": 119, "height": 128, - "rawWidth": 80, + "rawWidth": 119, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -1884,14 +1906,14 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 832, - "trimY": 0, - "width": 80, + "trimX": 883, + "trimY": 656, + "width": 119, "height": 128, - "rawWidth": 80, + "rawWidth": 119, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -1909,11 +1931,33 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 736, - "trimY": 896, - "width": 96, + "trimX": 764, + "trimY": 755, + "width": 119, "height": 128, - "rawWidth": 96, + "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": 883, + "trimY": 775, + "width": 119, + "height": 128, + "rawWidth": 119, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -1931,11 +1975,11 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 912, - "trimY": 80, - "width": 80, + "trimX": 396, + "trimY": 814, + "width": 119, "height": 128, - "rawWidth": 80, + "rawWidth": 119, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -1950,14 +1994,14 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 768, - "trimY": 512, - "width": 48, + "trimX": 636, + "trimY": 835, + "width": 119, "height": 128, - "rawWidth": 48, + "rawWidth": 119, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -1975,11 +2019,11 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 784, - "trimY": 640, - "width": 48, + "trimX": 636, + "trimY": 954, + "width": 119, "height": 128, - "rawWidth": 48, + "rawWidth": 119, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -1994,14 +2038,14 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 784, - "trimY": 128, - "width": 80, + "trimX": 412, + "trimY": 1189, + "width": 119, "height": 128, - "rawWidth": 80, + "rawWidth": 119, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -2019,11 +2063,11 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 752, - "trimY": 384, - "width": 64, + "trimX": 531, + "trimY": 1179, + "width": 119, "height": 128, - "rawWidth": 64, + "rawWidth": 119, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -2038,14 +2082,14 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 912, - "trimY": 160, - "width": 80, + "trimX": 650, + "trimY": 1178, + "width": 119, "height": 128, - "rawWidth": 80, + "rawWidth": 119, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -2060,14 +2104,14 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 784, - "trimY": 208, - "width": 80, + "trimX": 764, + "trimY": 883, + "width": 119, "height": 128, - "rawWidth": 80, + "rawWidth": 119, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -2085,11 +2129,11 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 912, - "trimY": 240, - "width": 80, + "trimX": 883, + "trimY": 894, + "width": 119, "height": 128, - "rawWidth": 80, + "rawWidth": 119, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, diff --git a/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.png b/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.png index ce49a1c910476f43c30c8735f5799c47f62ea0dd..49d5136108075a6920b4544af37cf423809f083e 100644 GIT binary patch literal 109211 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

p@IO-`0 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

pzI0NVKPL5*EN@v|GR5b=A*7 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 Ef^xSW{Qv*} diff --git a/frontend/assets/resources/animation/KnifeGirl/LayDown1.anim b/frontend/assets/resources/animation/KnifeGirl/LayDown1.anim index 06ebfb3..b0384e4 100644 --- a/frontend/assets/resources/animation/KnifeGirl/LayDown1.anim +++ b/frontend/assets/resources/animation/KnifeGirl/LayDown1.anim @@ -17,16 +17,10 @@ "__uuid__": "4e8a4f3c-5406-4700-9230-b2abc29a1093" } }, - { - "frame": 0.03333333333333333, - "value": { - "__uuid__": "1ae5e6f6-ba82-485d-b3c7-59fd16ece3d5" - } - }, { "frame": 0.05, "value": { - "__uuid__": "4e8a4f3c-5406-4700-9230-b2abc29a1093" + "__uuid__": "1ae5e6f6-ba82-485d-b3c7-59fd16ece3d5" } } ] diff --git a/frontend/assets/resources/prefabs/ControlledCharacter.prefab b/frontend/assets/resources/prefabs/ControlledCharacter.prefab index 58f4cf0..5a5db55 100644 --- a/frontend/assets/resources/prefabs/ControlledCharacter.prefab +++ b/frontend/assets/resources/prefabs/ControlledCharacter.prefab @@ -580,14 +580,14 @@ "_anchorPoint": { "__type__": "cc.Vec2", "x": 0.5, - "y": 0.5 + "y": 0 }, "_trs": { "__type__": "TypedArray", "ctor": "Float64Array", "array": [ 0, - 0, + -24, 0, 0, 0, @@ -743,14 +743,14 @@ "_anchorPoint": { "__type__": "cc.Vec2", "x": 0.5, - "y": 0.5 + "y": 0 }, "_trs": { "__type__": "TypedArray", "ctor": "Float64Array", "array": [ 0, - 5, + -24, 0, 0, 0, diff --git a/frontend/assets/scenes/offline_map.fire b/frontend/assets/scenes/offline_map.fire index de9f2b1..2a2d80b 100644 --- a/frontend/assets/scenes/offline_map.fire +++ b/frontend/assets/scenes/offline_map.fire @@ -461,7 +461,7 @@ "array": [ 0, 0, - 210.4441731196186, + 210.4189861023336, 0, 0, 0, diff --git a/frontend/assets/scripts/AttackingCharacter.js b/frontend/assets/scripts/AttackingCharacter.js index ca81472..da57a40 100644 --- a/frontend/assets/scripts/AttackingCharacter.js +++ b/frontend/assets/scripts/AttackingCharacter.js @@ -10,7 +10,7 @@ window.ATK_CHARACTER_STATE = { InAirAtk1: [6, "InAirAtk1"], InAirAtked1: [7, "InAirAtked1"], BlownUp1: [8, "BlownUp1"], - LayDown1: [9, "LayDown1"], + 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"], diff --git a/frontend/assets/scripts/Map.js b/frontend/assets/scripts/Map.js index 9a5dc06..ff7d3c1 100644 --- a/frontend/assets/scripts/Map.js +++ b/frontend/assets/scripts/Map.js @@ -833,25 +833,16 @@ batchInputFrameIdRange=[${batch[0].inputFrameId}, ${batch[batch.length - 1].inpu playerScriptIns.setSpecies(chConfig.SpeciesName); if (1 == joinIndex) { - newPlayerNode.color = cc.Color.RED; + newPlayerNode.color = cc.Color.RED; } else { - newPlayerNode.color = cc.Color.BLUE; + newPlayerNode.color = cc.Color.BLUE; } const [wx, wy] = gopkgs.VirtualGridToWorldPos(vx, vy); newPlayerNode.setPosition(wx, wy); playerScriptIns.mapNode = self.node; - const colliderRadius = playerDownsyncInfo.ColliderRadius; - const [halfColliderWidth, halfColliderHeight] = gopkgs.VirtualGridToWorldPos(colliderRadius, colliderRadius + colliderRadius); // avoid multiplying - const colliderWidth = halfColliderWidth + halfColliderWidth, - colliderHeight = halfColliderHeight + halfColliderHeight; // avoid multiplying - const newPlayerCollider = gopkgs.GenerateRectColliderJs(wx, wy, colliderWidth, colliderHeight, 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}`); + console.log(`Created new player node: joinIndex=${joinIndex}`); safelyAddChild(self.node, newPlayerNode); setLocalZOrder(newPlayerNode, 5); @@ -1228,10 +1219,11 @@ actuallyUsedinputList:{${self.inputFrameDownsyncStr(actuallyUsedInputClone)}}`); showDebugBoundaries(rdf) { const self = this; - const leftPadding = self.snapIntoPlatformOverlap, - rightPadding = self.snapIntoPlatformOverlap, - topPadding = self.snapIntoPlatformOverlap, - bottomPadding = self.snapIntoPlatformOverlap; + // Hardcoded paddings for now + const leftPadding = 0.1, + rightPadding = 0.1, + topPadding = 0.1, + bottomPadding = 0.1; if (self.showCriticalCoordinateLabels) { let g = self.g; g.clear(); @@ -1264,6 +1256,72 @@ actuallyUsedinputList:{${self.inputFrameDownsyncStr(actuallyUsedInputClone)}}`); g.lineTo(wpos[0], wpos[1]); g.stroke(); } + + for (let k in rdf.PlayersArr) { + const player = rdf.PlayersArr[k]; + if (1 == player.JoinIndex) { + g.strokeColor = cc.Color.BLUE; + } else { + g.strokeColor = cc.Color.RED; + } + + 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]]; + + g.moveTo(cx, cy); + for (let j = 0; j < pts.length; j += 1) { + g.lineTo(pts[j][0] + cx, pts[j][1] + cy); + } + g.lineTo(cx, cy); + g.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) { + g.strokeColor = cc.Color.BLUE; + } else { + g.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]]; + + g.moveTo(bulletCx, bulletCy); + for (let j = 0; j < pts.length; j += 1) { + g.lineTo(pts[j][0] + bulletCx, pts[j][1] + bulletCy); + } + g.lineTo(bulletCx, bulletCy); + g.stroke(); + } + } } }, }); diff --git a/frontend/assets/scripts/OfflineMap.js b/frontend/assets/scripts/OfflineMap.js index 360295b..061ee53 100644 --- a/frontend/assets/scripts/OfflineMap.js +++ b/frontend/assets/scripts/OfflineMap.js @@ -161,7 +161,7 @@ cc.Class({ inAir: true, }), ], - speciesIdList: [0, 1], + speciesIdList: [1, 0], }); self.selfPlayerInfo = { diff --git a/jsexport/battle/battle.go b/jsexport/battle/battle.go index e8917d5..cfe2148 100644 --- a/jsexport/battle/battle.go +++ b/jsexport/battle/battle.go @@ -419,6 +419,7 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer FramesInChState: currPlayerDownsync.FramesInChState + 1, ActiveSkillId: currPlayerDownsync.ActiveSkillId, ActiveSkillHit: currPlayerDownsync.ActiveSkillHit, + ColliderRadius: currPlayerDownsync.ColliderRadius, } if nextRenderFramePlayers[i].FramesToRecover < 0 { nextRenderFramePlayers[i].FramesToRecover = 0 @@ -479,12 +480,11 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer } // 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 @@ -492,10 +492,24 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer 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) - // 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 += GRAVITY_X thatPlayerInNextFrame.VelY += GRAVITY_Y @@ -525,8 +539,7 @@ 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, SNAP_INTO_PLATFORM_OVERLAP, &(effPushbacks[joinIndex-1])) thatPlayerInNextFrame := nextRenderFramePlayers[i] @@ -586,6 +599,9 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer 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 thatPlayerInNextFrame.FramesToRecover = 0 } @@ -658,8 +674,7 @@ 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) @@ -694,6 +709,10 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer } } + for _, playerCollider := range playerColliders { + playerCollider.Space.Remove(playerCollider) + } + return &RoomDownsyncFrame{ Id: currRenderFrame.Id + 1, PlayersArr: nextRenderFramePlayers, From 69581009eeb0107f772f0a7b31f55de732375587 Mon Sep 17 00:00:00 2001 From: genxium Date: Mon, 2 Jan 2023 20:42:23 +0800 Subject: [PATCH 07/10] Further simplified proto communication. --- battle_srv/models/pb_type_convert.go | 54 +- battle_srv/models/room.go | 70 +- battle_srv/protos/room_downsync_frame.pb.go | 852 +++++-------- battle_srv/ws/serve.go | 19 +- frontend/assets/plugin_scripts/jsexport.js | 56 +- .../pbfiles/room_downsync_frame.proto | 49 +- frontend/assets/scenes/offline_map.fire | 2 +- frontend/assets/scripts/Map.js | 31 +- frontend/assets/scripts/OfflineMap.js | 6 +- ...om_downsync_frame_proto_bundle.forcemsg.js | 1133 ++++++----------- jsexport/battle/battle.go | 39 +- jsexport/main.go | 13 +- 12 files changed, 859 insertions(+), 1465 deletions(-) diff --git a/battle_srv/models/pb_type_convert.go b/battle_srv/models/pb_type_convert.go index a1a03dc..cacfe48 100644 --- a/battle_srv/models/pb_type_convert.go +++ b/battle_srv/models/pb_type_convert.go @@ -16,7 +16,6 @@ func toPbRoomDownsyncFrame(rdf *battle.RoomDownsyncFrame) *pb.RoomDownsyncFrame CountdownNanos: rdf.CountdownNanos, BackendUnconfirmedMask: rdf.BackendUnconfirmedMask, ShouldForceResync: rdf.ShouldForceResync, - PlayerOpPatternToSkillId: make(map[int32]int32), } for i, last := range rdf.PlayersArr { @@ -28,55 +27,57 @@ func toPbRoomDownsyncFrame(rdf *battle.RoomDownsyncFrame) *pb.RoomDownsyncFrame DirY: last.DirY, VelX: last.VelX, VelY: last.VelY, + FramesToRecover: last.FramesToRecover, + FramesInChState: last.FramesInChState, + ActiveSkillId: last.ActiveSkillId, + ActiveSkillHit: last.ActiveSkillHit, Speed: last.Speed, BattleState: last.BattleState, CharacterState: last.CharacterState, InAir: last.InAir, JoinIndex: last.JoinIndex, - ColliderRadius: last.ColliderRadius, - Score: last.Score, Hp: last.Hp, MaxHp: last.MaxHp, + ColliderRadius: last.ColliderRadius, + Score: last.Score, Removed: last.Removed, - FramesToRecover: last.FramesToRecover, - FramesInChState: last.FramesInChState, } ret.PlayersArr[i] = pbPlayer } for i, last := range rdf.MeleeBullets { pbBullet := &pb.MeleeBullet{ - BattleLocalId: last.BattleLocalId, + OriginatedRenderFrameId: last.OriginatedRenderFrameId, + OffenderJoinIndex: last.OffenderJoinIndex, + StartupFrames: last.StartupFrames, + CancellableStFrame: last.CancellableStFrame, + CancellableEdFrame: last.CancellableEdFrame, 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, + PushbackVelX: last.PushbackVelX, + PushbackVelY: last.PushbackVelY, Damage: last.Damage, - SelfMoveforwardX: last.SelfMoveforwardX, - SelfMoveforwardY: last.SelfMoveforwardY, - HitboxSizeX: last.HitboxSizeX, - HitboxSizeY: last.HitboxSizeY, + SelfLockVelX: last.SelfLockVelX, + SelfLockVelY: last.SelfLockVelY, - OffenderJoinIndex: last.OffenderJoinIndex, - OffenderPlayerId: last.OffenderPlayerId, + 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 } +/* func toPbPlayers(modelInstances map[int32]*Player, withMetaInfo bool) []*pb.PlayerDownsync { toRet := make([]*pb.PlayerDownsync, len(modelInstances), len(modelInstances)) if nil == modelInstances { @@ -113,6 +114,7 @@ func toPbPlayers(modelInstances map[int32]*Player, withMetaInfo bool) []*pb.Play return toRet } +*/ func toJsPlayers(modelInstances map[int32]*Player) []*battle.PlayerDownsync { toRet := make([]*battle.PlayerDownsync, len(modelInstances), len(modelInstances)) @@ -129,12 +131,18 @@ func toJsPlayers(modelInstances map[int32]*Player) []*battle.PlayerDownsync { DirY: last.DirY, VelX: last.VelX, VelY: last.VelY, + FramesToRecover: last.FramesToRecover, + FramesInChState: last.FramesInChState, + ActiveSkillId: last.ActiveSkillId, + ActiveSkillHit: last.ActiveSkillHit, Speed: last.Speed, BattleState: last.BattleState, CharacterState: last.CharacterState, - InAir: last.InAir, 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 c2391ca..ec362cd 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 { @@ -90,8 +90,6 @@ func calRoomScore(inRoomPlayerCount int32, roomPlayerCnt int, currentRoomBattleS type Room struct { Id int32 Capacity int - collisionSpaceOffsetX float64 - collisionSpaceOffsetY float64 Players map[int32]*Player PlayersArr []*Player // ordered by joinIndex Space *resolv.Space @@ -288,35 +286,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) } @@ -406,11 +383,7 @@ func (pR *Room) StartBattle() { 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. @@ -424,7 +397,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 @@ -1030,15 +1003,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. @@ -1157,7 +1121,7 @@ func (pR *Room) markConfirmationIfApplicable(inputFrameUpsyncBatch []*pb.InputFr */ snapshotStFrameId := (pR.LastAllConfirmedInputFrameId - newAllConfirmedCount) refRenderFrameIdIfNeeded := pR.CurDynamicsRenderFrameId - 1 - refSnapshotStFrameId := pR.ConvertToInputFrameId(refRenderFrameIdIfNeeded, pR.InputDelayFrames) + refSnapshotStFrameId := battle.ConvertToInputFrameId(refRenderFrameIdIfNeeded, battle.INPUT_DELAY_FRAMES, battle.INPUT_SCALE_FRAMES) if refSnapshotStFrameId < snapshotStFrameId { snapshotStFrameId = refSnapshotStFrameId } @@ -1224,7 +1188,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 @@ -1238,7 +1202,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))) @@ -1262,18 +1226,16 @@ func (pR *Room) applyInputFrameDownsyncDynamics(fromRenderFrameId int32, toRende } } - nextRenderFrame := battle.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(pR.InputsBuffer, currRenderFrame, pR.Space, pR.CollisionSysMap, pR.collisionSpaceOffsetX, pR.collisionSpaceOffsetY) + nextRenderFrame := battle.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(pR.InputsBuffer, currRenderFrame, pR.Space, pR.CollisionSysMap, pR.SpaceOffsetX, pR.SpaceOffsetY) 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 + 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 @@ -1305,8 +1267,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) } @@ -1317,9 +1279,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 + nextDynamicsRenderFrameId := battle.ConvertToLastUsedRenderFrameId(pR.LastAllConfirmedInputFrameId) + 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) + pR.applyInputFrameDownsyncDynamics(pR.CurDynamicsRenderFrameId, nextDynamicsRenderFrameId) *pDynamicsDuration = utils.UnixtimeNano() - dynamicsStartedAt } @@ -1336,7 +1298,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 } diff --git a/battle_srv/protos/room_downsync_frame.pb.go b/battle_srv/protos/room_downsync_frame.pb.go index 238161a..9f5f3f5 100644 --- a/battle_srv/protos/room_downsync_frame.pb.go +++ b/battle_srv/protos/room_downsync_frame.pb.go @@ -26,29 +26,31 @@ 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)" - FramesInChState int32 `protobuf:"varint,20,opt,name=framesInChState,proto3" json:"framesInChState,omitempty"` // number of frames elapsed in the current character state - 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"` + 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"` + 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() { @@ -153,7 +155,7 @@ func (x *PlayerDownsync) GetJoinIndex() int32 { return 0 } -func (x *PlayerDownsync) GetColliderRadius() float64 { +func (x *PlayerDownsync) GetColliderRadius() int32 { if x != nil { return x.ColliderRadius } @@ -223,6 +225,20 @@ func (x *PlayerDownsync) GetFramesInChState() int32 { 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) GetName() string { if x != nil { return x.Name @@ -747,26 +763,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() { @@ -801,9 +815,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 } @@ -815,6 +836,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 @@ -822,41 +857,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 @@ -871,16 +871,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 } @@ -892,46 +892,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 { @@ -940,34 +947,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"` } @@ -1010,34 +1001,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 @@ -1059,13 +1022,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 @@ -1073,34 +1029,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 @@ -1115,13 +1043,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 @@ -1136,27 +1057,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 @@ -1164,37 +1064,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 } @@ -1218,13 +1097,12 @@ 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"` } func (x *RoomDownsyncFrame) Reset() { @@ -1301,20 +1179,13 @@ func (x *RoomDownsyncFrame) GetShouldForceResync() bool { return false } -func (x *RoomDownsyncFrame) GetPlayerOpPatternToSkillId() map[int32]int32 { - if x != nil { - return x.PlayerOpPatternToSkillId - } - return nil -} - var File_room_downsync_frame_proto protoreflect.FileDescriptor 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, 0x9d, 0x05, 0x0a, 0x0e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x44, 0x6f, + 0x6f, 0x74, 0x6f, 0x22, 0xeb, 0x05, 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, @@ -1332,7 +1203,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, @@ -1351,258 +1222,201 @@ var file_room_downsync_frame_proto_rawDesc = []byte{ 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, 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, 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, - 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, + 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, 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, 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, - 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, + 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, 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, 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, + 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, 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, 0xa2, 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, + 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 ( @@ -1617,7 +1431,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 @@ -1630,7 +1444,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 @@ -1641,12 +1454,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() } @@ -1794,7 +1606,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..1c5c03f 100644 --- a/battle_srv/ws/serve.go +++ b/battle_srv/ws/serve.go @@ -242,34 +242,21 @@ func Serve(c *gin.Context) { bciFrame := &pb.BattleColliderInfo{ BoundRoomId: pRoom.Id, StageName: pRoom.StageName, - StageDiscreteW: pRoom.StageDiscreteW, - StageDiscreteH: pRoom.StageDiscreteH, - StageTileW: pRoom.StageTileW, - StageTileH: pRoom.StageTileH, 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, + InputDelayFrames: pRoom.InputDelayFrames, + InputScaleFrames: pRoom.InputScaleFrames, - SpAtkLookupFrames: pRoom.SpAtkLookupFrames, RenderCacheSize: pRoom.RenderCacheSize, - SnapIntoPlatformOverlap: pRoom.SnapIntoPlatformOverlap, - SnapIntoPlatformThreshold: pRoom.SnapIntoPlatformThreshold, - JumpingInitVelY: pRoom.JumpingInitVelY, - GravityX: pRoom.GravityX, - GravityY: pRoom.GravityY, CollisionMinStep: pRoom.CollisionMinStep, FrameDataLoggingEnabled: pRoom.FrameDataLoggingEnabled, diff --git a/frontend/assets/plugin_scripts/jsexport.js b/frontend/assets/plugin_scripts/jsexport.js index f31517a..c0aab2b 100644 --- a/frontend/assets/plugin_scripts/jsexport.js +++ b/frontend/assets/plugin_scripts/jsexport.js @@ -4724,7 +4724,7 @@ $packages["resolv"] = (function() { return $pkg; })(); $packages["jsexport/battle"] = (function() { - var $pkg = {}, $init, math, resolv, Vec2D, Polygon2D, PlayerDownsync, InputFrameDecoded, Barrier, Bullet, MeleeBullet, FireballBullet, Skill, RoomDownsyncFrame, InputFrameDownsync, RingBuffer, SkillMapperType, CharacterConfig, SatResult, sliceType, sliceType$1, sliceType$2, ptrType, ptrType$1, ptrType$2, sliceType$3, sliceType$4, ptrType$3, ptrType$4, ptrType$5, ptrType$6, ptrType$7, sliceType$5, sliceType$6, sliceType$7, sliceType$8, sliceType$9, ptrType$8, sliceType$10, ptrType$9, sliceType$11, sliceType$12, ptrType$10, sliceType$13, ptrType$11, mapType, ptrType$12, skills, inAirSet, noOpSet, invinsibleSet, nonAttackingSet, NewRingBuffer, ConvertToInputFrameId, decodeInput, CalcPushbacks, isPolygonPairOverlapped, isPolygonPairSeparatedByDir, WorldToVirtualGridPos, VirtualGridToWorldPos, WorldToPolygonColliderBLPos, PolygonColliderBLToWorldPos, PolygonColliderBLToVirtualGridPos, calcHardPushbacksNorms, deriveOpPattern, ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame, GenerateRectCollider, generateRectColliderInCollisionSpace, GenerateConvexPolygonCollider, AlignPolygon2DToBoundingBox; + var $pkg = {}, $init, math, resolv, Vec2D, Polygon2D, PlayerDownsync, InputFrameDecoded, Barrier, Bullet, MeleeBullet, FireballBullet, Skill, RoomDownsyncFrame, InputFrameDownsync, RingBuffer, SkillMapperType, CharacterConfig, SatResult, sliceType, sliceType$1, sliceType$2, ptrType, ptrType$1, ptrType$2, sliceType$3, sliceType$4, ptrType$3, ptrType$4, ptrType$5, ptrType$6, ptrType$7, sliceType$5, sliceType$6, sliceType$7, sliceType$8, sliceType$9, ptrType$8, sliceType$10, ptrType$9, sliceType$11, sliceType$12, ptrType$10, sliceType$13, ptrType$11, mapType, ptrType$12, skills, inAirSet, noOpSet, invinsibleSet, nonAttackingSet, NewRingBuffer, ShouldGenerateInputFrameUpsync, ConvertToDelayedInputFrameId, ConvertToNoDelayInputFrameId, ConvertToFirstUsedRenderFrameId, ConvertToLastUsedRenderFrameId, decodeInput, CalcPushbacks, isPolygonPairOverlapped, isPolygonPairSeparatedByDir, WorldToVirtualGridPos, VirtualGridToWorldPos, WorldToPolygonColliderBLPos, PolygonColliderBLToWorldPos, PolygonColliderBLToVirtualGridPos, calcHardPushbacksNorms, deriveOpPattern, ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame, GenerateRectCollider, generateRectColliderInCollisionSpace, GenerateConvexPolygonCollider, AlignPolygon2DToBoundingBox; math = $packages["math"]; resolv = $packages["resolv"]; Vec2D = $pkg.Vec2D = $newType(0, $kindStruct, "battle.Vec2D", true, "jsexport/battle", true, function(X_, Y_) { @@ -5152,14 +5152,34 @@ $packages["jsexport/battle"] = (function() { return [ret, oldStFrameId, oldEdFrameId]; }; RingBuffer.prototype.SetByFrameId = function(pItem, frameId) { return this.$val.SetByFrameId(pItem, frameId); }; - ConvertToInputFrameId = function(renderFrameId, inputDelayFrames, inputScaleFrames) { - var inputDelayFrames, inputScaleFrames, renderFrameId; - if (renderFrameId < inputDelayFrames) { + ShouldGenerateInputFrameUpsync = function(renderFrameId) { + var renderFrameId; + return (((renderFrameId & 3)) === 0); + }; + $pkg.ShouldGenerateInputFrameUpsync = ShouldGenerateInputFrameUpsync; + ConvertToDelayedInputFrameId = function(renderFrameId) { + var renderFrameId; + if (renderFrameId < 8) { return 0; } - return ((((renderFrameId - inputDelayFrames >> 0)) >> $min(inputScaleFrames, 31)) >> 0); + return (((renderFrameId - 8 >> 0)) >> 2 >> 0); }; - $pkg.ConvertToInputFrameId = ConvertToInputFrameId; + $pkg.ConvertToDelayedInputFrameId = ConvertToDelayedInputFrameId; + ConvertToNoDelayInputFrameId = function(renderFrameId) { + var renderFrameId; + return (renderFrameId >> 2 >> 0); + }; + $pkg.ConvertToNoDelayInputFrameId = ConvertToNoDelayInputFrameId; + ConvertToFirstUsedRenderFrameId = function(inputFrameId) { + var inputFrameId; + return (((inputFrameId << 2 >> 0)) + 8 >> 0); + }; + $pkg.ConvertToFirstUsedRenderFrameId = ConvertToFirstUsedRenderFrameId; + ConvertToLastUsedRenderFrameId = function(inputFrameId) { + var inputFrameId; + return (((((inputFrameId << 2 >> 0)) + 8 >> 0) + 4 >> 0) - 1 >> 0); + }; + $pkg.ConvertToLastUsedRenderFrameId = ConvertToLastUsedRenderFrameId; decodeInput = function(encodedInput) { var btnALevel, btnBLevel, encodedDirection, encodedInput, x, x$1, x$2, x$3; encodedDirection = new $Uint64(encodedInput.$high & 0, (encodedInput.$low & 15) >>> 0); @@ -5408,10 +5428,10 @@ $packages["jsexport/battle"] = (function() { $s = -1; return (ret.$ptr || (ret.$ptr = new ptrType$4(function() { return this.$target[0]; }, function($v) { this.$target[0] = $v; }, ret))); /* */ } return; } var $f = {$blk: calcHardPushbacksNorms, $c: true, $r, _i, _r, _ref, _ref$1, _tmp, _tmp$1, _tuple, barrierShape, collision, isBarrier, joinIndex, obj, overlapResult, overlapped, pEffPushback, playerCollider, playerShape, pushbackX, pushbackY, ret, snapIntoPlatformOverlap, $s};return $f; }; - deriveOpPattern = function(currPlayerDownsync, thatPlayerInNextFrame, currRenderFrame, inputsBuffer, inputDelayFrames, inputScaleFrames) { - var _entry, _entry$1, _tmp, _tmp$1, _tmp$2, _tmp$3, _tmp$4, _tmp$5, _tuple, _tuple$1, currPlayerDownsync, currRenderFrame, decodedInput, delayedInputFrameId, delayedInputFrameIdForPrevRdf, delayedInputList, delayedInputListForPrevRdf, effDx, effDy, existent, existent$1, inputDelayFrames, inputScaleFrames, inputsBuffer, joinIndex, jumpedOrNot, patternId, prevBtnALevel, prevBtnBLevel, prevDecodedInput, thatPlayerInNextFrame, x, x$1; - delayedInputFrameId = ConvertToInputFrameId(currRenderFrame.Id, inputDelayFrames, inputScaleFrames); - delayedInputFrameIdForPrevRdf = ConvertToInputFrameId(currRenderFrame.Id - 1 >> 0, inputDelayFrames, inputScaleFrames); + deriveOpPattern = function(currPlayerDownsync, thatPlayerInNextFrame, currRenderFrame, inputsBuffer) { + var _entry, _entry$1, _tmp, _tmp$1, _tmp$2, _tmp$3, _tmp$4, _tmp$5, _tuple, _tuple$1, currPlayerDownsync, currRenderFrame, decodedInput, delayedInputFrameId, delayedInputFrameIdForPrevRdf, delayedInputList, delayedInputListForPrevRdf, effDx, effDy, existent, existent$1, inputsBuffer, joinIndex, jumpedOrNot, patternId, prevBtnALevel, prevBtnBLevel, prevDecodedInput, thatPlayerInNextFrame, x, x$1; + delayedInputFrameId = ConvertToDelayedInputFrameId(currRenderFrame.Id); + delayedInputFrameIdForPrevRdf = ConvertToDelayedInputFrameId(currRenderFrame.Id - 1 >> 0); if (0 >= delayedInputFrameId) { return [-2, false, 0, 0]; } @@ -5491,7 +5511,7 @@ $packages["jsexport/battle"] = (function() { ((i$1 < 0 || i$1 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$1] = false); chConfig = ((i$1 < 0 || i$1 >= chConfigsOrderedByJoinIndex.$length) ? ($throwRuntimeError("index out of range"), undefined) : chConfigsOrderedByJoinIndex.$array[chConfigsOrderedByJoinIndex.$offset + i$1]); thatPlayerInNextFrame = ((i$1 < 0 || i$1 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$1]); - _tuple = deriveOpPattern(currPlayerDownsync$1, thatPlayerInNextFrame, currRenderFrame, inputsBuffer, 8, 2); + _tuple = deriveOpPattern(currPlayerDownsync$1, thatPlayerInNextFrame, currRenderFrame, inputsBuffer); patternId = _tuple[0]; jumpedOrNot = _tuple[1]; effDx = _tuple[2]; @@ -6066,7 +6086,7 @@ $packages["jsexport/battle"] = (function() { return $pkg; })(); $packages["jsexport"] = (function() { - var $pkg = {}, $init, js, battle, resolv, sliceType, ptrType, sliceType$1, ptrType$1, ptrType$2, sliceType$2, ptrType$3, sliceType$3, ptrType$4, sliceType$4, ptrType$5, sliceType$5, ptrType$6, funcType, funcType$1, funcType$2, funcType$3, funcType$4, funcType$5, funcType$6, funcType$7, funcType$8, funcType$9, funcType$10, ptrType$7, funcType$11, funcType$12, funcType$13, funcType$14, sliceType$6, funcType$15, ptrType$8, ptrType$9, ptrType$10, mapType, sliceType$7, funcType$16, mapType$1, NewInputFrameDownsync, NewRingBufferJs, NewCollisionSpaceJs, NewVec2DJs, NewPolygon2DJs, NewBarrierJs, NewPlayerDownsyncJs, NewMeleeBulletJs, NewRoomDownsyncFrameJs, GetCollisionSpaceObjsJs, GenerateRectColliderJs, GenerateConvexPolygonColliderJs, GetCharacterConfigsOrderedByJoinIndex, ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs, main; + var $pkg = {}, $init, js, battle, resolv, sliceType, ptrType, sliceType$1, ptrType$1, ptrType$2, sliceType$2, ptrType$3, sliceType$3, ptrType$4, sliceType$4, ptrType$5, sliceType$5, ptrType$6, funcType, funcType$1, funcType$2, funcType$3, funcType$4, funcType$5, funcType$6, funcType$7, funcType$8, funcType$9, funcType$10, ptrType$7, funcType$11, funcType$12, funcType$13, funcType$14, sliceType$6, funcType$15, ptrType$8, ptrType$9, ptrType$10, mapType, sliceType$7, funcType$16, funcType$17, funcType$18, mapType$1, NewInputFrameDownsync, NewRingBufferJs, NewCollisionSpaceJs, NewVec2DJs, NewPolygon2DJs, NewBarrierJs, NewPlayerDownsyncJs, NewMeleeBulletJs, NewRoomDownsyncFrameJs, GetCollisionSpaceObjsJs, GenerateRectColliderJs, GenerateConvexPolygonColliderJs, GetCharacterConfigsOrderedByJoinIndex, ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs, main; js = $packages["github.com/gopherjs/gopherjs/js"]; battle = $packages["jsexport/battle"]; resolv = $packages["resolv"]; @@ -6086,7 +6106,7 @@ $packages["jsexport"] = (function() { funcType = $funcType([$Float64, $Float64], [ptrType$5], false); funcType$1 = $funcType([ptrType, sliceType$1], [ptrType$5], false); funcType$2 = $funcType([ptrType$1], [ptrType$5], false); - funcType$3 = $funcType([$Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Bool], [ptrType$5], false); + funcType$3 = $funcType([$Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Bool], [ptrType$5], false); funcType$4 = $funcType([$Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Bool], [ptrType$5], false); funcType$5 = $funcType([$Int32, sliceType$2, sliceType$3], [ptrType$5], false); funcType$6 = $funcType([$Int, $Int, $Int, $Int], [ptrType$5], false); @@ -6107,6 +6127,8 @@ $packages["jsexport"] = (function() { mapType = $mapType($Int32, ptrType$10); sliceType$7 = $sliceType(ptrType$6); funcType$16 = $funcType([ptrType$8, ptrType$9, ptrType$7, mapType, $Float64, $Float64, sliceType$7], [ptrType$5], false); + funcType$17 = $funcType([$Int32], [$Int32], false); + funcType$18 = $funcType([$Int32], [$Bool], false); mapType$1 = $mapType($String, $emptyInterface); NewInputFrameDownsync = function(inputFrameId, inputList, confirmedList) { var {$24r, _r, confirmedList, inputFrameId, inputList, $s, $r, $c} = $restore(this, {inputFrameId, inputList, confirmedList}); @@ -6154,9 +6176,9 @@ $packages["jsexport"] = (function() { return js.MakeWrapper(new battle.Barrier.ptr(boundary)); }; $pkg.NewBarrierJs = NewBarrierJs; - NewPlayerDownsyncJs = function(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, framesToRecover, framesInChState, speed, battleState, characterState, joinIndex, hp, maxHp, colliderRadius, inAir) { - var battleState, characterState, colliderRadius, dirX, dirY, framesInChState, framesToRecover, hp, id, inAir, joinIndex, maxHp, speed, velX, velY, virtualGridX, virtualGridY; - return js.MakeWrapper(new battle.PlayerDownsync.ptr(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, speed, battleState, joinIndex, colliderRadius, false, 0, 0, framesToRecover, framesInChState, hp, maxHp, characterState, inAir, 0, 0)); + NewPlayerDownsyncJs = function(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, framesToRecover, framesInChState, activeSkillId, activeSkillHit, speed, battleState, characterState, joinIndex, hp, maxHp, colliderRadius, inAir) { + var activeSkillHit, activeSkillId, battleState, characterState, colliderRadius, dirX, dirY, framesInChState, framesToRecover, hp, id, inAir, joinIndex, maxHp, speed, velX, velY, virtualGridX, virtualGridY; + return js.MakeWrapper(new battle.PlayerDownsync.ptr(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, speed, battleState, joinIndex, colliderRadius, false, 0, 0, framesToRecover, framesInChState, hp, maxHp, characterState, inAir, activeSkillId, activeSkillHit)); }; $pkg.NewPlayerDownsyncJs = NewPlayerDownsyncJs; NewMeleeBulletJs = function(originatedRenderFrameId, offenderJoinIndex, startupFrames, cancellableStFrame, cancellableEdFrame, activeFrames, hitStunFrames, blockStunFrames, pushbackVelX, pushbackVelY, damage, selfLockVelX, selfLockVelY, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY, blowUp) { @@ -6250,7 +6272,7 @@ $packages["jsexport"] = (function() { }; $pkg.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs = ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs; main = function() { - $global.gopkgs = $externalize($makeMap($String.keyFor, [{ k: "NewVec2DJs", v: new funcType(NewVec2DJs) }, { k: "NewPolygon2DJs", v: new funcType$1(NewPolygon2DJs) }, { k: "NewBarrierJs", v: new funcType$2(NewBarrierJs) }, { k: "NewPlayerDownsyncJs", v: new funcType$3(NewPlayerDownsyncJs) }, { k: "NewMeleeBulletJs", v: new funcType$4(NewMeleeBulletJs) }, { k: "NewRoomDownsyncFrameJs", v: new funcType$5(NewRoomDownsyncFrameJs) }, { k: "NewCollisionSpaceJs", v: new funcType$6(NewCollisionSpaceJs) }, { k: "NewInputFrameDownsync", v: new funcType$7(NewInputFrameDownsync) }, { k: "NewRingBufferJs", v: new funcType$8(NewRingBufferJs) }, { k: "GenerateRectColliderJs", v: new funcType$9(GenerateRectColliderJs) }, { k: "GenerateConvexPolygonColliderJs", v: new funcType$10(GenerateConvexPolygonColliderJs) }, { k: "GetCollisionSpaceObjsJs", v: new funcType$11(GetCollisionSpaceObjsJs) }, { k: "WorldToPolygonColliderBLPos", v: new funcType$12(battle.WorldToPolygonColliderBLPos) }, { k: "PolygonColliderBLToWorldPos", v: new funcType$12(battle.PolygonColliderBLToWorldPos) }, { k: "WorldToVirtualGridPos", v: new funcType$13(battle.WorldToVirtualGridPos) }, { k: "VirtualGridToWorldPos", v: new funcType$14(battle.VirtualGridToWorldPos) }, { k: "GetCharacterConfigsOrderedByJoinIndex", v: new funcType$15(GetCharacterConfigsOrderedByJoinIndex) }, { k: "ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs", v: new funcType$16(ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs) }]), mapType$1); + $global.gopkgs = $externalize($makeMap($String.keyFor, [{ k: "NewVec2DJs", v: new funcType(NewVec2DJs) }, { k: "NewPolygon2DJs", v: new funcType$1(NewPolygon2DJs) }, { k: "NewBarrierJs", v: new funcType$2(NewBarrierJs) }, { k: "NewPlayerDownsyncJs", v: new funcType$3(NewPlayerDownsyncJs) }, { k: "NewMeleeBulletJs", v: new funcType$4(NewMeleeBulletJs) }, { k: "NewRoomDownsyncFrameJs", v: new funcType$5(NewRoomDownsyncFrameJs) }, { k: "NewCollisionSpaceJs", v: new funcType$6(NewCollisionSpaceJs) }, { k: "NewInputFrameDownsync", v: new funcType$7(NewInputFrameDownsync) }, { k: "NewRingBufferJs", v: new funcType$8(NewRingBufferJs) }, { k: "GenerateRectColliderJs", v: new funcType$9(GenerateRectColliderJs) }, { k: "GenerateConvexPolygonColliderJs", v: new funcType$10(GenerateConvexPolygonColliderJs) }, { k: "GetCollisionSpaceObjsJs", v: new funcType$11(GetCollisionSpaceObjsJs) }, { k: "WorldToPolygonColliderBLPos", v: new funcType$12(battle.WorldToPolygonColliderBLPos) }, { k: "PolygonColliderBLToWorldPos", v: new funcType$12(battle.PolygonColliderBLToWorldPos) }, { k: "WorldToVirtualGridPos", v: new funcType$13(battle.WorldToVirtualGridPos) }, { k: "VirtualGridToWorldPos", v: new funcType$14(battle.VirtualGridToWorldPos) }, { k: "GetCharacterConfigsOrderedByJoinIndex", v: new funcType$15(GetCharacterConfigsOrderedByJoinIndex) }, { k: "ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs", v: new funcType$16(ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs) }, { k: "ConvertToDelayedInputFrameId", v: new funcType$17(battle.ConvertToDelayedInputFrameId) }, { k: "ConvertToNoDelayInputFrameId", v: new funcType$17(battle.ConvertToNoDelayInputFrameId) }, { k: "ConvertToFirstUsedRenderFrameId", v: new funcType$17(battle.ConvertToFirstUsedRenderFrameId) }, { k: "ConvertToLastUsedRenderFrameId", v: new funcType$17(battle.ConvertToLastUsedRenderFrameId) }, { k: "ShouldGenerateInputFrameUpsync", v: new funcType$18(battle.ShouldGenerateInputFrameUpsync) }]), mapType$1); }; $init = function() { $pkg.$init = function() {}; diff --git a/frontend/assets/resources/pbfiles/room_downsync_frame.proto b/frontend/assets/resources/pbfiles/room_downsync_frame.proto index f8b58dd..b22bc48 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; @@ -25,6 +25,8 @@ message PlayerDownsync { 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; string name = 997; string displayName = 998; @@ -85,33 +87,29 @@ 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 pushbackX = 11; - double pushbackY = 12; + int32 startupFrames = 3; + int32 cancellableStFrame = 4; + int32 cancellableEdFrame = 5; + int32 activeFrames = 6; - 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 selfLockVelX = 18; - double selfLockVelY = 19; - - int32 releaseTriggerType = 999; // 1: rising-edge, 2: falling-edge + bool blowUp = 18; } message BattleColliderInfo { @@ -127,8 +125,8 @@ message BattleColliderInfo { int64 rollbackEstimatedDtNanos = 9; int32 renderCacheSize = 10; - int32 spaceOffsetX = 11; - int32 spaceOffsetY = 12; + double spaceOffsetX = 11; + double spaceOffsetY = 12; int32 collisionMinStep = 13; bool frameDataLoggingEnabled = 999; @@ -141,5 +139,4 @@ 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; } diff --git a/frontend/assets/scenes/offline_map.fire b/frontend/assets/scenes/offline_map.fire index 2a2d80b..de9f2b1 100644 --- a/frontend/assets/scenes/offline_map.fire +++ b/frontend/assets/scenes/offline_map.fire @@ -461,7 +461,7 @@ "array": [ 0, 0, - 210.4189861023336, + 210.4441731196186, 0, 0, 0, diff --git a/frontend/assets/scripts/Map.js b/frontend/assets/scripts/Map.js index ff7d3c1..3d29d8f 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); }, @@ -586,7 +569,7 @@ 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.framesInChState, pbPlayer.speed, pbPlayer.battleState, pbPlayer.characterState, pbPlayer.joinIndex, pbPlayer.hp, pbPlayer.maxHp, pbPlayer.colliderRadius, pbPlayer.inAir); + const jsPlayer = gopkgs.NewPlayerDownsyncJs(pbPlayer.id, pbPlayer.virtualGridX, pbPlayer.virtualGridY, pbPlayer.dirX, pbPlayer.dirY, pbPlayer.velX, pbPlayer.velY, pbPlayer.framesToRecover, pbPlayer.framesInChState, pbPlayer.activeSkillId, pbPlayer.activeSkillHit, pbPlayer.speed, pbPlayer.battleState, pbPlayer.characterState, pbPlayer.joinIndex, pbPlayer.hp, pbPlayer.maxHp, pbPlayer.colliderRadius, pbPlayer.inAir); jsPlayersArr[k] = jsPlayer; } const jsMeleeBulletsArr = []; @@ -770,7 +753,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; /* @@ -866,8 +849,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); } @@ -902,7 +885,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}: @@ -1071,14 +1054,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 = { diff --git a/frontend/assets/scripts/OfflineMap.js b/frontend/assets/scripts/OfflineMap.js index 061ee53..ca75172 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; @@ -188,8 +186,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/room_downsync_frame_proto_bundle.forcemsg.js b/frontend/assets/scripts/modules/room_downsync_frame_proto_bundle.forcemsg.js index 3ee05c7..ee15c16 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 @@ -1211,6 +1211,8 @@ $root.protos = (function() { * @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 {string|null} [name] PlayerDownsync name * @property {string|null} [displayName] PlayerDownsync displayName * @property {string|null} [avatar] PlayerDownsync avatar @@ -1391,6 +1393,22 @@ $root.protos = (function() { */ 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 name. * @member {string} name @@ -1460,7 +1478,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")) @@ -1479,6 +1497,10 @@ $root.protos = (function() { 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.name != null && Object.hasOwnProperty.call(message, "name")) writer.uint32(/* id 997, wireType 2 =*/7978).string(message.name); if (message.displayName != null && Object.hasOwnProperty.call(message, "displayName")) @@ -1560,7 +1582,7 @@ $root.protos = (function() { break; } case 11: { - message.colliderRadius = reader.double(); + message.colliderRadius = reader.int32(); break; } case 12: { @@ -1599,6 +1621,14 @@ $root.protos = (function() { message.framesInChState = reader.int32(); break; } + case 21: { + message.activeSkillId = reader.int32(); + break; + } + case 22: { + message.activeSkillHit = reader.int32(); + break; + } case 997: { message.name = reader.string(); break; @@ -1677,8 +1707,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"; @@ -1706,6 +1736,12 @@ $root.protos = (function() { 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.name != null && message.hasOwnProperty("name")) if (!$util.isString(message.name)) return "name: string expected"; @@ -1751,7 +1787,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) @@ -1770,6 +1806,10 @@ $root.protos = (function() { 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.name != null) message.name = String(object.name); if (object.displayName != null) @@ -1813,6 +1853,8 @@ $root.protos = (function() { object.characterState = 0; object.inAir = false; object.framesInChState = 0; + object.activeSkillId = 0; + object.activeSkillHit = 0; object.name = ""; object.displayName = ""; object.avatar = ""; @@ -1838,7 +1880,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")) @@ -1857,6 +1899,10 @@ $root.protos = (function() { 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.name != null && message.hasOwnProperty("name")) object.name = message.name; if (message.displayName != null && message.hasOwnProperty("displayName")) @@ -3983,25 +4029,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 */ /** @@ -4020,12 +4065,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. @@ -4035,6 +4088,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 @@ -4043,46 +4112,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 @@ -4100,20 +4129,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. @@ -4124,20 +4153,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. @@ -4156,20 +4201,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. @@ -4195,44 +4232,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; }; @@ -4268,79 +4303,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: @@ -4378,63 +4409,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; }; @@ -4450,44 +4478,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; }; @@ -4505,64 +4531,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; }; @@ -4602,33 +4625,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 */ @@ -4656,38 +4663,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 @@ -4712,14 +4687,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 @@ -4728,38 +4695,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 @@ -4776,14 +4711,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 @@ -4800,30 +4727,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 @@ -4833,44 +4736,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. @@ -4914,62 +4793,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; @@ -5011,114 +4858,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; } @@ -5164,18 +4947,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"; @@ -5185,66 +4956,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"; @@ -5268,22 +5003,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; @@ -5293,20 +5018,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) @@ -5318,24 +5033,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) @@ -5358,81 +5061,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")) @@ -5440,24 +5107,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")) @@ -5506,7 +5161,6 @@ $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 */ /** @@ -5520,7 +5174,6 @@ $root.protos = (function() { function RoomDownsyncFrame(properties) { this.playersArr = []; this.meleeBullets = []; - this.playerOpPatternToSkillId = {}; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -5575,14 +5228,6 @@ $root.protos = (function() { */ RoomDownsyncFrame.prototype.shouldForceResync = false; - /** - * RoomDownsyncFrame playerOpPatternToSkillId. - * @member {Object.} playerOpPatternToSkillId - * @memberof protos.RoomDownsyncFrame - * @instance - */ - RoomDownsyncFrame.prototype.playerOpPatternToSkillId = $util.emptyObject; - /** * Creates a new RoomDownsyncFrame instance using the specified properties. * @function create @@ -5621,9 +5266,6 @@ $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(); return writer; }; @@ -5654,7 +5296,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) { @@ -5686,29 +5328,6 @@ $root.protos = (function() { message.shouldForceResync = reader.bool(); 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; - break; - } default: reader.skipType(tag & 7); break; @@ -5774,17 +5393,6 @@ $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"; - } - } return null; }; @@ -5842,13 +5450,6 @@ $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; - } return message; }; @@ -5869,8 +5470,6 @@ $root.protos = (function() { object.playersArr = []; object.meleeBullets = []; } - if (options.objects || options.defaults) - object.playerOpPatternToSkillId = {}; if (options.defaults) { object.id = 0; if ($util.Long) { @@ -5909,12 +5508,6 @@ $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]]; - } return object; }; diff --git a/jsexport/battle/battle.go b/jsexport/battle/battle.go index cfe2148..0385853 100644 --- a/jsexport/battle/battle.go +++ b/jsexport/battle/battle.go @@ -86,11 +86,36 @@ var invinsibleSet = map[int32]bool{ var nonAttackingSet = map[int32]bool{} -func ConvertToInputFrameId(renderFrameId int32, inputDelayFrames int32, inputScaleFrames uint32) int32 { - if renderFrameId < inputDelayFrames { +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 { @@ -343,10 +368,10 @@ 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 @@ -436,7 +461,7 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer jumpedOrNotList[i] = false chConfig := chConfigsOrderedByJoinIndex[i] thatPlayerInNextFrame := nextRenderFramePlayers[i] - patternId, jumpedOrNot, effDx, effDy := deriveOpPattern(currPlayerDownsync, thatPlayerInNextFrame, currRenderFrame, inputsBuffer, INPUT_DELAY_FRAMES, INPUT_SCALE_FRAMES) + patternId, jumpedOrNot, effDx, effDy := deriveOpPattern(currPlayerDownsync, thatPlayerInNextFrame, currRenderFrame, inputsBuffer) if jumpedOrNot { thatPlayerInNextFrame.VelY = int32(chConfig.JumpingInitVelY) diff --git a/jsexport/main.go b/jsexport/main.go index 3cc8ceb..6286ea6 100644 --- a/jsexport/main.go +++ b/jsexport/main.go @@ -42,7 +42,7 @@ func NewBarrierJs(boundary *Polygon2D) *js.Object { }) } -func NewPlayerDownsyncJs(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, framesToRecover, framesInChState, speed, battleState, characterState, joinIndex, hp, maxHp, colliderRadius int32, inAir bool) *js.Object { +func NewPlayerDownsyncJs(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, framesToRecover, framesInChState, activeSkillId, activeSkillHit, speed, battleState, characterState, joinIndex, hp, maxHp, colliderRadius int32, inAir bool) *js.Object { return js.MakeWrapper(&PlayerDownsync{ Id: id, VirtualGridX: virtualGridX, @@ -53,13 +53,15 @@ func NewPlayerDownsyncJs(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, VelY: velY, FramesToRecover: framesToRecover, FramesInChState: framesInChState, + ActiveSkillId: activeSkillId, + ActiveSkillHit: activeSkillHit, Speed: speed, BattleState: battleState, + CharacterState: characterState, JoinIndex: joinIndex, - ColliderRadius: colliderRadius, Hp: hp, MaxHp: maxHp, - CharacterState: characterState, + ColliderRadius: colliderRadius, InAir: inAir, }) } @@ -167,5 +169,10 @@ func main() { "VirtualGridToWorldPos": VirtualGridToWorldPos, "GetCharacterConfigsOrderedByJoinIndex": GetCharacterConfigsOrderedByJoinIndex, "ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs": ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs, + "ConvertToDelayedInputFrameId": ConvertToDelayedInputFrameId, + "ConvertToNoDelayInputFrameId": ConvertToNoDelayInputFrameId, + "ConvertToFirstUsedRenderFrameId": ConvertToFirstUsedRenderFrameId, + "ConvertToLastUsedRenderFrameId": ConvertToLastUsedRenderFrameId, + "ShouldGenerateInputFrameUpsync": ShouldGenerateInputFrameUpsync, }) } From 80c6e057310587642501db6318d58f21a4ad8ac7 Mon Sep 17 00:00:00 2001 From: genxium Date: Mon, 2 Jan 2023 23:35:56 +0800 Subject: [PATCH 08/10] Initial attempt integrating online battle. --- battle_srv/models/pb_type_convert.go | 98 +++++++++---------- battle_srv/models/room.go | 97 +++++++++--------- battle_srv/protos/room_downsync_frame.pb.go | 17 +++- battle_srv/ws/serve.go | 19 ++-- frontend/assets/plugin_scripts/jsexport.js | 10 +- frontend/assets/resources/map/dungeon/map.tmx | 4 +- .../pbfiles/room_downsync_frame.proto | 1 + frontend/assets/scenes/login.fire | 2 +- frontend/assets/scenes/offline_map.fire | 2 +- frontend/assets/scripts/Map.js | 2 +- ...om_downsync_frame_proto_bundle.forcemsg.js | 47 +++++++++ jsexport/battle/battle.go | 6 +- jsexport/battle/characterConfig.go | 3 + jsexport/main.go | 14 +-- 14 files changed, 198 insertions(+), 124 deletions(-) diff --git a/battle_srv/models/pb_type_convert.go b/battle_srv/models/pb_type_convert.go index cacfe48..b7ce3f0 100644 --- a/battle_srv/models/pb_type_convert.go +++ b/battle_srv/models/pb_type_convert.go @@ -10,12 +10,12 @@ 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, + 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 { @@ -29,8 +29,8 @@ func toPbRoomDownsyncFrame(rdf *battle.RoomDownsyncFrame) *pb.RoomDownsyncFrame VelY: last.VelY, FramesToRecover: last.FramesToRecover, FramesInChState: last.FramesInChState, - ActiveSkillId: last.ActiveSkillId, - ActiveSkillHit: last.ActiveSkillHit, + ActiveSkillId: last.ActiveSkillId, + ActiveSkillHit: last.ActiveSkillHit, Speed: last.Speed, BattleState: last.BattleState, CharacterState: last.CharacterState, @@ -47,29 +47,29 @@ func toPbRoomDownsyncFrame(rdf *battle.RoomDownsyncFrame) *pb.RoomDownsyncFrame for i, last := range rdf.MeleeBullets { pbBullet := &pb.MeleeBullet{ - OriginatedRenderFrameId: last.OriginatedRenderFrameId, - OffenderJoinIndex: last.OffenderJoinIndex, + OriginatedRenderFrameId: last.OriginatedRenderFrameId, + OffenderJoinIndex: last.OffenderJoinIndex, - StartupFrames: last.StartupFrames, - CancellableStFrame: last.CancellableStFrame, - CancellableEdFrame: last.CancellableEdFrame, - ActiveFrames: last.ActiveFrames, + StartupFrames: last.StartupFrames, + CancellableStFrame: last.CancellableStFrame, + CancellableEdFrame: last.CancellableEdFrame, + ActiveFrames: last.ActiveFrames, - HitStunFrames: last.HitStunFrames, - BlockStunFrames: last.BlockStunFrames, - PushbackVelX: last.PushbackVelX, - PushbackVelY: last.PushbackVelY, - Damage: last.Damage, + 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, + HitboxOffsetX: last.HitboxOffsetX, + HitboxOffsetY: last.HitboxOffsetY, + HitboxSizeX: last.HitboxSizeX, + HitboxSizeY: last.HitboxSizeY, - BlowUp: last.BlowUp, + BlowUp: last.BlowUp, } ret.MeleeBullets[i] = pbBullet } @@ -77,7 +77,6 @@ func toPbRoomDownsyncFrame(rdf *battle.RoomDownsyncFrame) *pb.RoomDownsyncFrame return ret } -/* func toPbPlayers(modelInstances map[int32]*Player, withMetaInfo bool) []*pb.PlayerDownsync { toRet := make([]*pb.PlayerDownsync, len(modelInstances), len(modelInstances)) if nil == modelInstances { @@ -93,6 +92,10 @@ func toPbPlayers(modelInstances map[int32]*Player, withMetaInfo bool) []*pb.Play DirY: last.DirY, VelX: last.VelX, VelY: last.VelY, + FramesToRecover: last.FramesToRecover, + FramesInChState: last.FramesInChState, + ActiveSkillId: last.ActiveSkillId, + ActiveSkillHit: last.ActiveSkillHit, Speed: last.Speed, BattleState: last.BattleState, CharacterState: last.CharacterState, @@ -101,8 +104,6 @@ func toPbPlayers(modelInstances map[int32]*Player, withMetaInfo bool) []*pb.Play ColliderRadius: last.ColliderRadius, Score: last.Score, Removed: last.Removed, - FramesToRecover: last.FramesToRecover, - FramesInChState: last.FramesInChState, } if withMetaInfo { pbPlayer.Name = last.Name @@ -114,7 +115,6 @@ func toPbPlayers(modelInstances map[int32]*Player, withMetaInfo bool) []*pb.Play return toRet } -*/ func toJsPlayers(modelInstances map[int32]*Player) []*battle.PlayerDownsync { toRet := make([]*battle.PlayerDownsync, len(modelInstances), len(modelInstances)) @@ -124,27 +124,27 @@ 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, - FramesToRecover: last.FramesToRecover, - FramesInChState: last.FramesInChState, - ActiveSkillId: last.ActiveSkillId, - ActiveSkillHit: last.ActiveSkillHit, - 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, + 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, + 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 ec362cd..0cc7ac3 100644 --- a/battle_srv/models/room.go +++ b/battle_srv/models/room.go @@ -88,12 +88,16 @@ func calRoomScore(inRoomPlayerCount int32, roomPlayerCnt int, currentRoomBattleS } type Room struct { - Id int32 - Capacity 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. @@ -135,7 +139,6 @@ type Room struct { BackendDynamicsEnabled bool ForceAllResyncOnAnyActiveSlowTicker bool LastRenderFrameIdTriggeredAt int64 - PlayerDefaultSpeed int32 BulletBattleLocalIdCounter int32 dilutedRollbackEstimatedDtNanos int64 @@ -165,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 @@ -207,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 @@ -286,8 +290,8 @@ func (pR *Room) ChooseStage() error { //Logger.Info("parsed tmx:", zap.Any("stageDiscreteW", stageDiscreteW), zap.Any("strToVec2DListMap", strToVec2DListMap), zap.Any("strToPolygon2DListMap", strToPolygon2DListMap)) - pR.SpaceOffsetX = float64((stageDiscreteW*stageTileW) >> 1) - pR.SpaceOffsetY = float64((stageDiscreteH*stageTileH) >> 1) + pR.SpaceOffsetX = float64((stageDiscreteW * stageTileW) >> 1) + pR.SpaceOffsetY = float64((stageDiscreteH * stageTileH) >> 1) pR.TmxPointsMap = strToVec2DListMap pR.TmxPolygonsMap = strToPolygon2DListMap @@ -373,12 +377,20 @@ func (pR *Room) StartBattle() { pR.RenderFrameId = 0 + for _, player := range pR.Players { + 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), - CountdownNanos: pR.BattleDurationNanos, + Id: pR.RenderFrameId, + PlayersArr: toJsPlayers(pR.Players), + CountdownNanos: pR.BattleDurationNanos, } pR.RenderFrameBuffer.Put(kickoffFrameJs) @@ -446,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)) } @@ -515,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! @@ -709,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 = battle.WORLD_TO_VIRTUAL_GRID_RATIO - 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 { @@ -741,18 +748,17 @@ 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" @@ -874,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) { @@ -884,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 @@ -1121,7 +1131,7 @@ func (pR *Room) markConfirmationIfApplicable(inputFrameUpsyncBatch []*pb.InputFr */ snapshotStFrameId := (pR.LastAllConfirmedInputFrameId - newAllConfirmedCount) refRenderFrameIdIfNeeded := pR.CurDynamicsRenderFrameId - 1 - refSnapshotStFrameId := battle.ConvertToInputFrameId(refRenderFrameIdIfNeeded, battle.INPUT_DELAY_FRAMES, battle.INPUT_SCALE_FRAMES) + refSnapshotStFrameId := battle.ConvertToDelayedInputFrameId(refRenderFrameIdIfNeeded) if refSnapshotStFrameId < snapshotStFrameId { snapshotStFrameId = refSnapshotStFrameId } @@ -1137,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++ { @@ -1151,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 @@ -1226,7 +1236,7 @@ func (pR *Room) applyInputFrameDownsyncDynamics(fromRenderFrameId int32, toRende } } - nextRenderFrame := battle.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(pR.InputsBuffer, currRenderFrame, pR.Space, pR.CollisionSysMap, pR.SpaceOffsetX, pR.SpaceOffsetY) + nextRenderFrame := battle.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(pR.InputsBuffer, currRenderFrame, pR.Space, pR.CollisionSysMap, pR.SpaceOffsetX, pR.SpaceOffsetY, pR.CharacterConfigsArr) pR.RenderFrameBuffer.Put(nextRenderFrame) pR.CurDynamicsRenderFrameId++ } @@ -1248,7 +1258,7 @@ func (pR *Room) refreshColliders() { // 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) } } @@ -1280,7 +1290,7 @@ func (pR *Room) doBattleMainLoopPerTickBackendDynamicsWithProperLocking(prevRend dynamicsStartedAt := utils.UnixtimeNano() // Apply "all-confirmed inputFrames" to move forward "pR.CurDynamicsRenderFrameId" nextDynamicsRenderFrameId := battle.ConvertToLastUsedRenderFrameId(pR.LastAllConfirmedInputFrameId) + 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)) + 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 } @@ -1298,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 := battle.ConvertToDelayedInputFrameId(pR.CurDynamicsRenderFrameId-1) + refSnapshotStFrameId := battle.ConvertToDelayedInputFrameId(pR.CurDynamicsRenderFrameId - 1) if refSnapshotStFrameId < snapshotStFrameId { snapshotStFrameId = refSnapshotStFrameId } @@ -1410,14 +1420,13 @@ func (pR *Room) downsyncToSinglePlayer(playerId int32, player *Player, refRender } refRenderFrame := tmp.(*battle.RoomDownsyncFrame) - 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 9f5f3f5..a93f289 100644 --- a/battle_srv/protos/room_downsync_frame.pb.go +++ b/battle_srv/protos/room_downsync_frame.pb.go @@ -1103,6 +1103,7 @@ type RoomDownsyncFrame struct { 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() { @@ -1179,6 +1180,13 @@ func (x *RoomDownsyncFrame) GetShouldForceResync() bool { return false } +func (x *RoomDownsyncFrame) GetSpeciesIdList() []int32 { + if x != nil { + return x.SpeciesIdList + } + return nil +} + var File_room_downsync_frame_proto protoreflect.FileDescriptor var file_room_downsync_frame_proto_rawDesc = []byte{ @@ -1396,7 +1404,7 @@ var file_room_downsync_frame_proto_rawDesc = []byte{ 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, 0xa2, 0x02, 0x0a, 0x11, + 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, @@ -1415,8 +1423,11 @@ var file_room_downsync_frame_proto_rawDesc = []byte{ 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, - 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, + 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 ( diff --git a/battle_srv/ws/serve.go b/battle_srv/ws/serve.go index 1c5c03f..f1db6d8 100644 --- a/battle_srv/ws/serve.go +++ b/battle_srv/ws/serve.go @@ -240,24 +240,23 @@ func Serve(c *gin.Context) { // Construct "battleColliderInfo" to downsync bciFrame := &pb.BattleColliderInfo{ - BoundRoomId: pRoom.Id, - StageName: pRoom.StageName, + 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, InputFrameUpsyncDelayTolerance: pRoom.InputFrameUpsyncDelayTolerance, MaxChasingRenderFramesPerUpdate: pRoom.MaxChasingRenderFramesPerUpdate, - PlayerBattleState: pThePlayer.BattleState, // For frontend to know whether it's rejoining RollbackEstimatedDtMillis: pRoom.RollbackEstimatedDtMillis, RollbackEstimatedDtNanos: pRoom.RollbackEstimatedDtNanos, - InputDelayFrames: pRoom.InputDelayFrames, - InputScaleFrames: pRoom.InputScaleFrames, + SpaceOffsetX: pRoom.SpaceOffsetX, + SpaceOffsetY: pRoom.SpaceOffsetY, - RenderCacheSize: pRoom.RenderCacheSize, - CollisionMinStep: pRoom.CollisionMinStep, + RenderCacheSize: pRoom.RenderCacheSize, + CollisionMinStep: pRoom.CollisionMinStep, FrameDataLoggingEnabled: pRoom.FrameDataLoggingEnabled, } diff --git a/frontend/assets/plugin_scripts/jsexport.js b/frontend/assets/plugin_scripts/jsexport.js index c0aab2b..2c5ffa7 100644 --- a/frontend/assets/plugin_scripts/jsexport.js +++ b/frontend/assets/plugin_scripts/jsexport.js @@ -4968,7 +4968,7 @@ $packages["jsexport/battle"] = (function() { this.Eles = Eles_; }); SkillMapperType = $pkg.SkillMapperType = $newType(4, $kindFunc, "battle.SkillMapperType", true, "jsexport/battle", true, null); - CharacterConfig = $pkg.CharacterConfig = $newType(0, $kindStruct, "battle.CharacterConfig", true, "jsexport/battle", true, function(SpeciesId_, SpeciesName_, InAirIdleFrameIdxTurningPoint_, InAirIdleFrameIdxTurnedCycle_, LayDownFrames_, LayDownFramesToRecover_, GetUpFrames_, GetUpFramesToRecover_, JumpingInitVelY_, SkillMapper_) { + CharacterConfig = $pkg.CharacterConfig = $newType(0, $kindStruct, "battle.CharacterConfig", true, "jsexport/battle", true, function(SpeciesId_, SpeciesName_, InAirIdleFrameIdxTurningPoint_, InAirIdleFrameIdxTurnedCycle_, LayDownFrames_, LayDownFramesToRecover_, GetUpFrames_, GetUpFramesToRecover_, Speed_, JumpingInitVelY_, SkillMapper_) { this.$val = this; if (arguments.length === 0) { this.SpeciesId = 0; @@ -4979,6 +4979,7 @@ $packages["jsexport/battle"] = (function() { this.LayDownFramesToRecover = 0; this.GetUpFrames = 0; this.GetUpFramesToRecover = 0; + this.Speed = 0; this.JumpingInitVelY = 0; this.SkillMapper = $throwNilPointerError; return; @@ -4991,6 +4992,7 @@ $packages["jsexport/battle"] = (function() { this.LayDownFramesToRecover = LayDownFramesToRecover_; this.GetUpFrames = GetUpFrames_; this.GetUpFramesToRecover = GetUpFramesToRecover_; + this.Speed = Speed_; this.JumpingInitVelY = JumpingInitVelY_; this.SkillMapper = SkillMapper_; }); @@ -6006,7 +6008,7 @@ $packages["jsexport/battle"] = (function() { InputFrameDownsync.init("", [{prop: "InputFrameId", name: "InputFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "InputList", name: "InputList", embedded: false, exported: true, typ: sliceType$5, tag: ""}, {prop: "ConfirmedList", name: "ConfirmedList", embedded: false, exported: true, typ: $Uint64, tag: ""}]); RingBuffer.init("", [{prop: "Ed", name: "Ed", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "St", name: "St", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "EdFrameId", name: "EdFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "StFrameId", name: "StFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "N", name: "N", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Cnt", name: "Cnt", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Eles", name: "Eles", embedded: false, exported: true, typ: sliceType$2, tag: ""}]); SkillMapperType.init([$Int, ptrType$5], [$Int], false); - CharacterConfig.init("", [{prop: "SpeciesId", name: "SpeciesId", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "SpeciesName", name: "SpeciesName", embedded: false, exported: true, typ: $String, tag: ""}, {prop: "InAirIdleFrameIdxTurningPoint", name: "InAirIdleFrameIdxTurningPoint", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "InAirIdleFrameIdxTurnedCycle", name: "InAirIdleFrameIdxTurnedCycle", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "LayDownFrames", name: "LayDownFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "LayDownFramesToRecover", name: "LayDownFramesToRecover", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "GetUpFrames", name: "GetUpFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "GetUpFramesToRecover", name: "GetUpFramesToRecover", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "JumpingInitVelY", name: "JumpingInitVelY", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "SkillMapper", name: "SkillMapper", embedded: false, exported: true, typ: SkillMapperType, tag: ""}]); + CharacterConfig.init("", [{prop: "SpeciesId", name: "SpeciesId", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "SpeciesName", name: "SpeciesName", embedded: false, exported: true, typ: $String, tag: ""}, {prop: "InAirIdleFrameIdxTurningPoint", name: "InAirIdleFrameIdxTurningPoint", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "InAirIdleFrameIdxTurnedCycle", name: "InAirIdleFrameIdxTurnedCycle", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "LayDownFrames", name: "LayDownFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "LayDownFramesToRecover", name: "LayDownFramesToRecover", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "GetUpFrames", name: "GetUpFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "GetUpFramesToRecover", name: "GetUpFramesToRecover", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Speed", name: "Speed", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "JumpingInitVelY", name: "JumpingInitVelY", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "SkillMapper", name: "SkillMapper", embedded: false, exported: true, typ: SkillMapperType, tag: ""}]); SatResult.init("", [{prop: "Overlap", name: "Overlap", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "OverlapX", name: "OverlapX", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "OverlapY", name: "OverlapY", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "AContainedInB", name: "AContainedInB", embedded: false, exported: true, typ: $Bool, tag: ""}, {prop: "BContainedInA", name: "BContainedInA", embedded: false, exported: true, typ: $Bool, tag: ""}, {prop: "Axis", name: "Axis", embedded: false, exported: true, typ: resolv.Vector, tag: ""}]); $init = function() { $pkg.$init = function() {}; @@ -6015,7 +6017,7 @@ $packages["jsexport/battle"] = (function() { $r = resolv.$init(); /* */ $s = 2; case 2: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } $pkg.DIRECTION_DECODER = new sliceType$1([new sliceType([0, 0]), new sliceType([0, 2]), new sliceType([0, -2]), new sliceType([2, 0]), new sliceType([-2, 0]), new sliceType([1, 1]), new sliceType([-1, -1]), new sliceType([1, -1]), new sliceType([-1, 1])]); skills = $makeMap($Int.keyFor, [{ k: 1, v: new Skill.ptr(0, 30, 30, 30, 1, 2, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 7, 13, 30, 22, 13, 9, 50, 0, 5, 0, 0, 1200, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 2 }])))])) }, { k: 2, v: new Skill.ptr(0, 36, 36, 36, 1, 11, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 18, 22, 36, 18, 18, 9, 50, 0, 5, 0, 0, 1800, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 3 }])))])) }, { k: 3, v: new Skill.ptr(0, 60, 60, 60, 1, 12, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 15, 0, 0, 40, 999999999, 9, 200, 700, 10, 0, 0, 2400, 0, 3200, 3200, true, false))])) }, { k: 4, v: new Skill.ptr(0, 30, 30, 30, 1, 2, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 7, 13, 30, 22, 13, 9, 50, 0, 5, 0, 0, 1200, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 5 }])))])) }, { k: 5, v: new Skill.ptr(0, 36, 36, 36, 1, 11, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 18, 22, 36, 18, 18, 9, 50, 0, 5, 0, 0, 1800, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 6 }])))])) }, { k: 6, v: new Skill.ptr(0, 60, 60, 60, 1, 12, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 15, 0, 0, 40, 999999999, 9, 200, 700, 10, 0, 0, 2400, 0, 3200, 3200, true, false))])) }, { k: 255, v: new Skill.ptr(0, 34, 34, 34, 1, 6, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 3, 0, 0, 20, 18, 9, 50, 0, 5, 0, 0, 1200, 0, 3200, 2400, false, false))])) }, { k: 256, v: new Skill.ptr(0, 34, 34, 34, 1, 6, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 3, 0, 0, 20, 18, 9, 50, 0, 5, 0, 0, 1200, 0, 3200, 2400, false, false))])) }]); - $pkg.Characters = $makeMap($Int.keyFor, [{ k: 0, v: new CharacterConfig.ptr(0, "MonkGirl", 11, 1, 16, 16, 33, 30, 800, (function(patternId, currPlayerDownsync) { + $pkg.Characters = $makeMap($Int.keyFor, [{ k: 0, v: new CharacterConfig.ptr(0, "MonkGirl", 11, 1, 16, 16, 33, 30, 120, 800, (function(patternId, currPlayerDownsync) { var _entry, _entry$1, _ref, _tuple, _tuple$1, currPlayerDownsync, existent1, existent2, nextSkillId, patternId, skillConfig, v, x, x$1; if (1 === patternId) { if (0 === currPlayerDownsync.FramesToRecover) { @@ -6045,7 +6047,7 @@ $packages["jsexport/battle"] = (function() { } } return -1; - })) }, { k: 1, v: new CharacterConfig.ptr(1, "KnifeGirl", 9, 1, 16, 16, 30, 27, 750, (function(patternId, currPlayerDownsync) { + })) }, { k: 1, v: new CharacterConfig.ptr(1, "KnifeGirl", 9, 1, 16, 16, 30, 27, 140, 750, (function(patternId, currPlayerDownsync) { var _entry, _entry$1, _ref, _tuple, _tuple$1, currPlayerDownsync, existent1, existent2, nextSkillId, patternId, skillConfig, v, x, x$1; if (1 === patternId) { if (0 === currPlayerDownsync.FramesToRecover) { diff --git a/frontend/assets/resources/map/dungeon/map.tmx b/frontend/assets/resources/map/dungeon/map.tmx index 6e24f2a..3639788 100644 --- a/frontend/assets/resources/map/dungeon/map.tmx +++ b/frontend/assets/resources/map/dungeon/map.tmx @@ -9,10 +9,10 @@ - + - + diff --git a/frontend/assets/resources/pbfiles/room_downsync_frame.proto b/frontend/assets/resources/pbfiles/room_downsync_frame.proto index b22bc48..7551b66 100644 --- a/frontend/assets/resources/pbfiles/room_downsync_frame.proto +++ b/frontend/assets/resources/pbfiles/room_downsync_frame.proto @@ -139,4 +139,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; + repeated int32 speciesIdList = 7; } diff --git a/frontend/assets/scenes/login.fire b/frontend/assets/scenes/login.fire index d408e2a..903c81d 100644 --- a/frontend/assets/scenes/login.fire +++ b/frontend/assets/scenes/login.fire @@ -440,7 +440,7 @@ "array": [ 0, 0, - 216.50135522089343, + 216.79917701871616, 0, 0, 0, diff --git a/frontend/assets/scenes/offline_map.fire b/frontend/assets/scenes/offline_map.fire index de9f2b1..33d98c7 100644 --- a/frontend/assets/scenes/offline_map.fire +++ b/frontend/assets/scenes/offline_map.fire @@ -461,7 +461,7 @@ "array": [ 0, 0, - 210.4441731196186, + 209.83528025849938, 0, 0, 0, diff --git a/frontend/assets/scripts/Map.js b/frontend/assets/scripts/Map.js index 3d29d8f..63a8d52 100644 --- a/frontend/assets/scripts/Map.js +++ b/frontend/assets/scripts/Map.js @@ -279,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); } }); 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 ee15c16..3546a90 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 @@ -5161,6 +5161,7 @@ $root.protos = (function() { * @property {Array.|null} [meleeBullets] RoomDownsyncFrame meleeBullets * @property {number|Long|null} [backendUnconfirmedMask] RoomDownsyncFrame backendUnconfirmedMask * @property {boolean|null} [shouldForceResync] RoomDownsyncFrame shouldForceResync + * @property {Array.|null} [speciesIdList] RoomDownsyncFrame speciesIdList */ /** @@ -5174,6 +5175,7 @@ $root.protos = (function() { function RoomDownsyncFrame(properties) { this.playersArr = []; this.meleeBullets = []; + this.speciesIdList = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -5228,6 +5230,14 @@ $root.protos = (function() { */ RoomDownsyncFrame.prototype.shouldForceResync = false; + /** + * RoomDownsyncFrame speciesIdList. + * @member {Array.} speciesIdList + * @memberof protos.RoomDownsyncFrame + * @instance + */ + RoomDownsyncFrame.prototype.speciesIdList = $util.emptyArray; + /** * Creates a new RoomDownsyncFrame instance using the specified properties. * @function create @@ -5266,6 +5276,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.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; }; @@ -5328,6 +5344,17 @@ $root.protos = (function() { message.shouldForceResync = reader.bool(); break; } + case 7: { + 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: reader.skipType(tag & 7); break; @@ -5393,6 +5420,13 @@ $root.protos = (function() { if (message.shouldForceResync != null && message.hasOwnProperty("shouldForceResync")) if (typeof message.shouldForceResync !== "boolean") return "shouldForceResync: boolean 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; }; @@ -5450,6 +5484,13 @@ $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.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; }; @@ -5469,6 +5510,7 @@ $root.protos = (function() { if (options.arrays || options.defaults) { object.playersArr = []; object.meleeBullets = []; + object.speciesIdList = []; } if (options.defaults) { object.id = 0; @@ -5508,6 +5550,11 @@ $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; + 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 0385853..34e2ad0 100644 --- a/jsexport/battle/battle.go +++ b/jsexport/battle/battle.go @@ -25,6 +25,8 @@ const ( 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) @@ -96,7 +98,7 @@ func ShouldPrefabInputFrameDownsync(prevRenderFrameId int32, renderFrameId int32 } func ShouldGenerateInputFrameUpsync(renderFrameId int32) bool { - return ((renderFrameId & ((1 << INPUT_SCALE_FRAMES) - 1)) == 0) + return ((renderFrameId & ((1 << INPUT_SCALE_FRAMES) - 1)) == 0) } func ConvertToDelayedInputFrameId(renderFrameId int32) int32 { @@ -371,7 +373,7 @@ func calcHardPushbacksNorms(joinIndex int32, playerCollider *resolv.Object, play func deriveOpPattern(currPlayerDownsync, thatPlayerInNextFrame *PlayerDownsync, currRenderFrame *RoomDownsyncFrame, inputsBuffer *RingBuffer) (int, bool, int32, int32) { // returns (patternId, jumpedOrNot, effectiveDx, effectiveDy) delayedInputFrameId := ConvertToDelayedInputFrameId(currRenderFrame.Id) - delayedInputFrameIdForPrevRdf := ConvertToDelayedInputFrameId(currRenderFrame.Id-1) + delayedInputFrameIdForPrevRdf := ConvertToDelayedInputFrameId(currRenderFrame.Id - 1) if 0 >= delayedInputFrameId { return PATTERN_ID_UNABLE_TO_OP, false, 0, 0 diff --git a/jsexport/battle/characterConfig.go b/jsexport/battle/characterConfig.go index 165882a..8e8feaa 100644 --- a/jsexport/battle/characterConfig.go +++ b/jsexport/battle/characterConfig.go @@ -15,6 +15,7 @@ type CharacterConfig struct { GetUpFrames int32 GetUpFramesToRecover int32 + Speed int32 JumpingInitVelY int32 SkillMapper SkillMapperType @@ -34,6 +35,7 @@ var Characters = map[int]*CharacterConfig{ GetUpFrames: int32(33), GetUpFramesToRecover: int32(30), // 3 invinsible frames for just-blown-up character to make a comeback + 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 { @@ -76,6 +78,7 @@ var Characters = map[int]*CharacterConfig{ GetUpFrames: int32(30), GetUpFramesToRecover: int32(27), // 3 invinsible frames for just-blown-up character to make a comeback + 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 { diff --git a/jsexport/main.go b/jsexport/main.go index 6286ea6..275f902 100644 --- a/jsexport/main.go +++ b/jsexport/main.go @@ -53,8 +53,8 @@ func NewPlayerDownsyncJs(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, VelY: velY, FramesToRecover: framesToRecover, FramesInChState: framesInChState, - ActiveSkillId: activeSkillId, - ActiveSkillHit: activeSkillHit, + ActiveSkillId: activeSkillId, + ActiveSkillHit: activeSkillHit, Speed: speed, BattleState: battleState, CharacterState: characterState, @@ -169,10 +169,10 @@ func main() { "VirtualGridToWorldPos": VirtualGridToWorldPos, "GetCharacterConfigsOrderedByJoinIndex": GetCharacterConfigsOrderedByJoinIndex, "ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs": ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs, - "ConvertToDelayedInputFrameId": ConvertToDelayedInputFrameId, - "ConvertToNoDelayInputFrameId": ConvertToNoDelayInputFrameId, - "ConvertToFirstUsedRenderFrameId": ConvertToFirstUsedRenderFrameId, - "ConvertToLastUsedRenderFrameId": ConvertToLastUsedRenderFrameId, - "ShouldGenerateInputFrameUpsync": ShouldGenerateInputFrameUpsync, + "ConvertToDelayedInputFrameId": ConvertToDelayedInputFrameId, + "ConvertToNoDelayInputFrameId": ConvertToNoDelayInputFrameId, + "ConvertToFirstUsedRenderFrameId": ConvertToFirstUsedRenderFrameId, + "ConvertToLastUsedRenderFrameId": ConvertToLastUsedRenderFrameId, + "ShouldGenerateInputFrameUpsync": ShouldGenerateInputFrameUpsync, }) } From 2d04363d69ab3714a86793b2f59ec428ad95319d Mon Sep 17 00:00:00 2001 From: genxium Date: Wed, 4 Jan 2023 23:48:00 +0800 Subject: [PATCH 09/10] Fixed frontend debug drawer. --- battle_srv/models/pb_type_convert.go | 7 + battle_srv/protos/room_downsync_frame.pb.go | 426 +++++++------ frontend/assets/plugin_scripts/jsexport.js | 104 ++-- .../animation/MonkGirl/MonkGirl.plist | 318 +++++----- .../animation/MonkGirl/MonkGirl.plist.meta | 560 +++++++++--------- .../resources/animation/MonkGirl/MonkGirl.png | Bin 97644 -> 97828 bytes .../resources/animation/MonkGirl/Walking.anim | 148 ++--- frontend/assets/resources/map/dungeon/map.tmx | 4 +- .../pbfiles/room_downsync_frame.proto | 13 +- .../prefabs/ControlledCharacter.prefab | 2 +- frontend/assets/scenes/offline_map.fire | 2 +- frontend/assets/scripts/Map.js | 184 +++--- frontend/assets/scripts/OfflineMap.js | 36 +- ...om_downsync_frame_proto_bundle.forcemsg.js | 87 ++- jsexport/battle/battle.go | 97 ++- jsexport/battle/characterConfig.go | 40 +- jsexport/battle/room_downsync_frame.go | 8 +- jsexport/main.go | 48 +- 18 files changed, 1127 insertions(+), 957 deletions(-) diff --git a/battle_srv/models/pb_type_convert.go b/battle_srv/models/pb_type_convert.go index b7ce3f0..8049373 100644 --- a/battle_srv/models/pb_type_convert.go +++ b/battle_srv/models/pb_type_convert.go @@ -31,6 +31,8 @@ func toPbRoomDownsyncFrame(rdf *battle.RoomDownsyncFrame) *pb.RoomDownsyncFrame FramesInChState: last.FramesInChState, ActiveSkillId: last.ActiveSkillId, ActiveSkillHit: last.ActiveSkillHit, + FramesInvinsible: last.FramesInvinsible, + FramesSelfLockVel: last.FramesSelfLockVel, Speed: last.Speed, BattleState: last.BattleState, CharacterState: last.CharacterState, @@ -63,6 +65,7 @@ func toPbRoomDownsyncFrame(rdf *battle.RoomDownsyncFrame) *pb.RoomDownsyncFrame SelfLockVelX: last.SelfLockVelX, SelfLockVelY: last.SelfLockVelY, + FramesSelfLockVel: last.FramesSelfLockVel, HitboxOffsetX: last.HitboxOffsetX, HitboxOffsetY: last.HitboxOffsetY, @@ -96,6 +99,8 @@ func toPbPlayers(modelInstances map[int32]*Player, withMetaInfo bool) []*pb.Play FramesInChState: last.FramesInChState, ActiveSkillId: last.ActiveSkillId, ActiveSkillHit: last.ActiveSkillHit, + FramesInvinsible: last.FramesInvinsible, + FramesSelfLockVel: last.FramesSelfLockVel, Speed: last.Speed, BattleState: last.BattleState, CharacterState: last.CharacterState, @@ -135,6 +140,8 @@ func toJsPlayers(modelInstances map[int32]*Player) []*battle.PlayerDownsync { FramesInChState: last.FramesInChState, ActiveSkillId: last.ActiveSkillId, ActiveSkillHit: last.ActiveSkillHit, + FramesInvinsible: last.FramesInvinsible, + FramesSelfLockVel: last.FramesSelfLockVel, Speed: last.Speed, BattleState: last.BattleState, CharacterState: last.CharacterState, diff --git a/battle_srv/protos/room_downsync_frame.pb.go b/battle_srv/protos/room_downsync_frame.pb.go index a93f289..529846a 100644 --- a/battle_srv/protos/room_downsync_frame.pb.go +++ b/battle_srv/protos/room_downsync_frame.pb.go @@ -48,6 +48,8 @@ type PlayerDownsync struct { 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"` + FramesSelfLockVel int32 `protobuf:"varint,24,opt,name=framesSelfLockVel,proto3" json:"framesSelfLockVel,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"` @@ -239,6 +241,20 @@ func (x *PlayerDownsync) GetActiveSkillHit() int32 { return 0 } +func (x *PlayerDownsync) GetFramesInvinsible() int32 { + if x != nil { + return x.FramesInvinsible + } + return 0 +} + +func (x *PlayerDownsync) GetFramesSelfLockVel() int32 { + if x != nil { + return x.FramesSelfLockVel + } + return 0 +} + func (x *PlayerDownsync) GetName() string { if x != nil { return x.Name @@ -776,11 +792,12 @@ type MeleeBullet struct { 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"` + FramesSelfLockVel int32 `protobuf:"varint,14,opt,name=framesSelfLockVel,proto3" json:"framesSelfLockVel,omitempty"` + HitboxOffsetX int32 `protobuf:"varint,15,opt,name=hitboxOffsetX,proto3" json:"hitboxOffsetX,omitempty"` + HitboxOffsetY int32 `protobuf:"varint,16,opt,name=hitboxOffsetY,proto3" json:"hitboxOffsetY,omitempty"` + HitboxSizeX int32 `protobuf:"varint,17,opt,name=hitboxSizeX,proto3" json:"hitboxSizeX,omitempty"` + HitboxSizeY int32 `protobuf:"varint,18,opt,name=hitboxSizeY,proto3" json:"hitboxSizeY,omitempty"` + BlowUp bool `protobuf:"varint,19,opt,name=blowUp,proto3" json:"blowUp,omitempty"` } func (x *MeleeBullet) Reset() { @@ -906,6 +923,13 @@ func (x *MeleeBullet) GetSelfLockVelY() int32 { return 0 } +func (x *MeleeBullet) GetFramesSelfLockVel() int32 { + if x != nil { + return x.FramesSelfLockVel + } + return 0 +} + func (x *MeleeBullet) GetHitboxOffsetX() int32 { if x != nil { return x.HitboxOffsetX @@ -1193,7 +1217,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, 0xeb, 0x05, 0x0a, 0x0e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x44, 0x6f, + 0x6f, 0x74, 0x6f, 0x22, 0xc5, 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, @@ -1235,199 +1259,207 @@ var file_room_downsync_frame_proto_rawDesc = []byte{ 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, 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, + 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, 0x2c, 0x0a, 0x11, + 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x53, 0x65, 0x6c, 0x66, 0x4c, 0x6f, 0x63, 0x6b, 0x56, 0x65, + 0x6c, 0x18, 0x18, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x53, + 0x65, 0x6c, 0x66, 0x4c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x6c, 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, 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, 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, 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, + 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, 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, 0xed, 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, 0x2c, 0x0a, 0x11, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x53, 0x65, 0x6c, 0x66, 0x4c, + 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x73, 0x53, 0x65, 0x6c, 0x66, 0x4c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x6c, 0x12, + 0x24, 0x0a, 0x0d, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x58, + 0x18, 0x0f, 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, 0x10, 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, 0x11, 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, 0x12, 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, 0x13, 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, 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, - 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, + 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 ( diff --git a/frontend/assets/plugin_scripts/jsexport.js b/frontend/assets/plugin_scripts/jsexport.js index 2c5ffa7..6962eff 100644 --- a/frontend/assets/plugin_scripts/jsexport.js +++ b/frontend/assets/plugin_scripts/jsexport.js @@ -4747,7 +4747,7 @@ $packages["jsexport/battle"] = (function() { this.Anchor = Anchor_; this.Points = Points_; }); - PlayerDownsync = $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_) { + PlayerDownsync = $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_, FramesSelfLockVel_) { this.$val = this; if (arguments.length === 0) { this.Id = 0; @@ -4772,6 +4772,8 @@ $packages["jsexport/battle"] = (function() { this.InAir = false; this.ActiveSkillId = 0; this.ActiveSkillHit = 0; + this.FramesInvinsible = 0; + this.FramesSelfLockVel = 0; return; } this.Id = Id_; @@ -4796,6 +4798,8 @@ $packages["jsexport/battle"] = (function() { this.InAir = InAir_; this.ActiveSkillId = ActiveSkillId_; this.ActiveSkillHit = ActiveSkillHit_; + this.FramesInvinsible = FramesInvinsible_; + this.FramesSelfLockVel = FramesSelfLockVel_; }); InputFrameDecoded = $pkg.InputFrameDecoded = $newType(0, $kindStruct, "battle.InputFrameDecoded", true, "jsexport/battle", true, function(Dx_, Dy_, BtnALevel_, BtnBLevel_) { this.$val = this; @@ -4819,7 +4823,7 @@ $packages["jsexport/battle"] = (function() { } this.Boundary = Boundary_; }); - Bullet = $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_) { + Bullet = $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_, FramesSelfLockVel_, HitboxOffsetX_, HitboxOffsetY_, HitboxSizeX_, HitboxSizeY_, BlowUp_, CancelTransit_) { this.$val = this; if (arguments.length === 0) { this.OriginatedRenderFrameId = 0; @@ -4835,6 +4839,7 @@ $packages["jsexport/battle"] = (function() { this.Damage = 0; this.SelfLockVelX = 0; this.SelfLockVelY = 0; + this.FramesSelfLockVel = 0; this.HitboxOffsetX = 0; this.HitboxOffsetY = 0; this.HitboxSizeX = 0; @@ -4856,6 +4861,7 @@ $packages["jsexport/battle"] = (function() { this.Damage = Damage_; this.SelfLockVelX = SelfLockVelX_; this.SelfLockVelY = SelfLockVelY_; + this.FramesSelfLockVel = FramesSelfLockVel_; this.HitboxOffsetX = HitboxOffsetX_; this.HitboxOffsetY = HitboxOffsetY_; this.HitboxSizeX = HitboxSizeX_; @@ -4866,7 +4872,7 @@ $packages["jsexport/battle"] = (function() { MeleeBullet = $pkg.MeleeBullet = $newType(0, $kindStruct, "battle.MeleeBullet", true, "jsexport/battle", true, function(Bullet_) { this.$val = this; if (arguments.length === 0) { - this.Bullet = new Bullet.ptr(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, false, false); + this.Bullet = new Bullet.ptr(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, false, false); return; } this.Bullet = Bullet_; @@ -4881,7 +4887,7 @@ $packages["jsexport/battle"] = (function() { this.VelX = 0; this.VelY = 0; this.Speed = 0; - this.Bullet = new Bullet.ptr(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, false, false); + this.Bullet = new Bullet.ptr(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, false, false); return; } this.VirtualGridX = VirtualGridX_; @@ -4968,7 +4974,7 @@ $packages["jsexport/battle"] = (function() { this.Eles = Eles_; }); SkillMapperType = $pkg.SkillMapperType = $newType(4, $kindFunc, "battle.SkillMapperType", true, "jsexport/battle", true, null); - CharacterConfig = $pkg.CharacterConfig = $newType(0, $kindStruct, "battle.CharacterConfig", true, "jsexport/battle", true, function(SpeciesId_, SpeciesName_, InAirIdleFrameIdxTurningPoint_, InAirIdleFrameIdxTurnedCycle_, LayDownFrames_, LayDownFramesToRecover_, GetUpFrames_, GetUpFramesToRecover_, Speed_, JumpingInitVelY_, SkillMapper_) { + CharacterConfig = $pkg.CharacterConfig = $newType(0, $kindStruct, "battle.CharacterConfig", true, "jsexport/battle", true, function(SpeciesId_, SpeciesName_, InAirIdleFrameIdxTurningPoint_, InAirIdleFrameIdxTurnedCycle_, LayDownFrames_, LayDownFramesToRecover_, GetUpInvinsibleFrames_, GetUpFramesToRecover_, Speed_, JumpingInitVelY_, SkillMapper_) { this.$val = this; if (arguments.length === 0) { this.SpeciesId = 0; @@ -4977,7 +4983,7 @@ $packages["jsexport/battle"] = (function() { this.InAirIdleFrameIdxTurnedCycle = 0; this.LayDownFrames = 0; this.LayDownFramesToRecover = 0; - this.GetUpFrames = 0; + this.GetUpInvinsibleFrames = 0; this.GetUpFramesToRecover = 0; this.Speed = 0; this.JumpingInitVelY = 0; @@ -4990,7 +4996,7 @@ $packages["jsexport/battle"] = (function() { this.InAirIdleFrameIdxTurnedCycle = InAirIdleFrameIdxTurnedCycle_; this.LayDownFrames = LayDownFrames_; this.LayDownFramesToRecover = LayDownFramesToRecover_; - this.GetUpFrames = GetUpFrames_; + this.GetUpInvinsibleFrames = GetUpInvinsibleFrames_; this.GetUpFramesToRecover = GetUpFramesToRecover_; this.Speed = Speed_; this.JumpingInitVelY = JumpingInitVelY_; @@ -5483,7 +5489,7 @@ $packages["jsexport/battle"] = (function() { return [patternId, jumpedOrNot, effDx, effDy]; }; ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame = function(inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, chConfigsOrderedByJoinIndex) { - var {_1, _2, _entry, _entry$1, _entry$2, _i, _i$1, _i$10, _i$2, _i$3, _i$4, _i$5, _i$6, _i$7, _i$8, _i$9, _index, _index$1, _index$2, _r, _r$1, _r$2, _r$3, _r$4, _r$5, _ref, _ref$1, _ref$10, _ref$11, _ref$12, _ref$13, _ref$14, _ref$2, _ref$3, _ref$4, _ref$5, _ref$6, _ref$7, _ref$8, _ref$9, _tmp, _tmp$1, _tmp$10, _tmp$11, _tmp$12, _tmp$13, _tmp$14, _tmp$15, _tmp$16, _tmp$17, _tmp$18, _tmp$19, _tmp$2, _tmp$20, _tmp$3, _tmp$4, _tmp$5, _tmp$6, _tmp$7, _tmp$8, _tmp$9, _tuple, _tuple$1, _tuple$10, _tuple$11, _tuple$2, _tuple$3, _tuple$4, _tuple$5, _tuple$6, _tuple$7, _tuple$8, _tuple$9, atkedPlayerInNextFrame, bShape, bulletCollider, bulletColliders, bulletShape, bulletWx, bulletWy, chConfig, chConfig$1, chConfig$2, chConfigsOrderedByJoinIndex, colliderHeight, colliderWidth, colliderWorldHeight, colliderWorldWidth, collision, collision$1, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currPlayerDownsync, currPlayerDownsync$1, currPlayerDownsync$2, currPlayerDownsync$3, currPlayerDownsync$4, currRenderFrame, defenderShape, effDx, effDy, effPushbacks, existent, existent$1, existent$2, halfColliderHeightDiff, halfColliderWidthDiff, halfColliderWorldHeightDiff, hardPushbackNorm, hardPushbackNorms, hitboxSizeWx, hitboxSizeWy, i, i$1, i$2, i$3, i$4, inputsBuffer, isAnotherPlayer, isBarrier, isBullet, joinIndex, joinIndex$1, joinIndex$2, joinIndex$3, jumpedOrNot, jumpedOrNotList, landedOnGravityPushback, meleeBullet, newBullet, newBulletCollider, newVx, newVy, nextRenderFrameMeleeBullets, nextRenderFramePlayers, normAlignmentWithGravity, obj, obj$1, offender, offender$1, oldFramesToRecover, oldNextCharacterState, overlapResult, overlapped, overlapped$1, patternId, playerCollider, playerCollider$1, playerCollider$2, playerCollider$3, playerColliders, playerShape, projectedMagnitude, pushbackVelX, pushbackVelY, pushbackX, pushbackY, roomCapacity, skillConfig, skillId, t, t$1, thatPlayerInNextFrame, thatPlayerInNextFrame$1, thatPlayerInNextFrame$2, thatPlayerInNextFrame$3, v, v$1, wx, wy, x, x$1, x$10, x$11, x$12, x$13, x$14, x$2, x$3, x$4, x$5, x$6, x$7, x$8, x$9, xfac, xfac$1, $s, $r, $c} = $restore(this, {inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, chConfigsOrderedByJoinIndex}); + var {_1, _2, _entry, _entry$1, _entry$2, _i, _i$1, _i$10, _i$2, _i$3, _i$4, _i$5, _i$6, _i$7, _i$8, _i$9, _index, _index$1, _index$2, _r, _r$1, _r$2, _r$3, _r$4, _r$5, _ref, _ref$1, _ref$10, _ref$11, _ref$12, _ref$13, _ref$14, _ref$2, _ref$3, _ref$4, _ref$5, _ref$6, _ref$7, _ref$8, _ref$9, _tmp, _tmp$1, _tmp$10, _tmp$11, _tmp$12, _tmp$13, _tmp$14, _tmp$15, _tmp$16, _tmp$17, _tmp$18, _tmp$19, _tmp$2, _tmp$20, _tmp$3, _tmp$4, _tmp$5, _tmp$6, _tmp$7, _tmp$8, _tmp$9, _tuple, _tuple$1, _tuple$10, _tuple$11, _tuple$2, _tuple$3, _tuple$4, _tuple$5, _tuple$6, _tuple$7, _tuple$8, _tuple$9, atkedPlayerInNextFrame, bShape, bulletCollider, bulletColliders, bulletShape, bulletWx, bulletWy, chConfig, chConfig$1, chConfig$2, chConfigsOrderedByJoinIndex, colliderHeight, colliderWidth, colliderWorldHeight, colliderWorldWidth, collision, collision$1, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currPlayerDownsync, currPlayerDownsync$1, currPlayerDownsync$2, currPlayerDownsync$3, currPlayerDownsync$4, currRenderFrame, defenderShape, effDx, effDy, effPushbacks, existent, existent$1, existent$2, halfColliderHeightDiff, halfColliderWidthDiff, halfColliderWorldHeightDiff, hardPushbackNorm, hardPushbackNorms, hasLockVel, hitboxSizeWx, hitboxSizeWy, i, i$1, i$2, i$3, i$4, inputsBuffer, isAnotherPlayer, isBarrier, isBullet, joinIndex, joinIndex$1, joinIndex$2, joinIndex$3, jumpedOrNot, jumpedOrNotList, landedOnGravityPushback, meleeBullet, newBullet, newBulletCollider, newVx, newVy, nextRenderFrameMeleeBullets, nextRenderFramePlayers, normAlignmentWithGravity, obj, obj$1, offender, offender$1, oldFramesToRecover, oldNextCharacterState, overlapResult, overlapped, overlapped$1, patternId, playerCollider, playerCollider$1, playerCollider$2, playerCollider$3, playerColliders, playerShape, projectedMagnitude, pushbackVelX, pushbackVelY, pushbackX, pushbackY, roomCapacity, skillConfig, skillId, t, t$1, thatPlayerInNextFrame, thatPlayerInNextFrame$1, thatPlayerInNextFrame$2, thatPlayerInNextFrame$3, v, v$1, wx, wy, x, x$1, x$10, x$11, x$12, x$13, x$14, x$2, x$3, x$4, x$5, x$6, x$7, x$8, x$9, xfac, xfac$1, xfac$2, $s, $r, $c} = $restore(this, {inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, chConfigsOrderedByJoinIndex}); /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: roomCapacity = currRenderFrame.PlayersArr.$length; nextRenderFramePlayers = $makeSlice(sliceType$6, roomCapacity); @@ -5493,10 +5499,16 @@ $packages["jsexport/battle"] = (function() { if (!(_i < _ref.$length)) { break; } i = _i; currPlayerDownsync = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - ((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i] = new PlayerDownsync.ptr(currPlayerDownsync.Id, currPlayerDownsync.VirtualGridX, currPlayerDownsync.VirtualGridY, currPlayerDownsync.DirX, currPlayerDownsync.DirY, currPlayerDownsync.VelX, currPlayerDownsync.VelY, currPlayerDownsync.Speed, currPlayerDownsync.BattleState, currPlayerDownsync.JoinIndex, currPlayerDownsync.ColliderRadius, currPlayerDownsync.Removed, currPlayerDownsync.Score, 0, currPlayerDownsync.FramesToRecover - 1 >> 0, currPlayerDownsync.FramesInChState + 1 >> 0, currPlayerDownsync.Hp, currPlayerDownsync.MaxHp, currPlayerDownsync.CharacterState, true, currPlayerDownsync.ActiveSkillId, currPlayerDownsync.ActiveSkillHit)); + ((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i] = new PlayerDownsync.ptr(currPlayerDownsync.Id, currPlayerDownsync.VirtualGridX, currPlayerDownsync.VirtualGridY, currPlayerDownsync.DirX, currPlayerDownsync.DirY, currPlayerDownsync.VelX, currPlayerDownsync.VelY, currPlayerDownsync.Speed, currPlayerDownsync.BattleState, currPlayerDownsync.JoinIndex, currPlayerDownsync.ColliderRadius, currPlayerDownsync.Removed, currPlayerDownsync.Score, 0, currPlayerDownsync.FramesToRecover - 1 >> 0, currPlayerDownsync.FramesInChState + 1 >> 0, currPlayerDownsync.Hp, currPlayerDownsync.MaxHp, currPlayerDownsync.CharacterState, true, currPlayerDownsync.ActiveSkillId, currPlayerDownsync.ActiveSkillHit, currPlayerDownsync.FramesInvinsible - 1 >> 0, currPlayerDownsync.FramesSelfLockVel - 1 >> 0)); if (((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i]).FramesToRecover < 0) { ((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i]).FramesToRecover = 0; } + if (((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i]).FramesInvinsible < 0) { + ((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i]).FramesInvinsible = 0; + } + if (((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i]).FramesSelfLockVel < 0) { + ((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i]).FramesSelfLockVel = 0; + } _i++; } nextRenderFrameMeleeBullets = $makeSlice(sliceType$7, 0, currRenderFrame.MeleeBullets.$length); @@ -5539,11 +5551,28 @@ $packages["jsexport/battle"] = (function() { newBullet[0].Bullet.OffenderJoinIndex = joinIndex; nextRenderFrameMeleeBullets = $append(nextRenderFrameMeleeBullets, newBullet[0]); thatPlayerInNextFrame.FramesToRecover = skillConfig.RecoveryFrames; + hasLockVel = false; + if (!((-1 === v.Bullet.SelfLockVelX))) { + hasLockVel = true; + xfac = 1; + if (0 > thatPlayerInNextFrame.DirX) { + xfac = -xfac; + } + thatPlayerInNextFrame.VelX = $imul(xfac, v.Bullet.SelfLockVelX); + thatPlayerInNextFrame.FramesSelfLockVel = v.Bullet.FramesSelfLockVel; + } + if (!((-1 === v.Bullet.SelfLockVelY))) { + hasLockVel = true; + thatPlayerInNextFrame.VelY = v.Bullet.SelfLockVelY; + thatPlayerInNextFrame.FramesSelfLockVel = v.Bullet.FramesSelfLockVel; + } + if (false === hasLockVel) { + if (false === currPlayerDownsync$1.InAir) { + thatPlayerInNextFrame.VelX = 0; + } + } } thatPlayerInNextFrame.CharacterState = skillConfig.BoundChState; - if (false === currPlayerDownsync$1.InAir) { - thatPlayerInNextFrame.VelX = 0; - } _i$1++; /* continue; */ $s = 1; continue; } @@ -5627,11 +5656,11 @@ $packages["jsexport/battle"] = (function() { /* */ $s = 11; continue; /* if (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) <= currRenderFrame.Id) && (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) + meleeBullet.Bullet.ActiveFrames >> 0) > currRenderFrame.Id)) { */ case 10: offender = (x$4 = currRenderFrame.PlayersArr, x$5 = meleeBullet.Bullet.OffenderJoinIndex - 1 >> 0, ((x$5 < 0 || x$5 >= x$4.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$4.$array[x$4.$offset + x$5])); - xfac = 1; + xfac$1 = 1; if (0 > offender.DirX) { - xfac = -xfac; + xfac$1 = -xfac$1; } - _tuple$4 = VirtualGridToWorldPos(offender.VirtualGridX + ($imul(xfac, meleeBullet.Bullet.HitboxOffsetX)) >> 0, offender.VirtualGridY); + _tuple$4 = VirtualGridToWorldPos(offender.VirtualGridX + ($imul(xfac$1, meleeBullet.Bullet.HitboxOffsetX)) >> 0, offender.VirtualGridY); bulletWx = _tuple$4[0]; bulletWy = _tuple$4[1]; _tuple$5 = VirtualGridToWorldPos(meleeBullet.Bullet.HitboxSizeX, meleeBullet.Bullet.HitboxSizeY); @@ -5757,8 +5786,9 @@ $packages["jsexport/battle"] = (function() { thatPlayerInNextFrame$2.FramesToRecover = chConfig$2.GetUpFramesToRecover; } } else if (10 === thatPlayerInNextFrame$2.CharacterState) { - if (thatPlayerInNextFrame$2.FramesInChState === chConfig$2.GetUpFrames) { + if (0 === thatPlayerInNextFrame$2.FramesToRecover) { thatPlayerInNextFrame$2.CharacterState = 0; + thatPlayerInNextFrame$2.FramesInvinsible = chConfig$2.GetUpInvinsibleFrames; } } } @@ -5806,6 +5836,10 @@ $packages["jsexport/battle"] = (function() { _i$8++; /* continue; */ $s = 27; continue; } + if (0 < t.FramesInvinsible) { + _i$8++; + /* continue; */ $s = 27; continue; + } _r$5 = CalcPushbacks(0, 0, bulletShape, defenderShape); /* */ $s = 32; case 32: if($c) { $c = false; _r$5 = _r$5.$blk(); } if (_r$5 && _r$5.$blk !== undefined) { break s; } _tuple$9 = _r$5; overlapped$1 = _tuple$9[0]; @@ -5813,11 +5847,11 @@ $packages["jsexport/battle"] = (function() { _i$8++; /* continue; */ $s = 27; continue; } - xfac$1 = 1; + xfac$2 = 1; if (0 > offender$1.DirX) { - xfac$1 = -xfac$1; + xfac$2 = -xfac$2; } - _tmp$19 = $imul(xfac$1, v$1.Bullet.PushbackVelX); + _tmp$19 = $imul(xfac$2, v$1.Bullet.PushbackVelX); _tmp$20 = v$1.Bullet.PushbackVelY; pushbackVelX = _tmp$19; pushbackVelY = _tmp$20; @@ -5891,7 +5925,7 @@ $packages["jsexport/battle"] = (function() { _i$10++; } $s = -1; return new RoomDownsyncFrame.ptr(currRenderFrame.Id + 1 >> 0, nextRenderFramePlayers, new $Int64(0, 0), nextRenderFrameMeleeBullets, sliceType$11.nil, new $Uint64(0, 0), false, false); - /* */ } return; } var $f = {$blk: ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame, $c: true, $r, _1, _2, _entry, _entry$1, _entry$2, _i, _i$1, _i$10, _i$2, _i$3, _i$4, _i$5, _i$6, _i$7, _i$8, _i$9, _index, _index$1, _index$2, _r, _r$1, _r$2, _r$3, _r$4, _r$5, _ref, _ref$1, _ref$10, _ref$11, _ref$12, _ref$13, _ref$14, _ref$2, _ref$3, _ref$4, _ref$5, _ref$6, _ref$7, _ref$8, _ref$9, _tmp, _tmp$1, _tmp$10, _tmp$11, _tmp$12, _tmp$13, _tmp$14, _tmp$15, _tmp$16, _tmp$17, _tmp$18, _tmp$19, _tmp$2, _tmp$20, _tmp$3, _tmp$4, _tmp$5, _tmp$6, _tmp$7, _tmp$8, _tmp$9, _tuple, _tuple$1, _tuple$10, _tuple$11, _tuple$2, _tuple$3, _tuple$4, _tuple$5, _tuple$6, _tuple$7, _tuple$8, _tuple$9, atkedPlayerInNextFrame, bShape, bulletCollider, bulletColliders, bulletShape, bulletWx, bulletWy, chConfig, chConfig$1, chConfig$2, chConfigsOrderedByJoinIndex, colliderHeight, colliderWidth, colliderWorldHeight, colliderWorldWidth, collision, collision$1, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currPlayerDownsync, currPlayerDownsync$1, currPlayerDownsync$2, currPlayerDownsync$3, currPlayerDownsync$4, currRenderFrame, defenderShape, effDx, effDy, effPushbacks, existent, existent$1, existent$2, halfColliderHeightDiff, halfColliderWidthDiff, halfColliderWorldHeightDiff, hardPushbackNorm, hardPushbackNorms, hitboxSizeWx, hitboxSizeWy, i, i$1, i$2, i$3, i$4, inputsBuffer, isAnotherPlayer, isBarrier, isBullet, joinIndex, joinIndex$1, joinIndex$2, joinIndex$3, jumpedOrNot, jumpedOrNotList, landedOnGravityPushback, meleeBullet, newBullet, newBulletCollider, newVx, newVy, nextRenderFrameMeleeBullets, nextRenderFramePlayers, normAlignmentWithGravity, obj, obj$1, offender, offender$1, oldFramesToRecover, oldNextCharacterState, overlapResult, overlapped, overlapped$1, patternId, playerCollider, playerCollider$1, playerCollider$2, playerCollider$3, playerColliders, playerShape, projectedMagnitude, pushbackVelX, pushbackVelY, pushbackX, pushbackY, roomCapacity, skillConfig, skillId, t, t$1, thatPlayerInNextFrame, thatPlayerInNextFrame$1, thatPlayerInNextFrame$2, thatPlayerInNextFrame$3, v, v$1, wx, wy, x, x$1, x$10, x$11, x$12, x$13, x$14, x$2, x$3, x$4, x$5, x$6, x$7, x$8, x$9, xfac, xfac$1, $s};return $f; + /* */ } return; } var $f = {$blk: ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame, $c: true, $r, _1, _2, _entry, _entry$1, _entry$2, _i, _i$1, _i$10, _i$2, _i$3, _i$4, _i$5, _i$6, _i$7, _i$8, _i$9, _index, _index$1, _index$2, _r, _r$1, _r$2, _r$3, _r$4, _r$5, _ref, _ref$1, _ref$10, _ref$11, _ref$12, _ref$13, _ref$14, _ref$2, _ref$3, _ref$4, _ref$5, _ref$6, _ref$7, _ref$8, _ref$9, _tmp, _tmp$1, _tmp$10, _tmp$11, _tmp$12, _tmp$13, _tmp$14, _tmp$15, _tmp$16, _tmp$17, _tmp$18, _tmp$19, _tmp$2, _tmp$20, _tmp$3, _tmp$4, _tmp$5, _tmp$6, _tmp$7, _tmp$8, _tmp$9, _tuple, _tuple$1, _tuple$10, _tuple$11, _tuple$2, _tuple$3, _tuple$4, _tuple$5, _tuple$6, _tuple$7, _tuple$8, _tuple$9, atkedPlayerInNextFrame, bShape, bulletCollider, bulletColliders, bulletShape, bulletWx, bulletWy, chConfig, chConfig$1, chConfig$2, chConfigsOrderedByJoinIndex, colliderHeight, colliderWidth, colliderWorldHeight, colliderWorldWidth, collision, collision$1, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currPlayerDownsync, currPlayerDownsync$1, currPlayerDownsync$2, currPlayerDownsync$3, currPlayerDownsync$4, currRenderFrame, defenderShape, effDx, effDy, effPushbacks, existent, existent$1, existent$2, halfColliderHeightDiff, halfColliderWidthDiff, halfColliderWorldHeightDiff, hardPushbackNorm, hardPushbackNorms, hasLockVel, hitboxSizeWx, hitboxSizeWy, i, i$1, i$2, i$3, i$4, inputsBuffer, isAnotherPlayer, isBarrier, isBullet, joinIndex, joinIndex$1, joinIndex$2, joinIndex$3, jumpedOrNot, jumpedOrNotList, landedOnGravityPushback, meleeBullet, newBullet, newBulletCollider, newVx, newVy, nextRenderFrameMeleeBullets, nextRenderFramePlayers, normAlignmentWithGravity, obj, obj$1, offender, offender$1, oldFramesToRecover, oldNextCharacterState, overlapResult, overlapped, overlapped$1, patternId, playerCollider, playerCollider$1, playerCollider$2, playerCollider$3, playerColliders, playerShape, projectedMagnitude, pushbackVelX, pushbackVelY, pushbackX, pushbackY, roomCapacity, skillConfig, skillId, t, t$1, thatPlayerInNextFrame, thatPlayerInNextFrame$1, thatPlayerInNextFrame$2, thatPlayerInNextFrame$3, v, v$1, wx, wy, x, x$1, x$10, x$11, x$12, x$13, x$14, x$2, x$3, x$4, x$5, x$6, x$7, x$8, x$9, xfac, xfac$1, xfac$2, $s};return $f; }; $pkg.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame = ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame; GenerateRectCollider = function(wx, wy, w, h, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, data, tag) { @@ -5997,10 +6031,10 @@ $packages["jsexport/battle"] = (function() { ptrType$12.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)}]; Vec2D.init("", [{prop: "X", name: "X", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "Y", name: "Y", embedded: false, exported: true, typ: $Float64, tag: ""}]); Polygon2D.init("", [{prop: "Anchor", name: "Anchor", embedded: false, exported: true, typ: ptrType$10, tag: ""}, {prop: "Points", name: "Points", embedded: false, exported: true, typ: sliceType$13, tag: ""}]); - PlayerDownsync.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: ""}]); + PlayerDownsync.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: ""}, {prop: "FramesSelfLockVel", name: "FramesSelfLockVel", embedded: false, exported: true, typ: $Int32, tag: ""}]); InputFrameDecoded.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: ""}]); Barrier.init("", [{prop: "Boundary", name: "Boundary", embedded: false, exported: true, typ: ptrType$11, tag: ""}]); - Bullet.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: mapType, tag: ""}]); + Bullet.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: "FramesSelfLockVel", name: "FramesSelfLockVel", 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: mapType, tag: ""}]); MeleeBullet.init("", [{prop: "Bullet", name: "Bullet", embedded: true, exported: true, typ: Bullet, tag: ""}]); FireballBullet.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: Bullet, tag: ""}]); Skill.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: sliceType$2, tag: ""}]); @@ -6008,7 +6042,7 @@ $packages["jsexport/battle"] = (function() { InputFrameDownsync.init("", [{prop: "InputFrameId", name: "InputFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "InputList", name: "InputList", embedded: false, exported: true, typ: sliceType$5, tag: ""}, {prop: "ConfirmedList", name: "ConfirmedList", embedded: false, exported: true, typ: $Uint64, tag: ""}]); RingBuffer.init("", [{prop: "Ed", name: "Ed", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "St", name: "St", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "EdFrameId", name: "EdFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "StFrameId", name: "StFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "N", name: "N", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Cnt", name: "Cnt", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Eles", name: "Eles", embedded: false, exported: true, typ: sliceType$2, tag: ""}]); SkillMapperType.init([$Int, ptrType$5], [$Int], false); - CharacterConfig.init("", [{prop: "SpeciesId", name: "SpeciesId", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "SpeciesName", name: "SpeciesName", embedded: false, exported: true, typ: $String, tag: ""}, {prop: "InAirIdleFrameIdxTurningPoint", name: "InAirIdleFrameIdxTurningPoint", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "InAirIdleFrameIdxTurnedCycle", name: "InAirIdleFrameIdxTurnedCycle", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "LayDownFrames", name: "LayDownFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "LayDownFramesToRecover", name: "LayDownFramesToRecover", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "GetUpFrames", name: "GetUpFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "GetUpFramesToRecover", name: "GetUpFramesToRecover", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Speed", name: "Speed", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "JumpingInitVelY", name: "JumpingInitVelY", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "SkillMapper", name: "SkillMapper", embedded: false, exported: true, typ: SkillMapperType, tag: ""}]); + CharacterConfig.init("", [{prop: "SpeciesId", name: "SpeciesId", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "SpeciesName", name: "SpeciesName", embedded: false, exported: true, typ: $String, tag: ""}, {prop: "InAirIdleFrameIdxTurningPoint", name: "InAirIdleFrameIdxTurningPoint", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "InAirIdleFrameIdxTurnedCycle", name: "InAirIdleFrameIdxTurnedCycle", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "LayDownFrames", name: "LayDownFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "LayDownFramesToRecover", name: "LayDownFramesToRecover", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "GetUpInvinsibleFrames", name: "GetUpInvinsibleFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "GetUpFramesToRecover", name: "GetUpFramesToRecover", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Speed", name: "Speed", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "JumpingInitVelY", name: "JumpingInitVelY", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "SkillMapper", name: "SkillMapper", embedded: false, exported: true, typ: SkillMapperType, tag: ""}]); SatResult.init("", [{prop: "Overlap", name: "Overlap", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "OverlapX", name: "OverlapX", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "OverlapY", name: "OverlapY", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "AContainedInB", name: "AContainedInB", embedded: false, exported: true, typ: $Bool, tag: ""}, {prop: "BContainedInA", name: "BContainedInA", embedded: false, exported: true, typ: $Bool, tag: ""}, {prop: "Axis", name: "Axis", embedded: false, exported: true, typ: resolv.Vector, tag: ""}]); $init = function() { $pkg.$init = function() {}; @@ -6016,8 +6050,8 @@ $packages["jsexport/battle"] = (function() { $r = math.$init(); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } $r = resolv.$init(); /* */ $s = 2; case 2: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } $pkg.DIRECTION_DECODER = new sliceType$1([new sliceType([0, 0]), new sliceType([0, 2]), new sliceType([0, -2]), new sliceType([2, 0]), new sliceType([-2, 0]), new sliceType([1, 1]), new sliceType([-1, -1]), new sliceType([1, -1]), new sliceType([-1, 1])]); - skills = $makeMap($Int.keyFor, [{ k: 1, v: new Skill.ptr(0, 30, 30, 30, 1, 2, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 7, 13, 30, 22, 13, 9, 50, 0, 5, 0, 0, 1200, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 2 }])))])) }, { k: 2, v: new Skill.ptr(0, 36, 36, 36, 1, 11, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 18, 22, 36, 18, 18, 9, 50, 0, 5, 0, 0, 1800, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 3 }])))])) }, { k: 3, v: new Skill.ptr(0, 60, 60, 60, 1, 12, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 15, 0, 0, 40, 999999999, 9, 200, 700, 10, 0, 0, 2400, 0, 3200, 3200, true, false))])) }, { k: 4, v: new Skill.ptr(0, 30, 30, 30, 1, 2, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 7, 13, 30, 22, 13, 9, 50, 0, 5, 0, 0, 1200, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 5 }])))])) }, { k: 5, v: new Skill.ptr(0, 36, 36, 36, 1, 11, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 18, 22, 36, 18, 18, 9, 50, 0, 5, 0, 0, 1800, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 6 }])))])) }, { k: 6, v: new Skill.ptr(0, 60, 60, 60, 1, 12, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 15, 0, 0, 40, 999999999, 9, 200, 700, 10, 0, 0, 2400, 0, 3200, 3200, true, false))])) }, { k: 255, v: new Skill.ptr(0, 34, 34, 34, 1, 6, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 3, 0, 0, 20, 18, 9, 50, 0, 5, 0, 0, 1200, 0, 3200, 2400, false, false))])) }, { k: 256, v: new Skill.ptr(0, 34, 34, 34, 1, 6, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 3, 0, 0, 20, 18, 9, 50, 0, 5, 0, 0, 1200, 0, 3200, 2400, false, false))])) }]); - $pkg.Characters = $makeMap($Int.keyFor, [{ k: 0, v: new CharacterConfig.ptr(0, "MonkGirl", 11, 1, 16, 16, 33, 30, 120, 800, (function(patternId, currPlayerDownsync) { + skills = $makeMap($Int.keyFor, [{ k: 1, v: new Skill.ptr(0, 30, 30, 30, 1, 2, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 7, 13, 30, 22, 13, 9, 50, 0, 5, 5, -1, 0, 1200, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 2 }])))])) }, { k: 2, v: new Skill.ptr(0, 36, 36, 36, 1, 11, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 18, 22, 36, 18, 18, 9, 50, 0, 5, 10, -1, 0, 1800, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 3 }])))])) }, { k: 3, v: new Skill.ptr(0, 70, 70, 70, 1, 12, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 15, 0, 0, 30, 999999999, 9, 200, 700, 10, -1, -1, 0, 3200, 0, 4800, 3200, true, false))])) }, { k: 4, v: new Skill.ptr(0, 30, 30, 30, 1, 2, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 7, 13, 30, 22, 13, 9, 50, 0, 5, 5, -1, 0, 1200, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 5 }])))])) }, { k: 5, v: new Skill.ptr(0, 36, 36, 36, 1, 11, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 18, 22, 36, 18, 18, 9, 50, 0, 5, 10, -1, 0, 1800, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 6 }])))])) }, { k: 6, v: new Skill.ptr(0, 60, 60, 60, 1, 12, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 15, 0, 0, 40, 999999999, 9, 200, 700, 10, -10, -1, 0, 2400, 0, 3200, 3200, true, false))])) }, { k: 255, v: new Skill.ptr(0, 34, 34, 34, 1, 6, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 3, 0, 0, 20, 18, 9, 50, 0, 5, -1, -1, 0, 1200, 0, 3200, 2400, false, false))])) }, { k: 256, v: new Skill.ptr(0, 34, 34, 34, 1, 6, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 3, 0, 0, 20, 18, 9, 50, 0, 5, -1, -1, 0, 1200, 0, 3200, 2400, false, false))])) }]); + $pkg.Characters = $makeMap($Int.keyFor, [{ k: 0, v: new CharacterConfig.ptr(0, "MonkGirl", 11, 1, 16, 16, 10, 27, 120, 800, (function(patternId, currPlayerDownsync) { var _entry, _entry$1, _ref, _tuple, _tuple$1, currPlayerDownsync, existent1, existent2, nextSkillId, patternId, skillConfig, v, x, x$1; if (1 === patternId) { if (0 === currPlayerDownsync.FramesToRecover) { @@ -6047,7 +6081,7 @@ $packages["jsexport/battle"] = (function() { } } return -1; - })) }, { k: 1, v: new CharacterConfig.ptr(1, "KnifeGirl", 9, 1, 16, 16, 30, 27, 140, 750, (function(patternId, currPlayerDownsync) { + })) }, { k: 1, v: new CharacterConfig.ptr(1, "KnifeGirl", 9, 1, 16, 16, 10, 27, 140, 750, (function(patternId, currPlayerDownsync) { var _entry, _entry$1, _ref, _tuple, _tuple$1, currPlayerDownsync, existent1, existent2, nextSkillId, patternId, skillConfig, v, x, x$1; if (1 === patternId) { if (0 === currPlayerDownsync.FramesToRecover) { @@ -6081,7 +6115,7 @@ $packages["jsexport/battle"] = (function() { inAirSet = $makeMap($Int32.keyFor, [{ k: 4, v: true }, { k: 5, v: true }, { k: 6, v: true }, { k: 7, v: true }, { k: 8, v: true }]); noOpSet = $makeMap($Int32.keyFor, [{ k: 3, v: true }, { k: 7, v: true }, { k: 8, v: true }, { k: 9, v: true }]); invinsibleSet = $makeMap($Int32.keyFor, [{ k: 8, v: true }, { k: 9, v: true }, { k: 10, v: true }]); - nonAttackingSet = $makeMap($Int32.keyFor, []); + nonAttackingSet = $makeMap($Int32.keyFor, [{ k: 0, v: true }, { k: 1, v: true }, { k: 4, v: true }, { k: 5, v: true }, { k: 3, v: true }, { k: 7, v: true }, { k: 8, v: true }, { k: 9, v: true }, { k: 10, v: true }]); /* */ } return; } if ($f === undefined) { $f = { $blk: $init }; } $f.$s = $s; $f.$r = $r; return $f; }; $pkg.$init = $init; @@ -6108,8 +6142,8 @@ $packages["jsexport"] = (function() { funcType = $funcType([$Float64, $Float64], [ptrType$5], false); funcType$1 = $funcType([ptrType, sliceType$1], [ptrType$5], false); funcType$2 = $funcType([ptrType$1], [ptrType$5], false); - funcType$3 = $funcType([$Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Bool], [ptrType$5], false); - funcType$4 = $funcType([$Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Bool], [ptrType$5], false); + funcType$3 = $funcType([$Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Bool], [ptrType$5], false); + funcType$4 = $funcType([$Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Bool], [ptrType$5], false); funcType$5 = $funcType([$Int32, sliceType$2, sliceType$3], [ptrType$5], false); funcType$6 = $funcType([$Int, $Int, $Int, $Int], [ptrType$5], false); funcType$7 = $funcType([$Int32, sliceType, $Uint64], [ptrType$5], false); @@ -6178,14 +6212,14 @@ $packages["jsexport"] = (function() { return js.MakeWrapper(new battle.Barrier.ptr(boundary)); }; $pkg.NewBarrierJs = NewBarrierJs; - NewPlayerDownsyncJs = function(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, framesToRecover, framesInChState, activeSkillId, activeSkillHit, speed, battleState, characterState, joinIndex, hp, maxHp, colliderRadius, inAir) { - var activeSkillHit, activeSkillId, battleState, characterState, colliderRadius, dirX, dirY, framesInChState, framesToRecover, hp, id, inAir, joinIndex, maxHp, speed, velX, velY, virtualGridX, virtualGridY; - return js.MakeWrapper(new battle.PlayerDownsync.ptr(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, speed, battleState, joinIndex, colliderRadius, false, 0, 0, framesToRecover, framesInChState, hp, maxHp, characterState, inAir, activeSkillId, activeSkillHit)); + NewPlayerDownsyncJs = function(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, framesToRecover, framesInChState, activeSkillId, activeSkillHit, framesInvinsible, framesSelfLockVel, speed, battleState, characterState, joinIndex, hp, maxHp, colliderRadius, inAir) { + var activeSkillHit, activeSkillId, battleState, characterState, colliderRadius, dirX, dirY, framesInChState, framesInvinsible, framesSelfLockVel, framesToRecover, hp, id, inAir, joinIndex, maxHp, speed, velX, velY, virtualGridX, virtualGridY; + return js.MakeWrapper(new battle.PlayerDownsync.ptr(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, speed, battleState, joinIndex, colliderRadius, false, 0, 0, framesToRecover, framesInChState, hp, maxHp, characterState, inAir, activeSkillId, activeSkillHit, framesInvinsible, 0)); }; $pkg.NewPlayerDownsyncJs = NewPlayerDownsyncJs; - NewMeleeBulletJs = function(originatedRenderFrameId, offenderJoinIndex, startupFrames, cancellableStFrame, cancellableEdFrame, activeFrames, hitStunFrames, blockStunFrames, pushbackVelX, pushbackVelY, damage, selfLockVelX, selfLockVelY, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY, blowUp) { - var activeFrames, blockStunFrames, blowUp, cancellableEdFrame, cancellableStFrame, damage, hitStunFrames, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY, offenderJoinIndex, originatedRenderFrameId, pushbackVelX, pushbackVelY, selfLockVelX, selfLockVelY, startupFrames; - return js.MakeWrapper(new battle.MeleeBullet.ptr(new battle.Bullet.ptr(originatedRenderFrameId, offenderJoinIndex, startupFrames, cancellableStFrame, cancellableEdFrame, activeFrames, hitStunFrames, blockStunFrames, pushbackVelX, pushbackVelY, damage, selfLockVelX, selfLockVelY, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY, blowUp, false))); + NewMeleeBulletJs = function(originatedRenderFrameId, offenderJoinIndex, startupFrames, cancellableStFrame, cancellableEdFrame, activeFrames, hitStunFrames, blockStunFrames, pushbackVelX, pushbackVelY, damage, selfLockVelX, selfLockVelY, framesSelfLockVel, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY, blowUp) { + var activeFrames, blockStunFrames, blowUp, cancellableEdFrame, cancellableStFrame, damage, framesSelfLockVel, hitStunFrames, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY, offenderJoinIndex, originatedRenderFrameId, pushbackVelX, pushbackVelY, selfLockVelX, selfLockVelY, startupFrames; + return js.MakeWrapper(new battle.MeleeBullet.ptr(new battle.Bullet.ptr(originatedRenderFrameId, offenderJoinIndex, startupFrames, cancellableStFrame, cancellableEdFrame, activeFrames, hitStunFrames, blockStunFrames, pushbackVelX, pushbackVelY, damage, selfLockVelX, selfLockVelY, framesSelfLockVel, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY, blowUp, false))); }; $pkg.NewMeleeBulletJs = NewMeleeBulletJs; NewRoomDownsyncFrameJs = function(id, playersArr, meleeBullets) { diff --git a/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist b/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist index a7ecf2c..155a5aa 100644 --- a/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist +++ b/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist @@ -15,7 +15,7 @@ spriteSourceSize {62,92} textureRect - {{1211,188},{62,92}} + {{1277,188},{62,92}} textureRotated @@ -30,9 +30,9 @@ spriteSourceSize {77,99} textureRect - {{603,325},{77,99}} + {{748,0},{77,99}} textureRotated - + Atk1_2.png @@ -45,7 +45,7 @@ spriteSourceSize {112,99} textureRect - {{407,227},{112,99}} + {{408,348},{112,99}} textureRotated @@ -60,7 +60,7 @@ spriteSourceSize {96,100} textureRect - {{727,101},{96,100}} + {{664,315},{96,100}} textureRotated @@ -75,7 +75,7 @@ spriteSourceSize {62,92} textureRect - {{1211,188},{62,92}} + {{1277,188},{62,92}} textureRotated @@ -90,7 +90,7 @@ spriteSourceSize {58,97} textureRect - {{770,402},{58,97}} + {{1023,194},{58,97}} textureRotated @@ -105,7 +105,7 @@ spriteSourceSize {60,90} textureRect - {{1324,435},{60,90}} + {{1393,141},{60,90}} textureRotated @@ -120,7 +120,7 @@ spriteSourceSize {84,96} textureRect - {{823,100},{84,96}} + {{1087,97},{84,96}} textureRotated @@ -135,7 +135,7 @@ spriteSourceSize {55,100} textureRect - {{776,0},{55,100}} + {{731,101},{55,100}} textureRotated @@ -150,9 +150,9 @@ spriteSourceSize {63,100} textureRect - {{407,339},{63,100}} + {{717,206},{63,100}} textureRotated - + Atk2_5.png @@ -165,7 +165,7 @@ spriteSourceSize {66,101} textureRect - {{710,0},{66,101}} + {{682,0},{66,101}} textureRotated @@ -180,7 +180,7 @@ spriteSourceSize {80,95} textureRect - {{907,96},{80,95}} + {{1126,0},{80,95}} textureRotated @@ -195,9 +195,9 @@ spriteSourceSize {116,109} textureRect - {{340,402},{116,109}} + {{315,119},{116,109}} textureRotated - + Atk2_8.png @@ -210,7 +210,7 @@ spriteSourceSize {102,96} textureRect - {{646,210},{102,96}} + {{621,213},{102,96}} textureRotated @@ -225,7 +225,7 @@ spriteSourceSize {75,102} textureRect - {{0,437},{75,102}} + {{139,421},{75,102}} textureRotated @@ -240,7 +240,7 @@ spriteSourceSize {66,109} textureRect - {{456,402},{66,109}} + {{469,110},{66,109}} textureRotated @@ -255,7 +255,7 @@ spriteSourceSize {66,113} textureRect - {{403,114},{66,113}} + {{355,235},{66,113}} textureRotated @@ -330,7 +330,7 @@ spriteSourceSize {78,131} textureRect - {{78,0},{78,131}} + {{137,290},{78,131}} textureRotated @@ -345,9 +345,9 @@ spriteSourceSize {59,139} textureRect - {{78,290},{59,139}} + {{0,437},{59,139}} textureRotated - + Atk3_8.png @@ -360,7 +360,7 @@ spriteSourceSize {59,139} textureRect - {{137,290},{59,139}} + {{78,290},{59,139}} textureRotated @@ -375,9 +375,9 @@ spriteSourceSize {62,97} textureRect - {{708,402},{62,97}} + {{507,434},{62,97}} textureRotated - + Atked1_1.png @@ -390,7 +390,7 @@ spriteSourceSize {73,95} textureRect - {{1001,190},{73,95}} + {{1171,95},{73,95}} textureRotated @@ -405,7 +405,7 @@ spriteSourceSize {90,89} textureRect - {{1260,93},{90,89}} + {{1324,0},{90,89}} textureRotated @@ -420,7 +420,7 @@ spriteSourceSize {95,80} textureRect - {{896,394},{95,80}} + {{1084,291},{95,80}} textureRotated @@ -435,7 +435,7 @@ spriteSourceSize {80,95} textureRect - {{976,0},{80,95}} + {{1010,388},{80,95}} textureRotated @@ -450,9 +450,9 @@ spriteSourceSize {83,92} textureRect - {{194,429},{83,92}} + {{1208,382},{83,92}} textureRotated - + BlownUp1_3.png @@ -465,9 +465,9 @@ spriteSourceSize {92,83} textureRect - {{102,429},{92,83}} + {{1224,284},{92,83}} textureRotated - + GetUp1_0.png @@ -480,7 +480,7 @@ spriteSourceSize {112,45} textureRect - {{508,0},{112,45}} + {{424,115},{112,45}} textureRotated @@ -495,7 +495,7 @@ spriteSourceSize {88,69} textureRect - {{1236,435},{88,69}} + {{604,427},{88,69}} textureRotated @@ -510,9 +510,9 @@ spriteSourceSize {91,90} textureRect - {{702,312},{91,90}} + {{1303,93},{91,90}} textureRotated - + GetUp1_3.png @@ -525,7 +525,7 @@ spriteSourceSize {120,93} textureRect - {{254,124},{120,93}} + {{222,123},{120,93}} textureRotated @@ -540,9 +540,9 @@ spriteSourceSize {100,112} textureRect - {{408,0},{100,112}} + {{241,396},{100,112}} textureRotated - + GetUp1_5.png @@ -555,7 +555,7 @@ spriteSourceSize {106,93} textureRect - {{553,0},{106,93}} + {{507,328},{106,93}} textureRotated @@ -570,7 +570,7 @@ spriteSourceSize {106,79} textureRect - {{567,219},{106,79}} + {{542,217},{106,79}} textureRotated @@ -585,9 +585,9 @@ spriteSourceSize {73,87} textureRect - {{1262,0},{73,87}} + {{1307,280},{73,87}} textureRotated - + GetUp1_8.png @@ -600,7 +600,7 @@ spriteSourceSize {67,90} textureRect - {{1341,368},{67,90}} + {{1413,74},{67,90}} textureRotated @@ -615,7 +615,7 @@ spriteSourceSize {58,97} textureRect - {{770,402},{58,97}} + {{1023,194},{58,97}} textureRotated @@ -630,7 +630,7 @@ spriteSourceSize {58,95} textureRect - {{1050,381},{58,95}} + {{1090,386},{58,95}} textureRotated @@ -645,7 +645,7 @@ spriteSourceSize {58,97} textureRect - {{742,201},{58,97}} + {{1029,97},{58,97}} textureRotated @@ -660,7 +660,7 @@ spriteSourceSize {60,94} textureRect - {{1146,284},{60,94}} + {{1148,386},{60,94}} textureRotated @@ -675,7 +675,7 @@ spriteSourceSize {58,97} textureRect - {{793,298},{58,97}} + {{1081,194},{58,97}} textureRotated @@ -690,7 +690,7 @@ spriteSourceSize {58,97} textureRect - {{800,201},{58,97}} + {{1068,0},{58,97}} textureRotated @@ -705,7 +705,7 @@ spriteSourceSize {60,95} textureRect - {{1065,95},{60,95}} + {{1206,0},{60,95}} textureRotated @@ -720,7 +720,7 @@ spriteSourceSize {60,94} textureRect - {{1151,189},{60,94}} + {{1164,288},{60,94}} textureRotated @@ -735,7 +735,7 @@ spriteSourceSize {59,93} textureRect - {{1203,0},{59,93}} + {{789,403},{59,93}} textureRotated @@ -750,7 +750,7 @@ spriteSourceSize {58,93} textureRect - {{1206,283},{58,93}} + {{1266,0},{58,93}} textureRotated @@ -765,7 +765,7 @@ spriteSourceSize {59,93} textureRect - {{1177,378},{59,93}} + {{1244,95},{59,93}} textureRotated @@ -780,7 +780,7 @@ spriteSourceSize {60,94} textureRect - {{1200,94},{60,94}} + {{1217,190},{60,94}} textureRotated @@ -795,9 +795,9 @@ spriteSourceSize {77,68} textureRect - {{1264,341},{77,68}} + {{1437,417},{77,68}} textureRotated - + InAirAtk1_1.png @@ -810,7 +810,7 @@ spriteSourceSize {118,76} textureRect - {{267,284},{118,76}} + {{215,278},{118,76}} textureRotated @@ -825,7 +825,7 @@ spriteSourceSize {104,65} textureRect - {{595,106},{104,65}} + {{617,0},{104,65}} textureRotated @@ -840,7 +840,7 @@ spriteSourceSize {80,66} textureRect - {{1349,0},{80,66}} + {{1380,285},{80,66}} textureRotated @@ -855,7 +855,7 @@ spriteSourceSize {102,67} textureRect - {{660,104},{102,67}} + {{664,104},{102,67}} textureRotated @@ -870,9 +870,9 @@ spriteSourceSize {79,66} textureRect - {{1349,66},{79,66}} + {{1339,201},{79,66}} textureRotated - + InAirAtk1_3.png @@ -885,7 +885,7 @@ spriteSourceSize {124,64} textureRect - {{156,0},{124,64}} + {{78,0},{124,64}} textureRotated @@ -900,7 +900,7 @@ spriteSourceSize {104,64} textureRect - {{646,0},{104,64}} + {{600,323},{104,64}} textureRotated @@ -915,9 +915,9 @@ spriteSourceSize {79,61} textureRect - {{1264,280},{79,61}} + {{1376,417},{79,61}} textureRotated - + InAirAtk1_6.png @@ -930,7 +930,7 @@ spriteSourceSize {124,64} textureRect - {{160,124},{124,64}} + {{142,0},{124,64}} textureRotated @@ -945,7 +945,7 @@ spriteSourceSize {106,67} textureRect - {{641,402},{106,67}} + {{597,107},{106,67}} textureRotated @@ -960,7 +960,7 @@ spriteSourceSize {79,66} textureRect - {{1349,132},{79,66}} + {{1380,351},{79,66}} textureRotated @@ -975,7 +975,7 @@ spriteSourceSize {118,64} textureRect - {{343,244},{118,64}} + {{291,243},{118,64}} textureRotated @@ -990,7 +990,7 @@ spriteSourceSize {71,119} textureRect - {{282,0},{71,119}} + {{242,0},{71,119}} textureRotated @@ -1005,7 +1005,7 @@ spriteSourceSize {71,119} textureRect - {{196,284},{71,119}} + {{313,0},{71,119}} textureRotated @@ -1020,7 +1020,7 @@ spriteSourceSize {55,114} textureRect - {{353,0},{55,114}} + {{353,361},{55,114}} textureRotated @@ -1035,7 +1035,7 @@ spriteSourceSize {62,124} textureRect - {{220,0},{62,124}} + {{160,124},{62,124}} textureRotated @@ -1050,9 +1050,9 @@ spriteSourceSize {74,90} textureRect - {{1273,183},{74,90}} + {{1413,0},{74,90}} textureRotated - + InAirIdle1_3.png @@ -1065,7 +1065,7 @@ spriteSourceSize {110,54} textureRect - {{286,402},{110,54}} + {{440,0},{110,54}} textureRotated @@ -1080,9 +1080,9 @@ spriteSourceSize {85,88} textureRect - {{1343,283},{85,88}} + {{1291,376},{85,88}} textureRotated - + InAirIdle1_5.png @@ -1095,7 +1095,7 @@ spriteSourceSize {64,112} textureRect - {{469,112},{64,112}} + {{421,235},{64,112}} textureRotated @@ -1110,7 +1110,7 @@ spriteSourceSize {62,107} textureRect - {{533,112},{62,107}} + {{555,0},{62,107}} textureRotated @@ -1125,9 +1125,9 @@ spriteSourceSize {85,84} textureRect - {{1347,198},{85,84}} + {{1405,201},{85,84}} textureRotated - + InAirIdle1_8.png @@ -1140,7 +1140,7 @@ spriteSourceSize {109,61} textureRect - {{506,224},{109,61}} + {{494,0},{109,61}} textureRotated @@ -1155,7 +1155,7 @@ spriteSourceSize {78,95} textureRect - {{916,292},{78,95}} + {{1139,193},{78,95}} textureRotated @@ -1170,7 +1170,7 @@ spriteSourceSize {115,56} textureRect - {{347,119},{115,56}} + {{384,0},{115,56}} textureRotated @@ -1185,7 +1185,7 @@ spriteSourceSize {109,57} textureRect - {{522,402},{109,57}} + {{485,219},{109,57}} textureRotated @@ -1200,7 +1200,7 @@ spriteSourceSize {108,62} textureRect - {{579,402},{108,62}} + {{535,109},{108,62}} textureRotated @@ -1215,9 +1215,9 @@ spriteSourceSize {123,36} textureRect - {{160,248},{123,36}} + {{206,0},{123,36}} textureRotated - + LayDown1_4.png @@ -1230,22 +1230,7 @@ spriteSourceSize {123,30} textureRect - {{224,124},{123,30}} - textureRotated - - - Walking_0.png - - aliases - - spriteOffset - {0,0} - spriteSize - {78,95} - spriteSourceSize - {78,95} - textureRect - {{923,191},{78,95}} + {{160,248},{123,30}} textureRotated @@ -1256,13 +1241,13 @@ spriteOffset {0,0} spriteSize - {75,96} + {81,97} spriteSourceSize - {75,96} + {81,97} textureRect - {{831,0},{75,96}} + {{692,415},{81,97}} textureRotated - + Walking_10.png @@ -1271,11 +1256,11 @@ spriteOffset {0,0} spriteSize - {65,96} + {81,97} spriteSourceSize - {65,96} + {81,97} textureRect - {{851,298},{65,96}} + {{760,306},{81,97}} textureRotated @@ -1286,11 +1271,11 @@ spriteOffset {0,0} spriteSize - {65,96} + {81,97} spriteSourceSize - {65,96} + {81,97} textureRect - {{858,196},{65,96}} + {{780,201},{81,97}} textureRotated @@ -1301,11 +1286,11 @@ spriteOffset {0,0} spriteSize - {74,95} + {81,97} spriteSourceSize - {74,95} + {81,97} textureRect - {{976,387},{74,95}} + {{786,99},{81,97}} textureRotated @@ -1316,11 +1301,11 @@ spriteOffset {0,0} spriteSize - {75,94} + {81,97} spriteSourceSize - {75,94} + {81,97} textureRect - {{1125,95},{75,94}} + {{825,0},{81,97}} textureRotated @@ -1331,11 +1316,11 @@ spriteOffset {0,0} spriteSize - {70,94} + {81,97} spriteSourceSize - {70,94} + {81,97} textureRect - {{1133,0},{70,94}} + {{841,298},{81,97}} textureRotated @@ -1346,11 +1331,26 @@ spriteOffset {0,0} spriteSize - {78,94} + {81,97} spriteSourceSize - {78,94} + {81,97} textureRect - {{1068,285},{78,94}} + {{848,395},{81,97}} + textureRotated + + + Walking_16.png + + aliases + + spriteOffset + {0,0} + spriteSize + {81,97} + spriteSourceSize + {81,97} + textureRect + {{861,196},{81,97}} textureRotated @@ -1361,13 +1361,13 @@ spriteOffset {0,0} spriteSize - {69,96} + {81,97} spriteSourceSize - {69,96} + {81,97} textureRect - {{507,333},{69,96}} + {{867,97},{81,97}} textureRotated - + Walking_3.png @@ -1376,11 +1376,11 @@ spriteOffset {0,0} spriteSize - {70,96} + {81,97} spriteSourceSize - {70,96} + {81,97} textureRect - {{906,0},{70,96}} + {{906,0},{81,97}} textureRotated @@ -1391,11 +1391,11 @@ spriteOffset {0,0} spriteSize - {78,95} + {81,97} spriteSourceSize - {78,95} + {81,97} textureRect - {{987,95},{78,95}} + {{922,293},{81,97}} textureRotated @@ -1406,11 +1406,11 @@ spriteOffset {0,0} spriteSize - {77,95} + {81,97} spriteSourceSize - {77,95} + {81,97} textureRect - {{1056,0},{77,95}} + {{942,194},{81,97}} textureRotated @@ -1421,11 +1421,11 @@ spriteOffset {0,0} spriteSize - {69,94} + {81,97} spriteSourceSize - {69,94} + {81,97} textureRect - {{1108,379},{69,94}} + {{948,97},{81,97}} textureRotated @@ -1436,11 +1436,11 @@ spriteOffset {0,0} spriteSize - {77,94} + {81,97} spriteSourceSize - {77,94} + {81,97} textureRect - {{1074,190},{77,94}} + {{987,0},{81,97}} textureRotated @@ -1451,11 +1451,11 @@ spriteOffset {0,0} spriteSize - {74,95} + {81,97} spriteSourceSize - {74,95} + {81,97} textureRect - {{994,286},{74,95}} + {{929,390},{81,97}} textureRotated @@ -1466,11 +1466,11 @@ spriteOffset {0,0} spriteSize - {68,96} + {81,97} spriteSourceSize - {68,96} + {81,97} textureRect - {{828,395},{68,96}} + {{1003,291},{81,97}} textureRotated @@ -1486,9 +1486,9 @@ realTextureFileName MonkGirl.png size - {1431,512} + {1505,496} smartupdate - $TexturePacker:SmartUpdate:b61c8127138360fc5127f38c3072d44e:e6a91336f913f21d08fc641d99741429:7b088363a1f16e4f4ff313aecc52227b$ + $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 index d76ba3e..e72a3d5 100644 --- a/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist.meta +++ b/frontend/assets/resources/animation/MonkGirl/MonkGirl.plist.meta @@ -3,8 +3,8 @@ "uuid": "725c90f9-56f8-48ea-9159-4d2949cd3ce0", "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "size": { - "width": 1431, - "height": 512 + "width": 1505, + "height": 496 }, "type": "Texture Packer", "subMetas": { @@ -17,7 +17,7 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 1211, + "trimX": 1277, "trimY": 188, "width": 62, "height": 92, @@ -36,11 +36,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 603, - "trimY": 325, + "trimX": 748, + "trimY": 0, "width": 77, "height": 99, "rawWidth": 77, @@ -61,8 +61,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 407, - "trimY": 227, + "trimX": 408, + "trimY": 348, "width": 112, "height": 99, "rawWidth": 112, @@ -83,8 +83,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 727, - "trimY": 101, + "trimX": 664, + "trimY": 315, "width": 96, "height": 100, "rawWidth": 96, @@ -105,7 +105,7 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 1211, + "trimX": 1277, "trimY": 188, "width": 62, "height": 92, @@ -127,8 +127,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 770, - "trimY": 402, + "trimX": 1023, + "trimY": 194, "width": 58, "height": 97, "rawWidth": 58, @@ -149,8 +149,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 1324, - "trimY": 435, + "trimX": 1393, + "trimY": 141, "width": 60, "height": 90, "rawWidth": 60, @@ -171,8 +171,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 823, - "trimY": 100, + "trimX": 1087, + "trimY": 97, "width": 84, "height": 96, "rawWidth": 84, @@ -193,8 +193,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 776, - "trimY": 0, + "trimX": 731, + "trimY": 101, "width": 55, "height": 100, "rawWidth": 55, @@ -212,11 +212,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 407, - "trimY": 339, + "trimX": 717, + "trimY": 206, "width": 63, "height": 100, "rawWidth": 63, @@ -237,7 +237,7 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 710, + "trimX": 682, "trimY": 0, "width": 66, "height": 101, @@ -259,8 +259,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 907, - "trimY": 96, + "trimX": 1126, + "trimY": 0, "width": 80, "height": 95, "rawWidth": 80, @@ -278,11 +278,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 340, - "trimY": 402, + "trimX": 315, + "trimY": 119, "width": 116, "height": 109, "rawWidth": 116, @@ -303,8 +303,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 646, - "trimY": 210, + "trimX": 621, + "trimY": 213, "width": 102, "height": 96, "rawWidth": 102, @@ -325,8 +325,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 0, - "trimY": 437, + "trimX": 139, + "trimY": 421, "width": 75, "height": 102, "rawWidth": 75, @@ -347,8 +347,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 456, - "trimY": 402, + "trimX": 469, + "trimY": 110, "width": 66, "height": 109, "rawWidth": 66, @@ -369,8 +369,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 403, - "trimY": 114, + "trimX": 355, + "trimY": 235, "width": 66, "height": 113, "rawWidth": 66, @@ -479,8 +479,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 78, - "trimY": 0, + "trimX": 137, + "trimY": 290, "width": 78, "height": 131, "rawWidth": 78, @@ -498,11 +498,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 78, - "trimY": 290, + "trimX": 0, + "trimY": 437, "width": 59, "height": 139, "rawWidth": 59, @@ -523,7 +523,7 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 137, + "trimX": 78, "trimY": 290, "width": 59, "height": 139, @@ -542,11 +542,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 708, - "trimY": 402, + "trimX": 507, + "trimY": 434, "width": 62, "height": 97, "rawWidth": 62, @@ -567,8 +567,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 1001, - "trimY": 190, + "trimX": 1171, + "trimY": 95, "width": 73, "height": 95, "rawWidth": 73, @@ -589,8 +589,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 1260, - "trimY": 93, + "trimX": 1324, + "trimY": 0, "width": 90, "height": 89, "rawWidth": 90, @@ -611,8 +611,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 896, - "trimY": 394, + "trimX": 1084, + "trimY": 291, "width": 95, "height": 80, "rawWidth": 95, @@ -633,8 +633,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 976, - "trimY": 0, + "trimX": 1010, + "trimY": 388, "width": 80, "height": 95, "rawWidth": 80, @@ -652,11 +652,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 194, - "trimY": 429, + "trimX": 1208, + "trimY": 382, "width": 83, "height": 92, "rawWidth": 83, @@ -674,11 +674,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 102, - "trimY": 429, + "trimX": 1224, + "trimY": 284, "width": 92, "height": 83, "rawWidth": 92, @@ -699,8 +699,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 508, - "trimY": 0, + "trimX": 424, + "trimY": 115, "width": 112, "height": 45, "rawWidth": 112, @@ -721,8 +721,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 1236, - "trimY": 435, + "trimX": 604, + "trimY": 427, "width": 88, "height": 69, "rawWidth": 88, @@ -740,11 +740,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 702, - "trimY": 312, + "trimX": 1303, + "trimY": 93, "width": 91, "height": 90, "rawWidth": 91, @@ -765,8 +765,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 254, - "trimY": 124, + "trimX": 222, + "trimY": 123, "width": 120, "height": 93, "rawWidth": 120, @@ -784,11 +784,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 408, - "trimY": 0, + "trimX": 241, + "trimY": 396, "width": 100, "height": 112, "rawWidth": 100, @@ -809,8 +809,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 553, - "trimY": 0, + "trimX": 507, + "trimY": 328, "width": 106, "height": 93, "rawWidth": 106, @@ -831,8 +831,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 567, - "trimY": 219, + "trimX": 542, + "trimY": 217, "width": 106, "height": 79, "rawWidth": 106, @@ -850,11 +850,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 1262, - "trimY": 0, + "trimX": 1307, + "trimY": 280, "width": 73, "height": 87, "rawWidth": 73, @@ -875,8 +875,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 1341, - "trimY": 368, + "trimX": 1413, + "trimY": 74, "width": 67, "height": 90, "rawWidth": 67, @@ -897,8 +897,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 770, - "trimY": 402, + "trimX": 1023, + "trimY": 194, "width": 58, "height": 97, "rawWidth": 58, @@ -919,8 +919,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 1050, - "trimY": 381, + "trimX": 1090, + "trimY": 386, "width": 58, "height": 95, "rawWidth": 58, @@ -941,8 +941,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 742, - "trimY": 201, + "trimX": 1029, + "trimY": 97, "width": 58, "height": 97, "rawWidth": 58, @@ -963,8 +963,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 1146, - "trimY": 284, + "trimX": 1148, + "trimY": 386, "width": 60, "height": 94, "rawWidth": 60, @@ -985,8 +985,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 793, - "trimY": 298, + "trimX": 1081, + "trimY": 194, "width": 58, "height": 97, "rawWidth": 58, @@ -1007,8 +1007,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 800, - "trimY": 201, + "trimX": 1068, + "trimY": 0, "width": 58, "height": 97, "rawWidth": 58, @@ -1029,8 +1029,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 1065, - "trimY": 95, + "trimX": 1206, + "trimY": 0, "width": 60, "height": 95, "rawWidth": 60, @@ -1051,8 +1051,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 1151, - "trimY": 189, + "trimX": 1164, + "trimY": 288, "width": 60, "height": 94, "rawWidth": 60, @@ -1073,8 +1073,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 1203, - "trimY": 0, + "trimX": 789, + "trimY": 403, "width": 59, "height": 93, "rawWidth": 59, @@ -1095,8 +1095,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 1206, - "trimY": 283, + "trimX": 1266, + "trimY": 0, "width": 58, "height": 93, "rawWidth": 58, @@ -1117,8 +1117,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 1177, - "trimY": 378, + "trimX": 1244, + "trimY": 95, "width": 59, "height": 93, "rawWidth": 59, @@ -1139,8 +1139,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 1200, - "trimY": 94, + "trimX": 1217, + "trimY": 190, "width": 60, "height": 94, "rawWidth": 60, @@ -1158,11 +1158,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 1264, - "trimY": 341, + "trimX": 1437, + "trimY": 417, "width": 77, "height": 68, "rawWidth": 77, @@ -1183,8 +1183,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 267, - "trimY": 284, + "trimX": 215, + "trimY": 278, "width": 118, "height": 76, "rawWidth": 118, @@ -1205,8 +1205,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 595, - "trimY": 106, + "trimX": 617, + "trimY": 0, "width": 104, "height": 65, "rawWidth": 104, @@ -1227,8 +1227,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 1349, - "trimY": 0, + "trimX": 1380, + "trimY": 285, "width": 80, "height": 66, "rawWidth": 80, @@ -1249,7 +1249,7 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 660, + "trimX": 664, "trimY": 104, "width": 102, "height": 67, @@ -1268,11 +1268,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 1349, - "trimY": 66, + "trimX": 1339, + "trimY": 201, "width": 79, "height": 66, "rawWidth": 79, @@ -1293,7 +1293,7 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 156, + "trimX": 78, "trimY": 0, "width": 124, "height": 64, @@ -1315,8 +1315,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 646, - "trimY": 0, + "trimX": 600, + "trimY": 323, "width": 104, "height": 64, "rawWidth": 104, @@ -1334,11 +1334,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 1264, - "trimY": 280, + "trimX": 1376, + "trimY": 417, "width": 79, "height": 61, "rawWidth": 79, @@ -1359,8 +1359,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 160, - "trimY": 124, + "trimX": 142, + "trimY": 0, "width": 124, "height": 64, "rawWidth": 124, @@ -1381,8 +1381,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 641, - "trimY": 402, + "trimX": 597, + "trimY": 107, "width": 106, "height": 67, "rawWidth": 106, @@ -1403,8 +1403,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 1349, - "trimY": 132, + "trimX": 1380, + "trimY": 351, "width": 79, "height": 66, "rawWidth": 79, @@ -1425,8 +1425,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 343, - "trimY": 244, + "trimX": 291, + "trimY": 243, "width": 118, "height": 64, "rawWidth": 118, @@ -1447,7 +1447,7 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 282, + "trimX": 242, "trimY": 0, "width": 71, "height": 119, @@ -1469,8 +1469,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 196, - "trimY": 284, + "trimX": 313, + "trimY": 0, "width": 71, "height": 119, "rawWidth": 71, @@ -1492,7 +1492,7 @@ "offsetX": 0, "offsetY": 0, "trimX": 353, - "trimY": 0, + "trimY": 361, "width": 55, "height": 114, "rawWidth": 55, @@ -1513,8 +1513,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 220, - "trimY": 0, + "trimX": 160, + "trimY": 124, "width": 62, "height": 124, "rawWidth": 62, @@ -1532,11 +1532,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 1273, - "trimY": 183, + "trimX": 1413, + "trimY": 0, "width": 74, "height": 90, "rawWidth": 74, @@ -1557,8 +1557,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 286, - "trimY": 402, + "trimX": 440, + "trimY": 0, "width": 110, "height": 54, "rawWidth": 110, @@ -1576,11 +1576,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 1343, - "trimY": 283, + "trimX": 1291, + "trimY": 376, "width": 85, "height": 88, "rawWidth": 85, @@ -1601,8 +1601,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 469, - "trimY": 112, + "trimX": 421, + "trimY": 235, "width": 64, "height": 112, "rawWidth": 64, @@ -1623,8 +1623,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 533, - "trimY": 112, + "trimX": 555, + "trimY": 0, "width": 62, "height": 107, "rawWidth": 62, @@ -1642,11 +1642,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 1347, - "trimY": 198, + "trimX": 1405, + "trimY": 201, "width": 85, "height": 84, "rawWidth": 85, @@ -1667,8 +1667,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 506, - "trimY": 224, + "trimX": 494, + "trimY": 0, "width": 109, "height": 61, "rawWidth": 109, @@ -1689,8 +1689,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 916, - "trimY": 292, + "trimX": 1139, + "trimY": 193, "width": 78, "height": 95, "rawWidth": 78, @@ -1711,8 +1711,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 347, - "trimY": 119, + "trimX": 384, + "trimY": 0, "width": 115, "height": 56, "rawWidth": 115, @@ -1733,8 +1733,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 522, - "trimY": 402, + "trimX": 485, + "trimY": 219, "width": 109, "height": 57, "rawWidth": 109, @@ -1755,8 +1755,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 579, - "trimY": 402, + "trimX": 535, + "trimY": 109, "width": 108, "height": 62, "rawWidth": 108, @@ -1774,11 +1774,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 160, - "trimY": 248, + "trimX": 206, + "trimY": 0, "width": 123, "height": 36, "rawWidth": 123, @@ -1796,11 +1796,11 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 224, - "trimY": 124, + "trimX": 160, + "trimY": 248, "width": 123, "height": 30, "rawWidth": 123, @@ -1812,43 +1812,21 @@ "spriteType": "normal", "subMetas": {} }, - "Walking_0.png": { - "ver": "1.0.4", - "uuid": "95e3dc3c-ee98-4ae8-899f-3d6539a649cb", - "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", - "trimType": "auto", - "trimThreshold": 1, - "rotated": false, - "offsetX": 0, - "offsetY": 0, - "trimX": 923, - "trimY": 191, - "width": 78, - "height": 95, - "rawWidth": 78, - "rawHeight": 95, - "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": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 831, - "trimY": 0, - "width": 75, - "height": 96, - "rawWidth": 75, - "rawHeight": 96, + "trimX": 692, + "trimY": 415, + "width": 81, + "height": 97, + "rawWidth": 81, + "rawHeight": 97, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -1865,12 +1843,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 851, - "trimY": 298, - "width": 65, - "height": 96, - "rawWidth": 65, - "rawHeight": 96, + "trimX": 760, + "trimY": 306, + "width": 81, + "height": 97, + "rawWidth": 81, + "rawHeight": 97, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -1887,12 +1865,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 858, - "trimY": 196, - "width": 65, - "height": 96, - "rawWidth": 65, - "rawHeight": 96, + "trimX": 780, + "trimY": 201, + "width": 81, + "height": 97, + "rawWidth": 81, + "rawHeight": 97, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -1909,12 +1887,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 976, - "trimY": 387, - "width": 74, - "height": 95, - "rawWidth": 74, - "rawHeight": 95, + "trimX": 786, + "trimY": 99, + "width": 81, + "height": 97, + "rawWidth": 81, + "rawHeight": 97, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -1931,12 +1909,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 1125, - "trimY": 95, - "width": 75, - "height": 94, - "rawWidth": 75, - "rawHeight": 94, + "trimX": 825, + "trimY": 0, + "width": 81, + "height": 97, + "rawWidth": 81, + "rawHeight": 97, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -1953,12 +1931,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 1133, - "trimY": 0, - "width": 70, - "height": 94, - "rawWidth": 70, - "rawHeight": 94, + "trimX": 841, + "trimY": 298, + "width": 81, + "height": 97, + "rawWidth": 81, + "rawHeight": 97, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -1975,12 +1953,34 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 1068, - "trimY": 285, - "width": 78, - "height": 94, - "rawWidth": 78, - "rawHeight": 94, + "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, @@ -1994,15 +1994,15 @@ "rawTextureUuid": "8d4cf214-f71c-4237-bdc1-ca0069909248", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 507, - "trimY": 333, - "width": 69, - "height": 96, - "rawWidth": 69, - "rawHeight": 96, + "trimX": 867, + "trimY": 97, + "width": 81, + "height": 97, + "rawWidth": 81, + "rawHeight": 97, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -2021,10 +2021,10 @@ "offsetY": 0, "trimX": 906, "trimY": 0, - "width": 70, - "height": 96, - "rawWidth": 70, - "rawHeight": 96, + "width": 81, + "height": 97, + "rawWidth": 81, + "rawHeight": 97, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -2041,12 +2041,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 987, - "trimY": 95, - "width": 78, - "height": 95, - "rawWidth": 78, - "rawHeight": 95, + "trimX": 922, + "trimY": 293, + "width": 81, + "height": 97, + "rawWidth": 81, + "rawHeight": 97, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -2063,12 +2063,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 1056, - "trimY": 0, - "width": 77, - "height": 95, - "rawWidth": 77, - "rawHeight": 95, + "trimX": 942, + "trimY": 194, + "width": 81, + "height": 97, + "rawWidth": 81, + "rawHeight": 97, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -2085,12 +2085,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 1108, - "trimY": 379, - "width": 69, - "height": 94, - "rawWidth": 69, - "rawHeight": 94, + "trimX": 948, + "trimY": 97, + "width": 81, + "height": 97, + "rawWidth": 81, + "rawHeight": 97, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -2107,12 +2107,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 1074, - "trimY": 190, - "width": 77, - "height": 94, - "rawWidth": 77, - "rawHeight": 94, + "trimX": 987, + "trimY": 0, + "width": 81, + "height": 97, + "rawWidth": 81, + "rawHeight": 97, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -2129,12 +2129,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 994, - "trimY": 286, - "width": 74, - "height": 95, - "rawWidth": 74, - "rawHeight": 95, + "trimX": 929, + "trimY": 390, + "width": 81, + "height": 97, + "rawWidth": 81, + "rawHeight": 97, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -2151,12 +2151,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 828, - "trimY": 395, - "width": 68, - "height": 96, - "rawWidth": 68, - "rawHeight": 96, + "trimX": 1003, + "trimY": 291, + "width": 81, + "height": 97, + "rawWidth": 81, + "rawHeight": 97, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, diff --git a/frontend/assets/resources/animation/MonkGirl/MonkGirl.png b/frontend/assets/resources/animation/MonkGirl/MonkGirl.png index 9c31fbdc9b8f11fdec03a24e0efc099f5441f01b..098428119055b9473306670b4049ee75b4334588 100644 GIT binary patch literal 97828 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

v)`byIyN_CT*<*G) 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 RQ`!Ik002ovPDHLkV1i(me+U2o literal 97644 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 $>udZ@KF@B$ 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 diff --git a/frontend/assets/resources/animation/MonkGirl/Walking.anim b/frontend/assets/resources/animation/MonkGirl/Walking.anim index 4b11534..6235387 100644 --- a/frontend/assets/resources/animation/MonkGirl/Walking.anim +++ b/frontend/assets/resources/animation/MonkGirl/Walking.anim @@ -3,9 +3,9 @@ "_name": "Walking", "_objFlags": 0, "_native": "", - "_duration": 0.26666666666666666, + "_duration": 0.6666666666666666, "sample": 60, - "speed": 0.25, + "speed": 1, "wrapMode": 2, "curveData": { "comps": { @@ -14,102 +14,116 @@ { "frame": 0, "value": { - "__uuid__": "275387d0-70fd-47f5-b82e-14165a14c45a" - } - }, - { - "frame": 0.016666666666666666, - "value": { - "__uuid__": "95e3dc3c-ee98-4ae8-899f-3d6539a649cb" - } - }, - { - "frame": 0.03333333333333333, - "value": { - "__uuid__": "7515ef50-3a14-4e58-8811-a0c890fc40f3" + "__uuid__": "60f04127-1580-4dda-828b-57d82e991398" } }, { "frame": 0.05, - "value": { - "__uuid__": "fa3d6703-1cfc-4f40-b61e-7ebf0fdac56a" - } - }, - { - "frame": 0.06666666666666667, "value": { "__uuid__": "37eea7f3-5a1d-4172-be38-9b492399ef44" } }, - { - "frame": 0.08333333333333333, - "value": { - "__uuid__": "0e2ad2ed-2b21-4e14-9607-5a341d9ed7e4" - } - }, { "frame": 0.1, "value": { - "__uuid__": "e1625aba-a6fc-4883-a696-2d9d56d3050d" - } - }, - { - "frame": 0.11666666666666667, - "value": { - "__uuid__": "86f805a2-a27c-4c96-8e11-acc448b0bdd0" - } - }, - { - "frame": 0.13333333333333333, - "value": { - "__uuid__": "63bcaa39-1cc5-461f-a175-0d7a0abd3510" + "__uuid__": "0e2ad2ed-2b21-4e14-9607-5a341d9ed7e4" } }, { "frame": 0.15, "value": { - "__uuid__": "691383d5-9199-4bd5-9803-403216331d7f" - } - }, - { - "frame": 0.16666666666666666, - "value": { - "__uuid__": "602818c2-1242-4a24-87ba-77f6accccbc3" - } - }, - { - "frame": 0.18333333333333332, - "value": { - "__uuid__": "650b8ccb-2a82-4972-bb5b-79a2cb4a3503" + "__uuid__": "e1625aba-a6fc-4883-a696-2d9d56d3050d" } }, { "frame": 0.2, "value": { - "__uuid__": "b264bcc2-71c7-45a6-8c94-be049bb0d163" - } - }, - { - "frame": 0.21666666666666667, - "value": { - "__uuid__": "a75af05e-3b54-45d8-b7ad-cbcf2b65b2a9" - } - }, - { - "frame": 0.23333333333333334, - "value": { - "__uuid__": "3e2e26f7-007a-4130-8d90-154dfcde96d3" + "__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": [] + "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/map/dungeon/map.tmx b/frontend/assets/resources/map/dungeon/map.tmx index 3639788..508e49e 100644 --- a/frontend/assets/resources/map/dungeon/map.tmx +++ b/frontend/assets/resources/map/dungeon/map.tmx @@ -9,10 +9,10 @@ - + - + diff --git a/frontend/assets/resources/pbfiles/room_downsync_frame.proto b/frontend/assets/resources/pbfiles/room_downsync_frame.proto index 7551b66..4c6c6e9 100644 --- a/frontend/assets/resources/pbfiles/room_downsync_frame.proto +++ b/frontend/assets/resources/pbfiles/room_downsync_frame.proto @@ -27,6 +27,8 @@ message PlayerDownsync { int32 framesInChState = 20; // number of frames elapsed in the current character state int32 activeSkillId = 21; int32 activeSkillHit = 22; + int32 framesInvinsible = 23; + int32 framesSelfLockVel = 24; string name = 997; string displayName = 998; @@ -103,13 +105,14 @@ message MeleeBullet { int32 selfLockVelX = 12; int32 selfLockVelY = 13; + int32 framesSelfLockVel = 14; - int32 hitboxOffsetX = 14; - int32 hitboxOffsetY = 15; - int32 hitboxSizeX = 16; - int32 hitboxSizeY = 17; + int32 hitboxOffsetX = 15; + int32 hitboxOffsetY = 16; + int32 hitboxSizeX = 17; + int32 hitboxSizeY = 18; - bool blowUp = 18; + bool blowUp = 19; } message BattleColliderInfo { diff --git a/frontend/assets/resources/prefabs/ControlledCharacter.prefab b/frontend/assets/resources/prefabs/ControlledCharacter.prefab index 5a5db55..80d2db2 100644 --- a/frontend/assets/resources/prefabs/ControlledCharacter.prefab +++ b/frontend/assets/resources/prefabs/ControlledCharacter.prefab @@ -552,7 +552,7 @@ "__id__": 11 }, "_children": [], - "_active": false, + "_active": true, "_components": [ { "__id__": 13 diff --git a/frontend/assets/scenes/offline_map.fire b/frontend/assets/scenes/offline_map.fire index 33d98c7..7059ef0 100644 --- a/frontend/assets/scenes/offline_map.fire +++ b/frontend/assets/scenes/offline_map.fire @@ -461,7 +461,7 @@ "array": [ 0, 0, - 209.83528025849938, + 216.50635094610968, 0, 0, 0, diff --git a/frontend/assets/scripts/Map.js b/frontend/assets/scripts/Map.js index 63a8d52..154e56f 100644 --- a/frontend/assets/scripts/Map.js +++ b/frontend/assets/scripts/Map.js @@ -329,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; @@ -418,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(); @@ -456,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); @@ -496,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, @@ -569,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.framesInChState, pbPlayer.activeSkillId, pbPlayer.activeSkillHit, pbPlayer.speed, pbPlayer.battleState, pbPlayer.characterState, pbPlayer.joinIndex, pbPlayer.hp, pbPlayer.maxHp, pbPlayer.colliderRadius, pbPlayer.inAir); + const jsPlayer = gopkgs.NewPlayerDownsyncJs(pbPlayer.id, pbPlayer.virtualGridX, pbPlayer.virtualGridY, pbPlayer.dirX, pbPlayer.dirY, pbPlayer.velX, pbPlayer.velY, pbPlayer.framesToRecover, pbPlayer.framesInChState, pbPlayer.activeSkillId, pbPlayer.activeSkillHit, pbPlayer.framesInvinsible, pbPlayer.framesSelfLockVel, 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.originatedRenderFrameId, pbBullet.offenderJoinIndex, pbBullet.startupFrames, pbBullet.cancellableStFrame, pbBullet.cancellableEdFrame, pbBullet.activeFrames, pbBullet.hitStunFrames, pbBullet.blockStunFrames, pbBullet.pushbackVelX, pbBullet.pushbackVelY, pbBullet.damage, pbBullet.selfLockVelX, pbBullet.selfLockVelY, pbBullet.hitboxOffsetX, pbBullet.hitboxOffsetY, pbBullet.hitboxSizeX, pbBullet.hitboxSizeY, pbBullet.blowUp); + const 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.framesSelfLockVel, pbBullet.hitboxOffsetX, pbBullet.hitboxOffsetY, pbBullet.hitboxSizeX, pbBullet.hitboxSizeY, pbBullet.blowUp); jsMeleeBulletsArr.push(jsBullet); } @@ -849,7 +858,7 @@ batchInputFrameIdRange=[${batch[0].inputFrameId}, ${batch[batch.length - 1].inpu let st = performance.now(); let prevSelfInput = null, currSelfInput = null; - const noDelayInputFrameId = gopkgs.ConvertToNoDelayInputFrameId(self.renderFrameId); + const noDelayInputFrameId = gopkgs.ConvertToNoDelayInputFrameId(self.renderFrameId); if (gopkgs.ShouldGenerateInputFrameUpsync(self.renderFrameId)) { [prevSelfInput, currSelfInput] = self.getOrPrefabInputFrameUpsync(noDelayInputFrameId); } @@ -1207,71 +1216,42 @@ actuallyUsedinputList:{${self.inputFrameDownsyncStr(actuallyUsedInputClone)}}`); rightPadding = 0.1, topPadding = 0.1, bottomPadding = 0.1; - if (self.showCriticalCoordinateLabels) { - let g = self.g; - g.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; - } else { - // barrier - g.strokeColor = cc.Color.WHITE; - } - 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); - } - g.lineTo(wpos[0], wpos[1]); - g.stroke(); - } + if (self.showCriticalCoordinateLabels && self.g2) { + let g2 = self.g2; + g2.clear(); for (let k in rdf.PlayersArr) { const player = rdf.PlayersArr[k]; if (1 == player.JoinIndex) { - g.strokeColor = cc.Color.BLUE; + g2.strokeColor = cc.Color.BLUE; } else { - g.strokeColor = cc.Color.RED; + g2.strokeColor = cc.Color.RED; } - 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]; + 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]; + 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 [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]]; + const pts = [[0, 0], [leftPadding + halfColliderWidth * 2 + rightPadding, 0], [leftPadding + halfColliderWidth * 2 + rightPadding, bottomPadding + halfColliderHeight * 2 + topPadding], [0, bottomPadding + halfColliderHeight * 2 + topPadding]]; - g.moveTo(cx, cy); + g2.moveTo(cx, cy); for (let j = 0; j < pts.length; j += 1) { - g.lineTo(pts[j][0] + cx, pts[j][1] + cy); + g2.lineTo(pts[j][0] + cx, pts[j][1] + cy); } - g.lineTo(cx, cy); - g.stroke(); + g2.lineTo(cx, cy); + g2.stroke(); } for (let k in rdf.MeleeBullets) { @@ -1281,11 +1261,11 @@ actuallyUsedinputList:{${self.inputFrameDownsyncStr(actuallyUsedInputClone)}}`); && meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames + meleeBullet.Bullet.ActiveFrames > rdf.Id ) { - const offender = rdf.PlayersArr[meleeBullet.Bullet.OffenderJoinIndex-1]; + const offender = rdf.PlayersArr[meleeBullet.Bullet.OffenderJoinIndex - 1]; if (1 == offender.JoinIndex) { - g.strokeColor = cc.Color.BLUE; + g2.strokeColor = cc.Color.BLUE; } else { - g.strokeColor = cc.Color.RED; + g2.strokeColor = cc.Color.RED; } let xfac = 1; // By now, straight Punch offset doesn't respect "y-axis" @@ -1295,14 +1275,14 @@ actuallyUsedinputList:{${self.inputFrameDownsyncStr(actuallyUsedInputClone)}}`); 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]]; + const pts = [[0, 0], [leftPadding + halfColliderWidth * 2 + rightPadding, 0], [leftPadding + halfColliderWidth * 2 + rightPadding, bottomPadding + halfColliderHeight * 2 + topPadding], [0, bottomPadding + halfColliderHeight * 2 + topPadding]]; - g.moveTo(bulletCx, bulletCy); + g2.moveTo(bulletCx, bulletCy); for (let j = 0; j < pts.length; j += 1) { - g.lineTo(pts[j][0] + bulletCx, pts[j][1] + bulletCy); + g2.lineTo(pts[j][0] + bulletCx, pts[j][1] + bulletCy); } - g.lineTo(bulletCx, bulletCy); - g.stroke(); + g2.lineTo(bulletCx, bulletCy); + g2.stroke(); } } } diff --git a/frontend/assets/scripts/OfflineMap.js b/frontend/assets/scripts/OfflineMap.js index ca75172..97e2a8a 100644 --- a/frontend/assets/scripts/OfflineMap.js +++ b/frontend/assets/scripts/OfflineMap.js @@ -13,7 +13,7 @@ cc.Class({ onLoad() { const self = this; window.mapIns = self; - self.showCriticalCoordinateLabels = false; + self.showCriticalCoordinateLabels = true; const mapNode = self.node; const canvasNode = mapNode.parent; @@ -83,42 +83,12 @@ 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); @@ -159,7 +129,7 @@ cc.Class({ inAir: true, }), ], - speciesIdList: [1, 0], + speciesIdList: [0, 1], }); self.selfPlayerInfo = { 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 3546a90..bacd9a9 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 @@ -1213,6 +1213,8 @@ $root.protos = (function() { * @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 {number|null} [framesSelfLockVel] PlayerDownsync framesSelfLockVel * @property {string|null} [name] PlayerDownsync name * @property {string|null} [displayName] PlayerDownsync displayName * @property {string|null} [avatar] PlayerDownsync avatar @@ -1409,6 +1411,22 @@ $root.protos = (function() { */ PlayerDownsync.prototype.activeSkillHit = 0; + /** + * PlayerDownsync framesInvinsible. + * @member {number} framesInvinsible + * @memberof protos.PlayerDownsync + * @instance + */ + PlayerDownsync.prototype.framesInvinsible = 0; + + /** + * PlayerDownsync framesSelfLockVel. + * @member {number} framesSelfLockVel + * @memberof protos.PlayerDownsync + * @instance + */ + PlayerDownsync.prototype.framesSelfLockVel = 0; + /** * PlayerDownsync name. * @member {string} name @@ -1501,6 +1519,10 @@ $root.protos = (function() { 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.framesSelfLockVel != null && Object.hasOwnProperty.call(message, "framesSelfLockVel")) + writer.uint32(/* id 24, wireType 0 =*/192).int32(message.framesSelfLockVel); if (message.name != null && Object.hasOwnProperty.call(message, "name")) writer.uint32(/* id 997, wireType 2 =*/7978).string(message.name); if (message.displayName != null && Object.hasOwnProperty.call(message, "displayName")) @@ -1629,6 +1651,14 @@ $root.protos = (function() { message.activeSkillHit = reader.int32(); break; } + case 23: { + message.framesInvinsible = reader.int32(); + break; + } + case 24: { + message.framesSelfLockVel = reader.int32(); + break; + } case 997: { message.name = reader.string(); break; @@ -1742,6 +1772,12 @@ $root.protos = (function() { 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.framesSelfLockVel != null && message.hasOwnProperty("framesSelfLockVel")) + if (!$util.isInteger(message.framesSelfLockVel)) + return "framesSelfLockVel: integer expected"; if (message.name != null && message.hasOwnProperty("name")) if (!$util.isString(message.name)) return "name: string expected"; @@ -1810,6 +1846,10 @@ $root.protos = (function() { 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.framesSelfLockVel != null) + message.framesSelfLockVel = object.framesSelfLockVel | 0; if (object.name != null) message.name = String(object.name); if (object.displayName != null) @@ -1855,6 +1895,8 @@ $root.protos = (function() { object.framesInChState = 0; object.activeSkillId = 0; object.activeSkillHit = 0; + object.framesInvinsible = 0; + object.framesSelfLockVel = 0; object.name = ""; object.displayName = ""; object.avatar = ""; @@ -1903,6 +1945,10 @@ $root.protos = (function() { 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.framesSelfLockVel != null && message.hasOwnProperty("framesSelfLockVel")) + object.framesSelfLockVel = message.framesSelfLockVel; if (message.name != null && message.hasOwnProperty("name")) object.name = message.name; if (message.displayName != null && message.hasOwnProperty("displayName")) @@ -4042,6 +4088,7 @@ $root.protos = (function() { * @property {number|null} [damage] MeleeBullet damage * @property {number|null} [selfLockVelX] MeleeBullet selfLockVelX * @property {number|null} [selfLockVelY] MeleeBullet selfLockVelY + * @property {number|null} [framesSelfLockVel] MeleeBullet framesSelfLockVel * @property {number|null} [hitboxOffsetX] MeleeBullet hitboxOffsetX * @property {number|null} [hitboxOffsetY] MeleeBullet hitboxOffsetY * @property {number|null} [hitboxSizeX] MeleeBullet hitboxSizeX @@ -4168,6 +4215,14 @@ $root.protos = (function() { */ MeleeBullet.prototype.selfLockVelY = 0; + /** + * MeleeBullet framesSelfLockVel. + * @member {number} framesSelfLockVel + * @memberof protos.MeleeBullet + * @instance + */ + MeleeBullet.prototype.framesSelfLockVel = 0; + /** * MeleeBullet hitboxOffsetX. * @member {number} hitboxOffsetX @@ -4258,16 +4313,18 @@ $root.protos = (function() { 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.framesSelfLockVel != null && Object.hasOwnProperty.call(message, "framesSelfLockVel")) + writer.uint32(/* id 14, wireType 0 =*/112).int32(message.framesSelfLockVel); if (message.hitboxOffsetX != null && Object.hasOwnProperty.call(message, "hitboxOffsetX")) - writer.uint32(/* id 14, wireType 0 =*/112).int32(message.hitboxOffsetX); + writer.uint32(/* id 15, wireType 0 =*/120).int32(message.hitboxOffsetX); if (message.hitboxOffsetY != null && Object.hasOwnProperty.call(message, "hitboxOffsetY")) - writer.uint32(/* id 15, wireType 0 =*/120).int32(message.hitboxOffsetY); + writer.uint32(/* id 16, wireType 0 =*/128).int32(message.hitboxOffsetY); if (message.hitboxSizeX != null && Object.hasOwnProperty.call(message, "hitboxSizeX")) - writer.uint32(/* id 16, wireType 0 =*/128).int32(message.hitboxSizeX); + writer.uint32(/* id 17, wireType 0 =*/136).int32(message.hitboxSizeX); if (message.hitboxSizeY != null && Object.hasOwnProperty.call(message, "hitboxSizeY")) - writer.uint32(/* id 17, wireType 0 =*/136).int32(message.hitboxSizeY); + writer.uint32(/* id 18, wireType 0 =*/144).int32(message.hitboxSizeY); if (message.blowUp != null && Object.hasOwnProperty.call(message, "blowUp")) - writer.uint32(/* id 18, wireType 0 =*/144).bool(message.blowUp); + writer.uint32(/* id 19, wireType 0 =*/152).bool(message.blowUp); return writer; }; @@ -4355,22 +4412,26 @@ $root.protos = (function() { break; } case 14: { - message.hitboxOffsetX = reader.int32(); + message.framesSelfLockVel = reader.int32(); break; } case 15: { - message.hitboxOffsetY = reader.int32(); + message.hitboxOffsetX = reader.int32(); break; } case 16: { - message.hitboxSizeX = reader.int32(); + message.hitboxOffsetY = reader.int32(); break; } case 17: { - message.hitboxSizeY = reader.int32(); + message.hitboxSizeX = reader.int32(); break; } case 18: { + message.hitboxSizeY = reader.int32(); + break; + } + case 19: { message.blowUp = reader.bool(); break; } @@ -4448,6 +4509,9 @@ $root.protos = (function() { if (message.selfLockVelY != null && message.hasOwnProperty("selfLockVelY")) if (!$util.isInteger(message.selfLockVelY)) return "selfLockVelY: integer expected"; + if (message.framesSelfLockVel != null && message.hasOwnProperty("framesSelfLockVel")) + if (!$util.isInteger(message.framesSelfLockVel)) + return "framesSelfLockVel: integer expected"; if (message.hitboxOffsetX != null && message.hasOwnProperty("hitboxOffsetX")) if (!$util.isInteger(message.hitboxOffsetX)) return "hitboxOffsetX: integer expected"; @@ -4504,6 +4568,8 @@ $root.protos = (function() { message.selfLockVelX = object.selfLockVelX | 0; if (object.selfLockVelY != null) message.selfLockVelY = object.selfLockVelY | 0; + if (object.framesSelfLockVel != null) + message.framesSelfLockVel = object.framesSelfLockVel | 0; if (object.hitboxOffsetX != null) message.hitboxOffsetX = object.hitboxOffsetX | 0; if (object.hitboxOffsetY != null) @@ -4544,6 +4610,7 @@ $root.protos = (function() { object.damage = 0; object.selfLockVelX = 0; object.selfLockVelY = 0; + object.framesSelfLockVel = 0; object.hitboxOffsetX = 0; object.hitboxOffsetY = 0; object.hitboxSizeX = 0; @@ -4576,6 +4643,8 @@ $root.protos = (function() { object.selfLockVelX = message.selfLockVelX; if (message.selfLockVelY != null && message.hasOwnProperty("selfLockVelY")) object.selfLockVelY = message.selfLockVelY; + if (message.framesSelfLockVel != null && message.hasOwnProperty("framesSelfLockVel")) + object.framesSelfLockVel = message.framesSelfLockVel; if (message.hitboxOffsetX != null && message.hasOwnProperty("hitboxOffsetX")) object.hitboxOffsetX = message.hitboxOffsetX; if (message.hitboxOffsetY != null && message.hasOwnProperty("hitboxOffsetY")) diff --git a/jsexport/battle/battle.go b/jsexport/battle/battle.go index 34e2ad0..95f82d9 100644 --- a/jsexport/battle/battle.go +++ b/jsexport/battle/battle.go @@ -32,6 +32,8 @@ const ( 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. @@ -86,7 +88,17 @@ var invinsibleSet = map[int32]bool{ ATK_CHARACTER_STATE_GET_UP1: true, } -var nonAttackingSet = map[int32]bool{} +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++ { @@ -426,31 +438,39 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer // 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, - Hp: currPlayerDownsync.Hp, - MaxHp: currPlayerDownsync.MaxHp, - FramesToRecover: currPlayerDownsync.FramesToRecover - 1, - FramesInChState: currPlayerDownsync.FramesInChState + 1, - ActiveSkillId: currPlayerDownsync.ActiveSkillId, - ActiveSkillHit: currPlayerDownsync.ActiveSkillHit, - ColliderRadius: currPlayerDownsync.ColliderRadius, + 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, + FramesSelfLockVel: currPlayerDownsync.FramesSelfLockVel - 1, + ColliderRadius: currPlayerDownsync.ColliderRadius, } if nextRenderFramePlayers[i].FramesToRecover < 0 { nextRenderFramePlayers[i].FramesToRecover = 0 } + if nextRenderFramePlayers[i].FramesInvinsible < 0 { + nextRenderFramePlayers[i].FramesInvinsible = 0 + } + if nextRenderFramePlayers[i].FramesSelfLockVel < 0 { + nextRenderFramePlayers[i].FramesSelfLockVel = 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? @@ -475,8 +495,6 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer thatPlayerInNextFrame.ActiveSkillId = int32(skillId) thatPlayerInNextFrame.ActiveSkillHit = 0 - // TODO: Respect non-zero "selfLockVel" - // Hardcoded to use only the first hit for now switch v := skillConfig.Hits[thatPlayerInNextFrame.ActiveSkillHit].(type) { case *MeleeBullet: @@ -485,12 +503,30 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer newBullet.OffenderJoinIndex = joinIndex nextRenderFrameMeleeBullets = append(nextRenderFrameMeleeBullets, &newBullet) thatPlayerInNextFrame.FramesToRecover = skillConfig.RecoveryFrames + + hasLockVel := false + if NO_LOCK_VEL != v.SelfLockVelX { + hasLockVel = true + xfac := int32(1) + if 0 > thatPlayerInNextFrame.DirX { + xfac = -xfac + } + thatPlayerInNextFrame.VelX = xfac * v.SelfLockVelX + thatPlayerInNextFrame.FramesSelfLockVel = v.FramesSelfLockVel + } + if NO_LOCK_VEL != v.SelfLockVelY { + hasLockVel = true + thatPlayerInNextFrame.VelY = v.SelfLockVelY + thatPlayerInNextFrame.FramesSelfLockVel = v.FramesSelfLockVel + } + if false == hasLockVel { + if false == currPlayerDownsync.InAir { + thatPlayerInNextFrame.VelX = 0 + } + } } thatPlayerInNextFrame.CharacterState = skillConfig.BoundChState - if false == currPlayerDownsync.InAir { - thatPlayerInNextFrame.VelX = 0 - } continue // Don't allow movement if skill is used } @@ -640,9 +676,9 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer thatPlayerInNextFrame.FramesToRecover = chConfig.GetUpFramesToRecover } } else if ATK_CHARACTER_STATE_GET_UP1 == thatPlayerInNextFrame.CharacterState { - if thatPlayerInNextFrame.FramesInChState == chConfig.GetUpFrames { - // [WARNING] Before reaching here, the player had 3 invinsible frames to either attack or jump, if it ever took any action then this condition wouldn't have been met, thus we hereby only transit it back to IDLE as it took no action + if 0 == thatPlayerInNextFrame.FramesToRecover { thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_IDLE1 + thatPlayerInNextFrame.FramesInvinsible = chConfig.GetUpInvinsibleFrames } } } @@ -671,6 +707,9 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer if _, existent := invinsibleSet[t.CharacterState]; existent { continue } + if 0 < t.FramesInvinsible { + continue + } overlapped, _, _, _ := CalcPushbacks(0, 0, bulletShape, defenderShape) if !overlapped { continue diff --git a/jsexport/battle/characterConfig.go b/jsexport/battle/characterConfig.go index 8e8feaa..d72c52b 100644 --- a/jsexport/battle/characterConfig.go +++ b/jsexport/battle/characterConfig.go @@ -12,8 +12,8 @@ type CharacterConfig struct { LayDownFrames int32 LayDownFramesToRecover int32 - GetUpFrames int32 - GetUpFramesToRecover int32 + GetUpInvinsibleFrames int32 + GetUpFramesToRecover int32 Speed int32 JumpingInitVelY int32 @@ -32,8 +32,8 @@ var Characters = map[int]*CharacterConfig{ LayDownFrames: int32(16), LayDownFramesToRecover: int32(16), - GetUpFrames: int32(33), - GetUpFramesToRecover: int32(30), // 3 invinsible frames for just-blown-up character to make a comeback + 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), @@ -75,8 +75,8 @@ var Characters = map[int]*CharacterConfig{ LayDownFrames: int32(16), LayDownFramesToRecover: int32(16), - GetUpFrames: int32(30), - GetUpFramesToRecover: int32(27), // 3 invinsible frames for just-blown-up character to make a comeback + 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), @@ -125,6 +125,8 @@ var skills = map[int]*Skill{ 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), @@ -156,6 +158,8 @@ var skills = map[int]*Skill{ 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), @@ -172,24 +176,26 @@ var skills = map[int]*Skill{ }, }, 3: &Skill{ - RecoveryFrames: int32(60), - RecoveryFramesOnBlock: int32(60), - RecoveryFramesOnHit: int32(60), + RecoveryFrames: int32(70), + RecoveryFramesOnBlock: int32(70), + RecoveryFramesOnHit: int32(70), ReleaseTriggerType: int32(1), BoundChState: ATK_CHARACTER_STATE_ATK3, Hits: []interface{}{ &MeleeBullet{ Bullet: Bullet{ StartupFrames: int32(15), - ActiveFrames: int32(40), + ActiveFrames: int32(30), HitStunFrames: MAX_INT32, BlockStunFrames: int32(9), Damage: int32(10), + SelfLockVelX: NO_LOCK_VEL, + 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), + HitboxOffsetX: int32(float64(32) * WORLD_TO_VIRTUAL_GRID_RATIO), HitboxOffsetY: int32(0), - HitboxSizeX: int32(float64(32) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxSizeX: int32(float64(48) * WORLD_TO_VIRTUAL_GRID_RATIO), HitboxSizeY: int32(float64(32) * WORLD_TO_VIRTUAL_GRID_RATIO), BlowUp: true, }, @@ -210,6 +216,8 @@ var skills = map[int]*Skill{ 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), @@ -241,6 +249,8 @@ var skills = map[int]*Skill{ 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), @@ -270,6 +280,8 @@ var skills = map[int]*Skill{ 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), @@ -295,6 +307,8 @@ var skills = map[int]*Skill{ 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), @@ -319,6 +333,8 @@ var skills = map[int]*Skill{ 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), diff --git a/jsexport/battle/room_downsync_frame.go b/jsexport/battle/room_downsync_frame.go index 110bf99..39465a3 100644 --- a/jsexport/battle/room_downsync_frame.go +++ b/jsexport/battle/room_downsync_frame.go @@ -36,6 +36,9 @@ type PlayerDownsync struct { ActiveSkillId int32 ActiveSkillHit int32 + + FramesInvinsible int32 + FramesSelfLockVel int32 } type InputFrameDecoded struct { @@ -70,8 +73,9 @@ type Bullet struct { PushbackVelY int32 Damage int32 - SelfLockVelX int32 - SelfLockVelY int32 + SelfLockVelX int32 + SelfLockVelY int32 + FramesSelfLockVel int32 HitboxOffsetX int32 HitboxOffsetY int32 diff --git a/jsexport/main.go b/jsexport/main.go index 275f902..2516d25 100644 --- a/jsexport/main.go +++ b/jsexport/main.go @@ -42,31 +42,32 @@ func NewBarrierJs(boundary *Polygon2D) *js.Object { }) } -func NewPlayerDownsyncJs(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, framesToRecover, framesInChState, activeSkillId, activeSkillHit, speed, battleState, characterState, joinIndex, hp, maxHp, colliderRadius int32, inAir bool) *js.Object { +func NewPlayerDownsyncJs(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, framesToRecover, framesInChState, activeSkillId, activeSkillHit, framesInvinsible, framesSelfLockVel, 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, - FramesInChState: framesInChState, - ActiveSkillId: activeSkillId, - ActiveSkillHit: activeSkillHit, - Speed: speed, - BattleState: battleState, - CharacterState: characterState, - JoinIndex: joinIndex, - Hp: hp, - MaxHp: maxHp, - ColliderRadius: colliderRadius, - 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(originatedRenderFrameId, offenderJoinIndex, startupFrames, cancellableStFrame, cancellableEdFrame, activeFrames, hitStunFrames, blockStunFrames, pushbackVelX, pushbackVelY, damage, selfLockVelX, selfLockVelY, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY int32, blowUp bool) *js.Object { +func NewMeleeBulletJs(originatedRenderFrameId, offenderJoinIndex, startupFrames, cancellableStFrame, cancellableEdFrame, activeFrames, hitStunFrames, blockStunFrames, pushbackVelX, pushbackVelY, damage, selfLockVelX, selfLockVelY, framesSelfLockVel, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY int32, blowUp bool) *js.Object { return js.MakeWrapper(&MeleeBullet{ Bullet: Bullet{ OriginatedRenderFrameId: originatedRenderFrameId, @@ -83,8 +84,9 @@ func NewMeleeBulletJs(originatedRenderFrameId, offenderJoinIndex, startupFrames, PushbackVelY: pushbackVelY, Damage: damage, - SelfLockVelX: selfLockVelX, - SelfLockVelY: selfLockVelY, + SelfLockVelX: selfLockVelX, + SelfLockVelY: selfLockVelY, + FramesSelfLockVel: framesSelfLockVel, HitboxOffsetX: hitboxOffsetX, HitboxOffsetY: hitboxOffsetY, From e2191f9d1305a6c82df24c423aa07ceec46f7b7d Mon Sep 17 00:00:00 2001 From: genxium Date: Thu, 5 Jan 2023 10:20:01 +0800 Subject: [PATCH 10/10] Misc fixes. --- battle_srv/models/pb_type_convert.go | 126 +- battle_srv/protos/room_downsync_frame.pb.go | 420 +- battle_srv/ws/serve.go | 4 +- frontend/assets/plugin_scripts/jsexport.js | 6332 +---------------- frontend/assets/resources/map/dungeon/map.tmx | 23 +- .../pbfiles/room_downsync_frame.proto | 12 +- frontend/assets/scenes/login.fire | 2 +- frontend/assets/scenes/offline_map.fire | 2 +- frontend/assets/scripts/Map.js | 12 +- frontend/assets/scripts/OfflineMap.js | 4 +- ...om_downsync_frame_proto_bundle.forcemsg.js | 64 +- jsexport/battle/battle.go | 93 +- jsexport/battle/characterConfig.go | 34 +- jsexport/battle/room_downsync_frame.go | 8 +- jsexport/main.go | 9 +- 15 files changed, 387 insertions(+), 6758 deletions(-) diff --git a/battle_srv/models/pb_type_convert.go b/battle_srv/models/pb_type_convert.go index 8049373..f005607 100644 --- a/battle_srv/models/pb_type_convert.go +++ b/battle_srv/models/pb_type_convert.go @@ -20,29 +20,28 @@ func toPbRoomDownsyncFrame(rdf *battle.RoomDownsyncFrame) *pb.RoomDownsyncFrame 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, - FramesToRecover: last.FramesToRecover, - FramesInChState: last.FramesInChState, - ActiveSkillId: last.ActiveSkillId, - ActiveSkillHit: last.ActiveSkillHit, + 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, - FramesSelfLockVel: last.FramesSelfLockVel, - 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, + 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 } @@ -65,7 +64,6 @@ func toPbRoomDownsyncFrame(rdf *battle.RoomDownsyncFrame) *pb.RoomDownsyncFrame SelfLockVelX: last.SelfLockVelX, SelfLockVelY: last.SelfLockVelY, - FramesSelfLockVel: last.FramesSelfLockVel, HitboxOffsetX: last.HitboxOffsetX, HitboxOffsetY: last.HitboxOffsetY, @@ -88,27 +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, - FramesToRecover: last.FramesToRecover, - FramesInChState: last.FramesInChState, - ActiveSkillId: last.ActiveSkillId, - ActiveSkillHit: last.ActiveSkillHit, + 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, - FramesSelfLockVel: last.FramesSelfLockVel, - Speed: last.Speed, - BattleState: last.BattleState, - CharacterState: last.CharacterState, - InAir: last.InAir, - JoinIndex: last.JoinIndex, - ColliderRadius: last.ColliderRadius, - Score: last.Score, - Removed: last.Removed, + 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 @@ -129,29 +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, - FramesToRecover: last.FramesToRecover, - FramesInChState: last.FramesInChState, - ActiveSkillId: last.ActiveSkillId, - ActiveSkillHit: last.ActiveSkillHit, + 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, - FramesSelfLockVel: last.FramesSelfLockVel, - 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, + 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/protos/room_downsync_frame.pb.go b/battle_srv/protos/room_downsync_frame.pb.go index 529846a..083e557 100644 --- a/battle_srv/protos/room_downsync_frame.pb.go +++ b/battle_srv/protos/room_downsync_frame.pb.go @@ -49,7 +49,6 @@ type PlayerDownsync struct { 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"` - FramesSelfLockVel int32 `protobuf:"varint,24,opt,name=framesSelfLockVel,proto3" json:"framesSelfLockVel,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"` @@ -248,13 +247,6 @@ func (x *PlayerDownsync) GetFramesInvinsible() int32 { return 0 } -func (x *PlayerDownsync) GetFramesSelfLockVel() int32 { - if x != nil { - return x.FramesSelfLockVel - } - return 0 -} - func (x *PlayerDownsync) GetName() string { if x != nil { return x.Name @@ -792,12 +784,11 @@ type MeleeBullet struct { 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"` - FramesSelfLockVel int32 `protobuf:"varint,14,opt,name=framesSelfLockVel,proto3" json:"framesSelfLockVel,omitempty"` - HitboxOffsetX int32 `protobuf:"varint,15,opt,name=hitboxOffsetX,proto3" json:"hitboxOffsetX,omitempty"` - HitboxOffsetY int32 `protobuf:"varint,16,opt,name=hitboxOffsetY,proto3" json:"hitboxOffsetY,omitempty"` - HitboxSizeX int32 `protobuf:"varint,17,opt,name=hitboxSizeX,proto3" json:"hitboxSizeX,omitempty"` - HitboxSizeY int32 `protobuf:"varint,18,opt,name=hitboxSizeY,proto3" json:"hitboxSizeY,omitempty"` - BlowUp bool `protobuf:"varint,19,opt,name=blowUp,proto3" json:"blowUp,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() { @@ -923,13 +914,6 @@ func (x *MeleeBullet) GetSelfLockVelY() int32 { return 0 } -func (x *MeleeBullet) GetFramesSelfLockVel() int32 { - if x != nil { - return x.FramesSelfLockVel - } - return 0 -} - func (x *MeleeBullet) GetHitboxOffsetX() int32 { if x != nil { return x.HitboxOffsetX @@ -1217,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, 0xc5, 0x06, 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, @@ -1261,205 +1245,199 @@ var file_room_downsync_frame_proto_rawDesc = []byte{ 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, 0x2c, 0x0a, 0x11, - 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x53, 0x65, 0x6c, 0x66, 0x4c, 0x6f, 0x63, 0x6b, 0x56, 0x65, - 0x6c, 0x18, 0x18, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x53, - 0x65, 0x6c, 0x66, 0x4c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x6c, 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, 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, 0xed, 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, 0x2c, 0x0a, 0x11, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x53, 0x65, 0x6c, 0x66, 0x4c, - 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x66, 0x72, - 0x61, 0x6d, 0x65, 0x73, 0x53, 0x65, 0x6c, 0x66, 0x4c, 0x6f, 0x63, 0x6b, 0x56, 0x65, 0x6c, 0x12, - 0x24, 0x0a, 0x0d, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x58, - 0x18, 0x0f, 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, 0x10, 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, 0x11, 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, 0x12, 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, 0x13, 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, 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, + 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, 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, 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 ( diff --git a/battle_srv/ws/serve.go b/battle_srv/ws/serve.go index f1db6d8..a98f52c 100644 --- a/battle_srv/ws/serve.go +++ b/battle_srv/ws/serve.go @@ -252,8 +252,8 @@ func Serve(c *gin.Context) { RollbackEstimatedDtMillis: pRoom.RollbackEstimatedDtMillis, RollbackEstimatedDtNanos: pRoom.RollbackEstimatedDtNanos, - SpaceOffsetX: pRoom.SpaceOffsetX, - SpaceOffsetY: pRoom.SpaceOffsetY, + SpaceOffsetX: pRoom.SpaceOffsetX, + SpaceOffsetY: pRoom.SpaceOffsetY, RenderCacheSize: pRoom.RenderCacheSize, CollisionMinStep: pRoom.CollisionMinStep, diff --git a/frontend/assets/plugin_scripts/jsexport.js b/frontend/assets/plugin_scripts/jsexport.js index 6962eff..8b7380f 100644 --- a/frontend/assets/plugin_scripts/jsexport.js +++ b/frontend/assets/plugin_scripts/jsexport.js @@ -2,6329 +2,15 @@ (function() { var $goVersion = "go1.18.6"; -Error.stackTraceLimit = Infinity; - -var $NaN = NaN; -var $global, $module; -if (typeof window !== "undefined") { /* web page */ - $global = window; -} else if (typeof self !== "undefined") { /* web worker */ - $global = self; -} else if (typeof global !== "undefined") { /* Node.js */ - $global = global; - $global.require = require; -} else { /* others (e.g. Nashorn) */ - $global = this; -} - -if ($global === undefined || $global.Array === undefined) { - throw new Error("no global object found"); -} -if (typeof module !== "undefined") { - $module = module; -} - -if (!$global.fs && $global.require) { - try { - var fs = $global.require('fs'); - if (typeof fs === "object" && fs !== null && Object.keys(fs).length !== 0) { - $global.fs = fs; - } - } catch(e) { /* Ignore if the module couldn't be loaded. */ } -} - -if (!$global.fs) { - var outputBuf = ""; - var decoder = new TextDecoder("utf-8"); - $global.fs = { - constants: { O_WRONLY: -1, O_RDWR: -1, O_CREAT: -1, O_TRUNC: -1, O_APPEND: -1, O_EXCL: -1 }, // unused - writeSync: function writeSync(fd, buf) { - outputBuf += decoder.decode(buf); - var nl = outputBuf.lastIndexOf("\n"); - if (nl != -1) { - console.log(outputBuf.substr(0, nl)); - outputBuf = outputBuf.substr(nl + 1); - } - return buf.length; - }, - write: function write(fd, buf, offset, length, position, callback) { - if (offset !== 0 || length !== buf.length || position !== null) { - callback(enosys()); - return; - } - var n = this.writeSync(fd, buf); - callback(null, n); - } - }; -} - -var $linknames = {} // Collection of functions referenced by a go:linkname directive. -var $packages = {}, $idCounter = 0; -var $keys = function(m) { return m ? Object.keys(m) : []; }; -var $flushConsole = function() {}; -var $throwRuntimeError; /* set by package "runtime" */ -var $throwNilPointerError = function() { $throwRuntimeError("invalid memory address or nil pointer dereference"); }; -var $call = function(fn, rcvr, args) { return fn.apply(rcvr, args); }; -var $makeFunc = function(fn) { return function() { return $externalize(fn(this, new ($sliceType($jsObjectPtr))($global.Array.prototype.slice.call(arguments, []))), $emptyInterface); }; }; -var $unused = function(v) {}; -var $print = console.log; -// Under Node we can emulate print() more closely by avoiding a newline. -if (($global.process !== undefined) && $global.require) { - try { - var util = $global.require('util'); - $print = function() { $global.process.stderr.write(util.format.apply(this, arguments)); }; - } catch (e) { - // Failed to require util module, keep using console.log(). - } -} -var $println = console.log - -var $initAllLinknames = function() { - var names = $keys($packages); - for (var i = 0; i < names.length; i++) { - var f = $packages[names[i]]["$initLinknames"]; - if (typeof f == 'function') { - f(); - } - } -} - -var $mapArray = function(array, f) { - var newArray = new array.constructor(array.length); - for (var i = 0; i < array.length; i++) { - newArray[i] = f(array[i]); - } - return newArray; -}; - -// Returns a method bound to the receiver instance, safe to invoke as a -// standalone function. Bound function is cached for later reuse. -var $methodVal = function(recv, name) { - var vals = recv.$methodVals || {}; - recv.$methodVals = vals; /* noop for primitives */ - var f = vals[name]; - if (f !== undefined) { - return f; - } - var method = recv[name]; - f = method.bind(recv); - vals[name] = f; - return f; -}; - -var $methodExpr = function(typ, name) { - var method = typ.prototype[name]; - if (method.$expr === undefined) { - method.$expr = function() { - $stackDepthOffset--; - try { - if (typ.wrapped) { - arguments[0] = new typ(arguments[0]); - } - return Function.call.apply(method, arguments); - } finally { - $stackDepthOffset++; - } - }; - } - return method.$expr; -}; - -var $ifaceMethodExprs = {}; -var $ifaceMethodExpr = function(name) { - var expr = $ifaceMethodExprs["$" + name]; - if (expr === undefined) { - expr = $ifaceMethodExprs["$" + name] = function() { - $stackDepthOffset--; - try { - return Function.call.apply(arguments[0][name], arguments); - } finally { - $stackDepthOffset++; - } - }; - } - return expr; -}; - -var $subslice = function(slice, low, high, max) { - if (high === undefined) { - high = slice.$length; - } - if (max === undefined) { - max = slice.$capacity; - } - if (low < 0 || high < low || max < high || high > slice.$capacity || max > slice.$capacity) { - $throwRuntimeError("slice bounds out of range"); - } - if (slice === slice.constructor.nil) { - return slice; - } - var s = new slice.constructor(slice.$array); - s.$offset = slice.$offset + low; - s.$length = high - low; - s.$capacity = max - low; - return s; -}; - -var $substring = function(str, low, high) { - if (low < 0 || high < low || high > str.length) { - $throwRuntimeError("slice bounds out of range"); - } - return str.substring(low, high); -}; - -// Convert Go slice to an equivalent JS array type. -var $sliceToNativeArray = function(slice) { - if (slice.$array.constructor !== Array) { - return slice.$array.subarray(slice.$offset, slice.$offset + slice.$length); - } - return slice.$array.slice(slice.$offset, slice.$offset + slice.$length); -}; - -// Convert Go slice to a pointer to an underlying Go array. -// -// Note that an array pointer can be represented by an "unwrapped" native array -// type, and it will be wrapped back into its Go type when necessary. -var $sliceToGoArray = function(slice, arrayPtrType) { - var arrayType = arrayPtrType.elem; - if (arrayType !== undefined && slice.$length < arrayType.len) { - $throwRuntimeError("cannot convert slice with length " + slice.$length + " to pointer to array with length " + arrayType.len); - } - if (slice == slice.constructor.nil) { - return arrayPtrType.nil; // Nil slice converts to nil array pointer. - } - if (slice.$array.constructor !== Array) { - return slice.$array.subarray(slice.$offset, slice.$offset + arrayType.len); - } - if (slice.$offset == 0 && slice.$length == slice.$capacity && slice.$length == arrayType.len) { - return slice.$array; - } - if (arrayType.len == 0) { - return new arrayType([]); - } - - // Array.slice (unlike TypedArray.subarray) returns a copy of an array range, - // which is not sharing memory with the original one, which violates the spec - // for slice to array conversion. This is incompatible with the Go spec, in - // particular that the assignments to the array elements would be visible in - // the slice. Prefer to fail explicitly instead of creating subtle bugs. - $throwRuntimeError("gopherjs: non-numeric slice to underlying array conversion is not supported for subslices"); -}; - -// Convert between compatible slice types (e.g. native and names). -var $convertSliceType = function(slice, desiredType) { - if (slice == slice.constructor.nil) { - return desiredType.nil; // Preserve nil value. - } - - return $subslice(new desiredType(slice.$array), slice.$offset, slice.$offset + slice.$length); -} - -var $decodeRune = function(str, pos) { - var c0 = str.charCodeAt(pos); - - if (c0 < 0x80) { - return [c0, 1]; - } - - if (c0 !== c0 || c0 < 0xC0) { - return [0xFFFD, 1]; - } - - var c1 = str.charCodeAt(pos + 1); - if (c1 !== c1 || c1 < 0x80 || 0xC0 <= c1) { - return [0xFFFD, 1]; - } - - if (c0 < 0xE0) { - var r = (c0 & 0x1F) << 6 | (c1 & 0x3F); - if (r <= 0x7F) { - return [0xFFFD, 1]; - } - return [r, 2]; - } - - var c2 = str.charCodeAt(pos + 2); - if (c2 !== c2 || c2 < 0x80 || 0xC0 <= c2) { - return [0xFFFD, 1]; - } - - if (c0 < 0xF0) { - var r = (c0 & 0x0F) << 12 | (c1 & 0x3F) << 6 | (c2 & 0x3F); - if (r <= 0x7FF) { - return [0xFFFD, 1]; - } - if (0xD800 <= r && r <= 0xDFFF) { - return [0xFFFD, 1]; - } - return [r, 3]; - } - - var c3 = str.charCodeAt(pos + 3); - if (c3 !== c3 || c3 < 0x80 || 0xC0 <= c3) { - return [0xFFFD, 1]; - } - - if (c0 < 0xF8) { - var r = (c0 & 0x07) << 18 | (c1 & 0x3F) << 12 | (c2 & 0x3F) << 6 | (c3 & 0x3F); - if (r <= 0xFFFF || 0x10FFFF < r) { - return [0xFFFD, 1]; - } - return [r, 4]; - } - - return [0xFFFD, 1]; -}; - -var $encodeRune = function(r) { - if (r < 0 || r > 0x10FFFF || (0xD800 <= r && r <= 0xDFFF)) { - r = 0xFFFD; - } - if (r <= 0x7F) { - return String.fromCharCode(r); - } - if (r <= 0x7FF) { - return String.fromCharCode(0xC0 | r >> 6, 0x80 | (r & 0x3F)); - } - if (r <= 0xFFFF) { - return String.fromCharCode(0xE0 | r >> 12, 0x80 | (r >> 6 & 0x3F), 0x80 | (r & 0x3F)); - } - return String.fromCharCode(0xF0 | r >> 18, 0x80 | (r >> 12 & 0x3F), 0x80 | (r >> 6 & 0x3F), 0x80 | (r & 0x3F)); -}; - -var $stringToBytes = function(str) { - var array = new Uint8Array(str.length); - for (var i = 0; i < str.length; i++) { - array[i] = str.charCodeAt(i); - } - return array; -}; - -var $bytesToString = function(slice) { - if (slice.$length === 0) { - return ""; - } - var str = ""; - for (var i = 0; i < slice.$length; i += 10000) { - str += String.fromCharCode.apply(undefined, slice.$array.subarray(slice.$offset + i, slice.$offset + Math.min(slice.$length, i + 10000))); - } - return str; -}; - -var $stringToRunes = function(str) { - var array = new Int32Array(str.length); - var rune, j = 0; - for (var i = 0; i < str.length; i += rune[1], j++) { - rune = $decodeRune(str, i); - array[j] = rune[0]; - } - return array.subarray(0, j); -}; - -var $runesToString = function(slice) { - if (slice.$length === 0) { - return ""; - } - var str = ""; - for (var i = 0; i < slice.$length; i++) { - str += $encodeRune(slice.$array[slice.$offset + i]); - } - return str; -}; - -var $copyString = function(dst, src) { - var n = Math.min(src.length, dst.$length); - for (var i = 0; i < n; i++) { - dst.$array[dst.$offset + i] = src.charCodeAt(i); - } - return n; -}; - -var $copySlice = function(dst, src) { - var n = Math.min(src.$length, dst.$length); - $copyArray(dst.$array, src.$array, dst.$offset, src.$offset, n, dst.constructor.elem); - return n; -}; - -var $copyArray = function(dst, src, dstOffset, srcOffset, n, elem) { - if (n === 0 || (dst === src && dstOffset === srcOffset)) { - return; - } - - if (src.subarray) { - dst.set(src.subarray(srcOffset, srcOffset + n), dstOffset); - return; - } - - switch (elem.kind) { - case $kindArray: - case $kindStruct: - if (dst === src && dstOffset > srcOffset) { - for (var i = n - 1; i >= 0; i--) { - elem.copy(dst[dstOffset + i], src[srcOffset + i]); - } - return; - } - for (var i = 0; i < n; i++) { - elem.copy(dst[dstOffset + i], src[srcOffset + i]); - } - return; - } - - if (dst === src && dstOffset > srcOffset) { - for (var i = n - 1; i >= 0; i--) { - dst[dstOffset + i] = src[srcOffset + i]; - } - return; - } - for (var i = 0; i < n; i++) { - dst[dstOffset + i] = src[srcOffset + i]; - } -}; - -var $clone = function(src, type) { - var clone = type.zero(); - type.copy(clone, src); - return clone; -}; - -var $pointerOfStructConversion = function(obj, type) { - if(obj.$proxies === undefined) { - obj.$proxies = {}; - obj.$proxies[obj.constructor.string] = obj; - } - var proxy = obj.$proxies[type.string]; - if (proxy === undefined) { - var properties = {}; - for (var i = 0; i < type.elem.fields.length; i++) { - (function(fieldProp) { - properties[fieldProp] = { - get: function() { return obj[fieldProp]; }, - set: function(value) { obj[fieldProp] = value; } - }; - })(type.elem.fields[i].prop); - } - proxy = Object.create(type.prototype, properties); - proxy.$val = proxy; - obj.$proxies[type.string] = proxy; - proxy.$proxies = obj.$proxies; - } - return proxy; -}; - -var $append = function(slice) { - return $internalAppend(slice, arguments, 1, arguments.length - 1); -}; - -var $appendSlice = function(slice, toAppend) { - if (toAppend.constructor === String) { - var bytes = $stringToBytes(toAppend); - return $internalAppend(slice, bytes, 0, bytes.length); - } - return $internalAppend(slice, toAppend.$array, toAppend.$offset, toAppend.$length); -}; - -var $internalAppend = function(slice, array, offset, length) { - if (length === 0) { - return slice; - } - - var newArray = slice.$array; - var newOffset = slice.$offset; - var newLength = slice.$length + length; - var newCapacity = slice.$capacity; - - if (newLength > newCapacity) { - newOffset = 0; - newCapacity = Math.max(newLength, slice.$capacity < 1024 ? slice.$capacity * 2 : Math.floor(slice.$capacity * 5 / 4)); - - if (slice.$array.constructor === Array) { - newArray = slice.$array.slice(slice.$offset, slice.$offset + slice.$length); - newArray.length = newCapacity; - var zero = slice.constructor.elem.zero; - for (var i = slice.$length; i < newCapacity; i++) { - newArray[i] = zero(); - } - } else { - newArray = new slice.$array.constructor(newCapacity); - newArray.set(slice.$array.subarray(slice.$offset, slice.$offset + slice.$length)); - } - } - - $copyArray(newArray, array, newOffset + slice.$length, offset, length, slice.constructor.elem); - - var newSlice = new slice.constructor(newArray); - newSlice.$offset = newOffset; - newSlice.$length = newLength; - newSlice.$capacity = newCapacity; - return newSlice; -}; - -var $equal = function(a, b, type) { - if (type === $jsObjectPtr) { - return a === b; - } - switch (type.kind) { - case $kindComplex64: - case $kindComplex128: - return a.$real === b.$real && a.$imag === b.$imag; - case $kindInt64: - case $kindUint64: - return a.$high === b.$high && a.$low === b.$low; - case $kindArray: - if (a.length !== b.length) { - return false; - } - for (var i = 0; i < a.length; i++) { - if (!$equal(a[i], b[i], type.elem)) { - return false; - } - } - return true; - case $kindStruct: - for (var i = 0; i < type.fields.length; i++) { - var f = type.fields[i]; - if (!$equal(a[f.prop], b[f.prop], f.typ)) { - return false; - } - } - return true; - case $kindInterface: - return $interfaceIsEqual(a, b); - default: - return a === b; - } -}; - -var $interfaceIsEqual = function(a, b) { - if (a === $ifaceNil || b === $ifaceNil) { - return a === b; - } - if (a.constructor !== b.constructor) { - return false; - } - if (a.constructor === $jsObjectPtr) { - return a.object === b.object; - } - if (!a.constructor.comparable) { - $throwRuntimeError("comparing uncomparable type " + a.constructor.string); - } - return $equal(a.$val, b.$val, a.constructor); -}; - -var $min = Math.min; -var $mod = function(x, y) { return x % y; }; -var $parseInt = parseInt; -var $parseFloat = function(f) { - if (f !== undefined && f !== null && f.constructor === Number) { - return f; - } - return parseFloat(f); -}; - -var $froundBuf = new Float32Array(1); -var $fround = Math.fround || function(f) { - $froundBuf[0] = f; - return $froundBuf[0]; -}; - -var $imul = Math.imul || function(a, b) { - var ah = (a >>> 16) & 0xffff; - var al = a & 0xffff; - var bh = (b >>> 16) & 0xffff; - var bl = b & 0xffff; - return ((al * bl) + (((ah * bl + al * bh) << 16) >>> 0) >> 0); -}; - -var $floatKey = function(f) { - if (f !== f) { - $idCounter++; - return "NaN$" + $idCounter; - } - return String(f); -}; - -var $flatten64 = function(x) { - return x.$high * 4294967296 + x.$low; -}; - -var $shiftLeft64 = function(x, y) { - if (y === 0) { - return x; - } - if (y < 32) { - return new x.constructor(x.$high << y | x.$low >>> (32 - y), (x.$low << y) >>> 0); - } - if (y < 64) { - return new x.constructor(x.$low << (y - 32), 0); - } - return new x.constructor(0, 0); -}; - -var $shiftRightInt64 = function(x, y) { - if (y === 0) { - return x; - } - if (y < 32) { - return new x.constructor(x.$high >> y, (x.$low >>> y | x.$high << (32 - y)) >>> 0); - } - if (y < 64) { - return new x.constructor(x.$high >> 31, (x.$high >> (y - 32)) >>> 0); - } - if (x.$high < 0) { - return new x.constructor(-1, 4294967295); - } - return new x.constructor(0, 0); -}; - -var $shiftRightUint64 = function(x, y) { - if (y === 0) { - return x; - } - if (y < 32) { - return new x.constructor(x.$high >>> y, (x.$low >>> y | x.$high << (32 - y)) >>> 0); - } - if (y < 64) { - return new x.constructor(0, x.$high >>> (y - 32)); - } - return new x.constructor(0, 0); -}; - -var $mul64 = function(x, y) { - var x48 = x.$high >>> 16; - var x32 = x.$high & 0xFFFF; - var x16 = x.$low >>> 16; - var x00 = x.$low & 0xFFFF; - - var y48 = y.$high >>> 16; - var y32 = y.$high & 0xFFFF; - var y16 = y.$low >>> 16; - var y00 = y.$low & 0xFFFF; - - var z48 = 0, z32 = 0, z16 = 0, z00 = 0; - z00 += x00 * y00; - z16 += z00 >>> 16; - z00 &= 0xFFFF; - z16 += x16 * y00; - z32 += z16 >>> 16; - z16 &= 0xFFFF; - z16 += x00 * y16; - z32 += z16 >>> 16; - z16 &= 0xFFFF; - z32 += x32 * y00; - z48 += z32 >>> 16; - z32 &= 0xFFFF; - z32 += x16 * y16; - z48 += z32 >>> 16; - z32 &= 0xFFFF; - z32 += x00 * y32; - z48 += z32 >>> 16; - z32 &= 0xFFFF; - z48 += x48 * y00 + x32 * y16 + x16 * y32 + x00 * y48; - z48 &= 0xFFFF; - - var hi = ((z48 << 16) | z32) >>> 0; - var lo = ((z16 << 16) | z00) >>> 0; - - var r = new x.constructor(hi, lo); - return r; -}; - -var $div64 = function(x, y, returnRemainder) { - if (y.$high === 0 && y.$low === 0) { - $throwRuntimeError("integer divide by zero"); - } - - var s = 1; - var rs = 1; - - var xHigh = x.$high; - var xLow = x.$low; - if (xHigh < 0) { - s = -1; - rs = -1; - xHigh = -xHigh; - if (xLow !== 0) { - xHigh--; - xLow = 4294967296 - xLow; - } - } - - var yHigh = y.$high; - var yLow = y.$low; - if (y.$high < 0) { - s *= -1; - yHigh = -yHigh; - if (yLow !== 0) { - yHigh--; - yLow = 4294967296 - yLow; - } - } - - var high = 0, low = 0, n = 0; - while (yHigh < 2147483648 && ((xHigh > yHigh) || (xHigh === yHigh && xLow > yLow))) { - yHigh = (yHigh << 1 | yLow >>> 31) >>> 0; - yLow = (yLow << 1) >>> 0; - n++; - } - for (var i = 0; i <= n; i++) { - high = high << 1 | low >>> 31; - low = (low << 1) >>> 0; - if ((xHigh > yHigh) || (xHigh === yHigh && xLow >= yLow)) { - xHigh = xHigh - yHigh; - xLow = xLow - yLow; - if (xLow < 0) { - xHigh--; - xLow += 4294967296; - } - low++; - if (low === 4294967296) { - high++; - low = 0; - } - } - yLow = (yLow >>> 1 | yHigh << (32 - 1)) >>> 0; - yHigh = yHigh >>> 1; - } - - if (returnRemainder) { - return new x.constructor(xHigh * rs, xLow * rs); - } - return new x.constructor(high * s, low * s); -}; - -var $divComplex = function(n, d) { - var ninf = n.$real === Infinity || n.$real === -Infinity || n.$imag === Infinity || n.$imag === -Infinity; - var dinf = d.$real === Infinity || d.$real === -Infinity || d.$imag === Infinity || d.$imag === -Infinity; - var nnan = !ninf && (n.$real !== n.$real || n.$imag !== n.$imag); - var dnan = !dinf && (d.$real !== d.$real || d.$imag !== d.$imag); - if(nnan || dnan) { - return new n.constructor(NaN, NaN); - } - if (ninf && !dinf) { - return new n.constructor(Infinity, Infinity); - } - if (!ninf && dinf) { - return new n.constructor(0, 0); - } - if (d.$real === 0 && d.$imag === 0) { - if (n.$real === 0 && n.$imag === 0) { - return new n.constructor(NaN, NaN); - } - return new n.constructor(Infinity, Infinity); - } - var a = Math.abs(d.$real); - var b = Math.abs(d.$imag); - if (a <= b) { - var ratio = d.$real / d.$imag; - var denom = d.$real * ratio + d.$imag; - return new n.constructor((n.$real * ratio + n.$imag) / denom, (n.$imag * ratio - n.$real) / denom); - } - var ratio = d.$imag / d.$real; - var denom = d.$imag * ratio + d.$real; - return new n.constructor((n.$imag * ratio + n.$real) / denom, (n.$imag - n.$real * ratio) / denom); -}; - -var $kindBool = 1; -var $kindInt = 2; -var $kindInt8 = 3; -var $kindInt16 = 4; -var $kindInt32 = 5; -var $kindInt64 = 6; -var $kindUint = 7; -var $kindUint8 = 8; -var $kindUint16 = 9; -var $kindUint32 = 10; -var $kindUint64 = 11; -var $kindUintptr = 12; -var $kindFloat32 = 13; -var $kindFloat64 = 14; -var $kindComplex64 = 15; -var $kindComplex128 = 16; -var $kindArray = 17; -var $kindChan = 18; -var $kindFunc = 19; -var $kindInterface = 20; -var $kindMap = 21; -var $kindPtr = 22; -var $kindSlice = 23; -var $kindString = 24; -var $kindStruct = 25; -var $kindUnsafePointer = 26; - -var $methodSynthesizers = []; -var $addMethodSynthesizer = function(f) { - if ($methodSynthesizers === null) { - f(); - return; - } - $methodSynthesizers.push(f); -}; -var $synthesizeMethods = function() { - $methodSynthesizers.forEach(function(f) { f(); }); - $methodSynthesizers = null; -}; - -var $ifaceKeyFor = function(x) { - if (x === $ifaceNil) { - return 'nil'; - } - var c = x.constructor; - return c.string + '$' + c.keyFor(x.$val); -}; - -var $identity = function(x) { return x; }; - -var $typeIDCounter = 0; - -var $idKey = function(x) { - if (x.$id === undefined) { - $idCounter++; - x.$id = $idCounter; - } - return String(x.$id); -}; - -// Creates constructor functions for array pointer types. Returns a new function -// instace each time to make sure each type is independent of the other. -var $arrayPtrCtor = function() { - return function(array) { - this.$get = function() { return array; }; - this.$set = function(v) { typ.copy(this, v); }; - this.$val = array; - } -} - -var $newType = function(size, kind, string, named, pkg, exported, constructor) { - var typ; - switch(kind) { - case $kindBool: - case $kindInt: - case $kindInt8: - case $kindInt16: - case $kindInt32: - case $kindUint: - case $kindUint8: - case $kindUint16: - case $kindUint32: - case $kindUintptr: - case $kindUnsafePointer: - typ = function(v) { this.$val = v; }; - typ.wrapped = true; - typ.keyFor = $identity; - break; - - case $kindString: - typ = function(v) { this.$val = v; }; - typ.wrapped = true; - typ.keyFor = function(x) { return "$" + x; }; - break; - - case $kindFloat32: - case $kindFloat64: - typ = function(v) { this.$val = v; }; - typ.wrapped = true; - typ.keyFor = function(x) { return $floatKey(x); }; - break; - - case $kindInt64: - typ = function(high, low) { - this.$high = (high + Math.floor(Math.ceil(low) / 4294967296)) >> 0; - this.$low = low >>> 0; - this.$val = this; - }; - typ.keyFor = function(x) { return x.$high + "$" + x.$low; }; - break; - - case $kindUint64: - typ = function(high, low) { - this.$high = (high + Math.floor(Math.ceil(low) / 4294967296)) >>> 0; - this.$low = low >>> 0; - this.$val = this; - }; - typ.keyFor = function(x) { return x.$high + "$" + x.$low; }; - break; - - case $kindComplex64: - typ = function(real, imag) { - this.$real = $fround(real); - this.$imag = $fround(imag); - this.$val = this; - }; - typ.keyFor = function(x) { return x.$real + "$" + x.$imag; }; - break; - - case $kindComplex128: - typ = function(real, imag) { - this.$real = real; - this.$imag = imag; - this.$val = this; - }; - typ.keyFor = function(x) { return x.$real + "$" + x.$imag; }; - break; - - case $kindArray: - typ = function(v) { this.$val = v; }; - typ.wrapped = true; - typ.ptr = $newType(4, $kindPtr, "*" + string, false, "", false, $arrayPtrCtor()); - typ.init = function(elem, len) { - typ.elem = elem; - typ.len = len; - typ.comparable = elem.comparable; - typ.keyFor = function(x) { - return Array.prototype.join.call($mapArray(x, function(e) { - return String(elem.keyFor(e)).replace(/\\/g, "\\\\").replace(/\$/g, "\\$"); - }), "$"); - }; - typ.copy = function(dst, src) { - $copyArray(dst, src, 0, 0, src.length, elem); - }; - typ.ptr.init(typ); - Object.defineProperty(typ.ptr.nil, "nilCheck", { get: $throwNilPointerError }); - }; - break; - - case $kindChan: - typ = function(v) { this.$val = v; }; - typ.wrapped = true; - typ.keyFor = $idKey; - typ.init = function(elem, sendOnly, recvOnly) { - typ.elem = elem; - typ.sendOnly = sendOnly; - typ.recvOnly = recvOnly; - }; - break; - - case $kindFunc: - typ = function(v) { this.$val = v; }; - typ.wrapped = true; - typ.init = function(params, results, variadic) { - typ.params = params; - typ.results = results; - typ.variadic = variadic; - typ.comparable = false; - }; - break; - - case $kindInterface: - typ = { implementedBy: {}, missingMethodFor: {} }; - typ.keyFor = $ifaceKeyFor; - typ.init = function(methods) { - typ.methods = methods; - methods.forEach(function(m) { - $ifaceNil[m.prop] = $throwNilPointerError; - }); - }; - break; - - case $kindMap: - typ = function(v) { this.$val = v; }; - typ.wrapped = true; - typ.init = function(key, elem) { - typ.key = key; - typ.elem = elem; - typ.comparable = false; - }; - break; - - case $kindPtr: - typ = constructor || function(getter, setter, target) { - this.$get = getter; - this.$set = setter; - this.$target = target; - this.$val = this; - }; - typ.keyFor = $idKey; - typ.init = function(elem) { - typ.elem = elem; - typ.wrapped = (elem.kind === $kindArray); - typ.nil = new typ($throwNilPointerError, $throwNilPointerError); - }; - break; - - case $kindSlice: - typ = function(array) { - if (array.constructor !== typ.nativeArray) { - array = new typ.nativeArray(array); - } - this.$array = array; - this.$offset = 0; - this.$length = array.length; - this.$capacity = array.length; - this.$val = this; - }; - typ.init = function(elem) { - typ.elem = elem; - typ.comparable = false; - typ.nativeArray = $nativeArray(elem.kind); - typ.nil = new typ([]); - }; - break; - - case $kindStruct: - typ = function(v) { this.$val = v; }; - typ.wrapped = true; - typ.ptr = $newType(4, $kindPtr, "*" + string, false, pkg, exported, constructor); - typ.ptr.elem = typ; - typ.ptr.prototype.$get = function() { return this; }; - typ.ptr.prototype.$set = function(v) { typ.copy(this, v); }; - typ.init = function(pkgPath, fields) { - typ.pkgPath = pkgPath; - typ.fields = fields; - fields.forEach(function(f) { - if (!f.typ.comparable) { - typ.comparable = false; - } - }); - typ.keyFor = function(x) { - var val = x.$val; - return $mapArray(fields, function(f) { - return String(f.typ.keyFor(val[f.prop])).replace(/\\/g, "\\\\").replace(/\$/g, "\\$"); - }).join("$"); - }; - typ.copy = function(dst, src) { - for (var i = 0; i < fields.length; i++) { - var f = fields[i]; - switch (f.typ.kind) { - case $kindArray: - case $kindStruct: - f.typ.copy(dst[f.prop], src[f.prop]); - continue; - default: - dst[f.prop] = src[f.prop]; - continue; - } - } - }; - /* nil value */ - var properties = {}; - fields.forEach(function(f) { - properties[f.prop] = { get: $throwNilPointerError, set: $throwNilPointerError }; - }); - typ.ptr.nil = Object.create(constructor.prototype, properties); - typ.ptr.nil.$val = typ.ptr.nil; - /* methods for embedded fields */ - $addMethodSynthesizer(function() { - var synthesizeMethod = function(target, m, f) { - if (target.prototype[m.prop] !== undefined) { return; } - target.prototype[m.prop] = function() { - var v = this.$val[f.prop]; - if (f.typ === $jsObjectPtr) { - v = new $jsObjectPtr(v); - } - if (v.$val === undefined) { - v = new f.typ(v); - } - return v[m.prop].apply(v, arguments); - }; - }; - fields.forEach(function(f) { - if (f.embedded) { - $methodSet(f.typ).forEach(function(m) { - synthesizeMethod(typ, m, f); - synthesizeMethod(typ.ptr, m, f); - }); - $methodSet($ptrType(f.typ)).forEach(function(m) { - synthesizeMethod(typ.ptr, m, f); - }); - } - }); - }); - }; - break; - - default: - $panic(new $String("invalid kind: " + kind)); - } - - switch (kind) { - case $kindBool: - case $kindMap: - typ.zero = function() { return false; }; - break; - - case $kindInt: - case $kindInt8: - case $kindInt16: - case $kindInt32: - case $kindUint: - case $kindUint8 : - case $kindUint16: - case $kindUint32: - case $kindUintptr: - case $kindUnsafePointer: - case $kindFloat32: - case $kindFloat64: - typ.zero = function() { return 0; }; - break; - - case $kindString: - typ.zero = function() { return ""; }; - break; - - case $kindInt64: - case $kindUint64: - case $kindComplex64: - case $kindComplex128: - var zero = new typ(0, 0); - typ.zero = function() { return zero; }; - break; - - case $kindPtr: - case $kindSlice: - typ.zero = function() { return typ.nil; }; - break; - - case $kindChan: - typ.zero = function() { return $chanNil; }; - break; - - case $kindFunc: - typ.zero = function() { return $throwNilPointerError; }; - break; - - case $kindInterface: - typ.zero = function() { return $ifaceNil; }; - break; - - case $kindArray: - typ.zero = function() { - var arrayClass = $nativeArray(typ.elem.kind); - if (arrayClass !== Array) { - return new arrayClass(typ.len); - } - var array = new Array(typ.len); - for (var i = 0; i < typ.len; i++) { - array[i] = typ.elem.zero(); - } - return array; - }; - break; - - case $kindStruct: - typ.zero = function() { return new typ.ptr(); }; - break; - - default: - $panic(new $String("invalid kind: " + kind)); - } - - typ.id = $typeIDCounter; - $typeIDCounter++; - typ.size = size; - typ.kind = kind; - typ.string = string; - typ.named = named; - typ.pkg = pkg; - typ.exported = exported; - typ.methods = []; - typ.methodSetCache = null; - typ.comparable = true; - return typ; -}; - -var $methodSet = function(typ) { - if (typ.methodSetCache !== null) { - return typ.methodSetCache; - } - var base = {}; - - var isPtr = (typ.kind === $kindPtr); - if (isPtr && typ.elem.kind === $kindInterface) { - typ.methodSetCache = []; - return []; - } - - var current = [{typ: isPtr ? typ.elem : typ, indirect: isPtr}]; - - var seen = {}; - - while (current.length > 0) { - var next = []; - var mset = []; - - current.forEach(function(e) { - if (seen[e.typ.string]) { - return; - } - seen[e.typ.string] = true; - - if (e.typ.named) { - mset = mset.concat(e.typ.methods); - if (e.indirect) { - mset = mset.concat($ptrType(e.typ).methods); - } - } - - switch (e.typ.kind) { - case $kindStruct: - e.typ.fields.forEach(function(f) { - if (f.embedded) { - var fTyp = f.typ; - var fIsPtr = (fTyp.kind === $kindPtr); - next.push({typ: fIsPtr ? fTyp.elem : fTyp, indirect: e.indirect || fIsPtr}); - } - }); - break; - - case $kindInterface: - mset = mset.concat(e.typ.methods); - break; - } - }); - - mset.forEach(function(m) { - if (base[m.name] === undefined) { - base[m.name] = m; - } - }); - - current = next; - } - - typ.methodSetCache = []; - Object.keys(base).sort().forEach(function(name) { - typ.methodSetCache.push(base[name]); - }); - return typ.methodSetCache; -}; - -var $Bool = $newType( 1, $kindBool, "bool", true, "", false, null); -var $Int = $newType( 4, $kindInt, "int", true, "", false, null); -var $Int8 = $newType( 1, $kindInt8, "int8", true, "", false, null); -var $Int16 = $newType( 2, $kindInt16, "int16", true, "", false, null); -var $Int32 = $newType( 4, $kindInt32, "int32", true, "", false, null); -var $Int64 = $newType( 8, $kindInt64, "int64", true, "", false, null); -var $Uint = $newType( 4, $kindUint, "uint", true, "", false, null); -var $Uint8 = $newType( 1, $kindUint8, "uint8", true, "", false, null); -var $Uint16 = $newType( 2, $kindUint16, "uint16", true, "", false, null); -var $Uint32 = $newType( 4, $kindUint32, "uint32", true, "", false, null); -var $Uint64 = $newType( 8, $kindUint64, "uint64", true, "", false, null); -var $Uintptr = $newType( 4, $kindUintptr, "uintptr", true, "", false, null); -var $Float32 = $newType( 4, $kindFloat32, "float32", true, "", false, null); -var $Float64 = $newType( 8, $kindFloat64, "float64", true, "", false, null); -var $Complex64 = $newType( 8, $kindComplex64, "complex64", true, "", false, null); -var $Complex128 = $newType(16, $kindComplex128, "complex128", true, "", false, null); -var $String = $newType( 8, $kindString, "string", true, "", false, null); -var $UnsafePointer = $newType( 4, $kindUnsafePointer, "unsafe.Pointer", true, "unsafe", false, null); - -var $nativeArray = function(elemKind) { - switch (elemKind) { - case $kindInt: - return Int32Array; - case $kindInt8: - return Int8Array; - case $kindInt16: - return Int16Array; - case $kindInt32: - return Int32Array; - case $kindUint: - return Uint32Array; - case $kindUint8: - return Uint8Array; - case $kindUint16: - return Uint16Array; - case $kindUint32: - return Uint32Array; - case $kindUintptr: - return Uint32Array; - case $kindFloat32: - return Float32Array; - case $kindFloat64: - return Float64Array; - default: - return Array; - } -}; -var $toNativeArray = function(elemKind, array) { - var nativeArray = $nativeArray(elemKind); - if (nativeArray === Array) { - return array; - } - return new nativeArray(array); -}; -var $arrayTypes = {}; -var $arrayType = function(elem, len) { - var typeKey = elem.id + "$" + len; - var typ = $arrayTypes[typeKey]; - if (typ === undefined) { - typ = $newType(12, $kindArray, "[" + len + "]" + elem.string, false, "", false, null); - $arrayTypes[typeKey] = typ; - typ.init(elem, len); - } - return typ; -}; - -var $chanType = function(elem, sendOnly, recvOnly) { - var string = (recvOnly ? "<-" : "") + "chan" + (sendOnly ? "<- " : " "); - if (!sendOnly && !recvOnly && (elem.string[0] == "<")) { - string += "(" + elem.string + ")"; - } else { - string += elem.string; - } - var field = sendOnly ? "SendChan" : (recvOnly ? "RecvChan" : "Chan"); - var typ = elem[field]; - if (typ === undefined) { - typ = $newType(4, $kindChan, string, false, "", false, null); - elem[field] = typ; - typ.init(elem, sendOnly, recvOnly); - } - return typ; -}; -var $Chan = function(elem, capacity) { - if (capacity < 0 || capacity > 2147483647) { - $throwRuntimeError("makechan: size out of range"); - } - this.$elem = elem; - this.$capacity = capacity; - this.$buffer = []; - this.$sendQueue = []; - this.$recvQueue = []; - this.$closed = false; -}; -var $chanNil = new $Chan(null, 0); -$chanNil.$sendQueue = $chanNil.$recvQueue = { length: 0, push: function() {}, shift: function() { return undefined; }, indexOf: function() { return -1; } }; - -var $funcTypes = {}; -var $funcType = function(params, results, variadic) { - var typeKey = $mapArray(params, function(p) { return p.id; }).join(",") + "$" + $mapArray(results, function(r) { return r.id; }).join(",") + "$" + variadic; - var typ = $funcTypes[typeKey]; - if (typ === undefined) { - var paramTypes = $mapArray(params, function(p) { return p.string; }); - if (variadic) { - paramTypes[paramTypes.length - 1] = "..." + paramTypes[paramTypes.length - 1].substr(2); - } - var string = "func(" + paramTypes.join(", ") + ")"; - if (results.length === 1) { - string += " " + results[0].string; - } else if (results.length > 1) { - string += " (" + $mapArray(results, function(r) { return r.string; }).join(", ") + ")"; - } - typ = $newType(4, $kindFunc, string, false, "", false, null); - $funcTypes[typeKey] = typ; - typ.init(params, results, variadic); - } - return typ; -}; - -var $interfaceTypes = {}; -var $interfaceType = function(methods) { - var typeKey = $mapArray(methods, function(m) { return m.pkg + "," + m.name + "," + m.typ.id; }).join("$"); - var typ = $interfaceTypes[typeKey]; - if (typ === undefined) { - var string = "interface {}"; - if (methods.length !== 0) { - string = "interface { " + $mapArray(methods, function(m) { - return (m.pkg !== "" ? m.pkg + "." : "") + m.name + m.typ.string.substr(4); - }).join("; ") + " }"; - } - typ = $newType(8, $kindInterface, string, false, "", false, null); - $interfaceTypes[typeKey] = typ; - typ.init(methods); - } - return typ; -}; -var $emptyInterface = $interfaceType([]); -var $ifaceNil = {}; -var $error = $newType(8, $kindInterface, "error", true, "", false, null); -$error.init([{prop: "Error", name: "Error", pkg: "", typ: $funcType([], [$String], false)}]); - -var $mapTypes = {}; -var $mapType = function(key, elem) { - var typeKey = key.id + "$" + elem.id; - var typ = $mapTypes[typeKey]; - if (typ === undefined) { - typ = $newType(4, $kindMap, "map[" + key.string + "]" + elem.string, false, "", false, null); - $mapTypes[typeKey] = typ; - typ.init(key, elem); - } - return typ; -}; -var $makeMap = function(keyForFunc, entries) { - var m = {}; - for (var i = 0; i < entries.length; i++) { - var e = entries[i]; - m[keyForFunc(e.k)] = e; - } - return m; -}; - -var $ptrType = function(elem) { - var typ = elem.ptr; - if (typ === undefined) { - typ = $newType(4, $kindPtr, "*" + elem.string, false, "", elem.exported, null); - elem.ptr = typ; - typ.init(elem); - } - return typ; -}; - -var $newDataPointer = function(data, constructor) { - if (constructor.elem.kind === $kindStruct) { - return data; - } - return new constructor(function() { return data; }, function(v) { data = v; }); -}; - -var $indexPtr = function(array, index, constructor) { - if (array.buffer) { - // Pointers to the same underlying ArrayBuffer share cache. - var cache = array.buffer.$ptr = array.buffer.$ptr || {}; - // Pointers of different primitive types are non-comparable and stored in different caches. - var typeCache = cache[array.name] = cache[array.name] || {}; - var cacheIdx = array.BYTES_PER_ELEMENT * index + array.byteOffset; - return typeCache[cacheIdx] || (typeCache[cacheIdx] = new constructor(function() { return array[index]; }, function(v) { array[index] = v; })); - } else { - array.$ptr = array.$ptr || {}; - return array.$ptr[index] || (array.$ptr[index] = new constructor(function() { return array[index]; }, function(v) { array[index] = v; })); - } -}; - -var $sliceType = function(elem) { - var typ = elem.slice; - if (typ === undefined) { - typ = $newType(12, $kindSlice, "[]" + elem.string, false, "", false, null); - elem.slice = typ; - typ.init(elem); - } - return typ; -}; -var $makeSlice = function(typ, length, capacity) { - capacity = capacity || length; - if (length < 0 || length > 2147483647) { - $throwRuntimeError("makeslice: len out of range"); - } - if (capacity < 0 || capacity < length || capacity > 2147483647) { - $throwRuntimeError("makeslice: cap out of range"); - } - var array = new typ.nativeArray(capacity); - if (typ.nativeArray === Array) { - for (var i = 0; i < capacity; i++) { - array[i] = typ.elem.zero(); - } - } - var slice = new typ(array); - slice.$length = length; - return slice; -}; - -var $structTypes = {}; -var $structType = function(pkgPath, fields) { - var typeKey = $mapArray(fields, function(f) { return f.name + "," + f.typ.id + "," + f.tag; }).join("$"); - var typ = $structTypes[typeKey]; - if (typ === undefined) { - var string = "struct { " + $mapArray(fields, function(f) { - var str = f.typ.string + (f.tag !== "" ? (" \"" + f.tag.replace(/\\/g, "\\\\").replace(/"/g, "\\\"") + "\"") : ""); - if (f.embedded) { - return str; - } - return f.name + " " + str; - }).join("; ") + " }"; - if (fields.length === 0) { - string = "struct {}"; - } - typ = $newType(0, $kindStruct, string, false, "", false, function() { - this.$val = this; - for (var i = 0; i < fields.length; i++) { - var f = fields[i]; - if (f.name == '_') { - continue; - } - var arg = arguments[i]; - this[f.prop] = arg !== undefined ? arg : f.typ.zero(); - } - }); - $structTypes[typeKey] = typ; - typ.init(pkgPath, fields); - } - return typ; -}; - -var $assertType = function(value, type, returnTuple) { - var isInterface = (type.kind === $kindInterface), ok, missingMethod = ""; - if (value === $ifaceNil) { - ok = false; - } else if (!isInterface) { - ok = value.constructor === type; - } else { - var valueTypeString = value.constructor.string; - ok = type.implementedBy[valueTypeString]; - if (ok === undefined) { - ok = true; - var valueMethodSet = $methodSet(value.constructor); - var interfaceMethods = type.methods; - for (var i = 0; i < interfaceMethods.length; i++) { - var tm = interfaceMethods[i]; - var found = false; - for (var j = 0; j < valueMethodSet.length; j++) { - var vm = valueMethodSet[j]; - if (vm.name === tm.name && vm.pkg === tm.pkg && vm.typ === tm.typ) { - found = true; - break; - } - } - if (!found) { - ok = false; - type.missingMethodFor[valueTypeString] = tm.name; - break; - } - } - type.implementedBy[valueTypeString] = ok; - } - if (!ok) { - missingMethod = type.missingMethodFor[valueTypeString]; - } - } - - if (!ok) { - if (returnTuple) { - return [type.zero(), false]; - } - $panic(new $packages["runtime"].TypeAssertionError.ptr( - $packages["runtime"]._type.ptr.nil, - (value === $ifaceNil ? $packages["runtime"]._type.ptr.nil : new $packages["runtime"]._type.ptr(value.constructor.string)), - new $packages["runtime"]._type.ptr(type.string), - missingMethod)); - } - - if (!isInterface) { - value = value.$val; - } - if (type === $jsObjectPtr) { - value = value.object; - } - return returnTuple ? [value, true] : value; -}; - -var $stackDepthOffset = 0; -var $getStackDepth = function() { - var err = new Error(); - if (err.stack === undefined) { - return undefined; - } - return $stackDepthOffset + err.stack.split("\n").length; -}; - -var $panicStackDepth = null, $panicValue; -var $callDeferred = function(deferred, jsErr, fromPanic) { - if (!fromPanic && deferred !== null && $curGoroutine.deferStack.indexOf(deferred) == -1) { - throw jsErr; - } - if (jsErr !== null) { - var newErr = null; - try { - $panic(new $jsErrorPtr(jsErr)); - } catch (err) { - newErr = err; - } - $callDeferred(deferred, newErr); - return; - } - if ($curGoroutine.asleep) { - return; - } - - $stackDepthOffset--; - var outerPanicStackDepth = $panicStackDepth; - var outerPanicValue = $panicValue; - - var localPanicValue = $curGoroutine.panicStack.pop(); - if (localPanicValue !== undefined) { - $panicStackDepth = $getStackDepth(); - $panicValue = localPanicValue; - } - - try { - while (true) { - if (deferred === null) { - deferred = $curGoroutine.deferStack[$curGoroutine.deferStack.length - 1]; - if (deferred === undefined) { - /* The panic reached the top of the stack. Clear it and throw it as a JavaScript error. */ - $panicStackDepth = null; - if (localPanicValue.Object instanceof Error) { - throw localPanicValue.Object; - } - var msg; - if (localPanicValue.constructor === $String) { - msg = localPanicValue.$val; - } else if (localPanicValue.Error !== undefined) { - msg = localPanicValue.Error(); - } else if (localPanicValue.String !== undefined) { - msg = localPanicValue.String(); - } else { - msg = localPanicValue; - } - throw new Error(msg); - } - } - var call = deferred.pop(); - if (call === undefined) { - $curGoroutine.deferStack.pop(); - if (localPanicValue !== undefined) { - deferred = null; - continue; - } - return; - } - var r = call[0].apply(call[2], call[1]); - if (r && r.$blk !== undefined) { - deferred.push([r.$blk, [], r]); - if (fromPanic) { - throw null; - } - return; - } - - if (localPanicValue !== undefined && $panicStackDepth === null) { - /* error was recovered */ - if (fromPanic) { - throw null; - } - return; - } - } - } catch(e) { - // Deferred function threw a JavaScript exception or tries to unwind stack - // to the point where a panic was handled. - if (fromPanic) { - // Re-throw the exception to reach deferral execution call at the end - // of the function. - throw e; - } - // We are at the end of the function, handle the error or re-throw to - // continue unwinding if necessary, or simply stop unwinding if we got far - // enough. - $callDeferred(deferred, e, fromPanic); - } finally { - if (localPanicValue !== undefined) { - if ($panicStackDepth !== null) { - $curGoroutine.panicStack.push(localPanicValue); - } - $panicStackDepth = outerPanicStackDepth; - $panicValue = outerPanicValue; - } - $stackDepthOffset++; - } -}; - -var $panic = function(value) { - $curGoroutine.panicStack.push(value); - $callDeferred(null, null, true); -}; -var $recover = function() { - if ($panicStackDepth === null || ($panicStackDepth !== undefined && $panicStackDepth !== $getStackDepth() - 2)) { - return $ifaceNil; - } - $panicStackDepth = null; - return $panicValue; -}; -var $throw = function(err) { throw err; }; - -var $noGoroutine = { asleep: false, exit: false, deferStack: [], panicStack: [] }; -var $curGoroutine = $noGoroutine, $totalGoroutines = 0, $awakeGoroutines = 0, $checkForDeadlock = true, $exportedFunctions = 0; -var $mainFinished = false; -var $go = function(fun, args) { - $totalGoroutines++; - $awakeGoroutines++; - var $goroutine = function() { - try { - $curGoroutine = $goroutine; - var r = fun.apply(undefined, args); - if (r && r.$blk !== undefined) { - fun = function() { return r.$blk(); }; - args = []; - return; - } - $goroutine.exit = true; - } catch (err) { - if (!$goroutine.exit) { - throw err; - } - } finally { - $curGoroutine = $noGoroutine; - if ($goroutine.exit) { /* also set by runtime.Goexit() */ - $totalGoroutines--; - $goroutine.asleep = true; - } - if ($goroutine.asleep) { - $awakeGoroutines--; - if (!$mainFinished && $awakeGoroutines === 0 && $checkForDeadlock && $exportedFunctions === 0) { - console.error("fatal error: all goroutines are asleep - deadlock!"); - if ($global.process !== undefined) { - $global.process.exit(2); - } - } - } - } - }; - $goroutine.asleep = false; - $goroutine.exit = false; - $goroutine.deferStack = []; - $goroutine.panicStack = []; - $schedule($goroutine); -}; - -var $scheduled = []; -var $runScheduled = function() { - // For nested setTimeout calls browsers enforce 4ms minimum delay. We minimize - // the effect of this penalty by queueing the timer preemptively before we run - // the goroutines, and later cancelling it if it turns out unneeded. See: - // https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#nested_timeouts - var nextRun = setTimeout($runScheduled); - try { - var start = Date.now(); - var r; - while ((r = $scheduled.shift()) !== undefined) { - r(); - // We need to interrupt this loop in order to allow the event loop to - // process timers, IO, etc. However, invoking scheduling through - // setTimeout is ~1000 times more expensive, so we amortize this cost by - // looping until the 4ms minimal delay has elapsed (assuming there are - // scheduled goroutines to run), and then yield to the event loop. - var elapsed = Date.now() - start; - if (elapsed > 4 || elapsed < 0) { break; } - } - } finally { - if ($scheduled.length == 0) { - // Cancel scheduling pass if there's nothing to run. - clearTimeout(nextRun); - } - } -}; - -var $schedule = function(goroutine) { - if (goroutine.asleep) { - goroutine.asleep = false; - $awakeGoroutines++; - } - $scheduled.push(goroutine); - if ($curGoroutine === $noGoroutine) { - $runScheduled(); - } -}; - -var $setTimeout = function(f, t) { - $awakeGoroutines++; - return setTimeout(function() { - $awakeGoroutines--; - f(); - }, t); -}; - -var $block = function() { - if ($curGoroutine === $noGoroutine) { - $throwRuntimeError("cannot block in JavaScript callback, fix by wrapping code in goroutine"); - } - $curGoroutine.asleep = true; -}; - -var $restore = function(context, params) { - if (context !== undefined && context.$blk !== undefined) { - return context; - } - return params; -} - -var $send = function(chan, value) { - if (chan.$closed) { - $throwRuntimeError("send on closed channel"); - } - var queuedRecv = chan.$recvQueue.shift(); - if (queuedRecv !== undefined) { - queuedRecv([value, true]); - return; - } - if (chan.$buffer.length < chan.$capacity) { - chan.$buffer.push(value); - return; - } - - var thisGoroutine = $curGoroutine; - var closedDuringSend; - chan.$sendQueue.push(function(closed) { - closedDuringSend = closed; - $schedule(thisGoroutine); - return value; - }); - $block(); - return { - $blk: function() { - if (closedDuringSend) { - $throwRuntimeError("send on closed channel"); - } - } - }; -}; -var $recv = function(chan) { - var queuedSend = chan.$sendQueue.shift(); - if (queuedSend !== undefined) { - chan.$buffer.push(queuedSend(false)); - } - var bufferedValue = chan.$buffer.shift(); - if (bufferedValue !== undefined) { - return [bufferedValue, true]; - } - if (chan.$closed) { - return [chan.$elem.zero(), false]; - } - - var thisGoroutine = $curGoroutine; - var f = { $blk: function() { return this.value; } }; - var queueEntry = function(v) { - f.value = v; - $schedule(thisGoroutine); - }; - chan.$recvQueue.push(queueEntry); - $block(); - return f; -}; -var $close = function(chan) { - if (chan.$closed) { - $throwRuntimeError("close of closed channel"); - } - chan.$closed = true; - while (true) { - var queuedSend = chan.$sendQueue.shift(); - if (queuedSend === undefined) { - break; - } - queuedSend(true); /* will panic */ - } - while (true) { - var queuedRecv = chan.$recvQueue.shift(); - if (queuedRecv === undefined) { - break; - } - queuedRecv([chan.$elem.zero(), false]); - } -}; -var $select = function(comms) { - var ready = []; - var selection = -1; - for (var i = 0; i < comms.length; i++) { - var comm = comms[i]; - var chan = comm[0]; - switch (comm.length) { - case 0: /* default */ - selection = i; - break; - case 1: /* recv */ - if (chan.$sendQueue.length !== 0 || chan.$buffer.length !== 0 || chan.$closed) { - ready.push(i); - } - break; - case 2: /* send */ - if (chan.$closed) { - $throwRuntimeError("send on closed channel"); - } - if (chan.$recvQueue.length !== 0 || chan.$buffer.length < chan.$capacity) { - ready.push(i); - } - break; - } - } - - if (ready.length !== 0) { - selection = ready[Math.floor(Math.random() * ready.length)]; - } - if (selection !== -1) { - var comm = comms[selection]; - switch (comm.length) { - case 0: /* default */ - return [selection]; - case 1: /* recv */ - return [selection, $recv(comm[0])]; - case 2: /* send */ - $send(comm[0], comm[1]); - return [selection]; - } - } - - var entries = []; - var thisGoroutine = $curGoroutine; - var f = { $blk: function() { return this.selection; } }; - var removeFromQueues = function() { - for (var i = 0; i < entries.length; i++) { - var entry = entries[i]; - var queue = entry[0]; - var index = queue.indexOf(entry[1]); - if (index !== -1) { - queue.splice(index, 1); - } - } - }; - for (var i = 0; i < comms.length; i++) { - (function(i) { - var comm = comms[i]; - switch (comm.length) { - case 1: /* recv */ - var queueEntry = function(value) { - f.selection = [i, value]; - removeFromQueues(); - $schedule(thisGoroutine); - }; - entries.push([comm[0].$recvQueue, queueEntry]); - comm[0].$recvQueue.push(queueEntry); - break; - case 2: /* send */ - var queueEntry = function() { - if (comm[0].$closed) { - $throwRuntimeError("send on closed channel"); - } - f.selection = [i]; - removeFromQueues(); - $schedule(thisGoroutine); - return comm[1]; - }; - entries.push([comm[0].$sendQueue, queueEntry]); - comm[0].$sendQueue.push(queueEntry); - break; - } - })(i); - } - $block(); - return f; -}; - -var $jsObjectPtr, $jsErrorPtr; - -var $needsExternalization = function(t) { - switch (t.kind) { - case $kindBool: - case $kindInt: - case $kindInt8: - case $kindInt16: - case $kindInt32: - case $kindUint: - case $kindUint8: - case $kindUint16: - case $kindUint32: - case $kindUintptr: - case $kindFloat32: - case $kindFloat64: - return false; - default: - return t !== $jsObjectPtr; - } -}; - -var $externalize = function(v, t, makeWrapper) { - if (t === $jsObjectPtr) { - return v; - } - switch (t.kind) { - case $kindBool: - case $kindInt: - case $kindInt8: - case $kindInt16: - case $kindInt32: - case $kindUint: - case $kindUint8: - case $kindUint16: - case $kindUint32: - case $kindUintptr: - case $kindFloat32: - case $kindFloat64: - return v; - case $kindInt64: - case $kindUint64: - return $flatten64(v); - case $kindArray: - if ($needsExternalization(t.elem)) { - return $mapArray(v, function(e) { return $externalize(e, t.elem, makeWrapper); }); - } - return v; - case $kindFunc: - return $externalizeFunction(v, t, false, makeWrapper); - case $kindInterface: - if (v === $ifaceNil) { - return null; - } - if (v.constructor === $jsObjectPtr) { - return v.$val.object; - } - return $externalize(v.$val, v.constructor, makeWrapper); - case $kindMap: - var m = {}; - var keys = $keys(v); - for (var i = 0; i < keys.length; i++) { - var entry = v[keys[i]]; - m[$externalize(entry.k, t.key, makeWrapper)] = $externalize(entry.v, t.elem, makeWrapper); - } - return m; - case $kindPtr: - if (v === t.nil) { - return null; - } - return $externalize(v.$get(), t.elem, makeWrapper); - case $kindSlice: - if ($needsExternalization(t.elem)) { - return $mapArray($sliceToNativeArray(v), function(e) { return $externalize(e, t.elem, makeWrapper); }); - } - return $sliceToNativeArray(v); - case $kindString: - if ($isASCII(v)) { - return v; - } - var s = "", r; - for (var i = 0; i < v.length; i += r[1]) { - r = $decodeRune(v, i); - var c = r[0]; - if (c > 0xFFFF) { - var h = Math.floor((c - 0x10000) / 0x400) + 0xD800; - var l = (c - 0x10000) % 0x400 + 0xDC00; - s += String.fromCharCode(h, l); - continue; - } - s += String.fromCharCode(c); - } - return s; - case $kindStruct: - var timePkg = $packages["time"]; - if (timePkg !== undefined && v.constructor === timePkg.Time.ptr) { - var milli = $div64(v.UnixNano(), new $Int64(0, 1000000)); - return new Date($flatten64(milli)); - } - - var noJsObject = {}; - var searchJsObject = function(v, t) { - if (t === $jsObjectPtr) { - return v; - } - switch (t.kind) { - case $kindPtr: - if (v === t.nil) { - return noJsObject; - } - return searchJsObject(v.$get(), t.elem); - case $kindStruct: - var f = t.fields[0]; - return searchJsObject(v[f.prop], f.typ); - case $kindInterface: - return searchJsObject(v.$val, v.constructor); - default: - return noJsObject; - } - }; - var o = searchJsObject(v, t); - if (o !== noJsObject) { - return o; - } - - if (makeWrapper !== undefined) { - return makeWrapper(v); - } - - o = {}; - for (var i = 0; i < t.fields.length; i++) { - var f = t.fields[i]; - if (!f.exported) { - continue; - } - o[f.name] = $externalize(v[f.prop], f.typ, makeWrapper); - } - return o; - } - $throwRuntimeError("cannot externalize " + t.string); -}; - -var $externalizeFunction = function(v, t, passThis, makeWrapper) { - if (v === $throwNilPointerError) { - return null; - } - if (v.$externalizeWrapper === undefined) { - $checkForDeadlock = false; - v.$externalizeWrapper = function() { - var args = []; - for (var i = 0; i < t.params.length; i++) { - if (t.variadic && i === t.params.length - 1) { - var vt = t.params[i].elem, varargs = []; - for (var j = i; j < arguments.length; j++) { - varargs.push($internalize(arguments[j], vt, makeWrapper)); - } - args.push(new (t.params[i])(varargs)); - break; - } - args.push($internalize(arguments[i], t.params[i], makeWrapper)); - } - var result = v.apply(passThis ? this : undefined, args); - switch (t.results.length) { - case 0: - return; - case 1: - return $externalize($copyIfRequired(result, t.results[0]), t.results[0], makeWrapper); - default: - for (var i = 0; i < t.results.length; i++) { - result[i] = $externalize($copyIfRequired(result[i], t.results[i]), t.results[i], makeWrapper); - } - return result; - } - }; - } - return v.$externalizeWrapper; -}; - -var $internalize = function(v, t, recv, seen, makeWrapper) { - if (t === $jsObjectPtr) { - return v; - } - if (t === $jsObjectPtr.elem) { - $throwRuntimeError("cannot internalize js.Object, use *js.Object instead"); - } - if (v && v.__internal_object__ !== undefined) { - return $assertType(v.__internal_object__, t, false); - } - var timePkg = $packages["time"]; - if (timePkg !== undefined && t === timePkg.Time) { - if (!(v !== null && v !== undefined && v.constructor === Date)) { - $throwRuntimeError("cannot internalize time.Time from " + typeof v + ", must be Date"); - } - return timePkg.Unix(new $Int64(0, 0), new $Int64(0, v.getTime() * 1000000)); - } - - // Cache for values we've already internalized in order to deal with circular - // references. - if (seen === undefined) { seen = new Map(); } - if (!seen.has(t)) { seen.set(t, new Map()); } - if (seen.get(t).has(v)) { return seen.get(t).get(v); } - - switch (t.kind) { - case $kindBool: - return !!v; - case $kindInt: - return parseInt(v); - case $kindInt8: - return parseInt(v) << 24 >> 24; - case $kindInt16: - return parseInt(v) << 16 >> 16; - case $kindInt32: - return parseInt(v) >> 0; - case $kindUint: - return parseInt(v); - case $kindUint8: - return parseInt(v) << 24 >>> 24; - case $kindUint16: - return parseInt(v) << 16 >>> 16; - case $kindUint32: - case $kindUintptr: - return parseInt(v) >>> 0; - case $kindInt64: - case $kindUint64: - return new t(0, v); - case $kindFloat32: - case $kindFloat64: - return parseFloat(v); - case $kindArray: - if (v.length !== t.len) { - $throwRuntimeError("got array with wrong size from JavaScript native"); - } - return $mapArray(v, function(e) { return $internalize(e, t.elem, makeWrapper); }); - case $kindFunc: - return function() { - var args = []; - for (var i = 0; i < t.params.length; i++) { - if (t.variadic && i === t.params.length - 1) { - var vt = t.params[i].elem, varargs = arguments[i]; - for (var j = 0; j < varargs.$length; j++) { - args.push($externalize(varargs.$array[varargs.$offset + j], vt, makeWrapper)); - } - break; - } - args.push($externalize(arguments[i], t.params[i], makeWrapper)); - } - var result = v.apply(recv, args); - switch (t.results.length) { - case 0: - return; - case 1: - return $internalize(result, t.results[0], makeWrapper); - default: - for (var i = 0; i < t.results.length; i++) { - result[i] = $internalize(result[i], t.results[i], makeWrapper); - } - return result; - } - }; - case $kindInterface: - if (t.methods.length !== 0) { - $throwRuntimeError("cannot internalize " + t.string); - } - if (v === null) { - return $ifaceNil; - } - if (v === undefined) { - return new $jsObjectPtr(undefined); - } - switch (v.constructor) { - case Int8Array: - return new ($sliceType($Int8))(v); - case Int16Array: - return new ($sliceType($Int16))(v); - case Int32Array: - return new ($sliceType($Int))(v); - case Uint8Array: - return new ($sliceType($Uint8))(v); - case Uint16Array: - return new ($sliceType($Uint16))(v); - case Uint32Array: - return new ($sliceType($Uint))(v); - case Float32Array: - return new ($sliceType($Float32))(v); - case Float64Array: - return new ($sliceType($Float64))(v); - case Array: - return $internalize(v, $sliceType($emptyInterface), makeWrapper); - case Boolean: - return new $Bool(!!v); - case Date: - if (timePkg === undefined) { - /* time package is not present, internalize as &js.Object{Date} so it can be externalized into original Date. */ - return new $jsObjectPtr(v); - } - return new timePkg.Time($internalize(v, timePkg.Time, makeWrapper)); - case (function () { }).constructor: // is usually Function, but in Chrome extensions it is something else - var funcType = $funcType([$sliceType($emptyInterface)], [$jsObjectPtr], true); - return new funcType($internalize(v, funcType, makeWrapper)); - case Number: - return new $Float64(parseFloat(v)); - case String: - return new $String($internalize(v, $String, makeWrapper)); - default: - if ($global.Node && v instanceof $global.Node) { - return new $jsObjectPtr(v); - } - var mapType = $mapType($String, $emptyInterface); - return new mapType($internalize(v, mapType, recv, seen, makeWrapper)); - } - case $kindMap: - var m = {}; - seen.get(t).set(v, m); - var keys = $keys(v); - for (var i = 0; i < keys.length; i++) { - var k = $internalize(keys[i], t.key, recv, seen, makeWrapper); - m[t.key.keyFor(k)] = { k: k, v: $internalize(v[keys[i]], t.elem, recv, seen, makeWrapper) }; - } - return m; - case $kindPtr: - if (t.elem.kind === $kindStruct) { - return $internalize(v, t.elem, makeWrapper); - } - case $kindSlice: - return new t($mapArray(v, function(e) { return $internalize(e, t.elem, makeWrapper); })); - case $kindString: - v = String(v); - if ($isASCII(v)) { - return v; - } - var s = ""; - var i = 0; - while (i < v.length) { - var h = v.charCodeAt(i); - if (0xD800 <= h && h <= 0xDBFF) { - var l = v.charCodeAt(i + 1); - var c = (h - 0xD800) * 0x400 + l - 0xDC00 + 0x10000; - s += $encodeRune(c); - i += 2; - continue; - } - s += $encodeRune(h); - i++; - } - return s; - case $kindStruct: - var noJsObject = {}; - var searchJsObject = function(t) { - if (t === $jsObjectPtr) { - return v; - } - if (t === $jsObjectPtr.elem) { - $throwRuntimeError("cannot internalize js.Object, use *js.Object instead"); - } - switch (t.kind) { - case $kindPtr: - return searchJsObject(t.elem); - case $kindStruct: - var f = t.fields[0]; - var o = searchJsObject(f.typ); - if (o !== noJsObject) { - var n = new t.ptr(); - n[f.prop] = o; - return n; - } - return noJsObject; - default: - return noJsObject; - } - }; - var o = searchJsObject(t); - if (o !== noJsObject) { - return o; - } - } - $throwRuntimeError("cannot internalize " + t.string); -}; - -var $copyIfRequired = function(v, typ) { - // interface values - if (v && v.constructor && v.constructor.copy) { - return new v.constructor($clone(v.$val, v.constructor)) - } - // array and struct values - if (typ.copy) { - var clone = typ.zero(); - typ.copy(clone, v); - return clone; - } - return v; -} - -/* $isASCII reports whether string s contains only ASCII characters. */ -var $isASCII = function(s) { - for (var i = 0; i < s.length; i++) { - if (s.charCodeAt(i) >= 128) { - return false; - } - } - return true; -}; - -$packages["github.com/gopherjs/gopherjs/js"] = (function() { - var $pkg = {}, $init, Object, Error, M, sliceType, ptrType, sliceType$2, funcType, funcType$1, funcType$2, ptrType$1, MakeWrapper, MakeFullWrapper, init; - Object = $pkg.Object = $newType(0, $kindStruct, "js.Object", true, "github.com/gopherjs/gopherjs/js", true, function(object_) { - this.$val = this; - if (arguments.length === 0) { - this.object = null; - return; - } - this.object = object_; - }); - Error = $pkg.Error = $newType(0, $kindStruct, "js.Error", true, "github.com/gopherjs/gopherjs/js", true, function(Object_) { - this.$val = this; - if (arguments.length === 0) { - this.Object = null; - return; - } - this.Object = Object_; - }); - M = $pkg.M = $newType(4, $kindMap, "js.M", true, "github.com/gopherjs/gopherjs/js", true, null); - sliceType = $sliceType($emptyInterface); - ptrType = $ptrType(Object); - sliceType$2 = $sliceType(ptrType); - funcType = $funcType([sliceType$2], [ptrType], true); - funcType$1 = $funcType([], [ptrType], false); - funcType$2 = $funcType([ptrType], [], false); - ptrType$1 = $ptrType(Error); - Object.ptr.prototype.Get = function(key) { - var key, o; - o = this; - return o.object[$externalize(key, $String)]; - }; - Object.prototype.Get = function(key) { return this.$val.Get(key); }; - Object.ptr.prototype.Set = function(key, value) { - var key, o, value; - o = this; - o.object[$externalize(key, $String)] = $externalize(value, $emptyInterface); - }; - Object.prototype.Set = function(key, value) { return this.$val.Set(key, value); }; - Object.ptr.prototype.Delete = function(key) { - var key, o; - o = this; - delete o.object[$externalize(key, $String)]; - }; - Object.prototype.Delete = function(key) { return this.$val.Delete(key); }; - Object.ptr.prototype.Length = function() { - var o; - o = this; - return $parseInt(o.object.length); - }; - Object.prototype.Length = function() { return this.$val.Length(); }; - Object.ptr.prototype.Index = function(i) { - var i, o; - o = this; - return o.object[i]; - }; - Object.prototype.Index = function(i) { return this.$val.Index(i); }; - Object.ptr.prototype.SetIndex = function(i, value) { - var i, o, value; - o = this; - o.object[i] = $externalize(value, $emptyInterface); - }; - Object.prototype.SetIndex = function(i, value) { return this.$val.SetIndex(i, value); }; - Object.ptr.prototype.Call = function(name, args) { - var args, name, o, obj; - o = this; - return (obj = o.object, obj[$externalize(name, $String)].apply(obj, $externalize(args, sliceType))); - }; - Object.prototype.Call = function(name, args) { return this.$val.Call(name, args); }; - Object.ptr.prototype.Invoke = function(args) { - var args, o; - o = this; - return o.object.apply(undefined, $externalize(args, sliceType)); - }; - Object.prototype.Invoke = function(args) { return this.$val.Invoke(args); }; - Object.ptr.prototype.New = function(args) { - var args, o; - o = this; - return new ($global.Function.prototype.bind.apply(o.object, [undefined].concat($externalize(args, sliceType)))); - }; - Object.prototype.New = function(args) { return this.$val.New(args); }; - Object.ptr.prototype.Bool = function() { - var o; - o = this; - return !!(o.object); - }; - Object.prototype.Bool = function() { return this.$val.Bool(); }; - Object.ptr.prototype.String = function() { - var o; - o = this; - return $internalize(o.object, $String); - }; - Object.prototype.String = function() { return this.$val.String(); }; - Object.ptr.prototype.Int = function() { - var o; - o = this; - return $parseInt(o.object) >> 0; - }; - Object.prototype.Int = function() { return this.$val.Int(); }; - Object.ptr.prototype.Int64 = function() { - var o; - o = this; - return $internalize(o.object, $Int64); - }; - Object.prototype.Int64 = function() { return this.$val.Int64(); }; - Object.ptr.prototype.Uint64 = function() { - var o; - o = this; - return $internalize(o.object, $Uint64); - }; - Object.prototype.Uint64 = function() { return this.$val.Uint64(); }; - Object.ptr.prototype.Float = function() { - var o; - o = this; - return $parseFloat(o.object); - }; - Object.prototype.Float = function() { return this.$val.Float(); }; - Object.ptr.prototype.Interface = function() { - var o; - o = this; - return $internalize(o.object, $emptyInterface); - }; - Object.prototype.Interface = function() { return this.$val.Interface(); }; - Object.ptr.prototype.Unsafe = function() { - var o; - o = this; - return o.object; - }; - Object.prototype.Unsafe = function() { return this.$val.Unsafe(); }; - Error.ptr.prototype.Error = function() { - var err; - err = this; - return "JavaScript error: " + $internalize(err.Object.message, $String); - }; - Error.prototype.Error = function() { return this.$val.Error(); }; - Error.ptr.prototype.Stack = function() { - var err; - err = this; - return $internalize(err.Object.stack, $String); - }; - Error.prototype.Stack = function() { return this.$val.Stack(); }; - MakeWrapper = function(i) { - var i, i$1, m, methods, o, v; - v = i; - o = new ($global.Object)(); - o.__internal_object__ = v; - methods = v.constructor.methods; - i$1 = 0; - while (true) { - if (!(i$1 < $parseInt(methods.length))) { break; } - m = [m]; - m[0] = methods[i$1]; - if (!($internalize(m[0].pkg, $String) === "")) { - i$1 = i$1 + (1) >> 0; - continue; - } - o[$externalize($internalize(m[0].name, $String), $String)] = $externalize((function(m) { return function(args) { - var args; - return $externalizeFunction(v[$externalize($internalize(m[0].prop, $String), $String)], m[0].typ, $externalize(true, $Bool)).apply(v, $externalize(args, sliceType$2)); - }; })(m), funcType); - i$1 = i$1 + (1) >> 0; - } - return o; - }; - $pkg.MakeWrapper = MakeWrapper; - MakeFullWrapper = function(i) { - var {constructor, defineProperty, e, f, fields, i, i$1, i$2, i$3, internalObj, m, methods, ms, pkg, pkgTyp, ptr, typ, wrapperObj, $s, $r, $c} = $restore(this, {i}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - internalObj = [internalObj]; - wrapperObj = [wrapperObj]; - internalObj[0] = i; - constructor = internalObj[0].constructor; - wrapperObj[0] = new ($global.Object)(); - defineProperty = (function(internalObj, wrapperObj) { return function(key, descriptor) { - var descriptor, key; - $global.Object.defineProperty(wrapperObj[0], $externalize(key, $String), $externalize(descriptor, M)); - }; })(internalObj, wrapperObj); - $r = defineProperty("__internal_object__", $makeMap($String.keyFor, [{ k: "value", v: new $jsObjectPtr(internalObj[0]) }])); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - typ = $internalize(constructor.string, $String); - pkg = $internalize(constructor.pkg, $String); - ptr = ""; - if (typ.charCodeAt(0) === 42) { - ptr = "*"; - } - i$1 = 0; - while (true) { - if (!(i$1 < typ.length)) { break; } - if (typ.charCodeAt(i$1) === 46) { - typ = $substring(typ, (i$1 + 1 >> 0)); - break; - } - i$1 = i$1 + (1) >> 0; - } - pkgTyp = pkg + "." + ptr + typ; - $r = defineProperty("$type", $makeMap($String.keyFor, [{ k: "value", v: new $String(pkgTyp) }])); /* */ $s = 2; case 2: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - fields = null; - methods = new ($global.Array)(); - ms = constructor.methods; - if (!(ms === undefined)) { - methods = methods.concat(ms); - } - e = constructor.elem; - if (!(e === undefined)) { - fields = e.fields; - methods = methods.concat(e.methods); - } else { - fields = constructor.fields; - } - i$2 = 0; - /* while (true) { */ case 3: - /* if (!(i$2 < $parseInt(methods.length))) { break; } */ if(!(i$2 < $parseInt(methods.length))) { $s = 4; continue; } - m = [m]; - m[0] = methods[i$2]; - if (!($internalize(m[0].pkg, $String) === "")) { - i$2 = i$2 + (1) >> 0; - /* continue; */ $s = 3; continue; - } - $r = defineProperty($internalize(m[0].prop, $String), $makeMap($String.keyFor, [{ k: "value", v: new funcType((function(internalObj, m, wrapperObj) { return function(args) { - var args; - return $externalizeFunction(internalObj[0][$externalize($internalize(m[0].prop, $String), $String)], m[0].typ, $externalize(true, $Bool), MakeFullWrapper).apply(internalObj[0], $externalize(args, sliceType$2)); - }; })(internalObj, m, wrapperObj)) }])); /* */ $s = 5; case 5: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - i$2 = i$2 + (1) >> 0; - $s = 3; continue; - case 4: - /* */ if (!(fields === undefined)) { $s = 6; continue; } - /* */ $s = 7; continue; - /* if (!(fields === undefined)) { */ case 6: - i$3 = 0; - /* while (true) { */ case 8: - /* if (!(i$3 < $parseInt(fields.length))) { break; } */ if(!(i$3 < $parseInt(fields.length))) { $s = 9; continue; } - f = [f]; - f[0] = fields[i$3]; - if (!!!(f[0].exported)) { - i$3 = i$3 + (1) >> 0; - /* continue; */ $s = 8; continue; - } - $r = defineProperty($internalize(f[0].prop, $String), $makeMap($String.keyFor, [{ k: "get", v: new funcType$1((function(f, internalObj, wrapperObj) { return function() { - var vc; - vc = $copyIfRequired(internalObj[0].$val[$externalize($internalize(f[0].prop, $String), $String)], f[0].typ); - return $externalize(vc, f[0].typ, MakeFullWrapper); - }; })(f, internalObj, wrapperObj)) }, { k: "set", v: new funcType$2((function(f, internalObj, wrapperObj) { return function(jv) { - var gv, jv; - gv = $internalize(jv, f[0].typ, MakeFullWrapper); - internalObj[0].$val[$externalize($internalize(f[0].prop, $String), $String)] = gv; - }; })(f, internalObj, wrapperObj)) }])); /* */ $s = 10; case 10: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - i$3 = i$3 + (1) >> 0; - $s = 8; continue; - case 9: - /* } */ case 7: - $s = -1; return wrapperObj[0]; - /* */ } return; } var $f = {$blk: MakeFullWrapper, $c: true, $r, constructor, defineProperty, e, f, fields, i, i$1, i$2, i$3, internalObj, m, methods, ms, pkg, pkgTyp, ptr, typ, wrapperObj, $s};return $f; - }; - $pkg.MakeFullWrapper = MakeFullWrapper; - init = function() { - var e; - e = new Error.ptr(null); - $unused(e); - }; - ptrType.methods = [{prop: "Get", name: "Get", pkg: "", typ: $funcType([$String], [ptrType], false)}, {prop: "Set", name: "Set", pkg: "", typ: $funcType([$String, $emptyInterface], [], false)}, {prop: "Delete", name: "Delete", pkg: "", typ: $funcType([$String], [], false)}, {prop: "Length", name: "Length", pkg: "", typ: $funcType([], [$Int], false)}, {prop: "Index", name: "Index", pkg: "", typ: $funcType([$Int], [ptrType], false)}, {prop: "SetIndex", name: "SetIndex", pkg: "", typ: $funcType([$Int, $emptyInterface], [], false)}, {prop: "Call", name: "Call", pkg: "", typ: $funcType([$String, sliceType], [ptrType], true)}, {prop: "Invoke", name: "Invoke", pkg: "", typ: $funcType([sliceType], [ptrType], true)}, {prop: "New", name: "New", pkg: "", typ: $funcType([sliceType], [ptrType], true)}, {prop: "Bool", name: "Bool", pkg: "", typ: $funcType([], [$Bool], false)}, {prop: "String", name: "String", pkg: "", typ: $funcType([], [$String], false)}, {prop: "Int", name: "Int", pkg: "", typ: $funcType([], [$Int], false)}, {prop: "Int64", name: "Int64", pkg: "", typ: $funcType([], [$Int64], false)}, {prop: "Uint64", name: "Uint64", pkg: "", typ: $funcType([], [$Uint64], false)}, {prop: "Float", name: "Float", pkg: "", typ: $funcType([], [$Float64], false)}, {prop: "Interface", name: "Interface", pkg: "", typ: $funcType([], [$emptyInterface], false)}, {prop: "Unsafe", name: "Unsafe", pkg: "", typ: $funcType([], [$Uintptr], false)}]; - ptrType$1.methods = [{prop: "Error", name: "Error", pkg: "", typ: $funcType([], [$String], false)}, {prop: "Stack", name: "Stack", pkg: "", typ: $funcType([], [$String], false)}]; - Object.init("github.com/gopherjs/gopherjs/js", [{prop: "object", name: "object", embedded: false, exported: false, typ: ptrType, tag: ""}]); - Error.init("", [{prop: "Object", name: "Object", embedded: true, exported: true, typ: ptrType, tag: ""}]); - M.init($String, $emptyInterface); - $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: - init(); - /* */ } return; } if ($f === undefined) { $f = { $blk: $init }; } $f.$s = $s; $f.$r = $r; return $f; - }; - $pkg.$init = $init; - return $pkg; -})(); -$packages["runtime"] = (function() { - var $pkg = {}, $init, js, _type, TypeAssertionError, errorString, ptrType$1, ptrType$2, buildVersion, init, throw$1; - js = $packages["github.com/gopherjs/gopherjs/js"]; - _type = $pkg._type = $newType(0, $kindStruct, "runtime._type", true, "runtime", false, function(str_) { - this.$val = this; - if (arguments.length === 0) { - this.str = ""; - return; - } - this.str = str_; - }); - TypeAssertionError = $pkg.TypeAssertionError = $newType(0, $kindStruct, "runtime.TypeAssertionError", true, "runtime", true, function(_interface_, concrete_, asserted_, missingMethod_) { - this.$val = this; - if (arguments.length === 0) { - this._interface = ptrType$1.nil; - this.concrete = ptrType$1.nil; - this.asserted = ptrType$1.nil; - this.missingMethod = ""; - return; - } - this._interface = _interface_; - this.concrete = concrete_; - this.asserted = asserted_; - this.missingMethod = missingMethod_; - }); - errorString = $pkg.errorString = $newType(8, $kindString, "runtime.errorString", true, "runtime", false, null); - ptrType$1 = $ptrType(_type); - ptrType$2 = $ptrType(TypeAssertionError); - _type.ptr.prototype.string = function() { - var t; - t = this; - return t.str; - }; - _type.prototype.string = function() { return this.$val.string(); }; - _type.ptr.prototype.pkgpath = function() { - var t; - t = this; - return ""; - }; - _type.prototype.pkgpath = function() { return this.$val.pkgpath(); }; - TypeAssertionError.ptr.prototype.RuntimeError = function() { - }; - TypeAssertionError.prototype.RuntimeError = function() { return this.$val.RuntimeError(); }; - TypeAssertionError.ptr.prototype.Error = function() { - var as, cs, e, inter, msg; - e = this; - inter = "interface"; - if (!(e._interface === ptrType$1.nil)) { - inter = e._interface.string(); - } - as = e.asserted.string(); - if (e.concrete === ptrType$1.nil) { - return "interface conversion: " + inter + " is nil, not " + as; - } - cs = e.concrete.string(); - if (e.missingMethod === "") { - msg = "interface conversion: " + inter + " is " + cs + ", not " + as; - if (cs === as) { - if (!(e.concrete.pkgpath() === e.asserted.pkgpath())) { - msg = msg + (" (types from different packages)"); - } else { - msg = msg + (" (types from different scopes)"); - } - } - return msg; - } - return "interface conversion: " + cs + " is not " + as + ": missing method " + e.missingMethod; - }; - TypeAssertionError.prototype.Error = function() { return this.$val.Error(); }; - init = function() { - var e, jsPkg; - jsPkg = $packages[$externalize("github.com/gopherjs/gopherjs/js", $String)]; - $jsObjectPtr = jsPkg.Object.ptr; - $jsErrorPtr = jsPkg.Error.ptr; - $throwRuntimeError = throw$1; - buildVersion = $internalize($goVersion, $String); - e = $ifaceNil; - e = new TypeAssertionError.ptr(ptrType$1.nil, ptrType$1.nil, ptrType$1.nil, ""); - $unused(e); - }; - errorString.prototype.RuntimeError = function() { - var e; - e = this.$val; - }; - $ptrType(errorString).prototype.RuntimeError = function() { return new errorString(this.$get()).RuntimeError(); }; - errorString.prototype.Error = function() { - var e; - e = this.$val; - return "runtime error: " + (e); - }; - $ptrType(errorString).prototype.Error = function() { return new errorString(this.$get()).Error(); }; - throw$1 = function(s) { - var s; - $panic(new errorString((s))); - }; - ptrType$1.methods = [{prop: "string", name: "string", pkg: "runtime", typ: $funcType([], [$String], false)}, {prop: "pkgpath", name: "pkgpath", pkg: "runtime", typ: $funcType([], [$String], false)}]; - ptrType$2.methods = [{prop: "RuntimeError", name: "RuntimeError", pkg: "", typ: $funcType([], [], false)}, {prop: "Error", name: "Error", pkg: "", typ: $funcType([], [$String], false)}]; - errorString.methods = [{prop: "RuntimeError", name: "RuntimeError", pkg: "", typ: $funcType([], [], false)}, {prop: "Error", name: "Error", pkg: "", typ: $funcType([], [$String], false)}]; - _type.init("runtime", [{prop: "str", name: "str", embedded: false, exported: false, typ: $String, tag: ""}]); - TypeAssertionError.init("runtime", [{prop: "_interface", name: "_interface", embedded: false, exported: false, typ: ptrType$1, tag: ""}, {prop: "concrete", name: "concrete", embedded: false, exported: false, typ: ptrType$1, tag: ""}, {prop: "asserted", name: "asserted", embedded: false, exported: false, typ: ptrType$1, tag: ""}, {prop: "missingMethod", name: "missingMethod", embedded: false, exported: false, typ: $String, 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 = js.$init(); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - buildVersion = ""; - init(); - /* */ } return; } if ($f === undefined) { $f = { $blk: $init }; } $f.$s = $s; $f.$r = $r; return $f; - }; - $pkg.$init = $init; - return $pkg; -})(); -$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, js, bits, arrayType, arrayType$1, arrayType$2, structType, math, _zero, posInf, negInf, nan, buf, max, min, Abs, Cos, Floor, Inf, IsInf, IsNaN, Max, Min, NaN, Pow, Signbit, Sin, Sqrt, init, Float64bits, Float64frombits; - js = $packages["github.com/gopherjs/gopherjs/js"]; - bits = $packages["math/bits"]; - arrayType = $arrayType($Uint32, 2); - arrayType$1 = $arrayType($Float32, 2); - arrayType$2 = $arrayType($Float64, 1); - structType = $structType("math", [{prop: "uint32array", name: "uint32array", embedded: false, exported: false, typ: arrayType, tag: ""}, {prop: "float32array", name: "float32array", embedded: false, exported: false, typ: arrayType$1, tag: ""}, {prop: "float64array", name: "float64array", embedded: false, exported: false, typ: arrayType$2, tag: ""}]); - max = function(x, y) { - var x, y; - if (IsInf(x, 1) || IsInf(y, 1)) { - return Inf(1); - } else if (IsNaN(x) || IsNaN(y)) { - return NaN(); - } else if ((x === 0) && (x === y)) { - if (Signbit(x)) { - return y; - } - return x; - } - if (x > y) { - return x; - } - return y; - }; - min = function(x, y) { - var x, y; - if (IsInf(x, -1) || IsInf(y, -1)) { - return Inf(-1); - } else if (IsNaN(x) || IsNaN(y)) { - return NaN(); - } else if ((x === 0) && (x === y)) { - if (Signbit(x)) { - return x; - } - return y; - } - if (x < y) { - return x; - } - return y; - }; - Abs = function(x) { - var x, x$1; - return Float64frombits((x$1 = Float64bits(x), new $Uint64(x$1.$high & ~2147483648, (x$1.$low & ~0) >>> 0))); - }; - $pkg.Abs = Abs; - Cos = function(x) { - var x; - return $parseFloat(math.cos(x)); - }; - $pkg.Cos = Cos; - Floor = function(x) { - var x; - return $parseFloat(math.floor(x)); - }; - $pkg.Floor = Floor; - Inf = function(sign) { - var sign; - if (sign >= 0) { - return posInf; - } else { - return negInf; - } - }; - $pkg.Inf = Inf; - IsInf = function(f, sign) { - var f, sign; - if (f === posInf) { - return sign >= 0; - } - if (f === negInf) { - return sign <= 0; - } - return false; - }; - $pkg.IsInf = IsInf; - IsNaN = function(f) { - var f, is; - is = false; - is = !((f === f)); - return is; - }; - $pkg.IsNaN = IsNaN; - Max = function(x, y) { - var x, y; - return max(x, y); - }; - $pkg.Max = Max; - Min = function(x, y) { - var x, y; - return min(x, y); - }; - $pkg.Min = Min; - NaN = function() { - return nan; - }; - $pkg.NaN = NaN; - Pow = function(x, y) { - var x, y; - if ((x === 1) || ((x === -1) && ((y === posInf) || (y === negInf)))) { - return 1; - } - return $parseFloat(math.pow(x, y)); - }; - $pkg.Pow = Pow; - Signbit = function(x) { - var x; - return x < 0 || (1 / x === negInf); - }; - $pkg.Signbit = Signbit; - Sin = function(x) { - var x; - return $parseFloat(math.sin(x)); - }; - $pkg.Sin = Sin; - Sqrt = function(x) { - var x; - return $parseFloat(math.sqrt(x)); - }; - $pkg.Sqrt = Sqrt; - init = function() { - var ab; - ab = new ($global.ArrayBuffer)(8); - buf.uint32array = new ($global.Uint32Array)(ab); - buf.float32array = new ($global.Float32Array)(ab); - buf.float64array = new ($global.Float64Array)(ab); - }; - Float64bits = function(f) { - var f, x, x$1; - buf.float64array[0] = f; - return (x = $shiftLeft64((new $Uint64(0, buf.uint32array[1])), 32), x$1 = (new $Uint64(0, buf.uint32array[0])), new $Uint64(x.$high + x$1.$high, x.$low + x$1.$low)); - }; - $pkg.Float64bits = Float64bits; - Float64frombits = function(b) { - var b; - buf.uint32array[0] = ((b.$low >>> 0)); - buf.uint32array[1] = (($shiftRightUint64(b, 32).$low >>> 0)); - return buf.float64array[0]; - }; - $pkg.Float64frombits = Float64frombits; - $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 = js.$init(); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - $r = bits.$init(); /* */ $s = 2; case 2: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - buf = new structType.ptr(arrayType.zero(), arrayType$1.zero(), arrayType$2.zero()); - math = $global.Math; - _zero = 0; - posInf = 1 / _zero; - negInf = -1 / _zero; - nan = $parseFloat($NaN); - init(); - /* */ } 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, math, Vector, Axis, Space, Shape, Line, ConvexPolygon, ContactSet, Circle, Projection, Object, Collision, Cell, sliceType, ptrType, sliceType$1, sliceType$2, ptrType$1, ptrType$2, sliceType$3, sliceType$4, ptrType$3, sliceType$5, ptrType$4, ptrType$5, ptrType$6, sliceType$6, ptrType$7, sliceType$7, mapType, Dot, NewSpace, NewLine, NewConvexPolygon, NewContactSet, NewRectangle, NewCircle, NewObject, axpyUnitaryTo, scalUnitaryTo, NewCollision, newCell; - math = $packages["math"]; - Vector = $pkg.Vector = $newType(12, $kindSlice, "resolv.Vector", true, "resolv", true, null); - Axis = $pkg.Axis = $newType(4, $kindInt, "resolv.Axis", true, "resolv", true, null); - Space = $pkg.Space = $newType(0, $kindStruct, "resolv.Space", true, "resolv", true, function(Cells_, CellWidth_, CellHeight_) { - this.$val = this; - if (arguments.length === 0) { - this.Cells = sliceType$2.nil; - this.CellWidth = 0; - this.CellHeight = 0; - return; - } - this.Cells = Cells_; - this.CellWidth = CellWidth_; - this.CellHeight = CellHeight_; - }); - Shape = $pkg.Shape = $newType(8, $kindInterface, "resolv.Shape", true, "resolv", true, null); - Line = $pkg.Line = $newType(0, $kindStruct, "resolv.Line", true, "resolv", true, function(Start_, End_) { - this.$val = this; - if (arguments.length === 0) { - this.Start = Vector.nil; - this.End = Vector.nil; - return; - } - this.Start = Start_; - this.End = End_; - }); - ConvexPolygon = $pkg.ConvexPolygon = $newType(0, $kindStruct, "resolv.ConvexPolygon", true, "resolv", true, function(Points_, X_, Y_, Closed_) { - this.$val = this; - if (arguments.length === 0) { - this.Points = sliceType$4.nil; - this.X = 0; - this.Y = 0; - this.Closed = false; - return; - } - this.Points = Points_; - this.X = X_; - this.Y = Y_; - this.Closed = Closed_; - }); - ContactSet = $pkg.ContactSet = $newType(0, $kindStruct, "resolv.ContactSet", true, "resolv", true, function(Points_, MTV_, Center_) { - this.$val = this; - if (arguments.length === 0) { - this.Points = sliceType$4.nil; - this.MTV = Vector.nil; - this.Center = Vector.nil; - return; - } - this.Points = Points_; - this.MTV = MTV_; - this.Center = Center_; - }); - Circle = $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_; - }); - Projection = $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_; - }); - Object = $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 = ptrType$1.nil; - this.X = 0; - this.Y = 0; - this.W = 0; - this.H = 0; - this.TouchingCells = sliceType$1.nil; - this.Data = $ifaceNil; - this.ignoreList = false; - this.tags = sliceType$6.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_; - }); - Collision = $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 = ptrType$2.nil; - this.dx = 0; - this.dy = 0; - this.Objects = sliceType$3.nil; - this.Cells = sliceType$1.nil; - return; - } - this.checkingObject = checkingObject_; - this.dx = dx_; - this.dy = dy_; - this.Objects = Objects_; - this.Cells = Cells_; - }); - Cell = $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 = sliceType$3.nil; - return; - } - this.X = X_; - this.Y = Y_; - this.Objects = Objects_; - }); - sliceType = $sliceType($Float64); - ptrType = $ptrType(Cell); - sliceType$1 = $sliceType(ptrType); - sliceType$2 = $sliceType(sliceType$1); - ptrType$1 = $ptrType(Space); - ptrType$2 = $ptrType(Object); - sliceType$3 = $sliceType(ptrType$2); - sliceType$4 = $sliceType(Vector); - ptrType$3 = $ptrType(Line); - sliceType$5 = $sliceType(ptrType$3); - ptrType$4 = $ptrType(Circle); - ptrType$5 = $ptrType(ConvexPolygon); - ptrType$6 = $ptrType(ContactSet); - sliceType$6 = $sliceType($String); - ptrType$7 = $ptrType(Collision); - sliceType$7 = $sliceType(Axis); - mapType = $mapType(ptrType$2, $Bool); - Vector.prototype.Clone = function() { - var clone, v; - v = this; - clone = $makeSlice(Vector, v.$length); - $copySlice(clone, v); - return clone; - }; - $ptrType(Vector).prototype.Clone = function() { return this.$get().Clone(); }; - Vector.prototype.Add = function(vs) { - var _i, _ref, dim, i, v, vs; - v = this; - dim = v.$length; - _ref = vs; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - i = _i; - if (((i < 0 || i >= vs.$length) ? ($throwRuntimeError("index out of range"), undefined) : vs.$array[vs.$offset + i]).$length > dim) { - axpyUnitaryTo($convertSliceType(v, sliceType), 1, $convertSliceType(v, sliceType), $convertSliceType($subslice(((i < 0 || i >= vs.$length) ? ($throwRuntimeError("index out of range"), undefined) : vs.$array[vs.$offset + i]), 0, dim), sliceType)); - } else { - axpyUnitaryTo($convertSliceType(v, sliceType), 1, $convertSliceType(v, sliceType), $convertSliceType(((i < 0 || i >= vs.$length) ? ($throwRuntimeError("index out of range"), undefined) : vs.$array[vs.$offset + i]), sliceType)); - } - _i++; - } - return v; - }; - $ptrType(Vector).prototype.Add = function(vs) { return this.$get().Add(vs); }; - Vector.prototype.Sub = function(vs) { - var _i, _ref, dim, i, v, vs; - v = this; - dim = v.$length; - _ref = vs; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - i = _i; - if (((i < 0 || i >= vs.$length) ? ($throwRuntimeError("index out of range"), undefined) : vs.$array[vs.$offset + i]).$length > dim) { - axpyUnitaryTo($convertSliceType(v, sliceType), -1, $convertSliceType($subslice(((i < 0 || i >= vs.$length) ? ($throwRuntimeError("index out of range"), undefined) : vs.$array[vs.$offset + i]), 0, dim), sliceType), $convertSliceType(v, sliceType)); - } else { - axpyUnitaryTo($convertSliceType(v, sliceType), -1, $convertSliceType(((i < 0 || i >= vs.$length) ? ($throwRuntimeError("index out of range"), undefined) : vs.$array[vs.$offset + i]), sliceType), $convertSliceType(v, sliceType)); - } - _i++; - } - return v; - }; - $ptrType(Vector).prototype.Sub = function(vs) { return this.$get().Sub(vs); }; - Vector.prototype.Scale = function(size) { - var size, v; - v = this; - scalUnitaryTo($convertSliceType(v, sliceType), size, $convertSliceType(v, sliceType)); - return v; - }; - $ptrType(Vector).prototype.Scale = function(size) { return this.$get().Scale(size); }; - Vector.prototype.Equal = function(v2) { - var _i, _ref, i, v, v2; - v = this; - if (!((v.$length === v2.$length))) { - return false; - } - _ref = v; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - i = _i; - if (math.Abs(((i < 0 || i >= v.$length) ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + i]) - ((i < 0 || i >= v2.$length) ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + i])) > 1e-08) { - return false; - } - _i++; - } - return true; - }; - $ptrType(Vector).prototype.Equal = function(v2) { return this.$get().Equal(v2); }; - Vector.prototype.Magnitude = function() { - var v; - v = this; - return math.Sqrt(v.Magnitude2()); - }; - $ptrType(Vector).prototype.Magnitude = function() { return this.$get().Magnitude(); }; - Vector.prototype.Magnitude2 = function() { - var _i, _ref, result, scalar, v; - v = this; - result = 0; - _ref = v; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - scalar = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - result = result + (scalar * scalar); - _i++; - } - return result; - }; - $ptrType(Vector).prototype.Magnitude2 = function() { return this.$get().Magnitude2(); }; - Vector.prototype.Unit = function() { - var _i, _ref, i, l, v; - v = this; - l = v.Magnitude(); - if (l < 1e-08) { - return v; - } - _ref = v; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - i = _i; - ((i < 0 || i >= v.$length) ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + i] = ((i < 0 || i >= v.$length) ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + i]) / l); - _i++; - } - return v; - }; - $ptrType(Vector).prototype.Unit = function() { return this.$get().Unit(); }; - Dot = function(v1, v2) { - var _i, _ref, _tmp, _tmp$1, _tmp$2, dim1, dim2, i, result, v1, v2; - _tmp = 0; - _tmp$1 = v1.$length; - _tmp$2 = v2.$length; - result = _tmp; - dim1 = _tmp$1; - dim2 = _tmp$2; - if (dim1 > dim2) { - v2 = $appendSlice(v2, $convertSliceType($makeSlice(Vector, (dim1 - dim2 >> 0)), sliceType)); - } - if (dim1 < dim2) { - v1 = $appendSlice(v1, $convertSliceType($makeSlice(Vector, (dim2 - dim1 >> 0)), sliceType)); - } - _ref = v1; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - i = _i; - result = result + (((i < 0 || i >= v1.$length) ? ($throwRuntimeError("index out of range"), undefined) : v1.$array[v1.$offset + i]) * ((i < 0 || i >= v2.$length) ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + i])); - _i++; - } - return result; - }; - $pkg.Dot = Dot; - Vector.prototype.Dot = function(v2) { - var v, v2; - v = this; - return Dot(v, v2); - }; - $ptrType(Vector).prototype.Dot = function(v2) { return this.$get().Dot(v2); }; - Vector.prototype.Cross = function(v2) { - var v, v2; - v = this; - if (!((v.$length === 3)) || !((v2.$length === 3))) { - return Vector.nil; - } - return new Vector([(1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1]) * (2 >= v2.$length ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + 2]) - (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2]) * (1 >= v2.$length ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + 1]), (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2]) * (0 >= v2.$length ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + 0]) - (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0]) * (2 >= v2.$length ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + 2]), (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0]) * (2 >= v2.$length ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + 2]) - (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2]) * (0 >= v2.$length ? ($throwRuntimeError("index out of range"), undefined) : v2.$array[v2.$offset + 0])]); - }; - $ptrType(Vector).prototype.Cross = function(v2) { return this.$get().Cross(v2); }; - Vector.prototype.Rotate = function(angle, as) { - var _1, _tmp, _tmp$1, _tmp$2, _tmp$3, _tmp$4, _tmp$5, angle, as, axis, cos, dim, sin, v, x, y, z, z$1; - v = this; - _tmp = 2; - _tmp$1 = v.$length; - axis = _tmp; - dim = _tmp$1; - if (dim === 0) { - return v; - } - if (as.$length > 0) { - axis = (0 >= as.$length ? ($throwRuntimeError("index out of range"), undefined) : as.$array[as.$offset + 0]); - } - if ((dim === 1) && !((axis === 2))) { - v = $append(v, 0, 0); - } - if ((dim < 2 && (axis === 2)) || ((dim === 2) && !((axis === 2)))) { - v = $append(v, 0); - } - _tmp$2 = (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0]); - _tmp$3 = (1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1]); - x = _tmp$2; - y = _tmp$3; - _tmp$4 = math.Cos(angle); - _tmp$5 = math.Sin(angle); - cos = _tmp$4; - sin = _tmp$5; - _1 = axis; - if (_1 === (0)) { - z = (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2]); - (1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1] = y * cos - z * sin); - (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2] = y * sin + z * cos); - } else if (_1 === (1)) { - z$1 = (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2]); - (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0] = x * cos + z$1 * sin); - (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2] = -x * sin + z$1 * cos); - } else if (_1 === (2)) { - (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0] = x * cos - y * sin); - (1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1] = x * sin + y * cos); - } - if (dim > 3) { - return $subslice(v, 0, 3); - } - return v; - }; - $ptrType(Vector).prototype.Rotate = function(angle, as) { return this.$get().Rotate(angle, as); }; - Vector.prototype.X = function() { - var v; - v = this; - if (v.$length < 1) { - return 0; - } - return (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0]); - }; - $ptrType(Vector).prototype.X = function() { return this.$get().X(); }; - Vector.prototype.Y = function() { - var v; - v = this; - if (v.$length < 2) { - return 0; - } - return (1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1]); - }; - $ptrType(Vector).prototype.Y = function() { return this.$get().Y(); }; - Vector.prototype.Z = function() { - var v; - v = this; - if (v.$length < 3) { - return 0; - } - return (2 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 2]); - }; - $ptrType(Vector).prototype.Z = function() { return this.$get().Z(); }; - NewSpace = function(spaceWidth, spaceHeight, cellWidth, cellHeight) { - var _q, _q$1, cellHeight, cellWidth, sp, spaceHeight, spaceWidth; - sp = new Space.ptr(sliceType$2.nil, cellWidth, cellHeight); - sp.Resize((_q = spaceWidth / cellWidth, (_q === _q && _q !== 1/0 && _q !== -1/0) ? _q >> 0 : $throwRuntimeError("integer divide by zero")), (_q$1 = spaceHeight / cellHeight, (_q$1 === _q$1 && _q$1 !== 1/0 && _q$1 !== -1/0) ? _q$1 >> 0 : $throwRuntimeError("integer divide by zero"))); - return sp; - }; - $pkg.NewSpace = NewSpace; - Space.ptr.prototype.Add = function(objects) { - var {_i, _ref, obj, objects, sp, $s, $r, $c} = $restore(this, {objects}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - sp = this; - if (sp === ptrType$1.nil) { - $panic(new $String("ERROR: space is nil")); - } - _ref = objects; - _i = 0; - /* while (true) { */ case 1: - /* if (!(_i < _ref.$length)) { break; } */ if(!(_i < _ref.$length)) { $s = 2; continue; } - obj = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - obj.Space = sp; - $r = obj.Update(); /* */ $s = 3; case 3: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - _i++; - $s = 1; continue; - case 2: - $s = -1; return; - /* */ } return; } var $f = {$blk: Space.ptr.prototype.Add, $c: true, $r, _i, _ref, obj, objects, sp, $s};return $f; - }; - Space.prototype.Add = function(objects) { return this.$val.Add(objects); }; - Space.ptr.prototype.Remove = function(objects) { - var _i, _i$1, _ref, _ref$1, cell, obj, objects, sp; - sp = this; - if (sp === ptrType$1.nil) { - $panic(new $String("ERROR: space is nil")); - } - _ref = objects; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - obj = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - _ref$1 = obj.TouchingCells; - _i$1 = 0; - while (true) { - if (!(_i$1 < _ref$1.$length)) { break; } - cell = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); - cell.unregister(obj); - _i$1++; - } - obj.TouchingCells = new sliceType$1([]); - obj.Space = ptrType$1.nil; - _i++; - } - }; - Space.prototype.Remove = function(objects) { return this.$val.Remove(objects); }; - Space.ptr.prototype.Objects = function() { - var _entry, _i, _i$1, _i$2, _key, _ref, _ref$1, _ref$2, _tuple, added, cx, cy, o, objects, objectsAdded, sp, x, x$1, x$2; - sp = this; - objectsAdded = $makeMap(ptrType$2.keyFor, []); - objects = new sliceType$3([]); - _ref = sp.Cells; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - cy = _i; - _ref$1 = (x = sp.Cells, ((cy < 0 || cy >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + cy])); - _i$1 = 0; - while (true) { - if (!(_i$1 < _ref$1.$length)) { break; } - cx = _i$1; - _ref$2 = (x$1 = (x$2 = sp.Cells, ((cy < 0 || cy >= x$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + cy])), ((cx < 0 || cx >= x$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + cx])).Objects; - _i$2 = 0; - while (true) { - if (!(_i$2 < _ref$2.$length)) { break; } - o = ((_i$2 < 0 || _i$2 >= _ref$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$2.$array[_ref$2.$offset + _i$2]); - _tuple = (_entry = objectsAdded[ptrType$2.keyFor(o)], _entry !== undefined ? [_entry.v, true] : [false, false]); - added = _tuple[1]; - if (!added) { - objects = $append(objects, o); - _key = o; (objectsAdded || $throwRuntimeError("assignment to entry in nil map"))[ptrType$2.keyFor(_key)] = { k: _key, v: true }; - } - _i$2++; - } - _i$1++; - } - _i++; - } - return objects; - }; - Space.prototype.Objects = function() { return this.$val.Objects(); }; - Space.ptr.prototype.Resize = function(width, height) { - var height, sp, width, x, x$1, x$2, y; - sp = this; - sp.Cells = new sliceType$2([]); - y = 0; - while (true) { - if (!(y < height)) { break; } - sp.Cells = $append(sp.Cells, new sliceType$1([])); - x = 0; - while (true) { - if (!(x < width)) { break; } - (x$2 = sp.Cells, ((y < 0 || y >= x$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + y] = $append((x$1 = sp.Cells, ((y < 0 || y >= x$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + y])), newCell(x, y)))); - x = x + (1) >> 0; - } - y = y + (1) >> 0; - } - }; - Space.prototype.Resize = function(width, height) { return this.$val.Resize(width, height); }; - Space.ptr.prototype.Cell = function(x, y) { - var sp, x, x$1, x$2, x$3, y; - sp = this; - if (y >= 0 && y < sp.Cells.$length && x >= 0 && x < (x$1 = sp.Cells, ((y < 0 || y >= x$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + y])).$length) { - return (x$2 = (x$3 = sp.Cells, ((y < 0 || y >= x$3.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + y])), ((x < 0 || x >= x$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + x])); - } - return ptrType.nil; - }; - Space.prototype.Cell = function(x, y) { return this.$val.Cell(x, y); }; - Space.ptr.prototype.CheckCells = function(x, y, w, h, tags) { - var _i, _ref, cell, h, ix, iy, obj, sp, tags, w, x, x$1, y; - sp = this; - ix = x; - while (true) { - if (!(ix < (x + w >> 0))) { break; } - iy = y; - while (true) { - if (!(iy < (y + h >> 0))) { break; } - cell = sp.Cell(ix, iy); - if (!(cell === ptrType.nil)) { - if (tags.$length > 0) { - if (cell.ContainsTags(tags)) { - _ref = cell.Objects; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - obj = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (obj.HasTags(tags)) { - return obj; - } - _i++; - } - } - } else if (cell.Occupied()) { - return (x$1 = cell.Objects, (0 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 0])); - } - } - iy = iy + (1) >> 0; - } - ix = ix + (1) >> 0; - } - return ptrType$2.nil; - }; - Space.prototype.CheckCells = function(x, y, w, h, tags) { return this.$val.CheckCells(x, y, w, h, tags); }; - Space.ptr.prototype.CheckCellsWorld = function(x, y, w, h, tags) { - var _tuple, _tuple$1, ch, cw, h, sp, sx, sy, tags, w, x, y; - sp = this; - _tuple = sp.WorldToSpace(x, y); - sx = _tuple[0]; - sy = _tuple[1]; - _tuple$1 = sp.WorldToSpace(w, h); - cw = _tuple$1[0]; - ch = _tuple$1[1]; - return sp.CheckCells(sx, sy, cw, ch, tags); - }; - Space.prototype.CheckCellsWorld = function(x, y, w, h, tags) { return this.$val.CheckCellsWorld(x, y, w, h, tags); }; - Space.ptr.prototype.UnregisterAllObjects = function() { - var cell, sp, x, x$1, x$2, x$3, y; - sp = this; - y = 0; - while (true) { - if (!(y < sp.Cells.$length)) { break; } - x = 0; - while (true) { - if (!(x < (x$1 = sp.Cells, ((y < 0 || y >= x$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + y])).$length)) { break; } - cell = (x$2 = (x$3 = sp.Cells, ((y < 0 || y >= x$3.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + y])), ((x < 0 || x >= x$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + x])); - sp.Remove(cell.Objects); - x = x + (1) >> 0; - } - y = y + (1) >> 0; - } - }; - Space.prototype.UnregisterAllObjects = function() { return this.$val.UnregisterAllObjects(); }; - Space.ptr.prototype.WorldToSpace = function(x, y) { - var fx, fy, sp, x, y; - sp = this; - fx = ((math.Floor(x / (sp.CellWidth)) >> 0)); - fy = ((math.Floor(y / (sp.CellHeight)) >> 0)); - return [fx, fy]; - }; - Space.prototype.WorldToSpace = function(x, y) { return this.$val.WorldToSpace(x, y); }; - Space.ptr.prototype.SpaceToWorld = function(x, y) { - var fx, fy, sp, x, y; - sp = this; - fx = (($imul(x, sp.CellWidth))); - fy = (($imul(y, sp.CellHeight))); - return [fx, fy]; - }; - Space.prototype.SpaceToWorld = function(x, y) { return this.$val.SpaceToWorld(x, y); }; - Space.ptr.prototype.Height = function() { - var sp; - sp = this; - return sp.Cells.$length; - }; - Space.prototype.Height = function() { return this.$val.Height(); }; - Space.ptr.prototype.Width = function() { - var sp, x; - sp = this; - if (sp.Cells.$length > 0) { - return (x = sp.Cells, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])).$length; - } - return 0; - }; - Space.prototype.Width = function() { return this.$val.Width(); }; - Space.ptr.prototype.CellsInLine = function(startX, startY, endX, endY) { - var _q, _q$1, _q$2, _q$3, _tuple, _tuple$1, alternate, c, cell, cells, cx, cy, dv, endCell, endX, endY, p, pX, pY, sp, startX, startY; - sp = this; - cells = new sliceType$1([]); - cell = sp.Cell(startX, startY); - endCell = sp.Cell(endX, endY); - if (!(cell === ptrType.nil) && !(endCell === ptrType.nil)) { - dv = new Vector([((endX - startX >> 0)), ((endY - startY >> 0))]).Unit(); - (0 >= dv.$length ? ($throwRuntimeError("index out of range"), undefined) : dv.$array[dv.$offset + 0] = (0 >= dv.$length ? ($throwRuntimeError("index out of range"), undefined) : dv.$array[dv.$offset + 0]) * (((_q = sp.CellWidth / 2, (_q === _q && _q !== 1/0 && _q !== -1/0) ? _q >> 0 : $throwRuntimeError("integer divide by zero"))))); - (1 >= dv.$length ? ($throwRuntimeError("index out of range"), undefined) : dv.$array[dv.$offset + 1] = (1 >= dv.$length ? ($throwRuntimeError("index out of range"), undefined) : dv.$array[dv.$offset + 1]) * (((_q$1 = sp.CellHeight / 2, (_q$1 === _q$1 && _q$1 !== 1/0 && _q$1 !== -1/0) ? _q$1 >> 0 : $throwRuntimeError("integer divide by zero"))))); - _tuple = sp.SpaceToWorld(startX, startY); - pX = _tuple[0]; - pY = _tuple[1]; - p = new Vector([pX + ((_q$2 = sp.CellWidth / 2, (_q$2 === _q$2 && _q$2 !== 1/0 && _q$2 !== -1/0) ? _q$2 >> 0 : $throwRuntimeError("integer divide by zero"))), pY + ((_q$3 = sp.CellHeight / 2, (_q$3 === _q$3 && _q$3 !== 1/0 && _q$3 !== -1/0) ? _q$3 >> 0 : $throwRuntimeError("integer divide by zero")))]); - alternate = false; - while (true) { - if (!(!(cell === ptrType.nil))) { break; } - if (cell === endCell) { - cells = $append(cells, cell); - break; - } - cells = $append(cells, cell); - if (alternate) { - (1 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 1] = (1 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 1]) + ((1 >= dv.$length ? ($throwRuntimeError("index out of range"), undefined) : dv.$array[dv.$offset + 1]))); - } else { - (0 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 0] = (0 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 0]) + ((0 >= dv.$length ? ($throwRuntimeError("index out of range"), undefined) : dv.$array[dv.$offset + 0]))); - } - _tuple$1 = sp.WorldToSpace((0 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 0]), (1 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 1])); - cx = _tuple$1[0]; - cy = _tuple$1[1]; - c = sp.Cell(cx, cy); - if (!(c === cell)) { - cell = c; - } - alternate = !alternate; - } - } - return cells; - }; - Space.prototype.CellsInLine = function(startX, startY, endX, endY) { return this.$val.CellsInLine(startX, startY, endX, endY); }; - NewLine = function(x, y, x2, y2) { - var x, x2, y, y2; - return new Line.ptr(new Vector([x, y]), new Vector([x2, y2])); - }; - $pkg.NewLine = NewLine; - Line.ptr.prototype.Project = function(axis) { - var axis, line; - line = this; - return line.Vector().Scale(axis.Dot(line.Start.Sub(new sliceType$4([line.End])))); - }; - Line.prototype.Project = function(axis) { return this.$val.Project(axis); }; - Line.ptr.prototype.Normal = function() { - var line, v; - line = this; - v = line.Vector(); - return new Vector([(1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1]), -(0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0])]).Unit(); - }; - Line.prototype.Normal = function() { return this.$val.Normal(); }; - Line.ptr.prototype.Vector = function() { - var line; - line = this; - return line.End.Clone().Sub(new sliceType$4([line.Start])).Unit(); - }; - Line.prototype.Vector = function() { return this.$val.Vector(); }; - Line.ptr.prototype.IntersectionPointsLine = function(other) { - var det, dx, dy, gamma, lambda, line, other, x, x$1, x$10, x$11, x$12, x$13, x$14, x$15, x$16, x$17, x$18, x$19, x$2, x$20, x$21, x$22, x$23, x$24, x$25, x$26, x$27, x$28, x$29, x$3, x$4, x$5, x$6, x$7, x$8, x$9; - line = this; - det = ((x = line.End, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])) - (x$1 = line.Start, (0 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 0]))) * ((x$2 = other.End, (1 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 1])) - (x$3 = other.Start, (1 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 1]))) - ((x$4 = other.End, (0 >= x$4.$length ? ($throwRuntimeError("index out of range"), undefined) : x$4.$array[x$4.$offset + 0])) - (x$5 = other.Start, (0 >= x$5.$length ? ($throwRuntimeError("index out of range"), undefined) : x$5.$array[x$5.$offset + 0]))) * ((x$6 = line.End, (1 >= x$6.$length ? ($throwRuntimeError("index out of range"), undefined) : x$6.$array[x$6.$offset + 1])) - (x$7 = line.Start, (1 >= x$7.$length ? ($throwRuntimeError("index out of range"), undefined) : x$7.$array[x$7.$offset + 1]))); - if (!((det === 0))) { - lambda = ((((x$8 = line.Start, (1 >= x$8.$length ? ($throwRuntimeError("index out of range"), undefined) : x$8.$array[x$8.$offset + 1])) - (x$9 = other.Start, (1 >= x$9.$length ? ($throwRuntimeError("index out of range"), undefined) : x$9.$array[x$9.$offset + 1]))) * ((x$10 = other.End, (0 >= x$10.$length ? ($throwRuntimeError("index out of range"), undefined) : x$10.$array[x$10.$offset + 0])) - (x$11 = other.Start, (0 >= x$11.$length ? ($throwRuntimeError("index out of range"), undefined) : x$11.$array[x$11.$offset + 0])))) - (((x$12 = line.Start, (0 >= x$12.$length ? ($throwRuntimeError("index out of range"), undefined) : x$12.$array[x$12.$offset + 0])) - (x$13 = other.Start, (0 >= x$13.$length ? ($throwRuntimeError("index out of range"), undefined) : x$13.$array[x$13.$offset + 0]))) * ((x$14 = other.End, (1 >= x$14.$length ? ($throwRuntimeError("index out of range"), undefined) : x$14.$array[x$14.$offset + 1])) - (x$15 = other.Start, (1 >= x$15.$length ? ($throwRuntimeError("index out of range"), undefined) : x$15.$array[x$15.$offset + 1])))) + 1) / det; - gamma = ((((x$16 = line.Start, (1 >= x$16.$length ? ($throwRuntimeError("index out of range"), undefined) : x$16.$array[x$16.$offset + 1])) - (x$17 = other.Start, (1 >= x$17.$length ? ($throwRuntimeError("index out of range"), undefined) : x$17.$array[x$17.$offset + 1]))) * ((x$18 = line.End, (0 >= x$18.$length ? ($throwRuntimeError("index out of range"), undefined) : x$18.$array[x$18.$offset + 0])) - (x$19 = line.Start, (0 >= x$19.$length ? ($throwRuntimeError("index out of range"), undefined) : x$19.$array[x$19.$offset + 0])))) - (((x$20 = line.Start, (0 >= x$20.$length ? ($throwRuntimeError("index out of range"), undefined) : x$20.$array[x$20.$offset + 0])) - (x$21 = other.Start, (0 >= x$21.$length ? ($throwRuntimeError("index out of range"), undefined) : x$21.$array[x$21.$offset + 0]))) * ((x$22 = line.End, (1 >= x$22.$length ? ($throwRuntimeError("index out of range"), undefined) : x$22.$array[x$22.$offset + 1])) - (x$23 = line.Start, (1 >= x$23.$length ? ($throwRuntimeError("index out of range"), undefined) : x$23.$array[x$23.$offset + 1])))) + 1) / det; - if ((0 < lambda && lambda < 1) && (0 < gamma && gamma < 1)) { - dx = (x$24 = line.End, (0 >= x$24.$length ? ($throwRuntimeError("index out of range"), undefined) : x$24.$array[x$24.$offset + 0])) - (x$25 = line.Start, (0 >= x$25.$length ? ($throwRuntimeError("index out of range"), undefined) : x$25.$array[x$25.$offset + 0])); - dy = (x$26 = line.End, (1 >= x$26.$length ? ($throwRuntimeError("index out of range"), undefined) : x$26.$array[x$26.$offset + 1])) - (x$27 = line.Start, (1 >= x$27.$length ? ($throwRuntimeError("index out of range"), undefined) : x$27.$array[x$27.$offset + 1])); - return new Vector([(x$28 = line.Start, (0 >= x$28.$length ? ($throwRuntimeError("index out of range"), undefined) : x$28.$array[x$28.$offset + 0])) + (lambda * dx), (x$29 = line.Start, (1 >= x$29.$length ? ($throwRuntimeError("index out of range"), undefined) : x$29.$array[x$29.$offset + 1])) + (lambda * dy)]); - } - } - return Vector.nil; - }; - Line.prototype.IntersectionPointsLine = function(other) { return this.$val.IntersectionPointsLine(other); }; - Line.ptr.prototype.IntersectionPointsCircle = function(circle) { - var a, b, c, circle, cp, det, diff, lEnd, lStart, line, points, t, t$1, x, x$1, x$2, x$3, x$4, x$5; - line = this; - points = new sliceType$4([]); - cp = new Vector([circle.X, circle.Y]); - lStart = line.Start.Sub(new sliceType$4([cp])); - lEnd = line.End.Sub(new sliceType$4([cp])); - diff = lEnd.Sub(new sliceType$4([lStart])); - a = (0 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 0]) * (0 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 0]) + (1 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 1]) * (1 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 1]); - b = 2 * (((0 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 0]) * (0 >= lStart.$length ? ($throwRuntimeError("index out of range"), undefined) : lStart.$array[lStart.$offset + 0])) + ((1 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 1]) * (1 >= lStart.$length ? ($throwRuntimeError("index out of range"), undefined) : lStart.$array[lStart.$offset + 1]))); - c = ((0 >= lStart.$length ? ($throwRuntimeError("index out of range"), undefined) : lStart.$array[lStart.$offset + 0]) * (0 >= lStart.$length ? ($throwRuntimeError("index out of range"), undefined) : lStart.$array[lStart.$offset + 0])) + ((1 >= lStart.$length ? ($throwRuntimeError("index out of range"), undefined) : lStart.$array[lStart.$offset + 1]) * (1 >= lStart.$length ? ($throwRuntimeError("index out of range"), undefined) : lStart.$array[lStart.$offset + 1])) - (circle.Radius * circle.Radius); - det = b * b - (4 * a * c); - if (det < 0) { - } else if (det === 0) { - t = -b / (2 * a); - if (t >= 0 && t <= 1) { - points = $append(points, new Vector([(x = line.Start, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])) + t * (0 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 0]), (x$1 = line.Start, (1 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 1])) + t * (1 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 1])])); - } - } else { - t$1 = (-b + math.Sqrt(det)) / (2 * a); - if (t$1 >= 0 && t$1 <= 1) { - points = $append(points, new Vector([(x$2 = line.Start, (0 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 0])) + t$1 * (0 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 0]), (x$3 = line.Start, (1 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 1])) + t$1 * (1 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 1])])); - } - t$1 = (-b - math.Sqrt(det)) / (2 * a); - if (t$1 >= 0 && t$1 <= 1) { - points = $append(points, new Vector([(x$4 = line.Start, (0 >= x$4.$length ? ($throwRuntimeError("index out of range"), undefined) : x$4.$array[x$4.$offset + 0])) + t$1 * (0 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 0]), (x$5 = line.Start, (1 >= x$5.$length ? ($throwRuntimeError("index out of range"), undefined) : x$5.$array[x$5.$offset + 1])) + t$1 * (1 >= diff.$length ? ($throwRuntimeError("index out of range"), undefined) : diff.$array[diff.$offset + 1])])); - } - } - return points; - }; - Line.prototype.IntersectionPointsCircle = function(circle) { return this.$val.IntersectionPointsCircle(circle); }; - NewConvexPolygon = function(points) { - var cp, points; - cp = new ConvexPolygon.ptr(new sliceType$4([]), 0, 0, true); - cp.AddPoints(points); - return cp; - }; - $pkg.NewConvexPolygon = NewConvexPolygon; - ConvexPolygon.ptr.prototype.Clone = function() { - var _i, _ref, cp, newPoly, point, points; - cp = this; - points = new sliceType$4([]); - _ref = cp.Points; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - point = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - points = $append(points, point.Clone()); - _i++; - } - newPoly = NewConvexPolygon(sliceType.nil); - newPoly.X = cp.X; - newPoly.Y = cp.Y; - newPoly.AddPointsVec(points); - newPoly.Closed = cp.Closed; - return newPoly; - }; - ConvexPolygon.prototype.Clone = function() { return this.$val.Clone(); }; - ConvexPolygon.ptr.prototype.AddPointsVec = function(points) { - var cp, points; - cp = this; - cp.Points = $appendSlice(cp.Points, points); - }; - ConvexPolygon.prototype.AddPointsVec = function(points) { return this.$val.AddPointsVec(points); }; - ConvexPolygon.ptr.prototype.AddPoints = function(vertexPositions) { - var cp, v, vertexPositions, x; - cp = this; - v = 0; - while (true) { - if (!(v < vertexPositions.$length)) { break; } - cp.Points = $append(cp.Points, new Vector([((v < 0 || v >= vertexPositions.$length) ? ($throwRuntimeError("index out of range"), undefined) : vertexPositions.$array[vertexPositions.$offset + v]), (x = v + 1 >> 0, ((x < 0 || x >= vertexPositions.$length) ? ($throwRuntimeError("index out of range"), undefined) : vertexPositions.$array[vertexPositions.$offset + x]))])); - v = v + (2) >> 0; - } - }; - ConvexPolygon.prototype.AddPoints = function(vertexPositions) { return this.$val.AddPoints(vertexPositions); }; - ConvexPolygon.ptr.prototype.Lines = function() { - var _tmp, _tmp$1, cp, end, i, line, lines, start, vertices, x; - cp = this; - lines = new sliceType$5([]); - vertices = cp.Transformed(); - i = 0; - while (true) { - if (!(i < vertices.$length)) { break; } - _tmp = ((i < 0 || i >= vertices.$length) ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + i]); - _tmp$1 = (0 >= vertices.$length ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + 0]); - start = _tmp; - end = _tmp$1; - if (i < (vertices.$length - 1 >> 0)) { - end = (x = i + 1 >> 0, ((x < 0 || x >= vertices.$length) ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + x])); - } else if (!cp.Closed) { - break; - } - line = NewLine((0 >= start.$length ? ($throwRuntimeError("index out of range"), undefined) : start.$array[start.$offset + 0]), (1 >= start.$length ? ($throwRuntimeError("index out of range"), undefined) : start.$array[start.$offset + 1]), (0 >= end.$length ? ($throwRuntimeError("index out of range"), undefined) : end.$array[end.$offset + 0]), (1 >= end.$length ? ($throwRuntimeError("index out of range"), undefined) : end.$array[end.$offset + 1])); - lines = $append(lines, line); - i = i + (1) >> 0; - } - return lines; - }; - ConvexPolygon.prototype.Lines = function() { return this.$val.Lines(); }; - ConvexPolygon.ptr.prototype.Transformed = function() { - var _i, _ref, cp, point, transformed; - cp = this; - transformed = new sliceType$4([]); - _ref = cp.Points; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - point = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - transformed = $append(transformed, new Vector([(0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]) + cp.X, (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1]) + cp.Y])); - _i++; - } - return transformed; - }; - ConvexPolygon.prototype.Transformed = function() { return this.$val.Transformed(); }; - ConvexPolygon.ptr.prototype.Bounds = function() { - var bottomRight, cp, i, point, topLeft, transformed, x, x$1; - cp = this; - transformed = cp.Transformed(); - topLeft = new Vector([(x = (0 >= transformed.$length ? ($throwRuntimeError("index out of range"), undefined) : transformed.$array[transformed.$offset + 0]), (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])), (x$1 = (0 >= transformed.$length ? ($throwRuntimeError("index out of range"), undefined) : transformed.$array[transformed.$offset + 0]), (1 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 1]))]); - bottomRight = topLeft.Clone(); - i = 0; - while (true) { - if (!(i < transformed.$length)) { break; } - point = ((i < 0 || i >= transformed.$length) ? ($throwRuntimeError("index out of range"), undefined) : transformed.$array[transformed.$offset + i]); - if ((0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]) < (0 >= topLeft.$length ? ($throwRuntimeError("index out of range"), undefined) : topLeft.$array[topLeft.$offset + 0])) { - (0 >= topLeft.$length ? ($throwRuntimeError("index out of range"), undefined) : topLeft.$array[topLeft.$offset + 0] = (0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0])); - } else if ((0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]) > (0 >= bottomRight.$length ? ($throwRuntimeError("index out of range"), undefined) : bottomRight.$array[bottomRight.$offset + 0])) { - (0 >= bottomRight.$length ? ($throwRuntimeError("index out of range"), undefined) : bottomRight.$array[bottomRight.$offset + 0] = (0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0])); - } - if ((1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1]) < (1 >= topLeft.$length ? ($throwRuntimeError("index out of range"), undefined) : topLeft.$array[topLeft.$offset + 1])) { - (1 >= topLeft.$length ? ($throwRuntimeError("index out of range"), undefined) : topLeft.$array[topLeft.$offset + 1] = (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1])); - } else if ((1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1]) > (1 >= bottomRight.$length ? ($throwRuntimeError("index out of range"), undefined) : bottomRight.$array[bottomRight.$offset + 1])) { - (1 >= bottomRight.$length ? ($throwRuntimeError("index out of range"), undefined) : bottomRight.$array[bottomRight.$offset + 1] = (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1])); - } - i = i + (1) >> 0; - } - return [topLeft, bottomRight]; - }; - ConvexPolygon.prototype.Bounds = function() { return this.$val.Bounds(); }; - ConvexPolygon.ptr.prototype.Position = function() { - var cp; - cp = this; - return [cp.X, cp.Y]; - }; - ConvexPolygon.prototype.Position = function() { return this.$val.Position(); }; - ConvexPolygon.ptr.prototype.SetPosition = function(x, y) { - var cp, x, y; - cp = this; - cp.X = x; - cp.Y = y; - }; - ConvexPolygon.prototype.SetPosition = function(x, y) { return this.$val.SetPosition(x, y); }; - ConvexPolygon.ptr.prototype.SetPositionVec = function(vec) { - var cp, vec; - cp = this; - cp.X = vec.X(); - cp.Y = vec.Y(); - }; - ConvexPolygon.prototype.SetPositionVec = function(vec) { return this.$val.SetPositionVec(vec); }; - ConvexPolygon.ptr.prototype.Move = function(x, y) { - var cp, x, y; - cp = this; - cp.X = cp.X + (x); - cp.Y = cp.Y + (y); - }; - ConvexPolygon.prototype.Move = function(x, y) { return this.$val.Move(x, y); }; - ConvexPolygon.ptr.prototype.MoveVec = function(vec) { - var cp, vec; - cp = this; - cp.X = cp.X + (vec.X()); - cp.Y = cp.Y + (vec.Y()); - }; - ConvexPolygon.prototype.MoveVec = function(vec) { return this.$val.MoveVec(vec); }; - ConvexPolygon.ptr.prototype.Center = function() { - var _i, _ref, cp, pos, v; - cp = this; - pos = new Vector([0, 0]); - _ref = cp.Transformed(); - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - v = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - pos.Add(new sliceType$4([v])); - _i++; - } - (0 >= pos.$length ? ($throwRuntimeError("index out of range"), undefined) : pos.$array[pos.$offset + 0] = (0 >= pos.$length ? ($throwRuntimeError("index out of range"), undefined) : pos.$array[pos.$offset + 0]) / ((cp.Transformed().$length))); - (1 >= pos.$length ? ($throwRuntimeError("index out of range"), undefined) : pos.$array[pos.$offset + 1] = (1 >= pos.$length ? ($throwRuntimeError("index out of range"), undefined) : pos.$array[pos.$offset + 1]) / ((cp.Transformed().$length))); - return pos; - }; - ConvexPolygon.prototype.Center = function() { return this.$val.Center(); }; - ConvexPolygon.ptr.prototype.Project = function(axis) { - var axis, cp, i, max, min, p, vertices, x, x$1, x$2, x$3; - cp = this; - axis = axis.Unit(); - vertices = cp.Transformed(); - min = axis.Dot(new Vector([(x = (0 >= vertices.$length ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + 0]), (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])), (x$1 = (0 >= vertices.$length ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + 0]), (1 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 1]))])); - max = min; - i = 1; - while (true) { - if (!(i < vertices.$length)) { break; } - p = axis.Dot(new Vector([(x$2 = ((i < 0 || i >= vertices.$length) ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + i]), (0 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 0])), (x$3 = ((i < 0 || i >= vertices.$length) ? ($throwRuntimeError("index out of range"), undefined) : vertices.$array[vertices.$offset + i]), (1 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 1]))])); - if (p < min) { - min = p; - } else if (p > max) { - max = p; - } - i = i + (1) >> 0; - } - return new Projection.ptr(min, max); - }; - ConvexPolygon.prototype.Project = function(axis) { return this.$val.Project(axis); }; - ConvexPolygon.ptr.prototype.SATAxes = function() { - var _i, _ref, axes, cp, line; - cp = this; - axes = new sliceType$4([]); - _ref = cp.Lines(); - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - line = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - axes = $append(axes, line.Normal()); - _i++; - } - return axes; - }; - ConvexPolygon.prototype.SATAxes = function() { return this.$val.SATAxes(); }; - ConvexPolygon.ptr.prototype.PointInside = function(point) { - var _i, _ref, contactCount, line, point, pointLine, polygon; - polygon = this; - pointLine = NewLine((0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]), (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1]), (0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]) + 9.99999999999e+11, (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1])); - contactCount = 0; - _ref = polygon.Lines(); - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - line = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (!(line.IntersectionPointsLine(pointLine) === Vector.nil)) { - contactCount = contactCount + (1) >> 0; - } - _i++; - } - return contactCount === 1; - }; - ConvexPolygon.prototype.PointInside = function(point) { return this.$val.PointInside(point); }; - NewContactSet = function() { - return new ContactSet.ptr(new sliceType$4([]), new Vector([0, 0]), new Vector([0, 0])); - }; - $pkg.NewContactSet = NewContactSet; - ContactSet.ptr.prototype.LeftmostPoint = function() { - var _i, _ref, cs, left, point; - cs = this; - left = Vector.nil; - _ref = cs.Points; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - point = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (left === Vector.nil || (0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]) < (0 >= left.$length ? ($throwRuntimeError("index out of range"), undefined) : left.$array[left.$offset + 0])) { - left = point; - } - _i++; - } - return left; - }; - ContactSet.prototype.LeftmostPoint = function() { return this.$val.LeftmostPoint(); }; - ContactSet.ptr.prototype.RightmostPoint = function() { - var _i, _ref, cs, point, right; - cs = this; - right = Vector.nil; - _ref = cs.Points; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - point = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (right === Vector.nil || (0 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 0]) > (0 >= right.$length ? ($throwRuntimeError("index out of range"), undefined) : right.$array[right.$offset + 0])) { - right = point; - } - _i++; - } - return right; - }; - ContactSet.prototype.RightmostPoint = function() { return this.$val.RightmostPoint(); }; - ContactSet.ptr.prototype.TopmostPoint = function() { - var _i, _ref, cs, point, top; - cs = this; - top = Vector.nil; - _ref = cs.Points; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - point = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (top === Vector.nil || (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1]) < (1 >= top.$length ? ($throwRuntimeError("index out of range"), undefined) : top.$array[top.$offset + 1])) { - top = point; - } - _i++; - } - return top; - }; - ContactSet.prototype.TopmostPoint = function() { return this.$val.TopmostPoint(); }; - ContactSet.ptr.prototype.BottommostPoint = function() { - var _i, _ref, bottom, cs, point; - cs = this; - bottom = Vector.nil; - _ref = cs.Points; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - point = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (bottom === Vector.nil || (1 >= point.$length ? ($throwRuntimeError("index out of range"), undefined) : point.$array[point.$offset + 1]) > (1 >= bottom.$length ? ($throwRuntimeError("index out of range"), undefined) : bottom.$array[bottom.$offset + 1])) { - bottom = point; - } - _i++; - } - return bottom; - }; - ContactSet.prototype.BottommostPoint = function() { return this.$val.BottommostPoint(); }; - ConvexPolygon.ptr.prototype.Intersection = function(dx, dy, other) { - var _i, _i$1, _i$2, _i$3, _ref, _ref$1, _ref$2, _ref$3, _tuple, _tuple$1, circle, contactSet, cp, deltaMagnitude, dx, dy, isCircle, isPoly, line, line$1, mtv, ogMagnitude, ogX, ogY, other, otherLine, point, point$1, poly, x, x$1, x$2, x$3; - cp = this; - contactSet = NewContactSet(); - ogX = cp.X; - ogY = cp.Y; - cp.X = cp.X + (dx); - cp.Y = cp.Y + (dy); - _tuple = $assertType(other, ptrType$4, true); - circle = _tuple[0]; - isCircle = _tuple[1]; - if (isCircle) { - _ref = cp.Lines(); - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - line = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - contactSet.Points = $appendSlice(contactSet.Points, line.IntersectionPointsCircle(circle)); - _i++; - } - } else { - _tuple$1 = $assertType(other, ptrType$5, true); - poly = _tuple$1[0]; - isPoly = _tuple$1[1]; - if (isPoly) { - _ref$1 = cp.Lines(); - _i$1 = 0; - while (true) { - if (!(_i$1 < _ref$1.$length)) { break; } - line$1 = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); - _ref$2 = poly.Lines(); - _i$2 = 0; - while (true) { - if (!(_i$2 < _ref$2.$length)) { break; } - otherLine = ((_i$2 < 0 || _i$2 >= _ref$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$2.$array[_ref$2.$offset + _i$2]); - point = line$1.IntersectionPointsLine(otherLine); - if (!(point === Vector.nil)) { - contactSet.Points = $append(contactSet.Points, point); - } - _i$2++; - } - _i$1++; - } - } - } - if (contactSet.Points.$length > 0) { - _ref$3 = contactSet.Points; - _i$3 = 0; - while (true) { - if (!(_i$3 < _ref$3.$length)) { break; } - point$1 = ((_i$3 < 0 || _i$3 >= _ref$3.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$3.$array[_ref$3.$offset + _i$3]); - contactSet.Center = contactSet.Center.Add(new sliceType$4([point$1])); - _i$3++; - } - (x$1 = contactSet.Center, (0 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 0] = (x = contactSet.Center, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])) / ((contactSet.Points.$length)))); - (x$3 = contactSet.Center, (1 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 1] = (x$2 = contactSet.Center, (1 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 1])) / ((contactSet.Points.$length)))); - mtv = cp.calculateMTV(contactSet, other); - if (!(mtv === Vector.nil)) { - contactSet.MTV = mtv; - } - } else { - contactSet = ptrType$6.nil; - } - if (!(contactSet === ptrType$6.nil) && (!((dx === 0)) || !((dy === 0)))) { - deltaMagnitude = new Vector([dx, dy]).Magnitude(); - ogMagnitude = contactSet.MTV.Magnitude(); - contactSet.MTV = contactSet.MTV.Unit().Scale(ogMagnitude - deltaMagnitude); - } - cp.X = ogX; - cp.Y = ogY; - return contactSet; - }; - ConvexPolygon.prototype.Intersection = function(dx, dy, other) { return this.$val.Intersection(dx, dy, other); }; - ConvexPolygon.ptr.prototype.calculateMTV = function(contactSet, otherShape) { - var _i, _i$1, _ref, _ref$1, _ref$2, axis, axis$1, contactSet, cp, delta, other, otherShape, overlap, overlap$1, smallest; - cp = this; - delta = new Vector([0, 0]); - smallest = new Vector([1.7976931348623157e+308, 0]); - _ref = otherShape; - if ($assertType(_ref, ptrType$5, true)[1]) { - other = _ref.$val; - _ref$1 = cp.SATAxes(); - _i = 0; - while (true) { - if (!(_i < _ref$1.$length)) { break; } - axis = ((_i < 0 || _i >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i]); - if (!$clone(cp.Project(axis), Projection).Overlapping($clone(other.Project(axis), Projection))) { - return Vector.nil; - } - overlap = $clone(cp.Project(axis), Projection).Overlap($clone(other.Project(axis), Projection)); - if (smallest.Magnitude() > overlap) { - smallest = axis.Scale(overlap); - } - _i++; - } - _ref$2 = other.SATAxes(); - _i$1 = 0; - while (true) { - if (!(_i$1 < _ref$2.$length)) { break; } - axis$1 = ((_i$1 < 0 || _i$1 >= _ref$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$2.$array[_ref$2.$offset + _i$1]); - if (!$clone(cp.Project(axis$1), Projection).Overlapping($clone(other.Project(axis$1), Projection))) { - return Vector.nil; - } - overlap$1 = $clone(cp.Project(axis$1), Projection).Overlap($clone(other.Project(axis$1), Projection)); - if (smallest.Magnitude() > overlap$1) { - smallest = axis$1.Scale(overlap$1); - } - _i$1++; - } - } - (0 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 0] = (0 >= smallest.$length ? ($throwRuntimeError("index out of range"), undefined) : smallest.$array[smallest.$offset + 0])); - (1 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 1] = (1 >= smallest.$length ? ($throwRuntimeError("index out of range"), undefined) : smallest.$array[smallest.$offset + 1])); - return delta; - }; - ConvexPolygon.prototype.calculateMTV = function(contactSet, otherShape) { return this.$val.calculateMTV(contactSet, otherShape); }; - ConvexPolygon.ptr.prototype.ContainedBy = function(otherShape) { - var _i, _i$1, _ref, _ref$1, _ref$2, axis, axis$1, cp, other, otherShape; - cp = this; - _ref = otherShape; - if ($assertType(_ref, ptrType$5, true)[1]) { - other = _ref.$val; - _ref$1 = cp.SATAxes(); - _i = 0; - while (true) { - if (!(_i < _ref$1.$length)) { break; } - axis = ((_i < 0 || _i >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i]); - if (!$clone(cp.Project(axis), Projection).IsInside($clone(other.Project(axis), Projection))) { - return false; - } - _i++; - } - _ref$2 = other.SATAxes(); - _i$1 = 0; - while (true) { - if (!(_i$1 < _ref$2.$length)) { break; } - axis$1 = ((_i$1 < 0 || _i$1 >= _ref$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$2.$array[_ref$2.$offset + _i$1]); - if (!$clone(cp.Project(axis$1), Projection).IsInside($clone(other.Project(axis$1), Projection))) { - return false; - } - _i$1++; - } - } - return true; - }; - ConvexPolygon.prototype.ContainedBy = function(otherShape) { return this.$val.ContainedBy(otherShape); }; - ConvexPolygon.ptr.prototype.FlipH = function() { - var _i, _ref, cp, v; - cp = this; - _ref = cp.Points; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - v = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - (0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0] = -(0 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 0])); - _i++; - } - cp.ReverseVertexOrder(); - }; - ConvexPolygon.prototype.FlipH = function() { return this.$val.FlipH(); }; - ConvexPolygon.ptr.prototype.FlipV = function() { - var _i, _ref, cp, v; - cp = this; - _ref = cp.Points; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - v = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - (1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1] = -(1 >= v.$length ? ($throwRuntimeError("index out of range"), undefined) : v.$array[v.$offset + 1])); - _i++; - } - cp.ReverseVertexOrder(); - }; - ConvexPolygon.prototype.FlipV = function() { return this.$val.FlipV(); }; - ConvexPolygon.ptr.prototype.ReverseVertexOrder = function() { - var cp, i, verts, x, x$1; - cp = this; - verts = new sliceType$4([(x = cp.Points, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0]))]); - i = cp.Points.$length - 1 >> 0; - while (true) { - if (!(i >= 1)) { break; } - verts = $append(verts, (x$1 = cp.Points, ((i < 0 || i >= x$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + i]))); - i = i - (1) >> 0; - } - cp.Points = verts; - }; - ConvexPolygon.prototype.ReverseVertexOrder = function() { return this.$val.ReverseVertexOrder(); }; - NewRectangle = function(x, y, w, h) { - var h, w, x, y; - return NewConvexPolygon(new sliceType([x, y, x + w, y, x + w, y + h, x, y + h])); - }; - $pkg.NewRectangle = NewRectangle; - NewCircle = function(x, y, radius) { - var circle, radius, x, y; - circle = new Circle.ptr(x, y, radius); - return circle; - }; - $pkg.NewCircle = NewCircle; - Circle.ptr.prototype.Clone = function() { - var circle; - circle = this; - return NewCircle(circle.X, circle.Y, circle.Radius); - }; - Circle.prototype.Clone = function() { return this.$val.Clone(); }; - Circle.ptr.prototype.Bounds = function() { - var circle; - circle = this; - return [new Vector([circle.X - circle.Radius, circle.Y - circle.Radius]), new Vector([circle.X + circle.Radius, circle.Y + circle.Radius])]; - }; - Circle.prototype.Bounds = function() { return this.$val.Bounds(); }; - Circle.ptr.prototype.Intersection = function(dx, dy, other) { - var _i, _ref, _ref$1, circle, contactSet, dist, dx, dy, other, ox, oy, point, shape, shape$1, x, x$1, x$2, x$3; - circle = this; - contactSet = ptrType$6.nil; - ox = circle.X; - oy = circle.Y; - circle.X = circle.X + (dx); - circle.Y = circle.Y + (dy); - _ref = other; - if ($assertType(_ref, ptrType$5, true)[1]) { - shape = _ref.$val; - contactSet = shape.Intersection(-dx, -dy, circle); - if (!(contactSet === ptrType$6.nil)) { - contactSet.MTV = contactSet.MTV.Scale(-1); - } - } else if ($assertType(_ref, ptrType$4, true)[1]) { - shape$1 = _ref.$val; - contactSet = NewContactSet(); - contactSet.Points = circle.IntersectionPointsCircle(shape$1); - if (contactSet.Points.$length === 0) { - return ptrType$6.nil; - } - contactSet.MTV = new Vector([circle.X - shape$1.X, circle.Y - shape$1.Y]); - dist = contactSet.MTV.Magnitude(); - contactSet.MTV = contactSet.MTV.Unit().Scale(circle.Radius + shape$1.Radius - dist); - _ref$1 = contactSet.Points; - _i = 0; - while (true) { - if (!(_i < _ref$1.$length)) { break; } - point = ((_i < 0 || _i >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i]); - contactSet.Center = contactSet.Center.Add(new sliceType$4([point])); - _i++; - } - (x$1 = contactSet.Center, (0 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 0] = (x = contactSet.Center, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])) / ((contactSet.Points.$length)))); - (x$3 = contactSet.Center, (1 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 1] = (x$2 = contactSet.Center, (1 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 1])) / ((contactSet.Points.$length)))); - } - circle.X = ox; - circle.Y = oy; - return contactSet; - }; - Circle.prototype.Intersection = function(dx, dy, other) { return this.$val.Intersection(dx, dy, other); }; - Circle.ptr.prototype.Move = function(x, y) { - var circle, x, y; - circle = this; - circle.X = circle.X + (x); - circle.Y = circle.Y + (y); - }; - Circle.prototype.Move = function(x, y) { return this.$val.Move(x, y); }; - Circle.ptr.prototype.MoveVec = function(vec) { - var circle, vec; - circle = this; - circle.X = circle.X + (vec.X()); - circle.Y = circle.Y + (vec.Y()); - }; - Circle.prototype.MoveVec = function(vec) { return this.$val.MoveVec(vec); }; - Circle.ptr.prototype.SetPosition = function(x, y) { - var circle, x, y; - circle = this; - circle.X = x; - circle.Y = y; - }; - Circle.prototype.SetPosition = function(x, y) { return this.$val.SetPosition(x, y); }; - Circle.ptr.prototype.SetPositionVec = function(vec) { - var circle, vec; - circle = this; - circle.X = vec.X(); - circle.Y = vec.Y(); - }; - Circle.prototype.SetPositionVec = function(vec) { return this.$val.SetPositionVec(vec); }; - Circle.ptr.prototype.Position = function() { - var circle; - circle = this; - return [circle.X, circle.Y]; - }; - Circle.prototype.Position = function() { return this.$val.Position(); }; - Circle.ptr.prototype.PointInside = function(point) { - var circle, point; - circle = this; - return point.Sub(new sliceType$4([new Vector([circle.X, circle.Y])])).Magnitude() <= circle.Radius; - }; - Circle.prototype.PointInside = function(point) { return this.$val.PointInside(point); }; - Circle.ptr.prototype.IntersectionPointsCircle = function(other) { - var a, circle, d, h, other, x2, y2; - circle = this; - d = math.Sqrt(math.Pow(other.X - circle.X, 2) + math.Pow(other.Y - circle.Y, 2)); - if (d > circle.Radius + other.Radius || d < math.Abs(circle.Radius - other.Radius) || (d === 0) && (circle.Radius === other.Radius)) { - return sliceType$4.nil; - } - a = (math.Pow(circle.Radius, 2) - math.Pow(other.Radius, 2) + math.Pow(d, 2)) / (2 * d); - h = math.Sqrt(math.Pow(circle.Radius, 2) - math.Pow(a, 2)); - x2 = circle.X + a * (other.X - circle.X) / d; - y2 = circle.Y + a * (other.Y - circle.Y) / d; - return new sliceType$4([new Vector([x2 + h * (other.Y - circle.Y) / d, y2 - h * (other.X - circle.X) / d]), new Vector([x2 - h * (other.Y - circle.Y) / d, y2 + h * (other.X - circle.X) / d])]); - }; - Circle.prototype.IntersectionPointsCircle = function(other) { return this.$val.IntersectionPointsCircle(other); }; - Projection.ptr.prototype.Overlapping = function(other) { - var other, projection; - projection = this; - return $clone(projection, Projection).Overlap($clone(other, Projection)) > 0; - }; - Projection.prototype.Overlapping = function(other) { return this.$val.Overlapping(other); }; - Projection.ptr.prototype.Overlap = function(other) { - var other, projection; - projection = this; - return math.Min(projection.Max, other.Max) - math.Max(projection.Min, other.Min); - }; - Projection.prototype.Overlap = function(other) { return this.$val.Overlap(other); }; - Projection.ptr.prototype.IsInside = function(other) { - var other, projection; - projection = this; - return projection.Min >= other.Min && projection.Max <= other.Max; - }; - Projection.prototype.IsInside = function(other) { return this.$val.IsInside(other); }; - NewObject = function(x, y, w, h, tags) { - var h, o, tags, w, x, y; - o = new Object.ptr($ifaceNil, ptrType$1.nil, x, y, w, h, sliceType$1.nil, $ifaceNil, $makeMap(ptrType$2.keyFor, []), new sliceType$6([])); - if (tags.$length > 0) { - o.AddTags(tags); - } - return o; - }; - $pkg.NewObject = NewObject; - Object.ptr.prototype.Clone = function() { - var {_entry, _i, _keys, _r, _ref, k, newObj, obj, $s, $r, $c} = $restore(this, {}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - obj = this; - newObj = NewObject(obj.X, obj.Y, obj.W, obj.H, obj.Tags()); - newObj.Data = obj.Data; - /* */ if (!($interfaceIsEqual(obj.Shape, $ifaceNil))) { $s = 1; continue; } - /* */ $s = 2; continue; - /* if (!($interfaceIsEqual(obj.Shape, $ifaceNil))) { */ case 1: - _r = obj.Shape.Clone(); /* */ $s = 3; case 3: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - $r = newObj.SetShape(_r); /* */ $s = 4; case 4: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - /* } */ case 2: - _ref = obj.ignoreList; - _i = 0; - _keys = $keys(_ref); - while (true) { - if (!(_i < _keys.length)) { break; } - _entry = _ref[_keys[_i]]; - if (_entry === undefined) { - _i++; - continue; - } - k = _entry.k; - newObj.AddToIgnoreList(k); - _i++; - } - $s = -1; return newObj; - /* */ } return; } var $f = {$blk: Object.ptr.prototype.Clone, $c: true, $r, _entry, _i, _keys, _r, _ref, k, newObj, obj, $s};return $f; - }; - Object.prototype.Clone = function() { return this.$val.Clone(); }; - Object.ptr.prototype.Update = function() { - var {_tuple, c, cx, cy, ex, ey, obj, space, x, y, $s, $r, $c} = $restore(this, {}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - obj = this; - if (!(obj.Space === ptrType$1.nil)) { - space = obj.Space; - obj.Space.Remove(new sliceType$3([obj])); - obj.Space = space; - _tuple = obj.BoundsToSpace(0, 0); - cx = _tuple[0]; - cy = _tuple[1]; - ex = _tuple[2]; - ey = _tuple[3]; - y = cy; - while (true) { - if (!(y <= ey)) { break; } - x = cx; - while (true) { - if (!(x <= ex)) { break; } - c = obj.Space.Cell(x, y); - if (!(c === ptrType.nil)) { - c.register(obj); - obj.TouchingCells = $append(obj.TouchingCells, c); - } - x = x + (1) >> 0; - } - y = y + (1) >> 0; - } - } - /* */ if (!($interfaceIsEqual(obj.Shape, $ifaceNil))) { $s = 1; continue; } - /* */ $s = 2; continue; - /* if (!($interfaceIsEqual(obj.Shape, $ifaceNil))) { */ case 1: - $r = obj.Shape.SetPosition(obj.X, obj.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: Object.ptr.prototype.Update, $c: true, $r, _tuple, c, cx, cy, ex, ey, obj, space, x, y, $s};return $f; - }; - Object.prototype.Update = function() { return this.$val.Update(); }; - Object.ptr.prototype.AddTags = function(tags) { - var obj, tags; - obj = this; - obj.tags = $appendSlice(obj.tags, tags); - }; - Object.prototype.AddTags = function(tags) { return this.$val.AddTags(tags); }; - Object.ptr.prototype.RemoveTags = function(tags) { - var _i, _i$1, _ref, _ref$1, i, obj, t, tag, tags; - obj = this; - _ref = tags; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - tag = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - _ref$1 = obj.tags; - _i$1 = 0; - while (true) { - if (!(_i$1 < _ref$1.$length)) { break; } - i = _i$1; - t = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); - if (t === tag) { - obj.tags = $appendSlice($subslice(obj.tags, 0, i), $subslice(obj.tags, (i + 1 >> 0))); - break; - } - _i$1++; - } - _i++; - } - }; - Object.prototype.RemoveTags = function(tags) { return this.$val.RemoveTags(tags); }; - Object.ptr.prototype.HasTags = function(tags) { - var _i, _i$1, _ref, _ref$1, obj, t, tag, tags; - obj = this; - _ref = tags; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - tag = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - _ref$1 = obj.tags; - _i$1 = 0; - while (true) { - if (!(_i$1 < _ref$1.$length)) { break; } - t = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); - if (t === tag) { - return true; - } - _i$1++; - } - _i++; - } - return false; - }; - Object.prototype.HasTags = function(tags) { return this.$val.HasTags(tags); }; - Object.ptr.prototype.Tags = function() { - var obj; - obj = this; - return $appendSlice(new sliceType$6([]), obj.tags); - }; - Object.prototype.Tags = function() { return this.$val.Tags(); }; - Object.ptr.prototype.SetShape = function(shape) { - var {obj, shape, $s, $r, $c} = $restore(this, {shape}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - obj = this; - /* */ if (!($interfaceIsEqual(obj.Shape, shape))) { $s = 1; continue; } - /* */ $s = 2; continue; - /* if (!($interfaceIsEqual(obj.Shape, shape))) { */ case 1: - obj.Shape = shape; - $r = obj.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: Object.ptr.prototype.SetShape, $c: true, $r, obj, shape, $s};return $f; - }; - Object.prototype.SetShape = function(shape) { return this.$val.SetShape(shape); }; - Object.ptr.prototype.BoundsToSpace = function(dx, dy) { - var _tuple, _tuple$1, cx, cy, dx, dy, ex, ey, obj; - obj = this; - _tuple = obj.Space.WorldToSpace(obj.X + dx, obj.Y + dy); - cx = _tuple[0]; - cy = _tuple[1]; - _tuple$1 = obj.Space.WorldToSpace(obj.X + obj.W + dx - 1, obj.Y + obj.H + dy - 1); - ex = _tuple$1[0]; - ey = _tuple$1[1]; - return [cx, cy, ex, ey]; - }; - Object.prototype.BoundsToSpace = function(dx, dy) { return this.$val.BoundsToSpace(dx, dy); }; - Object.ptr.prototype.SharesCells = function(other) { - var _i, _ref, cell, obj, other; - obj = this; - _ref = obj.TouchingCells; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - cell = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (cell.Contains(other)) { - return true; - } - _i++; - } - return false; - }; - Object.prototype.SharesCells = function(other) { return this.$val.SharesCells(other); }; - Object.ptr.prototype.SharesCellsTags = function(tags) { - var _i, _ref, cell, obj, tags; - obj = this; - _ref = obj.TouchingCells; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - cell = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (cell.ContainsTags(tags)) { - return true; - } - _i++; - } - return false; - }; - Object.prototype.SharesCellsTags = function(tags) { return this.$val.SharesCellsTags(tags); }; - Object.ptr.prototype.Center = function() { - var obj; - obj = this; - return [obj.X + (obj.W / 2), obj.Y + (obj.H / 2)]; - }; - Object.prototype.Center = function() { return this.$val.Center(); }; - Object.ptr.prototype.SetCenter = function(x, y) { - var obj, x, y; - obj = this; - obj.X = x - (obj.W / 2); - obj.Y = y - (obj.H / 2); - }; - Object.prototype.SetCenter = function(x, y) { return this.$val.SetCenter(x, y); }; - Object.ptr.prototype.CellPosition = function() { - var _tuple, obj; - obj = this; - _tuple = obj.Center(); - return obj.Space.WorldToSpace(_tuple[0], _tuple[1]); - }; - Object.prototype.CellPosition = function() { return this.$val.CellPosition(); }; - Object.ptr.prototype.SetRight = function(x) { - var obj, x; - obj = this; - obj.X = x - obj.W; - }; - Object.prototype.SetRight = function(x) { return this.$val.SetRight(x); }; - Object.ptr.prototype.SetBottom = function(y) { - var obj, y; - obj = this; - obj.Y = y - obj.H; - }; - Object.prototype.SetBottom = function(y) { return this.$val.SetBottom(y); }; - Object.ptr.prototype.Bottom = function() { - var obj; - obj = this; - return obj.Y + obj.H; - }; - Object.prototype.Bottom = function() { return this.$val.Bottom(); }; - Object.ptr.prototype.Right = function() { - var obj; - obj = this; - return obj.X + obj.W; - }; - Object.prototype.Right = function() { return this.$val.Right(); }; - Object.ptr.prototype.SetBounds = function(topLeft, bottomRight) { - var bottomRight, obj, topLeft; - obj = this; - obj.X = (0 >= topLeft.$length ? ($throwRuntimeError("index out of range"), undefined) : topLeft.$array[topLeft.$offset + 0]); - obj.Y = (1 >= topLeft.$length ? ($throwRuntimeError("index out of range"), undefined) : topLeft.$array[topLeft.$offset + 1]); - obj.W = (0 >= bottomRight.$length ? ($throwRuntimeError("index out of range"), undefined) : bottomRight.$array[bottomRight.$offset + 0]) - obj.X; - obj.H = (1 >= bottomRight.$length ? ($throwRuntimeError("index out of range"), undefined) : bottomRight.$array[bottomRight.$offset + 1]) - obj.Y; - }; - Object.prototype.SetBounds = function(topLeft, bottomRight) { return this.$val.SetBounds(topLeft, bottomRight); }; - Object.ptr.prototype.Check = function(dx, dy, tags) { - var _entry, _entry$1, _entry$2, _i, _key, _key$1, _ref, _tuple, _tuple$1, _tuple$2, added, added$1, c, cc, cellsAdded, cx, cy, dx, dy, ex, ey, ignored, o, obj, objectsAdded, tags, x, y; - obj = this; - if (obj.Space === ptrType$1.nil) { - return ptrType$7.nil; - } - cc = NewCollision(); - cc.checkingObject = obj; - if (dx < 0) { - dx = math.Min(dx, -1); - } else if (dx > 0) { - dx = math.Max(dx, 1); - } - if (dy < 0) { - dy = math.Min(dy, -1); - } else if (dy > 0) { - dy = math.Max(dy, 1); - } - cc.dx = dx; - cc.dy = dy; - _tuple = obj.BoundsToSpace(dx, dy); - cx = _tuple[0]; - cy = _tuple[1]; - ex = _tuple[2]; - ey = _tuple[3]; - objectsAdded = $makeMap(ptrType$2.keyFor, []); - cellsAdded = $makeMap(ptrType.keyFor, []); - y = cy; - while (true) { - if (!(y <= ey)) { break; } - x = cx; - while (true) { - if (!(x <= ex)) { break; } - c = obj.Space.Cell(x, y); - if (!(c === ptrType.nil)) { - _ref = c.Objects; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - o = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - ignored = (_entry = obj.ignoreList[ptrType$2.keyFor(o)], _entry !== undefined ? _entry.v : false); - if (o === obj || ignored) { - _i++; - continue; - } - _tuple$1 = (_entry$1 = objectsAdded[ptrType$2.keyFor(o)], _entry$1 !== undefined ? [_entry$1.v, true] : [false, false]); - added = _tuple$1[1]; - if (((tags.$length === 0) || o.HasTags(tags)) && !added) { - cc.Objects = $append(cc.Objects, o); - _key = o; (objectsAdded || $throwRuntimeError("assignment to entry in nil map"))[ptrType$2.keyFor(_key)] = { k: _key, v: true }; - _tuple$2 = (_entry$2 = cellsAdded[ptrType.keyFor(c)], _entry$2 !== undefined ? [_entry$2.v, true] : [false, false]); - added$1 = _tuple$2[1]; - if (!added$1) { - cc.Cells = $append(cc.Cells, c); - _key$1 = c; (cellsAdded || $throwRuntimeError("assignment to entry in nil map"))[ptrType.keyFor(_key$1)] = { k: _key$1, v: true }; - } - _i++; - continue; - } - _i++; - } - } - x = x + (1) >> 0; - } - y = y + (1) >> 0; - } - if (cc.Objects.$length === 0) { - return ptrType$7.nil; - } - return cc; - }; - Object.prototype.Check = function(dx, dy, tags) { return this.$val.Check(dx, dy, tags); }; - Object.ptr.prototype.Overlaps = function(other) { - var obj, other; - obj = this; - return other.X <= obj.X + obj.W && other.X + other.W >= obj.X && other.Y <= obj.Y + obj.H && other.Y + other.H >= obj.Y; - }; - Object.prototype.Overlaps = function(other) { return this.$val.Overlaps(other); }; - Object.ptr.prototype.AddToIgnoreList = function(ignoreObj) { - var _key, ignoreObj, obj; - obj = this; - _key = ignoreObj; (obj.ignoreList || $throwRuntimeError("assignment to entry in nil map"))[ptrType$2.keyFor(_key)] = { k: _key, v: true }; - }; - Object.prototype.AddToIgnoreList = function(ignoreObj) { return this.$val.AddToIgnoreList(ignoreObj); }; - Object.ptr.prototype.RemoveFromIgnoreList = function(ignoreObj) { - var ignoreObj, obj; - obj = this; - delete obj.ignoreList[ptrType$2.keyFor(ignoreObj)]; - }; - Object.prototype.RemoveFromIgnoreList = function(ignoreObj) { return this.$val.RemoveFromIgnoreList(ignoreObj); }; - axpyUnitaryTo = function(dst, alpha, x, y) { - var _i, _ref, alpha, dim, dst, i, v, x, y; - dim = y.$length; - _ref = x; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - i = _i; - v = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (i === dim) { - return; - } - ((i < 0 || i >= dst.$length) ? ($throwRuntimeError("index out of range"), undefined) : dst.$array[dst.$offset + i] = alpha * v + ((i < 0 || i >= y.$length) ? ($throwRuntimeError("index out of range"), undefined) : y.$array[y.$offset + i])); - _i++; - } - }; - scalUnitaryTo = function(dst, alpha, x) { - var _i, _ref, alpha, dst, i, x; - _ref = x; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - i = _i; - ((i < 0 || i >= dst.$length) ? ($throwRuntimeError("index out of range"), undefined) : dst.$array[dst.$offset + i] = ((i < 0 || i >= dst.$length) ? ($throwRuntimeError("index out of range"), undefined) : dst.$array[dst.$offset + i]) * (alpha)); - _i++; - } - }; - NewCollision = function() { - return new Collision.ptr(ptrType$2.nil, 0, 0, new sliceType$3([]), sliceType$1.nil); - }; - $pkg.NewCollision = NewCollision; - Collision.ptr.prototype.HasTags = function(tags) { - var _i, _ref, cc, o, tags; - cc = this; - _ref = cc.Objects; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - o = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (o === cc.checkingObject) { - _i++; - continue; - } - if (o.HasTags(tags)) { - return true; - } - _i++; - } - return false; - }; - Collision.prototype.HasTags = function(tags) { return this.$val.HasTags(tags); }; - Collision.ptr.prototype.ObjectsByTags = function(tags) { - var _i, _ref, cc, o, objects, tags; - cc = this; - objects = new sliceType$3([]); - _ref = cc.Objects; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - o = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (o === cc.checkingObject) { - _i++; - continue; - } - if (o.HasTags(tags)) { - objects = $append(objects, o); - } - _i++; - } - return objects; - }; - Collision.prototype.ObjectsByTags = function(tags) { return this.$val.ObjectsByTags(tags); }; - Collision.ptr.prototype.ContactWithObject = function(object) { - var cc, delta, object; - cc = this; - delta = new Vector([0, 0]); - if (cc.dx < 0) { - (0 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 0] = object.X + object.W - cc.checkingObject.X); - } else if (cc.dx > 0) { - (0 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 0] = object.X - cc.checkingObject.W - cc.checkingObject.X); - } - if (cc.dy < 0) { - (1 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 1] = object.Y + object.H - cc.checkingObject.Y); - } else if (cc.dy > 0) { - (1 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 1] = object.Y - cc.checkingObject.H - cc.checkingObject.Y); - } - return delta; - }; - Collision.prototype.ContactWithObject = function(object) { return this.$val.ContactWithObject(object); }; - Collision.ptr.prototype.ContactWithCell = function(cell) { - var cc, cell, cx, cy, delta; - cc = this; - delta = new Vector([0, 0]); - cx = (($imul(cell.X, cc.checkingObject.Space.CellWidth))); - cy = (($imul(cell.Y, cc.checkingObject.Space.CellHeight))); - if (cc.dx < 0) { - (0 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 0] = cx + (cc.checkingObject.Space.CellWidth) - cc.checkingObject.X); - } else if (cc.dx > 0) { - (0 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 0] = cx - cc.checkingObject.W - cc.checkingObject.X); - } - if (cc.dy < 0) { - (1 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 1] = cy + (cc.checkingObject.Space.CellHeight) - cc.checkingObject.Y); - } else if (cc.dy > 0) { - (1 >= delta.$length ? ($throwRuntimeError("index out of range"), undefined) : delta.$array[delta.$offset + 1] = cy - cc.checkingObject.H - cc.checkingObject.Y); - } - return delta; - }; - Collision.prototype.ContactWithCell = function(cell) { return this.$val.ContactWithCell(cell); }; - Collision.ptr.prototype.SlideAgainstCell = function(cell, avoidTags) { - var _tuple, _tuple$1, avoidTags, cc, ccX, ccY, cell, collidingCell, diffX, diffY, down, hX, hY, left, oX, oY, right, slide, sp, up, x; - cc = this; - sp = cc.checkingObject.Space; - collidingCell = (x = cc.Cells, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])); - _tuple = sp.SpaceToWorld(collidingCell.X, collidingCell.Y); - ccX = _tuple[0]; - ccY = _tuple[1]; - hX = (sp.CellWidth) / 2; - hY = (sp.CellHeight) / 2; - ccX = ccX + (hX); - ccY = ccY + (hY); - _tuple$1 = cc.checkingObject.Center(); - oX = _tuple$1[0]; - oY = _tuple$1[1]; - diffX = oX - ccX; - diffY = oY - ccY; - left = sp.Cell(collidingCell.X - 1 >> 0, collidingCell.Y); - right = sp.Cell(collidingCell.X + 1 >> 0, collidingCell.Y); - up = sp.Cell(collidingCell.X, collidingCell.Y - 1 >> 0); - down = sp.Cell(collidingCell.X, collidingCell.Y + 1 >> 0); - slide = new Vector([0, 0]); - if (!((cc.dy === 0))) { - if (diffX > 0 && (right === ptrType.nil || !right.ContainsTags(avoidTags))) { - (0 >= slide.$length ? ($throwRuntimeError("index out of range"), undefined) : slide.$array[slide.$offset + 0] = ccX + hX - cc.checkingObject.X); - } else if (diffX < 0 && (left === ptrType.nil || !left.ContainsTags(avoidTags))) { - (0 >= slide.$length ? ($throwRuntimeError("index out of range"), undefined) : slide.$array[slide.$offset + 0] = ccX - hX - (cc.checkingObject.X + cc.checkingObject.W)); - } else { - return Vector.nil; - } - } - if (!((cc.dx === 0))) { - if (diffY > 0 && (down === ptrType.nil || !down.ContainsTags(avoidTags))) { - (1 >= slide.$length ? ($throwRuntimeError("index out of range"), undefined) : slide.$array[slide.$offset + 1] = ccY + hY - cc.checkingObject.Y); - } else if (diffY < 0 && (up === ptrType.nil || !up.ContainsTags(avoidTags))) { - (1 >= slide.$length ? ($throwRuntimeError("index out of range"), undefined) : slide.$array[slide.$offset + 1] = ccY - hY - (cc.checkingObject.Y + cc.checkingObject.H)); - } else { - return Vector.nil; - } - } - return slide; - }; - Collision.prototype.SlideAgainstCell = function(cell, avoidTags) { return this.$val.SlideAgainstCell(cell, avoidTags); }; - newCell = function(x, y) { - var x, y; - return new Cell.ptr(x, y, new sliceType$3([])); - }; - Cell.ptr.prototype.register = function(obj) { - var cell, obj; - cell = this; - if (!cell.Contains(obj)) { - cell.Objects = $append(cell.Objects, obj); - } - }; - Cell.prototype.register = function(obj) { return this.$val.register(obj); }; - Cell.ptr.prototype.unregister = function(obj) { - var _i, _ref, cell, i, o, obj, x, x$1, x$2; - cell = this; - _ref = cell.Objects; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - i = _i; - o = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (o === obj) { - (x$2 = cell.Objects, ((i < 0 || i >= x$2.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + i] = (x = cell.Objects, x$1 = cell.Objects.$length - 1 >> 0, ((x$1 < 0 || x$1 >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + x$1])))); - cell.Objects = $subslice(cell.Objects, 0, (cell.Objects.$length - 1 >> 0)); - break; - } - _i++; - } - }; - Cell.prototype.unregister = function(obj) { return this.$val.unregister(obj); }; - Cell.ptr.prototype.Contains = function(obj) { - var _i, _ref, cell, o, obj; - cell = this; - _ref = cell.Objects; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - o = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (o === obj) { - return true; - } - _i++; - } - return false; - }; - Cell.prototype.Contains = function(obj) { return this.$val.Contains(obj); }; - Cell.ptr.prototype.ContainsTags = function(tags) { - var _i, _ref, cell, o, tags; - cell = this; - _ref = cell.Objects; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - o = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (o.HasTags(tags)) { - return true; - } - _i++; - } - return false; - }; - Cell.prototype.ContainsTags = function(tags) { return this.$val.ContainsTags(tags); }; - Cell.ptr.prototype.Occupied = function() { - var cell; - cell = this; - return cell.Objects.$length > 0; - }; - Cell.prototype.Occupied = function() { return this.$val.Occupied(); }; - Vector.methods = [{prop: "Clone", name: "Clone", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "Add", name: "Add", pkg: "", typ: $funcType([sliceType$4], [Vector], true)}, {prop: "Sub", name: "Sub", pkg: "", typ: $funcType([sliceType$4], [Vector], true)}, {prop: "Scale", name: "Scale", pkg: "", typ: $funcType([$Float64], [Vector], false)}, {prop: "Equal", name: "Equal", pkg: "", typ: $funcType([Vector], [$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([], [Vector], false)}, {prop: "Dot", name: "Dot", pkg: "", typ: $funcType([Vector], [$Float64], false)}, {prop: "Cross", name: "Cross", pkg: "", typ: $funcType([Vector], [Vector], false)}, {prop: "Rotate", name: "Rotate", pkg: "", typ: $funcType([$Float64, sliceType$7], [Vector], 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)}]; - ptrType$1.methods = [{prop: "Add", name: "Add", pkg: "", typ: $funcType([sliceType$3], [], true)}, {prop: "Remove", name: "Remove", pkg: "", typ: $funcType([sliceType$3], [], true)}, {prop: "Objects", name: "Objects", pkg: "", typ: $funcType([], [sliceType$3], false)}, {prop: "Resize", name: "Resize", pkg: "", typ: $funcType([$Int, $Int], [], false)}, {prop: "Cell", name: "Cell", pkg: "", typ: $funcType([$Int, $Int], [ptrType], false)}, {prop: "CheckCells", name: "CheckCells", pkg: "", typ: $funcType([$Int, $Int, $Int, $Int, sliceType$6], [ptrType$2], true)}, {prop: "CheckCellsWorld", name: "CheckCellsWorld", pkg: "", typ: $funcType([$Float64, $Float64, $Float64, $Float64, sliceType$6], [ptrType$2], 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], [sliceType$1], false)}]; - ptrType$3.methods = [{prop: "Project", name: "Project", pkg: "", typ: $funcType([Vector], [Vector], false)}, {prop: "Normal", name: "Normal", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "Vector", name: "Vector", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "IntersectionPointsLine", name: "IntersectionPointsLine", pkg: "", typ: $funcType([ptrType$3], [Vector], false)}, {prop: "IntersectionPointsCircle", name: "IntersectionPointsCircle", pkg: "", typ: $funcType([ptrType$4], [sliceType$4], false)}]; - ptrType$5.methods = [{prop: "Clone", name: "Clone", pkg: "", typ: $funcType([], [Shape], false)}, {prop: "AddPointsVec", name: "AddPointsVec", pkg: "", typ: $funcType([sliceType$4], [], true)}, {prop: "AddPoints", name: "AddPoints", pkg: "", typ: $funcType([sliceType], [], true)}, {prop: "Lines", name: "Lines", pkg: "", typ: $funcType([], [sliceType$5], false)}, {prop: "Transformed", name: "Transformed", pkg: "", typ: $funcType([], [sliceType$4], false)}, {prop: "Bounds", name: "Bounds", pkg: "", typ: $funcType([], [Vector, Vector], 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([Vector], [], false)}, {prop: "Move", name: "Move", pkg: "", typ: $funcType([$Float64, $Float64], [], false)}, {prop: "MoveVec", name: "MoveVec", pkg: "", typ: $funcType([Vector], [], false)}, {prop: "Center", name: "Center", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "Project", name: "Project", pkg: "", typ: $funcType([Vector], [Projection], false)}, {prop: "SATAxes", name: "SATAxes", pkg: "", typ: $funcType([], [sliceType$4], false)}, {prop: "PointInside", name: "PointInside", pkg: "", typ: $funcType([Vector], [$Bool], false)}, {prop: "Intersection", name: "Intersection", pkg: "", typ: $funcType([$Float64, $Float64, Shape], [ptrType$6], false)}, {prop: "calculateMTV", name: "calculateMTV", pkg: "resolv", typ: $funcType([ptrType$6, Shape], [Vector], false)}, {prop: "ContainedBy", name: "ContainedBy", pkg: "", typ: $funcType([Shape], [$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)}]; - ptrType$6.methods = [{prop: "LeftmostPoint", name: "LeftmostPoint", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "RightmostPoint", name: "RightmostPoint", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "TopmostPoint", name: "TopmostPoint", pkg: "", typ: $funcType([], [Vector], false)}, {prop: "BottommostPoint", name: "BottommostPoint", pkg: "", typ: $funcType([], [Vector], false)}]; - ptrType$4.methods = [{prop: "Clone", name: "Clone", pkg: "", typ: $funcType([], [Shape], false)}, {prop: "Bounds", name: "Bounds", pkg: "", typ: $funcType([], [Vector, Vector], false)}, {prop: "Intersection", name: "Intersection", pkg: "", typ: $funcType([$Float64, $Float64, Shape], [ptrType$6], false)}, {prop: "Move", name: "Move", pkg: "", typ: $funcType([$Float64, $Float64], [], false)}, {prop: "MoveVec", name: "MoveVec", pkg: "", typ: $funcType([Vector], [], false)}, {prop: "SetPosition", name: "SetPosition", pkg: "", typ: $funcType([$Float64, $Float64], [], false)}, {prop: "SetPositionVec", name: "SetPositionVec", pkg: "", typ: $funcType([Vector], [], false)}, {prop: "Position", name: "Position", pkg: "", typ: $funcType([], [$Float64, $Float64], false)}, {prop: "PointInside", name: "PointInside", pkg: "", typ: $funcType([Vector], [$Bool], false)}, {prop: "IntersectionPointsCircle", name: "IntersectionPointsCircle", pkg: "", typ: $funcType([ptrType$4], [sliceType$4], false)}]; - Projection.methods = [{prop: "Overlapping", name: "Overlapping", pkg: "", typ: $funcType([Projection], [$Bool], false)}, {prop: "Overlap", name: "Overlap", pkg: "", typ: $funcType([Projection], [$Float64], false)}, {prop: "IsInside", name: "IsInside", pkg: "", typ: $funcType([Projection], [$Bool], false)}]; - ptrType$2.methods = [{prop: "Clone", name: "Clone", pkg: "", typ: $funcType([], [ptrType$2], false)}, {prop: "Update", name: "Update", pkg: "", typ: $funcType([], [], false)}, {prop: "AddTags", name: "AddTags", pkg: "", typ: $funcType([sliceType$6], [], true)}, {prop: "RemoveTags", name: "RemoveTags", pkg: "", typ: $funcType([sliceType$6], [], true)}, {prop: "HasTags", name: "HasTags", pkg: "", typ: $funcType([sliceType$6], [$Bool], true)}, {prop: "Tags", name: "Tags", pkg: "", typ: $funcType([], [sliceType$6], false)}, {prop: "SetShape", name: "SetShape", pkg: "", typ: $funcType([Shape], [], false)}, {prop: "BoundsToSpace", name: "BoundsToSpace", pkg: "", typ: $funcType([$Float64, $Float64], [$Int, $Int, $Int, $Int], false)}, {prop: "SharesCells", name: "SharesCells", pkg: "", typ: $funcType([ptrType$2], [$Bool], false)}, {prop: "SharesCellsTags", name: "SharesCellsTags", pkg: "", typ: $funcType([sliceType$6], [$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([Vector, Vector], [], false)}, {prop: "Check", name: "Check", pkg: "", typ: $funcType([$Float64, $Float64, sliceType$6], [ptrType$7], true)}, {prop: "Overlaps", name: "Overlaps", pkg: "", typ: $funcType([ptrType$2], [$Bool], false)}, {prop: "AddToIgnoreList", name: "AddToIgnoreList", pkg: "", typ: $funcType([ptrType$2], [], false)}, {prop: "RemoveFromIgnoreList", name: "RemoveFromIgnoreList", pkg: "", typ: $funcType([ptrType$2], [], false)}]; - ptrType$7.methods = [{prop: "HasTags", name: "HasTags", pkg: "", typ: $funcType([sliceType$6], [$Bool], true)}, {prop: "ObjectsByTags", name: "ObjectsByTags", pkg: "", typ: $funcType([sliceType$6], [sliceType$3], true)}, {prop: "ContactWithObject", name: "ContactWithObject", pkg: "", typ: $funcType([ptrType$2], [Vector], false)}, {prop: "ContactWithCell", name: "ContactWithCell", pkg: "", typ: $funcType([ptrType], [Vector], false)}, {prop: "SlideAgainstCell", name: "SlideAgainstCell", pkg: "", typ: $funcType([ptrType, sliceType$6], [Vector], true)}]; - ptrType.methods = [{prop: "register", name: "register", pkg: "resolv", typ: $funcType([ptrType$2], [], false)}, {prop: "unregister", name: "unregister", pkg: "resolv", typ: $funcType([ptrType$2], [], false)}, {prop: "Contains", name: "Contains", pkg: "", typ: $funcType([ptrType$2], [$Bool], false)}, {prop: "ContainsTags", name: "ContainsTags", pkg: "", typ: $funcType([sliceType$6], [$Bool], true)}, {prop: "Occupied", name: "Occupied", pkg: "", typ: $funcType([], [$Bool], false)}]; - Vector.init($Float64); - Space.init("", [{prop: "Cells", name: "Cells", embedded: false, exported: true, typ: sliceType$2, tag: ""}, {prop: "CellWidth", name: "CellWidth", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "CellHeight", name: "CellHeight", embedded: false, exported: true, typ: $Int, tag: ""}]); - Shape.init([{prop: "Bounds", name: "Bounds", pkg: "", typ: $funcType([], [Vector, Vector], false)}, {prop: "Clone", name: "Clone", pkg: "", typ: $funcType([], [Shape], false)}, {prop: "Intersection", name: "Intersection", pkg: "", typ: $funcType([$Float64, $Float64, Shape], [ptrType$6], false)}, {prop: "Position", name: "Position", pkg: "", typ: $funcType([], [$Float64, $Float64], false)}, {prop: "SetPosition", name: "SetPosition", pkg: "", typ: $funcType([$Float64, $Float64], [], false)}]); - Line.init("", [{prop: "Start", name: "Start", embedded: false, exported: true, typ: Vector, tag: ""}, {prop: "End", name: "End", embedded: false, exported: true, typ: Vector, tag: ""}]); - ConvexPolygon.init("", [{prop: "Points", name: "Points", embedded: false, exported: true, typ: sliceType$4, 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: ""}]); - ContactSet.init("", [{prop: "Points", name: "Points", embedded: false, exported: true, typ: sliceType$4, tag: ""}, {prop: "MTV", name: "MTV", embedded: false, exported: true, typ: Vector, tag: ""}, {prop: "Center", name: "Center", embedded: false, exported: true, typ: Vector, tag: ""}]); - Circle.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: ""}]); - Projection.init("", [{prop: "Min", name: "Min", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "Max", name: "Max", embedded: false, exported: true, typ: $Float64, tag: ""}]); - Object.init("resolv", [{prop: "Shape", name: "Shape", embedded: false, exported: true, typ: Shape, tag: ""}, {prop: "Space", name: "Space", embedded: false, exported: true, typ: ptrType$1, 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: sliceType$1, tag: ""}, {prop: "Data", name: "Data", embedded: false, exported: true, typ: $emptyInterface, tag: ""}, {prop: "ignoreList", name: "ignoreList", embedded: false, exported: false, typ: mapType, tag: ""}, {prop: "tags", name: "tags", embedded: false, exported: false, typ: sliceType$6, tag: ""}]); - Collision.init("resolv", [{prop: "checkingObject", name: "checkingObject", embedded: false, exported: false, typ: ptrType$2, 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: sliceType$3, tag: ""}, {prop: "Cells", name: "Cells", embedded: false, exported: true, typ: sliceType$1, tag: ""}]); - Cell.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: sliceType$3, 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 = math.$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, math, resolv, Vec2D, Polygon2D, PlayerDownsync, InputFrameDecoded, Barrier, Bullet, MeleeBullet, FireballBullet, Skill, RoomDownsyncFrame, InputFrameDownsync, RingBuffer, SkillMapperType, CharacterConfig, SatResult, sliceType, sliceType$1, sliceType$2, ptrType, ptrType$1, ptrType$2, sliceType$3, sliceType$4, ptrType$3, ptrType$4, ptrType$5, ptrType$6, ptrType$7, sliceType$5, sliceType$6, sliceType$7, sliceType$8, sliceType$9, ptrType$8, sliceType$10, ptrType$9, sliceType$11, sliceType$12, ptrType$10, sliceType$13, ptrType$11, mapType, ptrType$12, skills, inAirSet, noOpSet, invinsibleSet, nonAttackingSet, NewRingBuffer, ShouldGenerateInputFrameUpsync, ConvertToDelayedInputFrameId, ConvertToNoDelayInputFrameId, ConvertToFirstUsedRenderFrameId, ConvertToLastUsedRenderFrameId, decodeInput, CalcPushbacks, isPolygonPairOverlapped, isPolygonPairSeparatedByDir, WorldToVirtualGridPos, VirtualGridToWorldPos, WorldToPolygonColliderBLPos, PolygonColliderBLToWorldPos, PolygonColliderBLToVirtualGridPos, calcHardPushbacksNorms, deriveOpPattern, ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame, GenerateRectCollider, generateRectColliderInCollisionSpace, GenerateConvexPolygonCollider, AlignPolygon2DToBoundingBox; - math = $packages["math"]; - resolv = $packages["resolv"]; - Vec2D = $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_; - }); - Polygon2D = $pkg.Polygon2D = $newType(0, $kindStruct, "battle.Polygon2D", true, "jsexport/battle", true, function(Anchor_, Points_) { - this.$val = this; - if (arguments.length === 0) { - this.Anchor = ptrType$10.nil; - this.Points = sliceType$13.nil; - return; - } - this.Anchor = Anchor_; - this.Points = Points_; - }); - PlayerDownsync = $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_, FramesSelfLockVel_) { - 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; - this.FramesSelfLockVel = 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_; - this.FramesSelfLockVel = FramesSelfLockVel_; - }); - InputFrameDecoded = $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_; - }); - Barrier = $pkg.Barrier = $newType(0, $kindStruct, "battle.Barrier", true, "jsexport/battle", true, function(Boundary_) { - this.$val = this; - if (arguments.length === 0) { - this.Boundary = ptrType$11.nil; - return; - } - this.Boundary = Boundary_; - }); - Bullet = $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_, FramesSelfLockVel_, 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.FramesSelfLockVel = 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.FramesSelfLockVel = FramesSelfLockVel_; - this.HitboxOffsetX = HitboxOffsetX_; - this.HitboxOffsetY = HitboxOffsetY_; - this.HitboxSizeX = HitboxSizeX_; - this.HitboxSizeY = HitboxSizeY_; - this.BlowUp = BlowUp_; - this.CancelTransit = CancelTransit_; - }); - MeleeBullet = $pkg.MeleeBullet = $newType(0, $kindStruct, "battle.MeleeBullet", true, "jsexport/battle", true, function(Bullet_) { - this.$val = this; - if (arguments.length === 0) { - this.Bullet = new Bullet.ptr(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, false, false); - return; - } - this.Bullet = Bullet_; - }); - FireballBullet = $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 Bullet.ptr(0, 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_; - }); - Skill = $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 = sliceType$2.nil; - return; - } - this.BattleLocalId = BattleLocalId_; - this.RecoveryFrames = RecoveryFrames_; - this.RecoveryFramesOnBlock = RecoveryFramesOnBlock_; - this.RecoveryFramesOnHit = RecoveryFramesOnHit_; - this.ReleaseTriggerType = ReleaseTriggerType_; - this.BoundChState = BoundChState_; - this.Hits = Hits_; - }); - RoomDownsyncFrame = $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 = sliceType$6.nil; - this.CountdownNanos = new $Int64(0, 0); - this.MeleeBullets = sliceType$7.nil; - this.FireballBullets = sliceType$11.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_; - }); - InputFrameDownsync = $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 = sliceType$5.nil; - this.ConfirmedList = new $Uint64(0, 0); - return; - } - this.InputFrameId = InputFrameId_; - this.InputList = InputList_; - this.ConfirmedList = ConfirmedList_; - }); - RingBuffer = $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 = sliceType$2.nil; - return; - } - this.Ed = Ed_; - this.St = St_; - this.EdFrameId = EdFrameId_; - this.StFrameId = StFrameId_; - this.N = N_; - this.Cnt = Cnt_; - this.Eles = Eles_; - }); - SkillMapperType = $pkg.SkillMapperType = $newType(4, $kindFunc, "battle.SkillMapperType", true, "jsexport/battle", true, null); - CharacterConfig = $pkg.CharacterConfig = $newType(0, $kindStruct, "battle.CharacterConfig", true, "jsexport/battle", true, function(SpeciesId_, SpeciesName_, InAirIdleFrameIdxTurningPoint_, InAirIdleFrameIdxTurnedCycle_, LayDownFrames_, LayDownFramesToRecover_, GetUpInvinsibleFrames_, GetUpFramesToRecover_, Speed_, JumpingInitVelY_, SkillMapper_) { - 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_; - }); - SatResult = $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 = resolv.Vector.nil; - return; - } - this.Overlap = Overlap_; - this.OverlapX = OverlapX_; - this.OverlapY = OverlapY_; - this.AContainedInB = AContainedInB_; - this.BContainedInA = BContainedInA_; - this.Axis = Axis_; - }); - sliceType = $sliceType($Int32); - sliceType$1 = $sliceType(sliceType); - sliceType$2 = $sliceType($emptyInterface); - ptrType = $ptrType(Skill); - ptrType$1 = $ptrType(MeleeBullet); - ptrType$2 = $ptrType(SatResult); - sliceType$3 = $sliceType(Vec2D); - sliceType$4 = $sliceType($String); - ptrType$3 = $ptrType(resolv.Collision); - ptrType$4 = $ptrType(sliceType$3); - ptrType$5 = $ptrType(PlayerDownsync); - ptrType$6 = $ptrType(resolv.ConvexPolygon); - ptrType$7 = $ptrType(InputFrameDownsync); - sliceType$5 = $sliceType($Uint64); - sliceType$6 = $sliceType(ptrType$5); - sliceType$7 = $sliceType(ptrType$1); - sliceType$8 = $sliceType(ptrType$4); - sliceType$9 = $sliceType($Bool); - ptrType$8 = $ptrType(resolv.Object); - sliceType$10 = $sliceType(ptrType$8); - ptrType$9 = $ptrType(FireballBullet); - sliceType$11 = $sliceType(ptrType$9); - sliceType$12 = $sliceType($Float64); - ptrType$10 = $ptrType(Vec2D); - sliceType$13 = $sliceType(ptrType$10); - ptrType$11 = $ptrType(Polygon2D); - mapType = $mapType($Int, $Int); - ptrType$12 = $ptrType(RingBuffer); - NewRingBuffer = function(n) { - var n; - return new RingBuffer.ptr(0, 0, 0, 0, n, 0, $makeSlice(sliceType$2, n)); - }; - $pkg.NewRingBuffer = NewRingBuffer; - RingBuffer.ptr.prototype.Put = function(pItem) { - var pItem, rb, x, x$1; - rb = this; - while (true) { - if (!(0 < rb.Cnt && rb.Cnt >= rb.N)) { break; } - rb.Pop(); - } - (x = rb.Eles, x$1 = rb.Ed, ((x$1 < 0 || x$1 >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + x$1] = pItem)); - rb.EdFrameId = rb.EdFrameId + (1) >> 0; - rb.Cnt = rb.Cnt + (1) >> 0; - rb.Ed = rb.Ed + (1) >> 0; - if (rb.Ed >= rb.N) { - rb.Ed = rb.Ed - (rb.N) >> 0; - } - }; - RingBuffer.prototype.Put = function(pItem) { return this.$val.Put(pItem); }; - RingBuffer.ptr.prototype.Pop = function() { - var pItem, rb, x, x$1; - rb = this; - if (0 === rb.Cnt) { - return $ifaceNil; - } - pItem = (x = rb.Eles, x$1 = rb.St, ((x$1 < 0 || x$1 >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + x$1])); - rb.StFrameId = rb.StFrameId + (1) >> 0; - rb.Cnt = rb.Cnt - (1) >> 0; - rb.St = rb.St + (1) >> 0; - if (rb.St >= rb.N) { - rb.St = rb.St - (rb.N) >> 0; - } - return pItem; - }; - RingBuffer.prototype.Pop = function() { return this.$val.Pop(); }; - RingBuffer.ptr.prototype.GetArrIdxByOffset = function(offsetFromSt) { - var arrIdx, offsetFromSt, rb; - rb = this; - if ((0 === rb.Cnt) || 0 > offsetFromSt) { - return -1; - } - arrIdx = rb.St + offsetFromSt >> 0; - if (rb.St < rb.Ed) { - if (rb.St <= arrIdx && arrIdx < rb.Ed) { - return arrIdx; - } - } else { - if (arrIdx >= rb.N) { - arrIdx = arrIdx - (rb.N) >> 0; - } - if (arrIdx >= rb.St || arrIdx < rb.Ed) { - return arrIdx; - } - } - return -1; - }; - RingBuffer.prototype.GetArrIdxByOffset = function(offsetFromSt) { return this.$val.GetArrIdxByOffset(offsetFromSt); }; - RingBuffer.ptr.prototype.GetByOffset = function(offsetFromSt) { - var arrIdx, offsetFromSt, rb, x; - rb = this; - arrIdx = rb.GetArrIdxByOffset(offsetFromSt); - if (-1 === arrIdx) { - return $ifaceNil; - } - return (x = rb.Eles, ((arrIdx < 0 || arrIdx >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + arrIdx])); - }; - RingBuffer.prototype.GetByOffset = function(offsetFromSt) { return this.$val.GetByOffset(offsetFromSt); }; - RingBuffer.ptr.prototype.GetByFrameId = function(frameId) { - var frameId, rb; - rb = this; - if (frameId >= rb.EdFrameId || frameId < rb.StFrameId) { - return $ifaceNil; - } - return rb.GetByOffset(frameId - rb.StFrameId >> 0); - }; - RingBuffer.prototype.GetByFrameId = function(frameId) { return this.$val.GetByFrameId(frameId); }; - RingBuffer.ptr.prototype.SetByFrameId = function(pItem, frameId) { - var _tmp, _tmp$1, _tmp$2, _tmp$3, _tmp$4, _tmp$5, arrIdx, frameId, oldEdFrameId, oldStFrameId, pItem, rb, ret, x; - rb = this; - _tmp = rb.StFrameId; - _tmp$1 = rb.EdFrameId; - oldStFrameId = _tmp; - oldEdFrameId = _tmp$1; - if (frameId < oldStFrameId) { - return [2, oldStFrameId, oldEdFrameId]; - } - if (oldEdFrameId > frameId) { - arrIdx = rb.GetArrIdxByOffset(frameId - rb.StFrameId >> 0); - if (!((-1 === arrIdx))) { - (x = rb.Eles, ((arrIdx < 0 || arrIdx >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + arrIdx] = pItem)); - return [0, oldStFrameId, oldEdFrameId]; - } - } - ret = 0; - if (oldEdFrameId < frameId) { - _tmp$2 = 0; - _tmp$3 = 0; - rb.St = _tmp$2; - rb.Ed = _tmp$3; - _tmp$4 = frameId; - _tmp$5 = frameId; - rb.StFrameId = _tmp$4; - rb.EdFrameId = _tmp$5; - rb.Cnt = 0; - ret = 1; - } - rb.Put(pItem); - return [ret, oldStFrameId, oldEdFrameId]; - }; - RingBuffer.prototype.SetByFrameId = function(pItem, frameId) { return this.$val.SetByFrameId(pItem, frameId); }; - ShouldGenerateInputFrameUpsync = function(renderFrameId) { - var renderFrameId; - return (((renderFrameId & 3)) === 0); - }; - $pkg.ShouldGenerateInputFrameUpsync = ShouldGenerateInputFrameUpsync; - ConvertToDelayedInputFrameId = function(renderFrameId) { - var renderFrameId; - if (renderFrameId < 8) { - return 0; - } - return (((renderFrameId - 8 >> 0)) >> 2 >> 0); - }; - $pkg.ConvertToDelayedInputFrameId = ConvertToDelayedInputFrameId; - ConvertToNoDelayInputFrameId = function(renderFrameId) { - var renderFrameId; - return (renderFrameId >> 2 >> 0); - }; - $pkg.ConvertToNoDelayInputFrameId = ConvertToNoDelayInputFrameId; - ConvertToFirstUsedRenderFrameId = function(inputFrameId) { - var inputFrameId; - return (((inputFrameId << 2 >> 0)) + 8 >> 0); - }; - $pkg.ConvertToFirstUsedRenderFrameId = ConvertToFirstUsedRenderFrameId; - ConvertToLastUsedRenderFrameId = function(inputFrameId) { - var inputFrameId; - return (((((inputFrameId << 2 >> 0)) + 8 >> 0) + 4 >> 0) - 1 >> 0); - }; - $pkg.ConvertToLastUsedRenderFrameId = ConvertToLastUsedRenderFrameId; - decodeInput = function(encodedInput) { - var btnALevel, btnBLevel, encodedDirection, encodedInput, x, x$1, x$2, x$3; - encodedDirection = new $Uint64(encodedInput.$high & 0, (encodedInput.$low & 15) >>> 0); - btnALevel = (((x = $shiftRightUint64(encodedInput, 4), new $Uint64(x.$high & 0, (x.$low & 1) >>> 0)).$low >> 0)); - btnBLevel = (((x$1 = $shiftRightUint64(encodedInput, 5), new $Uint64(x$1.$high & 0, (x$1.$low & 1) >>> 0)).$low >> 0)); - return new InputFrameDecoded.ptr((x$2 = (($flatten64(encodedDirection) < 0 || $flatten64(encodedDirection) >= $pkg.DIRECTION_DECODER.$length) ? ($throwRuntimeError("index out of range"), undefined) : $pkg.DIRECTION_DECODER.$array[$pkg.DIRECTION_DECODER.$offset + $flatten64(encodedDirection)]), (0 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 0])), (x$3 = (($flatten64(encodedDirection) < 0 || $flatten64(encodedDirection) >= $pkg.DIRECTION_DECODER.$length) ? ($throwRuntimeError("index out of range"), undefined) : $pkg.DIRECTION_DECODER.$array[$pkg.DIRECTION_DECODER.$offset + $flatten64(encodedDirection)]), (1 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 1])), btnALevel, btnBLevel); - }; - CalcPushbacks = function(oldDx, oldDy, playerShape, barrierShape) { - var {$24r, $24r$1, _tmp, _tmp$1, _tuple, barrierShape, oldDx, oldDy, origX, origY, overlapResult, overlapped, playerShape, pushbackX, pushbackY, $s, $deferred, $r, $c} = $restore(this, {oldDx, oldDy, playerShape, barrierShape}); - /* */ $s = $s || 0; var $err = null; try { s: while (true) { switch ($s) { case 0: $deferred = []; $curGoroutine.deferStack.push($deferred); - origX = [origX]; - origY = [origY]; - playerShape = [playerShape]; - _tuple = playerShape[0].Position(); - origX[0] = _tuple[0]; - origY[0] = _tuple[1]; - $deferred.push([(function(origX, origY, playerShape) { return function() { - playerShape[0].SetPosition(origX[0], origY[0]); - }; })(origX, origY, playerShape), []]); - playerShape[0].SetPosition(origX[0] + oldDx, origY[0] + oldDy); - overlapResult = new SatResult.ptr(0, 0, 0, true, true, new resolv.Vector([0, 0])); - overlapped = isPolygonPairOverlapped(playerShape[0], barrierShape, overlapResult); - /* */ if (overlapped) { $s = 1; continue; } - /* */ $s = 2; continue; - /* if (overlapped) { */ case 1: - _tmp = overlapResult.Overlap * overlapResult.OverlapX; - _tmp$1 = overlapResult.Overlap * overlapResult.OverlapY; - pushbackX = _tmp; - pushbackY = _tmp$1; - $24r = [true, pushbackX, pushbackY, overlapResult]; - $s = 4; case 4: return $24r; - /* } else { */ case 2: - $24r$1 = [false, 0, 0, overlapResult]; - $s = 5; case 5: return $24r$1; - /* } */ case 3: - $s = -1; return [false, 0, 0, ptrType$2.nil]; - /* */ } return; } } catch(err) { $err = err; $s = -1; return [false, 0, 0, ptrType$2.nil]; } finally { $callDeferred($deferred, $err); if($curGoroutine.asleep) { var $f = {$blk: CalcPushbacks, $c: true, $r, $24r, $24r$1, _tmp, _tmp$1, _tuple, barrierShape, oldDx, oldDy, origX, origY, overlapResult, overlapped, playerShape, pushbackX, pushbackY, $s, $deferred};return $f; } } - }; - $pkg.CalcPushbacks = CalcPushbacks; - isPolygonPairOverlapped = function(a, b, result) { - var _i, _i$1, _ref, _ref$1, _tmp, _tmp$1, a, aCnt, axis, axis$1, b, bCnt, result, x, x$1, x$2, x$3, x$4, x$5, x$6, x$7; - _tmp = a.Points.$length; - _tmp$1 = b.Points.$length; - aCnt = _tmp; - bCnt = _tmp$1; - if ((1 === aCnt) && (1 === bCnt)) { - if (!(ptrType$2.nil === result)) { - result.Overlap = 0; - } - return ((x = (x$1 = a.Points, (0 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 0])), (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0])) === (x$2 = (x$3 = b.Points, (0 >= x$3.$length ? ($throwRuntimeError("index out of range"), undefined) : x$3.$array[x$3.$offset + 0])), (0 >= x$2.$length ? ($throwRuntimeError("index out of range"), undefined) : x$2.$array[x$2.$offset + 0]))) && ((x$4 = (x$5 = a.Points, (0 >= x$5.$length ? ($throwRuntimeError("index out of range"), undefined) : x$5.$array[x$5.$offset + 0])), (1 >= x$4.$length ? ($throwRuntimeError("index out of range"), undefined) : x$4.$array[x$4.$offset + 1])) === (x$6 = (x$7 = b.Points, (0 >= x$7.$length ? ($throwRuntimeError("index out of range"), undefined) : x$7.$array[x$7.$offset + 0])), (1 >= x$6.$length ? ($throwRuntimeError("index out of range"), undefined) : x$6.$array[x$6.$offset + 1]))); - } - if (1 < aCnt) { - _ref = a.SATAxes(); - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - axis = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (isPolygonPairSeparatedByDir(a, b, axis.Unit(), result)) { - return false; - } - _i++; - } - } - if (1 < bCnt) { - _ref$1 = b.SATAxes(); - _i$1 = 0; - while (true) { - if (!(_i$1 < _ref$1.$length)) { break; } - axis$1 = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); - if (isPolygonPairSeparatedByDir(a, b, axis$1.Unit(), result)) { - return false; - } - _i$1++; - } - } - return true; - }; - isPolygonPairSeparatedByDir = function(a, b, e, result) { - var _i, _i$1, _ref, _ref$1, _tmp, _tmp$1, _tmp$2, _tmp$3, a, aEnd, aStart, absoluteOverlap, b, bEnd, bStart, currentOverlap, dot, dot$1, e, option1, option1$1, option2, option2$1, overlap, p, p$1, result, sign, x, x$1; - _tmp = 1.7e+308; - _tmp$1 = -1.7e+308; - _tmp$2 = 1.7e+308; - _tmp$3 = -1.7e+308; - aStart = _tmp; - aEnd = _tmp$1; - bStart = _tmp$2; - bEnd = _tmp$3; - _ref = a.Points; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - p = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - dot = ((0 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 0]) + a.X) * (0 >= e.$length ? ($throwRuntimeError("index out of range"), undefined) : e.$array[e.$offset + 0]) + ((1 >= p.$length ? ($throwRuntimeError("index out of range"), undefined) : p.$array[p.$offset + 1]) + a.Y) * (1 >= e.$length ? ($throwRuntimeError("index out of range"), undefined) : e.$array[e.$offset + 1]); - if (aStart > dot) { - aStart = dot; - } - if (aEnd < dot) { - aEnd = dot; - } - _i++; - } - _ref$1 = b.Points; - _i$1 = 0; - while (true) { - if (!(_i$1 < _ref$1.$length)) { break; } - p$1 = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); - dot$1 = ((0 >= p$1.$length ? ($throwRuntimeError("index out of range"), undefined) : p$1.$array[p$1.$offset + 0]) + b.X) * (0 >= e.$length ? ($throwRuntimeError("index out of range"), undefined) : e.$array[e.$offset + 0]) + ((1 >= p$1.$length ? ($throwRuntimeError("index out of range"), undefined) : p$1.$array[p$1.$offset + 1]) + b.Y) * (1 >= e.$length ? ($throwRuntimeError("index out of range"), undefined) : e.$array[e.$offset + 1]); - if (bStart > dot$1) { - bStart = dot$1; - } - if (bEnd < dot$1) { - bEnd = dot$1; - } - _i$1++; - } - if (aStart > bEnd || aEnd < bStart) { - return true; - } - if (!(ptrType$2.nil === result)) { - overlap = 0; - if (aStart < bStart) { - result.AContainedInB = false; - if (aEnd < bEnd) { - overlap = aEnd - bStart; - result.BContainedInA = false; - } else { - option1 = aEnd - bStart; - option2 = bEnd - aStart; - if (option1 < option2) { - overlap = option1; - } else { - overlap = -option2; - } - } - } else { - result.BContainedInA = false; - if (aEnd > bEnd) { - overlap = aStart - bEnd; - result.AContainedInB = false; - } else { - option1$1 = aEnd - bStart; - option2$1 = bEnd - aStart; - if (option1$1 < option2$1) { - overlap = option1$1; - } else { - overlap = -option2$1; - } - } - } - currentOverlap = result.Overlap; - absoluteOverlap = overlap; - if (overlap < 0) { - absoluteOverlap = -overlap; - } - if (((0 === (x = result.Axis, (0 >= x.$length ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + 0]))) && (0 === (x$1 = result.Axis, (1 >= x$1.$length ? ($throwRuntimeError("index out of range"), undefined) : x$1.$array[x$1.$offset + 1])))) || currentOverlap > absoluteOverlap) { - sign = 1; - if (overlap < 0) { - sign = -1; - } - result.Overlap = absoluteOverlap; - result.OverlapX = (0 >= e.$length ? ($throwRuntimeError("index out of range"), undefined) : e.$array[e.$offset + 0]) * sign; - result.OverlapY = (1 >= e.$length ? ($throwRuntimeError("index out of range"), undefined) : e.$array[e.$offset + 1]) * sign; - } - result.Axis = e; - } - return false; - }; - WorldToVirtualGridPos = function(wx, wy) { - var virtualGridX, virtualGridY, wx, wy; - virtualGridX = ((math.Floor(wx * 100) >> 0)); - virtualGridY = ((math.Floor(wy * 100) >> 0)); - return [virtualGridX, virtualGridY]; - }; - $pkg.WorldToVirtualGridPos = WorldToVirtualGridPos; - VirtualGridToWorldPos = function(vx, vy) { - var vx, vy, wx, wy; - wx = (vx) * 0.01; - wy = (vy) * 0.01; - return [wx, wy]; - }; - $pkg.VirtualGridToWorldPos = VirtualGridToWorldPos; - WorldToPolygonColliderBLPos = function(wx, wy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY) { - var bottomPadding, collisionSpaceOffsetX, collisionSpaceOffsetY, halfBoundingH, halfBoundingW, leftPadding, rightPadding, topPadding, wx, wy; - return [wx - halfBoundingW - leftPadding + collisionSpaceOffsetX, wy - halfBoundingH - bottomPadding + collisionSpaceOffsetY]; - }; - $pkg.WorldToPolygonColliderBLPos = WorldToPolygonColliderBLPos; - PolygonColliderBLToWorldPos = function(cx, cy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY) { - var bottomPadding, collisionSpaceOffsetX, collisionSpaceOffsetY, cx, cy, halfBoundingH, halfBoundingW, leftPadding, rightPadding, topPadding; - return [cx + halfBoundingW + leftPadding - collisionSpaceOffsetX, cy + halfBoundingH + bottomPadding - collisionSpaceOffsetY]; - }; - $pkg.PolygonColliderBLToWorldPos = PolygonColliderBLToWorldPos; - PolygonColliderBLToVirtualGridPos = function(cx, cy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY) { - var _tuple, bottomPadding, collisionSpaceOffsetX, collisionSpaceOffsetY, cx, cy, halfBoundingH, halfBoundingW, leftPadding, rightPadding, topPadding, wx, wy; - _tuple = PolygonColliderBLToWorldPos(cx, cy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY); - wx = _tuple[0]; - wy = _tuple[1]; - return WorldToVirtualGridPos(wx, wy); - }; - $pkg.PolygonColliderBLToVirtualGridPos = PolygonColliderBLToVirtualGridPos; - calcHardPushbacksNorms = function(joinIndex, playerCollider, playerShape, snapIntoPlatformOverlap, pEffPushback) { - var {_i, _r, _ref, _ref$1, _tmp, _tmp$1, _tuple, barrierShape, collision, isBarrier, joinIndex, obj, overlapResult, overlapped, pEffPushback, playerCollider, playerShape, pushbackX, pushbackY, ret, snapIntoPlatformOverlap, $s, $r, $c} = $restore(this, {joinIndex, playerCollider, playerShape, snapIntoPlatformOverlap, pEffPushback}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - ret = [ret]; - ret[0] = $makeSlice(sliceType$3, 0, 10); - collision = playerCollider.Check(0, 0, new sliceType$4([])); - if (ptrType$3.nil === collision) { - $s = -1; return (ret.$ptr || (ret.$ptr = new ptrType$4(function() { return this.$target[0]; }, function($v) { this.$target[0] = $v; }, ret))); - } - _ref = collision.Objects; - _i = 0; - /* while (true) { */ case 1: - /* if (!(_i < _ref.$length)) { break; } */ if(!(_i < _ref.$length)) { $s = 2; continue; } - obj = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - isBarrier = false; - _ref$1 = obj.Data; - if ($assertType(_ref$1, ptrType$5, true)[1]) { - } else if ($assertType(_ref$1, ptrType$1, true)[1]) { - } else { - isBarrier = true; - } - if (!isBarrier) { - _i++; - /* continue; */ $s = 1; continue; - } - barrierShape = $assertType(obj.Shape, ptrType$6); - _r = CalcPushbacks(0, 0, playerShape, barrierShape); /* */ $s = 3; case 3: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - _tuple = _r; - overlapped = _tuple[0]; - pushbackX = _tuple[1]; - pushbackY = _tuple[2]; - overlapResult = _tuple[3]; - if (!overlapped) { - _i++; - /* continue; */ $s = 1; continue; - } - _tmp = (overlapResult.Overlap - snapIntoPlatformOverlap) * overlapResult.OverlapX; - _tmp$1 = (overlapResult.Overlap - snapIntoPlatformOverlap) * overlapResult.OverlapY; - pushbackX = _tmp; - pushbackY = _tmp$1; - ret[0] = $append(ret[0], new Vec2D.ptr(overlapResult.OverlapX, overlapResult.OverlapY)); - pEffPushback.X = pEffPushback.X + (pushbackX); - pEffPushback.Y = pEffPushback.Y + (pushbackY); - _i++; - $s = 1; continue; - case 2: - $s = -1; return (ret.$ptr || (ret.$ptr = new ptrType$4(function() { return this.$target[0]; }, function($v) { this.$target[0] = $v; }, ret))); - /* */ } return; } var $f = {$blk: calcHardPushbacksNorms, $c: true, $r, _i, _r, _ref, _ref$1, _tmp, _tmp$1, _tuple, barrierShape, collision, isBarrier, joinIndex, obj, overlapResult, overlapped, pEffPushback, playerCollider, playerShape, pushbackX, pushbackY, ret, snapIntoPlatformOverlap, $s};return $f; - }; - deriveOpPattern = function(currPlayerDownsync, thatPlayerInNextFrame, currRenderFrame, inputsBuffer) { - var _entry, _entry$1, _tmp, _tmp$1, _tmp$2, _tmp$3, _tmp$4, _tmp$5, _tuple, _tuple$1, currPlayerDownsync, currRenderFrame, decodedInput, delayedInputFrameId, delayedInputFrameIdForPrevRdf, delayedInputList, delayedInputListForPrevRdf, effDx, effDy, existent, existent$1, inputsBuffer, joinIndex, jumpedOrNot, patternId, prevBtnALevel, prevBtnBLevel, prevDecodedInput, thatPlayerInNextFrame, x, x$1; - delayedInputFrameId = ConvertToDelayedInputFrameId(currRenderFrame.Id); - delayedInputFrameIdForPrevRdf = ConvertToDelayedInputFrameId(currRenderFrame.Id - 1 >> 0); - if (0 >= delayedInputFrameId) { - return [-2, false, 0, 0]; - } - _tuple = (_entry = noOpSet[$Int32.keyFor(currPlayerDownsync.CharacterState)], _entry !== undefined ? [_entry.v, true] : [false, false]); - existent = _tuple[1]; - if (existent) { - return [-2, false, 0, 0]; - } - delayedInputList = $assertType(inputsBuffer.GetByFrameId(delayedInputFrameId), ptrType$7).InputList; - delayedInputListForPrevRdf = sliceType$5.nil; - if (0 < delayedInputFrameIdForPrevRdf) { - delayedInputListForPrevRdf = $assertType(inputsBuffer.GetByFrameId(delayedInputFrameIdForPrevRdf), ptrType$7).InputList; - } - jumpedOrNot = false; - joinIndex = currPlayerDownsync.JoinIndex; - decodedInput = decodeInput((x = joinIndex - 1 >> 0, ((x < 0 || x >= delayedInputList.$length) ? ($throwRuntimeError("index out of range"), undefined) : delayedInputList.$array[delayedInputList.$offset + x]))); - _tmp = 0; - _tmp$1 = 0; - effDx = _tmp; - effDy = _tmp$1; - _tmp$2 = 0; - _tmp$3 = 0; - prevBtnALevel = _tmp$2; - prevBtnBLevel = _tmp$3; - if (!(sliceType$5.nil === delayedInputListForPrevRdf)) { - prevDecodedInput = decodeInput((x$1 = joinIndex - 1 >> 0, ((x$1 < 0 || x$1 >= delayedInputListForPrevRdf.$length) ? ($throwRuntimeError("index out of range"), undefined) : delayedInputListForPrevRdf.$array[delayedInputListForPrevRdf.$offset + x$1]))); - prevBtnALevel = prevDecodedInput.BtnALevel; - prevBtnBLevel = prevDecodedInput.BtnBLevel; - } - if (0 === currPlayerDownsync.FramesToRecover) { - _tmp$4 = decodedInput.Dx; - _tmp$5 = decodedInput.Dy; - effDx = _tmp$4; - effDy = _tmp$5; - if (decodedInput.BtnBLevel > prevBtnBLevel) { - _tuple$1 = (_entry$1 = inAirSet[$Int32.keyFor(currPlayerDownsync.CharacterState)], _entry$1 !== undefined ? [_entry$1.v, true] : [false, false]); - existent$1 = _tuple$1[1]; - if (!existent$1) { - jumpedOrNot = true; - } - } - } - patternId = -1; - if (decodedInput.BtnALevel > prevBtnALevel) { - patternId = 1; - } - return [patternId, jumpedOrNot, effDx, effDy]; - }; - ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame = function(inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, chConfigsOrderedByJoinIndex) { - var {_1, _2, _entry, _entry$1, _entry$2, _i, _i$1, _i$10, _i$2, _i$3, _i$4, _i$5, _i$6, _i$7, _i$8, _i$9, _index, _index$1, _index$2, _r, _r$1, _r$2, _r$3, _r$4, _r$5, _ref, _ref$1, _ref$10, _ref$11, _ref$12, _ref$13, _ref$14, _ref$2, _ref$3, _ref$4, _ref$5, _ref$6, _ref$7, _ref$8, _ref$9, _tmp, _tmp$1, _tmp$10, _tmp$11, _tmp$12, _tmp$13, _tmp$14, _tmp$15, _tmp$16, _tmp$17, _tmp$18, _tmp$19, _tmp$2, _tmp$20, _tmp$3, _tmp$4, _tmp$5, _tmp$6, _tmp$7, _tmp$8, _tmp$9, _tuple, _tuple$1, _tuple$10, _tuple$11, _tuple$2, _tuple$3, _tuple$4, _tuple$5, _tuple$6, _tuple$7, _tuple$8, _tuple$9, atkedPlayerInNextFrame, bShape, bulletCollider, bulletColliders, bulletShape, bulletWx, bulletWy, chConfig, chConfig$1, chConfig$2, chConfigsOrderedByJoinIndex, colliderHeight, colliderWidth, colliderWorldHeight, colliderWorldWidth, collision, collision$1, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currPlayerDownsync, currPlayerDownsync$1, currPlayerDownsync$2, currPlayerDownsync$3, currPlayerDownsync$4, currRenderFrame, defenderShape, effDx, effDy, effPushbacks, existent, existent$1, existent$2, halfColliderHeightDiff, halfColliderWidthDiff, halfColliderWorldHeightDiff, hardPushbackNorm, hardPushbackNorms, hasLockVel, hitboxSizeWx, hitboxSizeWy, i, i$1, i$2, i$3, i$4, inputsBuffer, isAnotherPlayer, isBarrier, isBullet, joinIndex, joinIndex$1, joinIndex$2, joinIndex$3, jumpedOrNot, jumpedOrNotList, landedOnGravityPushback, meleeBullet, newBullet, newBulletCollider, newVx, newVy, nextRenderFrameMeleeBullets, nextRenderFramePlayers, normAlignmentWithGravity, obj, obj$1, offender, offender$1, oldFramesToRecover, oldNextCharacterState, overlapResult, overlapped, overlapped$1, patternId, playerCollider, playerCollider$1, playerCollider$2, playerCollider$3, playerColliders, playerShape, projectedMagnitude, pushbackVelX, pushbackVelY, pushbackX, pushbackY, roomCapacity, skillConfig, skillId, t, t$1, thatPlayerInNextFrame, thatPlayerInNextFrame$1, thatPlayerInNextFrame$2, thatPlayerInNextFrame$3, v, v$1, wx, wy, x, x$1, x$10, x$11, x$12, x$13, x$14, x$2, x$3, x$4, x$5, x$6, x$7, x$8, x$9, xfac, xfac$1, xfac$2, $s, $r, $c} = $restore(this, {inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, chConfigsOrderedByJoinIndex}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - roomCapacity = currRenderFrame.PlayersArr.$length; - nextRenderFramePlayers = $makeSlice(sliceType$6, roomCapacity); - _ref = currRenderFrame.PlayersArr; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - i = _i; - currPlayerDownsync = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - ((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i] = new PlayerDownsync.ptr(currPlayerDownsync.Id, currPlayerDownsync.VirtualGridX, currPlayerDownsync.VirtualGridY, currPlayerDownsync.DirX, currPlayerDownsync.DirY, currPlayerDownsync.VelX, currPlayerDownsync.VelY, currPlayerDownsync.Speed, currPlayerDownsync.BattleState, currPlayerDownsync.JoinIndex, currPlayerDownsync.ColliderRadius, currPlayerDownsync.Removed, currPlayerDownsync.Score, 0, currPlayerDownsync.FramesToRecover - 1 >> 0, currPlayerDownsync.FramesInChState + 1 >> 0, currPlayerDownsync.Hp, currPlayerDownsync.MaxHp, currPlayerDownsync.CharacterState, true, currPlayerDownsync.ActiveSkillId, currPlayerDownsync.ActiveSkillHit, currPlayerDownsync.FramesInvinsible - 1 >> 0, currPlayerDownsync.FramesSelfLockVel - 1 >> 0)); - if (((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i]).FramesToRecover < 0) { - ((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i]).FramesToRecover = 0; - } - if (((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i]).FramesInvinsible < 0) { - ((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i]).FramesInvinsible = 0; - } - if (((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i]).FramesSelfLockVel < 0) { - ((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i]).FramesSelfLockVel = 0; - } - _i++; - } - nextRenderFrameMeleeBullets = $makeSlice(sliceType$7, 0, currRenderFrame.MeleeBullets.$length); - effPushbacks = $makeSlice(sliceType$3, roomCapacity); - hardPushbackNorms = $makeSlice(sliceType$8, roomCapacity); - jumpedOrNotList = $makeSlice(sliceType$9, roomCapacity); - _ref$1 = currRenderFrame.PlayersArr; - _i$1 = 0; - /* while (true) { */ case 1: - /* if (!(_i$1 < _ref$1.$length)) { break; } */ if(!(_i$1 < _ref$1.$length)) { $s = 2; continue; } - newBullet = [newBullet]; - i$1 = _i$1; - currPlayerDownsync$1 = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); - ((i$1 < 0 || i$1 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$1] = false); - chConfig = ((i$1 < 0 || i$1 >= chConfigsOrderedByJoinIndex.$length) ? ($throwRuntimeError("index out of range"), undefined) : chConfigsOrderedByJoinIndex.$array[chConfigsOrderedByJoinIndex.$offset + i$1]); - thatPlayerInNextFrame = ((i$1 < 0 || i$1 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$1]); - _tuple = deriveOpPattern(currPlayerDownsync$1, thatPlayerInNextFrame, currRenderFrame, inputsBuffer); - patternId = _tuple[0]; - jumpedOrNot = _tuple[1]; - effDx = _tuple[2]; - effDy = _tuple[3]; - if (jumpedOrNot) { - thatPlayerInNextFrame.VelY = (chConfig.JumpingInitVelY); - ((i$1 < 0 || i$1 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$1] = true); - } - joinIndex = currPlayerDownsync$1.JoinIndex; - _r = chConfig.SkillMapper(patternId, currPlayerDownsync$1); /* */ $s = 3; case 3: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - skillId = _r; - _tuple$1 = (_entry = skills[$Int.keyFor(skillId)], _entry !== undefined ? [_entry.v, true] : [ptrType.nil, false]); - skillConfig = _tuple$1[0]; - existent = _tuple$1[1]; - if (existent) { - thatPlayerInNextFrame.ActiveSkillId = ((skillId >> 0)); - thatPlayerInNextFrame.ActiveSkillHit = 0; - _ref$2 = (x = skillConfig.Hits, x$1 = thatPlayerInNextFrame.ActiveSkillHit, ((x$1 < 0 || x$1 >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + x$1])); - if ($assertType(_ref$2, ptrType$1, true)[1]) { - v = _ref$2.$val; - newBullet[0] = $clone(v, MeleeBullet); - newBullet[0].Bullet.OriginatedRenderFrameId = currRenderFrame.Id; - newBullet[0].Bullet.OffenderJoinIndex = joinIndex; - nextRenderFrameMeleeBullets = $append(nextRenderFrameMeleeBullets, newBullet[0]); - thatPlayerInNextFrame.FramesToRecover = skillConfig.RecoveryFrames; - hasLockVel = false; - if (!((-1 === v.Bullet.SelfLockVelX))) { - hasLockVel = true; - xfac = 1; - if (0 > thatPlayerInNextFrame.DirX) { - xfac = -xfac; - } - thatPlayerInNextFrame.VelX = $imul(xfac, v.Bullet.SelfLockVelX); - thatPlayerInNextFrame.FramesSelfLockVel = v.Bullet.FramesSelfLockVel; - } - if (!((-1 === v.Bullet.SelfLockVelY))) { - hasLockVel = true; - thatPlayerInNextFrame.VelY = v.Bullet.SelfLockVelY; - thatPlayerInNextFrame.FramesSelfLockVel = v.Bullet.FramesSelfLockVel; - } - if (false === hasLockVel) { - if (false === currPlayerDownsync$1.InAir) { - thatPlayerInNextFrame.VelX = 0; - } - } - } - thatPlayerInNextFrame.CharacterState = skillConfig.BoundChState; - _i$1++; - /* continue; */ $s = 1; continue; - } - if (0 === currPlayerDownsync$1.FramesToRecover) { - if (!((0 === effDx)) || !((0 === effDy))) { - _tmp = effDx; - _tmp$1 = effDy; - thatPlayerInNextFrame.DirX = _tmp; - thatPlayerInNextFrame.DirY = _tmp$1; - thatPlayerInNextFrame.VelX = $imul(effDx, currPlayerDownsync$1.Speed); - thatPlayerInNextFrame.CharacterState = 1; - } else { - thatPlayerInNextFrame.CharacterState = 0; - thatPlayerInNextFrame.VelX = 0; - } - } - _i$1++; - $s = 1; continue; - case 2: - playerColliders = $makeSlice(sliceType$10, currRenderFrame.PlayersArr.$length, currRenderFrame.PlayersArr.$length); - _ref$3 = currRenderFrame.PlayersArr; - _i$2 = 0; - /* while (true) { */ case 4: - /* if (!(_i$2 < _ref$3.$length)) { break; } */ if(!(_i$2 < _ref$3.$length)) { $s = 5; continue; } - i$2 = _i$2; - currPlayerDownsync$2 = ((_i$2 < 0 || _i$2 >= _ref$3.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$3.$array[_ref$3.$offset + _i$2]); - joinIndex$1 = currPlayerDownsync$2.JoinIndex; - _tmp$2 = 0; - _tmp$3 = 0; - (x$2 = joinIndex$1 - 1 >> 0, ((x$2 < 0 || x$2 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$2])).X = _tmp$2; - (x$3 = joinIndex$1 - 1 >> 0, ((x$3 < 0 || x$3 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$3])).Y = _tmp$3; - chConfig$1 = ((i$2 < 0 || i$2 >= chConfigsOrderedByJoinIndex.$length) ? ($throwRuntimeError("index out of range"), undefined) : chConfigsOrderedByJoinIndex.$array[chConfigsOrderedByJoinIndex.$offset + i$2]); - _tmp$4 = currPlayerDownsync$2.VirtualGridX + currPlayerDownsync$2.VelX >> 0; - _tmp$5 = currPlayerDownsync$2.VirtualGridY + currPlayerDownsync$2.VelY >> 0; - newVx = _tmp$4; - newVy = _tmp$5; - if (((i$2 < 0 || i$2 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$2])) { - newVy = newVy + (chConfig$1.JumpingInitVelY) >> 0; - } - _tuple$2 = VirtualGridToWorldPos(newVx, newVy); - wx = _tuple$2[0]; - wy = _tuple$2[1]; - _tmp$6 = $imul(currPlayerDownsync$2.ColliderRadius, 2); - _tmp$7 = $imul(currPlayerDownsync$2.ColliderRadius, 4); - colliderWidth = _tmp$6; - colliderHeight = _tmp$7; - _1 = currPlayerDownsync$2.CharacterState; - if (_1 === (9)) { - _tmp$8 = $imul(currPlayerDownsync$2.ColliderRadius, 4); - _tmp$9 = $imul(currPlayerDownsync$2.ColliderRadius, 2); - colliderWidth = _tmp$8; - colliderHeight = _tmp$9; - } else if ((_1 === (8)) || (_1 === (4)) || (_1 === (5))) { - _tmp$10 = $imul(currPlayerDownsync$2.ColliderRadius, 2); - _tmp$11 = $imul(currPlayerDownsync$2.ColliderRadius, 2); - colliderWidth = _tmp$10; - colliderHeight = _tmp$11; - } - _tuple$3 = VirtualGridToWorldPos(colliderWidth, colliderHeight); - colliderWorldWidth = _tuple$3[0]; - colliderWorldHeight = _tuple$3[1]; - _r$1 = GenerateRectCollider(wx, wy, colliderWorldWidth, colliderWorldHeight, 0.1, 0.1, 0.1, 0.1, collisionSpaceOffsetX, collisionSpaceOffsetY, currPlayerDownsync$2, "Player"); /* */ $s = 6; case 6: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } - playerCollider = _r$1; - ((i$2 < 0 || i$2 >= playerColliders.$length) ? ($throwRuntimeError("index out of range"), undefined) : playerColliders.$array[playerColliders.$offset + i$2] = playerCollider); - $r = collisionSys.Add(new sliceType$10([playerCollider])); /* */ $s = 7; case 7: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - thatPlayerInNextFrame$1 = ((i$2 < 0 || i$2 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$2]); - if (currPlayerDownsync$2.InAir) { - thatPlayerInNextFrame$1.VelX = thatPlayerInNextFrame$1.VelX + (0) >> 0; - thatPlayerInNextFrame$1.VelY = thatPlayerInNextFrame$1.VelY + (-50) >> 0; - } - _i$2++; - $s = 4; continue; - case 5: - bulletColliders = $makeSlice(sliceType$10, 0, currRenderFrame.MeleeBullets.$length); - _ref$4 = currRenderFrame.MeleeBullets; - _i$3 = 0; - /* while (true) { */ case 8: - /* if (!(_i$3 < _ref$4.$length)) { break; } */ if(!(_i$3 < _ref$4.$length)) { $s = 9; continue; } - meleeBullet = ((_i$3 < 0 || _i$3 >= _ref$4.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$4.$array[_ref$4.$offset + _i$3]); - /* */ if (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) <= currRenderFrame.Id) && (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) + meleeBullet.Bullet.ActiveFrames >> 0) > currRenderFrame.Id)) { $s = 10; continue; } - /* */ $s = 11; continue; - /* if (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) <= currRenderFrame.Id) && (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) + meleeBullet.Bullet.ActiveFrames >> 0) > currRenderFrame.Id)) { */ case 10: - offender = (x$4 = currRenderFrame.PlayersArr, x$5 = meleeBullet.Bullet.OffenderJoinIndex - 1 >> 0, ((x$5 < 0 || x$5 >= x$4.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$4.$array[x$4.$offset + x$5])); - xfac$1 = 1; - if (0 > offender.DirX) { - xfac$1 = -xfac$1; - } - _tuple$4 = VirtualGridToWorldPos(offender.VirtualGridX + ($imul(xfac$1, meleeBullet.Bullet.HitboxOffsetX)) >> 0, offender.VirtualGridY); - bulletWx = _tuple$4[0]; - bulletWy = _tuple$4[1]; - _tuple$5 = VirtualGridToWorldPos(meleeBullet.Bullet.HitboxSizeX, meleeBullet.Bullet.HitboxSizeY); - hitboxSizeWx = _tuple$5[0]; - hitboxSizeWy = _tuple$5[1]; - _r$2 = GenerateRectCollider(bulletWx, bulletWy, hitboxSizeWx, hitboxSizeWy, 0.1, 0.1, 0.1, 0.1, collisionSpaceOffsetX, collisionSpaceOffsetY, meleeBullet, "MeleeBullet"); /* */ $s = 13; case 13: if($c) { $c = false; _r$2 = _r$2.$blk(); } if (_r$2 && _r$2.$blk !== undefined) { break s; } - newBulletCollider = _r$2; - $r = collisionSys.Add(new sliceType$10([newBulletCollider])); /* */ $s = 14; case 14: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - bulletColliders = $append(bulletColliders, newBulletCollider); - $s = 12; continue; - /* } else { */ case 11: - nextRenderFrameMeleeBullets = $append(nextRenderFrameMeleeBullets, meleeBullet); - /* } */ case 12: - _i$3++; - $s = 8; continue; - case 9: - _ref$5 = currRenderFrame.PlayersArr; - _i$4 = 0; - /* while (true) { */ case 15: - /* if (!(_i$4 < _ref$5.$length)) { break; } */ if(!(_i$4 < _ref$5.$length)) { $s = 16; continue; } - i$3 = _i$4; - currPlayerDownsync$3 = ((_i$4 < 0 || _i$4 >= _ref$5.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$5.$array[_ref$5.$offset + _i$4]); - joinIndex$2 = currPlayerDownsync$3.JoinIndex; - playerCollider$1 = ((i$3 < 0 || i$3 >= playerColliders.$length) ? ($throwRuntimeError("index out of range"), undefined) : playerColliders.$array[playerColliders.$offset + i$3]); - playerShape = $assertType(playerCollider$1.Shape, ptrType$6); - _r$3 = calcHardPushbacksNorms(joinIndex$2, playerCollider$1, playerShape, 0.1, (x$6 = joinIndex$2 - 1 >> 0, ((x$6 < 0 || x$6 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$6]))); /* */ $s = 17; case 17: if($c) { $c = false; _r$3 = _r$3.$blk(); } if (_r$3 && _r$3.$blk !== undefined) { break s; } - (x$7 = joinIndex$2 - 1 >> 0, ((x$7 < 0 || x$7 >= hardPushbackNorms.$length) ? ($throwRuntimeError("index out of range"), undefined) : hardPushbackNorms.$array[hardPushbackNorms.$offset + x$7] = _r$3)); - thatPlayerInNextFrame$2 = ((i$3 < 0 || i$3 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$3]); - chConfig$2 = ((i$3 < 0 || i$3 >= chConfigsOrderedByJoinIndex.$length) ? ($throwRuntimeError("index out of range"), undefined) : chConfigsOrderedByJoinIndex.$array[chConfigsOrderedByJoinIndex.$offset + i$3]); - landedOnGravityPushback = false; - collision = playerCollider$1.Check(0, 0, new sliceType$4([])); - /* */ if (!(ptrType$3.nil === collision)) { $s = 18; continue; } - /* */ $s = 19; continue; - /* if (!(ptrType$3.nil === collision)) { */ case 18: - _ref$6 = collision.Objects; - _i$5 = 0; - /* while (true) { */ case 20: - /* if (!(_i$5 < _ref$6.$length)) { break; } */ if(!(_i$5 < _ref$6.$length)) { $s = 21; continue; } - obj = ((_i$5 < 0 || _i$5 >= _ref$6.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$6.$array[_ref$6.$offset + _i$5]); - _tmp$12 = false; - _tmp$13 = false; - _tmp$14 = false; - isBarrier = _tmp$12; - isAnotherPlayer = _tmp$13; - isBullet = _tmp$14; - _ref$7 = obj.Data; - if ($assertType(_ref$7, ptrType$5, true)[1]) { - isAnotherPlayer = true; - } else if ($assertType(_ref$7, ptrType$1, true)[1]) { - isBullet = true; - } else { - isBarrier = true; - } - if (isBullet) { - _i$5++; - /* continue; */ $s = 20; continue; - } - bShape = $assertType(obj.Shape, ptrType$6); - _r$4 = CalcPushbacks(0, 0, playerShape, bShape); /* */ $s = 22; case 22: if($c) { $c = false; _r$4 = _r$4.$blk(); } if (_r$4 && _r$4.$blk !== undefined) { break s; } - _tuple$6 = _r$4; - overlapped = _tuple$6[0]; - pushbackX = _tuple$6[1]; - pushbackY = _tuple$6[2]; - overlapResult = _tuple$6[3]; - if (!overlapped) { - _i$5++; - /* continue; */ $s = 20; continue; - } - normAlignmentWithGravity = overlapResult.OverlapX * 0 + overlapResult.OverlapY * -1; - if (isAnotherPlayer) { - _tmp$15 = (overlapResult.Overlap - 0.2) * overlapResult.OverlapX; - _tmp$16 = (overlapResult.Overlap - 0.2) * overlapResult.OverlapY; - pushbackX = _tmp$15; - pushbackY = _tmp$16; - } - _ref$8 = (x$8 = joinIndex$2 - 1 >> 0, ((x$8 < 0 || x$8 >= hardPushbackNorms.$length) ? ($throwRuntimeError("index out of range"), undefined) : hardPushbackNorms.$array[hardPushbackNorms.$offset + x$8])).$get(); - _i$6 = 0; - while (true) { - if (!(_i$6 < _ref$8.$length)) { break; } - hardPushbackNorm = $clone(((_i$6 < 0 || _i$6 >= _ref$8.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$8.$array[_ref$8.$offset + _i$6]), Vec2D); - projectedMagnitude = pushbackX * hardPushbackNorm.X + pushbackY * hardPushbackNorm.Y; - if (isBarrier || (isAnotherPlayer && 0 > projectedMagnitude)) { - pushbackX = pushbackX - (projectedMagnitude * hardPushbackNorm.X); - pushbackY = pushbackY - (projectedMagnitude * hardPushbackNorm.Y); - } - _i$6++; - } - _index = joinIndex$2 - 1 >> 0; - ((_index < 0 || _index >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index]).X = ((_index < 0 || _index >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index]).X + (pushbackX); - _index$1 = joinIndex$2 - 1 >> 0; - ((_index$1 < 0 || _index$1 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index$1]).Y = ((_index$1 < 0 || _index$1 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index$1]).Y + (pushbackY); - if (0.5 < normAlignmentWithGravity) { - landedOnGravityPushback = true; - } - _i$5++; - $s = 20; continue; - case 21: - /* } */ case 19: - if (landedOnGravityPushback) { - thatPlayerInNextFrame$2.InAir = false; - if (currPlayerDownsync$3.InAir && 0 >= currPlayerDownsync$3.VelY) { - thatPlayerInNextFrame$2.VelX = 0; - thatPlayerInNextFrame$2.VelY = 0; - if (8 === thatPlayerInNextFrame$2.CharacterState) { - thatPlayerInNextFrame$2.CharacterState = 9; - thatPlayerInNextFrame$2.FramesToRecover = chConfig$2.LayDownFramesToRecover; - } else { - _tmp$17 = 0; - _tmp$18 = currPlayerDownsync$3.ColliderRadius; - halfColliderWidthDiff = _tmp$17; - halfColliderHeightDiff = _tmp$18; - _tuple$7 = VirtualGridToWorldPos(halfColliderWidthDiff, halfColliderHeightDiff); - halfColliderWorldHeightDiff = _tuple$7[1]; - _index$2 = joinIndex$2 - 1 >> 0; - ((_index$2 < 0 || _index$2 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index$2]).Y = ((_index$2 < 0 || _index$2 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index$2]).Y - (halfColliderWorldHeightDiff); - thatPlayerInNextFrame$2.CharacterState = 0; - thatPlayerInNextFrame$2.FramesToRecover = 0; - } - } else { - if (9 === thatPlayerInNextFrame$2.CharacterState) { - if (0 === thatPlayerInNextFrame$2.FramesToRecover) { - thatPlayerInNextFrame$2.CharacterState = 10; - thatPlayerInNextFrame$2.FramesToRecover = chConfig$2.GetUpFramesToRecover; - } - } else if (10 === thatPlayerInNextFrame$2.CharacterState) { - if (0 === thatPlayerInNextFrame$2.FramesToRecover) { - thatPlayerInNextFrame$2.CharacterState = 0; - thatPlayerInNextFrame$2.FramesInvinsible = chConfig$2.GetUpInvinsibleFrames; - } - } - } - } - _i$4++; - $s = 15; continue; - case 16: - _ref$9 = bulletColliders; - _i$7 = 0; - /* while (true) { */ case 23: - /* if (!(_i$7 < _ref$9.$length)) { break; } */ if(!(_i$7 < _ref$9.$length)) { $s = 24; continue; } - bulletCollider = ((_i$7 < 0 || _i$7 >= _ref$9.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$9.$array[_ref$9.$offset + _i$7]); - collision$1 = bulletCollider.Check(0, 0, new sliceType$4([])); - bulletCollider.Space.Remove(new sliceType$10([bulletCollider])); - _ref$10 = bulletCollider.Data; - /* */ if ($assertType(_ref$10, ptrType$1, true)[1]) { $s = 25; continue; } - /* */ $s = 26; continue; - /* if ($assertType(_ref$10, ptrType$1, true)[1]) { */ case 25: - v$1 = _ref$10.$val; - if (ptrType$3.nil === collision$1) { - nextRenderFrameMeleeBullets = $append(nextRenderFrameMeleeBullets, v$1); - _i$7++; - /* continue; */ $s = 23; continue; - } - bulletShape = $assertType(bulletCollider.Shape, ptrType$6); - offender$1 = (x$9 = currRenderFrame.PlayersArr, x$10 = v$1.Bullet.OffenderJoinIndex - 1 >> 0, ((x$10 < 0 || x$10 >= x$9.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$9.$array[x$9.$offset + x$10])); - _ref$11 = collision$1.Objects; - _i$8 = 0; - /* while (true) { */ case 27: - /* if (!(_i$8 < _ref$11.$length)) { break; } */ if(!(_i$8 < _ref$11.$length)) { $s = 28; continue; } - obj$1 = ((_i$8 < 0 || _i$8 >= _ref$11.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$11.$array[_ref$11.$offset + _i$8]); - defenderShape = $assertType(obj$1.Shape, ptrType$6); - _ref$12 = obj$1.Data; - /* */ if ($assertType(_ref$12, ptrType$5, true)[1]) { $s = 29; continue; } - /* */ $s = 30; continue; - /* if ($assertType(_ref$12, ptrType$5, true)[1]) { */ case 29: - t = _ref$12.$val; - if (v$1.Bullet.OffenderJoinIndex === t.JoinIndex) { - _i$8++; - /* continue; */ $s = 27; continue; - } - _tuple$8 = (_entry$1 = invinsibleSet[$Int32.keyFor(t.CharacterState)], _entry$1 !== undefined ? [_entry$1.v, true] : [false, false]); - existent$1 = _tuple$8[1]; - if (existent$1) { - _i$8++; - /* continue; */ $s = 27; continue; - } - if (0 < t.FramesInvinsible) { - _i$8++; - /* continue; */ $s = 27; continue; - } - _r$5 = CalcPushbacks(0, 0, bulletShape, defenderShape); /* */ $s = 32; case 32: if($c) { $c = false; _r$5 = _r$5.$blk(); } if (_r$5 && _r$5.$blk !== undefined) { break s; } - _tuple$9 = _r$5; - overlapped$1 = _tuple$9[0]; - if (!overlapped$1) { - _i$8++; - /* continue; */ $s = 27; continue; - } - xfac$2 = 1; - if (0 > offender$1.DirX) { - xfac$2 = -xfac$2; - } - _tmp$19 = $imul(xfac$2, v$1.Bullet.PushbackVelX); - _tmp$20 = v$1.Bullet.PushbackVelY; - pushbackVelX = _tmp$19; - pushbackVelY = _tmp$20; - atkedPlayerInNextFrame = (x$11 = t.JoinIndex - 1 >> 0, ((x$11 < 0 || x$11 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + x$11])); - atkedPlayerInNextFrame.VelX = pushbackVelX; - atkedPlayerInNextFrame.VelY = pushbackVelY; - if (v$1.Bullet.BlowUp) { - atkedPlayerInNextFrame.CharacterState = 8; - } else { - atkedPlayerInNextFrame.CharacterState = 3; - } - oldFramesToRecover = (x$12 = t.JoinIndex - 1 >> 0, ((x$12 < 0 || x$12 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + x$12])).FramesToRecover; - if (v$1.Bullet.HitStunFrames > oldFramesToRecover) { - atkedPlayerInNextFrame.FramesToRecover = v$1.Bullet.HitStunFrames; - } - $s = 31; continue; - /* } else { */ case 30: - t$1 = _ref$12; - /* } */ case 31: - _i$8++; - $s = 27; continue; - case 28: - /* } */ case 26: - _i$7++; - $s = 23; continue; - case 24: - _ref$13 = currRenderFrame.PlayersArr; - _i$9 = 0; - while (true) { - if (!(_i$9 < _ref$13.$length)) { break; } - i$4 = _i$9; - currPlayerDownsync$4 = ((_i$9 < 0 || _i$9 >= _ref$13.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$13.$array[_ref$13.$offset + _i$9]); - joinIndex$3 = currPlayerDownsync$4.JoinIndex; - playerCollider$2 = ((i$4 < 0 || i$4 >= playerColliders.$length) ? ($throwRuntimeError("index out of range"), undefined) : playerColliders.$array[playerColliders.$offset + i$4]); - thatPlayerInNextFrame$3 = ((i$4 < 0 || i$4 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$4]); - _tuple$10 = PolygonColliderBLToVirtualGridPos(playerCollider$2.X - (x$13 = joinIndex$3 - 1 >> 0, ((x$13 < 0 || x$13 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$13])).X, playerCollider$2.Y - (x$14 = joinIndex$3 - 1 >> 0, ((x$14 < 0 || x$14 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$14])).Y, playerCollider$2.W * 0.5, playerCollider$2.H * 0.5, 0, 0, 0, 0, collisionSpaceOffsetX, collisionSpaceOffsetY); - thatPlayerInNextFrame$3.VirtualGridX = _tuple$10[0]; - thatPlayerInNextFrame$3.VirtualGridY = _tuple$10[1]; - if (thatPlayerInNextFrame$3.InAir) { - oldNextCharacterState = thatPlayerInNextFrame$3.CharacterState; - _2 = oldNextCharacterState; - if ((_2 === (0)) || (_2 === (1))) { - if (((i$4 < 0 || i$4 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$4]) || (5 === currPlayerDownsync$4.CharacterState)) { - thatPlayerInNextFrame$3.CharacterState = 5; - } else { - thatPlayerInNextFrame$3.CharacterState = 4; - } - } else if (_2 === (2)) { - thatPlayerInNextFrame$3.CharacterState = 6; - } else if (_2 === (3)) { - thatPlayerInNextFrame$3.CharacterState = 7; - } - } - if (!((thatPlayerInNextFrame$3.CharacterState === currPlayerDownsync$4.CharacterState))) { - thatPlayerInNextFrame$3.FramesInChState = 0; - } - _tuple$11 = (_entry$2 = nonAttackingSet[$Int32.keyFor(thatPlayerInNextFrame$3.CharacterState)], _entry$2 !== undefined ? [_entry$2.v, true] : [false, false]); - existent$2 = _tuple$11[1]; - if (existent$2) { - thatPlayerInNextFrame$3.ActiveSkillId = -1; - thatPlayerInNextFrame$3.ActiveSkillHit = -1; - } - _i$9++; - } - _ref$14 = playerColliders; - _i$10 = 0; - while (true) { - if (!(_i$10 < _ref$14.$length)) { break; } - playerCollider$3 = ((_i$10 < 0 || _i$10 >= _ref$14.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$14.$array[_ref$14.$offset + _i$10]); - playerCollider$3.Space.Remove(new sliceType$10([playerCollider$3])); - _i$10++; - } - $s = -1; return new RoomDownsyncFrame.ptr(currRenderFrame.Id + 1 >> 0, nextRenderFramePlayers, new $Int64(0, 0), nextRenderFrameMeleeBullets, sliceType$11.nil, new $Uint64(0, 0), false, false); - /* */ } return; } var $f = {$blk: ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame, $c: true, $r, _1, _2, _entry, _entry$1, _entry$2, _i, _i$1, _i$10, _i$2, _i$3, _i$4, _i$5, _i$6, _i$7, _i$8, _i$9, _index, _index$1, _index$2, _r, _r$1, _r$2, _r$3, _r$4, _r$5, _ref, _ref$1, _ref$10, _ref$11, _ref$12, _ref$13, _ref$14, _ref$2, _ref$3, _ref$4, _ref$5, _ref$6, _ref$7, _ref$8, _ref$9, _tmp, _tmp$1, _tmp$10, _tmp$11, _tmp$12, _tmp$13, _tmp$14, _tmp$15, _tmp$16, _tmp$17, _tmp$18, _tmp$19, _tmp$2, _tmp$20, _tmp$3, _tmp$4, _tmp$5, _tmp$6, _tmp$7, _tmp$8, _tmp$9, _tuple, _tuple$1, _tuple$10, _tuple$11, _tuple$2, _tuple$3, _tuple$4, _tuple$5, _tuple$6, _tuple$7, _tuple$8, _tuple$9, atkedPlayerInNextFrame, bShape, bulletCollider, bulletColliders, bulletShape, bulletWx, bulletWy, chConfig, chConfig$1, chConfig$2, chConfigsOrderedByJoinIndex, colliderHeight, colliderWidth, colliderWorldHeight, colliderWorldWidth, collision, collision$1, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currPlayerDownsync, currPlayerDownsync$1, currPlayerDownsync$2, currPlayerDownsync$3, currPlayerDownsync$4, currRenderFrame, defenderShape, effDx, effDy, effPushbacks, existent, existent$1, existent$2, halfColliderHeightDiff, halfColliderWidthDiff, halfColliderWorldHeightDiff, hardPushbackNorm, hardPushbackNorms, hasLockVel, hitboxSizeWx, hitboxSizeWy, i, i$1, i$2, i$3, i$4, inputsBuffer, isAnotherPlayer, isBarrier, isBullet, joinIndex, joinIndex$1, joinIndex$2, joinIndex$3, jumpedOrNot, jumpedOrNotList, landedOnGravityPushback, meleeBullet, newBullet, newBulletCollider, newVx, newVy, nextRenderFrameMeleeBullets, nextRenderFramePlayers, normAlignmentWithGravity, obj, obj$1, offender, offender$1, oldFramesToRecover, oldNextCharacterState, overlapResult, overlapped, overlapped$1, patternId, playerCollider, playerCollider$1, playerCollider$2, playerCollider$3, playerColliders, playerShape, projectedMagnitude, pushbackVelX, pushbackVelY, pushbackX, pushbackY, roomCapacity, skillConfig, skillId, t, t$1, thatPlayerInNextFrame, thatPlayerInNextFrame$1, thatPlayerInNextFrame$2, thatPlayerInNextFrame$3, v, v$1, wx, wy, x, x$1, x$10, x$11, x$12, x$13, x$14, x$2, x$3, x$4, x$5, x$6, x$7, x$8, x$9, xfac, xfac$1, xfac$2, $s};return $f; - }; - $pkg.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame = ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame; - GenerateRectCollider = function(wx, wy, w, h, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, data, tag) { - var {$24r, _r, _tuple, blX, blY, bottomPadding, data, h, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, tag, topPadding, w, wx, wy, $s, $r, $c} = $restore(this, {wx, wy, w, h, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, data, tag}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - _tuple = WorldToPolygonColliderBLPos(wx, wy, w * 0.5, h * 0.5, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY); - blX = _tuple[0]; - blY = _tuple[1]; - _r = generateRectColliderInCollisionSpace(blX, blY, leftPadding + w + rightPadding, bottomPadding + h + topPadding, data, tag); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - $24r = _r; - $s = 2; case 2: return $24r; - /* */ } return; } var $f = {$blk: GenerateRectCollider, $c: true, $r, $24r, _r, _tuple, blX, blY, bottomPadding, data, h, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, tag, topPadding, w, wx, wy, $s};return $f; - }; - $pkg.GenerateRectCollider = GenerateRectCollider; - generateRectColliderInCollisionSpace = function(blX, blY, w, h, data, tag) { - var {blX, blY, collider, data, h, shape, tag, w, $s, $r, $c} = $restore(this, {blX, blY, w, h, data, tag}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - collider = resolv.NewObject(blX, blY, w, h, new sliceType$4([tag])); - shape = resolv.NewRectangle(0, 0, w, h); - $r = collider.SetShape(shape); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - collider.Data = data; - $s = -1; return collider; - /* */ } return; } var $f = {$blk: generateRectColliderInCollisionSpace, $c: true, $r, blX, blY, collider, data, h, shape, tag, w, $s};return $f; - }; - GenerateConvexPolygonCollider = function(unalignedSrc, spaceOffsetX, spaceOffsetY, data, tag) { - var {_i, _i$1, _ref, _ref$1, _tmp, _tmp$1, aligned, collider, data, h, i, i$1, j, p, pi, pj, shape, spaceOffsetX, spaceOffsetY, tag, unalignedSrc, w, x, $s, $r, $c} = $restore(this, {unalignedSrc, spaceOffsetX, spaceOffsetY, data, tag}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - aligned = AlignPolygon2DToBoundingBox(unalignedSrc); - _tmp = 0; - _tmp$1 = 0; - w = _tmp; - h = _tmp$1; - shape = resolv.NewConvexPolygon(sliceType$12.nil); - _ref = aligned.Points; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - i = _i; - pi = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - _ref$1 = aligned.Points; - _i$1 = 0; - while (true) { - if (!(_i$1 < _ref$1.$length)) { break; } - j = _i$1; - pj = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); - if (i === j) { - _i$1++; - continue; - } - if (math.Abs(pj.X - pi.X) > w) { - w = math.Abs(pj.X - pi.X); - } - if (math.Abs(pj.Y - pi.Y) > h) { - h = math.Abs(pj.Y - pi.Y); - } - _i$1++; - } - _i++; - } - i$1 = 0; - while (true) { - if (!(i$1 < aligned.Points.$length)) { break; } - p = (x = aligned.Points, ((i$1 < 0 || i$1 >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + i$1])); - shape.AddPoints(new sliceType$12([p.X, p.Y])); - i$1 = i$1 + (1) >> 0; - } - collider = resolv.NewObject(aligned.Anchor.X + spaceOffsetX, aligned.Anchor.Y + spaceOffsetY, w, h, new sliceType$4([tag])); - $r = collider.SetShape(shape); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - collider.Data = data; - $s = -1; return collider; - /* */ } return; } var $f = {$blk: GenerateConvexPolygonCollider, $c: true, $r, _i, _i$1, _ref, _ref$1, _tmp, _tmp$1, aligned, collider, data, h, i, i$1, j, p, pi, pj, shape, spaceOffsetX, spaceOffsetY, tag, unalignedSrc, w, x, $s};return $f; - }; - $pkg.GenerateConvexPolygonCollider = GenerateConvexPolygonCollider; - AlignPolygon2DToBoundingBox = function(input) { - var _i, _i$1, _ref, _ref$1, boundingBoxBL, i, input, output, p, p$1, x; - boundingBoxBL = new Vec2D.ptr(1.7e+308, 1.7e+308); - _ref = input.Points; - _i = 0; - while (true) { - if (!(_i < _ref.$length)) { break; } - p = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - if (p.X < boundingBoxBL.X) { - boundingBoxBL.X = p.X; - } - if (p.Y < boundingBoxBL.Y) { - boundingBoxBL.Y = p.Y; - } - _i++; - } - output = new Polygon2D.ptr(new Vec2D.ptr(input.Anchor.X + boundingBoxBL.X, input.Anchor.Y + boundingBoxBL.Y), $makeSlice(sliceType$13, input.Points.$length)); - _ref$1 = input.Points; - _i$1 = 0; - while (true) { - if (!(_i$1 < _ref$1.$length)) { break; } - i = _i$1; - p$1 = ((_i$1 < 0 || _i$1 >= _ref$1.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$1.$array[_ref$1.$offset + _i$1]); - (x = output.Points, ((i < 0 || i >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + i] = new Vec2D.ptr(p$1.X - boundingBoxBL.X, p$1.Y - boundingBoxBL.Y))); - _i$1++; - } - return output; - }; - $pkg.AlignPolygon2DToBoundingBox = AlignPolygon2DToBoundingBox; - ptrType$12.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)}]; - Vec2D.init("", [{prop: "X", name: "X", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "Y", name: "Y", embedded: false, exported: true, typ: $Float64, tag: ""}]); - Polygon2D.init("", [{prop: "Anchor", name: "Anchor", embedded: false, exported: true, typ: ptrType$10, tag: ""}, {prop: "Points", name: "Points", embedded: false, exported: true, typ: sliceType$13, tag: ""}]); - PlayerDownsync.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: ""}, {prop: "FramesSelfLockVel", name: "FramesSelfLockVel", embedded: false, exported: true, typ: $Int32, tag: ""}]); - InputFrameDecoded.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: ""}]); - Barrier.init("", [{prop: "Boundary", name: "Boundary", embedded: false, exported: true, typ: ptrType$11, tag: ""}]); - Bullet.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: "FramesSelfLockVel", name: "FramesSelfLockVel", 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: mapType, tag: ""}]); - MeleeBullet.init("", [{prop: "Bullet", name: "Bullet", embedded: true, exported: true, typ: Bullet, tag: ""}]); - FireballBullet.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: Bullet, tag: ""}]); - Skill.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: sliceType$2, tag: ""}]); - RoomDownsyncFrame.init("", [{prop: "Id", name: "Id", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "PlayersArr", name: "PlayersArr", embedded: false, exported: true, typ: sliceType$6, tag: ""}, {prop: "CountdownNanos", name: "CountdownNanos", embedded: false, exported: true, typ: $Int64, tag: ""}, {prop: "MeleeBullets", name: "MeleeBullets", embedded: false, exported: true, typ: sliceType$7, tag: ""}, {prop: "FireballBullets", name: "FireballBullets", embedded: false, exported: true, typ: sliceType$11, 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: mapType, tag: ""}]); - InputFrameDownsync.init("", [{prop: "InputFrameId", name: "InputFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "InputList", name: "InputList", embedded: false, exported: true, typ: sliceType$5, tag: ""}, {prop: "ConfirmedList", name: "ConfirmedList", embedded: false, exported: true, typ: $Uint64, tag: ""}]); - RingBuffer.init("", [{prop: "Ed", name: "Ed", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "St", name: "St", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "EdFrameId", name: "EdFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "StFrameId", name: "StFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "N", name: "N", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Cnt", name: "Cnt", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Eles", name: "Eles", embedded: false, exported: true, typ: sliceType$2, tag: ""}]); - SkillMapperType.init([$Int, ptrType$5], [$Int], false); - CharacterConfig.init("", [{prop: "SpeciesId", name: "SpeciesId", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "SpeciesName", name: "SpeciesName", embedded: false, exported: true, typ: $String, tag: ""}, {prop: "InAirIdleFrameIdxTurningPoint", name: "InAirIdleFrameIdxTurningPoint", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "InAirIdleFrameIdxTurnedCycle", name: "InAirIdleFrameIdxTurnedCycle", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "LayDownFrames", name: "LayDownFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "LayDownFramesToRecover", name: "LayDownFramesToRecover", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "GetUpInvinsibleFrames", name: "GetUpInvinsibleFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "GetUpFramesToRecover", name: "GetUpFramesToRecover", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Speed", name: "Speed", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "JumpingInitVelY", name: "JumpingInitVelY", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "SkillMapper", name: "SkillMapper", embedded: false, exported: true, typ: SkillMapperType, tag: ""}]); - SatResult.init("", [{prop: "Overlap", name: "Overlap", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "OverlapX", name: "OverlapX", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "OverlapY", name: "OverlapY", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "AContainedInB", name: "AContainedInB", embedded: false, exported: true, typ: $Bool, tag: ""}, {prop: "BContainedInA", name: "BContainedInA", embedded: false, exported: true, typ: $Bool, tag: ""}, {prop: "Axis", name: "Axis", embedded: false, exported: true, typ: resolv.Vector, tag: ""}]); - $init = function() { - $pkg.$init = function() {}; - /* */ 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 = math.$init(); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - $r = resolv.$init(); /* */ $s = 2; case 2: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - $pkg.DIRECTION_DECODER = new sliceType$1([new sliceType([0, 0]), new sliceType([0, 2]), new sliceType([0, -2]), new sliceType([2, 0]), new sliceType([-2, 0]), new sliceType([1, 1]), new sliceType([-1, -1]), new sliceType([1, -1]), new sliceType([-1, 1])]); - skills = $makeMap($Int.keyFor, [{ k: 1, v: new Skill.ptr(0, 30, 30, 30, 1, 2, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 7, 13, 30, 22, 13, 9, 50, 0, 5, 5, -1, 0, 1200, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 2 }])))])) }, { k: 2, v: new Skill.ptr(0, 36, 36, 36, 1, 11, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 18, 22, 36, 18, 18, 9, 50, 0, 5, 10, -1, 0, 1800, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 3 }])))])) }, { k: 3, v: new Skill.ptr(0, 70, 70, 70, 1, 12, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 15, 0, 0, 30, 999999999, 9, 200, 700, 10, -1, -1, 0, 3200, 0, 4800, 3200, true, false))])) }, { k: 4, v: new Skill.ptr(0, 30, 30, 30, 1, 2, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 7, 13, 30, 22, 13, 9, 50, 0, 5, 5, -1, 0, 1200, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 5 }])))])) }, { k: 5, v: new Skill.ptr(0, 36, 36, 36, 1, 11, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 18, 22, 36, 18, 18, 9, 50, 0, 5, 10, -1, 0, 1800, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 6 }])))])) }, { k: 6, v: new Skill.ptr(0, 60, 60, 60, 1, 12, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 15, 0, 0, 40, 999999999, 9, 200, 700, 10, -10, -1, 0, 2400, 0, 3200, 3200, true, false))])) }, { k: 255, v: new Skill.ptr(0, 34, 34, 34, 1, 6, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 3, 0, 0, 20, 18, 9, 50, 0, 5, -1, -1, 0, 1200, 0, 3200, 2400, false, false))])) }, { k: 256, v: new Skill.ptr(0, 34, 34, 34, 1, 6, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 3, 0, 0, 20, 18, 9, 50, 0, 5, -1, -1, 0, 1200, 0, 3200, 2400, false, false))])) }]); - $pkg.Characters = $makeMap($Int.keyFor, [{ k: 0, v: new CharacterConfig.ptr(0, "MonkGirl", 11, 1, 16, 16, 10, 27, 120, 800, (function(patternId, currPlayerDownsync) { - var _entry, _entry$1, _ref, _tuple, _tuple$1, currPlayerDownsync, existent1, existent2, nextSkillId, patternId, skillConfig, v, x, x$1; - if (1 === patternId) { - if (0 === currPlayerDownsync.FramesToRecover) { - if (currPlayerDownsync.InAir) { - return 255; - } else { - return 1; - } - } else { - _tuple = (_entry = skills[$Int.keyFor(((currPlayerDownsync.ActiveSkillId >> 0)))], _entry !== undefined ? [_entry.v, true] : [ptrType.nil, false]); - skillConfig = _tuple[0]; - existent1 = _tuple[1]; - if (existent1) { - _ref = (x = skillConfig.Hits, x$1 = currPlayerDownsync.ActiveSkillHit, ((x$1 < 0 || x$1 >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + x$1])); - if ($assertType(_ref, ptrType$1, true)[1]) { - v = _ref.$val; - if (v.Bullet.CancellableStFrame <= currPlayerDownsync.FramesInChState && currPlayerDownsync.FramesInChState < v.Bullet.CancellableEdFrame) { - _tuple$1 = (_entry$1 = v.Bullet.CancelTransit[$Int.keyFor(patternId)], _entry$1 !== undefined ? [_entry$1.v, true] : [0, false]); - nextSkillId = _tuple$1[0]; - existent2 = _tuple$1[1]; - if (existent2) { - return nextSkillId; - } - } - } - } - } - } - return -1; - })) }, { k: 1, v: new CharacterConfig.ptr(1, "KnifeGirl", 9, 1, 16, 16, 10, 27, 140, 750, (function(patternId, currPlayerDownsync) { - var _entry, _entry$1, _ref, _tuple, _tuple$1, currPlayerDownsync, existent1, existent2, nextSkillId, patternId, skillConfig, v, x, x$1; - if (1 === patternId) { - if (0 === currPlayerDownsync.FramesToRecover) { - if (currPlayerDownsync.InAir) { - return 256; - } else { - return 4; - } - } else { - _tuple = (_entry = skills[$Int.keyFor(((currPlayerDownsync.ActiveSkillId >> 0)))], _entry !== undefined ? [_entry.v, true] : [ptrType.nil, false]); - skillConfig = _tuple[0]; - existent1 = _tuple[1]; - if (existent1) { - _ref = (x = skillConfig.Hits, x$1 = currPlayerDownsync.ActiveSkillHit, ((x$1 < 0 || x$1 >= x.$length) ? ($throwRuntimeError("index out of range"), undefined) : x.$array[x.$offset + x$1])); - if ($assertType(_ref, ptrType$1, true)[1]) { - v = _ref.$val; - if (v.Bullet.CancellableStFrame <= currPlayerDownsync.FramesInChState && currPlayerDownsync.FramesInChState < v.Bullet.CancellableEdFrame) { - _tuple$1 = (_entry$1 = v.Bullet.CancelTransit[$Int.keyFor(patternId)], _entry$1 !== undefined ? [_entry$1.v, true] : [0, false]); - nextSkillId = _tuple$1[0]; - existent2 = _tuple$1[1]; - if (existent2) { - return nextSkillId; - } - } - } - } - } - } - return -1; - })) }]); - inAirSet = $makeMap($Int32.keyFor, [{ k: 4, v: true }, { k: 5, v: true }, { k: 6, v: true }, { k: 7, v: true }, { k: 8, v: true }]); - noOpSet = $makeMap($Int32.keyFor, [{ k: 3, v: true }, { k: 7, v: true }, { k: 8, v: true }, { k: 9, v: true }]); - invinsibleSet = $makeMap($Int32.keyFor, [{ k: 8, v: true }, { k: 9, v: true }, { k: 10, v: true }]); - nonAttackingSet = $makeMap($Int32.keyFor, [{ k: 0, v: true }, { k: 1, v: true }, { k: 4, v: true }, { k: 5, v: true }, { k: 3, v: true }, { k: 7, v: true }, { k: 8, v: true }, { k: 9, v: true }, { k: 10, v: true }]); - /* */ } 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, js, battle, resolv, sliceType, ptrType, sliceType$1, ptrType$1, ptrType$2, sliceType$2, ptrType$3, sliceType$3, ptrType$4, sliceType$4, ptrType$5, sliceType$5, ptrType$6, funcType, funcType$1, funcType$2, funcType$3, funcType$4, funcType$5, funcType$6, funcType$7, funcType$8, funcType$9, funcType$10, ptrType$7, funcType$11, funcType$12, funcType$13, funcType$14, sliceType$6, funcType$15, ptrType$8, ptrType$9, ptrType$10, mapType, sliceType$7, funcType$16, funcType$17, funcType$18, mapType$1, NewInputFrameDownsync, NewRingBufferJs, NewCollisionSpaceJs, NewVec2DJs, NewPolygon2DJs, NewBarrierJs, NewPlayerDownsyncJs, NewMeleeBulletJs, NewRoomDownsyncFrameJs, GetCollisionSpaceObjsJs, GenerateRectColliderJs, GenerateConvexPolygonColliderJs, GetCharacterConfigsOrderedByJoinIndex, ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs, main; - js = $packages["github.com/gopherjs/gopherjs/js"]; - battle = $packages["jsexport/battle"]; - resolv = $packages["resolv"]; - sliceType = $sliceType($Uint64); - ptrType = $ptrType(battle.Vec2D); - sliceType$1 = $sliceType(ptrType); - ptrType$1 = $ptrType(battle.Polygon2D); - ptrType$2 = $ptrType(battle.PlayerDownsync); - sliceType$2 = $sliceType(ptrType$2); - ptrType$3 = $ptrType(battle.MeleeBullet); - sliceType$3 = $sliceType(ptrType$3); - ptrType$4 = $ptrType(battle.FireballBullet); - sliceType$4 = $sliceType(ptrType$4); - ptrType$5 = $ptrType(js.Object); - sliceType$5 = $sliceType(ptrType$5); - ptrType$6 = $ptrType(battle.CharacterConfig); - funcType = $funcType([$Float64, $Float64], [ptrType$5], false); - funcType$1 = $funcType([ptrType, sliceType$1], [ptrType$5], false); - funcType$2 = $funcType([ptrType$1], [ptrType$5], false); - funcType$3 = $funcType([$Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Bool], [ptrType$5], false); - funcType$4 = $funcType([$Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Bool], [ptrType$5], false); - funcType$5 = $funcType([$Int32, sliceType$2, sliceType$3], [ptrType$5], false); - funcType$6 = $funcType([$Int, $Int, $Int, $Int], [ptrType$5], false); - funcType$7 = $funcType([$Int32, sliceType, $Uint64], [ptrType$5], false); - funcType$8 = $funcType([$Int32], [ptrType$5], false); - funcType$9 = $funcType([$Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $emptyInterface, $String], [ptrType$5], false); - funcType$10 = $funcType([ptrType$1, $Float64, $Float64, $emptyInterface, $String], [ptrType$5], false); - ptrType$7 = $ptrType(resolv.Space); - funcType$11 = $funcType([ptrType$7], [sliceType$5], false); - funcType$12 = $funcType([$Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64], [$Float64, $Float64], false); - funcType$13 = $funcType([$Float64, $Float64], [$Int32, $Int32], false); - funcType$14 = $funcType([$Int32, $Int32], [$Float64, $Float64], false); - sliceType$6 = $sliceType($Int); - funcType$15 = $funcType([sliceType$6], [sliceType$5], false); - ptrType$8 = $ptrType(battle.RingBuffer); - ptrType$9 = $ptrType(battle.RoomDownsyncFrame); - ptrType$10 = $ptrType(resolv.Object); - mapType = $mapType($Int32, ptrType$10); - sliceType$7 = $sliceType(ptrType$6); - funcType$16 = $funcType([ptrType$8, ptrType$9, ptrType$7, mapType, $Float64, $Float64, sliceType$7], [ptrType$5], false); - funcType$17 = $funcType([$Int32], [$Int32], false); - funcType$18 = $funcType([$Int32], [$Bool], false); - mapType$1 = $mapType($String, $emptyInterface); - NewInputFrameDownsync = function(inputFrameId, inputList, confirmedList) { - var {$24r, _r, confirmedList, inputFrameId, inputList, $s, $r, $c} = $restore(this, {inputFrameId, inputList, confirmedList}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - _r = js.MakeFullWrapper(new battle.InputFrameDownsync.ptr(inputFrameId, inputList, confirmedList)); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - $24r = _r; - $s = 2; case 2: return $24r; - /* */ } return; } var $f = {$blk: NewInputFrameDownsync, $c: true, $r, $24r, _r, confirmedList, inputFrameId, inputList, $s};return $f; - }; - $pkg.NewInputFrameDownsync = NewInputFrameDownsync; - NewRingBufferJs = function(n) { - var {$24r, _r, n, $s, $r, $c} = $restore(this, {n}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - _r = js.MakeFullWrapper(battle.NewRingBuffer(n)); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - $24r = _r; - $s = 2; case 2: return $24r; - /* */ } return; } var $f = {$blk: NewRingBufferJs, $c: true, $r, $24r, _r, n, $s};return $f; - }; - $pkg.NewRingBufferJs = NewRingBufferJs; - NewCollisionSpaceJs = function(spaceW, spaceH, minStepW, minStepH) { - var minStepH, minStepW, spaceH, spaceW; - return js.MakeWrapper(resolv.NewSpace(spaceW, spaceH, minStepW, minStepH)); - }; - $pkg.NewCollisionSpaceJs = NewCollisionSpaceJs; - NewVec2DJs = function(x, y) { - var {$24r, _r, x, y, $s, $r, $c} = $restore(this, {x, y}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - _r = js.MakeFullWrapper(new battle.Vec2D.ptr(x, y)); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - $24r = _r; - $s = 2; case 2: return $24r; - /* */ } return; } var $f = {$blk: NewVec2DJs, $c: true, $r, $24r, _r, x, y, $s};return $f; - }; - $pkg.NewVec2DJs = NewVec2DJs; - NewPolygon2DJs = function(anchor, points) { - var {$24r, _r, anchor, points, $s, $r, $c} = $restore(this, {anchor, points}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - _r = js.MakeFullWrapper(new battle.Polygon2D.ptr(anchor, points)); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - $24r = _r; - $s = 2; case 2: return $24r; - /* */ } return; } var $f = {$blk: NewPolygon2DJs, $c: true, $r, $24r, _r, anchor, points, $s};return $f; - }; - $pkg.NewPolygon2DJs = NewPolygon2DJs; - NewBarrierJs = function(boundary) { - var boundary; - return js.MakeWrapper(new battle.Barrier.ptr(boundary)); - }; - $pkg.NewBarrierJs = NewBarrierJs; - NewPlayerDownsyncJs = function(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, framesToRecover, framesInChState, activeSkillId, activeSkillHit, framesInvinsible, framesSelfLockVel, speed, battleState, characterState, joinIndex, hp, maxHp, colliderRadius, inAir) { - var activeSkillHit, activeSkillId, battleState, characterState, colliderRadius, dirX, dirY, framesInChState, framesInvinsible, framesSelfLockVel, framesToRecover, hp, id, inAir, joinIndex, maxHp, speed, velX, velY, virtualGridX, virtualGridY; - return js.MakeWrapper(new battle.PlayerDownsync.ptr(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, speed, battleState, joinIndex, colliderRadius, false, 0, 0, framesToRecover, framesInChState, hp, maxHp, characterState, inAir, activeSkillId, activeSkillHit, framesInvinsible, 0)); - }; - $pkg.NewPlayerDownsyncJs = NewPlayerDownsyncJs; - NewMeleeBulletJs = function(originatedRenderFrameId, offenderJoinIndex, startupFrames, cancellableStFrame, cancellableEdFrame, activeFrames, hitStunFrames, blockStunFrames, pushbackVelX, pushbackVelY, damage, selfLockVelX, selfLockVelY, framesSelfLockVel, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY, blowUp) { - var activeFrames, blockStunFrames, blowUp, cancellableEdFrame, cancellableStFrame, damage, framesSelfLockVel, hitStunFrames, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY, offenderJoinIndex, originatedRenderFrameId, pushbackVelX, pushbackVelY, selfLockVelX, selfLockVelY, startupFrames; - return js.MakeWrapper(new battle.MeleeBullet.ptr(new battle.Bullet.ptr(originatedRenderFrameId, offenderJoinIndex, startupFrames, cancellableStFrame, cancellableEdFrame, activeFrames, hitStunFrames, blockStunFrames, pushbackVelX, pushbackVelY, damage, selfLockVelX, selfLockVelY, framesSelfLockVel, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY, blowUp, false))); - }; - $pkg.NewMeleeBulletJs = NewMeleeBulletJs; - NewRoomDownsyncFrameJs = function(id, playersArr, meleeBullets) { - var {$24r, _r, id, meleeBullets, playersArr, $s, $r, $c} = $restore(this, {id, playersArr, meleeBullets}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - _r = js.MakeFullWrapper(new battle.RoomDownsyncFrame.ptr(id, playersArr, new $Int64(0, 0), meleeBullets, sliceType$4.nil, new $Uint64(0, 0), false, false)); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - $24r = _r; - $s = 2; case 2: return $24r; - /* */ } return; } var $f = {$blk: NewRoomDownsyncFrameJs, $c: true, $r, $24r, _r, id, meleeBullets, playersArr, $s};return $f; - }; - $pkg.NewRoomDownsyncFrameJs = NewRoomDownsyncFrameJs; - GetCollisionSpaceObjsJs = function(space) { - var {_i, _r, _ref, obj, objs, ret, space, $s, $r, $c} = $restore(this, {space}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - objs = space.Objects(); - ret = $makeSlice(sliceType$5, 0, objs.$length); - _ref = objs; - _i = 0; - /* while (true) { */ case 1: - /* if (!(_i < _ref.$length)) { break; } */ if(!(_i < _ref.$length)) { $s = 2; continue; } - obj = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - _r = js.MakeFullWrapper(obj); /* */ $s = 3; case 3: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - ret = $append(ret, _r); - _i++; - $s = 1; continue; - case 2: - $s = -1; return ret; - /* */ } return; } var $f = {$blk: GetCollisionSpaceObjsJs, $c: true, $r, _i, _r, _ref, obj, objs, ret, space, $s};return $f; - }; - $pkg.GetCollisionSpaceObjsJs = GetCollisionSpaceObjsJs; - GenerateRectColliderJs = function(wx, wy, w, h, spaceOffsetX, spaceOffsetY, data, tag) { - var {$24r, _r, _r$1, _tmp, _tmp$1, _tmp$2, _tmp$3, bottomPadding, data, h, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, tag, topPadding, w, wx, wy, $s, $r, $c} = $restore(this, {wx, wy, w, h, spaceOffsetX, spaceOffsetY, data, tag}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - _tmp = 0.1; - _tmp$1 = 0.1; - _tmp$2 = 0.1; - _tmp$3 = 0.1; - topPadding = _tmp; - bottomPadding = _tmp$1; - leftPadding = _tmp$2; - rightPadding = _tmp$3; - _r = battle.GenerateRectCollider(wx, wy, w, h, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, data, tag); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - _r$1 = js.MakeFullWrapper(_r); /* */ $s = 2; case 2: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } - $24r = _r$1; - $s = 3; case 3: return $24r; - /* */ } return; } var $f = {$blk: GenerateRectColliderJs, $c: true, $r, $24r, _r, _r$1, _tmp, _tmp$1, _tmp$2, _tmp$3, bottomPadding, data, h, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, tag, topPadding, w, wx, wy, $s};return $f; - }; - $pkg.GenerateRectColliderJs = GenerateRectColliderJs; - GenerateConvexPolygonColliderJs = function(unalignedSrc, spaceOffsetX, spaceOffsetY, data, tag) { - var {$24r, _r, _r$1, data, spaceOffsetX, spaceOffsetY, tag, unalignedSrc, $s, $r, $c} = $restore(this, {unalignedSrc, spaceOffsetX, spaceOffsetY, data, tag}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - _r = battle.GenerateConvexPolygonCollider(unalignedSrc, spaceOffsetX, spaceOffsetY, data, tag); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - _r$1 = js.MakeFullWrapper(_r); /* */ $s = 2; case 2: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } - $24r = _r$1; - $s = 3; case 3: return $24r; - /* */ } return; } var $f = {$blk: GenerateConvexPolygonColliderJs, $c: true, $r, $24r, _r, _r$1, data, spaceOffsetX, spaceOffsetY, tag, unalignedSrc, $s};return $f; - }; - $pkg.GenerateConvexPolygonColliderJs = GenerateConvexPolygonColliderJs; - GetCharacterConfigsOrderedByJoinIndex = function(speciesIdList) { - var {_entry, _i, _r, _ref, i, ret, speciesId, speciesIdList, $s, $r, $c} = $restore(this, {speciesIdList}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - ret = $makeSlice(sliceType$5, speciesIdList.$length, speciesIdList.$length); - _ref = speciesIdList; - _i = 0; - /* while (true) { */ case 1: - /* if (!(_i < _ref.$length)) { break; } */ if(!(_i < _ref.$length)) { $s = 2; continue; } - i = _i; - speciesId = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - _r = js.MakeFullWrapper((_entry = battle.Characters[$Int.keyFor(speciesId)], _entry !== undefined ? _entry.v : ptrType$6.nil)); /* */ $s = 3; case 3: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - ((i < 0 || i >= ret.$length) ? ($throwRuntimeError("index out of range"), undefined) : ret.$array[ret.$offset + i] = _r); - _i++; - $s = 1; continue; - case 2: - $s = -1; return ret; - /* */ } return; } var $f = {$blk: GetCharacterConfigsOrderedByJoinIndex, $c: true, $r, _entry, _i, _r, _ref, i, ret, speciesId, speciesIdList, $s};return $f; - }; - $pkg.GetCharacterConfigsOrderedByJoinIndex = GetCharacterConfigsOrderedByJoinIndex; - ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs = function(inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, chConfigsOrderedByJoinIndex) { - var {$24r, _r, _r$1, chConfigsOrderedByJoinIndex, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currRenderFrame, inputsBuffer, $s, $r, $c} = $restore(this, {inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, chConfigsOrderedByJoinIndex}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - _r = battle.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, chConfigsOrderedByJoinIndex); /* */ $s = 1; case 1: if($c) { $c = false; _r = _r.$blk(); } if (_r && _r.$blk !== undefined) { break s; } - _r$1 = js.MakeFullWrapper(_r); /* */ $s = 2; case 2: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } - $24r = _r$1; - $s = 3; case 3: return $24r; - /* */ } return; } var $f = {$blk: ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs, $c: true, $r, $24r, _r, _r$1, chConfigsOrderedByJoinIndex, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currRenderFrame, inputsBuffer, $s};return $f; - }; - $pkg.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs = ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs; - main = function() { - $global.gopkgs = $externalize($makeMap($String.keyFor, [{ k: "NewVec2DJs", v: new funcType(NewVec2DJs) }, { k: "NewPolygon2DJs", v: new funcType$1(NewPolygon2DJs) }, { k: "NewBarrierJs", v: new funcType$2(NewBarrierJs) }, { k: "NewPlayerDownsyncJs", v: new funcType$3(NewPlayerDownsyncJs) }, { k: "NewMeleeBulletJs", v: new funcType$4(NewMeleeBulletJs) }, { k: "NewRoomDownsyncFrameJs", v: new funcType$5(NewRoomDownsyncFrameJs) }, { k: "NewCollisionSpaceJs", v: new funcType$6(NewCollisionSpaceJs) }, { k: "NewInputFrameDownsync", v: new funcType$7(NewInputFrameDownsync) }, { k: "NewRingBufferJs", v: new funcType$8(NewRingBufferJs) }, { k: "GenerateRectColliderJs", v: new funcType$9(GenerateRectColliderJs) }, { k: "GenerateConvexPolygonColliderJs", v: new funcType$10(GenerateConvexPolygonColliderJs) }, { k: "GetCollisionSpaceObjsJs", v: new funcType$11(GetCollisionSpaceObjsJs) }, { k: "WorldToPolygonColliderBLPos", v: new funcType$12(battle.WorldToPolygonColliderBLPos) }, { k: "PolygonColliderBLToWorldPos", v: new funcType$12(battle.PolygonColliderBLToWorldPos) }, { k: "WorldToVirtualGridPos", v: new funcType$13(battle.WorldToVirtualGridPos) }, { k: "VirtualGridToWorldPos", v: new funcType$14(battle.VirtualGridToWorldPos) }, { k: "GetCharacterConfigsOrderedByJoinIndex", v: new funcType$15(GetCharacterConfigsOrderedByJoinIndex) }, { k: "ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs", v: new funcType$16(ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs) }, { k: "ConvertToDelayedInputFrameId", v: new funcType$17(battle.ConvertToDelayedInputFrameId) }, { k: "ConvertToNoDelayInputFrameId", v: new funcType$17(battle.ConvertToNoDelayInputFrameId) }, { k: "ConvertToFirstUsedRenderFrameId", v: new funcType$17(battle.ConvertToFirstUsedRenderFrameId) }, { k: "ConvertToLastUsedRenderFrameId", v: new funcType$17(battle.ConvertToLastUsedRenderFrameId) }, { k: "ShouldGenerateInputFrameUpsync", v: new funcType$18(battle.ShouldGenerateInputFrameUpsync) }]), mapType$1); - }; - $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 = js.$init(); /* */ $s = 1; case 1: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - $r = battle.$init(); /* */ $s = 2; case 2: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - $r = resolv.$init(); /* */ $s = 3; case 3: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } - if ($pkg === $mainPkg) { - main(); - $mainFinished = true; - } - /* */ } return; } if ($f === undefined) { $f = { $blk: $init }; } $f.$s = $s; $f.$r = $r; return $f; - }; - $pkg.$init = $init; - return $pkg; -})(); +Error.stackTraceLimit=1/0;var $global,$module,$NaN=NaN;if("undefined"!=typeof window?$global=window:"undefined"!=typeof self?$global=self:"undefined"!=typeof global?($global=global).require=require:$global=this,void 0===$global||void 0===$global.Array)throw new Error("no global object found");if("undefined"!=typeof module&&($module=module),!$global.fs&&$global.require)try{var fs=$global.require("fs");"object"==typeof fs&&null!==fs&&0!==Object.keys(fs).length&&($global.fs=fs)}catch(e){}if(!$global.fs){var outputBuf="",decoder=new TextDecoder("utf-8");$global.fs={constants:{O_WRONLY:-1,O_RDWR:-1,O_CREAT:-1,O_TRUNC:-1,O_APPEND:-1,O_EXCL:-1},writeSync:function(e,n){var r=(outputBuf+=decoder.decode(n)).lastIndexOf("\n");return-1!=r&&(console.log(outputBuf.substr(0,r)),outputBuf=outputBuf.substr(r+1)),n.length},write:function(e,n,r,t,i,a){0===r&&t===n.length&&null===i?a(null,this.writeSync(e,n)):a(enosys())}}}var $throwRuntimeError,$linknames={},$packages={},$idCounter=0,$keys=function(e){return e?Object.keys(e):[]},$flushConsole=function(){},$throwNilPointerError=function(){$throwRuntimeError("invalid memory address or nil pointer dereference")},$call=function(e,n,r){return e.apply(n,r)},$makeFunc=function(e){return function(){return $externalize(e(this,new($sliceType($jsObjectPtr))($global.Array.prototype.slice.call(arguments,[]))),$emptyInterface)}},$unused=function(e){},$print=console.log;if(void 0!==$global.process&&$global.require)try{var util=$global.require("util");$print=function(){$global.process.stderr.write(util.format.apply(this,arguments))}}catch(e){}var $println=console.log,$initAllLinknames=function(){for(var e=$keys($packages),n=0;ne.$capacity||t>e.$capacity)&&$throwRuntimeError("slice bounds out of range"),e===e.constructor.nil)return e;var i=new e.constructor(e.$array);return i.$offset=e.$offset+n,i.$length=r-n,i.$capacity=t-n,i},$substring=function(e,n,r){return(n<0||re.length)&&$throwRuntimeError("slice bounds out of range"),e.substring(n,r)},$sliceToNativeArray=function(e){return e.$array.constructor!==Array?e.$array.subarray(e.$offset,e.$offset+e.$length):e.$array.slice(e.$offset,e.$offset+e.$length)},$sliceToGoArray=function(e,n){var r=n.elem;return void 0!==r&&e.$length1114111||55296<=e&&e<=57343)&&(e=65533),e<=127?String.fromCharCode(e):e<=2047?String.fromCharCode(192|e>>6,128|63&e):e<=65535?String.fromCharCode(224|e>>12,128|e>>6&63,128|63&e):String.fromCharCode(240|e>>18,128|e>>12&63,128|e>>6&63,128|63&e)},$stringToBytes=function(e){for(var n=new Uint8Array(e.length),r=0;rt){for(var o=i-1;o>=0;o--)a.copy(e[r+o],n[t+o]);return}for(o=0;ot)for(o=i-1;o>=0;o--)e[r+o]=n[t+o];else for(o=0;oc)if(a=0,c=Math.max(o,e.$capacity<1024?2*e.$capacity:Math.floor(5*e.$capacity/4)),e.$array.constructor===Array){(i=e.$array.slice(e.$offset,e.$offset+e.$length)).length=c;for(var $=e.constructor.elem.zero,u=e.$length;u>>16&65535)*t+r*(n>>>16&65535)<<16>>>0)>>0},$floatKey=function(e){return e!=e?"NaN$"+ ++$idCounter:String(e)},$flatten64=function(e){return 4294967296*e.$high+e.$low},$shiftLeft64=function(e,n){return 0===n?e:n<32?new e.constructor(e.$high<>>32-n,e.$low<>>0):n<64?new e.constructor(e.$low<>n,(e.$low>>>n|e.$high<<32-n)>>>0):n<64?new e.constructor(e.$high>>31,e.$high>>n-32>>>0):e.$high<0?new e.constructor(-1,4294967295):new e.constructor(0,0)},$shiftRightUint64=function(e,n){return 0===n?e:n<32?new e.constructor(e.$high>>>n,(e.$low>>>n|e.$high<<32-n)>>>0):n<64?new e.constructor(0,e.$high>>>n-32):new e.constructor(0,0)},$mul64=function(e,n){var r=e.$high>>>16,t=65535&e.$high,i=e.$low>>>16,a=65535&e.$low,o=n.$high>>>16,c=65535&n.$high,$=n.$low>>>16,u=65535&n.$low,l=0,s=0,f=0,d=0;f+=(d+=a*u)>>>16,s+=(f+=i*u)>>>16,f&=65535,s+=(f+=a*$)>>>16,l+=(s+=t*u)>>>16,s&=65535,l+=(s+=i*$)>>>16,s&=65535,l+=(s+=a*c)>>>16,l+=r*u+t*$+i*c+a*o;var p=((l&=65535)<<16|(s&=65535))>>>0,h=((f&=65535)<<16|(d&=65535))>>>0;return new e.constructor(p,h)},$div64=function(e,n,r){0===n.$high&&0===n.$low&&$throwRuntimeError("integer divide by zero");var t=1,i=1,a=e.$high,o=e.$low;a<0&&(t=-1,i=-1,a=-a,0!==o&&(a--,o=4294967296-o));var c=n.$high,$=n.$low;n.$high<0&&(t*=-1,c=-c,0!==$&&(c--,$=4294967296-$));for(var u=0,l=0,s=0;c<2147483648&&(a>c||a===c&&o>$);)c=(c<<1|$>>>31)>>>0,$=$<<1>>>0,s++;for(var f=0;f<=s;f++)u=u<<1|l>>>31,l=l<<1>>>0,(a>c||a===c&&o>=$)&&(a-=c,(o-=$)<0&&(a--,o+=4294967296),4294967296===++l&&(u++,l=0)),$=($>>>1|c<<31)>>>0,c>>>=1;return r?new e.constructor(a*i,o*i):new e.constructor(u*t,l*t)},$divComplex=function(e,n){var r=e.$real===1/0||e.$real===-1/0||e.$imag===1/0||e.$imag===-1/0,t=n.$real===1/0||n.$real===-1/0||n.$imag===1/0||n.$imag===-1/0,i=!r&&(e.$real!=e.$real||e.$imag!=e.$imag),a=!t&&(n.$real!=n.$real||n.$imag!=n.$imag);if(i||a)return new e.constructor(NaN,NaN);if(r&&!t)return new e.constructor(1/0,1/0);if(!r&&t)return new e.constructor(0,0);if(0===n.$real&&0===n.$imag)return 0===e.$real&&0===e.$imag?new e.constructor(NaN,NaN):new e.constructor(1/0,1/0);if(Math.abs(n.$real)<=Math.abs(n.$imag)){var o=n.$real/n.$imag,c=n.$real*o+n.$imag;return new e.constructor((e.$real*o+e.$imag)/c,(e.$imag*o-e.$real)/c)}o=n.$imag/n.$real,c=n.$imag*o+n.$real;return new e.constructor((e.$imag*o+e.$real)/c,(e.$imag-e.$real*o)/c)},$kindBool=1,$kindInt=2,$kindInt8=3,$kindInt16=4,$kindInt32=5,$kindInt64=6,$kindUint=7,$kindUint8=8,$kindUint16=9,$kindUint32=10,$kindUint64=11,$kindUintptr=12,$kindFloat32=13,$kindFloat64=14,$kindComplex64=15,$kindComplex128=16,$kindArray=17,$kindChan=18,$kindFunc=19,$kindInterface=20,$kindMap=21,$kindPtr=22,$kindSlice=23,$kindString=24,$kindStruct=25,$kindUnsafePointer=26,$methodSynthesizers=[],$addMethodSynthesizer=function(e){null!==$methodSynthesizers?$methodSynthesizers.push(e):e()},$synthesizeMethods=function(){$methodSynthesizers.forEach(function(e){e()}),$methodSynthesizers=null},$ifaceKeyFor=function(e){if(e===$ifaceNil)return"nil";var n=e.constructor;return n.string+"$"+n.keyFor(e.$val)},$identity=function(e){return e},$typeIDCounter=0,$idKey=function(e){return void 0===e.$id&&($idCounter++,e.$id=$idCounter),String(e.$id)},$arrayPtrCtor=function(){return function(e){this.$get=function(){return e},this.$set=function(e){typ.copy(this,e)},this.$val=e}},$newType=function(e,n,r,t,i,a,o){var c;switch(n){case $kindBool:case $kindInt:case $kindInt8:case $kindInt16:case $kindInt32:case $kindUint:case $kindUint8:case $kindUint16:case $kindUint32:case $kindUintptr:case $kindUnsafePointer:(c=function(e){this.$val=e}).wrapped=!0,c.keyFor=$identity;break;case $kindString:(c=function(e){this.$val=e}).wrapped=!0,c.keyFor=function(e){return"$"+e};break;case $kindFloat32:case $kindFloat64:(c=function(e){this.$val=e}).wrapped=!0,c.keyFor=function(e){return $floatKey(e)};break;case $kindInt64:(c=function(e,n){this.$high=e+Math.floor(Math.ceil(n)/4294967296)>>0,this.$low=n>>>0,this.$val=this}).keyFor=function(e){return e.$high+"$"+e.$low};break;case $kindUint64:(c=function(e,n){this.$high=e+Math.floor(Math.ceil(n)/4294967296)>>>0,this.$low=n>>>0,this.$val=this}).keyFor=function(e){return e.$high+"$"+e.$low};break;case $kindComplex64:(c=function(e,n){this.$real=$fround(e),this.$imag=$fround(n),this.$val=this}).keyFor=function(e){return e.$real+"$"+e.$imag};break;case $kindComplex128:(c=function(e,n){this.$real=e,this.$imag=n,this.$val=this}).keyFor=function(e){return e.$real+"$"+e.$imag};break;case $kindArray:(c=function(e){this.$val=e}).wrapped=!0,c.ptr=$newType(4,$kindPtr,"*"+r,!1,"",!1,$arrayPtrCtor()),c.init=function(e,n){c.elem=e,c.len=n,c.comparable=e.comparable,c.keyFor=function(n){return Array.prototype.join.call($mapArray(n,function(n){return String(e.keyFor(n)).replace(/\\/g,"\\\\").replace(/\$/g,"\\$")}),"$")},c.copy=function(n,r){$copyArray(n,r,0,0,r.length,e)},c.ptr.init(c),Object.defineProperty(c.ptr.nil,"nilCheck",{get:$throwNilPointerError})};break;case $kindChan:(c=function(e){this.$val=e}).wrapped=!0,c.keyFor=$idKey,c.init=function(e,n,r){c.elem=e,c.sendOnly=n,c.recvOnly=r};break;case $kindFunc:(c=function(e){this.$val=e}).wrapped=!0,c.init=function(e,n,r){c.params=e,c.results=n,c.variadic=r,c.comparable=!1};break;case $kindInterface:(c={implementedBy:{},missingMethodFor:{}}).keyFor=$ifaceKeyFor,c.init=function(e){c.methods=e,e.forEach(function(e){$ifaceNil[e.prop]=$throwNilPointerError})};break;case $kindMap:(c=function(e){this.$val=e}).wrapped=!0,c.init=function(e,n){c.key=e,c.elem=n,c.comparable=!1};break;case $kindPtr:(c=o||function(e,n,r){this.$get=e,this.$set=n,this.$target=r,this.$val=this}).keyFor=$idKey,c.init=function(e){c.elem=e,c.wrapped=e.kind===$kindArray,c.nil=new c($throwNilPointerError,$throwNilPointerError)};break;case $kindSlice:(c=function(e){e.constructor!==c.nativeArray&&(e=new c.nativeArray(e)),this.$array=e,this.$offset=0,this.$length=e.length,this.$capacity=e.length,this.$val=this}).init=function(e){c.elem=e,c.comparable=!1,c.nativeArray=$nativeArray(e.kind),c.nil=new c([])};break;case $kindStruct:(c=function(e){this.$val=e}).wrapped=!0,c.ptr=$newType(4,$kindPtr,"*"+r,!1,i,a,o),c.ptr.elem=c,c.ptr.prototype.$get=function(){return this},c.ptr.prototype.$set=function(e){c.copy(this,e)},c.init=function(e,n){c.pkgPath=e,c.fields=n,n.forEach(function(e){e.typ.comparable||(c.comparable=!1)}),c.keyFor=function(e){var r=e.$val;return $mapArray(n,function(e){return String(e.typ.keyFor(r[e.prop])).replace(/\\/g,"\\\\").replace(/\$/g,"\\$")}).join("$")},c.copy=function(e,r){for(var t=0;t0;){var a=[],o=[];t.forEach(function(e){if(!i[e.typ.string])switch(i[e.typ.string]=!0,e.typ.named&&(o=o.concat(e.typ.methods),e.indirect&&(o=o.concat($ptrType(e.typ).methods))),e.typ.kind){case $kindStruct:e.typ.fields.forEach(function(n){if(n.embedded){var r=n.typ,t=r.kind===$kindPtr;a.push({typ:t?r.elem:r,indirect:e.indirect||t})}});break;case $kindInterface:o=o.concat(e.typ.methods)}}),o.forEach(function(e){void 0===n[e.name]&&(n[e.name]=e)}),t=a}return e.methodSetCache=[],Object.keys(n).sort().forEach(function(r){e.methodSetCache.push(n[r])}),e.methodSetCache},$Bool=$newType(1,$kindBool,"bool",!0,"",!1,null),$Int=$newType(4,$kindInt,"int",!0,"",!1,null),$Int8=$newType(1,$kindInt8,"int8",!0,"",!1,null),$Int16=$newType(2,$kindInt16,"int16",!0,"",!1,null),$Int32=$newType(4,$kindInt32,"int32",!0,"",!1,null),$Int64=$newType(8,$kindInt64,"int64",!0,"",!1,null),$Uint=$newType(4,$kindUint,"uint",!0,"",!1,null),$Uint8=$newType(1,$kindUint8,"uint8",!0,"",!1,null),$Uint16=$newType(2,$kindUint16,"uint16",!0,"",!1,null),$Uint32=$newType(4,$kindUint32,"uint32",!0,"",!1,null),$Uint64=$newType(8,$kindUint64,"uint64",!0,"",!1,null),$Uintptr=$newType(4,$kindUintptr,"uintptr",!0,"",!1,null),$Float32=$newType(4,$kindFloat32,"float32",!0,"",!1,null),$Float64=$newType(8,$kindFloat64,"float64",!0,"",!1,null),$Complex64=$newType(8,$kindComplex64,"complex64",!0,"",!1,null),$Complex128=$newType(16,$kindComplex128,"complex128",!0,"",!1,null),$String=$newType(8,$kindString,"string",!0,"",!1,null),$UnsafePointer=$newType(4,$kindUnsafePointer,"unsafe.Pointer",!0,"unsafe",!1,null),$nativeArray=function(e){switch(e){case $kindInt:return Int32Array;case $kindInt8:return Int8Array;case $kindInt16:return Int16Array;case $kindInt32:return Int32Array;case $kindUint:return Uint32Array;case $kindUint8:return Uint8Array;case $kindUint16:return Uint16Array;case $kindUint32:case $kindUintptr:return Uint32Array;case $kindFloat32:return Float32Array;case $kindFloat64:return Float64Array;default:return Array}},$toNativeArray=function(e,n){var r=$nativeArray(e);return r===Array?n:new r(n)},$arrayTypes={},$arrayType=function(e,n){var r=e.id+"$"+n,t=$arrayTypes[r];return void 0===t&&(t=$newType(12,$kindArray,"["+n+"]"+e.string,!1,"",!1,null),$arrayTypes[r]=t,t.init(e,n)),t},$chanType=function(e,n,r){var t=(r?"<-":"")+"chan"+(n?"<- ":" ");n||r||"<"!=e.string[0]?t+=e.string:t+="("+e.string+")";var i=n?"SendChan":r?"RecvChan":"Chan",a=e[i];return void 0===a&&(a=$newType(4,$kindChan,t,!1,"",!1,null),e[i]=a,a.init(e,n,r)),a},$Chan=function(e,n){(n<0||n>2147483647)&&$throwRuntimeError("makechan: size out of range"),this.$elem=e,this.$capacity=n,this.$buffer=[],this.$sendQueue=[],this.$recvQueue=[],this.$closed=!1},$chanNil=new $Chan(null,0);$chanNil.$sendQueue=$chanNil.$recvQueue={length:0,push:function(){},shift:function(){},indexOf:function(){return-1}};var $funcTypes={},$funcType=function(e,n,r){var t=$mapArray(e,function(e){return e.id}).join(",")+"$"+$mapArray(n,function(e){return e.id}).join(",")+"$"+r,i=$funcTypes[t];if(void 0===i){var a=$mapArray(e,function(e){return e.string});r&&(a[a.length-1]="..."+a[a.length-1].substr(2));var o="func("+a.join(", ")+")";1===n.length?o+=" "+n[0].string:n.length>1&&(o+=" ("+$mapArray(n,function(e){return e.string}).join(", ")+")"),i=$newType(4,$kindFunc,o,!1,"",!1,null),$funcTypes[t]=i,i.init(e,n,r)}return i},$interfaceTypes={},$interfaceType=function(e){var n=$mapArray(e,function(e){return e.pkg+","+e.name+","+e.typ.id}).join("$"),r=$interfaceTypes[n];if(void 0===r){var t="interface {}";0!==e.length&&(t="interface { "+$mapArray(e,function(e){return(""!==e.pkg?e.pkg+".":"")+e.name+e.typ.string.substr(4)}).join("; ")+" }"),r=$newType(8,$kindInterface,t,!1,"",!1,null),$interfaceTypes[n]=r,r.init(e)}return r},$emptyInterface=$interfaceType([]),$ifaceNil={},$error=$newType(8,$kindInterface,"error",!0,"",!1,null);$error.init([{prop:"Error",name:"Error",pkg:"",typ:$funcType([],[$String],!1)}]);var $panicValue,$jsObjectPtr,$jsErrorPtr,$mapTypes={},$mapType=function(e,n){var r=e.id+"$"+n.id,t=$mapTypes[r];return void 0===t&&(t=$newType(4,$kindMap,"map["+e.string+"]"+n.string,!1,"",!1,null),$mapTypes[r]=t,t.init(e,n)),t},$makeMap=function(e,n){for(var r={},t=0;t2147483647)&&$throwRuntimeError("makeslice: len out of range"),(r<0||r2147483647)&&$throwRuntimeError("makeslice: cap out of range");var t=new e.nativeArray(r);if(e.nativeArray===Array)for(var i=0;i4||t<0)break}}finally{0==$scheduled.length&&clearTimeout(e)}},$schedule=function(e){e.asleep&&(e.asleep=!1,$awakeGoroutines++),$scheduled.push(e),$curGoroutine===$noGoroutine&&$runScheduled()},$setTimeout=function(e,n){return $awakeGoroutines++,setTimeout(function(){$awakeGoroutines--,e()},n)},$block=function(){$curGoroutine===$noGoroutine&&$throwRuntimeError("cannot block in JavaScript callback, fix by wrapping code in goroutine"),$curGoroutine.asleep=!0},$restore=function(e,n){return void 0!==e&&void 0!==e.$blk?e:n},$send=function(e,n){e.$closed&&$throwRuntimeError("send on closed channel");var r=e.$recvQueue.shift();if(void 0===r){if(!(e.$buffer.length65535){var l=Math.floor((u-65536)/1024)+55296,s=(u-65536)%1024+56320;$+=String.fromCharCode(l,s)}else $+=String.fromCharCode(u)}return $;case $kindStruct:var f=$packages.time;if(void 0!==f&&e.constructor===f.Time.ptr){var d=$div64(e.UnixNano(),new $Int64(0,1e6));return new Date($flatten64(d))}var p={},h=function(e,n){if(n===$jsObjectPtr)return e;switch(n.kind){case $kindPtr:return e===n.nil?p:h(e.$get(),n.elem);case $kindStruct:var r=n.fields[0];return h(e[r.prop],r.typ);case $kindInterface:return h(e.$val,e.constructor);default:return p}},k=h(e,n);if(k!==p)return k;if(void 0!==r)return r(e);k={};for(a=0;a>24;case $kindInt16:return parseInt(e)<<16>>16;case $kindInt32:return parseInt(e)>>0;case $kindUint:return parseInt(e);case $kindUint8:return parseInt(e)<<24>>>24;case $kindUint16:return parseInt(e)<<16>>>16;case $kindUint32:case $kindUintptr:return parseInt(e)>>>0;case $kindInt64:case $kindUint64:return new n(0,e);case $kindFloat32:case $kindFloat64:return parseFloat(e);case $kindArray:return e.length!==n.len&&$throwRuntimeError("got array with wrong size from JavaScript native"),$mapArray(e,function(e){return $internalize(e,n.elem,i)});case $kindFunc:return function(){for(var t=[],a=0;a=128)return!1;return!0}; + +$packages["github.com/gopherjs/gopherjs/js"]=(function(){var $pkg={},$init,A,B,J,K,M,O,P,Q,R,S,T,G,H,L;A=$pkg.Object=$newType(0,$kindStruct,"js.Object",true,"github.com/gopherjs/gopherjs/js",true,function(object_){this.$val=this;if(arguments.length===0){this.object=null;return;}this.object=object_;});B=$pkg.Error=$newType(0,$kindStruct,"js.Error",true,"github.com/gopherjs/gopherjs/js",true,function(Object_){this.$val=this;if(arguments.length===0){this.Object=null;return;}this.Object=Object_;});J=$pkg.M=$newType(4,$kindMap,"js.M",true,"github.com/gopherjs/gopherjs/js",true,null);K=$pkg.S=$newType(12,$kindSlice,"js.S",true,"github.com/gopherjs/gopherjs/js",true,null);M=$sliceType($emptyInterface);O=$ptrType(A);P=$sliceType(O);Q=$funcType([P],[O],true);R=$funcType([],[O],false);S=$funcType([O],[],false);T=$ptrType(B);A.ptr.prototype.Get=function(a){var a,b;b=this;return b.object[$externalize(a,$String)];};A.prototype.Get=function(a){return this.$val.Get(a);};A.ptr.prototype.Set=function(a,b){var a,b,c;c=this;c.object[$externalize(a,$String)]=$externalize(b,$emptyInterface);};A.prototype.Set=function(a,b){return this.$val.Set(a,b);};A.ptr.prototype.Delete=function(a){var a,b;b=this;delete b.object[$externalize(a,$String)];};A.prototype.Delete=function(a){return this.$val.Delete(a);};A.ptr.prototype.Length=function(){var a;a=this;return $parseInt(a.object.length);};A.prototype.Length=function(){return this.$val.Length();};A.ptr.prototype.Index=function(a){var a,b;b=this;return b.object[a];};A.prototype.Index=function(a){return this.$val.Index(a);};A.ptr.prototype.SetIndex=function(a,b){var a,b,c;c=this;c.object[a]=$externalize(b,$emptyInterface);};A.prototype.SetIndex=function(a,b){return this.$val.SetIndex(a,b);};A.ptr.prototype.Call=function(a,b){var a,b,c,d;c=this;return(d=c.object,d[$externalize(a,$String)].apply(d,$externalize(b,M)));};A.prototype.Call=function(a,b){return this.$val.Call(a,b);};A.ptr.prototype.Invoke=function(a){var a,b;b=this;return b.object.apply(undefined,$externalize(a,M));};A.prototype.Invoke=function(a){return this.$val.Invoke(a);};A.ptr.prototype.New=function(a){var a,b;b=this;return new($global.Function.prototype.bind.apply(b.object,[undefined].concat($externalize(a,M))));};A.prototype.New=function(a){return this.$val.New(a);};A.ptr.prototype.Bool=function(){var a;a=this;return!!(a.object);};A.prototype.Bool=function(){return this.$val.Bool();};A.ptr.prototype.String=function(){var a;a=this;return $internalize(a.object,$String);};A.prototype.String=function(){return this.$val.String();};A.ptr.prototype.Int=function(){var a;a=this;return $parseInt(a.object)>>0;};A.prototype.Int=function(){return this.$val.Int();};A.ptr.prototype.Int64=function(){var a;a=this;return $internalize(a.object,$Int64);};A.prototype.Int64=function(){return this.$val.Int64();};A.ptr.prototype.Uint64=function(){var a;a=this;return $internalize(a.object,$Uint64);};A.prototype.Uint64=function(){return this.$val.Uint64();};A.ptr.prototype.Float=function(){var a;a=this;return $parseFloat(a.object);};A.prototype.Float=function(){return this.$val.Float();};A.ptr.prototype.Interface=function(){var a;a=this;return $internalize(a.object,$emptyInterface);};A.prototype.Interface=function(){return this.$val.Interface();};A.ptr.prototype.Unsafe=function(){var a;a=this;return a.object;};A.prototype.Unsafe=function(){return this.$val.Unsafe();};B.ptr.prototype.Error=function(){var a;a=this;return"JavaScript error: "+$internalize(a.Object.message,$String);};B.prototype.Error=function(){return this.$val.Error();};B.ptr.prototype.Stack=function(){var a;a=this;return $internalize(a.Object.stack,$String);};B.prototype.Stack=function(){return this.$val.Stack();};G=function(a){var a,b,c,d,e,f;b=a;c=new($global.Object)();c.__internal_object__=b;d=b.constructor.methods;e=0;while(true){if(!(e<$parseInt(d.length))){break;}f=[f];f[0]=d[e];if(!($internalize(f[0].pkg,$String)==="")){e=e+(1)>>0;continue;}c[$externalize($internalize(f[0].name,$String),$String)]=$externalize((function(f){return function(g){var g;return $externalizeFunction(b[$externalize($internalize(f[0].prop,$String),$String)],f[0].typ,$externalize(true,$Bool)).apply(b,$externalize(g,P));};})(f),Q);e=e+(1)>>0;}return c;};$pkg.MakeWrapper=G;H=function(a){var{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,$s,$r,$c}=$restore(this,{a});$s=$s||0;s:while(true){switch($s){case 0:b=[b];c=[c];b[0]=a;d=b[0].constructor;c[0]=new($global.Object)();e=(function(b,c){return function(e,f){var e,f;$global.Object.defineProperty(c[0],$externalize(e,$String),$externalize(f,J));};})(b,c);$r=e("__internal_object__",$makeMap($String.keyFor,[{k:"value",v:new $jsObjectPtr(b[0])}]));$s=1;case 1:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}f=$internalize(d.string,$String);g=$internalize(d.pkg,$String);h="";if(f.charCodeAt(0)===42){h="*";}i=0;while(true){if(!(i>0));break;}i=i+(1)>>0;}j=g+"."+h+f;$r=e("$type",$makeMap($String.keyFor,[{k:"value",v:new $String(j)}]));$s=2;case 2:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}k=null;l=new($global.Array)();m=d.methods;if(!(m===undefined)){l=l.concat(m);}n=d.elem;if(!(n===undefined)){k=n.fields;l=l.concat(n.methods);}else{k=d.fields;}o=0;case 3:if(!(o<$parseInt(l.length))){$s=4;continue;}p=[p];p[0]=l[o];if(!($internalize(p[0].pkg,$String)==="")){o=o+(1)>>0;$s=3;continue;}$r=e($internalize(p[0].prop,$String),$makeMap($String.keyFor,[{k:"value",v:new Q((function(b,c,p){return function(q){var q;return $externalizeFunction(b[0][$externalize($internalize(p[0].prop,$String),$String)],p[0].typ,$externalize(true,$Bool),H).apply(b[0],$externalize(q,P));};})(b,c,p))}]));$s=5;case 5:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}o=o+(1)>>0;$s=3;continue;case 4:if(!(k===undefined)){$s=6;continue;}$s=7;continue;case 6:q=0;case 8:if(!(q<$parseInt(k.length))){$s=9;continue;}r=[r];r[0]=k[q];if(!!!(r[0].exported)){q=q+(1)>>0;$s=8;continue;}$r=e($internalize(r[0].prop,$String),$makeMap($String.keyFor,[{k:"get",v:new R((function(b,c,r){return function(){var s;s=$copyIfRequired(b[0].$val[$externalize($internalize(r[0].prop,$String),$String)],r[0].typ);return $externalize(s,r[0].typ,H);};})(b,c,r))},{k:"set",v:new S((function(b,c,r){return function(s){var s,t;t=$internalize(s,r[0].typ,H);b[0].$val[$externalize($internalize(r[0].prop,$String),$String)]=t;};})(b,c,r))}]));$s=10;case 10:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}q=q+(1)>>0;$s=8;continue;case 9:case 7:$s=-1;return c[0];}return;}var $f={$blk:H,$c:true,$r,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,$s};return $f;};$pkg.MakeFullWrapper=H;L=function(){var a;a=new B.ptr(null);$unused(a);};O.methods=[{prop:"Get",name:"Get",pkg:"",typ:$funcType([$String],[O],false)},{prop:"Set",name:"Set",pkg:"",typ:$funcType([$String,$emptyInterface],[],false)},{prop:"Delete",name:"Delete",pkg:"",typ:$funcType([$String],[],false)},{prop:"Length",name:"Length",pkg:"",typ:$funcType([],[$Int],false)},{prop:"Index",name:"Index",pkg:"",typ:$funcType([$Int],[O],false)},{prop:"SetIndex",name:"SetIndex",pkg:"",typ:$funcType([$Int,$emptyInterface],[],false)},{prop:"Call",name:"Call",pkg:"",typ:$funcType([$String,M],[O],true)},{prop:"Invoke",name:"Invoke",pkg:"",typ:$funcType([M],[O],true)},{prop:"New",name:"New",pkg:"",typ:$funcType([M],[O],true)},{prop:"Bool",name:"Bool",pkg:"",typ:$funcType([],[$Bool],false)},{prop:"String",name:"String",pkg:"",typ:$funcType([],[$String],false)},{prop:"Int",name:"Int",pkg:"",typ:$funcType([],[$Int],false)},{prop:"Int64",name:"Int64",pkg:"",typ:$funcType([],[$Int64],false)},{prop:"Uint64",name:"Uint64",pkg:"",typ:$funcType([],[$Uint64],false)},{prop:"Float",name:"Float",pkg:"",typ:$funcType([],[$Float64],false)},{prop:"Interface",name:"Interface",pkg:"",typ:$funcType([],[$emptyInterface],false)},{prop:"Unsafe",name:"Unsafe",pkg:"",typ:$funcType([],[$Uintptr],false)}];T.methods=[{prop:"Error",name:"Error",pkg:"",typ:$funcType([],[$String],false)},{prop:"Stack",name:"Stack",pkg:"",typ:$funcType([],[$String],false)}];A.init("github.com/gopherjs/gopherjs/js",[{prop:"object",name:"object",embedded:false,exported:false,typ:O,tag:""}]);B.init("",[{prop:"Object",name:"Object",embedded:true,exported:true,typ:O,tag:""}]);J.init($String,$emptyInterface);K.init($emptyInterface);$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:L();}return;}if($f===undefined){$f={$blk:$init};}$f.$s=$s;$f.$r=$r;return $f;};$pkg.$init=$init;return $pkg;})(); +$packages["runtime"]=(function(){var $pkg={},$init,A,C,D,AT,AZ,BD,AM,E,AU;A=$packages["github.com/gopherjs/gopherjs/js"];C=$pkg._type=$newType(0,$kindStruct,"runtime._type",true,"runtime",false,function(str_){this.$val=this;if(arguments.length===0){this.str="";return;}this.str=str_;});D=$pkg.TypeAssertionError=$newType(0,$kindStruct,"runtime.TypeAssertionError",true,"runtime",true,function(_interface_,concrete_,asserted_,missingMethod_){this.$val=this;if(arguments.length===0){this._interface=AZ.nil;this.concrete=AZ.nil;this.asserted=AZ.nil;this.missingMethod="";return;}this._interface=_interface_;this.concrete=concrete_;this.asserted=asserted_;this.missingMethod=missingMethod_;});AT=$pkg.errorString=$newType(8,$kindString,"runtime.errorString",true,"runtime",false,null);AZ=$ptrType(C);BD=$ptrType(D);C.ptr.prototype.string=function(){var a;a=this;return a.str;};C.prototype.string=function(){return this.$val.string();};C.ptr.prototype.pkgpath=function(){var a;a=this;return"";};C.prototype.pkgpath=function(){return this.$val.pkgpath();};D.ptr.prototype.RuntimeError=function(){};D.prototype.RuntimeError=function(){return this.$val.RuntimeError();};D.ptr.prototype.Error=function(){var a,b,c,d,e;a=this;b="interface";if(!(a._interface===AZ.nil)){b=a._interface.string();}c=a.asserted.string();if(a.concrete===AZ.nil){return"interface conversion: "+b+" is nil, not "+c;}d=a.concrete.string();if(a.missingMethod===""){e="interface conversion: "+b+" is "+d+", not "+c;if(d===c){if(!(a.concrete.pkgpath()===a.asserted.pkgpath())){e=e+(" (types from different packages)");}else{e=e+(" (types from different scopes)");}}return e;}return"interface conversion: "+d+" is not "+c+": missing method "+a.missingMethod;};D.prototype.Error=function(){return this.$val.Error();};E=function(){var a,b;a=$packages[$externalize("github.com/gopherjs/gopherjs/js",$String)];$jsObjectPtr=a.Object.ptr;$jsErrorPtr=a.Error.ptr;$throwRuntimeError=AU;AM=$internalize($goVersion,$String);b=$ifaceNil;b=new D.ptr(AZ.nil,AZ.nil,AZ.nil,"");$unused(b);};AT.prototype.RuntimeError=function(){var a;a=this.$val;};$ptrType(AT).prototype.RuntimeError=function(){return new AT(this.$get()).RuntimeError();};AT.prototype.Error=function(){var a;a=this.$val;return"runtime error: "+(a);};$ptrType(AT).prototype.Error=function(){return new AT(this.$get()).Error();};AU=function(a){var a;$panic(new AT((a)));};AZ.methods=[{prop:"string",name:"string",pkg:"runtime",typ:$funcType([],[$String],false)},{prop:"pkgpath",name:"pkgpath",pkg:"runtime",typ:$funcType([],[$String],false)}];BD.methods=[{prop:"RuntimeError",name:"RuntimeError",pkg:"",typ:$funcType([],[],false)},{prop:"Error",name:"Error",pkg:"",typ:$funcType([],[$String],false)}];AT.methods=[{prop:"RuntimeError",name:"RuntimeError",pkg:"",typ:$funcType([],[],false)},{prop:"Error",name:"Error",pkg:"",typ:$funcType([],[$String],false)}];C.init("runtime",[{prop:"str",name:"str",embedded:false,exported:false,typ:$String,tag:""}]);D.init("runtime",[{prop:"_interface",name:"_interface",embedded:false,exported:false,typ:AZ,tag:""},{prop:"concrete",name:"concrete",embedded:false,exported:false,typ:AZ,tag:""},{prop:"asserted",name:"asserted",embedded:false,exported:false,typ:AZ,tag:""},{prop:"missingMethod",name:"missingMethod",embedded:false,exported:false,typ:$String,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;}AM="";E();}return;}if($f===undefined){$f={$blk:$init};}$f.$s=$s;$f.$r=$r;return $f;};$pkg.$init=$init;return $pkg;})(); +$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,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/map/dungeon/map.tmx b/frontend/assets/resources/map/dungeon/map.tmx index 508e49e..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 4c6c6e9..4226fa8 100644 --- a/frontend/assets/resources/pbfiles/room_downsync_frame.proto +++ b/frontend/assets/resources/pbfiles/room_downsync_frame.proto @@ -28,7 +28,6 @@ message PlayerDownsync { int32 activeSkillId = 21; int32 activeSkillHit = 22; int32 framesInvinsible = 23; - int32 framesSelfLockVel = 24; string name = 997; string displayName = 998; @@ -105,14 +104,13 @@ message MeleeBullet { int32 selfLockVelX = 12; int32 selfLockVelY = 13; - int32 framesSelfLockVel = 14; - int32 hitboxOffsetX = 15; - int32 hitboxOffsetY = 16; - int32 hitboxSizeX = 17; - int32 hitboxSizeY = 18; + int32 hitboxOffsetX = 14; + int32 hitboxOffsetY = 15; + int32 hitboxSizeX = 16; + int32 hitboxSizeY = 17; - bool blowUp = 19; + bool blowUp = 18; } message BattleColliderInfo { diff --git a/frontend/assets/scenes/login.fire b/frontend/assets/scenes/login.fire index 903c81d..27aa1b6 100644 --- a/frontend/assets/scenes/login.fire +++ b/frontend/assets/scenes/login.fire @@ -440,7 +440,7 @@ "array": [ 0, 0, - 216.79917701871616, + 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/Map.js b/frontend/assets/scripts/Map.js index 154e56f..e26ed8c 100644 --- a/frontend/assets/scripts/Map.js +++ b/frontend/assets/scripts/Map.js @@ -578,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.framesInChState, pbPlayer.activeSkillId, pbPlayer.activeSkillHit, pbPlayer.framesInvinsible, pbPlayer.framesSelfLockVel, pbPlayer.speed, pbPlayer.battleState, pbPlayer.characterState, pbPlayer.joinIndex, pbPlayer.hp, pbPlayer.maxHp, pbPlayer.colliderRadius, pbPlayer.inAir); + const jsPlayer = gopkgs.NewPlayerDownsyncJs(pbPlayer.id, pbPlayer.virtualGridX, pbPlayer.virtualGridY, pbPlayer.dirX, pbPlayer.dirY, pbPlayer.velX, pbPlayer.velY, pbPlayer.framesToRecover, pbPlayer.framesInChState, pbPlayer.activeSkillId, pbPlayer.activeSkillHit, pbPlayer.framesInvinsible, pbPlayer.speed, pbPlayer.battleState, pbPlayer.characterState, pbPlayer.joinIndex, pbPlayer.hp, pbPlayer.maxHp, pbPlayer.colliderRadius, pbPlayer.inAir); jsPlayersArr[k] = jsPlayer; } const jsMeleeBulletsArr = []; for (let k in pbRdf.meleeBullets) { const pbBullet = pbRdf.meleeBullets[k]; - 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.framesSelfLockVel, pbBullet.hitboxOffsetX, pbBullet.hitboxOffsetY, pbBullet.hitboxSizeX, pbBullet.hitboxSizeY, pbBullet.blowUp); + 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); } @@ -1082,6 +1082,14 @@ othersForcedDownsyncRenderFrame=${JSON.stringify(othersForcedDownsyncRenderFrame } 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! self.chaserRenderFrameId = nextRdf.Id; diff --git a/frontend/assets/scripts/OfflineMap.js b/frontend/assets/scripts/OfflineMap.js index 97e2a8a..fe495e0 100644 --- a/frontend/assets/scripts/OfflineMap.js +++ b/frontend/assets/scripts/OfflineMap.js @@ -13,7 +13,7 @@ cc.Class({ onLoad() { const self = this; window.mapIns = self; - self.showCriticalCoordinateLabels = true; + self.showCriticalCoordinateLabels = false; const mapNode = self.node; const canvasNode = mapNode.parent; @@ -129,7 +129,7 @@ cc.Class({ inAir: true, }), ], - speciesIdList: [0, 1], + speciesIdList: [1, 0], }); self.selfPlayerInfo = { 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 bacd9a9..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 @@ -1214,7 +1214,6 @@ $root.protos = (function() { * @property {number|null} [activeSkillId] PlayerDownsync activeSkillId * @property {number|null} [activeSkillHit] PlayerDownsync activeSkillHit * @property {number|null} [framesInvinsible] PlayerDownsync framesInvinsible - * @property {number|null} [framesSelfLockVel] PlayerDownsync framesSelfLockVel * @property {string|null} [name] PlayerDownsync name * @property {string|null} [displayName] PlayerDownsync displayName * @property {string|null} [avatar] PlayerDownsync avatar @@ -1419,14 +1418,6 @@ $root.protos = (function() { */ PlayerDownsync.prototype.framesInvinsible = 0; - /** - * PlayerDownsync framesSelfLockVel. - * @member {number} framesSelfLockVel - * @memberof protos.PlayerDownsync - * @instance - */ - PlayerDownsync.prototype.framesSelfLockVel = 0; - /** * PlayerDownsync name. * @member {string} name @@ -1521,8 +1512,6 @@ $root.protos = (function() { 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.framesSelfLockVel != null && Object.hasOwnProperty.call(message, "framesSelfLockVel")) - writer.uint32(/* id 24, wireType 0 =*/192).int32(message.framesSelfLockVel); if (message.name != null && Object.hasOwnProperty.call(message, "name")) writer.uint32(/* id 997, wireType 2 =*/7978).string(message.name); if (message.displayName != null && Object.hasOwnProperty.call(message, "displayName")) @@ -1655,10 +1644,6 @@ $root.protos = (function() { message.framesInvinsible = reader.int32(); break; } - case 24: { - message.framesSelfLockVel = reader.int32(); - break; - } case 997: { message.name = reader.string(); break; @@ -1775,9 +1760,6 @@ $root.protos = (function() { if (message.framesInvinsible != null && message.hasOwnProperty("framesInvinsible")) if (!$util.isInteger(message.framesInvinsible)) return "framesInvinsible: integer expected"; - if (message.framesSelfLockVel != null && message.hasOwnProperty("framesSelfLockVel")) - if (!$util.isInteger(message.framesSelfLockVel)) - return "framesSelfLockVel: integer expected"; if (message.name != null && message.hasOwnProperty("name")) if (!$util.isString(message.name)) return "name: string expected"; @@ -1848,8 +1830,6 @@ $root.protos = (function() { message.activeSkillHit = object.activeSkillHit | 0; if (object.framesInvinsible != null) message.framesInvinsible = object.framesInvinsible | 0; - if (object.framesSelfLockVel != null) - message.framesSelfLockVel = object.framesSelfLockVel | 0; if (object.name != null) message.name = String(object.name); if (object.displayName != null) @@ -1896,7 +1876,6 @@ $root.protos = (function() { object.activeSkillId = 0; object.activeSkillHit = 0; object.framesInvinsible = 0; - object.framesSelfLockVel = 0; object.name = ""; object.displayName = ""; object.avatar = ""; @@ -1947,8 +1926,6 @@ $root.protos = (function() { object.activeSkillHit = message.activeSkillHit; if (message.framesInvinsible != null && message.hasOwnProperty("framesInvinsible")) object.framesInvinsible = message.framesInvinsible; - if (message.framesSelfLockVel != null && message.hasOwnProperty("framesSelfLockVel")) - object.framesSelfLockVel = message.framesSelfLockVel; if (message.name != null && message.hasOwnProperty("name")) object.name = message.name; if (message.displayName != null && message.hasOwnProperty("displayName")) @@ -4088,7 +4065,6 @@ $root.protos = (function() { * @property {number|null} [damage] MeleeBullet damage * @property {number|null} [selfLockVelX] MeleeBullet selfLockVelX * @property {number|null} [selfLockVelY] MeleeBullet selfLockVelY - * @property {number|null} [framesSelfLockVel] MeleeBullet framesSelfLockVel * @property {number|null} [hitboxOffsetX] MeleeBullet hitboxOffsetX * @property {number|null} [hitboxOffsetY] MeleeBullet hitboxOffsetY * @property {number|null} [hitboxSizeX] MeleeBullet hitboxSizeX @@ -4215,14 +4191,6 @@ $root.protos = (function() { */ MeleeBullet.prototype.selfLockVelY = 0; - /** - * MeleeBullet framesSelfLockVel. - * @member {number} framesSelfLockVel - * @memberof protos.MeleeBullet - * @instance - */ - MeleeBullet.prototype.framesSelfLockVel = 0; - /** * MeleeBullet hitboxOffsetX. * @member {number} hitboxOffsetX @@ -4313,18 +4281,16 @@ $root.protos = (function() { 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.framesSelfLockVel != null && Object.hasOwnProperty.call(message, "framesSelfLockVel")) - writer.uint32(/* id 14, wireType 0 =*/112).int32(message.framesSelfLockVel); if (message.hitboxOffsetX != null && Object.hasOwnProperty.call(message, "hitboxOffsetX")) - writer.uint32(/* id 15, wireType 0 =*/120).int32(message.hitboxOffsetX); + writer.uint32(/* id 14, wireType 0 =*/112).int32(message.hitboxOffsetX); if (message.hitboxOffsetY != null && Object.hasOwnProperty.call(message, "hitboxOffsetY")) - writer.uint32(/* id 16, wireType 0 =*/128).int32(message.hitboxOffsetY); + writer.uint32(/* id 15, wireType 0 =*/120).int32(message.hitboxOffsetY); if (message.hitboxSizeX != null && Object.hasOwnProperty.call(message, "hitboxSizeX")) - writer.uint32(/* id 17, wireType 0 =*/136).int32(message.hitboxSizeX); + writer.uint32(/* id 16, wireType 0 =*/128).int32(message.hitboxSizeX); if (message.hitboxSizeY != null && Object.hasOwnProperty.call(message, "hitboxSizeY")) - writer.uint32(/* id 18, wireType 0 =*/144).int32(message.hitboxSizeY); + writer.uint32(/* id 17, wireType 0 =*/136).int32(message.hitboxSizeY); if (message.blowUp != null && Object.hasOwnProperty.call(message, "blowUp")) - writer.uint32(/* id 19, wireType 0 =*/152).bool(message.blowUp); + writer.uint32(/* id 18, wireType 0 =*/144).bool(message.blowUp); return writer; }; @@ -4412,26 +4378,22 @@ $root.protos = (function() { break; } case 14: { - message.framesSelfLockVel = reader.int32(); - break; - } - case 15: { message.hitboxOffsetX = reader.int32(); break; } - case 16: { + case 15: { message.hitboxOffsetY = reader.int32(); break; } - case 17: { + case 16: { message.hitboxSizeX = reader.int32(); break; } - case 18: { + case 17: { message.hitboxSizeY = reader.int32(); break; } - case 19: { + case 18: { message.blowUp = reader.bool(); break; } @@ -4509,9 +4471,6 @@ $root.protos = (function() { if (message.selfLockVelY != null && message.hasOwnProperty("selfLockVelY")) if (!$util.isInteger(message.selfLockVelY)) return "selfLockVelY: integer expected"; - if (message.framesSelfLockVel != null && message.hasOwnProperty("framesSelfLockVel")) - if (!$util.isInteger(message.framesSelfLockVel)) - return "framesSelfLockVel: integer expected"; if (message.hitboxOffsetX != null && message.hasOwnProperty("hitboxOffsetX")) if (!$util.isInteger(message.hitboxOffsetX)) return "hitboxOffsetX: integer expected"; @@ -4568,8 +4527,6 @@ $root.protos = (function() { message.selfLockVelX = object.selfLockVelX | 0; if (object.selfLockVelY != null) message.selfLockVelY = object.selfLockVelY | 0; - if (object.framesSelfLockVel != null) - message.framesSelfLockVel = object.framesSelfLockVel | 0; if (object.hitboxOffsetX != null) message.hitboxOffsetX = object.hitboxOffsetX | 0; if (object.hitboxOffsetY != null) @@ -4610,7 +4567,6 @@ $root.protos = (function() { object.damage = 0; object.selfLockVelX = 0; object.selfLockVelY = 0; - object.framesSelfLockVel = 0; object.hitboxOffsetX = 0; object.hitboxOffsetY = 0; object.hitboxSizeX = 0; @@ -4643,8 +4599,6 @@ $root.protos = (function() { object.selfLockVelX = message.selfLockVelX; if (message.selfLockVelY != null && message.hasOwnProperty("selfLockVelY")) object.selfLockVelY = message.selfLockVelY; - if (message.framesSelfLockVel != null && message.hasOwnProperty("framesSelfLockVel")) - object.framesSelfLockVel = message.framesSelfLockVel; if (message.hitboxOffsetX != null && message.hasOwnProperty("hitboxOffsetX")) object.hitboxOffsetX = message.hitboxOffsetX; if (message.hitboxOffsetY != null && message.hasOwnProperty("hitboxOffsetY")) diff --git a/jsexport/battle/battle.go b/jsexport/battle/battle.go index 95f82d9..36853b3 100644 --- a/jsexport/battle/battle.go +++ b/jsexport/battle/battle.go @@ -438,29 +438,28 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer // 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, - Hp: currPlayerDownsync.Hp, - MaxHp: currPlayerDownsync.MaxHp, - FramesToRecover: currPlayerDownsync.FramesToRecover - 1, - FramesInChState: currPlayerDownsync.FramesInChState + 1, - ActiveSkillId: currPlayerDownsync.ActiveSkillId, - ActiveSkillHit: currPlayerDownsync.ActiveSkillHit, - FramesInvinsible: currPlayerDownsync.FramesInvinsible - 1, - FramesSelfLockVel: currPlayerDownsync.FramesSelfLockVel - 1, - ColliderRadius: currPlayerDownsync.ColliderRadius, + 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 @@ -468,9 +467,6 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer if nextRenderFramePlayers[i].FramesInvinsible < 0 { nextRenderFramePlayers[i].FramesInvinsible = 0 } - if nextRenderFramePlayers[i].FramesSelfLockVel < 0 { - nextRenderFramePlayers[i].FramesSelfLockVel = 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? @@ -512,12 +508,10 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer xfac = -xfac } thatPlayerInNextFrame.VelX = xfac * v.SelfLockVelX - thatPlayerInNextFrame.FramesSelfLockVel = v.FramesSelfLockVel } if NO_LOCK_VEL != v.SelfLockVelY { hasLockVel = true thatPlayerInNextFrame.VelY = v.SelfLockVelY - thatPlayerInNextFrame.FramesSelfLockVel = v.FramesSelfLockVel } if false == hasLockVel { if false == currPlayerDownsync.InAir { @@ -656,29 +650,32 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer thatPlayerInNextFrame.InAir = false if currPlayerDownsync.InAir && 0 >= currPlayerDownsync.VelY { // fallStopping - thatPlayerInNextFrame.VelX = 0 thatPlayerInNextFrame.VelY = 0 - 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 - thatPlayerInNextFrame.FramesToRecover = 0 + thatPlayerInNextFrame.VelX = 0 + if _, existent := nonAttackingSet[thatPlayerInNextFrame.CharacterState]; existent { + if ATK_CHARACTER_STATE_BLOWN_UP1 == thatPlayerInNextFrame.CharacterState { + thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_LAY_DOWN1 + thatPlayerInNextFrame.FramesToRecover = chConfig.LayDownFramesToRecover + } else { + 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 { - // 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 + 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 + } } } } diff --git a/jsexport/battle/characterConfig.go b/jsexport/battle/characterConfig.go index d72c52b..c8ab482 100644 --- a/jsexport/battle/characterConfig.go +++ b/jsexport/battle/characterConfig.go @@ -176,9 +176,9 @@ var skills = map[int]*Skill{ }, }, 3: &Skill{ - RecoveryFrames: int32(70), - RecoveryFramesOnBlock: int32(70), - RecoveryFramesOnHit: int32(70), + RecoveryFrames: int32(50), + RecoveryFramesOnBlock: int32(50), + RecoveryFramesOnHit: int32(50), ReleaseTriggerType: int32(1), BoundChState: ATK_CHARACTER_STATE_ATK3, Hits: []interface{}{ @@ -189,8 +189,8 @@ var skills = map[int]*Skill{ HitStunFrames: MAX_INT32, BlockStunFrames: int32(9), Damage: int32(10), - SelfLockVelX: NO_LOCK_VEL, - SelfLockVelY: NO_LOCK_VEL, + 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), @@ -267,16 +267,16 @@ var skills = map[int]*Skill{ }, }, 6: &Skill{ - RecoveryFrames: int32(60), - RecoveryFramesOnBlock: int32(60), - RecoveryFramesOnHit: int32(60), + 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(40), + ActiveFrames: int32(28), HitStunFrames: MAX_INT32, BlockStunFrames: int32(9), Damage: int32(10), @@ -294,9 +294,9 @@ var skills = map[int]*Skill{ }, }, 255: &Skill{ - RecoveryFrames: int32(34), - RecoveryFramesOnBlock: int32(34), - RecoveryFramesOnHit: int32(34), + RecoveryFrames: int32(30), + RecoveryFramesOnBlock: int32(30), + RecoveryFramesOnHit: int32(30), ReleaseTriggerType: int32(1), BoundChState: ATK_CHARACTER_STATE_INAIR_ATK1, Hits: []interface{}{ @@ -320,17 +320,17 @@ var skills = map[int]*Skill{ }, }, 256: &Skill{ - RecoveryFrames: int32(34), - RecoveryFramesOnBlock: int32(34), - RecoveryFramesOnHit: int32(34), + 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(20), - HitStunFrames: int32(18), + ActiveFrames: int32(10), + HitStunFrames: int32(15), BlockStunFrames: int32(9), Damage: int32(5), SelfLockVelX: NO_LOCK_VEL, diff --git a/jsexport/battle/room_downsync_frame.go b/jsexport/battle/room_downsync_frame.go index 39465a3..52f99fd 100644 --- a/jsexport/battle/room_downsync_frame.go +++ b/jsexport/battle/room_downsync_frame.go @@ -37,8 +37,7 @@ type PlayerDownsync struct { ActiveSkillId int32 ActiveSkillHit int32 - FramesInvinsible int32 - FramesSelfLockVel int32 + FramesInvinsible int32 } type InputFrameDecoded struct { @@ -73,9 +72,8 @@ type Bullet struct { PushbackVelY int32 Damage int32 - SelfLockVelX int32 - SelfLockVelY int32 - FramesSelfLockVel int32 + SelfLockVelX int32 + SelfLockVelY int32 HitboxOffsetX int32 HitboxOffsetY int32 diff --git a/jsexport/main.go b/jsexport/main.go index 2516d25..73c1ed8 100644 --- a/jsexport/main.go +++ b/jsexport/main.go @@ -42,7 +42,7 @@ func NewBarrierJs(boundary *Polygon2D) *js.Object { }) } -func NewPlayerDownsyncJs(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, framesToRecover, framesInChState, activeSkillId, activeSkillHit, framesInvinsible, framesSelfLockVel, speed, battleState, characterState, joinIndex, hp, maxHp, colliderRadius int32, inAir bool) *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, @@ -67,7 +67,7 @@ func NewPlayerDownsyncJs(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, }) } -func NewMeleeBulletJs(originatedRenderFrameId, offenderJoinIndex, startupFrames, cancellableStFrame, cancellableEdFrame, activeFrames, hitStunFrames, blockStunFrames, pushbackVelX, pushbackVelY, damage, selfLockVelX, selfLockVelY, framesSelfLockVel, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY int32, blowUp bool) *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{ OriginatedRenderFrameId: originatedRenderFrameId, @@ -84,9 +84,8 @@ func NewMeleeBulletJs(originatedRenderFrameId, offenderJoinIndex, startupFrames, PushbackVelY: pushbackVelY, Damage: damage, - SelfLockVelX: selfLockVelX, - SelfLockVelY: selfLockVelY, - FramesSelfLockVel: framesSelfLockVel, + SelfLockVelX: selfLockVelX, + SelfLockVelY: selfLockVelY, HitboxOffsetX: hitboxOffsetX, HitboxOffsetY: hitboxOffsetY,

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 Ef^xSW{Qv*} literal 111905 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�xRihY$sW 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
U2dMdzxmP*um^&@!!CZb(VT2ILzXfy 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 diff --git a/frontend/assets/resources/animation/KnifeGirl/LayDown1.anim b/frontend/assets/resources/animation/KnifeGirl/LayDown1.anim index a0cd4e2..06ebfb3 100644 --- a/frontend/assets/resources/animation/KnifeGirl/LayDown1.anim +++ b/frontend/assets/resources/animation/KnifeGirl/LayDown1.anim @@ -3,7 +3,7 @@ "_name": "LayDown1", "_objFlags": 0, "_native": "", - "_duration": 0.25, + "_duration": 0.06666666666666667, "sample": 60, "speed": 1, "wrapMode": 1, @@ -13,21 +13,21 @@ "spriteFrame": [ { "frame": 0, - "value": { - "__uuid__": "7effc101-0b6c-4399-beea-7c9ef6e9df7e" - } - }, - { - "frame": 0.11666666666666667, "value": { "__uuid__": "4e8a4f3c-5406-4700-9230-b2abc29a1093" } }, { - "frame": 0.23333333333333334, + "frame": 0.03333333333333333, "value": { "__uuid__": "1ae5e6f6-ba82-485d-b3c7-59fd16ece3d5" } + }, + { + "frame": 0.05, + "value": { + "__uuid__": "4e8a4f3c-5406-4700-9230-b2abc29a1093" + } } ] } diff --git a/frontend/assets/resources/animation/KnifeGirl/Walking.anim b/frontend/assets/resources/animation/KnifeGirl/Walking.anim index ef50177..05948e1 100644 --- a/frontend/assets/resources/animation/KnifeGirl/Walking.anim +++ b/frontend/assets/resources/animation/KnifeGirl/Walking.anim @@ -3,7 +3,7 @@ "_name": "Walking", "_objFlags": 0, "_native": "", - "_duration": 1.1166666666666667, + "_duration": 1.5166666666666666, "sample": 60, "speed": 1.2, "wrapMode": 2, @@ -14,80 +14,80 @@ { "frame": 0, "value": { - "__uuid__": "30546064-1a11-499e-8523-a82c83951c73" + "__uuid__": "c3b14ecc-a6d9-4cb3-8637-ca7b407a0f5c" } }, { "frame": 0.08333333333333333, - "value": { - "__uuid__": "cbbd2ddc-9ed3-40bf-ab87-2f9d26c2dd85" - } - }, - { - "frame": 0.16666666666666666, "value": { "__uuid__": "9435195e-4560-495e-b1ae-083c0c87e8a0" } }, { - "frame": 0.25, + "frame": 0.18333333333333332, "value": { "__uuid__": "ec048360-7a17-4f22-ba52-eb86ec1acae8" } }, { - "frame": 0.3333333333333333, + "frame": 0.2833333333333333, "value": { "__uuid__": "82bb81e3-667c-4280-8710-211f4904ef2f" } }, { - "frame": 0.4166666666666667, - "value": { - "__uuid__": "c3b14ecc-a6d9-4cb3-8637-ca7b407a0f5c" - } - }, - { - "frame": 0.5166666666666667, + "frame": 0.4, "value": { "__uuid__": "f958fb7f-ef5a-4918-81f3-564004572f45" } }, { - "frame": 0.6166666666666667, + "frame": 0.5333333333333333, "value": { "__uuid__": "8a0ecf92-db26-4206-9a80-20e749055def" } }, { - "frame": 0.7333333333333333, + "frame": 0.65, "value": { "__uuid__": "942f2e02-a700-4fbf-877e-08c93e4d4010" } }, { - "frame": 0.8333333333333334, + "frame": 0.7666666666666667, + "value": { + "__uuid__": "30546064-1a11-499e-8523-a82c83951c73" + } + }, + { + "frame": 0.9, "value": { "__uuid__": "515bb75f-7a1f-4500-8aa9-c895915ce19f" } }, { - "frame": 0.9166666666666666, + "frame": 1.0333333333333334, "value": { "__uuid__": "9100da6b-7582-4afb-9698-3d67d3b2012d" } }, { - "frame": 1.0166666666666666, + "frame": 1.2166666666666666, "value": { "__uuid__": "1257f72d-0cb3-4750-ae70-13c2d8eb2269" } }, { - "frame": 1.1, + "frame": 1.3833333333333333, "value": { "__uuid__": "1d34b6db-27ba-4e26-864d-0f00d501765e" } + }, + { + "frame": 1.5, + "value": { + "__uuid__": "c317a75a-52c0-4c38-9300-a064cbf4efb3" + } } ] } diff --git a/frontend/assets/resources/prefabs/ControlledCharacter.prefab b/frontend/assets/resources/prefabs/ControlledCharacter.prefab index f768285..58f4cf0 100644 --- a/frontend/assets/resources/prefabs/ControlledCharacter.prefab +++ b/frontend/assets/resources/prefabs/ControlledCharacter.prefab @@ -594,7 +594,7 @@ 0, 1, 0.7, - 0.7, + 0.6, 1 ] }, @@ -750,14 +750,14 @@ "ctor": "Float64Array", "array": [ 0, - 0, + 5, 0, 0, 0, 0, 1, 0.7, - 0.7, + 0.5, 1 ] }, diff --git a/frontend/assets/scenes/offline_map.fire b/frontend/assets/scenes/offline_map.fire index 6ba3709..de9f2b1 100644 --- a/frontend/assets/scenes/offline_map.fire +++ b/frontend/assets/scenes/offline_map.fire @@ -461,7 +461,7 @@ "array": [ 0, 0, - 216.05530045313827, + 210.4441731196186, 0, 0, 0, diff --git a/frontend/assets/scripts/OfflineMap.js b/frontend/assets/scripts/OfflineMap.js index 061ee53..360295b 100644 --- a/frontend/assets/scripts/OfflineMap.js +++ b/frontend/assets/scripts/OfflineMap.js @@ -161,7 +161,7 @@ cc.Class({ inAir: true, }), ], - speciesIdList: [1, 0], + speciesIdList: [0, 1], }); self.selfPlayerInfo = { From bd870e4059138291ad069d670fb4de710026bc18 Mon Sep 17 00:00:00 2001 From: genxium Date: Mon, 2 Jan 2023 16:36:17 +0800 Subject: [PATCH 06/10] Misc fixes. --- battle_srv/models/room.go | 11 - charts/README.md | 5 + frontend/assets/plugin_scripts/jsexport.js | 255 ++++---- .../animation/KnifeGirl/KnifeGirl.plist | 350 +++++------ .../animation/KnifeGirl/KnifeGirl.plist.meta | 576 +++++++++--------- .../animation/KnifeGirl/KnifeGirl.png | Bin 109211 -> 106974 bytes .../animation/KnifeGirl/LayDown1.anim | 8 +- .../prefabs/ControlledCharacter.prefab | 8 +- frontend/assets/scenes/offline_map.fire | 2 +- frontend/assets/scripts/AttackingCharacter.js | 2 +- frontend/assets/scripts/Map.js | 90 ++- frontend/assets/scripts/OfflineMap.js | 2 +- jsexport/battle/battle.go | 39 +- 13 files changed, 720 insertions(+), 628 deletions(-) diff --git a/battle_srv/models/room.go b/battle_srv/models/room.go index fe69ed2..c2391ca 100644 --- a/battle_srv/models/room.go +++ b/battle_srv/models/room.go @@ -1274,17 +1274,6 @@ func (pR *Room) refreshColliders(spaceW, spaceH int32) { 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 - } for _, player := range pR.Players { joinIndex := player.JoinIndex diff --git a/charts/README.md b/charts/README.md index 84ff63f..43276b3 100644 --- a/charts/README.md +++ b/charts/README.md @@ -21,3 +21,8 @@ ffmpeg -vsync vfr -i LayDown1.gif -vf "scale=iw:188:force_original_aspect_ratio= ``` 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/frontend/assets/plugin_scripts/jsexport.js b/frontend/assets/plugin_scripts/jsexport.js index 1d8605f..f31517a 100644 --- a/frontend/assets/plugin_scripts/jsexport.js +++ b/frontend/assets/plugin_scripts/jsexport.js @@ -4724,7 +4724,7 @@ $packages["resolv"] = (function() { return $pkg; })(); $packages["jsexport/battle"] = (function() { - var $pkg = {}, $init, math, resolv, Vec2D, Polygon2D, PlayerDownsync, InputFrameDecoded, Barrier, Bullet, MeleeBullet, FireballBullet, Skill, RoomDownsyncFrame, InputFrameDownsync, RingBuffer, SkillMapperType, CharacterConfig, SatResult, sliceType, sliceType$1, sliceType$2, ptrType, ptrType$1, ptrType$2, sliceType$3, sliceType$4, ptrType$3, ptrType$4, ptrType$5, ptrType$6, ptrType$7, sliceType$5, sliceType$6, sliceType$7, sliceType$8, sliceType$9, ptrType$8, sliceType$10, ptrType$9, sliceType$11, sliceType$12, ptrType$10, sliceType$13, ptrType$11, mapType, ptrType$12, skills, inAirSet, noOpSet, invinsibleSet, nonAttackingSet, NewRingBuffer, ConvertToInputFrameId, decodeInput, CalcPushbacks, isPolygonPairOverlapped, isPolygonPairSeparatedByDir, WorldToVirtualGridPos, VirtualGridToWorldPos, WorldToPolygonColliderBLPos, PolygonColliderBLToWorldPos, PolygonColliderBLToVirtualGridPos, VirtualGridToPolygonColliderBLPos, calcHardPushbacksNorms, deriveOpPattern, ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame, GenerateRectCollider, generateRectColliderInCollisionSpace, GenerateConvexPolygonCollider, AlignPolygon2DToBoundingBox; + var $pkg = {}, $init, math, resolv, Vec2D, Polygon2D, PlayerDownsync, InputFrameDecoded, Barrier, Bullet, MeleeBullet, FireballBullet, Skill, RoomDownsyncFrame, InputFrameDownsync, RingBuffer, SkillMapperType, CharacterConfig, SatResult, sliceType, sliceType$1, sliceType$2, ptrType, ptrType$1, ptrType$2, sliceType$3, sliceType$4, ptrType$3, ptrType$4, ptrType$5, ptrType$6, ptrType$7, sliceType$5, sliceType$6, sliceType$7, sliceType$8, sliceType$9, ptrType$8, sliceType$10, ptrType$9, sliceType$11, sliceType$12, ptrType$10, sliceType$13, ptrType$11, mapType, ptrType$12, skills, inAirSet, noOpSet, invinsibleSet, nonAttackingSet, NewRingBuffer, ConvertToInputFrameId, decodeInput, CalcPushbacks, isPolygonPairOverlapped, isPolygonPairSeparatedByDir, WorldToVirtualGridPos, VirtualGridToWorldPos, WorldToPolygonColliderBLPos, PolygonColliderBLToWorldPos, PolygonColliderBLToVirtualGridPos, calcHardPushbacksNorms, deriveOpPattern, ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame, GenerateRectCollider, generateRectColliderInCollisionSpace, GenerateConvexPolygonCollider, AlignPolygon2DToBoundingBox; math = $packages["math"]; resolv = $packages["resolv"]; Vec2D = $pkg.Vec2D = $newType(0, $kindStruct, "battle.Vec2D", true, "jsexport/battle", true, function(X_, Y_) { @@ -5359,14 +5359,6 @@ $packages["jsexport/battle"] = (function() { return WorldToVirtualGridPos(wx, wy); }; $pkg.PolygonColliderBLToVirtualGridPos = PolygonColliderBLToVirtualGridPos; - VirtualGridToPolygonColliderBLPos = function(vx, vy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY) { - var _tuple, bottomPadding, collisionSpaceOffsetX, collisionSpaceOffsetY, halfBoundingH, halfBoundingW, leftPadding, rightPadding, topPadding, vx, vy, wx, wy; - _tuple = VirtualGridToWorldPos(vx, vy); - wx = _tuple[0]; - wy = _tuple[1]; - return WorldToPolygonColliderBLPos(wx, wy, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, collisionSpaceOffsetX, collisionSpaceOffsetY); - }; - $pkg.VirtualGridToPolygonColliderBLPos = VirtualGridToPolygonColliderBLPos; calcHardPushbacksNorms = function(joinIndex, playerCollider, playerShape, snapIntoPlatformOverlap, pEffPushback) { var {_i, _r, _ref, _ref$1, _tmp, _tmp$1, _tuple, barrierShape, collision, isBarrier, joinIndex, obj, overlapResult, overlapped, pEffPushback, playerCollider, playerShape, pushbackX, pushbackY, ret, snapIntoPlatformOverlap, $s, $r, $c} = $restore(this, {joinIndex, playerCollider, playerShape, snapIntoPlatformOverlap, pEffPushback}); /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: @@ -5469,7 +5461,7 @@ $packages["jsexport/battle"] = (function() { return [patternId, jumpedOrNot, effDx, effDy]; }; ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame = function(inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, chConfigsOrderedByJoinIndex) { - var {_1, _entry, _entry$1, _entry$2, _entry$3, _entry$4, _entry$5, _i, _i$1, _i$2, _i$3, _i$4, _i$5, _i$6, _i$7, _i$8, _i$9, _index, _index$1, _r, _r$1, _r$2, _r$3, _r$4, _ref, _ref$1, _ref$10, _ref$11, _ref$12, _ref$13, _ref$2, _ref$3, _ref$4, _ref$5, _ref$6, _ref$7, _ref$8, _ref$9, _tmp, _tmp$1, _tmp$10, _tmp$11, _tmp$12, _tmp$2, _tmp$3, _tmp$4, _tmp$5, _tmp$6, _tmp$7, _tmp$8, _tmp$9, _tuple, _tuple$1, _tuple$2, _tuple$3, _tuple$4, _tuple$5, _tuple$6, _tuple$7, _tuple$8, _tuple$9, atkedPlayerInNextFrame, bShape, bulletCollider, bulletColliders, bulletShape, bulletWx, bulletWy, chConfig, chConfig$1, chConfig$2, chConfigsOrderedByJoinIndex, collision, collision$1, collisionPlayerIndex, collisionPlayerIndex$1, collisionPlayerIndex$2, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currPlayerDownsync, currPlayerDownsync$1, currPlayerDownsync$2, currPlayerDownsync$3, currPlayerDownsync$4, currRenderFrame, defenderShape, effDx, effDy, effPushbacks, existent, existent$1, existent$2, hardPushbackNorm, hardPushbackNorms, hitboxSizeWx, hitboxSizeWy, i, i$1, i$2, i$3, i$4, inputsBuffer, isAnotherPlayer, isBarrier, isBullet, joinIndex, joinIndex$1, joinIndex$2, joinIndex$3, jumpedOrNot, jumpedOrNotList, landedOnGravityPushback, meleeBullet, newBullet, newBulletCollider, newVx, newVy, nextRenderFrameMeleeBullets, nextRenderFramePlayers, normAlignmentWithGravity, obj, obj$1, offender, offender$1, oldFramesToRecover, oldNextCharacterState, overlapResult, overlapped, overlapped$1, patternId, playerCollider, playerCollider$1, playerCollider$2, playerShape, projectedMagnitude, pushbackVelX, pushbackVelY, pushbackX, pushbackY, roomCapacity, skillConfig, skillId, t, t$1, thatPlayerInNextFrame, thatPlayerInNextFrame$1, thatPlayerInNextFrame$2, thatPlayerInNextFrame$3, v, v$1, x, x$1, x$10, x$11, x$12, x$13, x$14, x$2, x$3, x$4, x$5, x$6, x$7, x$8, x$9, xfac, xfac$1, $s, $r, $c} = $restore(this, {inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, chConfigsOrderedByJoinIndex}); + var {_1, _2, _entry, _entry$1, _entry$2, _i, _i$1, _i$10, _i$2, _i$3, _i$4, _i$5, _i$6, _i$7, _i$8, _i$9, _index, _index$1, _index$2, _r, _r$1, _r$2, _r$3, _r$4, _r$5, _ref, _ref$1, _ref$10, _ref$11, _ref$12, _ref$13, _ref$14, _ref$2, _ref$3, _ref$4, _ref$5, _ref$6, _ref$7, _ref$8, _ref$9, _tmp, _tmp$1, _tmp$10, _tmp$11, _tmp$12, _tmp$13, _tmp$14, _tmp$15, _tmp$16, _tmp$17, _tmp$18, _tmp$19, _tmp$2, _tmp$20, _tmp$3, _tmp$4, _tmp$5, _tmp$6, _tmp$7, _tmp$8, _tmp$9, _tuple, _tuple$1, _tuple$10, _tuple$11, _tuple$2, _tuple$3, _tuple$4, _tuple$5, _tuple$6, _tuple$7, _tuple$8, _tuple$9, atkedPlayerInNextFrame, bShape, bulletCollider, bulletColliders, bulletShape, bulletWx, bulletWy, chConfig, chConfig$1, chConfig$2, chConfigsOrderedByJoinIndex, colliderHeight, colliderWidth, colliderWorldHeight, colliderWorldWidth, collision, collision$1, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currPlayerDownsync, currPlayerDownsync$1, currPlayerDownsync$2, currPlayerDownsync$3, currPlayerDownsync$4, currRenderFrame, defenderShape, effDx, effDy, effPushbacks, existent, existent$1, existent$2, halfColliderHeightDiff, halfColliderWidthDiff, halfColliderWorldHeightDiff, hardPushbackNorm, hardPushbackNorms, hitboxSizeWx, hitboxSizeWy, i, i$1, i$2, i$3, i$4, inputsBuffer, isAnotherPlayer, isBarrier, isBullet, joinIndex, joinIndex$1, joinIndex$2, joinIndex$3, jumpedOrNot, jumpedOrNotList, landedOnGravityPushback, meleeBullet, newBullet, newBulletCollider, newVx, newVy, nextRenderFrameMeleeBullets, nextRenderFramePlayers, normAlignmentWithGravity, obj, obj$1, offender, offender$1, oldFramesToRecover, oldNextCharacterState, overlapResult, overlapped, overlapped$1, patternId, playerCollider, playerCollider$1, playerCollider$2, playerCollider$3, playerColliders, playerShape, projectedMagnitude, pushbackVelX, pushbackVelY, pushbackX, pushbackY, roomCapacity, skillConfig, skillId, t, t$1, thatPlayerInNextFrame, thatPlayerInNextFrame$1, thatPlayerInNextFrame$2, thatPlayerInNextFrame$3, v, v$1, wx, wy, x, x$1, x$10, x$11, x$12, x$13, x$14, x$2, x$3, x$4, x$5, x$6, x$7, x$8, x$9, xfac, xfac$1, $s, $r, $c} = $restore(this, {inputsBuffer, currRenderFrame, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, chConfigsOrderedByJoinIndex}); /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: roomCapacity = currRenderFrame.PlayersArr.$length; nextRenderFramePlayers = $makeSlice(sliceType$6, roomCapacity); @@ -5479,7 +5471,7 @@ $packages["jsexport/battle"] = (function() { if (!(_i < _ref.$length)) { break; } i = _i; currPlayerDownsync = ((_i < 0 || _i >= _ref.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref.$array[_ref.$offset + _i]); - ((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i] = new PlayerDownsync.ptr(currPlayerDownsync.Id, currPlayerDownsync.VirtualGridX, currPlayerDownsync.VirtualGridY, currPlayerDownsync.DirX, currPlayerDownsync.DirY, currPlayerDownsync.VelX, currPlayerDownsync.VelY, currPlayerDownsync.Speed, currPlayerDownsync.BattleState, currPlayerDownsync.JoinIndex, 0, currPlayerDownsync.Removed, currPlayerDownsync.Score, 0, currPlayerDownsync.FramesToRecover - 1 >> 0, currPlayerDownsync.FramesInChState + 1 >> 0, currPlayerDownsync.Hp, currPlayerDownsync.MaxHp, currPlayerDownsync.CharacterState, true, currPlayerDownsync.ActiveSkillId, currPlayerDownsync.ActiveSkillHit)); + ((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i] = new PlayerDownsync.ptr(currPlayerDownsync.Id, currPlayerDownsync.VirtualGridX, currPlayerDownsync.VirtualGridY, currPlayerDownsync.DirX, currPlayerDownsync.DirY, currPlayerDownsync.VelX, currPlayerDownsync.VelY, currPlayerDownsync.Speed, currPlayerDownsync.BattleState, currPlayerDownsync.JoinIndex, currPlayerDownsync.ColliderRadius, currPlayerDownsync.Removed, currPlayerDownsync.Score, 0, currPlayerDownsync.FramesToRecover - 1 >> 0, currPlayerDownsync.FramesInChState + 1 >> 0, currPlayerDownsync.Hp, currPlayerDownsync.MaxHp, currPlayerDownsync.CharacterState, true, currPlayerDownsync.ActiveSkillId, currPlayerDownsync.ActiveSkillHit)); if (((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i]).FramesToRecover < 0) { ((i < 0 || i >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i]).FramesToRecover = 0; } @@ -5549,6 +5541,7 @@ $packages["jsexport/battle"] = (function() { _i$1++; $s = 1; continue; case 2: + playerColliders = $makeSlice(sliceType$10, currRenderFrame.PlayersArr.$length, currRenderFrame.PlayersArr.$length); _ref$3 = currRenderFrame.PlayersArr; _i$2 = 0; /* while (true) { */ case 4: @@ -5560,9 +5553,6 @@ $packages["jsexport/battle"] = (function() { _tmp$3 = 0; (x$2 = joinIndex$1 - 1 >> 0, ((x$2 < 0 || x$2 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$2])).X = _tmp$2; (x$3 = joinIndex$1 - 1 >> 0, ((x$3 < 0 || x$3 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$3])).Y = _tmp$3; - collisionPlayerIndex = 131072 + joinIndex$1 >> 0; - playerCollider = (_entry$1 = collisionSysMap[$Int32.keyFor(collisionPlayerIndex)], _entry$1 !== undefined ? _entry$1.v : ptrType$8.nil); - thatPlayerInNextFrame$1 = ((i$2 < 0 || i$2 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$2]); chConfig$1 = ((i$2 < 0 || i$2 >= chConfigsOrderedByJoinIndex.$length) ? ($throwRuntimeError("index out of range"), undefined) : chConfigsOrderedByJoinIndex.$array[chConfigsOrderedByJoinIndex.$offset + i$2]); _tmp$4 = currPlayerDownsync$2.VirtualGridX + currPlayerDownsync$2.VelX >> 0; _tmp$5 = currPlayerDownsync$2.VirtualGridY + currPlayerDownsync$2.VelY >> 0; @@ -5571,10 +5561,33 @@ $packages["jsexport/battle"] = (function() { if (((i$2 < 0 || i$2 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$2])) { newVy = newVy + (chConfig$1.JumpingInitVelY) >> 0; } - _tuple$2 = VirtualGridToPolygonColliderBLPos(newVx, newVy, playerCollider.W * 0.5, playerCollider.H * 0.5, 0, 0, 0, 0, collisionSpaceOffsetX, collisionSpaceOffsetY); - playerCollider.X = _tuple$2[0]; - playerCollider.Y = _tuple$2[1]; - $r = playerCollider.Update(); /* */ $s = 6; case 6: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + _tuple$2 = VirtualGridToWorldPos(newVx, newVy); + wx = _tuple$2[0]; + wy = _tuple$2[1]; + _tmp$6 = $imul(currPlayerDownsync$2.ColliderRadius, 2); + _tmp$7 = $imul(currPlayerDownsync$2.ColliderRadius, 4); + colliderWidth = _tmp$6; + colliderHeight = _tmp$7; + _1 = currPlayerDownsync$2.CharacterState; + if (_1 === (9)) { + _tmp$8 = $imul(currPlayerDownsync$2.ColliderRadius, 4); + _tmp$9 = $imul(currPlayerDownsync$2.ColliderRadius, 2); + colliderWidth = _tmp$8; + colliderHeight = _tmp$9; + } else if ((_1 === (8)) || (_1 === (4)) || (_1 === (5))) { + _tmp$10 = $imul(currPlayerDownsync$2.ColliderRadius, 2); + _tmp$11 = $imul(currPlayerDownsync$2.ColliderRadius, 2); + colliderWidth = _tmp$10; + colliderHeight = _tmp$11; + } + _tuple$3 = VirtualGridToWorldPos(colliderWidth, colliderHeight); + colliderWorldWidth = _tuple$3[0]; + colliderWorldHeight = _tuple$3[1]; + _r$1 = GenerateRectCollider(wx, wy, colliderWorldWidth, colliderWorldHeight, 0.1, 0.1, 0.1, 0.1, collisionSpaceOffsetX, collisionSpaceOffsetY, currPlayerDownsync$2, "Player"); /* */ $s = 6; case 6: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } + playerCollider = _r$1; + ((i$2 < 0 || i$2 >= playerColliders.$length) ? ($throwRuntimeError("index out of range"), undefined) : playerColliders.$array[playerColliders.$offset + i$2] = playerCollider); + $r = collisionSys.Add(new sliceType$10([playerCollider])); /* */ $s = 7; case 7: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + thatPlayerInNextFrame$1 = ((i$2 < 0 || i$2 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$2]); if (currPlayerDownsync$2.InAir) { thatPlayerInNextFrame$1.VelX = thatPlayerInNextFrame$1.VelX + (0) >> 0; thatPlayerInNextFrame$1.VelY = thatPlayerInNextFrame$1.VelY + (-50) >> 0; @@ -5585,64 +5598,63 @@ $packages["jsexport/battle"] = (function() { bulletColliders = $makeSlice(sliceType$10, 0, currRenderFrame.MeleeBullets.$length); _ref$4 = currRenderFrame.MeleeBullets; _i$3 = 0; - /* while (true) { */ case 7: - /* if (!(_i$3 < _ref$4.$length)) { break; } */ if(!(_i$3 < _ref$4.$length)) { $s = 8; continue; } + /* while (true) { */ case 8: + /* if (!(_i$3 < _ref$4.$length)) { break; } */ if(!(_i$3 < _ref$4.$length)) { $s = 9; continue; } meleeBullet = ((_i$3 < 0 || _i$3 >= _ref$4.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$4.$array[_ref$4.$offset + _i$3]); - /* */ if (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) <= currRenderFrame.Id) && (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) + meleeBullet.Bullet.ActiveFrames >> 0) > currRenderFrame.Id)) { $s = 9; continue; } - /* */ $s = 10; continue; - /* if (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) <= currRenderFrame.Id) && (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) + meleeBullet.Bullet.ActiveFrames >> 0) > currRenderFrame.Id)) { */ case 9: + /* */ if (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) <= currRenderFrame.Id) && (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) + meleeBullet.Bullet.ActiveFrames >> 0) > currRenderFrame.Id)) { $s = 10; continue; } + /* */ $s = 11; continue; + /* if (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) <= currRenderFrame.Id) && (((meleeBullet.Bullet.OriginatedRenderFrameId + meleeBullet.Bullet.StartupFrames >> 0) + meleeBullet.Bullet.ActiveFrames >> 0) > currRenderFrame.Id)) { */ case 10: offender = (x$4 = currRenderFrame.PlayersArr, x$5 = meleeBullet.Bullet.OffenderJoinIndex - 1 >> 0, ((x$5 < 0 || x$5 >= x$4.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$4.$array[x$4.$offset + x$5])); xfac = 1; if (0 > offender.DirX) { xfac = -xfac; } - _tuple$3 = VirtualGridToWorldPos(offender.VirtualGridX + ($imul(xfac, meleeBullet.Bullet.HitboxOffsetX)) >> 0, offender.VirtualGridY); - bulletWx = _tuple$3[0]; - bulletWy = _tuple$3[1]; - _tuple$4 = VirtualGridToWorldPos(meleeBullet.Bullet.HitboxSizeX, meleeBullet.Bullet.HitboxSizeY); - hitboxSizeWx = _tuple$4[0]; - hitboxSizeWy = _tuple$4[1]; - _r$1 = GenerateRectCollider(bulletWx, bulletWy, hitboxSizeWx, hitboxSizeWy, 0.1, 0.1, 0.1, 0.1, collisionSpaceOffsetX, collisionSpaceOffsetY, meleeBullet, "MeleeBullet"); /* */ $s = 12; case 12: if($c) { $c = false; _r$1 = _r$1.$blk(); } if (_r$1 && _r$1.$blk !== undefined) { break s; } - newBulletCollider = _r$1; - $r = collisionSys.Add(new sliceType$10([newBulletCollider])); /* */ $s = 13; case 13: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } + _tuple$4 = VirtualGridToWorldPos(offender.VirtualGridX + ($imul(xfac, meleeBullet.Bullet.HitboxOffsetX)) >> 0, offender.VirtualGridY); + bulletWx = _tuple$4[0]; + bulletWy = _tuple$4[1]; + _tuple$5 = VirtualGridToWorldPos(meleeBullet.Bullet.HitboxSizeX, meleeBullet.Bullet.HitboxSizeY); + hitboxSizeWx = _tuple$5[0]; + hitboxSizeWy = _tuple$5[1]; + _r$2 = GenerateRectCollider(bulletWx, bulletWy, hitboxSizeWx, hitboxSizeWy, 0.1, 0.1, 0.1, 0.1, collisionSpaceOffsetX, collisionSpaceOffsetY, meleeBullet, "MeleeBullet"); /* */ $s = 13; case 13: if($c) { $c = false; _r$2 = _r$2.$blk(); } if (_r$2 && _r$2.$blk !== undefined) { break s; } + newBulletCollider = _r$2; + $r = collisionSys.Add(new sliceType$10([newBulletCollider])); /* */ $s = 14; case 14: if($c) { $c = false; $r = $r.$blk(); } if ($r && $r.$blk !== undefined) { break s; } bulletColliders = $append(bulletColliders, newBulletCollider); - $s = 11; continue; - /* } else { */ case 10: + $s = 12; continue; + /* } else { */ case 11: nextRenderFrameMeleeBullets = $append(nextRenderFrameMeleeBullets, meleeBullet); - /* } */ case 11: + /* } */ case 12: _i$3++; - $s = 7; continue; - case 8: + $s = 8; continue; + case 9: _ref$5 = currRenderFrame.PlayersArr; _i$4 = 0; - /* while (true) { */ case 14: - /* if (!(_i$4 < _ref$5.$length)) { break; } */ if(!(_i$4 < _ref$5.$length)) { $s = 15; continue; } + /* while (true) { */ case 15: + /* if (!(_i$4 < _ref$5.$length)) { break; } */ if(!(_i$4 < _ref$5.$length)) { $s = 16; continue; } i$3 = _i$4; currPlayerDownsync$3 = ((_i$4 < 0 || _i$4 >= _ref$5.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$5.$array[_ref$5.$offset + _i$4]); joinIndex$2 = currPlayerDownsync$3.JoinIndex; - collisionPlayerIndex$1 = 131072 + joinIndex$2 >> 0; - playerCollider$1 = (_entry$2 = collisionSysMap[$Int32.keyFor(collisionPlayerIndex$1)], _entry$2 !== undefined ? _entry$2.v : ptrType$8.nil); + playerCollider$1 = ((i$3 < 0 || i$3 >= playerColliders.$length) ? ($throwRuntimeError("index out of range"), undefined) : playerColliders.$array[playerColliders.$offset + i$3]); playerShape = $assertType(playerCollider$1.Shape, ptrType$6); - _r$2 = calcHardPushbacksNorms(joinIndex$2, playerCollider$1, playerShape, 0.1, (x$6 = joinIndex$2 - 1 >> 0, ((x$6 < 0 || x$6 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$6]))); /* */ $s = 16; case 16: if($c) { $c = false; _r$2 = _r$2.$blk(); } if (_r$2 && _r$2.$blk !== undefined) { break s; } - (x$7 = joinIndex$2 - 1 >> 0, ((x$7 < 0 || x$7 >= hardPushbackNorms.$length) ? ($throwRuntimeError("index out of range"), undefined) : hardPushbackNorms.$array[hardPushbackNorms.$offset + x$7] = _r$2)); + _r$3 = calcHardPushbacksNorms(joinIndex$2, playerCollider$1, playerShape, 0.1, (x$6 = joinIndex$2 - 1 >> 0, ((x$6 < 0 || x$6 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$6]))); /* */ $s = 17; case 17: if($c) { $c = false; _r$3 = _r$3.$blk(); } if (_r$3 && _r$3.$blk !== undefined) { break s; } + (x$7 = joinIndex$2 - 1 >> 0, ((x$7 < 0 || x$7 >= hardPushbackNorms.$length) ? ($throwRuntimeError("index out of range"), undefined) : hardPushbackNorms.$array[hardPushbackNorms.$offset + x$7] = _r$3)); thatPlayerInNextFrame$2 = ((i$3 < 0 || i$3 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$3]); chConfig$2 = ((i$3 < 0 || i$3 >= chConfigsOrderedByJoinIndex.$length) ? ($throwRuntimeError("index out of range"), undefined) : chConfigsOrderedByJoinIndex.$array[chConfigsOrderedByJoinIndex.$offset + i$3]); landedOnGravityPushback = false; collision = playerCollider$1.Check(0, 0, new sliceType$4([])); - /* */ if (!(ptrType$3.nil === collision)) { $s = 17; continue; } - /* */ $s = 18; continue; - /* if (!(ptrType$3.nil === collision)) { */ case 17: + /* */ if (!(ptrType$3.nil === collision)) { $s = 18; continue; } + /* */ $s = 19; continue; + /* if (!(ptrType$3.nil === collision)) { */ case 18: _ref$6 = collision.Objects; _i$5 = 0; - /* while (true) { */ case 19: - /* if (!(_i$5 < _ref$6.$length)) { break; } */ if(!(_i$5 < _ref$6.$length)) { $s = 20; continue; } + /* while (true) { */ case 20: + /* if (!(_i$5 < _ref$6.$length)) { break; } */ if(!(_i$5 < _ref$6.$length)) { $s = 21; continue; } obj = ((_i$5 < 0 || _i$5 >= _ref$6.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$6.$array[_ref$6.$offset + _i$5]); - _tmp$6 = false; - _tmp$7 = false; - _tmp$8 = false; - isBarrier = _tmp$6; - isAnotherPlayer = _tmp$7; - isBullet = _tmp$8; + _tmp$12 = false; + _tmp$13 = false; + _tmp$14 = false; + isBarrier = _tmp$12; + isAnotherPlayer = _tmp$13; + isBullet = _tmp$14; _ref$7 = obj.Data; if ($assertType(_ref$7, ptrType$5, true)[1]) { isAnotherPlayer = true; @@ -5653,25 +5665,25 @@ $packages["jsexport/battle"] = (function() { } if (isBullet) { _i$5++; - /* continue; */ $s = 19; continue; + /* continue; */ $s = 20; continue; } bShape = $assertType(obj.Shape, ptrType$6); - _r$3 = CalcPushbacks(0, 0, playerShape, bShape); /* */ $s = 21; case 21: if($c) { $c = false; _r$3 = _r$3.$blk(); } if (_r$3 && _r$3.$blk !== undefined) { break s; } - _tuple$5 = _r$3; - overlapped = _tuple$5[0]; - pushbackX = _tuple$5[1]; - pushbackY = _tuple$5[2]; - overlapResult = _tuple$5[3]; + _r$4 = CalcPushbacks(0, 0, playerShape, bShape); /* */ $s = 22; case 22: if($c) { $c = false; _r$4 = _r$4.$blk(); } if (_r$4 && _r$4.$blk !== undefined) { break s; } + _tuple$6 = _r$4; + overlapped = _tuple$6[0]; + pushbackX = _tuple$6[1]; + pushbackY = _tuple$6[2]; + overlapResult = _tuple$6[3]; if (!overlapped) { _i$5++; - /* continue; */ $s = 19; continue; + /* continue; */ $s = 20; continue; } normAlignmentWithGravity = overlapResult.OverlapX * 0 + overlapResult.OverlapY * -1; if (isAnotherPlayer) { - _tmp$9 = (overlapResult.Overlap - 0.2) * overlapResult.OverlapX; - _tmp$10 = (overlapResult.Overlap - 0.2) * overlapResult.OverlapY; - pushbackX = _tmp$9; - pushbackY = _tmp$10; + _tmp$15 = (overlapResult.Overlap - 0.2) * overlapResult.OverlapX; + _tmp$16 = (overlapResult.Overlap - 0.2) * overlapResult.OverlapY; + pushbackX = _tmp$15; + pushbackY = _tmp$16; } _ref$8 = (x$8 = joinIndex$2 - 1 >> 0, ((x$8 < 0 || x$8 >= hardPushbackNorms.$length) ? ($throwRuntimeError("index out of range"), undefined) : hardPushbackNorms.$array[hardPushbackNorms.$offset + x$8])).$get(); _i$6 = 0; @@ -5693,9 +5705,9 @@ $packages["jsexport/battle"] = (function() { landedOnGravityPushback = true; } _i$5++; - $s = 19; continue; - case 20: - /* } */ case 18: + $s = 20; continue; + case 21: + /* } */ case 19: if (landedOnGravityPushback) { thatPlayerInNextFrame$2.InAir = false; if (currPlayerDownsync$3.InAir && 0 >= currPlayerDownsync$3.VelY) { @@ -5705,6 +5717,14 @@ $packages["jsexport/battle"] = (function() { thatPlayerInNextFrame$2.CharacterState = 9; thatPlayerInNextFrame$2.FramesToRecover = chConfig$2.LayDownFramesToRecover; } else { + _tmp$17 = 0; + _tmp$18 = currPlayerDownsync$3.ColliderRadius; + halfColliderWidthDiff = _tmp$17; + halfColliderHeightDiff = _tmp$18; + _tuple$7 = VirtualGridToWorldPos(halfColliderWidthDiff, halfColliderHeightDiff); + halfColliderWorldHeightDiff = _tuple$7[1]; + _index$2 = joinIndex$2 - 1 >> 0; + ((_index$2 < 0 || _index$2 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index$2]).Y = ((_index$2 < 0 || _index$2 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + _index$2]).Y - (halfColliderWorldHeightDiff); thatPlayerInNextFrame$2.CharacterState = 0; thatPlayerInNextFrame$2.FramesToRecover = 0; } @@ -5722,63 +5742,63 @@ $packages["jsexport/battle"] = (function() { } } _i$4++; - $s = 14; continue; - case 15: + $s = 15; continue; + case 16: _ref$9 = bulletColliders; _i$7 = 0; - /* while (true) { */ case 22: - /* if (!(_i$7 < _ref$9.$length)) { break; } */ if(!(_i$7 < _ref$9.$length)) { $s = 23; continue; } + /* while (true) { */ case 23: + /* if (!(_i$7 < _ref$9.$length)) { break; } */ if(!(_i$7 < _ref$9.$length)) { $s = 24; continue; } bulletCollider = ((_i$7 < 0 || _i$7 >= _ref$9.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$9.$array[_ref$9.$offset + _i$7]); collision$1 = bulletCollider.Check(0, 0, new sliceType$4([])); bulletCollider.Space.Remove(new sliceType$10([bulletCollider])); _ref$10 = bulletCollider.Data; - /* */ if ($assertType(_ref$10, ptrType$1, true)[1]) { $s = 24; continue; } - /* */ $s = 25; continue; - /* if ($assertType(_ref$10, ptrType$1, true)[1]) { */ case 24: + /* */ if ($assertType(_ref$10, ptrType$1, true)[1]) { $s = 25; continue; } + /* */ $s = 26; continue; + /* if ($assertType(_ref$10, ptrType$1, true)[1]) { */ case 25: v$1 = _ref$10.$val; if (ptrType$3.nil === collision$1) { nextRenderFrameMeleeBullets = $append(nextRenderFrameMeleeBullets, v$1); _i$7++; - /* continue; */ $s = 22; continue; + /* continue; */ $s = 23; continue; } bulletShape = $assertType(bulletCollider.Shape, ptrType$6); offender$1 = (x$9 = currRenderFrame.PlayersArr, x$10 = v$1.Bullet.OffenderJoinIndex - 1 >> 0, ((x$10 < 0 || x$10 >= x$9.$length) ? ($throwRuntimeError("index out of range"), undefined) : x$9.$array[x$9.$offset + x$10])); _ref$11 = collision$1.Objects; _i$8 = 0; - /* while (true) { */ case 26: - /* if (!(_i$8 < _ref$11.$length)) { break; } */ if(!(_i$8 < _ref$11.$length)) { $s = 27; continue; } + /* while (true) { */ case 27: + /* if (!(_i$8 < _ref$11.$length)) { break; } */ if(!(_i$8 < _ref$11.$length)) { $s = 28; continue; } obj$1 = ((_i$8 < 0 || _i$8 >= _ref$11.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$11.$array[_ref$11.$offset + _i$8]); defenderShape = $assertType(obj$1.Shape, ptrType$6); _ref$12 = obj$1.Data; - /* */ if ($assertType(_ref$12, ptrType$5, true)[1]) { $s = 28; continue; } - /* */ $s = 29; continue; - /* if ($assertType(_ref$12, ptrType$5, true)[1]) { */ case 28: + /* */ if ($assertType(_ref$12, ptrType$5, true)[1]) { $s = 29; continue; } + /* */ $s = 30; continue; + /* if ($assertType(_ref$12, ptrType$5, true)[1]) { */ case 29: t = _ref$12.$val; if (v$1.Bullet.OffenderJoinIndex === t.JoinIndex) { _i$8++; - /* continue; */ $s = 26; continue; + /* continue; */ $s = 27; continue; } - _tuple$6 = (_entry$3 = invinsibleSet[$Int32.keyFor(t.CharacterState)], _entry$3 !== undefined ? [_entry$3.v, true] : [false, false]); - existent$1 = _tuple$6[1]; + _tuple$8 = (_entry$1 = invinsibleSet[$Int32.keyFor(t.CharacterState)], _entry$1 !== undefined ? [_entry$1.v, true] : [false, false]); + existent$1 = _tuple$8[1]; if (existent$1) { _i$8++; - /* continue; */ $s = 26; continue; + /* continue; */ $s = 27; continue; } - _r$4 = CalcPushbacks(0, 0, bulletShape, defenderShape); /* */ $s = 31; case 31: if($c) { $c = false; _r$4 = _r$4.$blk(); } if (_r$4 && _r$4.$blk !== undefined) { break s; } - _tuple$7 = _r$4; - overlapped$1 = _tuple$7[0]; + _r$5 = CalcPushbacks(0, 0, bulletShape, defenderShape); /* */ $s = 32; case 32: if($c) { $c = false; _r$5 = _r$5.$blk(); } if (_r$5 && _r$5.$blk !== undefined) { break s; } + _tuple$9 = _r$5; + overlapped$1 = _tuple$9[0]; if (!overlapped$1) { _i$8++; - /* continue; */ $s = 26; continue; + /* continue; */ $s = 27; continue; } xfac$1 = 1; if (0 > offender$1.DirX) { xfac$1 = -xfac$1; } - _tmp$11 = $imul(xfac$1, v$1.Bullet.PushbackVelX); - _tmp$12 = v$1.Bullet.PushbackVelY; - pushbackVelX = _tmp$11; - pushbackVelY = _tmp$12; + _tmp$19 = $imul(xfac$1, v$1.Bullet.PushbackVelX); + _tmp$20 = v$1.Bullet.PushbackVelY; + pushbackVelX = _tmp$19; + pushbackVelY = _tmp$20; atkedPlayerInNextFrame = (x$11 = t.JoinIndex - 1 >> 0, ((x$11 < 0 || x$11 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + x$11])); atkedPlayerInNextFrame.VelX = pushbackVelX; atkedPlayerInNextFrame.VelY = pushbackVelY; @@ -5791,17 +5811,17 @@ $packages["jsexport/battle"] = (function() { if (v$1.Bullet.HitStunFrames > oldFramesToRecover) { atkedPlayerInNextFrame.FramesToRecover = v$1.Bullet.HitStunFrames; } - $s = 30; continue; - /* } else { */ case 29: + $s = 31; continue; + /* } else { */ case 30: t$1 = _ref$12; - /* } */ case 30: + /* } */ case 31: _i$8++; - $s = 26; continue; - case 27: - /* } */ case 25: + $s = 27; continue; + case 28: + /* } */ case 26: _i$7++; - $s = 22; continue; - case 23: + $s = 23; continue; + case 24: _ref$13 = currRenderFrame.PlayersArr; _i$9 = 0; while (true) { @@ -5809,40 +5829,47 @@ $packages["jsexport/battle"] = (function() { i$4 = _i$9; currPlayerDownsync$4 = ((_i$9 < 0 || _i$9 >= _ref$13.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$13.$array[_ref$13.$offset + _i$9]); joinIndex$3 = currPlayerDownsync$4.JoinIndex; - collisionPlayerIndex$2 = 131072 + joinIndex$3 >> 0; - playerCollider$2 = (_entry$4 = collisionSysMap[$Int32.keyFor(collisionPlayerIndex$2)], _entry$4 !== undefined ? _entry$4.v : ptrType$8.nil); + playerCollider$2 = ((i$4 < 0 || i$4 >= playerColliders.$length) ? ($throwRuntimeError("index out of range"), undefined) : playerColliders.$array[playerColliders.$offset + i$4]); thatPlayerInNextFrame$3 = ((i$4 < 0 || i$4 >= nextRenderFramePlayers.$length) ? ($throwRuntimeError("index out of range"), undefined) : nextRenderFramePlayers.$array[nextRenderFramePlayers.$offset + i$4]); - _tuple$8 = PolygonColliderBLToVirtualGridPos(playerCollider$2.X - (x$13 = joinIndex$3 - 1 >> 0, ((x$13 < 0 || x$13 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$13])).X, playerCollider$2.Y - (x$14 = joinIndex$3 - 1 >> 0, ((x$14 < 0 || x$14 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$14])).Y, playerCollider$2.W * 0.5, playerCollider$2.H * 0.5, 0, 0, 0, 0, collisionSpaceOffsetX, collisionSpaceOffsetY); - thatPlayerInNextFrame$3.VirtualGridX = _tuple$8[0]; - thatPlayerInNextFrame$3.VirtualGridY = _tuple$8[1]; + _tuple$10 = PolygonColliderBLToVirtualGridPos(playerCollider$2.X - (x$13 = joinIndex$3 - 1 >> 0, ((x$13 < 0 || x$13 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$13])).X, playerCollider$2.Y - (x$14 = joinIndex$3 - 1 >> 0, ((x$14 < 0 || x$14 >= effPushbacks.$length) ? ($throwRuntimeError("index out of range"), undefined) : effPushbacks.$array[effPushbacks.$offset + x$14])).Y, playerCollider$2.W * 0.5, playerCollider$2.H * 0.5, 0, 0, 0, 0, collisionSpaceOffsetX, collisionSpaceOffsetY); + thatPlayerInNextFrame$3.VirtualGridX = _tuple$10[0]; + thatPlayerInNextFrame$3.VirtualGridY = _tuple$10[1]; if (thatPlayerInNextFrame$3.InAir) { oldNextCharacterState = thatPlayerInNextFrame$3.CharacterState; - _1 = oldNextCharacterState; - if ((_1 === (0)) || (_1 === (1))) { + _2 = oldNextCharacterState; + if ((_2 === (0)) || (_2 === (1))) { if (((i$4 < 0 || i$4 >= jumpedOrNotList.$length) ? ($throwRuntimeError("index out of range"), undefined) : jumpedOrNotList.$array[jumpedOrNotList.$offset + i$4]) || (5 === currPlayerDownsync$4.CharacterState)) { thatPlayerInNextFrame$3.CharacterState = 5; } else { thatPlayerInNextFrame$3.CharacterState = 4; } - } else if (_1 === (2)) { + } else if (_2 === (2)) { thatPlayerInNextFrame$3.CharacterState = 6; - } else if (_1 === (3)) { + } else if (_2 === (3)) { thatPlayerInNextFrame$3.CharacterState = 7; } } if (!((thatPlayerInNextFrame$3.CharacterState === currPlayerDownsync$4.CharacterState))) { thatPlayerInNextFrame$3.FramesInChState = 0; } - _tuple$9 = (_entry$5 = nonAttackingSet[$Int32.keyFor(thatPlayerInNextFrame$3.CharacterState)], _entry$5 !== undefined ? [_entry$5.v, true] : [false, false]); - existent$2 = _tuple$9[1]; + _tuple$11 = (_entry$2 = nonAttackingSet[$Int32.keyFor(thatPlayerInNextFrame$3.CharacterState)], _entry$2 !== undefined ? [_entry$2.v, true] : [false, false]); + existent$2 = _tuple$11[1]; if (existent$2) { thatPlayerInNextFrame$3.ActiveSkillId = -1; thatPlayerInNextFrame$3.ActiveSkillHit = -1; } _i$9++; } + _ref$14 = playerColliders; + _i$10 = 0; + while (true) { + if (!(_i$10 < _ref$14.$length)) { break; } + playerCollider$3 = ((_i$10 < 0 || _i$10 >= _ref$14.$length) ? ($throwRuntimeError("index out of range"), undefined) : _ref$14.$array[_ref$14.$offset + _i$10]); + playerCollider$3.Space.Remove(new sliceType$10([playerCollider$3])); + _i$10++; + } $s = -1; return new RoomDownsyncFrame.ptr(currRenderFrame.Id + 1 >> 0, nextRenderFramePlayers, new $Int64(0, 0), nextRenderFrameMeleeBullets, sliceType$11.nil, new $Uint64(0, 0), false, false); - /* */ } return; } var $f = {$blk: ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame, $c: true, $r, _1, _entry, _entry$1, _entry$2, _entry$3, _entry$4, _entry$5, _i, _i$1, _i$2, _i$3, _i$4, _i$5, _i$6, _i$7, _i$8, _i$9, _index, _index$1, _r, _r$1, _r$2, _r$3, _r$4, _ref, _ref$1, _ref$10, _ref$11, _ref$12, _ref$13, _ref$2, _ref$3, _ref$4, _ref$5, _ref$6, _ref$7, _ref$8, _ref$9, _tmp, _tmp$1, _tmp$10, _tmp$11, _tmp$12, _tmp$2, _tmp$3, _tmp$4, _tmp$5, _tmp$6, _tmp$7, _tmp$8, _tmp$9, _tuple, _tuple$1, _tuple$2, _tuple$3, _tuple$4, _tuple$5, _tuple$6, _tuple$7, _tuple$8, _tuple$9, atkedPlayerInNextFrame, bShape, bulletCollider, bulletColliders, bulletShape, bulletWx, bulletWy, chConfig, chConfig$1, chConfig$2, chConfigsOrderedByJoinIndex, collision, collision$1, collisionPlayerIndex, collisionPlayerIndex$1, collisionPlayerIndex$2, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currPlayerDownsync, currPlayerDownsync$1, currPlayerDownsync$2, currPlayerDownsync$3, currPlayerDownsync$4, currRenderFrame, defenderShape, effDx, effDy, effPushbacks, existent, existent$1, existent$2, hardPushbackNorm, hardPushbackNorms, hitboxSizeWx, hitboxSizeWy, i, i$1, i$2, i$3, i$4, inputsBuffer, isAnotherPlayer, isBarrier, isBullet, joinIndex, joinIndex$1, joinIndex$2, joinIndex$3, jumpedOrNot, jumpedOrNotList, landedOnGravityPushback, meleeBullet, newBullet, newBulletCollider, newVx, newVy, nextRenderFrameMeleeBullets, nextRenderFramePlayers, normAlignmentWithGravity, obj, obj$1, offender, offender$1, oldFramesToRecover, oldNextCharacterState, overlapResult, overlapped, overlapped$1, patternId, playerCollider, playerCollider$1, playerCollider$2, playerShape, projectedMagnitude, pushbackVelX, pushbackVelY, pushbackX, pushbackY, roomCapacity, skillConfig, skillId, t, t$1, thatPlayerInNextFrame, thatPlayerInNextFrame$1, thatPlayerInNextFrame$2, thatPlayerInNextFrame$3, v, v$1, x, x$1, x$10, x$11, x$12, x$13, x$14, x$2, x$3, x$4, x$5, x$6, x$7, x$8, x$9, xfac, xfac$1, $s};return $f; + /* */ } return; } var $f = {$blk: ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame, $c: true, $r, _1, _2, _entry, _entry$1, _entry$2, _i, _i$1, _i$10, _i$2, _i$3, _i$4, _i$5, _i$6, _i$7, _i$8, _i$9, _index, _index$1, _index$2, _r, _r$1, _r$2, _r$3, _r$4, _r$5, _ref, _ref$1, _ref$10, _ref$11, _ref$12, _ref$13, _ref$14, _ref$2, _ref$3, _ref$4, _ref$5, _ref$6, _ref$7, _ref$8, _ref$9, _tmp, _tmp$1, _tmp$10, _tmp$11, _tmp$12, _tmp$13, _tmp$14, _tmp$15, _tmp$16, _tmp$17, _tmp$18, _tmp$19, _tmp$2, _tmp$20, _tmp$3, _tmp$4, _tmp$5, _tmp$6, _tmp$7, _tmp$8, _tmp$9, _tuple, _tuple$1, _tuple$10, _tuple$11, _tuple$2, _tuple$3, _tuple$4, _tuple$5, _tuple$6, _tuple$7, _tuple$8, _tuple$9, atkedPlayerInNextFrame, bShape, bulletCollider, bulletColliders, bulletShape, bulletWx, bulletWy, chConfig, chConfig$1, chConfig$2, chConfigsOrderedByJoinIndex, colliderHeight, colliderWidth, colliderWorldHeight, colliderWorldWidth, collision, collision$1, collisionSpaceOffsetX, collisionSpaceOffsetY, collisionSys, collisionSysMap, currPlayerDownsync, currPlayerDownsync$1, currPlayerDownsync$2, currPlayerDownsync$3, currPlayerDownsync$4, currRenderFrame, defenderShape, effDx, effDy, effPushbacks, existent, existent$1, existent$2, halfColliderHeightDiff, halfColliderWidthDiff, halfColliderWorldHeightDiff, hardPushbackNorm, hardPushbackNorms, hitboxSizeWx, hitboxSizeWy, i, i$1, i$2, i$3, i$4, inputsBuffer, isAnotherPlayer, isBarrier, isBullet, joinIndex, joinIndex$1, joinIndex$2, joinIndex$3, jumpedOrNot, jumpedOrNotList, landedOnGravityPushback, meleeBullet, newBullet, newBulletCollider, newVx, newVy, nextRenderFrameMeleeBullets, nextRenderFramePlayers, normAlignmentWithGravity, obj, obj$1, offender, offender$1, oldFramesToRecover, oldNextCharacterState, overlapResult, overlapped, overlapped$1, patternId, playerCollider, playerCollider$1, playerCollider$2, playerCollider$3, playerColliders, playerShape, projectedMagnitude, pushbackVelX, pushbackVelY, pushbackX, pushbackY, roomCapacity, skillConfig, skillId, t, t$1, thatPlayerInNextFrame, thatPlayerInNextFrame$1, thatPlayerInNextFrame$2, thatPlayerInNextFrame$3, v, v$1, wx, wy, x, x$1, x$10, x$11, x$12, x$13, x$14, x$2, x$3, x$4, x$5, x$6, x$7, x$8, x$9, xfac, xfac$1, $s};return $f; }; $pkg.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame = ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame; GenerateRectCollider = function(wx, wy, w, h, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY, data, tag) { diff --git a/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.plist b/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.plist index 07d55f2..fbfe783 100644 --- a/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.plist +++ b/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.plist @@ -15,7 +15,7 @@ spriteSourceSize {112,128} textureRect - {{524,699},{112,128}} + {{824,544},{112,128}} textureRotated @@ -30,7 +30,7 @@ spriteSourceSize {112,128} textureRect - {{524,827},{112,128}} + {{0,1200},{112,128}} textureRotated @@ -45,7 +45,7 @@ spriteSourceSize {64,128} textureRect - {{932,144},{64,128}} + {{616,403},{64,128}} textureRotated @@ -60,7 +60,7 @@ spriteSourceSize {80,128} textureRect - {{927,272},{80,128}} + {{940,0},{80,128}} textureRotated @@ -75,7 +75,7 @@ spriteSourceSize {80,128} textureRect - {{927,400},{80,128}} + {{940,128},{80,128}} textureRotated @@ -90,7 +90,7 @@ spriteSourceSize {112,128} textureRect - {{412,933},{112,128}} + {{0,964},{112,128}} textureRotated @@ -105,7 +105,7 @@ spriteSourceSize {112,128} textureRect - {{412,1061},{112,128}} + {{112,964},{112,128}} textureRotated @@ -120,7 +120,7 @@ spriteSourceSize {96,128} textureRect - {{540,443},{96,128}} + {{840,288},{96,128}} textureRotated @@ -135,7 +135,7 @@ spriteSourceSize {96,128} textureRect - {{540,571},{96,128}} + {{840,416},{96,128}} textureRotated @@ -150,7 +150,7 @@ spriteSourceSize {80,128} textureRect - {{924,528},{80,128}} + {{940,256},{80,128}} textureRotated @@ -165,7 +165,7 @@ spriteSourceSize {80,128} textureRect - {{316,553},{80,128}} + {{936,384},{80,128}} textureRotated @@ -180,7 +180,7 @@ spriteSourceSize {80,128} textureRect - {{316,681},{80,128}} + {{936,512},{80,128}} textureRotated @@ -195,7 +195,7 @@ spriteSourceSize {80,128} textureRect - {{316,809},{80,128}} + {{936,640},{80,128}} textureRotated @@ -210,7 +210,7 @@ spriteSourceSize {96,128} textureRect - {{316,937},{96,128}} + {{582,531},{96,128}} textureRotated @@ -225,7 +225,7 @@ spriteSourceSize {128,112} textureRect - {{799,387},{128,112}} + {{326,871},{128,112}} textureRotated @@ -240,7 +240,7 @@ spriteSourceSize {96,96} textureRect - {{316,1321},{96,96}} + {{696,1200},{96,96}} textureRotated @@ -255,9 +255,9 @@ spriteSourceSize {96,112} textureRect - {{328,1417},{96,112}} + {{416,983},{96,112}} textureRotated - + Atk2_3.png @@ -270,9 +270,9 @@ spriteSourceSize {96,112} textureRect - {{424,1413},{96,112}} + {{656,1092},{96,112}} textureRotated - + Atk2_4.png @@ -285,7 +285,7 @@ spriteSourceSize {96,112} textureRect - {{520,1419},{96,112}} + {{528,1113},{96,112}} textureRotated @@ -300,7 +300,7 @@ spriteSourceSize {96,112} textureRect - {{764,1075},{96,112}} + {{392,1207},{96,112}} textureRotated @@ -315,7 +315,7 @@ spriteSourceSize {144,112} textureRect - {{396,471},{144,112}} + {{328,403},{144,112}} textureRotated @@ -330,7 +330,7 @@ spriteSourceSize {128,112} textureRect - {{636,611},{128,112}} + {{454,871},{128,112}} textureRotated @@ -345,9 +345,9 @@ spriteSourceSize {160,112} textureRect - {{527,283},{160,112}} + {{680,288},{160,112}} textureRotated - + Atk2_9.png @@ -360,7 +360,7 @@ spriteSourceSize {144,112} textureRect - {{636,499},{144,112}} + {{472,403},{144,112}} textureRotated @@ -375,7 +375,7 @@ spriteSourceSize {188,144} textureRect - {{208,278},{188,144}} + {{0,0},{188,144}} textureRotated @@ -390,7 +390,7 @@ spriteSourceSize {188,144} textureRect - {{0,556},{188,144}} + {{188,0},{188,144}} textureRotated @@ -405,7 +405,7 @@ spriteSourceSize {188,144} textureRect - {{0,700},{188,144}} + {{376,0},{188,144}} textureRotated @@ -420,7 +420,7 @@ spriteSourceSize {188,144} textureRect - {{0,844},{188,144}} + {{564,0},{188,144}} textureRotated @@ -435,7 +435,7 @@ spriteSourceSize {188,144} textureRect - {{0,988},{188,144}} + {{752,0},{188,144}} textureRotated @@ -450,7 +450,7 @@ spriteSourceSize {188,144} textureRect - {{0,1132},{188,144}} + {{0,144},{188,144}} textureRotated @@ -465,7 +465,7 @@ spriteSourceSize {188,144} textureRect - {{0,1276},{188,144}} + {{188,144},{188,144}} textureRotated @@ -480,7 +480,7 @@ spriteSourceSize {188,144} textureRect - {{416,139},{188,144}} + {{376,144},{188,144}} textureRotated @@ -495,7 +495,7 @@ spriteSourceSize {188,144} textureRect - {{624,0},{188,144}} + {{564,144},{188,144}} textureRotated @@ -510,7 +510,7 @@ spriteSourceSize {188,144} textureRect - {{812,0},{188,144}} + {{752,144},{188,144}} textureRotated @@ -525,7 +525,7 @@ spriteSourceSize {96,128} textureRect - {{316,1065},{96,128}} + {{582,659},{96,128}} textureRotated @@ -540,7 +540,7 @@ spriteSourceSize {112,112} textureRect - {{540,1307},{112,112}} + {{240,1081},{112,112}} textureRotated @@ -555,7 +555,7 @@ spriteSourceSize {96,112} textureRect - {{769,1171},{96,112}} + {{504,1209},{96,112}} textureRotated @@ -570,7 +570,7 @@ spriteSourceSize {128,112} textureRect - {{636,723},{128,112}} + {{678,980},{128,112}} textureRotated @@ -585,7 +585,7 @@ spriteSourceSize {164,115} textureRect - {{0,1420},{164,115}} + {{352,288},{164,115}} textureRotated @@ -600,7 +600,7 @@ spriteSourceSize {164,115} textureRect - {{164,1420},{164,115}} + {{0,374},{164,115}} textureRotated @@ -615,7 +615,7 @@ spriteSourceSize {164,115} textureRect - {{604,144},{164,115}} + {{164,374},{164,115}} textureRotated @@ -630,7 +630,7 @@ spriteSourceSize {164,115} textureRect - {{768,144},{164,115}} + {{516,288},{164,115}} textureRotated @@ -641,11 +641,11 @@ spriteOffset {0,0} spriteSize - {208,139} + {128,118} spriteSourceSize - {208,139} + {128,118} textureRect - {{0,0},{208,139}} + {{806,791},{128,118}} textureRotated @@ -656,11 +656,11 @@ spriteOffset {0,0} spriteSize - {208,139} + {128,118} spriteSourceSize - {208,139} + {128,118} textureRect - {{0,139},{208,139}} + {{0,846},{128,118}} textureRotated @@ -671,11 +671,11 @@ spriteOffset {0,0} spriteSize - {208,139} + {128,118} spriteSourceSize - {208,139} + {128,118} textureRect - {{208,0},{208,139}} + {{128,846},{128,118}} textureRotated @@ -686,11 +686,11 @@ spriteOffset {0,0} spriteSize - {208,139} + {128,118} spriteSourceSize - {208,139} + {128,118} textureRect - {{0,278},{208,139}} + {{326,753},{128,118}} textureRotated @@ -701,11 +701,11 @@ spriteOffset {0,0} spriteSize - {208,139} + {128,118} spriteSourceSize - {208,139} + {128,118} textureRect - {{208,139},{208,139}} + {{454,753},{128,118}} textureRotated @@ -716,11 +716,11 @@ spriteOffset {0,0} spriteSize - {208,139} + {128,118} spriteSourceSize - {208,139} + {128,118} textureRect - {{416,0},{208,139}} + {{678,862},{128,118}} textureRotated @@ -731,11 +731,11 @@ spriteOffset {0,0} spriteSize - {208,139} + {128,118} spriteSourceSize - {208,139} + {128,118} textureRect - {{0,417},{208,139}} + {{806,909},{128,118}} textureRotated @@ -746,11 +746,11 @@ spriteOffset {0,0} spriteSize - {144,128} + {70,128} spriteSourceSize - {144,128} + {70,128} textureRect - {{639,259},{144,128}} + {{256,489},{70,128}} textureRotated @@ -761,11 +761,11 @@ spriteOffset {0,0} spriteSize - {144,128} + {70,128} spriteSourceSize - {144,128} + {70,128} textureRect - {{783,259},{144,128}} + {{256,617},{70,128}} textureRotated @@ -776,11 +776,11 @@ spriteOffset {0,0} spriteSize - {144,128} + {70,128} spriteSourceSize - {144,128} + {70,128} textureRect - {{780,499},{144,128}} + {{256,745},{70,128}} textureRotated @@ -791,13 +791,13 @@ spriteOffset {0,0} spriteSize - {144,128} + {70,128} spriteSourceSize - {144,128} + {70,128} textureRect - {{188,556},{144,128}} + {{256,873},{70,128}} textureRotated - + Idle1_13.png @@ -806,13 +806,13 @@ spriteOffset {0,0} spriteSize - {144,128} + {70,128} spriteSourceSize - {144,128} + {70,128} textureRect - {{188,700},{144,128}} + {{112,1200},{70,128}} textureRotated - + Idle1_14.png @@ -821,13 +821,13 @@ spriteOffset {0,0} spriteSize - {144,128} + {70,128} spriteSourceSize - {144,128} + {70,128} textureRect - {{188,844},{144,128}} + {{182,1200},{70,128}} textureRotated - + Idle1_15.png @@ -836,13 +836,13 @@ spriteOffset {0,0} spriteSize - {144,128} + {70,128} spriteSourceSize - {144,128} + {70,128} textureRect - {{188,988},{144,128}} + {{252,1200},{70,128}} textureRotated - + Idle1_2.png @@ -851,13 +851,13 @@ spriteOffset {0,0} spriteSize - {144,128} + {70,128} spriteSourceSize - {144,128} + {70,128} textureRect - {{188,988},{144,128}} + {{252,1200},{70,128}} textureRotated - + Idle1_3.png @@ -866,13 +866,13 @@ spriteOffset {0,0} spriteSize - {144,128} + {70,128} spriteSourceSize - {144,128} + {70,128} textureRect - {{188,844},{144,128}} + {{182,1200},{70,128}} textureRotated - + Idle1_4.png @@ -881,13 +881,13 @@ spriteOffset {0,0} spriteSize - {144,128} + {70,128} spriteSourceSize - {144,128} + {70,128} textureRect - {{188,700},{144,128}} + {{112,1200},{70,128}} textureRotated - + Idle1_5.png @@ -896,13 +896,13 @@ spriteOffset {0,0} spriteSize - {144,128} + {70,128} spriteSourceSize - {144,128} + {70,128} textureRect - {{188,556},{144,128}} + {{256,873},{70,128}} textureRotated - + Idle1_6.png @@ -911,11 +911,11 @@ spriteOffset {0,0} spriteSize - {144,128} + {70,128} spriteSourceSize - {144,128} + {70,128} textureRect - {{780,499},{144,128}} + {{256,745},{70,128}} textureRotated @@ -926,11 +926,11 @@ spriteOffset {0,0} spriteSize - {144,128} + {70,128} spriteSourceSize - {144,128} + {70,128} textureRect - {{783,259},{144,128}} + {{256,617},{70,128}} textureRotated @@ -941,13 +941,13 @@ spriteOffset {0,0} spriteSize - {144,128} + {70,128} spriteSourceSize - {144,128} + {70,128} textureRect - {{188,1132},{144,128}} + {{322,1200},{70,128}} textureRotated - + Idle1_9.png @@ -956,11 +956,11 @@ spriteOffset {0,0} spriteSize - {144,128} + {70,128} spriteSourceSize - {144,128} + {70,128} textureRect - {{188,1276},{144,128}} + {{528,1043},{70,128}} textureRotated @@ -975,7 +975,7 @@ spriteSourceSize {112,96} textureRect - {{524,1083},{112,96}} + {{128,1092},{112,96}} textureRotated @@ -990,7 +990,7 @@ spriteSourceSize {160,112} textureRect - {{639,387},{160,112}} + {{680,400},{160,112}} textureRotated @@ -1005,7 +1005,7 @@ spriteSourceSize {144,112} textureRect - {{396,583},{144,112}} + {{680,512},{144,112}} textureRotated @@ -1020,9 +1020,9 @@ spriteSourceSize {128,112} textureRect - {{524,955},{128,112}} + {{806,1027},{128,112}} textureRotated - + InAirAtk1_4.png @@ -1035,7 +1035,7 @@ spriteSourceSize {96,96} textureRect - {{769,1283},{96,96}} + {{792,1139},{96,96}} textureRotated @@ -1050,9 +1050,9 @@ spriteSourceSize {80,96} textureRect - {{764,1379},{80,96}} + {{934,1104},{80,96}} textureRotated - + InAirAtked1_0.png @@ -1065,7 +1065,7 @@ spriteSourceSize {112,112} textureRect - {{652,1306},{112,112}} + {{352,1081},{112,112}} textureRotated @@ -1080,7 +1080,7 @@ spriteSourceSize {128,96} textureRect - {{636,1082},{128,96}} + {{0,1092},{128,96}} textureRotated @@ -1095,9 +1095,9 @@ spriteSourceSize {80,112} textureRect - {{883,1013},{80,112}} + {{934,768},{80,112}} textureRotated - + InAirIdle1_1.png @@ -1110,9 +1110,9 @@ spriteSourceSize {80,112} textureRect - {{876,1093},{80,112}} + {{934,880},{80,112}} textureRotated - + InAirIdle1_2.png @@ -1125,9 +1125,9 @@ spriteSourceSize {64,128} textureRect - {{755,1011},{64,128}} + {{464,1079},{64,128}} textureRotated - + InAirIdle1_3.png @@ -1140,9 +1140,9 @@ spriteSourceSize {80,112} textureRect - {{865,1269},{80,112}} + {{934,992},{80,112}} textureRotated - + InAirIdle1_4.png @@ -1155,7 +1155,7 @@ spriteSourceSize {80,96} textureRect - {{865,1349},{80,96}} + {{224,1001},{80,96}} textureRotated @@ -1170,7 +1170,7 @@ spriteSourceSize {80,96} textureRect - {{860,1429},{80,96}} + {{320,1001},{80,96}} textureRotated @@ -1185,7 +1185,7 @@ spriteSourceSize {80,96} textureRect - {{632,1419},{80,96}} + {{792,1235},{80,96}} textureRotated @@ -1200,9 +1200,9 @@ spriteSourceSize {96,112} textureRect - {{865,1173},{96,112}} + {{600,1209},{96,112}} textureRotated - + InAirIdle1_8.png @@ -1215,7 +1215,7 @@ spriteSourceSize {96,128} textureRect - {{316,1193},{96,128}} + {{582,787},{96,128}} textureRotated @@ -1230,9 +1230,9 @@ spriteSourceSize {96,128} textureRect - {{412,1317},{96,128}} + {{582,915},{96,128}} textureRotated - + LayDown1_1.png @@ -1241,13 +1241,13 @@ spriteOffset {0,0} spriteSize - {131,188} + {176,86} spriteSourceSize - {131,188} + {176,86} textureRect - {{208,422},{131,188}} + {{0,288},{176,86}} textureRotated - + LayDown1_2.png @@ -1256,11 +1256,11 @@ spriteOffset {0,0} spriteSize - {131,188} + {176,86} spriteSourceSize - {131,188} + {176,86} textureRect - {{396,283},{131,188}} + {{176,288},{176,86}} textureRotated @@ -1275,7 +1275,7 @@ spriteSourceSize {119,128} textureRect - {{396,695},{119,128}} + {{0,489},{119,128}} textureRotated @@ -1290,9 +1290,9 @@ spriteSourceSize {119,128} textureRect - {{764,627},{119,128}} + {{128,489},{119,128}} textureRotated - + Walking_11.png @@ -1305,7 +1305,7 @@ spriteSourceSize {119,128} textureRect - {{883,656},{119,128}} + {{0,608},{119,128}} textureRotated @@ -1320,9 +1320,9 @@ spriteSourceSize {119,128} textureRect - {{764,755},{119,128}} + {{128,608},{119,128}} textureRotated - + Walking_13.png @@ -1335,7 +1335,7 @@ spriteSourceSize {119,128} textureRect - {{883,775},{119,128}} + {{326,515},{119,128}} textureRotated @@ -1350,7 +1350,7 @@ spriteSourceSize {119,128} textureRect - {{396,814},{119,128}} + {{454,515},{119,128}} textureRotated @@ -1365,7 +1365,7 @@ spriteSourceSize {119,128} textureRect - {{636,835},{119,128}} + {{678,624},{119,128}} textureRotated @@ -1380,9 +1380,9 @@ spriteSourceSize {119,128} textureRect - {{636,954},{119,128}} + {{806,672},{119,128}} textureRotated - + Walking_5.png @@ -1395,9 +1395,9 @@ spriteSourceSize {119,128} textureRect - {{412,1189},{119,128}} + {{0,727},{119,128}} textureRotated - + Walking_6.png @@ -1410,9 +1410,9 @@ spriteSourceSize {119,128} textureRect - {{531,1179},{119,128}} + {{128,727},{119,128}} textureRotated - + Walking_7.png @@ -1425,9 +1425,9 @@ spriteSourceSize {119,128} textureRect - {{650,1178},{119,128}} + {{326,634},{119,128}} textureRotated - + Walking_8.png @@ -1440,9 +1440,9 @@ spriteSourceSize {119,128} textureRect - {{764,883},{119,128}} + {{454,634},{119,128}} textureRotated - + Walking_9.png @@ -1455,7 +1455,7 @@ spriteSourceSize {119,128} textureRect - {{883,894},{119,128}} + {{678,743},{119,128}} textureRotated @@ -1471,9 +1471,9 @@ realTextureFileName KnifeGirl.png size - {1011,1535} + {1020,1331} smartupdate - $TexturePacker:SmartUpdate:f252fe395c8b73eac036cce868bca4bd:cc7b2dcbe80e2927a14b4c2409462644:1ae107e0c6667a1ecb5ed98687517e0e$ + $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 index 566abdd..199cf90 100644 --- a/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.plist.meta +++ b/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.plist.meta @@ -3,8 +3,8 @@ "uuid": "579bc0c1-f5e2-4a5d-889b-9d567e53b0e6", "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "size": { - "width": 1011, - "height": 1535 + "width": 1020, + "height": 1331 }, "type": "Texture Packer", "subMetas": { @@ -17,8 +17,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 524, - "trimY": 699, + "trimX": 824, + "trimY": 544, "width": 112, "height": 128, "rawWidth": 112, @@ -39,8 +39,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 524, - "trimY": 827, + "trimX": 0, + "trimY": 1200, "width": 112, "height": 128, "rawWidth": 112, @@ -61,8 +61,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 932, - "trimY": 144, + "trimX": 616, + "trimY": 403, "width": 64, "height": 128, "rawWidth": 64, @@ -83,8 +83,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 927, - "trimY": 272, + "trimX": 940, + "trimY": 0, "width": 80, "height": 128, "rawWidth": 80, @@ -105,8 +105,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 927, - "trimY": 400, + "trimX": 940, + "trimY": 128, "width": 80, "height": 128, "rawWidth": 80, @@ -127,8 +127,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 412, - "trimY": 933, + "trimX": 0, + "trimY": 964, "width": 112, "height": 128, "rawWidth": 112, @@ -149,8 +149,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 412, - "trimY": 1061, + "trimX": 112, + "trimY": 964, "width": 112, "height": 128, "rawWidth": 112, @@ -171,8 +171,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 540, - "trimY": 443, + "trimX": 840, + "trimY": 288, "width": 96, "height": 128, "rawWidth": 96, @@ -193,8 +193,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 540, - "trimY": 571, + "trimX": 840, + "trimY": 416, "width": 96, "height": 128, "rawWidth": 96, @@ -215,8 +215,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 924, - "trimY": 528, + "trimX": 940, + "trimY": 256, "width": 80, "height": 128, "rawWidth": 80, @@ -237,8 +237,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 316, - "trimY": 553, + "trimX": 936, + "trimY": 384, "width": 80, "height": 128, "rawWidth": 80, @@ -259,8 +259,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 316, - "trimY": 681, + "trimX": 936, + "trimY": 512, "width": 80, "height": 128, "rawWidth": 80, @@ -281,8 +281,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 316, - "trimY": 809, + "trimX": 936, + "trimY": 640, "width": 80, "height": 128, "rawWidth": 80, @@ -303,8 +303,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 316, - "trimY": 937, + "trimX": 582, + "trimY": 531, "width": 96, "height": 128, "rawWidth": 96, @@ -325,8 +325,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 799, - "trimY": 387, + "trimX": 326, + "trimY": 871, "width": 128, "height": 112, "rawWidth": 128, @@ -347,8 +347,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 316, - "trimY": 1321, + "trimX": 696, + "trimY": 1200, "width": 96, "height": 96, "rawWidth": 96, @@ -366,11 +366,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 328, - "trimY": 1417, + "trimX": 416, + "trimY": 983, "width": 96, "height": 112, "rawWidth": 96, @@ -388,11 +388,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 424, - "trimY": 1413, + "trimX": 656, + "trimY": 1092, "width": 96, "height": 112, "rawWidth": 96, @@ -413,8 +413,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 520, - "trimY": 1419, + "trimX": 528, + "trimY": 1113, "width": 96, "height": 112, "rawWidth": 96, @@ -435,8 +435,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 764, - "trimY": 1075, + "trimX": 392, + "trimY": 1207, "width": 96, "height": 112, "rawWidth": 96, @@ -457,8 +457,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 396, - "trimY": 471, + "trimX": 328, + "trimY": 403, "width": 144, "height": 112, "rawWidth": 144, @@ -479,8 +479,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 636, - "trimY": 611, + "trimX": 454, + "trimY": 871, "width": 128, "height": 112, "rawWidth": 128, @@ -498,11 +498,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 527, - "trimY": 283, + "trimX": 680, + "trimY": 288, "width": 160, "height": 112, "rawWidth": 160, @@ -523,8 +523,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 636, - "trimY": 499, + "trimX": 472, + "trimY": 403, "width": 144, "height": 112, "rawWidth": 144, @@ -545,8 +545,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 208, - "trimY": 278, + "trimX": 0, + "trimY": 0, "width": 188, "height": 144, "rawWidth": 188, @@ -567,8 +567,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 0, - "trimY": 556, + "trimX": 188, + "trimY": 0, "width": 188, "height": 144, "rawWidth": 188, @@ -589,8 +589,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 0, - "trimY": 700, + "trimX": 376, + "trimY": 0, "width": 188, "height": 144, "rawWidth": 188, @@ -611,8 +611,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 0, - "trimY": 844, + "trimX": 564, + "trimY": 0, "width": 188, "height": 144, "rawWidth": 188, @@ -633,8 +633,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 0, - "trimY": 988, + "trimX": 752, + "trimY": 0, "width": 188, "height": 144, "rawWidth": 188, @@ -656,7 +656,7 @@ "offsetX": 0, "offsetY": 0, "trimX": 0, - "trimY": 1132, + "trimY": 144, "width": 188, "height": 144, "rawWidth": 188, @@ -677,8 +677,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 0, - "trimY": 1276, + "trimX": 188, + "trimY": 144, "width": 188, "height": 144, "rawWidth": 188, @@ -699,8 +699,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 416, - "trimY": 139, + "trimX": 376, + "trimY": 144, "width": 188, "height": 144, "rawWidth": 188, @@ -721,8 +721,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 624, - "trimY": 0, + "trimX": 564, + "trimY": 144, "width": 188, "height": 144, "rawWidth": 188, @@ -743,8 +743,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 812, - "trimY": 0, + "trimX": 752, + "trimY": 144, "width": 188, "height": 144, "rawWidth": 188, @@ -765,8 +765,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 316, - "trimY": 1065, + "trimX": 582, + "trimY": 659, "width": 96, "height": 128, "rawWidth": 96, @@ -787,8 +787,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 540, - "trimY": 1307, + "trimX": 240, + "trimY": 1081, "width": 112, "height": 112, "rawWidth": 112, @@ -809,8 +809,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 769, - "trimY": 1171, + "trimX": 504, + "trimY": 1209, "width": 96, "height": 112, "rawWidth": 96, @@ -831,8 +831,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 636, - "trimY": 723, + "trimX": 678, + "trimY": 980, "width": 128, "height": 112, "rawWidth": 128, @@ -853,8 +853,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 0, - "trimY": 1420, + "trimX": 352, + "trimY": 288, "width": 164, "height": 115, "rawWidth": 164, @@ -875,8 +875,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 164, - "trimY": 1420, + "trimX": 0, + "trimY": 374, "width": 164, "height": 115, "rawWidth": 164, @@ -897,8 +897,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 604, - "trimY": 144, + "trimX": 164, + "trimY": 374, "width": 164, "height": 115, "rawWidth": 164, @@ -919,8 +919,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 768, - "trimY": 144, + "trimX": 516, + "trimY": 288, "width": 164, "height": 115, "rawWidth": 164, @@ -941,12 +941,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 0, - "trimY": 0, - "width": 208, - "height": 139, - "rawWidth": 208, - "rawHeight": 139, + "trimX": 806, + "trimY": 791, + "width": 128, + "height": 118, + "rawWidth": 128, + "rawHeight": 118, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -964,11 +964,11 @@ "offsetX": 0, "offsetY": 0, "trimX": 0, - "trimY": 139, - "width": 208, - "height": 139, - "rawWidth": 208, - "rawHeight": 139, + "trimY": 846, + "width": 128, + "height": 118, + "rawWidth": 128, + "rawHeight": 118, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -985,12 +985,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 208, - "trimY": 0, - "width": 208, - "height": 139, - "rawWidth": 208, - "rawHeight": 139, + "trimX": 128, + "trimY": 846, + "width": 128, + "height": 118, + "rawWidth": 128, + "rawHeight": 118, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -1007,12 +1007,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 0, - "trimY": 278, - "width": 208, - "height": 139, - "rawWidth": 208, - "rawHeight": 139, + "trimX": 326, + "trimY": 753, + "width": 128, + "height": 118, + "rawWidth": 128, + "rawHeight": 118, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -1029,12 +1029,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 208, - "trimY": 139, - "width": 208, - "height": 139, - "rawWidth": 208, - "rawHeight": 139, + "trimX": 454, + "trimY": 753, + "width": 128, + "height": 118, + "rawWidth": 128, + "rawHeight": 118, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -1051,12 +1051,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 416, - "trimY": 0, - "width": 208, - "height": 139, - "rawWidth": 208, - "rawHeight": 139, + "trimX": 678, + "trimY": 862, + "width": 128, + "height": 118, + "rawWidth": 128, + "rawHeight": 118, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -1073,12 +1073,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 0, - "trimY": 417, - "width": 208, - "height": 139, - "rawWidth": 208, - "rawHeight": 139, + "trimX": 806, + "trimY": 909, + "width": 128, + "height": 118, + "rawWidth": 128, + "rawHeight": 118, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -1095,11 +1095,11 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 639, - "trimY": 259, - "width": 144, + "trimX": 256, + "trimY": 489, + "width": 70, "height": 128, - "rawWidth": 144, + "rawWidth": 70, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -1117,11 +1117,11 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 783, - "trimY": 259, - "width": 144, + "trimX": 256, + "trimY": 617, + "width": 70, "height": 128, - "rawWidth": 144, + "rawWidth": 70, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -1139,11 +1139,11 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 780, - "trimY": 499, - "width": 144, + "trimX": 256, + "trimY": 745, + "width": 70, "height": 128, - "rawWidth": 144, + "rawWidth": 70, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -1158,14 +1158,14 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 188, - "trimY": 556, - "width": 144, + "trimX": 256, + "trimY": 873, + "width": 70, "height": 128, - "rawWidth": 144, + "rawWidth": 70, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -1180,14 +1180,14 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 188, - "trimY": 700, - "width": 144, + "trimX": 112, + "trimY": 1200, + "width": 70, "height": 128, - "rawWidth": 144, + "rawWidth": 70, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -1202,14 +1202,14 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 188, - "trimY": 844, - "width": 144, + "trimX": 182, + "trimY": 1200, + "width": 70, "height": 128, - "rawWidth": 144, + "rawWidth": 70, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -1224,14 +1224,14 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 188, - "trimY": 988, - "width": 144, + "trimX": 252, + "trimY": 1200, + "width": 70, "height": 128, - "rawWidth": 144, + "rawWidth": 70, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -1246,14 +1246,14 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 188, - "trimY": 988, - "width": 144, + "trimX": 252, + "trimY": 1200, + "width": 70, "height": 128, - "rawWidth": 144, + "rawWidth": 70, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -1268,14 +1268,14 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 188, - "trimY": 844, - "width": 144, + "trimX": 182, + "trimY": 1200, + "width": 70, "height": 128, - "rawWidth": 144, + "rawWidth": 70, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -1290,14 +1290,14 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 188, - "trimY": 700, - "width": 144, + "trimX": 112, + "trimY": 1200, + "width": 70, "height": 128, - "rawWidth": 144, + "rawWidth": 70, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -1312,14 +1312,14 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 188, - "trimY": 556, - "width": 144, + "trimX": 256, + "trimY": 873, + "width": 70, "height": 128, - "rawWidth": 144, + "rawWidth": 70, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -1337,11 +1337,11 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 780, - "trimY": 499, - "width": 144, + "trimX": 256, + "trimY": 745, + "width": 70, "height": 128, - "rawWidth": 144, + "rawWidth": 70, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -1359,11 +1359,11 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 783, - "trimY": 259, - "width": 144, + "trimX": 256, + "trimY": 617, + "width": 70, "height": 128, - "rawWidth": 144, + "rawWidth": 70, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -1378,14 +1378,14 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 188, - "trimY": 1132, - "width": 144, + "trimX": 322, + "trimY": 1200, + "width": 70, "height": 128, - "rawWidth": 144, + "rawWidth": 70, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -1403,11 +1403,11 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 188, - "trimY": 1276, - "width": 144, + "trimX": 528, + "trimY": 1043, + "width": 70, "height": 128, - "rawWidth": 144, + "rawWidth": 70, "rawHeight": 128, "borderTop": 0, "borderBottom": 0, @@ -1425,8 +1425,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 524, - "trimY": 1083, + "trimX": 128, + "trimY": 1092, "width": 112, "height": 96, "rawWidth": 112, @@ -1447,8 +1447,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 639, - "trimY": 387, + "trimX": 680, + "trimY": 400, "width": 160, "height": 112, "rawWidth": 160, @@ -1469,8 +1469,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 396, - "trimY": 583, + "trimX": 680, + "trimY": 512, "width": 144, "height": 112, "rawWidth": 144, @@ -1488,11 +1488,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 524, - "trimY": 955, + "trimX": 806, + "trimY": 1027, "width": 128, "height": 112, "rawWidth": 128, @@ -1513,8 +1513,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 769, - "trimY": 1283, + "trimX": 792, + "trimY": 1139, "width": 96, "height": 96, "rawWidth": 96, @@ -1532,11 +1532,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 764, - "trimY": 1379, + "trimX": 934, + "trimY": 1104, "width": 80, "height": 96, "rawWidth": 80, @@ -1557,8 +1557,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 652, - "trimY": 1306, + "trimX": 352, + "trimY": 1081, "width": 112, "height": 112, "rawWidth": 112, @@ -1579,8 +1579,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 636, - "trimY": 1082, + "trimX": 0, + "trimY": 1092, "width": 128, "height": 96, "rawWidth": 128, @@ -1598,11 +1598,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 883, - "trimY": 1013, + "trimX": 934, + "trimY": 768, "width": 80, "height": 112, "rawWidth": 80, @@ -1620,11 +1620,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 876, - "trimY": 1093, + "trimX": 934, + "trimY": 880, "width": 80, "height": 112, "rawWidth": 80, @@ -1642,11 +1642,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 755, - "trimY": 1011, + "trimX": 464, + "trimY": 1079, "width": 64, "height": 128, "rawWidth": 64, @@ -1664,11 +1664,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 865, - "trimY": 1269, + "trimX": 934, + "trimY": 992, "width": 80, "height": 112, "rawWidth": 80, @@ -1689,8 +1689,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 865, - "trimY": 1349, + "trimX": 224, + "trimY": 1001, "width": 80, "height": 96, "rawWidth": 80, @@ -1711,8 +1711,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 860, - "trimY": 1429, + "trimX": 320, + "trimY": 1001, "width": 80, "height": 96, "rawWidth": 80, @@ -1733,8 +1733,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 632, - "trimY": 1419, + "trimX": 792, + "trimY": 1235, "width": 80, "height": 96, "rawWidth": 80, @@ -1752,11 +1752,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 865, - "trimY": 1173, + "trimX": 600, + "trimY": 1209, "width": 96, "height": 112, "rawWidth": 96, @@ -1777,8 +1777,8 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 316, - "trimY": 1193, + "trimX": 582, + "trimY": 787, "width": 96, "height": 128, "rawWidth": 96, @@ -1796,11 +1796,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 412, - "trimY": 1317, + "trimX": 582, + "trimY": 915, "width": 96, "height": 128, "rawWidth": 96, @@ -1818,15 +1818,15 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": true, + "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 208, - "trimY": 422, - "width": 131, - "height": 188, - "rawWidth": 131, - "rawHeight": 188, + "trimX": 0, + "trimY": 288, + "width": 176, + "height": 86, + "rawWidth": 176, + "rawHeight": 86, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -1843,12 +1843,12 @@ "rotated": false, "offsetX": 0, "offsetY": 0, - "trimX": 396, - "trimY": 283, - "width": 131, - "height": 188, - "rawWidth": 131, - "rawHeight": 188, + "trimX": 176, + "trimY": 288, + "width": 176, + "height": 86, + "rawWidth": 176, + "rawHeight": 86, "borderTop": 0, "borderBottom": 0, "borderLeft": 0, @@ -1865,8 +1865,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 396, - "trimY": 695, + "trimX": 0, + "trimY": 489, "width": 119, "height": 128, "rawWidth": 119, @@ -1884,11 +1884,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 764, - "trimY": 627, + "trimX": 128, + "trimY": 489, "width": 119, "height": 128, "rawWidth": 119, @@ -1909,8 +1909,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 883, - "trimY": 656, + "trimX": 0, + "trimY": 608, "width": 119, "height": 128, "rawWidth": 119, @@ -1928,11 +1928,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 764, - "trimY": 755, + "trimX": 128, + "trimY": 608, "width": 119, "height": 128, "rawWidth": 119, @@ -1953,8 +1953,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 883, - "trimY": 775, + "trimX": 326, + "trimY": 515, "width": 119, "height": 128, "rawWidth": 119, @@ -1975,8 +1975,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 396, - "trimY": 814, + "trimX": 454, + "trimY": 515, "width": 119, "height": 128, "rawWidth": 119, @@ -1997,8 +1997,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 636, - "trimY": 835, + "trimX": 678, + "trimY": 624, "width": 119, "height": 128, "rawWidth": 119, @@ -2016,11 +2016,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 636, - "trimY": 954, + "trimX": 806, + "trimY": 672, "width": 119, "height": 128, "rawWidth": 119, @@ -2038,11 +2038,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 412, - "trimY": 1189, + "trimX": 0, + "trimY": 727, "width": 119, "height": 128, "rawWidth": 119, @@ -2060,11 +2060,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 531, - "trimY": 1179, + "trimX": 128, + "trimY": 727, "width": 119, "height": 128, "rawWidth": 119, @@ -2082,11 +2082,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 650, - "trimY": 1178, + "trimX": 326, + "trimY": 634, "width": 119, "height": 128, "rawWidth": 119, @@ -2104,11 +2104,11 @@ "rawTextureUuid": "385b0a2b-765c-43fc-9243-977baccfd37a", "trimType": "auto", "trimThreshold": 1, - "rotated": false, + "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 764, - "trimY": 883, + "trimX": 454, + "trimY": 634, "width": 119, "height": 128, "rawWidth": 119, @@ -2129,8 +2129,8 @@ "rotated": true, "offsetX": 0, "offsetY": 0, - "trimX": 883, - "trimY": 894, + "trimX": 678, + "trimY": 743, "width": 119, "height": 128, "rawWidth": 119, diff --git a/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.png b/frontend/assets/resources/animation/KnifeGirl/KnifeGirl.png index 49d5136108075a6920b4544af37cf423809f083e..d4ab89cc631903d374aa93fe0cbbc3bc7801082b 100644 GIT binary patch literal 106974 zcmb??Wmr_-7cM9b(k(Co(g*?~&4|*S(hMP>A|fTizzp4`bjT3W(k;RWh;$<%-3>zx z15=mZ|9S3*`~7}6=j^@L+V9C{opsjxo)|-Yje8XA6a)kW_p~%sjR^?uVh9L`rO58y zju_A_e!1N|GSoFy(|zN4+ms+sAtQTm6laY48AnS%+o&aE#p;N|;eP-A3zmq({r&cq zRpqxz0JhfU)K zg)RuvMyhFyoZws6V1(rJXVtSWRU{tzwan`{hNCjOQ%lN=66N>H{{OBZY}#5v2a?l9 zeOCoF(YRPBr*9xPnh079Pn7R`+aC`3Uqc5WfT-LCX>hKP!ebGY6#sdp3;-@6wtF>2 zi8btZj+GgHvG`D#-W-%|>*cT#6uUbCCc-kww^1>~r4rn*|~7CUEI{O)xcR(>D#d_ep|FUY*`)^2z~S*&Us zeLGmc)~FJgG+k2N%Ur~)QMSR;!&>y!c;>2N5>9^8B>S9`#R1B?3jtXk6jvYAv7ys& z@)UsVRhh6<<@g^CGKSY~p5gLhci~-Rh=s@9god-5PGIIbB z^u@P*GDAXPj4z{NEHe6MocaQWkHl2IW*c`AYy^;Vm#1Izw54zqC3E%x~=ppu!}IBe{36(ked^zg$(E zbol-wr#P>B`fh1z&h0F^*K2wk%GWqfq~=EV{G=q(tN zgx3y%_izs`jg(k1ATJ3zG3R*ZvN#??%BDp5*vOTuV4wxYm?9d|iq#JRSoWIgKITw0 z_enJhNL67n<^IW35qo>jWUj;V#J~J~^jmgW-C-;kkoLRrt;d}!>e*K?lcIai`R$ed zPLlaD(m2 z^P8fSfITaYs|`Y~;%pIS`oFX{ug>qE<^0ozau(-cI%vs*9HHU!L1nwHI&y|IH%(l_ ze3#C`arPeqd%MYIuK1>EO!ee%&O#nh1OYNkRF;}ehe+#`N$U;%Nvgt4zc_9T6Wcm- z4SW`(VxZ(j6;kq+WvUyIqa2Z8(Ptq+`x8~)@&lLcIE8NRqF)KSp$3v^G{5&on5NB__ zc`fx?#U;3Dj(Ni!imWOg^R`it{m~CL#(=>>NOyy4qcxSX1qmwLSvRA#3rOU1ETt4a z!>iixg{4`IFfJ0>&Qo3Mq&B?s;(0>E!XN`?k|S6*_zz{N0IJO`xKU8@1K$l;)H(Sg zQKq=NI7ZOjqgiyLAooFtvD;|D&o4w@-I>m;Y|{SpT&8Pa7Mgn#nd*Wgp9aIDwnq>r z$DS=8k|_m;sHG5Z#?zcK`yy7aBmg{5_j?LnX4}Ue-i16fuuLse`cQ7{G~{J)_G1^| z-jvJebYZ_L5>GPQVx`PYBYph12FvX(JZjdg~-oG>C$=3MUp4O(+llHxy;v3;| z4!Q~+#wO{a!Lcp%SL0ueEOLcuY~nbCuYLBE%e234H1wakA{U+#gCCSEcYVAJ1_t&W z9eO*h6y{^2hyLt&aWJWJ%hyavB_C_3g~A4TR^vjcGCtnvHL7~q+mRK~E{fhS>=<`} zZmqeptgT35HjbD(w?%LdP=s&+6!=8|eA)a|U6C$>{)2uox^9!NRI)pR4*TIG#@}!9 za^RD`Uh2x6$Ew5HpF37G$Bw;!x_>8V$uOCR1HCPC3)uBhNo(+yY7;Gl6voh=0aLYd zsZ^izom z@Oo)yfDr%AJf9l@e1o;6$8ZhoQai#{{ZPw!h=vYeq{ z2_e~n6~W^;grviEt*ERwIAuChMK#?IoF!eW5$IY0hr$X2?_e&DY(vpofdiyBMPGHvd)M6h z$G+(;RJLM>I9*hZ8Lp#G_rNMLtOEDZwwdJL+n>U@ZisQqHYvcm!LdQ4X3u0)QjEgQcoXN))xT{Ev#3Az8S|HE`Lf^I~U#LMtD z;5mKg`(qc}Y8Wji>;qhmgZwg(PknHgq?j)3&WGc*za->ul&(M0V;D8)?4J7Ixs;dJ z+hYe3*Pq>M`YiL|UI;{k^cP~9yFXIPayDy4qR+T)UNuze9e5!P6@uvA`*SIC^UXz1M z3gxjWBd1Ss5zV6s>q(t^#QIZd$scERu$z)ihBmFwv6dfo9?Q$e5#fU2CEX3fKMw)FPJ)EY^UsEvp^VJ2#?b zE~OE#e#ws_+%|YI3gZA(THC!4R!NlHI{9=DWrT^nkYQZYjdzD&H{foItjrh5hx$tG zKc%O|=6Jq^iFwJ!#~zmFXFq_|+as@Oov#e%9{YU%^M%Ird`%wFH(&BmKf0D{)VI;g zriP)}J?t}pC_JH>k(H1f_a2ODuV(PMRy7MN_bIbSf^T~7KtQ!a;?^AUC1vU)#K@G{ zX@wtMvUEYp{&!XhA-c4dDGy*%0zE8<)6^e7K3(S3@LRB%ZfaaE(sg;}gzMy=WCaPE z9N3&${E)gUYN2uOd^hwmDNZ>DQ^r04sdJurdSP&L*U>>f-olUsS=S9WR3}4;Qa%Y0 z0v)@r1ak6x2yd=?e5VOWglQeG+v!T-RJ3JD2+|B3&5DoBd*o?(E!MhYsV-$`l=mbf zFnQ3nq`$$wJ-ZPygXDhoRr&IZS$%)88OP0Il_3cj$Bo40(8BZ6sL4I@pxmI1O!!V} zww}V53Q`wtp@<&X*94O1(ckb zUj~|}kOtRFEZ2~4#NDWxyD=ZGRFb?Kb>SWRie>F;n!3wvFkU$(|D%d;pDR6|UVvCpu$fJ?o|`k9Z#|W&+kU8Nu zhOKt9V)N#8=48+H2b#}cDr8KFYvwcS0Zn;XB{z;{JRQOx7PN|X%U$>_h4C*%M?(!h zV}4I=9IE<$5iXIe~=&dqyTU~XK6 zvrdsvNT%K@!-vW22(V>|WPM->rOmcjuk(U$M2|r?hy>}GrLG;%Z_b449r*0bmY)|! z!#6edMziJ1H+~T5eBWT-XUNHb+XRdCuFw*pw=c!$OYg+W=|A*;m%aKYwPfbsy1*7` zlMpqm&47C}{l1W7-FdxmN+Mts$Eyocq(_VOJc4(%v{+SZG-X^2JMY3F$ zGz2Y~At}T8{in68dW3~#vjsyIMJeqwwT3Z2rbAF~if2%On2}y@#V_U2NZj{F$wc^I zc`GT*2joy%!{L;3$l=(oK^1SeYkk7()x=t|Bv-y(k^}Hb#FV%~=!z8P-yfSQ?cO(Q?udk>_eH^gy>Hjwk?WMa_c$h{^udDriv}3Xm?GFFuG9gBEX@}`?Y<` zdtu-*ARFX0Hg)$A4<^7e;A0ULAQUS6Fum^N`ldOFZJWOcdRYH6wfYe=REKR6BRivy zaPv2pJKgNEWwTsPV$`*z!u(sPK7V+oFnwNE=C4e472+25R=kHkg42K0O^s5TLL|MnC zQC!^D3jo?yW@U0(QsI)(sn#muKsKy1nNh_9*RSB8cpgsY&3K`D>Y%Q}mXEP|*-19B z`xCJNtzKUTHMs*>qNbpvzgH)zKlXoK@d@nXvQE(6ZzPc-t@N4w;hv5wllGwG`E zl32Dv3sl(PzQRHa72I12lgevEhHKpBSkQ?flclh~n`&?FOTb@-J?@Gz2)KoIkQjzf zQy6T1O=O4KZQKkLqG~WgbJcYoJ;l z9rU!*P86#UOR~Sob|B2vmrzgXq1*Z$v_tAnp$-)N`tc8OLQR;}j_muVT`2oRsr}vXLCR{UfvA7*95Aad%bW=_>f5;%a{G9k>}&JS{3}jo|)MBn-DuBYEajK za)Ui%tq<#LQ1B&%yvf8r)qFNL)u2L-xRm7_v5JlpHIe%dfZIZ`$?*HfT2w9e&Z+PM3P! zQH5u72!7S5>MC^8|HV=)>`zibZ}wNcHg7m3xO(oU?W-}!-or~{~C z<~G!mJzqN=MNK{pDIq(l)A9HezauRExDirqJpX;d!yq5#kOQYXxt_g0G~_xF#Ye^~mDor{NmJi&W~8q1D*~1WZCDA#>7U zHI+^EO5tt%_riH-JJWqNHfhFQwP;xpEfpk7$$5|S%IMOV1tRV`cxz!0U~}JR&u@B9 zNBzO>Sf@%I*^hYuBv#;zD?q|>K;rOK$%+kW&~a!O!4u#v^}X@mx%b^o$q^||O=EMV zp`SkE?$|(p`GEF;d5cgo7pYE(bYH829=!*C)W*^D`n?-zip+|aFa%IEDvjeAe-!NZ z-(}||dUURi?pBZBE0fJxnvCc0H4Zl6py=%H+UX?ld){&6XQw4prSHCf>+b4QiwmO2 zN<1uzc+zP-7yr3+(pSePm2u)h{N>kxr}lZrMa>HAxQH2#k2M>kJKV~{J)EOWcU`T6 zcj1gTRKV-2GSNGZJM|TU#H?jA>jK@~1(I40{l`O4}Z3X_gSmDH#e|%6^Be(e`9s3NhxGU0i`_UDxfcl(YHW~>~ zNv)%fOp0>9(9By9M+zV}-j7?}fsREiJA#d{$xyHA)vKh=*h9&*7Z9bl8_G3G(NsvW zlKMl1+_or~cL35=tb6QppuG8wC*N|@J0wW+qLh)G9&36M($pOmaW(Px^}kQ{(U6aw`fgIpH7RJWc)F;SK9U2pK;Fz>r>gi2s!hW0ObL4$gkpyVGV4P{+(A^J{{S z9~?6bb}m(s!|}|VxZ-9{XGxHH$(Wu|#EL&M>Fi2xK0NY@b5+CDO&wZ@e_l1W`0msI zVUR|r9|5aS^(rlk!E!*PdO*h0i;VaLArigJFdFLx{XIbO%n^(Kc5EUw<$fG>72nb; z0o>&v<$>Uwt9i$Y((*nh8MM&Z1*#6xFT`6RG`awH<&58$a_e`bufIrTgZ&f{*4gj2 z9xr@yb1k2#phOiEjE{U-n@u8kl0$LucN?c6|RgNwrh2s`wkHSulXp#VBPB+0#K?y zADi7&;F-oH^w=#5+@}whFHv(JMHO1>Pwkhw4OZJbt`3AT$I)AB0ZRPY{e^EFTlAkQ z5ohb{Q?_9WxpSy^P0OQpy@$h#=J!r}yP!TTs*Q9idE+ z3h58`+5mr3$#JMuS%!;?cmbh@4N^cRgCg;qpKf7VgU_^RaiLUnL165S4vdwqS4(mkMe%)Ywy<13>!xe~ZaTGGK(mV0OpEtFFIpAM0|<1bI$K z-uz+o&oE%5HLJjAqFTUc=fTgT?^0g}s)b4sn}xdu3v;(A0>}ZFbeXt+R1w>rvrA)A z`yKPhR#cXbnhwK&xh^f0QRsmZ`@s{hUT48w3uuP>y2z`^!h720nMc+#roJ99W?9f; zOsq^Zv%`C9qF#>W4Vu#O+?Wj_?v)QOX!HtARF7bPLA>0nwA+?cf&0-n?J0JKQgn6T ziqwtNP(Jk7D*TxXC>$T3jb?Q+DJ|IkihA1_31 zM<-uoCv~{J zwUAvi?OCrPxae=k9LUlh>r-^Xd$TuaUKN-V8-LQlXHE>AR^P-dx&4B134mj_sc{Xv zv*(Xgw-0VZ_w2k;Ae0W#?sGR?>;X4n#1ALvjI~qt${PhWQJRp{_7}D%C%w3TH)m`e z>0LjPc0rzswY$Jy^1fL@fi(E_<^kI~xQO1dq|XveO%o<-@P;FyOF=B)`(HlO= zsb0vjuz=RmQ5jDl&eNms%w4}D_|}r+q>AUzI?qQ|Ix$Dr6QiH`mlQe&EqW2T??l@u{`vWL|9~zYMAyA{rMUJDw9r~%8`O1OMG?SZocn^ZQe*j=1Is<8snZ_-&$O4s~4xh>mSOWk>cbX^A4P~aXu zJ26!>*KD+@5Pi}hUV_DQ;OKW@y~^MRIhgI8G`+?jQ!OmmLklnod=Zw;dhe<%Kop1( zMzp))ccus0&5$`}$WqGE6ditr6xW~+=GD!X^3yNpV5QLR&3T=z5~n!5^wvq}C-Z|G zXSWHMl~j!&(FGJ~hH0>GU0K~3zZfFNJ?F>2dOP-yv~7pnC5n5Kc~=U(q=Y$u2$dR0 z(zo?^rkCw3avWZlW;FeK(Q5%TLsd zIY239Ko5g9znp07%v;teUk_&mUL|JqaX!4!`c>2P*>JCMN$X1E+H26~`YwiX-Awq# z6g267su5<7&+5%J7O-=LXE8X>@$%BB_iHHhZv8oPJixzu(WgM^r-)fr`hqv7sR5_| zZm!#f-6;aBdHl|cgs-bQUinx~4?=v;YaH*Yp{BPBVb;GpiGUg2yOho_ z@PLu+pQh{2iQY5AwWF^YPg&J3r{ZA7!?_4jarvPLMHNR|1blr55yfSjO7lXl;)?Rd zk7ZBI1=_I8>@P`}?__RUK4lhT~=AXRuW zl7{X#LOFcHFeVhB@f}FbX@mS3(7Ikz@Q)`YZ!|!JCITw_gy(#IG3F;I!>b|#y0{oY z@AEEbmv7_f&IJ7FIbQVw=q;^mYgHj@ir7%}1NB?nU*m}CMVIPdIQ8>VCV5U5WWPx4 z-Opoz7RAI>pW-XoDq)J zkv|-SL-ikxF`WDH?fBvtY>i z*UF+wd;^Wf)|OZ55kuu0XFpC~s=+@w>8OiTPw!Y(MWwQno zw~HQ2n)@5}K`-CN=EA_Y2>+wIqKwPyN*jN!$X3_(5_Qwq{c}1B0cb!7bzpGMO(BEh zI6Gk8O^IuK_FyW`wGddHhC25$?C3gsg1BFql#ERzl?*orBcUO=_~`+3VcCoF1o` zv*e+-mk*1Qo_Q{ngS?jx{vSPnWFOwI%}|5W_h)FQvGz;ME&nbuj|ZGE|K|pZ)ZP6b zC67MD{*S>gST(roFL+Ci@1yupLRejD!3LAHTVh^342XH6z5hQS228&aCI0m~y!sY3 za3r6~vC;P)YSy&yf0Nocn0`DdFA)3BMu)L^ytwxaYMXFtstEZa^_-^1e&1@^6Kh=O zi}?(3*A0eGf;6VgP;jl&j7c{3AdtCJ>4c*x>OfE*fhK^@kW`HvcpXMUzzKKr>+xm? z^m15`N5=_zd6sFO275*mER2G`or56$ym5~>>bPqDbP8o+yNSmZ3aq?D!DE6}Xu>8& zjX=l;7)u;lq}E3dsSs~009wQIBdY+BTu@dfZXRGa%HiP9O8Irwrr833!Eh05XAVDBbO27mirF zJ(%o*gwsj3;#}h|{WSRT0~Vfl=8kappjyJ8M-fc61&0}NczLv!1VuNzN+t+I1aBq` z(z9MY&@&JX&yI0v{_!Ji1iA5AQabK;qhTmJ-!@wXSog=qP!S%{zMDIwbBu^9j5 zl(O%d?1uodoLQOT2GB#?)!|TSQ8%cspeU-uBh8qd?+T z%5ED0PrMs-#C@Xzua_lE{wGjg9>{X_JvAVCGIa=2V!#rOcT5~p3zF!DXJb~R!dsUA zk#q*_|0`lZ%DpIg5Dy{C)WT#8;ylaLcH(o265pqFTh9^6csf?ggNl)$SH(9bg~)&up%vOC`a9x~iR zQE;?#YA8MwJB#aY`)~gsA}Bx=2ra*ZCB!b2r3&U^k0U0SiSU3Rf7eNn9?nDZ+8waQ z@;n&3@JU1>3!k)`@f`mf2g6Or5WMWdD}@4UPqHq51=>S7`aY1P4nwYPWWkd`j`$Pk z1tU?=ijNrrN`onkTBYfKu^NU(7|7lkjDR1Ay?`b;lATQY&}0AJ3PQBu&j!RKFUY|h zch+>cwVmPU4O!n&CCS1Smpvjfg#+}leAC1}YI^lVNeKNI)vNgw@19!R4W~fmvYInu z$?_$dgZa(>W^6%e|wfl2drr%RCOV5;ewIIL5wO`@cE{CS)p6|*uqZx5d&cJ$w zpoM@c5ey!i{3Y&Ey6aC=n?X=O4Bm)|1Pblz#5kuugHvz5h_#D)$T?b>zFYGFvs092 zculv|M*{z1EPYS5K_CANBw#B4NIeT!LOv-mK9d;E|6Ib^IxZN+iimjkDlFC$L@l04=X0 zP!pp}zSzTOasm6C9GW9uC~k2o?#vzX`7acaRkIG2)u5NW_*iEfeKY*rE(X_SlY`-x z`$ygR_wR8HU^G z_`qLBJ!4QJ*>QqSaw%tri?B6?HbLby`3&?=J#F)>9t0vu6g{-D8EboOoq-5@aOQB(TNAf+>&R&8BX=ib(jgKn5@{n0%* zQ~JJdz)ho2r1kIJylCY&ICT~RpvV|PiwKS1PUu!H5AS-wK{93A0&AroY<++& zmal#b)`*k2%RT?kTC3$wkZr{u3=ZLV~lai(lJK%2960#G?$)q0E1+ZFssp>@iEB@M+Bv*XD1QH6w0sL zeDG(xyXQ@`O=;0Sbag9$V1fQVA)a*v*v2*9L3s_itue$D9P@5nKSXs+{QaHW`sbU% zYqQLXuQHK87j0qQD!)jO(p>^ z@Vujy3$6SM8lg3H+{hR|GjeE>JFJ$@4vBpRMP;o5!i}PO08BxhE9M*<8>|p1s+|Di zP|V^Vw~ri{pQN8dM8*Cn`@Xr%kgW^#u|kDTr^Z%nn$6L?Q$doVoDK0kGOO+iA8$P8 zO(~8Xki@%vYd*)$uxRXyoT2d=V`-v=1-C9(g{;k8uHBM&ywCe$)e8~DU_HeBqwvr^ z@p$fctiHSVcbFJVc*Jcl-16?Ze2VQ8&wH`UUz>&BqeZ1-`&E+fxH7Y+@33dV^!gqyZaDX8d2NumX(-6n;ij{Nx)7)dX1yV7c+rt6hvKo+;SnPI zH~vWb8{Xaz&+#U|IX$o4a>rcui zNq2$lI9=bD)+s+)jB}nA@ZY<5j$n{6%=PqX6B)62rs=Ts_2rKap+~9%4M{2k*)>8< z)a?^a7aDc&2i)a&HZ;Mq=c+^uZsRN6D|j2{VN1s&D^YuUkUeK_+G-!kW7*~>1EWJk z1N9rC?-+;%_8gvt2M(lY%(>QT?QBQJ-OL?r6XH(8;Fa(njh zBS-Kt39u?{T~kjNuf4l5oVNeA?`3RqL^@yKsm4r#JSb(??;o$jz50wwWsAzekd`1O`LPutCAV z;?cP0b4iHOk%I?RiEqU@!@l;8PI|MTiHci4N%MneqXq|K3{G$`?X-c=HjmSi`($_`47|UABi12yXjP?yU}+9 zP&!XrS+R5>)06NLH>KbGF(nki_?>X?HhNrQF zfDCoGYy5-r52g=bqgDR<5o4Jf8+C`Tl zFw7f4Rlbyghn+Im914R6zpuabtGwKozjA)!M^~EI#$rIX?j#3PPo8|vHz}T?G;&1T zZ6LBxKhRQ`B!gb||(+y%#vy6i;o4#i03bhBxC@}r)eEgg4| z13_-Od5bMm&Qg228MVqgRl7lrSN{832L8IIr;Ow-CSP|BzJL0zyH~h;5(6<0MkK|y z=m>OmE-MElEq>67W?gw_hYoR_#vFT(n*%Kg5 z3fNbcv5No8dryY4od}a!+%+qNsdqFiUb zNl#dhbGuqP_Yw0fIt1rn4?dli#p}+QtghurPYBi*lrB(*V7BL^4c>)cUBj+?Q2uEfY)t^P%H<&e{IzvC>KLgF@p6H2JqzDq72n(xh*Q&T z5XcrIg1!|J+Dnh_X1G*iWLX{4NNXBZCsT}rcsK8k4F}eF)O)fFbJpBT?5O2Z@k(6R zrY|G^wJ{O`SVK2&L0nlv07P}`e<>)E+T%OZe&{Ag^cRBW@)XT7KHVY4SZiDQ*+Z$| zp(|v3-y0P3cP<%VW7uw^68Wsqph5FTV+qch7b)bDw-Z zaz_DQ6Ygubjn7|KM};99L!nysO;5q?qNl5(rzK2=zKqZzf1E6*{OD? zIUafc{rm9NQLe_darGLrF?aLuB=8wMLPSd=<6b077S6D<+6z%JXJY5MbdWb+x}KCF z+w$12*>8fM_~QPG_oX(ULAy}mRnov_)RlXUl*_mn8BWa7BRm1Y^~g!Ao-~1y9$1F{ zCgpTCjo=@KW9Gfj6!vodh0hY)`(D&PsFOJ&aZikl(qZ0{P6S@asC!LnuDf<%?@3;e z;IROSE(8$A=szi?2e)h2HB0GhuSnB@wJb*#f0NDgvCM`3W1If`W+8FdfDD()?nl05 z!nQ)Ze_d}mmucine6tfxVUyy`qqtQ7QbCm>luZK;R|O^4lo~s@0vMR^4XS_wz@E8R zO`J00qvYDLck;h2H-2$7{C<5@Gi34v|@%OD}d_r2CJM4+`UTu(qRL1=oTbK}!D%i~k7-rQ_$j3qs`w4MPwYz%@3@wq`PuSzEFR^JHO zsOqjyrBcBs?+X8=s8%W~|5ur3TGOBkA5_9PN_9XJFavLL#%U1IroAF7;e21lRA|o+ z%Pmz;G8%TSS+sE9<)+&B0--XOUd65@9^A6a;0=;Ri;JoemQK@~`J%+kJTjo=Ec1L! z4DJ>*zdN+ee%YS=YvB7f&-ctCBjve$7Ze-()5H$mCoKhQSy-F{vUd$YBi>cOG~cxa zD6y+p=5ayNJz#MWOK|G&_dI5bbo8S# ztcQWn(3Darp6V^Kk!KzPdngayH{ewJ9N0VZzV{WdPeAj)E^l{7I|$4&^e2^E1TUe#t2D0G@klqc5!$60!EF8z@Bw;%|7X|ceL~VqbzRx$3P4GSZ{f9 z^PbxX1DXzZO|H%RS{?e>0!6Gi(Up_F>?w`!o=f_OvzdA^EZ`AuSaj`lT&;=XmbM9n zoy;&`y49-GVCwKWSdhjx!~i8a2ZA7n4YWejh7RYo%r{O$3Gk^7*%nh3lRME_<;TJ^mtJhR1MF0wjnrs=i+r44ecW{QjhcXStDp`c3An9Zp@d;f5EZ zhYBbifH^;#b>@rmZp&Adx!ZaAOJJ0a?bV`9iPAX_CW8Ch4)2@nD=PTl8URPS>WwJQ zeguhzDZAqPGO8&(m)6CyPEgT7eW)^Ul1WyIEAq{n3D77Mn%7|!24@Tw+;Ur;lWhtH zDeYs)afPZt((2aoXUAv1euRPWG#3Uhobw<`@V;H**N`xHa1KOEW!gxMvt=&>*fu()JMbwKWQ~T?m!9E~H&ouJ*tClMlnjDX4h^u)N7K7{exDjaM_| z&^@B^TOtS+Ze`n8z?8`=|MRH{v(c`tl3<$mZ_`dn0c$eOUCr3{pv z@GK}>LaU*Nmpgw>>2TXzxIUm2wMxKOEWdf{ByTHTWYl#zl%pzVKdfT5<(Ge)gh<}u zlboxp+%>%CS;X*H0boQ%@^&GY(iU+SbPQ)RsU)s@D;aW?NH z?$gprj?Y&1p~pPAR{PREv;qr^!EWbTxDT}T4z($Gj&<6crmo!mHa0Ko=mG>GedNSS zK$XK3g4@%!isUT?-j$Y-ZU`B?S|E^f-2Y>z_wiTNA(Q2z+`yVQ+hgM_aD6-2W52aU z$EBTYmaKWn9?)o4+M!U3*SZ}wBs&{Ah@;0%QdcLz0^9Dc4Ap%UAP66AFE9D!wJlkx zbQ4P9-MzS_c;%0D6lQJe?iAcvjlJL3K0h`qx(8}(&_&c3;CzV6&KM-=mTuUA5%~Q= zP(O+S$OHWs4sN0jLe7+BbeBpQcxPzzKx^ET>VZ9=$sYy?G`Ijx4P{8cdFfY6-+(=4 zTb@;W#+xof&I*M(*if+y5AMLi#|2#vvbtCXM zV*5Rf?NuwPt_<;S@p#R{;-W^^ZmJu$=%*N{oEE@%CXTHs>pVK8gzq^OO^=XZ@-5O& z(06B_mszA++jt%?%1&(4Glu35&?U9-B%>5NM^i%dngfF z9^9tmYlJNSGf6_=iQ(Vh4=6K z<~vB>*|8~kRECPa_-2B-r<;~0pvI#>1CP9YVW?PSn>yOajk|u`CP%cWaRI4_JH0#L zSf@kNX_%ydh=IL(Q)O&&r;ftluYXCpH z7`(!h7o(GqONT z@`)aJVM)w_ZvHEzF6;}JUi6FY&YmBYyfavuO8kw@bV14rY7ywt=Qf3Ib`Ro#QQI$9 z5B}u7aY9@+6YxpBawTLJXGUhVFM^L1zJt$#`gt37zDdMZ$&3ty;u%m^wx3q6f`U8U zJz5ara#id-HOs-!BrO5*#)ciyQQKpl>!d6+@&NK{@tkz-I1nZPr|r+!Nrv;Cov`E#>LvVM6~-?JzHLFTsqb3I-UZgWMhrz5;&qIvF0n;7NYgG4CF2CZ6aVKJoJ$Xxqp; ziEcZo_Y8llAAxTm?H;UDYLttAfQTrr;owvDv+e6zWHi@};;%4gp4{fp5uBMc5qmtj z*c-6}>Gjq4&}%lUq%ca8r66CR{a#}){CS6rhf(|nu#(&EmhD!YG`Jx)Tkt8o5>yG5 zCn~umwmI==dt_7>>nEJzD*SS-(n-1P_IG_*?+*q7sq|zT!8E*>A2Lk;k?j;Hl^_EO zf@z$CY(B2-`^BthVzWYmSVH=rt4G8I+x}($R}0WmszS#-NwCX`XrFnXaXWW(8zPbJ z`V6gya4T9O0`dfs-V*j3a3XvuuY)H+U?1Ho?K@zYC@>=tyH>gis}Q`0IjG=AtWC8nh6`;IyW|6a~Epa`W%5;d==_ZLSXH zJvsQIoB?IRmKd5<6~yvkVDQtMt`db{%DeGiVCPZ$UxNdk%L*b#(FL6$5`1$lY|-*k z&%>+;w`z05e10nYc7R*mqpE0DMbZpvpHTCv;KrXf6m zL;S}}@1hKM(;^WoNDK&eBlG|}d+f+k7-E|J&{tGV(~&NtUj^ zGTa5WvLZm_MF^?|y7q&Pz-8nYWxcOfh^!v|04+DdF=dxfd8>M2-(XdR5`6Z%q|H?d z@Jc`sUQ6Xvi@8(9i5T1+S404G2SM za!IN^x%tY<<4cjN`u|oYq*p*!K<7N{oswbkhR}z8BVt*ssYlyJ;=K;*;-dRw4m`4?EG585P;e8Iz2bOjTn8Q4E*}?Dlv*-j@Sf)SzK@2tY9dFRh z$8s7UYz_IWn4Ym%T4?8mZts^!5>lb^Xn!gKLHa1zrW)NS`R7rEyxi`r}p6-5dy* z+J%KTN9z6W8RO5A#})nxT)ZQ`whjcDE&PSs{*B@Eu08a>>($j&6R>-9d~xi2Fl7&T zmbeMOkF)k#6=Fzto@Nd)zLlnLZHfa|<`g>-w41&ieO^Fo@25fPCf4QIVnC!O``_aNvBoOj4xWgZ z@D^Fscxqm<=X?duoZ2A;w{wMX;2p}r8v-*Lh zB()-*tJ8XZzeMgCQ*%C#<(0Vk!5~^vgTpBqgNh2>;T_m;MOE@BNg}%y9B3fs?p<&3 zLDt}Zzwle{RR?&~lxXoLb0|C|u%^hPCqOs#yk5M}7Vk-a0G>Q0=y=$xMZO!vWALn3 z`&7<(@QaUUiwDp*|08)57GTG)<_0Z5-ot)2^ON2XTqPg4LV==^JpHVZF;^}tCi1m` zdn;9PT{TlRIYyCzD)@IQ$Q|j#tvp!_{vP<#2QudF`bD~F^{=egx&5g@&<`Il4PW2L zQ}8P^NgXAJ6Sccp;)~l^2(Nb`dV8Ncxp8yUc;QR@NcdDYy@K?lwu-ior?|#PicWF# z@^ban6ONwG{$VrKp_`pjSa>N!GmtgB7%k}T5ME?^t&+g;md@`p=OIExh0=HC{nF51 z1DhVoQ>tL#W3dLWFQRhOs(xM{h;ZV2?NWcLE3PlIqV{fXyvgjNT7CHladDT;fwI5r z7y=NvEl)PL>)cm*0WY7fc)vk34^j&AsqCDPfzNN-yR^9>9W#~pG8b_K-o9E zot6|muGX#={;EDM^l<=VPI}Zcj1sX4K#9j-@#|z|)eHj3h_POXi8Xb-d!AzY9!5P9 zcXXgrZuS{BTua7Pml)1}pLj?QevI7gd80#H!94HMN4p%*e-D)dkK`H<#oHO8^59P2 zsJPBOC%?UFC!+3~*i={EqsgJ!Su=RZ+CXEk~()YMgWfXs?Br;lF>2;K+ zhBH}e)19l;2~w$QGo|NV*>$CEkf)@b&g0*LHy%BbCJ3>5J2_54u&2Tl0kC`S92)r4 zXnMrlD;%3|1hadducdi^qoe8`ri@y!Kc_~bbs{(wo7{{nC0j0lrG}F?oOyshV81OMbfvw zKnfnir+b2gr#venp^tuyap<3>OgoNNz&;$aZi)w6=L67*1|WCmX9qtOdM2zOAhHSq zpoD3K_4Dmo{l8zN(;0?WgTiC*ETmA{-{$d3oaSD+7WFl|saEYu;&2M0HVW%fnpdfj zMQ5w;XIiHDPq7e>Sv1ZJy(SzsiJ>oL3>GnJ=$sUUekF?3ygy_ z#yPz#dIs-mO`;?V?>{VIW^M;pq5GXKo2!_e$b54jeS3XH^Y9#Dh&CLx-%-^SJvP;h z2%%^S0#?BInTI_7UcSIjqVp>zv?U3Cb|+MT_l6Z@%zE*^)}At-0cITz+K);f3)dJK zO|cs|K2>vahrj0b253JY_saIlCBT>&YN_VLucTP?YdJ}BxHtaQO29GUp8?s3Ms zeA}-8z1U6LB+0Tl_UMrBaD~(ZOCC=?V(OeQrHHlqAQ8|RklrKCc?|BJXav7R-=nV# zseXF_Glb*mah9*0IBK;NchuLE5B}s||AhMxgG>v1xJG&^q}0UnI7_3VkLShrwr#}e*HA=k`Zs*$f21e2P9Bb%l+BkK^911e}D*bUxNyr