From ab122a7bc8fe56ef139235d71c526906b55bcee0 Mon Sep 17 00:00:00 2001 From: genxium Date: Sun, 8 Jan 2023 20:34:29 +0800 Subject: [PATCH 1/2] Drafted new character as NPC. --- battle_srv/models/pb_type_convert.go | 136 +- battle_srv/protos/room_downsync_frame.pb.go | 408 +- dnmshared/go.mod | 2 + frontend/assets/plugin_scripts/jsexport.js | 6389 ++++++++++++++++- frontend/assets/resources/animation/Monk.meta | 7 + .../assets/resources/animation/Monk/Atk1.anim | 61 + .../resources/animation/Monk/Atk1.anim.meta | 5 + .../assets/resources/animation/Monk/Atk2.anim | 103 + .../resources/animation/Monk/Atk2.anim.meta | 5 + .../assets/resources/animation/Monk/Atk3.anim | 103 + .../resources/animation/Monk/Atk3.anim.meta | 5 + .../assets/resources/animation/Monk/Atk4.anim | 115 + .../resources/animation/Monk/Atk4.anim.meta | 5 + .../resources/animation/Monk/Atked1.anim | 31 + .../resources/animation/Monk/Atked1.anim.meta | 5 + .../resources/animation/Monk/BlownUp1.anim | 133 + .../animation/Monk/BlownUp1.anim.meta | 5 + .../resources/animation/Monk/GetUp1.anim | 91 + .../resources/animation/Monk/GetUp1.anim.meta | 5 + .../resources/animation/Monk/Idle1.anim | 67 + .../resources/animation/Monk/Idle1.anim.meta | 5 + .../resources/animation/Monk/InAirAtk1.anim | 79 + .../animation/Monk/InAirAtk1.anim.meta | 5 + .../resources/animation/Monk/InAirAtked1.anim | 49 + .../animation/Monk/InAirAtked1.anim.meta | 5 + .../animation/Monk/InAirIdle1ByJump.anim | 91 + .../animation/Monk/InAirIdle1ByJump.anim.meta | 5 + .../animation/Monk/InAirIdle1NoJump.anim | 31 + .../animation/Monk/InAirIdle1NoJump.anim.meta | 5 + .../resources/animation/Monk/LayDown1.anim | 97 + .../animation/Monk/LayDown1.anim.meta | 5 + .../resources/animation/Monk/Monk.plist | 2201 ++++++ .../resources/animation/Monk/Monk.plist.meta | 3202 +++++++++ .../assets/resources/animation/Monk/Monk.png | Bin 0 -> 221902 bytes .../resources/animation/Monk/Monk.png.meta | 12 + .../resources/animation/Monk/Walking.anim | 85 + .../animation/Monk/Walking.anim.meta | 5 + frontend/assets/resources/map/dungeon/map.tmx | 43 +- .../pbfiles/room_downsync_frame.proto | 3 + .../prefabs/ControlledCharacter.prefab | 388 +- .../resources/prefabs/NpcCharacter.prefab | 597 ++ .../prefabs/NpcCharacter.prefab.meta | 8 + frontend/assets/scenes/offline_map.fire | 2 +- frontend/assets/scripts/AttackingCharacter.js | 1 + frontend/assets/scripts/OfflineMap.js | 2 +- .../scripts/TileCollisionManagerSingleton.js | 58 +- ...om_downsync_frame_proto_bundle.forcemsg.js | 46 + jsexport/battle/battle.go | 1 + jsexport/battle/characterConfig.go | 186 + jsexport/battle/room_downsync_frame.go | 12 + jsexport/main.go | 58 +- 51 files changed, 14453 insertions(+), 515 deletions(-) create mode 100644 frontend/assets/resources/animation/Monk.meta create mode 100644 frontend/assets/resources/animation/Monk/Atk1.anim create mode 100644 frontend/assets/resources/animation/Monk/Atk1.anim.meta create mode 100644 frontend/assets/resources/animation/Monk/Atk2.anim create mode 100644 frontend/assets/resources/animation/Monk/Atk2.anim.meta create mode 100644 frontend/assets/resources/animation/Monk/Atk3.anim create mode 100644 frontend/assets/resources/animation/Monk/Atk3.anim.meta create mode 100644 frontend/assets/resources/animation/Monk/Atk4.anim create mode 100644 frontend/assets/resources/animation/Monk/Atk4.anim.meta create mode 100644 frontend/assets/resources/animation/Monk/Atked1.anim create mode 100644 frontend/assets/resources/animation/Monk/Atked1.anim.meta create mode 100644 frontend/assets/resources/animation/Monk/BlownUp1.anim create mode 100644 frontend/assets/resources/animation/Monk/BlownUp1.anim.meta create mode 100644 frontend/assets/resources/animation/Monk/GetUp1.anim create mode 100644 frontend/assets/resources/animation/Monk/GetUp1.anim.meta create mode 100644 frontend/assets/resources/animation/Monk/Idle1.anim create mode 100644 frontend/assets/resources/animation/Monk/Idle1.anim.meta create mode 100644 frontend/assets/resources/animation/Monk/InAirAtk1.anim create mode 100644 frontend/assets/resources/animation/Monk/InAirAtk1.anim.meta create mode 100644 frontend/assets/resources/animation/Monk/InAirAtked1.anim create mode 100644 frontend/assets/resources/animation/Monk/InAirAtked1.anim.meta create mode 100644 frontend/assets/resources/animation/Monk/InAirIdle1ByJump.anim create mode 100644 frontend/assets/resources/animation/Monk/InAirIdle1ByJump.anim.meta create mode 100644 frontend/assets/resources/animation/Monk/InAirIdle1NoJump.anim create mode 100644 frontend/assets/resources/animation/Monk/InAirIdle1NoJump.anim.meta create mode 100644 frontend/assets/resources/animation/Monk/LayDown1.anim create mode 100644 frontend/assets/resources/animation/Monk/LayDown1.anim.meta create mode 100644 frontend/assets/resources/animation/Monk/Monk.plist create mode 100644 frontend/assets/resources/animation/Monk/Monk.plist.meta create mode 100644 frontend/assets/resources/animation/Monk/Monk.png create mode 100644 frontend/assets/resources/animation/Monk/Monk.png.meta create mode 100644 frontend/assets/resources/animation/Monk/Walking.anim create mode 100644 frontend/assets/resources/animation/Monk/Walking.anim.meta create mode 100644 frontend/assets/resources/prefabs/NpcCharacter.prefab create mode 100644 frontend/assets/resources/prefabs/NpcCharacter.prefab.meta diff --git a/battle_srv/models/pb_type_convert.go b/battle_srv/models/pb_type_convert.go index f005607..81bba92 100644 --- a/battle_srv/models/pb_type_convert.go +++ b/battle_srv/models/pb_type_convert.go @@ -20,28 +20,30 @@ 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, - FramesInvinsible: last.FramesInvinsible, - Speed: last.Speed, - BattleState: last.BattleState, - CharacterState: last.CharacterState, - InAir: last.InAir, - JoinIndex: last.JoinIndex, - Hp: last.Hp, - MaxHp: last.MaxHp, - ColliderRadius: last.ColliderRadius, - Score: last.Score, - Removed: last.Removed, + Id: last.Id, + VirtualGridX: last.VirtualGridX, + VirtualGridY: last.VirtualGridY, + DirX: last.DirX, + DirY: last.DirY, + VelX: last.VelX, + VelY: last.VelY, + FramesToRecover: last.FramesToRecover, + FramesInChState: last.FramesInChState, + ActiveSkillId: last.ActiveSkillId, + ActiveSkillHit: last.ActiveSkillHit, + FramesInvinsible: last.FramesInvinsible, + Speed: last.Speed, + BattleState: last.BattleState, + CharacterState: last.CharacterState, + InAir: last.InAir, + JoinIndex: last.JoinIndex, + BulletTeamId: last.BulletTeamId, + ChCollisionTeamId: last.ChCollisionTeamId, + Hp: last.Hp, + MaxHp: last.MaxHp, + ColliderRadius: last.ColliderRadius, + Score: last.Score, + Removed: last.Removed, } ret.PlayersArr[i] = pbPlayer } @@ -71,6 +73,8 @@ func toPbRoomDownsyncFrame(rdf *battle.RoomDownsyncFrame) *pb.RoomDownsyncFrame HitboxSizeY: last.HitboxSizeY, BlowUp: last.BlowUp, + + TeamId: last.TeamId, } ret.MeleeBullets[i] = pbBullet } @@ -86,26 +90,28 @@ 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, - FramesInvinsible: last.FramesInvinsible, - Speed: last.Speed, - BattleState: last.BattleState, - CharacterState: last.CharacterState, - InAir: last.InAir, - JoinIndex: last.JoinIndex, - ColliderRadius: last.ColliderRadius, - Score: last.Score, - Removed: last.Removed, + Id: last.Id, + VirtualGridX: last.VirtualGridX, + VirtualGridY: last.VirtualGridY, + DirX: last.DirX, + DirY: last.DirY, + VelX: last.VelX, + VelY: last.VelY, + FramesToRecover: last.FramesToRecover, + FramesInChState: last.FramesInChState, + ActiveSkillId: last.ActiveSkillId, + ActiveSkillHit: last.ActiveSkillHit, + FramesInvinsible: last.FramesInvinsible, + Speed: last.Speed, + BattleState: last.BattleState, + CharacterState: last.CharacterState, + InAir: last.InAir, + JoinIndex: last.JoinIndex, + BulletTeamId: last.BulletTeamId, + ChCollisionTeamId: last.ChCollisionTeamId, + ColliderRadius: last.ColliderRadius, + Score: last.Score, + Removed: last.Removed, } if withMetaInfo { pbPlayer.Name = last.Name @@ -126,28 +132,30 @@ 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, - FramesInvinsible: last.FramesInvinsible, - Speed: last.Speed, - BattleState: last.BattleState, - CharacterState: last.CharacterState, - JoinIndex: last.JoinIndex, - Hp: last.Hp, - MaxHp: last.MaxHp, - ColliderRadius: last.ColliderRadius, - InAir: last.InAir, - Score: last.Score, - Removed: last.Removed, + Id: last.Id, + VirtualGridX: last.VirtualGridX, + VirtualGridY: last.VirtualGridY, + DirX: last.DirX, + DirY: last.DirY, + VelX: last.VelX, + VelY: last.VelY, + FramesToRecover: last.FramesToRecover, + FramesInChState: last.FramesInChState, + ActiveSkillId: last.ActiveSkillId, + ActiveSkillHit: last.ActiveSkillHit, + FramesInvinsible: last.FramesInvinsible, + Speed: last.Speed, + BattleState: last.BattleState, + CharacterState: last.CharacterState, + JoinIndex: last.JoinIndex, + BulletTeamId: last.BulletTeamId, + ChCollisionTeamId: last.ChCollisionTeamId, + 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 083e557..ad70637 100644 --- a/battle_srv/protos/room_downsync_frame.pb.go +++ b/battle_srv/protos/room_downsync_frame.pb.go @@ -49,6 +49,8 @@ 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"` + BulletTeamId int32 `protobuf:"varint,24,opt,name=bulletTeamId,proto3" json:"bulletTeamId,omitempty"` + ChCollisionTeamId int32 `protobuf:"varint,25,opt,name=chCollisionTeamId,proto3" json:"chCollisionTeamId,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"` @@ -247,6 +249,20 @@ func (x *PlayerDownsync) GetFramesInvinsible() int32 { return 0 } +func (x *PlayerDownsync) GetBulletTeamId() int32 { + if x != nil { + return x.BulletTeamId + } + return 0 +} + +func (x *PlayerDownsync) GetChCollisionTeamId() int32 { + if x != nil { + return x.ChCollisionTeamId + } + return 0 +} + func (x *PlayerDownsync) GetName() string { if x != nil { return x.Name @@ -1201,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, 0x97, 0x06, 0x0a, 0x0e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x44, 0x6f, + 0x6f, 0x74, 0x6f, 0x22, 0xe9, 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, @@ -1245,199 +1261,205 @@ 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, 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, + 0x65, 0x73, 0x49, 0x6e, 0x76, 0x69, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, + 0x62, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x18, 0x18, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0c, 0x62, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x64, + 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x68, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x54, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x18, 0x19, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x63, 0x68, 0x43, + 0x6f, 0x6c, 0x6c, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x64, 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, - 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, + 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/dnmshared/go.mod b/dnmshared/go.mod index dac3d35..ab87fc2 100644 --- a/dnmshared/go.mod +++ b/dnmshared/go.mod @@ -4,8 +4,10 @@ go 1.18 require ( resolv v0.0.0 + jsexport v0.0.0 ) replace ( resolv => ../resolv_tailored + jsexport => ../jsexport ) diff --git a/frontend/assets/plugin_scripts/jsexport.js b/frontend/assets/plugin_scripts/jsexport.js index 8b7380f..1e4416e 100644 --- a/frontend/assets/plugin_scripts/jsexport.js +++ b/frontend/assets/plugin_scripts/jsexport.js @@ -2,15 +2,6388 @@ (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,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;})(); +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, NpcPatrolCue, 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_, BulletTeamId_, ChCollisionTeamId_) { + 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.BulletTeamId = 0; + this.ChCollisionTeamId = 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.BulletTeamId = BulletTeamId_; + this.ChCollisionTeamId = ChCollisionTeamId_; + }); + 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_, CancelTransit_, TeamId_) { + 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; + this.TeamId = 0; + 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_; + this.TeamId = TeamId_; + }); + 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, 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, false, false, 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_; + }); + 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_; + }); + NpcPatrolCue = $pkg.NpcPatrolCue = $newType(0, $kindStruct, "battle.NpcPatrolCue", true, "jsexport/battle", true, function(FlAct_, FrAct_, X_, Y_) { + this.$val = this; + if (arguments.length === 0) { + this.FlAct = new $Uint64(0, 0); + this.FrAct = new $Uint64(0, 0); + this.X = 0; + this.Y = 0; + return; + } + this.FlAct = FlAct_; + this.FrAct = FrAct_; + this.X = X_; + this.Y = Y_; + }); + 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, _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, _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$12, _tuple$13, _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, existent$3, existent$4, 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, 0, 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; + } + _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); + } + if (!((-1 === v.Bullet.SelfLockVelY))) { + hasLockVel = true; + thatPlayerInNextFrame.VelY = v.Bullet.SelfLockVelY; + } + 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.VelY = 0; + thatPlayerInNextFrame$2.VelX = 0; + _tuple$7 = (_entry$1 = nonAttackingSet[$Int32.keyFor(thatPlayerInNextFrame$2.CharacterState)], _entry$1 !== undefined ? [_entry$1.v, true] : [false, false]); + existent$1 = _tuple$7[1]; + if (existent$1) { + 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$8 = VirtualGridToWorldPos(halfColliderWidthDiff, halfColliderHeightDiff); + halfColliderWorldHeightDiff = _tuple$8[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; + } + } + } else { + _tuple$9 = (_entry$2 = nonAttackingSet[$Int32.keyFor(thatPlayerInNextFrame$2.CharacterState)], _entry$2 !== undefined ? [_entry$2.v, true] : [false, false]); + existent$2 = _tuple$9[1]; + if (existent$2) { + 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$10 = (_entry$3 = invinsibleSet[$Int32.keyFor(t.CharacterState)], _entry$3 !== undefined ? [_entry$3.v, true] : [false, false]); + existent$3 = _tuple$10[1]; + if (existent$3) { + _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$11 = _r$5; + overlapped$1 = _tuple$11[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$12 = 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$12[0]; + thatPlayerInNextFrame$3.VirtualGridY = _tuple$12[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$13 = (_entry$4 = nonAttackingSet[$Int32.keyFor(thatPlayerInNextFrame$3.CharacterState)], _entry$4 !== undefined ? [_entry$4.v, true] : [false, false]); + existent$4 = _tuple$13[1]; + if (existent$4) { + 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, _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, _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$12, _tuple$13, _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, existent$3, existent$4, 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: "BulletTeamId", name: "BulletTeamId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "ChCollisionTeamId", name: "ChCollisionTeamId", 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: ""}, {prop: "TeamId", name: "TeamId", 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: ""}]); + 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: ""}]); + NpcPatrolCue.init("", [{prop: "FlAct", name: "FlAct", embedded: false, exported: true, typ: $Uint64, tag: ""}, {prop: "FrAct", name: "FrAct", embedded: false, exported: true, typ: $Uint64, tag: ""}, {prop: "X", name: "X", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "Y", name: "Y", embedded: false, exported: true, typ: $Float64, tag: ""}]); + RingBuffer.init("", [{prop: "Ed", name: "Ed", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "St", name: "St", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "EdFrameId", name: "EdFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "StFrameId", name: "StFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "N", name: "N", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Cnt", name: "Cnt", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Eles", name: "Eles", embedded: false, exported: true, typ: sliceType$2, tag: ""}]); + SkillMapperType.init([$Int, ptrType$5], [$Int], false); + CharacterConfig.init("", [{prop: "SpeciesId", name: "SpeciesId", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "SpeciesName", name: "SpeciesName", embedded: false, exported: true, typ: $String, tag: ""}, {prop: "InAirIdleFrameIdxTurningPoint", name: "InAirIdleFrameIdxTurningPoint", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "InAirIdleFrameIdxTurnedCycle", name: "InAirIdleFrameIdxTurnedCycle", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "LayDownFrames", name: "LayDownFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "LayDownFramesToRecover", name: "LayDownFramesToRecover", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "GetUpInvinsibleFrames", name: "GetUpInvinsibleFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "GetUpFramesToRecover", name: "GetUpFramesToRecover", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Speed", name: "Speed", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "JumpingInitVelY", name: "JumpingInitVelY", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "SkillMapper", name: "SkillMapper", embedded: false, exported: true, typ: SkillMapperType, tag: ""}]); + 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, 1200, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 2 }]), 0))])) }, { k: 2, v: new Skill.ptr(0, 36, 36, 36, 1, 11, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 18, 22, 36, 18, 18, 9, 50, 0, 5, 10, -1, 1800, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 3 }]), 0))])) }, { k: 3, v: new Skill.ptr(0, 50, 50, 50, 1, 12, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 15, 0, 0, 30, 999999999, 9, 200, 700, 10, 50, 500, 3200, 0, 4800, 3200, true, false, 0))])) }, { k: 4, v: new Skill.ptr(0, 30, 30, 30, 1, 2, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 7, 13, 30, 22, 13, 9, 50, 0, 5, 5, -1, 1200, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 5 }]), 0))])) }, { k: 5, v: new Skill.ptr(0, 36, 36, 36, 1, 11, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 18, 22, 36, 18, 18, 9, 50, 0, 5, 10, -1, 1800, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 6 }]), 0))])) }, { k: 6, v: new Skill.ptr(0, 45, 45, 45, 1, 12, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 15, 0, 0, 28, 999999999, 9, 200, 700, 10, -10, -1, 2400, 0, 3200, 3200, true, false, 0))])) }, { k: 7, v: new Skill.ptr(0, 30, 30, 30, 1, 2, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 7, 13, 30, 22, 13, 9, 50, 0, 5, 5, -1, 1200, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 2 }]), 0))])) }, { k: 8, 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, 1800, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 3 }]), 0))])) }, { k: 9, v: new Skill.ptr(0, 50, 50, 50, 1, 12, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 15, 0, 0, 30, 999999999, 9, 200, 700, 10, 50, 500, 3200, 0, 4800, 3200, false, false, 0))])) }, { k: 10, v: new Skill.ptr(0, 40, 40, 40, 1, 13, new sliceType$2([new FireballBullet.ptr(0, 0, 0, 0, 0, 0, 800, new Bullet.ptr(0, 0, 15, 0, 0, 30, 15, 9, 200, 700, 20, 50, 500, 3200, 0, 4800, 3200, false, false, 0))])) }, { k: 255, v: new Skill.ptr(0, 30, 30, 30, 1, 6, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 3, 0, 0, 20, 18, 9, 50, 0, 5, -1, -1, 1200, 0, 3200, 2400, false, false, 0))])) }, { k: 256, v: new Skill.ptr(0, 20, 20, 20, 1, 6, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 3, 0, 0, 10, 15, 9, 50, 0, 5, -1, -1, 1200, 0, 3200, 2400, false, false, 0))])) }, { k: 257, v: new Skill.ptr(0, 30, 30, 30, 1, 6, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 3, 0, 0, 20, 18, 9, 50, 0, 5, -1, -1, 1200, 0, 3200, 2400, false, false, 0))])) }]); + $pkg.Characters = $makeMap($Int.keyFor, [{ k: 0, v: new CharacterConfig.ptr(0, "MonkGirl", 11, 1, 16, 16, 10, 27, 120, 800, (function(patternId, currPlayerDownsync) { + 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; + })) }, { k: 4196, v: new CharacterConfig.ptr(4196, "Monk", 42, 2, 14, 14, 8, 30, 100, 900, (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 257; + } else { + return 10; + } + } 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, funcType$11, ptrType$7, funcType$12, funcType$13, funcType$14, funcType$15, sliceType$6, funcType$16, ptrType$8, ptrType$9, ptrType$10, mapType, sliceType$7, funcType$17, funcType$18, funcType$19, mapType$1, NewInputFrameDownsync, NewRingBufferJs, NewCollisionSpaceJs, NewVec2DJs, NewPolygon2DJs, NewBarrierJs, NewPlayerDownsyncJs, NewMeleeBulletJs, NewNpcPatrolCue, 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, $Bool, $Int32, $Int32], [ptrType$5], false); + funcType$4 = $funcType([$Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Bool, $Int32], [ptrType$5], false); + funcType$5 = $funcType([$Uint64, $Uint64, $Float64, $Float64], [ptrType$5], false); + funcType$6 = $funcType([$Int32, sliceType$2, sliceType$3], [ptrType$5], false); + funcType$7 = $funcType([$Int, $Int, $Int, $Int], [ptrType$5], false); + funcType$8 = $funcType([$Int32, sliceType, $Uint64], [ptrType$5], false); + funcType$9 = $funcType([$Int32], [ptrType$5], false); + funcType$10 = $funcType([$Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $emptyInterface, $String], [ptrType$5], false); + funcType$11 = $funcType([ptrType$1, $Float64, $Float64, $emptyInterface, $String], [ptrType$5], false); + ptrType$7 = $ptrType(resolv.Space); + funcType$12 = $funcType([ptrType$7], [sliceType$5], false); + funcType$13 = $funcType([$Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64], [$Float64, $Float64], false); + funcType$14 = $funcType([$Float64, $Float64], [$Int32, $Int32], false); + funcType$15 = $funcType([$Int32, $Int32], [$Float64, $Float64], false); + sliceType$6 = $sliceType($Int); + funcType$16 = $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$17 = $funcType([ptrType$8, ptrType$9, ptrType$7, mapType, $Float64, $Float64, sliceType$7], [ptrType$5], false); + funcType$18 = $funcType([$Int32], [$Int32], false); + funcType$19 = $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, speed, battleState, characterState, joinIndex, hp, maxHp, colliderRadius, inAir, bulletTeamId, chCollisionTeamId) { + var activeSkillHit, activeSkillId, battleState, bulletTeamId, chCollisionTeamId, characterState, colliderRadius, dirX, dirY, framesInChState, framesInvinsible, framesToRecover, hp, id, inAir, joinIndex, maxHp, speed, velX, velY, virtualGridX, virtualGridY; + return js.MakeWrapper(new battle.PlayerDownsync.ptr(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, speed, battleState, joinIndex, colliderRadius, false, 0, 0, framesToRecover, framesInChState, hp, maxHp, characterState, inAir, activeSkillId, activeSkillHit, framesInvinsible, bulletTeamId, chCollisionTeamId)); + }; + $pkg.NewPlayerDownsyncJs = NewPlayerDownsyncJs; + NewMeleeBulletJs = function(originatedRenderFrameId, offenderJoinIndex, startupFrames, cancellableStFrame, cancellableEdFrame, activeFrames, hitStunFrames, blockStunFrames, pushbackVelX, pushbackVelY, damage, selfLockVelX, selfLockVelY, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY, blowUp, teamId) { + var activeFrames, blockStunFrames, blowUp, cancellableEdFrame, cancellableStFrame, damage, hitStunFrames, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY, offenderJoinIndex, originatedRenderFrameId, pushbackVelX, pushbackVelY, selfLockVelX, selfLockVelY, startupFrames, teamId; + 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, teamId))); + }; + $pkg.NewMeleeBulletJs = NewMeleeBulletJs; + NewNpcPatrolCue = function(flAct, frAct, x, y) { + var {$24r, _r, flAct, frAct, x, y, $s, $r, $c} = $restore(this, {flAct, frAct, x, y}); + /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: + _r = js.MakeFullWrapper(new battle.NpcPatrolCue.ptr(flAct, frAct, 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: NewNpcPatrolCue, $c: true, $r, $24r, _r, flAct, frAct, x, y, $s};return $f; + }; + $pkg.NewNpcPatrolCue = NewNpcPatrolCue; + 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: "NewNpcPatrolCue", v: new funcType$5(NewNpcPatrolCue) }, { k: "NewRoomDownsyncFrameJs", v: new funcType$6(NewRoomDownsyncFrameJs) }, { k: "NewCollisionSpaceJs", v: new funcType$7(NewCollisionSpaceJs) }, { k: "NewInputFrameDownsync", v: new funcType$8(NewInputFrameDownsync) }, { k: "NewRingBufferJs", v: new funcType$9(NewRingBufferJs) }, { k: "GenerateRectColliderJs", v: new funcType$10(GenerateRectColliderJs) }, { k: "GenerateConvexPolygonColliderJs", v: new funcType$11(GenerateConvexPolygonColliderJs) }, { k: "GetCollisionSpaceObjsJs", v: new funcType$12(GetCollisionSpaceObjsJs) }, { k: "WorldToPolygonColliderBLPos", v: new funcType$13(battle.WorldToPolygonColliderBLPos) }, { k: "PolygonColliderBLToWorldPos", v: new funcType$13(battle.PolygonColliderBLToWorldPos) }, { k: "WorldToVirtualGridPos", v: new funcType$14(battle.WorldToVirtualGridPos) }, { k: "VirtualGridToWorldPos", v: new funcType$15(battle.VirtualGridToWorldPos) }, { k: "GetCharacterConfigsOrderedByJoinIndex", v: new funcType$16(GetCharacterConfigsOrderedByJoinIndex) }, { k: "ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs", v: new funcType$17(ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs) }, { k: "ConvertToDelayedInputFrameId", v: new funcType$18(battle.ConvertToDelayedInputFrameId) }, { k: "ConvertToNoDelayInputFrameId", v: new funcType$18(battle.ConvertToNoDelayInputFrameId) }, { k: "ConvertToFirstUsedRenderFrameId", v: new funcType$18(battle.ConvertToFirstUsedRenderFrameId) }, { k: "ConvertToLastUsedRenderFrameId", v: new funcType$18(battle.ConvertToLastUsedRenderFrameId) }, { k: "ShouldGenerateInputFrameUpsync", v: new funcType$19(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; +})(); $synthesizeMethods(); $initAllLinknames(); var $mainPkg = $packages["jsexport"]; diff --git a/frontend/assets/resources/animation/Monk.meta b/frontend/assets/resources/animation/Monk.meta new file mode 100644 index 0000000..bb6da70 --- /dev/null +++ b/frontend/assets/resources/animation/Monk.meta @@ -0,0 +1,7 @@ +{ + "ver": "1.0.1", + "uuid": "e0e9bbc6-e22a-4277-b674-1308432d9734", + "isSubpackage": false, + "subpackageName": "", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/Monk/Atk1.anim b/frontend/assets/resources/animation/Monk/Atk1.anim new file mode 100644 index 0000000..6953d60 --- /dev/null +++ b/frontend/assets/resources/animation/Monk/Atk1.anim @@ -0,0 +1,61 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "Atk1", + "_objFlags": 0, + "_native": "", + "_duration": 0.5, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "c7107ebe-c5c1-4ba6-8ef4-6eb768f7faf9" + } + }, + { + "frame": 0.06666666666666667, + "value": { + "__uuid__": "e0e20918-ff59-43bc-aeaf-035087934092" + } + }, + { + "frame": 0.2, + "value": { + "__uuid__": "5896a135-36da-4fa9-9257-a9042ba4b546" + } + }, + { + "frame": 0.26666666666666666, + "value": { + "__uuid__": "4a16667a-f3b3-405c-8565-d65a4281cfc8" + } + }, + { + "frame": 0.35, + "value": { + "__uuid__": "5ad9858c-52aa-4742-be68-d680210e0d0a" + } + }, + { + "frame": 0.43333333333333335, + "value": { + "__uuid__": "e54dbc94-3eeb-450a-9206-655e960771d2" + } + }, + { + "frame": 0.48333333333333334, + "value": { + "__uuid__": "f79260b7-7702-4f15-8f12-eb19f018aff1" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/Monk/Atk1.anim.meta b/frontend/assets/resources/animation/Monk/Atk1.anim.meta new file mode 100644 index 0000000..6a1be76 --- /dev/null +++ b/frontend/assets/resources/animation/Monk/Atk1.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "d044ab74-be6a-49a2-85ab-eba41922c2cd", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/Monk/Atk2.anim b/frontend/assets/resources/animation/Monk/Atk2.anim new file mode 100644 index 0000000..6b67043 --- /dev/null +++ b/frontend/assets/resources/animation/Monk/Atk2.anim @@ -0,0 +1,103 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "Atk2", + "_objFlags": 0, + "_native": "", + "_duration": 0.6166666666666667, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "549e581f-5121-4cbb-96e9-b3b8b5b0f227" + } + }, + { + "frame": 0.06666666666666667, + "value": { + "__uuid__": "0355243d-755f-497b-b1ff-4ec105f4efe7" + } + }, + { + "frame": 0.11666666666666667, + "value": { + "__uuid__": "22386328-484b-441e-9675-6553ede6118c" + } + }, + { + "frame": 0.15, + "value": { + "__uuid__": "1ed0eb22-5a20-405f-a15e-8a66348bd025" + } + }, + { + "frame": 0.18333333333333332, + "value": { + "__uuid__": "6e12225f-2300-4e0e-bcf6-00049bfbc48f" + } + }, + { + "frame": 0.21666666666666667, + "value": { + "__uuid__": "08e1ec2a-500f-4a16-a19d-383de218cc14" + } + }, + { + "frame": 0.25, + "value": { + "__uuid__": "024b3ae9-7d24-4057-83d7-4b58f8651ce0" + } + }, + { + "frame": 0.3, + "value": { + "__uuid__": "57f241ae-ce40-49ed-bf63-71d016e41e2f" + } + }, + { + "frame": 0.35, + "value": { + "__uuid__": "d2685f61-3365-4c14-9fb1-d7b2311871c4" + } + }, + { + "frame": 0.4, + "value": { + "__uuid__": "59587d34-25af-42bd-ba0c-747c5f5fa697" + } + }, + { + "frame": 0.45, + "value": { + "__uuid__": "3bceacb5-309a-41e0-bdad-26e85bcf859a" + } + }, + { + "frame": 0.5, + "value": { + "__uuid__": "57f6da9e-f131-4fab-9a3d-f2e894d203aa" + } + }, + { + "frame": 0.55, + "value": { + "__uuid__": "c35454f3-535b-4aec-b408-b8174a74556a" + } + }, + { + "frame": 0.6, + "value": { + "__uuid__": "24f5b898-42dc-4f67-b6fc-946cdb5e369f" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/Monk/Atk2.anim.meta b/frontend/assets/resources/animation/Monk/Atk2.anim.meta new file mode 100644 index 0000000..e233128 --- /dev/null +++ b/frontend/assets/resources/animation/Monk/Atk2.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "2cab337d-df23-476d-8a98-b5f115a52d04", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/Monk/Atk3.anim b/frontend/assets/resources/animation/Monk/Atk3.anim new file mode 100644 index 0000000..2d3e973 --- /dev/null +++ b/frontend/assets/resources/animation/Monk/Atk3.anim @@ -0,0 +1,103 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "Atk3", + "_objFlags": 0, + "_native": "", + "_duration": 0.6333333333333333, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "318745eb-06b1-4e7f-88d1-e23e02d99e67" + } + }, + { + "frame": 0.06666666666666667, + "value": { + "__uuid__": "a64b6f59-fa72-4f5d-89dc-81a469244ea5" + } + }, + { + "frame": 0.11666666666666667, + "value": { + "__uuid__": "f800d4a1-2396-4aa5-a578-11481db1d8bf" + } + }, + { + "frame": 0.16666666666666666, + "value": { + "__uuid__": "d97f6a5f-8e63-40d7-bd14-9dc71e15e5db" + } + }, + { + "frame": 0.23333333333333334, + "value": { + "__uuid__": "196bcbf9-e89f-4b26-b736-73e2fa787e50" + } + }, + { + "frame": 0.3, + "value": { + "__uuid__": "3229e023-e63d-4a4e-af72-2b1409ea43c5" + } + }, + { + "frame": 0.36666666666666664, + "value": { + "__uuid__": "e2d6e8b8-b468-4edb-b8c3-860bd85ebeae" + } + }, + { + "frame": 0.4166666666666667, + "value": { + "__uuid__": "bba6f088-0e1f-4a12-9872-41670be1152a" + } + }, + { + "frame": 0.45, + "value": { + "__uuid__": "2c5de5b2-9009-48fa-bef4-ae34cc94f876" + } + }, + { + "frame": 0.48333333333333334, + "value": { + "__uuid__": "6f27b252-6eaf-4b4b-9c5a-46ba899e4845" + } + }, + { + "frame": 0.5166666666666667, + "value": { + "__uuid__": "4ebd5c60-efa6-4950-a4c8-74a7a8517333" + } + }, + { + "frame": 0.55, + "value": { + "__uuid__": "a207290f-4556-4adb-8a11-e1d5ba342550" + } + }, + { + "frame": 0.5833333333333334, + "value": { + "__uuid__": "e9d442d2-981d-437d-87c0-085162017de7" + } + }, + { + "frame": 0.6166666666666667, + "value": { + "__uuid__": "9b4d5c8c-5ec0-4fd7-a45e-6b0bc8ff9119" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/Monk/Atk3.anim.meta b/frontend/assets/resources/animation/Monk/Atk3.anim.meta new file mode 100644 index 0000000..dfd6165 --- /dev/null +++ b/frontend/assets/resources/animation/Monk/Atk3.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "504dd9c8-7850-44e8-a944-bbdb2260b18a", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/Monk/Atk4.anim b/frontend/assets/resources/animation/Monk/Atk4.anim new file mode 100644 index 0000000..107a2b0 --- /dev/null +++ b/frontend/assets/resources/animation/Monk/Atk4.anim @@ -0,0 +1,115 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "Atk4", + "_objFlags": 0, + "_native": "", + "_duration": 0.6833333333333333, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "a4f724de-140f-472a-be83-731520d3da38" + } + }, + { + "frame": 0.03333333333333333, + "value": { + "__uuid__": "3594a12d-5b5c-4dc6-8138-1b48eacf0798" + } + }, + { + "frame": 0.05, + "value": { + "__uuid__": "cdef413d-f009-45d3-aeb6-423652fc366d" + } + }, + { + "frame": 0.08333333333333333, + "value": { + "__uuid__": "688682c4-ea77-4d2c-b1e4-079f5880d3cd" + } + }, + { + "frame": 0.11666666666666667, + "value": { + "__uuid__": "ca9f0a44-9977-4b24-8243-ac5536f14bc8" + } + }, + { + "frame": 0.15, + "value": { + "__uuid__": "6b4dbc7c-a872-40d6-be0e-4d1a96eddd44" + } + }, + { + "frame": 0.2, + "value": { + "__uuid__": "b43c8a38-1d55-4d6b-b6a1-fc888a9e53b5" + } + }, + { + "frame": 0.25, + "value": { + "__uuid__": "0eb3d73a-a724-46f3-b1f1-56d315150320" + } + }, + { + "frame": 0.3, + "value": { + "__uuid__": "ddac83f4-f0bf-460e-9a83-cc75c69ef024" + } + }, + { + "frame": 0.35, + "value": { + "__uuid__": "8e673fdc-2cc8-435c-8a0d-38dcfc7b8600" + } + }, + { + "frame": 0.4, + "value": { + "__uuid__": "7a345895-6501-4388-88f6-984992a3799b" + } + }, + { + "frame": 0.4666666666666667, + "value": { + "__uuid__": "99b4e340-52ca-4f3e-a86f-ca385ff8797a" + } + }, + { + "frame": 0.5166666666666667, + "value": { + "__uuid__": "554d0862-0d1c-4f61-8d47-03362cd9eb1d" + } + }, + { + "frame": 0.5666666666666667, + "value": { + "__uuid__": "cd15a283-cf0d-48d4-9162-2d72202baf82" + } + }, + { + "frame": 0.6166666666666667, + "value": { + "__uuid__": "b2bb7fdf-2532-408f-a3d1-fe8bf0e34f61" + } + }, + { + "frame": 0.6666666666666666, + "value": { + "__uuid__": "435c0195-a5c3-4a8f-9d44-e6f026649b70" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/Monk/Atk4.anim.meta b/frontend/assets/resources/animation/Monk/Atk4.anim.meta new file mode 100644 index 0000000..ad85427 --- /dev/null +++ b/frontend/assets/resources/animation/Monk/Atk4.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "7e0a1e98-ee5a-446f-bec2-7d72b6916503", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/Monk/Atked1.anim b/frontend/assets/resources/animation/Monk/Atked1.anim new file mode 100644 index 0000000..cfb9f41 --- /dev/null +++ b/frontend/assets/resources/animation/Monk/Atked1.anim @@ -0,0 +1,31 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "Atked1", + "_objFlags": 0, + "_native": "", + "_duration": 0.06666666666666667, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "7ceb8a79-f5bf-4918-afa1-d76a85a571b0" + } + }, + { + "frame": 0.05, + "value": { + "__uuid__": "23ce7632-8b44-4138-b3b2-3e296ba9184c" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/Monk/Atked1.anim.meta b/frontend/assets/resources/animation/Monk/Atked1.anim.meta new file mode 100644 index 0000000..a98ce13 --- /dev/null +++ b/frontend/assets/resources/animation/Monk/Atked1.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "488ad635-2683-4884-9e93-d1ee67bd0e49", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/Monk/BlownUp1.anim b/frontend/assets/resources/animation/Monk/BlownUp1.anim new file mode 100644 index 0000000..7ccb1e0 --- /dev/null +++ b/frontend/assets/resources/animation/Monk/BlownUp1.anim @@ -0,0 +1,133 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "BlownUp1", + "_objFlags": 0, + "_native": "", + "_duration": 0.55, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "ba708108-b18f-4ec0-81f6-0e516e4f832b" + } + }, + { + "frame": 0.016666666666666666, + "value": { + "__uuid__": "aeeaa976-f3b4-4b77-a18b-b08ddd28d812" + } + }, + { + "frame": 0.03333333333333333, + "value": { + "__uuid__": "89d06edf-8838-4ab4-adbd-059acf21dc8c" + } + }, + { + "frame": 0.05, + "value": { + "__uuid__": "c2f38b89-f7a0-477b-921c-f56ee385b737" + } + }, + { + "frame": 0.08333333333333333, + "value": { + "__uuid__": "90186972-a736-449d-8e64-d15c4ebcbfd1" + } + }, + { + "frame": 0.11666666666666667, + "value": { + "__uuid__": "1d64b1f5-5f08-4247-a43c-ffe2d58e09df" + } + }, + { + "frame": 0.15, + "value": { + "__uuid__": "cf158505-bb9c-4836-b45f-2b253dfef117" + } + }, + { + "frame": 0.18333333333333332, + "value": { + "__uuid__": "a2984de9-99db-40bf-9969-0b163a97d9eb" + } + }, + { + "frame": 0.21666666666666667, + "value": { + "__uuid__": "66f0b5dc-4e0e-4597-a7f9-b9ee6752bc98" + } + }, + { + "frame": 0.25, + "value": { + "__uuid__": "3cf0f5bd-0104-4315-a750-55b5fb26e1ec" + } + }, + { + "frame": 0.2833333333333333, + "value": { + "__uuid__": "a31b8683-ca31-4268-80d6-5b117af86ee6" + } + }, + { + "frame": 0.31666666666666665, + "value": { + "__uuid__": "a7ab4cb1-2221-4aba-8ced-dc93d8dca2f3" + } + }, + { + "frame": 0.35, + "value": { + "__uuid__": "2ac3a00d-059a-4e15-a9cb-378bd671c9f3" + } + }, + { + "frame": 0.38333333333333336, + "value": { + "__uuid__": "2b5cab9a-420c-406a-bef4-6aaee4ae6e8f" + } + }, + { + "frame": 0.4166666666666667, + "value": { + "__uuid__": "6df0a35f-062b-49ec-aa73-146f8b2207a7" + } + }, + { + "frame": 0.45, + "value": { + "__uuid__": "afaac620-4293-4336-9a44-bf7927c6751c" + } + }, + { + "frame": 0.48333333333333334, + "value": { + "__uuid__": "410823b3-14e4-475b-b658-dc4d5325f307" + } + }, + { + "frame": 0.5166666666666667, + "value": { + "__uuid__": "34a43c48-497b-4495-97c9-8de53cbcc229" + } + }, + { + "frame": 0.5333333333333333, + "value": { + "__uuid__": "c7ffc314-70ae-4a2b-9238-db1778a336d1" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/Monk/BlownUp1.anim.meta b/frontend/assets/resources/animation/Monk/BlownUp1.anim.meta new file mode 100644 index 0000000..39a104f --- /dev/null +++ b/frontend/assets/resources/animation/Monk/BlownUp1.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "8e17dfc6-68d0-47fe-af06-d30dc2790a6b", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/Monk/GetUp1.anim b/frontend/assets/resources/animation/Monk/GetUp1.anim new file mode 100644 index 0000000..4aadb33 --- /dev/null +++ b/frontend/assets/resources/animation/Monk/GetUp1.anim @@ -0,0 +1,91 @@ +{ + "__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__": "ec0d05f4-3c30-4107-b9b4-3ccff5fb9a02" + } + }, + { + "frame": 0.03333333333333333, + "value": { + "__uuid__": "3e0fa075-ffdc-490f-872c-b77e202df224" + } + }, + { + "frame": 0.06666666666666667, + "value": { + "__uuid__": "f3c8e924-c86a-426b-a3de-ffc6e19060f3" + } + }, + { + "frame": 0.1, + "value": { + "__uuid__": "35b847f0-f3f7-4ec9-ba93-5616f763d658" + } + }, + { + "frame": 0.13333333333333333, + "value": { + "__uuid__": "a018eecc-27e6-4d60-973f-ed9fe86a147e" + } + }, + { + "frame": 0.18333333333333332, + "value": { + "__uuid__": "3d70f10e-a3f7-4b7a-aedb-a010ad946abe" + } + }, + { + "frame": 0.23333333333333334, + "value": { + "__uuid__": "b860cb8a-2445-49bc-96f0-aac4396be922" + } + }, + { + "frame": 0.2833333333333333, + "value": { + "__uuid__": "bddec025-747e-4602-9352-6fc3bf921dc0" + } + }, + { + "frame": 0.3333333333333333, + "value": { + "__uuid__": "22053496-5240-40d3-98bd-49e16d05f7f9" + } + }, + { + "frame": 0.4, + "value": { + "__uuid__": "9de8f787-3059-403d-bdcb-f7d4bd59ba65" + } + }, + { + "frame": 0.45, + "value": { + "__uuid__": "471de8d2-34ee-4605-b8c5-9f3983db8a04" + } + }, + { + "frame": 0.5, + "value": { + "__uuid__": "a4cb5179-60eb-41f8-bcef-56ce3299da19" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/Monk/GetUp1.anim.meta b/frontend/assets/resources/animation/Monk/GetUp1.anim.meta new file mode 100644 index 0000000..ced9fb6 --- /dev/null +++ b/frontend/assets/resources/animation/Monk/GetUp1.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "da6a7cc1-9709-42f4-b6d0-17c1917a08a3", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/Monk/Idle1.anim b/frontend/assets/resources/animation/Monk/Idle1.anim new file mode 100644 index 0000000..b2a5d69 --- /dev/null +++ b/frontend/assets/resources/animation/Monk/Idle1.anim @@ -0,0 +1,67 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "Idle1", + "_objFlags": 0, + "_native": "", + "_duration": 0.8333333333333334, + "sample": 60, + "speed": 1, + "wrapMode": 2, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "2c5f2d24-01f1-4a0f-8ddc-eacfbc9b6208" + } + }, + { + "frame": 0.13333333333333333, + "value": { + "__uuid__": "fd29846b-1998-49ba-89f6-f665b9ea7002" + } + }, + { + "frame": 0.23333333333333334, + "value": { + "__uuid__": "e3b30506-3a86-462e-b265-e7f6c7c09dc5" + } + }, + { + "frame": 0.36666666666666664, + "value": { + "__uuid__": "84f15682-b73e-443d-8d9f-f530f152bcce" + } + }, + { + "frame": 0.5, + "value": { + "__uuid__": "45249fea-e7e7-4b68-8971-49d825960248" + } + }, + { + "frame": 0.6166666666666667, + "value": { + "__uuid__": "ca561428-9e45-41a9-8d66-c0468d4c85d9" + } + }, + { + "frame": 0.7166666666666667, + "value": { + "__uuid__": "062f3bd5-beca-435a-8d82-524fd51a88a0" + } + }, + { + "frame": 0.8166666666666667, + "value": { + "__uuid__": "23068811-a6e5-4ef5-960f-7e6dea328c84" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/Monk/Idle1.anim.meta b/frontend/assets/resources/animation/Monk/Idle1.anim.meta new file mode 100644 index 0000000..589c73b --- /dev/null +++ b/frontend/assets/resources/animation/Monk/Idle1.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "2d402c67-e47d-4de0-8a80-40bc12073ffc", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/Monk/InAirAtk1.anim b/frontend/assets/resources/animation/Monk/InAirAtk1.anim new file mode 100644 index 0000000..5cef3c0 --- /dev/null +++ b/frontend/assets/resources/animation/Monk/InAirAtk1.anim @@ -0,0 +1,79 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "InAirAtk1", + "_objFlags": 0, + "_native": "", + "_duration": 0.6, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "70adb814-3dca-492f-a0fe-36d4d6b37e01" + } + }, + { + "frame": 0.06666666666666667, + "value": { + "__uuid__": "7c67ab61-96e0-4c43-a2d8-742fa1021107" + } + }, + { + "frame": 0.15, + "value": { + "__uuid__": "beb4bc62-b6bf-4a07-973e-1b91e3942ab3" + } + }, + { + "frame": 0.21666666666666667, + "value": { + "__uuid__": "422441bd-8551-46d3-9383-162553035080" + } + }, + { + "frame": 0.3, + "value": { + "__uuid__": "312f8dd2-7d02-4a80-a960-17d197c96da4" + } + }, + { + "frame": 0.35, + "value": { + "__uuid__": "42597d6a-b982-43aa-90bd-2e9a01063628" + } + }, + { + "frame": 0.45, + "value": { + "__uuid__": "487b65c3-44e3-4b0e-9350-e0d1c952785b" + } + }, + { + "frame": 0.5, + "value": { + "__uuid__": "9a5357ae-a160-4198-a6d5-cc9631fde754" + } + }, + { + "frame": 0.5333333333333333, + "value": { + "__uuid__": "d08fc3b2-f6e8-4ff8-bba4-69ce3eb771df" + } + }, + { + "frame": 0.5833333333333334, + "value": { + "__uuid__": "9f8ef3e0-6f56-41d2-97d1-ac7f3cc690ee" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/Monk/InAirAtk1.anim.meta b/frontend/assets/resources/animation/Monk/InAirAtk1.anim.meta new file mode 100644 index 0000000..4d8202b --- /dev/null +++ b/frontend/assets/resources/animation/Monk/InAirAtk1.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "5035ddfe-ff75-4dff-a506-89cbb26220da", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/Monk/InAirAtked1.anim b/frontend/assets/resources/animation/Monk/InAirAtked1.anim new file mode 100644 index 0000000..5812852 --- /dev/null +++ b/frontend/assets/resources/animation/Monk/InAirAtked1.anim @@ -0,0 +1,49 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "InAirAtked1", + "_objFlags": 0, + "_native": "", + "_duration": 0.25, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "39c94369-a78d-459d-9305-13a2b9c15225" + } + }, + { + "frame": 0.05, + "value": { + "__uuid__": "c85b7940-7bb2-4597-a309-155b7a116f94" + } + }, + { + "frame": 0.11666666666666667, + "value": { + "__uuid__": "78f498f8-6517-4e28-91f9-b70ee87beff9" + } + }, + { + "frame": 0.18333333333333332, + "value": { + "__uuid__": "02247899-3345-411a-aaa3-65e2f5e0b3e6" + } + }, + { + "frame": 0.23333333333333334, + "value": { + "__uuid__": "bec5291d-8f6e-426c-8e16-1d0239a69bad" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/Monk/InAirAtked1.anim.meta b/frontend/assets/resources/animation/Monk/InAirAtked1.anim.meta new file mode 100644 index 0000000..85f8a0a --- /dev/null +++ b/frontend/assets/resources/animation/Monk/InAirAtked1.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "ac0fa38d-d3ad-4dff-841d-4d98ee5017db", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/Monk/InAirIdle1ByJump.anim b/frontend/assets/resources/animation/Monk/InAirIdle1ByJump.anim new file mode 100644 index 0000000..19f7630 --- /dev/null +++ b/frontend/assets/resources/animation/Monk/InAirIdle1ByJump.anim @@ -0,0 +1,91 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "InAirIdle1ByJump", + "_objFlags": 0, + "_native": "", + "_duration": 0.7833333333333333, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "493a132d-af22-4621-842a-9fdc645b3e43" + } + }, + { + "frame": 0.05, + "value": { + "__uuid__": "06d18871-0cb6-41eb-a484-5c6a4c04d5d5" + } + }, + { + "frame": 0.11666666666666667, + "value": { + "__uuid__": "f298ff82-ad9d-4945-ab19-14c3e3d54c95" + } + }, + { + "frame": 0.18333333333333332, + "value": { + "__uuid__": "bb5924a6-40cf-4e43-8c94-e51b27861656" + } + }, + { + "frame": 0.25, + "value": { + "__uuid__": "fc4b5181-77af-44ec-836e-c14eec8d20c4" + } + }, + { + "frame": 0.3333333333333333, + "value": { + "__uuid__": "5ddd3db3-79b2-4f0c-bb76-2446801ff665" + } + }, + { + "frame": 0.4166666666666667, + "value": { + "__uuid__": "032785ce-c911-479b-be1c-2e0899a586d0" + } + }, + { + "frame": 0.48333333333333334, + "value": { + "__uuid__": "d651269d-1c08-49f8-bc38-d301bf26b0e1" + } + }, + { + "frame": 0.5666666666666667, + "value": { + "__uuid__": "e270563e-d98d-4a80-82db-837183053ae3" + } + }, + { + "frame": 0.6333333333333333, + "value": { + "__uuid__": "aec31ef8-46dc-4f0e-9cba-18f6c96c5c33" + } + }, + { + "frame": 0.7, + "value": { + "__uuid__": "e64b3a8d-41a9-45f6-9aeb-9e49b6317080" + } + }, + { + "frame": 0.7666666666666667, + "value": { + "__uuid__": "cf886091-24a9-4cfb-8cb9-e3db977035ab" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/Monk/InAirIdle1ByJump.anim.meta b/frontend/assets/resources/animation/Monk/InAirIdle1ByJump.anim.meta new file mode 100644 index 0000000..07d6283 --- /dev/null +++ b/frontend/assets/resources/animation/Monk/InAirIdle1ByJump.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "a4315723-e7b6-40e7-9a3c-bac959378b90", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/Monk/InAirIdle1NoJump.anim b/frontend/assets/resources/animation/Monk/InAirIdle1NoJump.anim new file mode 100644 index 0000000..afeb00a --- /dev/null +++ b/frontend/assets/resources/animation/Monk/InAirIdle1NoJump.anim @@ -0,0 +1,31 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "InAirIdle1NoJump", + "_objFlags": 0, + "_native": "", + "_duration": 0.2833333333333333, + "sample": 60, + "speed": 1, + "wrapMode": 2, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "e64b3a8d-41a9-45f6-9aeb-9e49b6317080" + } + }, + { + "frame": 0.26666666666666666, + "value": { + "__uuid__": "cf886091-24a9-4cfb-8cb9-e3db977035ab" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/Monk/InAirIdle1NoJump.anim.meta b/frontend/assets/resources/animation/Monk/InAirIdle1NoJump.anim.meta new file mode 100644 index 0000000..caf0c1b --- /dev/null +++ b/frontend/assets/resources/animation/Monk/InAirIdle1NoJump.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "53b0ae11-f77f-4c3a-9e6d-76159d135c2c", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/Monk/LayDown1.anim b/frontend/assets/resources/animation/Monk/LayDown1.anim new file mode 100644 index 0000000..b785db8 --- /dev/null +++ b/frontend/assets/resources/animation/Monk/LayDown1.anim @@ -0,0 +1,97 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "LayDown1", + "_objFlags": 0, + "_native": "", + "_duration": 0.23333333333333334, + "sample": 60, + "speed": 1, + "wrapMode": 1, + "curveData": { + "comps": { + "cc.Sprite": { + "spriteFrame": [ + { + "frame": 0, + "value": { + "__uuid__": "b521e99d-b206-4453-bcb7-55d0049a229a" + } + }, + { + "frame": 0.016666666666666666, + "value": { + "__uuid__": "04656482-51fb-4a3d-aa3a-28c682ff4852" + } + }, + { + "frame": 0.03333333333333333, + "value": { + "__uuid__": "44b85e26-64bb-47d9-90ba-4ae8c10fd9f1" + } + }, + { + "frame": 0.05, + "value": { + "__uuid__": "2afb056b-e83a-4074-ac6c-ac6edaa0ff37" + } + }, + { + "frame": 0.08333333333333333, + "value": { + "__uuid__": "0ca0d5ca-01d3-4013-8819-1f79be60fa91" + } + }, + { + "frame": 0.1, + "value": { + "__uuid__": "50902f57-47ef-4e07-beec-f633a96c5116" + } + }, + { + "frame": 0.11666666666666667, + "value": { + "__uuid__": "78914b1e-5202-4b2a-86b8-696bc989d43a" + } + }, + { + "frame": 0.13333333333333333, + "value": { + "__uuid__": "5dd8649a-7fd4-4c82-b4c9-17739901e637" + } + }, + { + "frame": 0.15, + "value": { + "__uuid__": "76fcd7e0-0841-4308-a152-a561aec76659" + } + }, + { + "frame": 0.16666666666666666, + "value": { + "__uuid__": "32b61366-3f7e-4e83-88f1-9c63d6fb45de" + } + }, + { + "frame": 0.18333333333333332, + "value": { + "__uuid__": "8b692f1c-570e-4c35-a40d-e3b6b5973396" + } + }, + { + "frame": 0.2, + "value": { + "__uuid__": "756ff6b2-3c2d-4a5b-87f3-1e37073d80e5" + } + }, + { + "frame": 0.21666666666666667, + "value": { + "__uuid__": "dc43217f-afeb-42fb-bdea-04b18ffee56f" + } + } + ] + } + } + }, + "events": [] +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/Monk/LayDown1.anim.meta b/frontend/assets/resources/animation/Monk/LayDown1.anim.meta new file mode 100644 index 0000000..51816cf --- /dev/null +++ b/frontend/assets/resources/animation/Monk/LayDown1.anim.meta @@ -0,0 +1,5 @@ +{ + "ver": "2.1.0", + "uuid": "e4faa04d-28f5-40b0-b1a5-99cd902e5fd6", + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/Monk/Monk.plist b/frontend/assets/resources/animation/Monk/Monk.plist new file mode 100644 index 0000000..012af0b --- /dev/null +++ b/frontend/assets/resources/animation/Monk/Monk.plist @@ -0,0 +1,2201 @@ + + + + + frames + + Atk1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {121,107} + spriteSourceSize + {121,107} + textureRect + {{322,604},{121,107}} + textureRotated + + + Atk1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {121,107} + spriteSourceSize + {121,107} + textureRect + {{340,1813},{121,107}} + textureRotated + + + Atk1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {121,107} + spriteSourceSize + {121,107} + textureRect + {{503,1080},{121,107}} + textureRotated + + + Atk1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {121,107} + spriteSourceSize + {121,107} + textureRect + {{503,1080},{121,107}} + textureRotated + + + Atk1_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {121,107} + spriteSourceSize + {121,107} + textureRect + {{503,1080},{121,107}} + textureRotated + + + Atk1_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {121,107} + spriteSourceSize + {121,107} + textureRect + {{503,1187},{121,107}} + textureRotated + + + Atk1_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {121,107} + spriteSourceSize + {121,107} + textureRect + {{368,1294},{121,107}} + textureRotated + + + Atk2_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {123,113} + spriteSourceSize + {123,113} + textureRect + {{245,1260},{123,113}} + textureRotated + + + Atk2_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {123,113} + spriteSourceSize + {123,113} + textureRect + {{245,1373},{123,113}} + textureRotated + + + Atk2_11.png + + aliases + + spriteOffset + {0,0} + spriteSize + {123,113} + spriteSourceSize + {123,113} + textureRect + {{245,1486},{123,113}} + textureRotated + + + Atk2_12.png + + aliases + + spriteOffset + {0,0} + spriteSize + {123,113} + spriteSourceSize + {123,113} + textureRect + {{245,1599},{123,113}} + textureRotated + + + Atk2_13.png + + aliases + + spriteOffset + {0,0} + spriteSize + {123,113} + spriteSourceSize + {123,113} + textureRect + {{380,741},{123,113}} + textureRotated + + + Atk2_14.png + + aliases + + spriteOffset + {0,0} + spriteSize + {123,113} + spriteSourceSize + {123,113} + textureRect + {{380,854},{123,113}} + textureRotated + + + Atk2_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {123,113} + spriteSourceSize + {123,113} + textureRect + {{503,741},{123,113}} + textureRotated + + + Atk2_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {123,113} + spriteSourceSize + {123,113} + textureRect + {{380,967},{123,113}} + textureRotated + + + Atk2_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {123,113} + spriteSourceSize + {123,113} + textureRect + {{503,854},{123,113}} + textureRotated + + + Atk2_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {123,113} + spriteSourceSize + {123,113} + textureRect + {{380,1080},{123,113}} + textureRotated + + + Atk2_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {123,113} + spriteSourceSize + {123,113} + textureRect + {{380,1080},{123,113}} + textureRotated + + + Atk2_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {123,113} + spriteSourceSize + {123,113} + textureRect + {{503,967},{123,113}} + textureRotated + + + Atk2_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {123,113} + spriteSourceSize + {123,113} + textureRect + {{503,967},{123,113}} + textureRotated + + + Atk2_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {123,113} + spriteSourceSize + {123,113} + textureRect + {{245,1373},{123,113}} + textureRotated + + + Atk3_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {101,123} + spriteSourceSize + {101,123} + textureRect + {{245,1712},{101,123}} + textureRotated + + + Atk3_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {101,123} + spriteSourceSize + {101,123} + textureRect + {{380,1193},{101,123}} + textureRotated + + + Atk3_11.png + + aliases + + spriteOffset + {0,0} + spriteSize + {101,123} + spriteSourceSize + {101,123} + textureRect + {{368,1401},{101,123}} + textureRotated + + + Atk3_12.png + + aliases + + spriteOffset + {0,0} + spriteSize + {101,123} + spriteSourceSize + {101,123} + textureRect + {{489,1294},{101,123}} + textureRotated + + + Atk3_13.png + + aliases + + spriteOffset + {0,0} + spriteSize + {101,123} + spriteSourceSize + {101,123} + textureRect + {{368,1524},{101,123}} + textureRotated + + + Atk3_14.png + + aliases + + spriteOffset + {0,0} + spriteSize + {101,123} + spriteSourceSize + {101,123} + textureRect + {{368,1647},{101,123}} + textureRotated + + + Atk3_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {101,123} + spriteSourceSize + {101,123} + textureRect + {{626,743},{101,123}} + textureRotated + + + Atk3_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {101,123} + spriteSourceSize + {101,123} + textureRect + {{626,866},{101,123}} + textureRotated + + + Atk3_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {101,123} + spriteSourceSize + {101,123} + textureRect + {{727,743},{101,123}} + textureRotated + + + Atk3_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {101,123} + spriteSourceSize + {101,123} + textureRect + {{727,866},{101,123}} + textureRotated + + + Atk3_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {101,123} + spriteSourceSize + {101,123} + textureRect + {{828,743},{101,123}} + textureRotated + + + Atk3_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {101,123} + spriteSourceSize + {101,123} + textureRect + {{828,743},{101,123}} + textureRotated + + + Atk3_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {101,123} + spriteSourceSize + {101,123} + textureRect + {{828,866},{101,123}} + textureRotated + + + Atk3_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {101,123} + spriteSourceSize + {101,123} + textureRect + {{626,989},{101,123}} + textureRotated + + + Atk4_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {135,107} + spriteSourceSize + {135,107} + textureRect + {{322,469},{135,107}} + textureRotated + + + Atk4_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {135,107} + spriteSourceSize + {135,107} + textureRect + {{707,422},{135,107}} + textureRotated + + + Atk4_11.png + + aliases + + spriteOffset + {0,0} + spriteSize + {135,107} + spriteSourceSize + {135,107} + textureRect + {{842,422},{135,107}} + textureRotated + + + Atk4_12.png + + aliases + + spriteOffset + {0,0} + spriteSize + {135,107} + spriteSourceSize + {135,107} + textureRect + {{429,527},{135,107}} + textureRotated + + + Atk4_13.png + + aliases + + spriteOffset + {0,0} + spriteSize + {135,107} + spriteSourceSize + {135,107} + textureRect + {{564,527},{135,107}} + textureRotated + + + Atk4_14.png + + aliases + + spriteOffset + {0,0} + spriteSize + {135,107} + spriteSourceSize + {135,107} + textureRect + {{699,529},{135,107}} + textureRotated + + + Atk4_15.png + + aliases + + spriteOffset + {0,0} + spriteSize + {135,107} + spriteSourceSize + {135,107} + textureRect + {{834,529},{135,107}} + textureRotated + + + Atk4_16.png + + aliases + + spriteOffset + {0,0} + spriteSize + {135,107} + spriteSourceSize + {135,107} + textureRect + {{429,634},{135,107}} + textureRotated + + + Atk4_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {135,107} + spriteSourceSize + {135,107} + textureRect + {{564,634},{135,107}} + textureRotated + + + Atk4_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {135,107} + spriteSourceSize + {135,107} + textureRect + {{699,636},{135,107}} + textureRotated + + + Atk4_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {135,107} + spriteSourceSize + {135,107} + textureRect + {{834,636},{135,107}} + textureRotated + + + Atk4_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {135,107} + spriteSourceSize + {135,107} + textureRect + {{245,725},{135,107}} + textureRotated + + + Atk4_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {135,107} + spriteSourceSize + {135,107} + textureRect + {{245,832},{135,107}} + textureRotated + + + Atk4_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {135,107} + spriteSourceSize + {135,107} + textureRect + {{245,939},{135,107}} + textureRotated + + + Atk4_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {135,107} + spriteSourceSize + {135,107} + textureRect + {{245,1046},{135,107}} + textureRotated + + + Atk4_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {135,107} + spriteSourceSize + {135,107} + textureRect + {{245,1153},{135,107}} + textureRotated + + + Atked1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {86,104} + spriteSourceSize + {86,104} + textureRect + {{664,1659},{86,104}} + textureRotated + + + Atked1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {86,104} + spriteSourceSize + {86,104} + textureRect + {{756,1806},{86,104}} + textureRotated + + + BlownUp1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {140,114} + spriteSourceSize + {140,114} + textureRect + {{296,136},{140,114}} + textureRotated + + + BlownUp1_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {140,114} + spriteSourceSize + {140,114} + textureRect + {{444,0},{140,114}} + textureRotated + + + BlownUp1_11.png + + aliases + + spriteOffset + {0,0} + spriteSize + {140,114} + spriteSourceSize + {140,114} + textureRect + {{0,544},{140,114}} + textureRotated + + + BlownUp1_12.png + + aliases + + spriteOffset + {0,0} + spriteSize + {140,114} + spriteSourceSize + {140,114} + textureRect + {{148,408},{140,114}} + textureRotated + + + BlownUp1_13.png + + aliases + + spriteOffset + {0,0} + spriteSize + {140,114} + spriteSourceSize + {140,114} + textureRect + {{296,250},{140,114}} + textureRotated + + + BlownUp1_14.png + + aliases + + spriteOffset + {0,0} + spriteSize + {140,114} + spriteSourceSize + {140,114} + textureRect + {{584,0},{140,114}} + textureRotated + + + BlownUp1_15.png + + aliases + + spriteOffset + {0,0} + spriteSize + {140,114} + spriteSourceSize + {140,114} + textureRect + {{0,658},{140,114}} + textureRotated + + + BlownUp1_16.png + + aliases + + spriteOffset + {0,0} + spriteSize + {140,114} + spriteSourceSize + {140,114} + textureRect + {{724,0},{140,114}} + textureRotated + + + BlownUp1_17.png + + aliases + + spriteOffset + {0,0} + spriteSize + {140,114} + spriteSourceSize + {140,114} + textureRect + {{0,772},{140,114}} + textureRotated + + + BlownUp1_18.png + + aliases + + spriteOffset + {0,0} + spriteSize + {140,114} + spriteSourceSize + {140,114} + textureRect + {{864,0},{140,114}} + textureRotated + + + BlownUp1_19.png + + aliases + + spriteOffset + {0,0} + spriteSize + {140,114} + spriteSourceSize + {140,114} + textureRect + {{0,886},{140,114}} + textureRotated + + + BlownUp1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {140,114} + spriteSourceSize + {140,114} + textureRect + {{0,1000},{140,114}} + textureRotated + + + BlownUp1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {140,114} + spriteSourceSize + {140,114} + textureRect + {{0,1114},{140,114}} + textureRotated + + + BlownUp1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {140,114} + spriteSourceSize + {140,114} + textureRect + {{0,1228},{140,114}} + textureRotated + + + BlownUp1_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {140,114} + spriteSourceSize + {140,114} + textureRect + {{0,1342},{140,114}} + textureRotated + + + BlownUp1_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {140,114} + spriteSourceSize + {140,114} + textureRect + {{0,1456},{140,114}} + textureRotated + + + BlownUp1_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {140,114} + spriteSourceSize + {140,114} + textureRect + {{0,1570},{140,114}} + textureRotated + + + BlownUp1_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {140,114} + spriteSourceSize + {140,114} + textureRect + {{0,1684},{140,114}} + textureRotated + + + BlownUp1_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {140,114} + spriteSourceSize + {140,114} + textureRect + {{0,1798},{140,114}} + textureRotated + + + GetUp1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {137,105} + spriteSourceSize + {137,105} + textureRect + {{140,721},{137,105}} + textureRotated + + + GetUp1_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {137,105} + spriteSourceSize + {137,105} + textureRect + {{140,858},{137,105}} + textureRotated + + + GetUp1_11.png + + aliases + + spriteOffset + {0,0} + spriteSize + {137,105} + spriteSourceSize + {137,105} + textureRect + {{140,995},{137,105}} + textureRotated + + + GetUp1_12.png + + aliases + + spriteOffset + {0,0} + spriteSize + {137,105} + spriteSourceSize + {137,105} + textureRect + {{140,1132},{137,105}} + textureRotated + + + GetUp1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {137,105} + spriteSourceSize + {137,105} + textureRect + {{140,1269},{137,105}} + textureRotated + + + GetUp1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {137,105} + spriteSourceSize + {137,105} + textureRect + {{140,1406},{137,105}} + textureRotated + + + GetUp1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {137,105} + spriteSourceSize + {137,105} + textureRect + {{140,1543},{137,105}} + textureRotated + + + GetUp1_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {137,105} + spriteSourceSize + {137,105} + textureRect + {{140,1680},{137,105}} + textureRotated + + + GetUp1_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {137,105} + spriteSourceSize + {137,105} + textureRect + {{217,522},{137,105}} + textureRotated + + + GetUp1_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {137,105} + spriteSourceSize + {137,105} + textureRect + {{296,364},{137,105}} + textureRotated + + + GetUp1_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {137,105} + spriteSourceSize + {137,105} + textureRect + {{433,422},{137,105}} + textureRotated + + + GetUp1_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {137,105} + spriteSourceSize + {137,105} + textureRect + {{570,422},{137,105}} + textureRotated + + + Idle1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {78,111} + spriteSourceSize + {78,111} + textureRect + {{855,1200},{78,111}} + textureRotated + + + Idle1_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {78,111} + spriteSourceSize + {78,111} + textureRect + {{933,1200},{78,111}} + textureRotated + + + Idle1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {78,111} + spriteSourceSize + {78,111} + textureRect + {{859,1311},{78,111}} + textureRotated + + + Idle1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {78,111} + spriteSourceSize + {78,111} + textureRect + {{859,1422},{78,111}} + textureRotated + + + Idle1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {78,111} + spriteSourceSize + {78,111} + textureRect + {{937,1311},{78,111}} + textureRotated + + + Idle1_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {78,111} + spriteSourceSize + {78,111} + textureRect + {{937,1422},{78,111}} + textureRotated + + + Idle1_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {78,111} + spriteSourceSize + {78,111} + textureRect + {{859,1533},{78,111}} + textureRotated + + + Idle1_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {78,111} + spriteSourceSize + {78,111} + textureRect + {{853,1611},{78,111}} + textureRotated + + + Idle1_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {78,111} + spriteSourceSize + {78,111} + textureRect + {{856,1689},{78,111}} + textureRotated + + + Idle1_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {78,111} + spriteSourceSize + {78,111} + textureRect + {{860,1800},{78,111}} + textureRotated + + + InAirAtk1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {148,136} + spriteSourceSize + {148,136} + textureRect + {{0,0},{148,136}} + textureRotated + + + InAirAtk1_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {148,136} + spriteSourceSize + {148,136} + textureRect + {{0,136},{148,136}} + textureRotated + + + InAirAtk1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {148,136} + spriteSourceSize + {148,136} + textureRect + {{148,0},{148,136}} + textureRotated + + + InAirAtk1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {148,136} + spriteSourceSize + {148,136} + textureRect + {{0,272},{148,136}} + textureRotated + + + InAirAtk1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {148,136} + spriteSourceSize + {148,136} + textureRect + {{0,272},{148,136}} + textureRotated + + + InAirAtk1_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {148,136} + spriteSourceSize + {148,136} + textureRect + {{148,136},{148,136}} + textureRotated + + + InAirAtk1_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {148,136} + spriteSourceSize + {148,136} + textureRect + {{148,136},{148,136}} + textureRotated + + + InAirAtk1_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {148,136} + spriteSourceSize + {148,136} + textureRect + {{296,0},{148,136}} + textureRotated + + + InAirAtk1_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {148,136} + spriteSourceSize + {148,136} + textureRect + {{0,408},{148,136}} + textureRotated + + + InAirAtk1_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {148,136} + spriteSourceSize + {148,136} + textureRect + {{148,272},{148,136}} + textureRotated + + + InAirAtked1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {103,100} + spriteSourceSize + {103,100} + textureRect + {{140,1817},{103,100}} + textureRotated + + + InAirAtked1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {103,100} + spriteSourceSize + {103,100} + textureRect + {{240,1817},{103,100}} + textureRotated + + + InAirAtked1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {103,100} + spriteSourceSize + {103,100} + textureRect + {{656,1763},{103,100}} + textureRotated + + + InAirAtked1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {103,100} + spriteSourceSize + {103,100} + textureRect + {{750,1603},{103,100}} + textureRotated + + + InAirAtked1_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {103,100} + spriteSourceSize + {103,100} + textureRect + {{756,1703},{103,100}} + textureRotated + + + InAirIdle1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {83,131} + spriteSourceSize + {83,131} + textureRect + {{749,989},{83,131}} + textureRotated + + + InAirIdle1_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {83,131} + spriteSourceSize + {83,131} + textureRect + {{612,1314},{83,131}} + textureRotated + + + InAirIdle1_11.png + + aliases + + spriteOffset + {0,0} + spriteSize + {83,131} + spriteSourceSize + {83,131} + textureRect + {{929,743},{83,131}} + textureRotated + + + InAirIdle1_12.png + + aliases + + spriteOffset + {0,0} + spriteSize + {83,131} + spriteSourceSize + {83,131} + textureRect + {{929,874},{83,131}} + textureRotated + + + InAirIdle1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {83,131} + spriteSourceSize + {83,131} + textureRect + {{469,1401},{83,131}} + textureRotated + + + InAirIdle1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {83,131} + spriteSourceSize + {83,131} + textureRect + {{469,1532},{83,131}} + textureRotated + + + InAirIdle1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {83,131} + spriteSourceSize + {83,131} + textureRect + {{469,1663},{83,131}} + textureRotated + + + InAirIdle1_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {83,131} + spriteSourceSize + {83,131} + textureRect + {{664,1397},{83,131}} + textureRotated + + + InAirIdle1_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {83,131} + spriteSourceSize + {83,131} + textureRect + {{664,1528},{83,131}} + textureRotated + + + InAirIdle1_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {83,131} + spriteSourceSize + {83,131} + textureRect + {{573,1733},{83,131}} + textureRotated + + + InAirIdle1_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {83,131} + spriteSourceSize + {83,131} + textureRect + {{880,1005},{83,131}} + textureRotated + + + InAirIdle1_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {83,131} + spriteSourceSize + {83,131} + textureRect + {{749,1072},{83,131}} + textureRotated + + + LayDown1_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {177,77} + spriteSourceSize + {177,77} + textureRect + {{444,114},{177,77}} + textureRotated + + + LayDown1_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {177,77} + spriteSourceSize + {177,77} + textureRect + {{621,114},{177,77}} + textureRotated + + + LayDown1_11.png + + aliases + + spriteOffset + {0,0} + spriteSize + {177,77} + spriteSourceSize + {177,77} + textureRect + {{798,114},{177,77}} + textureRotated + + + LayDown1_12.png + + aliases + + spriteOffset + {0,0} + spriteSize + {177,77} + spriteSourceSize + {177,77} + textureRect + {{436,191},{177,77}} + textureRotated + + + LayDown1_13.png + + aliases + + spriteOffset + {0,0} + spriteSize + {177,77} + spriteSourceSize + {177,77} + textureRect + {{436,268},{177,77}} + textureRotated + + + LayDown1_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {177,77} + spriteSourceSize + {177,77} + textureRect + {{613,191},{177,77}} + textureRotated + + + LayDown1_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {177,77} + spriteSourceSize + {177,77} + textureRect + {{613,268},{177,77}} + textureRotated + + + LayDown1_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {177,77} + spriteSourceSize + {177,77} + textureRect + {{790,191},{177,77}} + textureRotated + + + LayDown1_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {177,77} + spriteSourceSize + {177,77} + textureRect + {{790,268},{177,77}} + textureRotated + + + LayDown1_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {177,77} + spriteSourceSize + {177,77} + textureRect + {{436,345},{177,77}} + textureRotated + + + LayDown1_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {177,77} + spriteSourceSize + {177,77} + textureRect + {{613,345},{177,77}} + textureRotated + + + LayDown1_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {177,77} + spriteSourceSize + {177,77} + textureRect + {{790,345},{177,77}} + textureRotated + + + LayDown1_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {177,77} + spriteSourceSize + {177,77} + textureRect + {{140,544},{177,77}} + textureRotated + + + Walking_1.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,112} + spriteSourceSize + {112,112} + textureRect + {{624,1090},{112,112}} + textureRotated + + + Walking_10.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,112} + spriteSourceSize + {112,112} + textureRect + {{624,1202},{112,112}} + textureRotated + + + Walking_11.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,112} + spriteSourceSize + {112,112} + textureRect + {{461,1794},{112,112}} + textureRotated + + + Walking_2.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,112} + spriteSourceSize + {112,112} + textureRect + {{552,1397},{112,112}} + textureRotated + + + Walking_3.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,112} + spriteSourceSize + {112,112} + textureRect + {{552,1509},{112,112}} + textureRotated + + + Walking_4.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,112} + spriteSourceSize + {112,112} + textureRect + {{552,1621},{112,112}} + textureRotated + + + Walking_5.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,112} + spriteSourceSize + {112,112} + textureRect + {{736,1155},{112,112}} + textureRotated + + + Walking_6.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,112} + spriteSourceSize + {112,112} + textureRect + {{880,1088},{112,112}} + textureRotated + + + Walking_7.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,112} + spriteSourceSize + {112,112} + textureRect + {{743,1267},{112,112}} + textureRotated + + + Walking_8.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,112} + spriteSourceSize + {112,112} + textureRect + {{747,1379},{112,112}} + textureRotated + + + Walking_9.png + + aliases + + spriteOffset + {0,0} + spriteSize + {112,112} + spriteSourceSize + {112,112} + textureRect + {{747,1491},{112,112}} + textureRotated + + + + metadata + + format + 3 + pixelFormat + RGBA8888 + premultiplyAlpha + + realTextureFileName + Monk.png + size + {1015,1920} + smartupdate + $TexturePacker:SmartUpdate:d8280b540dab8e1bf109a3736f81929b:4a17a531d96d501ac7dc0f1beee57a61:0d538e391a81baa9ecb48d28b418b896$ + textureFileName + Monk.png + + + diff --git a/frontend/assets/resources/animation/Monk/Monk.plist.meta b/frontend/assets/resources/animation/Monk/Monk.plist.meta new file mode 100644 index 0000000..18f8426 --- /dev/null +++ b/frontend/assets/resources/animation/Monk/Monk.plist.meta @@ -0,0 +1,3202 @@ +{ + "ver": "1.2.4", + "uuid": "6dcd5722-8ef9-47fd-9520-861d2713e274", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "size": { + "width": 1015, + "height": 1920 + }, + "type": "Texture Packer", + "subMetas": { + "Atk1_1.png": { + "ver": "1.0.4", + "uuid": "c7107ebe-c5c1-4ba6-8ef4-6eb768f7faf9", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 322, + "trimY": 604, + "width": 121, + "height": 107, + "rawWidth": 121, + "rawHeight": 107, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk1_2.png": { + "ver": "1.0.4", + "uuid": "e0e20918-ff59-43bc-aeaf-035087934092", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 340, + "trimY": 1813, + "width": 121, + "height": 107, + "rawWidth": 121, + "rawHeight": 107, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk1_3.png": { + "ver": "1.0.4", + "uuid": "5896a135-36da-4fa9-9257-a9042ba4b546", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 503, + "trimY": 1080, + "width": 121, + "height": 107, + "rawWidth": 121, + "rawHeight": 107, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk1_4.png": { + "ver": "1.0.4", + "uuid": "4a16667a-f3b3-405c-8565-d65a4281cfc8", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 503, + "trimY": 1080, + "width": 121, + "height": 107, + "rawWidth": 121, + "rawHeight": 107, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk1_5.png": { + "ver": "1.0.4", + "uuid": "5ad9858c-52aa-4742-be68-d680210e0d0a", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 503, + "trimY": 1080, + "width": 121, + "height": 107, + "rawWidth": 121, + "rawHeight": 107, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk1_6.png": { + "ver": "1.0.4", + "uuid": "e54dbc94-3eeb-450a-9206-655e960771d2", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 503, + "trimY": 1187, + "width": 121, + "height": 107, + "rawWidth": 121, + "rawHeight": 107, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk1_7.png": { + "ver": "1.0.4", + "uuid": "f79260b7-7702-4f15-8f12-eb19f018aff1", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 368, + "trimY": 1294, + "width": 121, + "height": 107, + "rawWidth": 121, + "rawHeight": 107, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_1.png": { + "ver": "1.0.4", + "uuid": "0355243d-755f-497b-b1ff-4ec105f4efe7", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 245, + "trimY": 1260, + "width": 123, + "height": 113, + "rawWidth": 123, + "rawHeight": 113, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_10.png": { + "ver": "1.0.4", + "uuid": "59587d34-25af-42bd-ba0c-747c5f5fa697", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 245, + "trimY": 1373, + "width": 123, + "height": 113, + "rawWidth": 123, + "rawHeight": 113, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_11.png": { + "ver": "1.0.4", + "uuid": "3bceacb5-309a-41e0-bdad-26e85bcf859a", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 245, + "trimY": 1486, + "width": 123, + "height": 113, + "rawWidth": 123, + "rawHeight": 113, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_12.png": { + "ver": "1.0.4", + "uuid": "57f6da9e-f131-4fab-9a3d-f2e894d203aa", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 245, + "trimY": 1599, + "width": 123, + "height": 113, + "rawWidth": 123, + "rawHeight": 113, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_13.png": { + "ver": "1.0.4", + "uuid": "c35454f3-535b-4aec-b408-b8174a74556a", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 380, + "trimY": 741, + "width": 123, + "height": 113, + "rawWidth": 123, + "rawHeight": 113, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_14.png": { + "ver": "1.0.4", + "uuid": "24f5b898-42dc-4f67-b6fc-946cdb5e369f", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 380, + "trimY": 854, + "width": 123, + "height": 113, + "rawWidth": 123, + "rawHeight": 113, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_2.png": { + "ver": "1.0.4", + "uuid": "22386328-484b-441e-9675-6553ede6118c", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 503, + "trimY": 741, + "width": 123, + "height": 113, + "rawWidth": 123, + "rawHeight": 113, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_3.png": { + "ver": "1.0.4", + "uuid": "1ed0eb22-5a20-405f-a15e-8a66348bd025", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 380, + "trimY": 967, + "width": 123, + "height": 113, + "rawWidth": 123, + "rawHeight": 113, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_4.png": { + "ver": "1.0.4", + "uuid": "6e12225f-2300-4e0e-bcf6-00049bfbc48f", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 503, + "trimY": 854, + "width": 123, + "height": 113, + "rawWidth": 123, + "rawHeight": 113, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_5.png": { + "ver": "1.0.4", + "uuid": "549e581f-5121-4cbb-96e9-b3b8b5b0f227", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 380, + "trimY": 1080, + "width": 123, + "height": 113, + "rawWidth": 123, + "rawHeight": 113, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_6.png": { + "ver": "1.0.4", + "uuid": "08e1ec2a-500f-4a16-a19d-383de218cc14", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 380, + "trimY": 1080, + "width": 123, + "height": 113, + "rawWidth": 123, + "rawHeight": 113, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_7.png": { + "ver": "1.0.4", + "uuid": "024b3ae9-7d24-4057-83d7-4b58f8651ce0", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 503, + "trimY": 967, + "width": 123, + "height": 113, + "rawWidth": 123, + "rawHeight": 113, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_8.png": { + "ver": "1.0.4", + "uuid": "57f241ae-ce40-49ed-bf63-71d016e41e2f", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 503, + "trimY": 967, + "width": 123, + "height": 113, + "rawWidth": 123, + "rawHeight": 113, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk2_9.png": { + "ver": "1.0.4", + "uuid": "d2685f61-3365-4c14-9fb1-d7b2311871c4", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 245, + "trimY": 1373, + "width": 123, + "height": 113, + "rawWidth": 123, + "rawHeight": 113, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_1.png": { + "ver": "1.0.4", + "uuid": "a64b6f59-fa72-4f5d-89dc-81a469244ea5", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 245, + "trimY": 1712, + "width": 101, + "height": 123, + "rawWidth": 101, + "rawHeight": 123, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_10.png": { + "ver": "1.0.4", + "uuid": "6f27b252-6eaf-4b4b-9c5a-46ba899e4845", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 380, + "trimY": 1193, + "width": 101, + "height": 123, + "rawWidth": 101, + "rawHeight": 123, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_11.png": { + "ver": "1.0.4", + "uuid": "4ebd5c60-efa6-4950-a4c8-74a7a8517333", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 368, + "trimY": 1401, + "width": 101, + "height": 123, + "rawWidth": 101, + "rawHeight": 123, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_12.png": { + "ver": "1.0.4", + "uuid": "a207290f-4556-4adb-8a11-e1d5ba342550", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 489, + "trimY": 1294, + "width": 101, + "height": 123, + "rawWidth": 101, + "rawHeight": 123, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_13.png": { + "ver": "1.0.4", + "uuid": "e9d442d2-981d-437d-87c0-085162017de7", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 368, + "trimY": 1524, + "width": 101, + "height": 123, + "rawWidth": 101, + "rawHeight": 123, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_14.png": { + "ver": "1.0.4", + "uuid": "9b4d5c8c-5ec0-4fd7-a45e-6b0bc8ff9119", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 368, + "trimY": 1647, + "width": 101, + "height": 123, + "rawWidth": 101, + "rawHeight": 123, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_2.png": { + "ver": "1.0.4", + "uuid": "f800d4a1-2396-4aa5-a578-11481db1d8bf", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 626, + "trimY": 743, + "width": 101, + "height": 123, + "rawWidth": 101, + "rawHeight": 123, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_3.png": { + "ver": "1.0.4", + "uuid": "d97f6a5f-8e63-40d7-bd14-9dc71e15e5db", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 626, + "trimY": 866, + "width": 101, + "height": 123, + "rawWidth": 101, + "rawHeight": 123, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_4.png": { + "ver": "1.0.4", + "uuid": "196bcbf9-e89f-4b26-b736-73e2fa787e50", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 727, + "trimY": 743, + "width": 101, + "height": 123, + "rawWidth": 101, + "rawHeight": 123, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_5.png": { + "ver": "1.0.4", + "uuid": "3229e023-e63d-4a4e-af72-2b1409ea43c5", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 727, + "trimY": 866, + "width": 101, + "height": 123, + "rawWidth": 101, + "rawHeight": 123, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_6.png": { + "ver": "1.0.4", + "uuid": "e2d6e8b8-b468-4edb-b8c3-860bd85ebeae", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 828, + "trimY": 743, + "width": 101, + "height": 123, + "rawWidth": 101, + "rawHeight": 123, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_7.png": { + "ver": "1.0.4", + "uuid": "318745eb-06b1-4e7f-88d1-e23e02d99e67", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 828, + "trimY": 743, + "width": 101, + "height": 123, + "rawWidth": 101, + "rawHeight": 123, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_8.png": { + "ver": "1.0.4", + "uuid": "bba6f088-0e1f-4a12-9872-41670be1152a", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 828, + "trimY": 866, + "width": 101, + "height": 123, + "rawWidth": 101, + "rawHeight": 123, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk3_9.png": { + "ver": "1.0.4", + "uuid": "2c5de5b2-9009-48fa-bef4-ae34cc94f876", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 626, + "trimY": 989, + "width": 101, + "height": 123, + "rawWidth": 101, + "rawHeight": 123, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk4_1.png": { + "ver": "1.0.4", + "uuid": "3594a12d-5b5c-4dc6-8138-1b48eacf0798", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 322, + "trimY": 469, + "width": 135, + "height": 107, + "rawWidth": 135, + "rawHeight": 107, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk4_10.png": { + "ver": "1.0.4", + "uuid": "7a345895-6501-4388-88f6-984992a3799b", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 707, + "trimY": 422, + "width": 135, + "height": 107, + "rawWidth": 135, + "rawHeight": 107, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk4_11.png": { + "ver": "1.0.4", + "uuid": "99b4e340-52ca-4f3e-a86f-ca385ff8797a", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 842, + "trimY": 422, + "width": 135, + "height": 107, + "rawWidth": 135, + "rawHeight": 107, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk4_12.png": { + "ver": "1.0.4", + "uuid": "554d0862-0d1c-4f61-8d47-03362cd9eb1d", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 429, + "trimY": 527, + "width": 135, + "height": 107, + "rawWidth": 135, + "rawHeight": 107, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk4_13.png": { + "ver": "1.0.4", + "uuid": "cd15a283-cf0d-48d4-9162-2d72202baf82", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 564, + "trimY": 527, + "width": 135, + "height": 107, + "rawWidth": 135, + "rawHeight": 107, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk4_14.png": { + "ver": "1.0.4", + "uuid": "b2bb7fdf-2532-408f-a3d1-fe8bf0e34f61", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 699, + "trimY": 529, + "width": 135, + "height": 107, + "rawWidth": 135, + "rawHeight": 107, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk4_15.png": { + "ver": "1.0.4", + "uuid": "435c0195-a5c3-4a8f-9d44-e6f026649b70", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 834, + "trimY": 529, + "width": 135, + "height": 107, + "rawWidth": 135, + "rawHeight": 107, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk4_16.png": { + "ver": "1.0.4", + "uuid": "a4f724de-140f-472a-be83-731520d3da38", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 429, + "trimY": 634, + "width": 135, + "height": 107, + "rawWidth": 135, + "rawHeight": 107, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk4_2.png": { + "ver": "1.0.4", + "uuid": "cdef413d-f009-45d3-aeb6-423652fc366d", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 564, + "trimY": 634, + "width": 135, + "height": 107, + "rawWidth": 135, + "rawHeight": 107, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk4_3.png": { + "ver": "1.0.4", + "uuid": "688682c4-ea77-4d2c-b1e4-079f5880d3cd", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 699, + "trimY": 636, + "width": 135, + "height": 107, + "rawWidth": 135, + "rawHeight": 107, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk4_4.png": { + "ver": "1.0.4", + "uuid": "ca9f0a44-9977-4b24-8243-ac5536f14bc8", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 834, + "trimY": 636, + "width": 135, + "height": 107, + "rawWidth": 135, + "rawHeight": 107, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk4_5.png": { + "ver": "1.0.4", + "uuid": "6b4dbc7c-a872-40d6-be0e-4d1a96eddd44", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 245, + "trimY": 725, + "width": 135, + "height": 107, + "rawWidth": 135, + "rawHeight": 107, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk4_6.png": { + "ver": "1.0.4", + "uuid": "b43c8a38-1d55-4d6b-b6a1-fc888a9e53b5", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 245, + "trimY": 832, + "width": 135, + "height": 107, + "rawWidth": 135, + "rawHeight": 107, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk4_7.png": { + "ver": "1.0.4", + "uuid": "0eb3d73a-a724-46f3-b1f1-56d315150320", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 245, + "trimY": 939, + "width": 135, + "height": 107, + "rawWidth": 135, + "rawHeight": 107, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk4_8.png": { + "ver": "1.0.4", + "uuid": "ddac83f4-f0bf-460e-9a83-cc75c69ef024", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 245, + "trimY": 1046, + "width": 135, + "height": 107, + "rawWidth": 135, + "rawHeight": 107, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atk4_9.png": { + "ver": "1.0.4", + "uuid": "8e673fdc-2cc8-435c-8a0d-38dcfc7b8600", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 245, + "trimY": 1153, + "width": 135, + "height": 107, + "rawWidth": 135, + "rawHeight": 107, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atked1_1.png": { + "ver": "1.0.4", + "uuid": "7ceb8a79-f5bf-4918-afa1-d76a85a571b0", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 664, + "trimY": 1659, + "width": 86, + "height": 104, + "rawWidth": 86, + "rawHeight": 104, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Atked1_2.png": { + "ver": "1.0.4", + "uuid": "23ce7632-8b44-4138-b3b2-3e296ba9184c", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 756, + "trimY": 1806, + "width": 86, + "height": 104, + "rawWidth": 86, + "rawHeight": 104, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "BlownUp1_1.png": { + "ver": "1.0.4", + "uuid": "ba708108-b18f-4ec0-81f6-0e516e4f832b", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 296, + "trimY": 136, + "width": 140, + "height": 114, + "rawWidth": 140, + "rawHeight": 114, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "BlownUp1_10.png": { + "ver": "1.0.4", + "uuid": "3cf0f5bd-0104-4315-a750-55b5fb26e1ec", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 444, + "trimY": 0, + "width": 140, + "height": 114, + "rawWidth": 140, + "rawHeight": 114, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "BlownUp1_11.png": { + "ver": "1.0.4", + "uuid": "a31b8683-ca31-4268-80d6-5b117af86ee6", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 544, + "width": 140, + "height": 114, + "rawWidth": 140, + "rawHeight": 114, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "BlownUp1_12.png": { + "ver": "1.0.4", + "uuid": "a7ab4cb1-2221-4aba-8ced-dc93d8dca2f3", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 148, + "trimY": 408, + "width": 140, + "height": 114, + "rawWidth": 140, + "rawHeight": 114, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "BlownUp1_13.png": { + "ver": "1.0.4", + "uuid": "2ac3a00d-059a-4e15-a9cb-378bd671c9f3", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 296, + "trimY": 250, + "width": 140, + "height": 114, + "rawWidth": 140, + "rawHeight": 114, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "BlownUp1_14.png": { + "ver": "1.0.4", + "uuid": "2b5cab9a-420c-406a-bef4-6aaee4ae6e8f", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 584, + "trimY": 0, + "width": 140, + "height": 114, + "rawWidth": 140, + "rawHeight": 114, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "BlownUp1_15.png": { + "ver": "1.0.4", + "uuid": "6df0a35f-062b-49ec-aa73-146f8b2207a7", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 658, + "width": 140, + "height": 114, + "rawWidth": 140, + "rawHeight": 114, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "BlownUp1_16.png": { + "ver": "1.0.4", + "uuid": "afaac620-4293-4336-9a44-bf7927c6751c", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 724, + "trimY": 0, + "width": 140, + "height": 114, + "rawWidth": 140, + "rawHeight": 114, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "BlownUp1_17.png": { + "ver": "1.0.4", + "uuid": "410823b3-14e4-475b-b658-dc4d5325f307", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 772, + "width": 140, + "height": 114, + "rawWidth": 140, + "rawHeight": 114, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "BlownUp1_18.png": { + "ver": "1.0.4", + "uuid": "34a43c48-497b-4495-97c9-8de53cbcc229", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 864, + "trimY": 0, + "width": 140, + "height": 114, + "rawWidth": 140, + "rawHeight": 114, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "BlownUp1_19.png": { + "ver": "1.0.4", + "uuid": "c7ffc314-70ae-4a2b-9238-db1778a336d1", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 886, + "width": 140, + "height": 114, + "rawWidth": 140, + "rawHeight": 114, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "BlownUp1_2.png": { + "ver": "1.0.4", + "uuid": "aeeaa976-f3b4-4b77-a18b-b08ddd28d812", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 1000, + "width": 140, + "height": 114, + "rawWidth": 140, + "rawHeight": 114, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "BlownUp1_3.png": { + "ver": "1.0.4", + "uuid": "89d06edf-8838-4ab4-adbd-059acf21dc8c", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 1114, + "width": 140, + "height": 114, + "rawWidth": 140, + "rawHeight": 114, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "BlownUp1_4.png": { + "ver": "1.0.4", + "uuid": "c2f38b89-f7a0-477b-921c-f56ee385b737", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 1228, + "width": 140, + "height": 114, + "rawWidth": 140, + "rawHeight": 114, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "BlownUp1_5.png": { + "ver": "1.0.4", + "uuid": "90186972-a736-449d-8e64-d15c4ebcbfd1", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 1342, + "width": 140, + "height": 114, + "rawWidth": 140, + "rawHeight": 114, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "BlownUp1_6.png": { + "ver": "1.0.4", + "uuid": "1d64b1f5-5f08-4247-a43c-ffe2d58e09df", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 1456, + "width": 140, + "height": 114, + "rawWidth": 140, + "rawHeight": 114, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "BlownUp1_7.png": { + "ver": "1.0.4", + "uuid": "cf158505-bb9c-4836-b45f-2b253dfef117", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 1570, + "width": 140, + "height": 114, + "rawWidth": 140, + "rawHeight": 114, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "BlownUp1_8.png": { + "ver": "1.0.4", + "uuid": "a2984de9-99db-40bf-9969-0b163a97d9eb", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 1684, + "width": 140, + "height": 114, + "rawWidth": 140, + "rawHeight": 114, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "BlownUp1_9.png": { + "ver": "1.0.4", + "uuid": "66f0b5dc-4e0e-4597-a7f9-b9ee6752bc98", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 1798, + "width": 140, + "height": 114, + "rawWidth": 140, + "rawHeight": 114, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "GetUp1_1.png": { + "ver": "1.0.4", + "uuid": "ec0d05f4-3c30-4107-b9b4-3ccff5fb9a02", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 140, + "trimY": 721, + "width": 137, + "height": 105, + "rawWidth": 137, + "rawHeight": 105, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "GetUp1_10.png": { + "ver": "1.0.4", + "uuid": "9de8f787-3059-403d-bdcb-f7d4bd59ba65", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 140, + "trimY": 858, + "width": 137, + "height": 105, + "rawWidth": 137, + "rawHeight": 105, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "GetUp1_11.png": { + "ver": "1.0.4", + "uuid": "471de8d2-34ee-4605-b8c5-9f3983db8a04", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 140, + "trimY": 995, + "width": 137, + "height": 105, + "rawWidth": 137, + "rawHeight": 105, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "GetUp1_12.png": { + "ver": "1.0.4", + "uuid": "a4cb5179-60eb-41f8-bcef-56ce3299da19", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 140, + "trimY": 1132, + "width": 137, + "height": 105, + "rawWidth": 137, + "rawHeight": 105, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "GetUp1_2.png": { + "ver": "1.0.4", + "uuid": "3e0fa075-ffdc-490f-872c-b77e202df224", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 140, + "trimY": 1269, + "width": 137, + "height": 105, + "rawWidth": 137, + "rawHeight": 105, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "GetUp1_3.png": { + "ver": "1.0.4", + "uuid": "f3c8e924-c86a-426b-a3de-ffc6e19060f3", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 140, + "trimY": 1406, + "width": 137, + "height": 105, + "rawWidth": 137, + "rawHeight": 105, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "GetUp1_4.png": { + "ver": "1.0.4", + "uuid": "35b847f0-f3f7-4ec9-ba93-5616f763d658", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 140, + "trimY": 1543, + "width": 137, + "height": 105, + "rawWidth": 137, + "rawHeight": 105, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "GetUp1_5.png": { + "ver": "1.0.4", + "uuid": "a018eecc-27e6-4d60-973f-ed9fe86a147e", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 140, + "trimY": 1680, + "width": 137, + "height": 105, + "rawWidth": 137, + "rawHeight": 105, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "GetUp1_6.png": { + "ver": "1.0.4", + "uuid": "3d70f10e-a3f7-4b7a-aedb-a010ad946abe", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 217, + "trimY": 522, + "width": 137, + "height": 105, + "rawWidth": 137, + "rawHeight": 105, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "GetUp1_7.png": { + "ver": "1.0.4", + "uuid": "b860cb8a-2445-49bc-96f0-aac4396be922", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 296, + "trimY": 364, + "width": 137, + "height": 105, + "rawWidth": 137, + "rawHeight": 105, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "GetUp1_8.png": { + "ver": "1.0.4", + "uuid": "bddec025-747e-4602-9352-6fc3bf921dc0", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 433, + "trimY": 422, + "width": 137, + "height": 105, + "rawWidth": 137, + "rawHeight": 105, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "GetUp1_9.png": { + "ver": "1.0.4", + "uuid": "22053496-5240-40d3-98bd-49e16d05f7f9", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 570, + "trimY": 422, + "width": 137, + "height": 105, + "rawWidth": 137, + "rawHeight": 105, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_1.png": { + "ver": "1.0.4", + "uuid": "a5c02b13-8d8b-42d1-830b-81b37d37afe5", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 855, + "trimY": 1200, + "width": 78, + "height": 111, + "rawWidth": 78, + "rawHeight": 111, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_10.png": { + "ver": "1.0.4", + "uuid": "262583c0-7b65-4ddf-b2cc-24b0e4e1f52c", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 933, + "trimY": 1200, + "width": 78, + "height": 111, + "rawWidth": 78, + "rawHeight": 111, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_2.png": { + "ver": "1.0.4", + "uuid": "fd29846b-1998-49ba-89f6-f665b9ea7002", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 859, + "trimY": 1311, + "width": 78, + "height": 111, + "rawWidth": 78, + "rawHeight": 111, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_3.png": { + "ver": "1.0.4", + "uuid": "e3b30506-3a86-462e-b265-e7f6c7c09dc5", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 859, + "trimY": 1422, + "width": 78, + "height": 111, + "rawWidth": 78, + "rawHeight": 111, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_4.png": { + "ver": "1.0.4", + "uuid": "84f15682-b73e-443d-8d9f-f530f152bcce", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 937, + "trimY": 1311, + "width": 78, + "height": 111, + "rawWidth": 78, + "rawHeight": 111, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_5.png": { + "ver": "1.0.4", + "uuid": "45249fea-e7e7-4b68-8971-49d825960248", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 937, + "trimY": 1422, + "width": 78, + "height": 111, + "rawWidth": 78, + "rawHeight": 111, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_6.png": { + "ver": "1.0.4", + "uuid": "ca561428-9e45-41a9-8d66-c0468d4c85d9", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 859, + "trimY": 1533, + "width": 78, + "height": 111, + "rawWidth": 78, + "rawHeight": 111, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_7.png": { + "ver": "1.0.4", + "uuid": "062f3bd5-beca-435a-8d82-524fd51a88a0", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 853, + "trimY": 1611, + "width": 78, + "height": 111, + "rawWidth": 78, + "rawHeight": 111, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_8.png": { + "ver": "1.0.4", + "uuid": "2c5f2d24-01f1-4a0f-8ddc-eacfbc9b6208", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 856, + "trimY": 1689, + "width": 78, + "height": 111, + "rawWidth": 78, + "rawHeight": 111, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Idle1_9.png": { + "ver": "1.0.4", + "uuid": "23068811-a6e5-4ef5-960f-7e6dea328c84", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 860, + "trimY": 1800, + "width": 78, + "height": 111, + "rawWidth": 78, + "rawHeight": 111, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtk1_1.png": { + "ver": "1.0.4", + "uuid": "70adb814-3dca-492f-a0fe-36d4d6b37e01", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 148, + "height": 136, + "rawWidth": 148, + "rawHeight": 136, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtk1_10.png": { + "ver": "1.0.4", + "uuid": "9f8ef3e0-6f56-41d2-97d1-ac7f3cc690ee", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 136, + "width": 148, + "height": 136, + "rawWidth": 148, + "rawHeight": 136, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtk1_2.png": { + "ver": "1.0.4", + "uuid": "7c67ab61-96e0-4c43-a2d8-742fa1021107", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 148, + "trimY": 0, + "width": 148, + "height": 136, + "rawWidth": 148, + "rawHeight": 136, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtk1_3.png": { + "ver": "1.0.4", + "uuid": "beb4bc62-b6bf-4a07-973e-1b91e3942ab3", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 272, + "width": 148, + "height": 136, + "rawWidth": 148, + "rawHeight": 136, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtk1_4.png": { + "ver": "1.0.4", + "uuid": "422441bd-8551-46d3-9383-162553035080", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 272, + "width": 148, + "height": 136, + "rawWidth": 148, + "rawHeight": 136, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtk1_5.png": { + "ver": "1.0.4", + "uuid": "312f8dd2-7d02-4a80-a960-17d197c96da4", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 148, + "trimY": 136, + "width": 148, + "height": 136, + "rawWidth": 148, + "rawHeight": 136, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtk1_6.png": { + "ver": "1.0.4", + "uuid": "42597d6a-b982-43aa-90bd-2e9a01063628", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 148, + "trimY": 136, + "width": 148, + "height": 136, + "rawWidth": 148, + "rawHeight": 136, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtk1_7.png": { + "ver": "1.0.4", + "uuid": "487b65c3-44e3-4b0e-9350-e0d1c952785b", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 296, + "trimY": 0, + "width": 148, + "height": 136, + "rawWidth": 148, + "rawHeight": 136, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtk1_8.png": { + "ver": "1.0.4", + "uuid": "9a5357ae-a160-4198-a6d5-cc9631fde754", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 408, + "width": 148, + "height": 136, + "rawWidth": 148, + "rawHeight": 136, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtk1_9.png": { + "ver": "1.0.4", + "uuid": "d08fc3b2-f6e8-4ff8-bba4-69ce3eb771df", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 148, + "trimY": 272, + "width": 148, + "height": 136, + "rawWidth": 148, + "rawHeight": 136, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtked1_1.png": { + "ver": "1.0.4", + "uuid": "39c94369-a78d-459d-9305-13a2b9c15225", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 140, + "trimY": 1817, + "width": 103, + "height": 100, + "rawWidth": 103, + "rawHeight": 100, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtked1_2.png": { + "ver": "1.0.4", + "uuid": "c85b7940-7bb2-4597-a309-155b7a116f94", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 240, + "trimY": 1817, + "width": 103, + "height": 100, + "rawWidth": 103, + "rawHeight": 100, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtked1_3.png": { + "ver": "1.0.4", + "uuid": "78f498f8-6517-4e28-91f9-b70ee87beff9", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 656, + "trimY": 1763, + "width": 103, + "height": 100, + "rawWidth": 103, + "rawHeight": 100, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtked1_4.png": { + "ver": "1.0.4", + "uuid": "02247899-3345-411a-aaa3-65e2f5e0b3e6", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 750, + "trimY": 1603, + "width": 103, + "height": 100, + "rawWidth": 103, + "rawHeight": 100, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirAtked1_5.png": { + "ver": "1.0.4", + "uuid": "bec5291d-8f6e-426c-8e16-1d0239a69bad", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 756, + "trimY": 1703, + "width": 103, + "height": 100, + "rawWidth": 103, + "rawHeight": 100, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_1.png": { + "ver": "1.0.4", + "uuid": "06d18871-0cb6-41eb-a484-5c6a4c04d5d5", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 749, + "trimY": 989, + "width": 83, + "height": 131, + "rawWidth": 83, + "rawHeight": 131, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_10.png": { + "ver": "1.0.4", + "uuid": "aec31ef8-46dc-4f0e-9cba-18f6c96c5c33", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 612, + "trimY": 1314, + "width": 83, + "height": 131, + "rawWidth": 83, + "rawHeight": 131, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_11.png": { + "ver": "1.0.4", + "uuid": "e64b3a8d-41a9-45f6-9aeb-9e49b6317080", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 929, + "trimY": 743, + "width": 83, + "height": 131, + "rawWidth": 83, + "rawHeight": 131, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_12.png": { + "ver": "1.0.4", + "uuid": "cf886091-24a9-4cfb-8cb9-e3db977035ab", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 929, + "trimY": 874, + "width": 83, + "height": 131, + "rawWidth": 83, + "rawHeight": 131, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_2.png": { + "ver": "1.0.4", + "uuid": "f298ff82-ad9d-4945-ab19-14c3e3d54c95", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 469, + "trimY": 1401, + "width": 83, + "height": 131, + "rawWidth": 83, + "rawHeight": 131, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_3.png": { + "ver": "1.0.4", + "uuid": "bb5924a6-40cf-4e43-8c94-e51b27861656", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 469, + "trimY": 1532, + "width": 83, + "height": 131, + "rawWidth": 83, + "rawHeight": 131, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_4.png": { + "ver": "1.0.4", + "uuid": "fc4b5181-77af-44ec-836e-c14eec8d20c4", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 469, + "trimY": 1663, + "width": 83, + "height": 131, + "rawWidth": 83, + "rawHeight": 131, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_5.png": { + "ver": "1.0.4", + "uuid": "493a132d-af22-4621-842a-9fdc645b3e43", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 664, + "trimY": 1397, + "width": 83, + "height": 131, + "rawWidth": 83, + "rawHeight": 131, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_6.png": { + "ver": "1.0.4", + "uuid": "5ddd3db3-79b2-4f0c-bb76-2446801ff665", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 664, + "trimY": 1528, + "width": 83, + "height": 131, + "rawWidth": 83, + "rawHeight": 131, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_7.png": { + "ver": "1.0.4", + "uuid": "032785ce-c911-479b-be1c-2e0899a586d0", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 573, + "trimY": 1733, + "width": 83, + "height": 131, + "rawWidth": 83, + "rawHeight": 131, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_8.png": { + "ver": "1.0.4", + "uuid": "d651269d-1c08-49f8-bc38-d301bf26b0e1", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 880, + "trimY": 1005, + "width": 83, + "height": 131, + "rawWidth": 83, + "rawHeight": 131, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "InAirIdle1_9.png": { + "ver": "1.0.4", + "uuid": "e270563e-d98d-4a80-82db-837183053ae3", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 749, + "trimY": 1072, + "width": 83, + "height": 131, + "rawWidth": 83, + "rawHeight": 131, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "LayDown1_1.png": { + "ver": "1.0.4", + "uuid": "04656482-51fb-4a3d-aa3a-28c682ff4852", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 444, + "trimY": 114, + "width": 177, + "height": 77, + "rawWidth": 177, + "rawHeight": 77, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "LayDown1_10.png": { + "ver": "1.0.4", + "uuid": "8b692f1c-570e-4c35-a40d-e3b6b5973396", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 621, + "trimY": 114, + "width": 177, + "height": 77, + "rawWidth": 177, + "rawHeight": 77, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "LayDown1_11.png": { + "ver": "1.0.4", + "uuid": "756ff6b2-3c2d-4a5b-87f3-1e37073d80e5", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 798, + "trimY": 114, + "width": 177, + "height": 77, + "rawWidth": 177, + "rawHeight": 77, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "LayDown1_12.png": { + "ver": "1.0.4", + "uuid": "dc43217f-afeb-42fb-bdea-04b18ffee56f", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 436, + "trimY": 191, + "width": 177, + "height": 77, + "rawWidth": 177, + "rawHeight": 77, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "LayDown1_13.png": { + "ver": "1.0.4", + "uuid": "b521e99d-b206-4453-bcb7-55d0049a229a", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 436, + "trimY": 268, + "width": 177, + "height": 77, + "rawWidth": 177, + "rawHeight": 77, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "LayDown1_2.png": { + "ver": "1.0.4", + "uuid": "44b85e26-64bb-47d9-90ba-4ae8c10fd9f1", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 613, + "trimY": 191, + "width": 177, + "height": 77, + "rawWidth": 177, + "rawHeight": 77, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "LayDown1_3.png": { + "ver": "1.0.4", + "uuid": "2afb056b-e83a-4074-ac6c-ac6edaa0ff37", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 613, + "trimY": 268, + "width": 177, + "height": 77, + "rawWidth": 177, + "rawHeight": 77, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "LayDown1_4.png": { + "ver": "1.0.4", + "uuid": "0ca0d5ca-01d3-4013-8819-1f79be60fa91", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 790, + "trimY": 191, + "width": 177, + "height": 77, + "rawWidth": 177, + "rawHeight": 77, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "LayDown1_5.png": { + "ver": "1.0.4", + "uuid": "50902f57-47ef-4e07-beec-f633a96c5116", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 790, + "trimY": 268, + "width": 177, + "height": 77, + "rawWidth": 177, + "rawHeight": 77, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "LayDown1_6.png": { + "ver": "1.0.4", + "uuid": "78914b1e-5202-4b2a-86b8-696bc989d43a", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 436, + "trimY": 345, + "width": 177, + "height": 77, + "rawWidth": 177, + "rawHeight": 77, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "LayDown1_7.png": { + "ver": "1.0.4", + "uuid": "5dd8649a-7fd4-4c82-b4c9-17739901e637", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 613, + "trimY": 345, + "width": 177, + "height": 77, + "rawWidth": 177, + "rawHeight": 77, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "LayDown1_8.png": { + "ver": "1.0.4", + "uuid": "76fcd7e0-0841-4308-a152-a561aec76659", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 790, + "trimY": 345, + "width": 177, + "height": 77, + "rawWidth": 177, + "rawHeight": 77, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "LayDown1_9.png": { + "ver": "1.0.4", + "uuid": "32b61366-3f7e-4e83-88f1-9c63d6fb45de", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": true, + "offsetX": 0, + "offsetY": 0, + "trimX": 140, + "trimY": 544, + "width": 177, + "height": 77, + "rawWidth": 177, + "rawHeight": 77, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_1.png": { + "ver": "1.0.4", + "uuid": "a47f518e-62fb-4549-8897-4f2d387bd145", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 624, + "trimY": 1090, + "width": 112, + "height": 112, + "rawWidth": 112, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_10.png": { + "ver": "1.0.4", + "uuid": "e919100a-50ba-46ce-9ddb-e29f524da610", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 624, + "trimY": 1202, + "width": 112, + "height": 112, + "rawWidth": 112, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_11.png": { + "ver": "1.0.4", + "uuid": "c6e2cfeb-1d9d-4793-86fa-bc9a2f80f67a", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 461, + "trimY": 1794, + "width": 112, + "height": 112, + "rawWidth": 112, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_2.png": { + "ver": "1.0.4", + "uuid": "2b694de4-addf-4960-a765-b422da36e3a7", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 552, + "trimY": 1397, + "width": 112, + "height": 112, + "rawWidth": 112, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_3.png": { + "ver": "1.0.4", + "uuid": "7cc4b946-7646-4377-b2ac-b75c047dfe1c", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 552, + "trimY": 1509, + "width": 112, + "height": 112, + "rawWidth": 112, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_4.png": { + "ver": "1.0.4", + "uuid": "758814fe-7feb-4daa-8ecf-f0ba412f87dc", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 552, + "trimY": 1621, + "width": 112, + "height": 112, + "rawWidth": 112, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_5.png": { + "ver": "1.0.4", + "uuid": "3794c342-1ddb-423e-85ca-09f14fbd2cfb", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 736, + "trimY": 1155, + "width": 112, + "height": 112, + "rawWidth": 112, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_6.png": { + "ver": "1.0.4", + "uuid": "c3899480-a64e-4e16-897b-562b76d0d85c", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 880, + "trimY": 1088, + "width": 112, + "height": 112, + "rawWidth": 112, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_7.png": { + "ver": "1.0.4", + "uuid": "509a8985-2442-4326-9cd9-d77cad6e4e66", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 743, + "trimY": 1267, + "width": 112, + "height": 112, + "rawWidth": 112, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_8.png": { + "ver": "1.0.4", + "uuid": "bdb51693-f9cc-4828-ab25-e131939b358d", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 747, + "trimY": 1379, + "width": 112, + "height": 112, + "rawWidth": 112, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + }, + "Walking_9.png": { + "ver": "1.0.4", + "uuid": "c47e6d89-5e15-4f9c-a4ee-ec10e3b04295", + "rawTextureUuid": "6e1dbec7-ad55-413b-8108-0ac881c76a8b", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 747, + "trimY": 1491, + "width": 112, + "height": 112, + "rawWidth": 112, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "spriteType": "normal", + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/frontend/assets/resources/animation/Monk/Monk.png b/frontend/assets/resources/animation/Monk/Monk.png new file mode 100644 index 0000000000000000000000000000000000000000..b4fd2f285319a648f9a654c710b2cdba44734ad6 GIT binary patch literal 221902 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 @@ -16,6 +16,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/assets/resources/pbfiles/room_downsync_frame.proto b/frontend/assets/resources/pbfiles/room_downsync_frame.proto index 4226fa8..6684f48 100644 --- a/frontend/assets/resources/pbfiles/room_downsync_frame.proto +++ b/frontend/assets/resources/pbfiles/room_downsync_frame.proto @@ -29,6 +29,9 @@ message PlayerDownsync { int32 activeSkillHit = 22; int32 framesInvinsible = 23; + int32 bulletTeamId = 24; + int32 chCollisionTeamId = 25; + string name = 997; string displayName = 998; string avatar = 999; diff --git a/frontend/assets/resources/prefabs/ControlledCharacter.prefab b/frontend/assets/resources/prefabs/ControlledCharacter.prefab index 5a5db55..e740a9e 100644 --- a/frontend/assets/resources/prefabs/ControlledCharacter.prefab +++ b/frontend/assets/resources/prefabs/ControlledCharacter.prefab @@ -25,22 +25,19 @@ }, { "__id__": 8 - }, - { - "__id__": 11 } ], "_active": true, "_components": [ { - "__id__": 21 + "__id__": 22 }, { - "__id__": 22 + "__id__": 23 } ], "_prefab": { - "__id__": 23 + "__id__": 24 }, "_opacity": 255, "_color": { @@ -194,180 +191,6 @@ "fileId": "5apzDmIE9IuaMOyF3z06sc", "sync": false }, - { - "__type__": "cc.Node", - "_name": "particlesystem", - "_objFlags": 0, - "_parent": { - "__id__": 1 - }, - "_children": [], - "_active": false, - "_components": [ - { - "__id__": 6 - } - ], - "_prefab": { - "__id__": 7 - }, - "_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, - 0, - 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__": "cc.ParticleSystem", - "_name": "", - "_objFlags": 0, - "node": { - "__id__": 5 - }, - "_enabled": true, - "_materials": [], - "_srcBlendFactor": 770, - "_dstBlendFactor": 1, - "_custom": true, - "_file": { - "__uuid__": "b2687ac4-099e-403c-a192-ff477686f4f5" - }, - "_spriteFrame": { - "__uuid__": "472df5d3-35e7-4184-9e6c-7f41bee65ee3" - }, - "_texture": null, - "_stopped": true, - "playOnLoad": true, - "autoRemoveOnFinish": false, - "totalParticles": 200, - "duration": -1, - "emissionRate": 999.999985098839, - "life": 0.20000000298023224, - "lifeVar": 0.5, - "_startColor": { - "__type__": "cc.Color", - "r": 202, - "g": 200, - "b": 86, - "a": 163 - }, - "_startColorVar": { - "__type__": "cc.Color", - "r": 229, - "g": 255, - "b": 173, - "a": 198 - }, - "_endColor": { - "__type__": "cc.Color", - "r": 173, - "g": 161, - "b": 19, - "a": 214 - }, - "_endColorVar": { - "__type__": "cc.Color", - "r": 107, - "g": 249, - "b": 249, - "a": 188 - }, - "angle": 360, - "angleVar": 360, - "startSize": 3.369999885559082, - "startSizeVar": 50, - "endSize": 30.31999969482422, - "endSizeVar": 0, - "startSpin": -47.369998931884766, - "startSpinVar": 0, - "endSpin": -47.369998931884766, - "endSpinVar": -142.11000061035156, - "sourcePos": { - "__type__": "cc.Vec2", - "x": 0, - "y": 0 - }, - "posVar": { - "__type__": "cc.Vec2", - "x": 7, - "y": 7 - }, - "_positionType": 1, - "positionType": 1, - "emitterMode": 0, - "gravity": { - "__type__": "cc.Vec2", - "x": 0.25, - "y": 0.8600000143051147 - }, - "speed": 0, - "speedVar": 190.7899932861328, - "tangentialAccel": -92.11000061035156, - "tangentialAccelVar": 65.79000091552734, - "radialAccel": -671.0499877929688, - "radialAccelVar": 65.79000091552734, - "rotationIsDir": false, - "startRadius": 0, - "startRadiusVar": 0, - "endRadius": 0, - "endRadiusVar": 0, - "rotatePerS": 0, - "rotatePerSVar": 0, - "_N$preview": true, - "_id": "" - }, - { - "__type__": "cc.PrefabInfo", - "root": { - "__id__": 1 - }, - "asset": { - "__uuid__": "59bff7a2-23e1-4d69-bce7-afb37eae196a" - }, - "fileId": "04uxaznclAmLRL13XKszPJ", - "sync": false - }, { "__type__": "cc.Node", "_name": "arrowTip", @@ -379,11 +202,11 @@ "_active": true, "_components": [ { - "__id__": 9 + "__id__": 6 } ], "_prefab": { - "__id__": 10 + "__id__": 7 }, "_opacity": 255, "_color": { @@ -437,7 +260,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 8 + "__id__": 5 }, "_enabled": true, "_materials": [ @@ -486,16 +309,19 @@ }, "_children": [ { - "__id__": 12 + "__id__": 9 }, { - "__id__": 16 + "__id__": 13 + }, + { + "__id__": 17 } ], "_active": true, "_components": [], "_prefab": { - "__id__": 20 + "__id__": 21 }, "_opacity": 255, "_color": { @@ -549,20 +375,20 @@ "_name": "MonkGirl", "_objFlags": 0, "_parent": { - "__id__": 11 + "__id__": 8 }, "_children": [], "_active": false, "_components": [ { - "__id__": 13 + "__id__": 10 }, { - "__id__": 14 + "__id__": 11 } ], "_prefab": { - "__id__": 15 + "__id__": 12 }, "_opacity": 255, "_color": { @@ -616,7 +442,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 12 + "__id__": 9 }, "_enabled": true, "_defaultClip": null, @@ -669,7 +495,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 12 + "__id__": 9 }, "_enabled": true, "_materials": [ @@ -712,20 +538,20 @@ "_name": "KnifeGirl", "_objFlags": 0, "_parent": { - "__id__": 11 + "__id__": 8 }, "_children": [], "_active": false, "_components": [ { - "__id__": 17 + "__id__": 14 }, { - "__id__": 18 + "__id__": 15 } ], "_prefab": { - "__id__": 19 + "__id__": 16 }, "_opacity": 255, "_color": { @@ -779,7 +605,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 16 + "__id__": 13 }, "_enabled": true, "_defaultClip": null, @@ -832,7 +658,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 16 + "__id__": 13 }, "_enabled": true, "_materials": [ @@ -870,6 +696,168 @@ "fileId": "bdCx1wrTtJ1KaGHUmgL7iA", "sync": false }, + { + "__type__": "cc.Node", + "_name": "Monk", + "_objFlags": 0, + "_parent": { + "__id__": 8 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 18 + }, + { + "__id__": 19 + } + ], + "_prefab": { + "__id__": 20 + }, + "_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 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + -24, + 0, + 0, + 0, + 0, + 1, + 0.65, + 0.55, + 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__": 17 + }, + "_enabled": true, + "_defaultClip": null, + "_clips": [ + { + "__uuid__": "2d402c67-e47d-4de0-8a80-40bc12073ffc" + }, + { + "__uuid__": "18d10aad-93ee-44e8-9048-1f26c136492b" + }, + { + "__uuid__": "d044ab74-be6a-49a2-85ab-eba41922c2cd" + }, + { + "__uuid__": "488ad635-2683-4884-9e93-d1ee67bd0e49" + }, + { + "__uuid__": "53b0ae11-f77f-4c3a-9e6d-76159d135c2c" + }, + { + "__uuid__": "a4315723-e7b6-40e7-9a3c-bac959378b90" + }, + { + "__uuid__": "5035ddfe-ff75-4dff-a506-89cbb26220da" + }, + { + "__uuid__": "ac0fa38d-d3ad-4dff-841d-4d98ee5017db" + }, + { + "__uuid__": "8e17dfc6-68d0-47fe-af06-d30dc2790a6b" + }, + { + "__uuid__": "e4faa04d-28f5-40b0-b1a5-99cd902e5fd6" + }, + { + "__uuid__": "da6a7cc1-9709-42f4-b6d0-17c1917a08a3" + }, + { + "__uuid__": "2cab337d-df23-476d-8a98-b5f115a52d04" + }, + { + "__uuid__": "504dd9c8-7850-44e8-a944-bbdb2260b18a" + }, + { + "__uuid__": "7e0a1e98-ee5a-446f-bec2-7d72b6916503" + } + ], + "playOnLoad": false, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 17 + }, + "_enabled": true, + "_materials": [], + "_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__": "6dcd5722-8ef9-47fd-9520-861d2713e274" + }, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__uuid__": "59bff7a2-23e1-4d69-bce7-afb37eae196a" + }, + "fileId": "45OnfvPXBMSb4XkS+kny9/", + "sync": false + }, { "__type__": "cc.PrefabInfo", "root": { @@ -917,10 +905,10 @@ "_enabled": true, "lastMovedAt": 0, "animNode": { - "__id__": 11 + "__id__": 8 }, "arrowTipNode": { - "__id__": 8 + "__id__": 5 }, "coordLabel": { "__id__": 3 diff --git a/frontend/assets/resources/prefabs/NpcCharacter.prefab b/frontend/assets/resources/prefabs/NpcCharacter.prefab new file mode 100644 index 0000000..3185579 --- /dev/null +++ b/frontend/assets/resources/prefabs/NpcCharacter.prefab @@ -0,0 +1,597 @@ +[ + { + "__type__": "cc.Prefab", + "_name": "", + "_objFlags": 0, + "_native": "", + "data": { + "__id__": 1 + }, + "optimizationPolicy": 0, + "asyncLoadAssets": false, + "readonly": false + }, + { + "__type__": "cc.Node", + "_name": "Root", + "_objFlags": 0, + "_parent": null, + "_children": [ + { + "__id__": 2 + }, + { + "__id__": 5 + }, + { + "__id__": 8 + } + ], + "_active": true, + "_components": [ + { + "__id__": 14 + }, + { + "__id__": 15 + } + ], + "_prefab": { + "__id__": 16 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 120, + "height": 120 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 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": 2, + "groupIndex": 2, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "CoordinateLabel", + "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 3 + } + ], + "_prefab": { + "__id__": 4 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 28.01, + "height": 15.12 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 45, + 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__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 2 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_useOriginalSize": false, + "_string": "(0, 0)", + "_N$string": "(0, 0)", + "_fontSize": 12, + "_lineHeight": 12, + "_enableWrapText": true, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 0, + "_N$cacheMode": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__uuid__": "4c12c853-b743-4c11-a452-e384834a1c18" + }, + "fileId": "5apzDmIE9IuaMOyF3z06sc", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "arrowTip", + "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 6 + } + ], + "_prefab": { + "__id__": 7 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 24, + "height": 24 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 3, + 60, + 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__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 5 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "a2170e4c-df31-41ef-be73-f4f605e75821" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": { + "__uuid__": "030d9286-e8a2-40cf-98f8-baf713f0b8c4" + }, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__uuid__": "4c12c853-b743-4c11-a452-e384834a1c18" + }, + "fileId": "e4mum5GwxNiZ0T8ouw95jJ", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "animNode", + "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [ + { + "__id__": 9 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 13 + }, + "_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, + 0, + 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__": "cc.Node", + "_name": "Monk", + "_objFlags": 0, + "_parent": { + "__id__": 8 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 10 + }, + { + "__id__": 11 + } + ], + "_prefab": { + "__id__": 12 + }, + "_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 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + -24, + 0, + 0, + 0, + 0, + 1, + 0.65, + 0.55, + 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__": 9 + }, + "_enabled": true, + "_defaultClip": null, + "_clips": [ + { + "__uuid__": "2d402c67-e47d-4de0-8a80-40bc12073ffc" + }, + { + "__uuid__": "18d10aad-93ee-44e8-9048-1f26c136492b" + }, + { + "__uuid__": "d044ab74-be6a-49a2-85ab-eba41922c2cd" + }, + { + "__uuid__": "488ad635-2683-4884-9e93-d1ee67bd0e49" + }, + { + "__uuid__": "53b0ae11-f77f-4c3a-9e6d-76159d135c2c" + }, + { + "__uuid__": "a4315723-e7b6-40e7-9a3c-bac959378b90" + }, + { + "__uuid__": "5035ddfe-ff75-4dff-a506-89cbb26220da" + }, + { + "__uuid__": "ac0fa38d-d3ad-4dff-841d-4d98ee5017db" + }, + { + "__uuid__": "8e17dfc6-68d0-47fe-af06-d30dc2790a6b" + }, + { + "__uuid__": "e4faa04d-28f5-40b0-b1a5-99cd902e5fd6" + }, + { + "__uuid__": "da6a7cc1-9709-42f4-b6d0-17c1917a08a3" + }, + { + "__uuid__": "2cab337d-df23-476d-8a98-b5f115a52d04" + }, + { + "__uuid__": "504dd9c8-7850-44e8-a944-bbdb2260b18a" + }, + { + "__uuid__": "7e0a1e98-ee5a-446f-bec2-7d72b6916503" + } + ], + "playOnLoad": false, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 9 + }, + "_enabled": true, + "_materials": [], + "_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__": "6dcd5722-8ef9-47fd-9520-861d2713e274" + }, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__uuid__": "4c12c853-b743-4c11-a452-e384834a1c18" + }, + "fileId": "c51nwF45ZA/LZDNZ0GKpTi", + "sync": false + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__uuid__": "4c12c853-b743-4c11-a452-e384834a1c18" + }, + "fileId": "7aN7Gcc/tBw5EGlTJVBj2+", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 1 + }, + "_enabled": true, + "_materials": [], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": null, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "" + }, + { + "__type__": "b74b05YDqZFRo4OkZRFZX8k", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 1 + }, + "_enabled": true, + "lastMovedAt": 0, + "animNode": { + "__id__": 8 + }, + "arrowTipNode": { + "__id__": 5 + }, + "coordLabel": { + "__id__": 3 + }, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__uuid__": "4c12c853-b743-4c11-a452-e384834a1c18" + }, + "fileId": "4cx75uwJJFa7U8QL187QCL", + "sync": false + } +] \ No newline at end of file diff --git a/frontend/assets/resources/prefabs/NpcCharacter.prefab.meta b/frontend/assets/resources/prefabs/NpcCharacter.prefab.meta new file mode 100644 index 0000000..b8f2cce --- /dev/null +++ b/frontend/assets/resources/prefabs/NpcCharacter.prefab.meta @@ -0,0 +1,8 @@ +{ + "ver": "1.2.5", + "uuid": "4c12c853-b743-4c11-a452-e384834a1c18", + "optimizationPolicy": "AUTO", + "asyncLoadAssets": false, + "readonly": false, + "subMetas": {} +} \ No newline at end of file diff --git a/frontend/assets/scenes/offline_map.fire b/frontend/assets/scenes/offline_map.fire index 257018c..f3b8770 100644 --- a/frontend/assets/scenes/offline_map.fire +++ b/frontend/assets/scenes/offline_map.fire @@ -461,7 +461,7 @@ "array": [ 0, 0, - 217.36724690689908, + 210.85914803043164, 0, 0, 0, diff --git a/frontend/assets/scripts/AttackingCharacter.js b/frontend/assets/scripts/AttackingCharacter.js index da57a40..5687760 100644 --- a/frontend/assets/scripts/AttackingCharacter.js +++ b/frontend/assets/scripts/AttackingCharacter.js @@ -14,6 +14,7 @@ window.ATK_CHARACTER_STATE = { GetUp1: [10, "GetUp1"], Atk2: [11, "Atk2"], Atk3: [12, "Atk3"], + Atk4: [13, "Atk4"], }; window.ATK_CHARACTER_STATE_ARR = []; diff --git a/frontend/assets/scripts/OfflineMap.js b/frontend/assets/scripts/OfflineMap.js index fe495e0..687cb68 100644 --- a/frontend/assets/scripts/OfflineMap.js +++ b/frontend/assets/scripts/OfflineMap.js @@ -129,7 +129,7 @@ cc.Class({ inAir: true, }), ], - speciesIdList: [1, 0], + speciesIdList: [4196, 0], }); self.selfPlayerInfo = { diff --git a/frontend/assets/scripts/TileCollisionManagerSingleton.js b/frontend/assets/scripts/TileCollisionManagerSingleton.js index 169b2fa..fc56496 100644 --- a/frontend/assets/scripts/TileCollisionManagerSingleton.js +++ b/frontend/assets/scripts/TileCollisionManagerSingleton.js @@ -110,6 +110,8 @@ TileCollisionManager.prototype.extractBoundaryObjects = function(withTiledMapNod let toRet = { playerStartingPositions: [], barriers: [], + npcStartingPositions: [], + npcPatrolCues: [], }; const tiledMapIns = withTiledMapNode.getComponent(cc.TiledMap); // This is a magic name. @@ -128,6 +130,38 @@ TileCollisionManager.prototype.extractBoundaryObjects = function(withTiledMapNod toRet.playerStartingPositions.push(wpos); } break; + case "NpcPatrolCue": + for (let j = 0; j < allObjects.length; ++j) { + const cccMaskedX = allObjects[j].x, + cccMaskedY = allObjects[j].y; + const origX = cccMaskedX, + origY = withTiledMapNode.getContentSize().height - cccMaskedY; + let wpos = this.continuousObjLayerOffsetToContinuousMapNodePos(withTiledMapNode, cc.v2(origX, origY)); + const cue = { + x: wpos.x, + y: wpos.y, + flAct: parseInt(allObjects[j].flAct), + frAct: parseInt(allObjects[j].frAct), + }; + toRet.npcPatrolCues.push(cue); + } + break; + case "NpcStartingPos": + for (let j = 0; j < allObjects.length; ++j) { + const cccMaskedX = allObjects[j].x, + cccMaskedY = allObjects[j].y; + const origX = cccMaskedX, + origY = withTiledMapNode.getContentSize().height - cccMaskedY; + let wpos = this.continuousObjLayerOffsetToContinuousMapNodePos(withTiledMapNode, cc.v2(origX, origY)); + const npc = { + x: wpos.x, + y: wpos.y, + speciesId: parseInt(allObjects[j].speciesId), + dirX: parseInt(allObjects[j].dirX), + }; + toRet.npcStartingPositions.push(npc); + } + break; case "Barrier": for (let j = 0; j < allObjects.length; ++j) { let object = allObjects[j]; @@ -205,30 +239,6 @@ TileCollisionManager.prototype.initMapNodeByTiledBoundaries = function(mapScript mapScriptIns.barrierColliders.push(newBarrierColliderIns); mapScriptIns.node.addChild(newBarrier); } - - const allLayers = tiledMapIns.getLayers(); - for (let layer of allLayers) { - const layerType = layer.getProperty("type"); - switch (layerType) { - case "barrier_and_shelter": - setLocalZOrder(layer.node, 3); - break; - default: - break; - } - } - - const allObjectGroups = tiledMapIns.getObjectGroups(); - for (let objectGroup of allObjectGroups) { - const objectGroupType = objectGroup.getProperty("type"); - switch (objectGroupType) { - case "barrier_and_shelter": - setLocalZOrder(objectGroup.node, 3); - break; - default: - break; - } - } } window.tileCollisionManager = new TileCollisionManager(); 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 474499d..81cfd95 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,6 +1214,8 @@ $root.protos = (function() { * @property {number|null} [activeSkillId] PlayerDownsync activeSkillId * @property {number|null} [activeSkillHit] PlayerDownsync activeSkillHit * @property {number|null} [framesInvinsible] PlayerDownsync framesInvinsible + * @property {number|null} [bulletTeamId] PlayerDownsync bulletTeamId + * @property {number|null} [chCollisionTeamId] PlayerDownsync chCollisionTeamId * @property {string|null} [name] PlayerDownsync name * @property {string|null} [displayName] PlayerDownsync displayName * @property {string|null} [avatar] PlayerDownsync avatar @@ -1418,6 +1420,22 @@ $root.protos = (function() { */ PlayerDownsync.prototype.framesInvinsible = 0; + /** + * PlayerDownsync bulletTeamId. + * @member {number} bulletTeamId + * @memberof protos.PlayerDownsync + * @instance + */ + PlayerDownsync.prototype.bulletTeamId = 0; + + /** + * PlayerDownsync chCollisionTeamId. + * @member {number} chCollisionTeamId + * @memberof protos.PlayerDownsync + * @instance + */ + PlayerDownsync.prototype.chCollisionTeamId = 0; + /** * PlayerDownsync name. * @member {string} name @@ -1512,6 +1530,10 @@ $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.bulletTeamId != null && Object.hasOwnProperty.call(message, "bulletTeamId")) + writer.uint32(/* id 24, wireType 0 =*/192).int32(message.bulletTeamId); + if (message.chCollisionTeamId != null && Object.hasOwnProperty.call(message, "chCollisionTeamId")) + writer.uint32(/* id 25, wireType 0 =*/200).int32(message.chCollisionTeamId); 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")) @@ -1644,6 +1666,14 @@ $root.protos = (function() { message.framesInvinsible = reader.int32(); break; } + case 24: { + message.bulletTeamId = reader.int32(); + break; + } + case 25: { + message.chCollisionTeamId = reader.int32(); + break; + } case 997: { message.name = reader.string(); break; @@ -1760,6 +1790,12 @@ $root.protos = (function() { if (message.framesInvinsible != null && message.hasOwnProperty("framesInvinsible")) if (!$util.isInteger(message.framesInvinsible)) return "framesInvinsible: integer expected"; + if (message.bulletTeamId != null && message.hasOwnProperty("bulletTeamId")) + if (!$util.isInteger(message.bulletTeamId)) + return "bulletTeamId: integer expected"; + if (message.chCollisionTeamId != null && message.hasOwnProperty("chCollisionTeamId")) + if (!$util.isInteger(message.chCollisionTeamId)) + return "chCollisionTeamId: integer expected"; if (message.name != null && message.hasOwnProperty("name")) if (!$util.isString(message.name)) return "name: string expected"; @@ -1830,6 +1866,10 @@ $root.protos = (function() { message.activeSkillHit = object.activeSkillHit | 0; if (object.framesInvinsible != null) message.framesInvinsible = object.framesInvinsible | 0; + if (object.bulletTeamId != null) + message.bulletTeamId = object.bulletTeamId | 0; + if (object.chCollisionTeamId != null) + message.chCollisionTeamId = object.chCollisionTeamId | 0; if (object.name != null) message.name = String(object.name); if (object.displayName != null) @@ -1876,6 +1916,8 @@ $root.protos = (function() { object.activeSkillId = 0; object.activeSkillHit = 0; object.framesInvinsible = 0; + object.bulletTeamId = 0; + object.chCollisionTeamId = 0; object.name = ""; object.displayName = ""; object.avatar = ""; @@ -1926,6 +1968,10 @@ $root.protos = (function() { object.activeSkillHit = message.activeSkillHit; if (message.framesInvinsible != null && message.hasOwnProperty("framesInvinsible")) object.framesInvinsible = message.framesInvinsible; + if (message.bulletTeamId != null && message.hasOwnProperty("bulletTeamId")) + object.bulletTeamId = message.bulletTeamId; + if (message.chCollisionTeamId != null && message.hasOwnProperty("chCollisionTeamId")) + object.chCollisionTeamId = message.chCollisionTeamId; 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 36853b3..119177c 100644 --- a/jsexport/battle/battle.go +++ b/jsexport/battle/battle.go @@ -64,6 +64,7 @@ const ( ATK_CHARACTER_STATE_ATK2 = int32(11) ATK_CHARACTER_STATE_ATK3 = int32(12) + ATK_CHARACTER_STATE_ATK4 = int32(13) ) var inAirSet = map[int32]bool{ diff --git a/jsexport/battle/characterConfig.go b/jsexport/battle/characterConfig.go index c8ab482..106c9e0 100644 --- a/jsexport/battle/characterConfig.go +++ b/jsexport/battle/characterConfig.go @@ -104,6 +104,49 @@ var Characters = map[int]*CharacterConfig{ } } + // By default no skill can be fired + return NO_SKILL + }, + }, + 4196: &CharacterConfig{ + SpeciesId: 4196, + SpeciesName: "Monk", + + InAirIdleFrameIdxTurningPoint: 42, + InAirIdleFrameIdxTurnedCycle: 2, + + LayDownFrames: int32(14), + LayDownFramesToRecover: int32(14), + + GetUpInvinsibleFrames: int32(8), + GetUpFramesToRecover: int32(30), + + Speed: int32(float64(1.0) * WORLD_TO_VIRTUAL_GRID_RATIO), + JumpingInitVelY: int32(float64(9) * WORLD_TO_VIRTUAL_GRID_RATIO), + + SkillMapper: func(patternId int, currPlayerDownsync *PlayerDownsync) int { + if 1 == patternId { + if 0 == currPlayerDownsync.FramesToRecover { + if currPlayerDownsync.InAir { + return 257 + } else { + return 10 + } + } 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 }, @@ -293,6 +336,123 @@ var skills = map[int]*Skill{ }, }, }, + 7: &Skill{ + RecoveryFrames: int32(30), + RecoveryFramesOnBlock: int32(30), + RecoveryFramesOnHit: int32(30), + ReleaseTriggerType: int32(1), + BoundChState: ATK_CHARACTER_STATE_ATK1, + Hits: []interface{}{ + &MeleeBullet{ + Bullet: Bullet{ + StartupFrames: int32(7), + ActiveFrames: int32(22), + HitStunFrames: int32(13), + BlockStunFrames: int32(9), + Damage: int32(5), + SelfLockVelX: int32(float64(0.05) * WORLD_TO_VIRTUAL_GRID_RATIO), + SelfLockVelY: NO_LOCK_VEL, + PushbackVelX: int32(float64(0.5) * WORLD_TO_VIRTUAL_GRID_RATIO), + PushbackVelY: int32(0), + HitboxOffsetX: int32(float64(12) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxOffsetY: int32(0), + HitboxSizeX: int32(float64(24) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxSizeY: int32(float64(32) * WORLD_TO_VIRTUAL_GRID_RATIO), + CancellableStFrame: int32(13), + CancellableEdFrame: int32(30), + + CancelTransit: map[int]int{ + 1: 2, + }, + // TODO: Use non-zero "selfLockVel" + }, + }, + }, + }, + 8: &Skill{ + RecoveryFrames: int32(36), + RecoveryFramesOnBlock: int32(36), + RecoveryFramesOnHit: int32(36), + ReleaseTriggerType: int32(1), + BoundChState: ATK_CHARACTER_STATE_ATK2, + Hits: []interface{}{ + &MeleeBullet{ + Bullet: Bullet{ + StartupFrames: int32(18), + ActiveFrames: int32(18), + HitStunFrames: int32(18), + BlockStunFrames: int32(9), + Damage: int32(5), + SelfLockVelX: int32(float64(0.1) * WORLD_TO_VIRTUAL_GRID_RATIO), + SelfLockVelY: NO_LOCK_VEL, + PushbackVelX: int32(float64(0.5) * WORLD_TO_VIRTUAL_GRID_RATIO), + PushbackVelY: int32(0), + HitboxOffsetX: int32(float64(18) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxOffsetY: int32(0), + HitboxSizeX: int32(float64(24) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxSizeY: int32(float64(32) * WORLD_TO_VIRTUAL_GRID_RATIO), + CancellableStFrame: int32(22), + CancellableEdFrame: int32(36), + CancelTransit: map[int]int{ + 1: 3, + }, + }, + }, + }, + }, + 9: &Skill{ + RecoveryFrames: int32(50), + RecoveryFramesOnBlock: int32(50), + RecoveryFramesOnHit: int32(50), + ReleaseTriggerType: int32(1), + BoundChState: ATK_CHARACTER_STATE_ATK3, + Hits: []interface{}{ + &MeleeBullet{ + Bullet: Bullet{ + StartupFrames: int32(15), + ActiveFrames: int32(30), + HitStunFrames: MAX_INT32, + BlockStunFrames: int32(9), + Damage: int32(10), + SelfLockVelX: int32(float64(0.5) * WORLD_TO_VIRTUAL_GRID_RATIO), + SelfLockVelY: int32(float64(5) * WORLD_TO_VIRTUAL_GRID_RATIO), + PushbackVelX: int32(float64(2) * WORLD_TO_VIRTUAL_GRID_RATIO), + PushbackVelY: int32(float64(7) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxOffsetX: int32(float64(32) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxOffsetY: int32(0), + HitboxSizeX: int32(float64(48) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxSizeY: int32(float64(32) * WORLD_TO_VIRTUAL_GRID_RATIO), + }, + }, + }, + }, + 10: &Skill{ + RecoveryFrames: int32(40), + RecoveryFramesOnBlock: int32(40), + RecoveryFramesOnHit: int32(40), + ReleaseTriggerType: int32(1), + BoundChState: ATK_CHARACTER_STATE_ATK4, + Hits: []interface{}{ + &FireballBullet{ + Speed: int32(float64(8) * WORLD_TO_VIRTUAL_GRID_RATIO), + Bullet: Bullet{ + StartupFrames: int32(15), + ActiveFrames: int32(30), + HitStunFrames: int32(15), + BlockStunFrames: int32(9), + Damage: int32(20), + SelfLockVelX: int32(float64(0.5) * WORLD_TO_VIRTUAL_GRID_RATIO), + SelfLockVelY: int32(float64(5) * WORLD_TO_VIRTUAL_GRID_RATIO), + PushbackVelX: int32(float64(2) * WORLD_TO_VIRTUAL_GRID_RATIO), + PushbackVelY: int32(float64(7) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxOffsetX: int32(float64(32) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxOffsetY: int32(0), + HitboxSizeX: int32(float64(48) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxSizeY: int32(float64(32) * WORLD_TO_VIRTUAL_GRID_RATIO), + }, + }, + }, + }, 255: &Skill{ RecoveryFrames: int32(30), RecoveryFramesOnBlock: int32(30), @@ -345,4 +505,30 @@ var skills = map[int]*Skill{ }, }, }, + 257: &Skill{ + RecoveryFrames: int32(30), + RecoveryFramesOnBlock: int32(30), + RecoveryFramesOnHit: int32(30), + ReleaseTriggerType: int32(1), + BoundChState: ATK_CHARACTER_STATE_INAIR_ATK1, + Hits: []interface{}{ + &MeleeBullet{ + Bullet: Bullet{ + StartupFrames: int32(3), + ActiveFrames: int32(20), + HitStunFrames: int32(18), + BlockStunFrames: int32(9), + Damage: int32(5), + SelfLockVelX: NO_LOCK_VEL, + SelfLockVelY: NO_LOCK_VEL, + PushbackVelX: int32(float64(0.5) * WORLD_TO_VIRTUAL_GRID_RATIO), + PushbackVelY: int32(0), + HitboxOffsetX: int32(float64(12) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxOffsetY: int32(0), + HitboxSizeX: int32(float64(32) * WORLD_TO_VIRTUAL_GRID_RATIO), + HitboxSizeY: int32(float64(24) * WORLD_TO_VIRTUAL_GRID_RATIO), + }, + }, + }, + }, } diff --git a/jsexport/battle/room_downsync_frame.go b/jsexport/battle/room_downsync_frame.go index 52f99fd..690b54d 100644 --- a/jsexport/battle/room_downsync_frame.go +++ b/jsexport/battle/room_downsync_frame.go @@ -38,6 +38,9 @@ type PlayerDownsync struct { ActiveSkillHit int32 FramesInvinsible int32 + + BulletTeamId int32 + ChCollisionTeamId int32 // not the same as "BulletTeamId", because even in the same team, we should allow inter-character collisions } type InputFrameDecoded struct { @@ -83,6 +86,8 @@ type Bullet struct { BlowUp bool CancelTransit map[int]int + + TeamId int32 } type MeleeBullet struct { @@ -126,3 +131,10 @@ type InputFrameDownsync struct { InputList []uint64 ConfirmedList uint64 } + +type NpcPatrolCue struct { + FlAct uint64 // Encoded input when collided with this cue & facing left + FrAct uint64 // Encoded input when collided with this cue & facing right + X float64 + Y float64 +} diff --git a/jsexport/main.go b/jsexport/main.go index 73c1ed8..7c4362f 100644 --- a/jsexport/main.go +++ b/jsexport/main.go @@ -42,32 +42,34 @@ func NewBarrierJs(boundary *Polygon2D) *js.Object { }) } -func NewPlayerDownsyncJs(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, framesToRecover, framesInChState, activeSkillId, activeSkillHit, framesInvinsible, speed, battleState, characterState, joinIndex, hp, maxHp, colliderRadius int32, inAir bool) *js.Object { +func NewPlayerDownsyncJs(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, framesToRecover, framesInChState, activeSkillId, activeSkillHit, framesInvinsible, speed, battleState, characterState, joinIndex, hp, maxHp, colliderRadius int32, inAir bool, bulletTeamId, chCollisionTeamId int32) *js.Object { 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, - FramesInvinsible: framesInvinsible, - 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, + BulletTeamId: bulletTeamId, + ChCollisionTeamId: chCollisionTeamId, }) } -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, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY int32, blowUp bool, teamId int32) *js.Object { return js.MakeWrapper(&MeleeBullet{ Bullet: Bullet{ OriginatedRenderFrameId: originatedRenderFrameId, @@ -93,10 +95,21 @@ func NewMeleeBulletJs(originatedRenderFrameId, offenderJoinIndex, startupFrames, HitboxSizeY: hitboxSizeY, BlowUp: blowUp, + + TeamId: teamId, }, }) } +func NewNpcPatrolCue(flAct, frAct uint64, x, y float64) *js.Object { + return js.MakeFullWrapper(&NpcPatrolCue{ + FlAct: flAct, + FrAct: frAct, + X: x, + Y: y, + }) +} + func NewRoomDownsyncFrameJs(id int32, playersArr []*PlayerDownsync, meleeBullets []*MeleeBullet) *js.Object { // [WARNING] Avoid using "pb.RoomDownsyncFrame" here, in practive "MakeFullWrapper" doesn't expose the public fields for a "protobuf struct" as expected and requires helper functions like "GetCollisionSpaceObjsJs". return js.MakeFullWrapper(&RoomDownsyncFrame{ @@ -157,6 +170,7 @@ func main() { "NewBarrierJs": NewBarrierJs, "NewPlayerDownsyncJs": NewPlayerDownsyncJs, "NewMeleeBulletJs": NewMeleeBulletJs, + "NewNpcPatrolCue": NewNpcPatrolCue, "NewRoomDownsyncFrameJs": NewRoomDownsyncFrameJs, "NewCollisionSpaceJs": NewCollisionSpaceJs, "NewInputFrameDownsync": NewInputFrameDownsync, From 823624d95ddca9d095b04ee059efc63775e87231 Mon Sep 17 00:00:00 2001 From: genxium Date: Tue, 10 Jan 2023 12:08:15 +0800 Subject: [PATCH 2/2] Implemented basic fireball collision. --- battle_srv/models/pb_type_convert.go | 43 +- battle_srv/models/room.go | 3 + battle_srv/protos/room_downsync_frame.pb.go | 552 +- frontend/assets/plugin_scripts/jsexport.js | 6391 +---------------- .../pbfiles/room_downsync_frame.proto | 52 +- frontend/assets/scenes/login.fire | 2 +- frontend/assets/scenes/offline_map.fire | 2 +- frontend/assets/scripts/Map.js | 50 +- frontend/assets/scripts/OfflineMap.js | 4 +- ...om_downsync_frame_proto_bundle.forcemsg.js | 929 ++- jsexport/battle/battle.go | 208 +- jsexport/battle/characterConfig.go | 12 +- jsexport/battle/room_downsync_frame.go | 19 +- jsexport/main.go | 54 +- 14 files changed, 1746 insertions(+), 6575 deletions(-) diff --git a/battle_srv/models/pb_type_convert.go b/battle_srv/models/pb_type_convert.go index 81bba92..d07b663 100644 --- a/battle_srv/models/pb_type_convert.go +++ b/battle_srv/models/pb_type_convert.go @@ -12,7 +12,9 @@ func toPbRoomDownsyncFrame(rdf *battle.RoomDownsyncFrame) *pb.RoomDownsyncFrame ret := &pb.RoomDownsyncFrame{ Id: rdf.Id, PlayersArr: make([]*pb.PlayerDownsync, len(rdf.PlayersArr), len(rdf.PlayersArr)), + BulletLocalIdCounter: rdf.BulletLocalIdCounter, MeleeBullets: make([]*pb.MeleeBullet, len(rdf.MeleeBullets), len(rdf.MeleeBullets)), + FireballBullets: make([]*pb.FireballBullet, len(rdf.FireballBullets), len(rdf.FireballBullets)), CountdownNanos: rdf.CountdownNanos, BackendUnconfirmedMask: rdf.BackendUnconfirmedMask, ShouldForceResync: rdf.ShouldForceResync, @@ -50,6 +52,7 @@ func toPbRoomDownsyncFrame(rdf *battle.RoomDownsyncFrame) *pb.RoomDownsyncFrame for i, last := range rdf.MeleeBullets { pbBullet := &pb.MeleeBullet{ + BulletLocalId: last.BulletLocalId, OriginatedRenderFrameId: last.OriginatedRenderFrameId, OffenderJoinIndex: last.OffenderJoinIndex, @@ -73,12 +76,50 @@ func toPbRoomDownsyncFrame(rdf *battle.RoomDownsyncFrame) *pb.RoomDownsyncFrame HitboxSizeY: last.HitboxSizeY, BlowUp: last.BlowUp, - TeamId: last.TeamId, } ret.MeleeBullets[i] = pbBullet } + for i, last := range rdf.FireballBullets { + pbBullet := &pb.FireballBullet{ + BulletLocalId: last.BulletLocalId, + OriginatedRenderFrameId: last.OriginatedRenderFrameId, + OffenderJoinIndex: last.OffenderJoinIndex, + + 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, + + SelfLockVelX: last.SelfLockVelX, + SelfLockVelY: last.SelfLockVelY, + + HitboxOffsetX: last.HitboxOffsetX, + HitboxOffsetY: last.HitboxOffsetY, + HitboxSizeX: last.HitboxSizeX, + HitboxSizeY: last.HitboxSizeY, + + BlowUp: last.BlowUp, + TeamId: last.TeamId, + + VirtualGridX: last.VirtualGridX, + VirtualGridY: last.VirtualGridY, + DirX: last.DirX, + DirY: last.DirY, + VelX: last.VelX, + VelY: last.VelY, + Speed: last.Speed, + } + ret.FireballBullets[i] = pbBullet + } + return ret } diff --git a/battle_srv/models/room.go b/battle_srv/models/room.go index 4fe3e7f..d6f7259 100644 --- a/battle_srv/models/room.go +++ b/battle_srv/models/room.go @@ -381,6 +381,9 @@ func (pR *Room) StartBattle() { for _, player := range pR.Players { speciesId := int(player.JoinIndex - 1) // FIXME: Hardcoded the values for now + if player.JoinIndex == 2 { + speciesId = 4096 + } chosenCh := battle.Characters[speciesId] pR.CharacterConfigsArr[player.JoinIndex-1] = chosenCh pR.SpeciesIdList[player.JoinIndex-1] = int32(speciesId) diff --git a/battle_srv/protos/room_downsync_frame.pb.go b/battle_srv/protos/room_downsync_frame.pb.go index ad70637..b2bbdb6 100644 --- a/battle_srv/protos/room_downsync_frame.pb.go +++ b/battle_srv/protos/room_downsync_frame.pb.go @@ -805,6 +805,8 @@ type MeleeBullet struct { 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"` + TeamId int32 `protobuf:"varint,19,opt,name=teamId,proto3" json:"teamId,omitempty"` + BulletLocalId int32 `protobuf:"varint,20,opt,name=bulletLocalId,proto3" json:"bulletLocalId,omitempty"` } func (x *MeleeBullet) Reset() { @@ -965,6 +967,275 @@ func (x *MeleeBullet) GetBlowUp() bool { return false } +func (x *MeleeBullet) GetTeamId() int32 { + if x != nil { + return x.TeamId + } + return 0 +} + +func (x *MeleeBullet) GetBulletLocalId() int32 { + if x != nil { + return x.BulletLocalId + } + return 0 +} + +type FireballBullet struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + 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"` + TeamId int32 `protobuf:"varint,19,opt,name=teamId,proto3" json:"teamId,omitempty"` + BulletLocalId int32 `protobuf:"varint,20,opt,name=bulletLocalId,proto3" json:"bulletLocalId,omitempty"` + VirtualGridX int32 `protobuf:"varint,999,opt,name=virtualGridX,proto3" json:"virtualGridX,omitempty"` + VirtualGridY int32 `protobuf:"varint,1000,opt,name=virtualGridY,proto3" json:"virtualGridY,omitempty"` + DirX int32 `protobuf:"varint,1001,opt,name=dirX,proto3" json:"dirX,omitempty"` + DirY int32 `protobuf:"varint,1002,opt,name=dirY,proto3" json:"dirY,omitempty"` + VelX int32 `protobuf:"varint,1003,opt,name=velX,proto3" json:"velX,omitempty"` + VelY int32 `protobuf:"varint,1004,opt,name=velY,proto3" json:"velY,omitempty"` + Speed int32 `protobuf:"varint,1005,opt,name=speed,proto3" json:"speed,omitempty"` +} + +func (x *FireballBullet) Reset() { + *x = FireballBullet{} + if protoimpl.UnsafeEnabled { + mi := &file_room_downsync_frame_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FireballBullet) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FireballBullet) ProtoMessage() {} + +func (x *FireballBullet) ProtoReflect() protoreflect.Message { + mi := &file_room_downsync_frame_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FireballBullet.ProtoReflect.Descriptor instead. +func (*FireballBullet) Descriptor() ([]byte, []int) { + return file_room_downsync_frame_proto_rawDescGZIP(), []int{9} +} + +func (x *FireballBullet) GetOriginatedRenderFrameId() int32 { + if x != nil { + return x.OriginatedRenderFrameId + } + return 0 +} + +func (x *FireballBullet) GetOffenderJoinIndex() int32 { + if x != nil { + return x.OffenderJoinIndex + } + return 0 +} + +func (x *FireballBullet) GetStartupFrames() int32 { + if x != nil { + return x.StartupFrames + } + return 0 +} + +func (x *FireballBullet) GetCancellableStFrame() int32 { + if x != nil { + return x.CancellableStFrame + } + return 0 +} + +func (x *FireballBullet) GetCancellableEdFrame() int32 { + if x != nil { + return x.CancellableEdFrame + } + return 0 +} + +func (x *FireballBullet) GetActiveFrames() int32 { + if x != nil { + return x.ActiveFrames + } + return 0 +} + +func (x *FireballBullet) GetHitStunFrames() int32 { + if x != nil { + return x.HitStunFrames + } + return 0 +} + +func (x *FireballBullet) GetBlockStunFrames() int32 { + if x != nil { + return x.BlockStunFrames + } + return 0 +} + +func (x *FireballBullet) GetPushbackVelX() int32 { + if x != nil { + return x.PushbackVelX + } + return 0 +} + +func (x *FireballBullet) GetPushbackVelY() int32 { + if x != nil { + return x.PushbackVelY + } + return 0 +} + +func (x *FireballBullet) GetDamage() int32 { + if x != nil { + return x.Damage + } + return 0 +} + +func (x *FireballBullet) GetSelfLockVelX() int32 { + if x != nil { + return x.SelfLockVelX + } + return 0 +} + +func (x *FireballBullet) GetSelfLockVelY() int32 { + if x != nil { + return x.SelfLockVelY + } + return 0 +} + +func (x *FireballBullet) GetHitboxOffsetX() int32 { + if x != nil { + return x.HitboxOffsetX + } + return 0 +} + +func (x *FireballBullet) GetHitboxOffsetY() int32 { + if x != nil { + return x.HitboxOffsetY + } + return 0 +} + +func (x *FireballBullet) GetHitboxSizeX() int32 { + if x != nil { + return x.HitboxSizeX + } + return 0 +} + +func (x *FireballBullet) GetHitboxSizeY() int32 { + if x != nil { + return x.HitboxSizeY + } + return 0 +} + +func (x *FireballBullet) GetBlowUp() bool { + if x != nil { + return x.BlowUp + } + return false +} + +func (x *FireballBullet) GetTeamId() int32 { + if x != nil { + return x.TeamId + } + return 0 +} + +func (x *FireballBullet) GetBulletLocalId() int32 { + if x != nil { + return x.BulletLocalId + } + return 0 +} + +func (x *FireballBullet) GetVirtualGridX() int32 { + if x != nil { + return x.VirtualGridX + } + return 0 +} + +func (x *FireballBullet) GetVirtualGridY() int32 { + if x != nil { + return x.VirtualGridY + } + return 0 +} + +func (x *FireballBullet) GetDirX() int32 { + if x != nil { + return x.DirX + } + return 0 +} + +func (x *FireballBullet) GetDirY() int32 { + if x != nil { + return x.DirY + } + return 0 +} + +func (x *FireballBullet) GetVelX() int32 { + if x != nil { + return x.VelX + } + return 0 +} + +func (x *FireballBullet) GetVelY() int32 { + if x != nil { + return x.VelY + } + return 0 +} + +func (x *FireballBullet) GetSpeed() int32 { + if x != nil { + return x.Speed + } + return 0 +} + type BattleColliderInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -983,13 +1254,13 @@ type BattleColliderInfo struct { 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"` + FrameDataLoggingEnabled bool `protobuf:"varint,1024,opt,name=frameDataLoggingEnabled,proto3" json:"frameDataLoggingEnabled,omitempty"` } func (x *BattleColliderInfo) Reset() { *x = BattleColliderInfo{} if protoimpl.UnsafeEnabled { - mi := &file_room_downsync_frame_proto_msgTypes[9] + mi := &file_room_downsync_frame_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1002,7 +1273,7 @@ func (x *BattleColliderInfo) String() string { func (*BattleColliderInfo) ProtoMessage() {} func (x *BattleColliderInfo) ProtoReflect() protoreflect.Message { - mi := &file_room_downsync_frame_proto_msgTypes[9] + mi := &file_room_downsync_frame_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1015,7 +1286,7 @@ func (x *BattleColliderInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use BattleColliderInfo.ProtoReflect.Descriptor instead. func (*BattleColliderInfo) Descriptor() ([]byte, []int) { - return file_room_downsync_frame_proto_rawDescGZIP(), []int{9} + return file_room_downsync_frame_proto_rawDescGZIP(), []int{10} } func (x *BattleColliderInfo) GetStageName() string { @@ -1124,16 +1395,18 @@ type RoomDownsyncFrame struct { Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` PlayersArr []*PlayerDownsync `protobuf:"bytes,2,rep,name=playersArr,proto3" json:"playersArr,omitempty"` CountdownNanos int64 `protobuf:"varint,3,opt,name=countdownNanos,proto3" json:"countdownNanos,omitempty"` - MeleeBullets []*MeleeBullet `protobuf:"bytes,4,rep,name=meleeBullets,proto3" json:"meleeBullets,omitempty"` // I don't know how to mimic inheritance/composition in protobuf by far, thus using an array for each type of bullet as a compromise - BackendUnconfirmedMask uint64 `protobuf:"varint,5,opt,name=backendUnconfirmedMask,proto3" json:"backendUnconfirmedMask,omitempty"` // Indexed by "joinIndex", same compression concern as stated in InputFrameDownsync - ShouldForceResync bool `protobuf:"varint,6,opt,name=shouldForceResync,proto3" json:"shouldForceResync,omitempty"` - SpeciesIdList []int32 `protobuf:"varint,7,rep,packed,name=speciesIdList,proto3" json:"speciesIdList,omitempty"` + 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 + FireballBullets []*FireballBullet `protobuf:"bytes,5,rep,name=fireballBullets,proto3" json:"fireballBullets,omitempty"` + BackendUnconfirmedMask uint64 `protobuf:"varint,1024,opt,name=backendUnconfirmedMask,proto3" json:"backendUnconfirmedMask,omitempty"` // Indexed by "joinIndex", same compression concern as stated in InputFrameDownsync + ShouldForceResync bool `protobuf:"varint,1025,opt,name=shouldForceResync,proto3" json:"shouldForceResync,omitempty"` + SpeciesIdList []int32 `protobuf:"varint,1026,rep,packed,name=speciesIdList,proto3" json:"speciesIdList,omitempty"` + BulletLocalIdCounter int32 `protobuf:"varint,1027,opt,name=bulletLocalIdCounter,proto3" json:"bulletLocalIdCounter,omitempty"` } func (x *RoomDownsyncFrame) Reset() { *x = RoomDownsyncFrame{} if protoimpl.UnsafeEnabled { - mi := &file_room_downsync_frame_proto_msgTypes[10] + mi := &file_room_downsync_frame_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1146,7 +1419,7 @@ func (x *RoomDownsyncFrame) String() string { func (*RoomDownsyncFrame) ProtoMessage() {} func (x *RoomDownsyncFrame) ProtoReflect() protoreflect.Message { - mi := &file_room_downsync_frame_proto_msgTypes[10] + mi := &file_room_downsync_frame_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1159,7 +1432,7 @@ func (x *RoomDownsyncFrame) ProtoReflect() protoreflect.Message { // Deprecated: Use RoomDownsyncFrame.ProtoReflect.Descriptor instead. func (*RoomDownsyncFrame) Descriptor() ([]byte, []int) { - return file_room_downsync_frame_proto_rawDescGZIP(), []int{10} + return file_room_downsync_frame_proto_rawDescGZIP(), []int{11} } func (x *RoomDownsyncFrame) GetId() int32 { @@ -1190,6 +1463,13 @@ func (x *RoomDownsyncFrame) GetMeleeBullets() []*MeleeBullet { return nil } +func (x *RoomDownsyncFrame) GetFireballBullets() []*FireballBullet { + if x != nil { + return x.FireballBullets + } + return nil +} + func (x *RoomDownsyncFrame) GetBackendUnconfirmedMask() uint64 { if x != nil { return x.BackendUnconfirmedMask @@ -1211,6 +1491,13 @@ func (x *RoomDownsyncFrame) GetSpeciesIdList() []int32 { return nil } +func (x *RoomDownsyncFrame) GetBulletLocalIdCounter() int32 { + if x != nil { + return x.BulletLocalIdCounter + } + return 0 +} + var File_room_downsync_frame_proto protoreflect.FileDescriptor var file_room_downsync_frame_proto_rawDesc = []byte{ @@ -1347,7 +1634,7 @@ var file_room_downsync_frame_proto_rawDesc = []byte{ 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, + 0x46, 0x6f, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x22, 0xfd, 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, @@ -1391,73 +1678,144 @@ var file_room_downsync_frame_proto_rawDesc = []byte{ 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, + 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x62, 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x12, 0x16, 0x0a, + 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x18, 0x13, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x74, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x62, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x4c, + 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x62, 0x75, + 0x6c, 0x6c, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x22, 0xb5, 0x07, 0x0a, 0x0e, + 0x46, 0x69, 0x72, 0x65, 0x62, 0x61, 0x6c, 0x6c, 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, + 0x12, 0x16, 0x0a, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x18, 0x13, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x62, 0x75, 0x6c, 0x6c, + 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0d, 0x62, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x23, + 0x0a, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x58, 0x18, 0xe7, + 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, + 0x69, 0x64, 0x58, 0x12, 0x23, 0x0a, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, + 0x69, 0x64, 0x59, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x76, 0x69, 0x72, 0x74, + 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x59, 0x12, 0x13, 0x0a, 0x04, 0x64, 0x69, 0x72, 0x58, + 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x64, 0x69, 0x72, 0x58, 0x12, 0x13, 0x0a, + 0x04, 0x64, 0x69, 0x72, 0x59, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x64, 0x69, + 0x72, 0x59, 0x12, 0x13, 0x0a, 0x04, 0x76, 0x65, 0x6c, 0x58, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x04, 0x76, 0x65, 0x6c, 0x58, 0x12, 0x13, 0x0a, 0x04, 0x76, 0x65, 0x6c, 0x59, 0x18, + 0xec, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x76, 0x65, 0x6c, 0x59, 0x12, 0x15, 0x0a, 0x05, + 0x73, 0x70, 0x65, 0x65, 0x64, 0x18, 0xed, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x70, + 0x65, 0x65, 0x64, 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, - 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, + 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, + 0x80, 0x08, 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, + 0xc2, 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, 0x40, + 0x0a, 0x0f, 0x66, 0x69, 0x72, 0x65, 0x62, 0x61, 0x6c, 0x6c, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, + 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, + 0x2e, 0x46, 0x69, 0x72, 0x65, 0x62, 0x61, 0x6c, 0x6c, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x52, + 0x0f, 0x66, 0x69, 0x72, 0x65, 0x62, 0x61, 0x6c, 0x6c, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x73, + 0x12, 0x37, 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, 0x80, 0x08, 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, 0x2d, 0x0a, 0x11, 0x73, 0x68, 0x6f, + 0x75, 0x6c, 0x64, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x81, + 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x46, 0x6f, 0x72, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x25, 0x0a, 0x0d, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x65, 0x73, 0x49, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x82, 0x08, 0x20, 0x03, 0x28, 0x05, + 0x52, 0x0d, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x49, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, + 0x33, 0x0a, 0x14, 0x62, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x83, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, + 0x62, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 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, } @@ -1474,7 +1832,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, 11) +var file_room_downsync_frame_proto_msgTypes = make([]protoimpl.MessageInfo, 12) var file_room_downsync_frame_proto_goTypes = []interface{}{ (*PlayerDownsync)(nil), // 0: protos.PlayerDownsync (*InputFrameDecoded)(nil), // 1: protos.InputFrameDecoded @@ -1485,23 +1843,25 @@ var file_room_downsync_frame_proto_goTypes = []interface{}{ (*WsResp)(nil), // 6: protos.WsResp (*InputsBufferSnapshot)(nil), // 7: protos.InputsBufferSnapshot (*MeleeBullet)(nil), // 8: protos.MeleeBullet - (*BattleColliderInfo)(nil), // 9: protos.BattleColliderInfo - (*RoomDownsyncFrame)(nil), // 10: protos.RoomDownsyncFrame + (*FireballBullet)(nil), // 9: protos.FireballBullet + (*BattleColliderInfo)(nil), // 10: protos.BattleColliderInfo + (*RoomDownsyncFrame)(nil), // 11: protos.RoomDownsyncFrame } var file_room_downsync_frame_proto_depIdxs = []int32{ 2, // 0: protos.WsReq.inputFrameUpsyncBatch:type_name -> protos.InputFrameUpsync 4, // 1: protos.WsReq.hb:type_name -> protos.HeartbeatUpsync - 10, // 2: protos.WsResp.rdf:type_name -> protos.RoomDownsyncFrame + 11, // 2: protos.WsResp.rdf:type_name -> protos.RoomDownsyncFrame 3, // 3: protos.WsResp.inputFrameDownsyncBatch:type_name -> protos.InputFrameDownsync - 9, // 4: protos.WsResp.bciFrame:type_name -> protos.BattleColliderInfo + 10, // 4: protos.WsResp.bciFrame:type_name -> protos.BattleColliderInfo 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 - 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 + 9, // 8: protos.RoomDownsyncFrame.fireballBullets:type_name -> protos.FireballBullet + 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 } func init() { file_room_downsync_frame_proto_init() } @@ -1619,7 +1979,7 @@ func file_room_downsync_frame_proto_init() { } } file_room_downsync_frame_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BattleColliderInfo); i { + switch v := v.(*FireballBullet); i { case 0: return &v.state case 1: @@ -1631,6 +1991,18 @@ func file_room_downsync_frame_proto_init() { } } file_room_downsync_frame_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BattleColliderInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_room_downsync_frame_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RoomDownsyncFrame); i { case 0: return &v.state @@ -1649,7 +2021,7 @@ func file_room_downsync_frame_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_room_downsync_frame_proto_rawDesc, NumEnums: 0, - NumMessages: 11, + NumMessages: 12, NumExtensions: 0, NumServices: 0, }, diff --git a/frontend/assets/plugin_scripts/jsexport.js b/frontend/assets/plugin_scripts/jsexport.js index 1e4416e..5088366 100644 --- a/frontend/assets/plugin_scripts/jsexport.js +++ b/frontend/assets/plugin_scripts/jsexport.js @@ -2,6388 +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, NpcPatrolCue, 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_, BulletTeamId_, ChCollisionTeamId_) { - 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.BulletTeamId = 0; - this.ChCollisionTeamId = 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.BulletTeamId = BulletTeamId_; - this.ChCollisionTeamId = ChCollisionTeamId_; - }); - 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_, CancelTransit_, TeamId_) { - 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; - this.TeamId = 0; - 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_; - this.TeamId = TeamId_; - }); - 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, 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, false, false, 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_; - }); - 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_; - }); - NpcPatrolCue = $pkg.NpcPatrolCue = $newType(0, $kindStruct, "battle.NpcPatrolCue", true, "jsexport/battle", true, function(FlAct_, FrAct_, X_, Y_) { - this.$val = this; - if (arguments.length === 0) { - this.FlAct = new $Uint64(0, 0); - this.FrAct = new $Uint64(0, 0); - this.X = 0; - this.Y = 0; - return; - } - this.FlAct = FlAct_; - this.FrAct = FrAct_; - this.X = X_; - this.Y = Y_; - }); - 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, _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, _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$12, _tuple$13, _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, existent$3, existent$4, 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, 0, 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; - } - _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); - } - if (!((-1 === v.Bullet.SelfLockVelY))) { - hasLockVel = true; - thatPlayerInNextFrame.VelY = v.Bullet.SelfLockVelY; - } - 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.VelY = 0; - thatPlayerInNextFrame$2.VelX = 0; - _tuple$7 = (_entry$1 = nonAttackingSet[$Int32.keyFor(thatPlayerInNextFrame$2.CharacterState)], _entry$1 !== undefined ? [_entry$1.v, true] : [false, false]); - existent$1 = _tuple$7[1]; - if (existent$1) { - 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$8 = VirtualGridToWorldPos(halfColliderWidthDiff, halfColliderHeightDiff); - halfColliderWorldHeightDiff = _tuple$8[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; - } - } - } else { - _tuple$9 = (_entry$2 = nonAttackingSet[$Int32.keyFor(thatPlayerInNextFrame$2.CharacterState)], _entry$2 !== undefined ? [_entry$2.v, true] : [false, false]); - existent$2 = _tuple$9[1]; - if (existent$2) { - 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$10 = (_entry$3 = invinsibleSet[$Int32.keyFor(t.CharacterState)], _entry$3 !== undefined ? [_entry$3.v, true] : [false, false]); - existent$3 = _tuple$10[1]; - if (existent$3) { - _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$11 = _r$5; - overlapped$1 = _tuple$11[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$12 = 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$12[0]; - thatPlayerInNextFrame$3.VirtualGridY = _tuple$12[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$13 = (_entry$4 = nonAttackingSet[$Int32.keyFor(thatPlayerInNextFrame$3.CharacterState)], _entry$4 !== undefined ? [_entry$4.v, true] : [false, false]); - existent$4 = _tuple$13[1]; - if (existent$4) { - 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, _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, _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$12, _tuple$13, _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, existent$3, existent$4, 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: "BulletTeamId", name: "BulletTeamId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "ChCollisionTeamId", name: "ChCollisionTeamId", 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: ""}, {prop: "TeamId", name: "TeamId", 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: ""}]); - 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: ""}]); - NpcPatrolCue.init("", [{prop: "FlAct", name: "FlAct", embedded: false, exported: true, typ: $Uint64, tag: ""}, {prop: "FrAct", name: "FrAct", embedded: false, exported: true, typ: $Uint64, tag: ""}, {prop: "X", name: "X", embedded: false, exported: true, typ: $Float64, tag: ""}, {prop: "Y", name: "Y", embedded: false, exported: true, typ: $Float64, tag: ""}]); - RingBuffer.init("", [{prop: "Ed", name: "Ed", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "St", name: "St", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "EdFrameId", name: "EdFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "StFrameId", name: "StFrameId", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "N", name: "N", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Cnt", name: "Cnt", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Eles", name: "Eles", embedded: false, exported: true, typ: sliceType$2, tag: ""}]); - SkillMapperType.init([$Int, ptrType$5], [$Int], false); - CharacterConfig.init("", [{prop: "SpeciesId", name: "SpeciesId", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "SpeciesName", name: "SpeciesName", embedded: false, exported: true, typ: $String, tag: ""}, {prop: "InAirIdleFrameIdxTurningPoint", name: "InAirIdleFrameIdxTurningPoint", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "InAirIdleFrameIdxTurnedCycle", name: "InAirIdleFrameIdxTurnedCycle", embedded: false, exported: true, typ: $Int, tag: ""}, {prop: "LayDownFrames", name: "LayDownFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "LayDownFramesToRecover", name: "LayDownFramesToRecover", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "GetUpInvinsibleFrames", name: "GetUpInvinsibleFrames", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "GetUpFramesToRecover", name: "GetUpFramesToRecover", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "Speed", name: "Speed", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "JumpingInitVelY", name: "JumpingInitVelY", embedded: false, exported: true, typ: $Int32, tag: ""}, {prop: "SkillMapper", name: "SkillMapper", embedded: false, exported: true, typ: SkillMapperType, tag: ""}]); - 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, 1200, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 2 }]), 0))])) }, { k: 2, v: new Skill.ptr(0, 36, 36, 36, 1, 11, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 18, 22, 36, 18, 18, 9, 50, 0, 5, 10, -1, 1800, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 3 }]), 0))])) }, { k: 3, v: new Skill.ptr(0, 50, 50, 50, 1, 12, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 15, 0, 0, 30, 999999999, 9, 200, 700, 10, 50, 500, 3200, 0, 4800, 3200, true, false, 0))])) }, { k: 4, v: new Skill.ptr(0, 30, 30, 30, 1, 2, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 7, 13, 30, 22, 13, 9, 50, 0, 5, 5, -1, 1200, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 5 }]), 0))])) }, { k: 5, v: new Skill.ptr(0, 36, 36, 36, 1, 11, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 18, 22, 36, 18, 18, 9, 50, 0, 5, 10, -1, 1800, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 6 }]), 0))])) }, { k: 6, v: new Skill.ptr(0, 45, 45, 45, 1, 12, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 15, 0, 0, 28, 999999999, 9, 200, 700, 10, -10, -1, 2400, 0, 3200, 3200, true, false, 0))])) }, { k: 7, v: new Skill.ptr(0, 30, 30, 30, 1, 2, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 7, 13, 30, 22, 13, 9, 50, 0, 5, 5, -1, 1200, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 2 }]), 0))])) }, { k: 8, 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, 1800, 0, 2400, 3200, false, $makeMap($Int.keyFor, [{ k: 1, v: 3 }]), 0))])) }, { k: 9, v: new Skill.ptr(0, 50, 50, 50, 1, 12, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 15, 0, 0, 30, 999999999, 9, 200, 700, 10, 50, 500, 3200, 0, 4800, 3200, false, false, 0))])) }, { k: 10, v: new Skill.ptr(0, 40, 40, 40, 1, 13, new sliceType$2([new FireballBullet.ptr(0, 0, 0, 0, 0, 0, 800, new Bullet.ptr(0, 0, 15, 0, 0, 30, 15, 9, 200, 700, 20, 50, 500, 3200, 0, 4800, 3200, false, false, 0))])) }, { k: 255, v: new Skill.ptr(0, 30, 30, 30, 1, 6, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 3, 0, 0, 20, 18, 9, 50, 0, 5, -1, -1, 1200, 0, 3200, 2400, false, false, 0))])) }, { k: 256, v: new Skill.ptr(0, 20, 20, 20, 1, 6, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 3, 0, 0, 10, 15, 9, 50, 0, 5, -1, -1, 1200, 0, 3200, 2400, false, false, 0))])) }, { k: 257, v: new Skill.ptr(0, 30, 30, 30, 1, 6, new sliceType$2([new MeleeBullet.ptr(new Bullet.ptr(0, 0, 3, 0, 0, 20, 18, 9, 50, 0, 5, -1, -1, 1200, 0, 3200, 2400, false, false, 0))])) }]); - $pkg.Characters = $makeMap($Int.keyFor, [{ k: 0, v: new CharacterConfig.ptr(0, "MonkGirl", 11, 1, 16, 16, 10, 27, 120, 800, (function(patternId, currPlayerDownsync) { - 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; - })) }, { k: 4196, v: new CharacterConfig.ptr(4196, "Monk", 42, 2, 14, 14, 8, 30, 100, 900, (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 257; - } else { - return 10; - } - } 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, funcType$11, ptrType$7, funcType$12, funcType$13, funcType$14, funcType$15, sliceType$6, funcType$16, ptrType$8, ptrType$9, ptrType$10, mapType, sliceType$7, funcType$17, funcType$18, funcType$19, mapType$1, NewInputFrameDownsync, NewRingBufferJs, NewCollisionSpaceJs, NewVec2DJs, NewPolygon2DJs, NewBarrierJs, NewPlayerDownsyncJs, NewMeleeBulletJs, NewNpcPatrolCue, 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, $Bool, $Int32, $Int32], [ptrType$5], false); - funcType$4 = $funcType([$Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Int32, $Bool, $Int32], [ptrType$5], false); - funcType$5 = $funcType([$Uint64, $Uint64, $Float64, $Float64], [ptrType$5], false); - funcType$6 = $funcType([$Int32, sliceType$2, sliceType$3], [ptrType$5], false); - funcType$7 = $funcType([$Int, $Int, $Int, $Int], [ptrType$5], false); - funcType$8 = $funcType([$Int32, sliceType, $Uint64], [ptrType$5], false); - funcType$9 = $funcType([$Int32], [ptrType$5], false); - funcType$10 = $funcType([$Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $emptyInterface, $String], [ptrType$5], false); - funcType$11 = $funcType([ptrType$1, $Float64, $Float64, $emptyInterface, $String], [ptrType$5], false); - ptrType$7 = $ptrType(resolv.Space); - funcType$12 = $funcType([ptrType$7], [sliceType$5], false); - funcType$13 = $funcType([$Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64, $Float64], [$Float64, $Float64], false); - funcType$14 = $funcType([$Float64, $Float64], [$Int32, $Int32], false); - funcType$15 = $funcType([$Int32, $Int32], [$Float64, $Float64], false); - sliceType$6 = $sliceType($Int); - funcType$16 = $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$17 = $funcType([ptrType$8, ptrType$9, ptrType$7, mapType, $Float64, $Float64, sliceType$7], [ptrType$5], false); - funcType$18 = $funcType([$Int32], [$Int32], false); - funcType$19 = $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, speed, battleState, characterState, joinIndex, hp, maxHp, colliderRadius, inAir, bulletTeamId, chCollisionTeamId) { - var activeSkillHit, activeSkillId, battleState, bulletTeamId, chCollisionTeamId, characterState, colliderRadius, dirX, dirY, framesInChState, framesInvinsible, framesToRecover, hp, id, inAir, joinIndex, maxHp, speed, velX, velY, virtualGridX, virtualGridY; - return js.MakeWrapper(new battle.PlayerDownsync.ptr(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, speed, battleState, joinIndex, colliderRadius, false, 0, 0, framesToRecover, framesInChState, hp, maxHp, characterState, inAir, activeSkillId, activeSkillHit, framesInvinsible, bulletTeamId, chCollisionTeamId)); - }; - $pkg.NewPlayerDownsyncJs = NewPlayerDownsyncJs; - NewMeleeBulletJs = function(originatedRenderFrameId, offenderJoinIndex, startupFrames, cancellableStFrame, cancellableEdFrame, activeFrames, hitStunFrames, blockStunFrames, pushbackVelX, pushbackVelY, damage, selfLockVelX, selfLockVelY, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY, blowUp, teamId) { - var activeFrames, blockStunFrames, blowUp, cancellableEdFrame, cancellableStFrame, damage, hitStunFrames, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY, offenderJoinIndex, originatedRenderFrameId, pushbackVelX, pushbackVelY, selfLockVelX, selfLockVelY, startupFrames, teamId; - 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, teamId))); - }; - $pkg.NewMeleeBulletJs = NewMeleeBulletJs; - NewNpcPatrolCue = function(flAct, frAct, x, y) { - var {$24r, _r, flAct, frAct, x, y, $s, $r, $c} = $restore(this, {flAct, frAct, x, y}); - /* */ $s = $s || 0; s: while (true) { switch ($s) { case 0: - _r = js.MakeFullWrapper(new battle.NpcPatrolCue.ptr(flAct, frAct, 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: NewNpcPatrolCue, $c: true, $r, $24r, _r, flAct, frAct, x, y, $s};return $f; - }; - $pkg.NewNpcPatrolCue = NewNpcPatrolCue; - 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: "NewNpcPatrolCue", v: new funcType$5(NewNpcPatrolCue) }, { k: "NewRoomDownsyncFrameJs", v: new funcType$6(NewRoomDownsyncFrameJs) }, { k: "NewCollisionSpaceJs", v: new funcType$7(NewCollisionSpaceJs) }, { k: "NewInputFrameDownsync", v: new funcType$8(NewInputFrameDownsync) }, { k: "NewRingBufferJs", v: new funcType$9(NewRingBufferJs) }, { k: "GenerateRectColliderJs", v: new funcType$10(GenerateRectColliderJs) }, { k: "GenerateConvexPolygonColliderJs", v: new funcType$11(GenerateConvexPolygonColliderJs) }, { k: "GetCollisionSpaceObjsJs", v: new funcType$12(GetCollisionSpaceObjsJs) }, { k: "WorldToPolygonColliderBLPos", v: new funcType$13(battle.WorldToPolygonColliderBLPos) }, { k: "PolygonColliderBLToWorldPos", v: new funcType$13(battle.PolygonColliderBLToWorldPos) }, { k: "WorldToVirtualGridPos", v: new funcType$14(battle.WorldToVirtualGridPos) }, { k: "VirtualGridToWorldPos", v: new funcType$15(battle.VirtualGridToWorldPos) }, { k: "GetCharacterConfigsOrderedByJoinIndex", v: new funcType$16(GetCharacterConfigsOrderedByJoinIndex) }, { k: "ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs", v: new funcType$17(ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs) }, { k: "ConvertToDelayedInputFrameId", v: new funcType$18(battle.ConvertToDelayedInputFrameId) }, { k: "ConvertToNoDelayInputFrameId", v: new funcType$18(battle.ConvertToNoDelayInputFrameId) }, { k: "ConvertToFirstUsedRenderFrameId", v: new funcType$18(battle.ConvertToFirstUsedRenderFrameId) }, { k: "ConvertToLastUsedRenderFrameId", v: new funcType$18(battle.ConvertToLastUsedRenderFrameId) }, { k: "ShouldGenerateInputFrameUpsync", v: new funcType$19(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,P,R,S,AF,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,BX,T,U,V,W,X,Q,Z,AA,AB,AC,AD,AE,AG,AH,AI,AJ,AK,AL,AM,AN,AP,AQ,AR,AS,AT,AU,AV;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=BT.nil;this.Points=BU.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_,BulletTeamId_,ChCollisionTeamId_){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.BulletTeamId=0;this.ChCollisionTeamId=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.BulletTeamId=BulletTeamId_;this.ChCollisionTeamId=ChCollisionTeamId_;});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=BV.nil;return;}this.Boundary=Boundary_;});I=$pkg.Bullet=$newType(0,$kindStruct,"battle.Bullet",true,"jsexport/battle",true,function(BulletLocalId_,OriginatedRenderFrameId_,OffenderJoinIndex_,StartupFrames_,CancellableStFrame_,CancellableEdFrame_,ActiveFrames_,HitStunFrames_,BlockStunFrames_,PushbackVelX_,PushbackVelY_,Damage_,SelfLockVelX_,SelfLockVelY_,HitboxOffsetX_,HitboxOffsetY_,HitboxSizeX_,HitboxSizeY_,BlowUp_,CancelTransit_,TeamId_){this.$val=this;if(arguments.length===0){this.BulletLocalId=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;this.TeamId=0;return;}this.BulletLocalId=BulletLocalId_;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_;this.TeamId=TeamId_;});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,false,false,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,false,false,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.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=AY.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_,BulletLocalIdCounter_){this.$val=this;if(arguments.length===0){this.Id=0;this.PlayersArr=BL.nil;this.CountdownNanos=new $Int64(0,0);this.MeleeBullets=BM.nil;this.FireballBullets=BN.nil;this.BackendUnconfirmedMask=new $Uint64(0,0);this.ShouldForceResync=false;this.BulletLocalIdCounter=0;return;}this.Id=Id_;this.PlayersArr=PlayersArr_;this.CountdownNanos=CountdownNanos_;this.MeleeBullets=MeleeBullets_;this.FireballBullets=FireballBullets_;this.BackendUnconfirmedMask=BackendUnconfirmedMask_;this.ShouldForceResync=ShouldForceResync_;this.BulletLocalIdCounter=BulletLocalIdCounter_;});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=BK.nil;this.ConfirmedList=new $Uint64(0,0);return;}this.InputFrameId=InputFrameId_;this.InputList=InputList_;this.ConfirmedList=ConfirmedList_;});O=$pkg.NpcPatrolCue=$newType(0,$kindStruct,"battle.NpcPatrolCue",true,"jsexport/battle",true,function(FlAct_,FrAct_,X_,Y_){this.$val=this;if(arguments.length===0){this.FlAct=new $Uint64(0,0);this.FrAct=new $Uint64(0,0);this.X=0;this.Y=0;return;}this.FlAct=FlAct_;this.FrAct=FrAct_;this.X=X_;this.Y=Y_;});P=$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=AY.nil;return;}this.Ed=Ed_;this.St=St_;this.EdFrameId=EdFrameId_;this.StFrameId=StFrameId_;this.N=N_;this.Cnt=Cnt_;this.Eles=Eles_;});R=$pkg.SkillMapperType=$newType(4,$kindFunc,"battle.SkillMapperType",true,"jsexport/battle",true,null);S=$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_;});AF=$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_;});AW=$sliceType($Int32);AX=$sliceType(AW);AY=$sliceType($emptyInterface);AZ=$ptrType(L);BA=$ptrType(J);BB=$ptrType(AF);BC=$sliceType(C);BD=$sliceType($String);BE=$ptrType(B.Collision);BF=$ptrType(BC);BG=$ptrType(E);BH=$ptrType(K);BI=$ptrType(B.ConvexPolygon);BJ=$ptrType(N);BK=$sliceType($Uint64);BL=$sliceType(BG);BM=$sliceType(BA);BN=$sliceType(BH);BO=$sliceType(BF);BP=$sliceType($Bool);BQ=$ptrType(B.Object);BR=$sliceType(BQ);BS=$sliceType($Float64);BT=$ptrType(C);BU=$sliceType(BT);BV=$ptrType(D);BW=$mapType($Int,$Int);BX=$ptrType(P);Q=function(a){var a;return new P.ptr(0,0,0,0,a,0,$makeSlice(AY,a));};$pkg.NewRingBuffer=Q;P.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;}};P.prototype.Put=function(a){return this.$val.Put(a);};P.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;};P.prototype.Pop=function(){return this.$val.Pop();};P.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]));};P.prototype.GetByOffset=function(a){return this.$val.GetByOffset(a);};P.ptr.prototype.GetByFrameId=function(a){var a,b;b=this;if(a>=b.EdFrameId||a>0);};P.prototype.GetByFrameId=function(a){return this.$val.GetByFrameId(a);};P.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=AA;AB=function(a){var a;return(a>>2>>0);};$pkg.ConvertToNoDelayInputFrameId=AB;AC=function(a){var a;return(((a<<2>>0))+8>>0);};$pkg.ConvertToFirstUsedRenderFrameId=AC;AD=function(a){var a;return(((((a<<2>>0))+8>>0)+4>>0)-1>>0);};$pkg.ConvertToLastUsedRenderFrameId=AD;AE=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);};AG=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 AF.ptr(0,0,0,true,true,new B.Vector([0,0]));i=AH(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,BB.nil];}return;}}catch(err){$err=err;$s=-1;return[false,0,0,BB.nil];}finally{$callDeferred($deferred,$err);if($curGoroutine.asleep){var $f={$blk:AG,$c:true,$r,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,$s,$deferred};return $f;}}};$pkg.CalcPushbacks=AG;AH=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(!(BB.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(AI(a,b,r.Unit(),c)){return false;}q++;}}if(1=s.$length)?($throwRuntimeError("index out of range"),undefined):s.$array[s.$offset+t]);if(AI(a,b,u.Unit(),c)){return false;}t++;}}return true;};AI=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;};AJ=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=AJ;AK=function(a,b){var a,b,c,d;c=(a)*0.01;d=(b)*0.01;return[c,d];};$pkg.VirtualGridToWorldPos=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.WorldToPolygonColliderBLPos=AL;AM=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=AM;AN=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=AM(a,b,c,d,e,f,g,h,i,j);l=k[0];m=k[1];return AJ(l,m);};$pkg.PolygonColliderBLToVirtualGridPos=AN;AP=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(BC,0,10);g=b.Check(0,0,new BD([]));if(BE.nil===g){$s=-1;return(f.$ptr||(f.$ptr=new BF(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,BG,true)[1]){}else if($assertType(l,BA,true)[1]||$assertType(l,BH,true)[1]){}else{k=true;}if(!k){i++;$s=1;continue;}m=$assertType(j.Shape,BI);o=AG(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 BF(function(){return this.$target[0];},function($v){this.$target[0]=$v;},f)));}return;}var $f={$blk:AP,$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;};AQ=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=AA(c.Id);f=AA(c.Id-1>>0);if(0>=e){return[-2,false,0,0];}g=(h=V[$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),BJ).InputList;k=BK.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(!(BK.nil===k)){y=AE((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=U[$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];};AR=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,gq,gr,gs,gt,gu,gv,gw,gx,gy,gz,h,ha,hb,hc,hd,he,hf,hg,hh,hi,hj,hk,hl,hm,hn,ho,hp,hq,hr,hs,ht,hu,hv,hw,hx,hy,hz,i,ia,ib,ic,id,ie,ig,ih,ii,ij,ik,il,im,io,ip,iq,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(BL,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,0,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(BM,0,b.MeleeBullets.$length);o=$makeSlice(BN,0,b.FireballBullets.$length);p=$makeSlice(BC,h);q=$makeSlice(BO,h);r=$makeSlice(BP,h);s=b.BulletLocalIdCounter;t=b.PlayersArr;u=0;case 1:if(!(u=t.$length)?($throwRuntimeError("index out of range"),undefined):t.$array[t.$offset+u]);((x<0||x>=r.$length)?($throwRuntimeError("index out of range"),undefined):r.$array[r.$offset+x]=false);z=((x<0||x>=g.$length)?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+x]);aa=((x<0||x>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+x]);ab=AQ(y,aa,b,a);ac=ab[0];ad=ab[1];ae=ab[2];af=ab[3];if(ad){aa.VelY=(z.JumpingInitVelY);((x<0||x>=r.$length)?($throwRuntimeError("index out of range"),undefined):r.$array[r.$offset+x]=true);}ag=y.JoinIndex;ah=z.SkillMapper(ac,y);$s=3;case 3:if($c){$c=false;ah=ah.$blk();}if(ah&&ah.$blk!==undefined){break s;}ai=ah;aj=(ak=T[$Int.keyFor(ai)],ak!==undefined?[ak.v,true]:[AZ.nil,false]);al=aj[0];am=aj[1];if(am){aa.ActiveSkillId=((ai>>0));aa.ActiveSkillHit=0;aa.FramesToRecover=al.RecoveryFrames;an=1;if(0>aa.DirX){an=-an;}ao=false;ap=(aq=al.Hits,ar=aa.ActiveSkillHit,((ar<0||ar>=aq.$length)?($throwRuntimeError("index out of range"),undefined):aq.$array[aq.$offset+ar]));if($assertType(ap,BA,true)[1]){as=ap.$val;v[0]=$clone(as,J);v[0].Bullet.BulletLocalId=s;s=s+(1)>>0;v[0].Bullet.OriginatedRenderFrameId=b.Id;v[0].Bullet.OffenderJoinIndex=ag;n=$append(n,v[0]);if(!((-1===as.Bullet.SelfLockVelX))){ao=true;aa.VelX=$imul(an,as.Bullet.SelfLockVelX);}if(!((-1===as.Bullet.SelfLockVelY))){ao=true;aa.VelY=as.Bullet.SelfLockVelY;}}else if($assertType(ap,BH,true)[1]){at=ap.$val;w[0]=$clone(at,K);w[0].Bullet.BulletLocalId=s;s=s+(1)>>0;au=1;if(0>aa.DirX){au=-au;}av=y.VirtualGridX+($imul(au,w[0].Bullet.HitboxOffsetX))>>0;aw=y.VirtualGridY;w[0].VirtualGridX=av;w[0].VirtualGridY=aw;w[0].Bullet.OriginatedRenderFrameId=b.Id;w[0].Bullet.OffenderJoinIndex=ag;w[0].VelX=$imul(w[0].Speed,au);w[0].VelY=0;o=$append(o,w[0]);if(!((-1===at.Bullet.SelfLockVelX))){ao=true;aa.VelX=$imul(au,at.Bullet.SelfLockVelX);}if(!((-1===at.Bullet.SelfLockVelY))){ao=true;aa.VelY=at.Bullet.SelfLockVelY;}}if(false===ao&&false===y.InAir){aa.VelX=0;}aa.CharacterState=al.BoundChState;u++;$s=1;continue;}if(0===y.FramesToRecover){if(!((0===ae))||!((0===af))){ax=ae;ay=af;aa.DirX=ax;aa.DirY=ay;aa.VelX=$imul(ae,y.Speed);aa.CharacterState=1;}else{aa.CharacterState=0;aa.VelX=0;}}u++;$s=1;continue;case 2:az=$makeSlice(BR,b.PlayersArr.$length,b.PlayersArr.$length);ba=b.PlayersArr;bb=0;case 4:if(!(bb=ba.$length)?($throwRuntimeError("index out of range"),undefined):ba.$array[ba.$offset+bb]);be=bd.JoinIndex;bf=0;bg=0;(bh=be-1>>0,((bh<0||bh>=p.$length)?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+bh])).X=bf;(bi=be-1>>0,((bi<0||bi>=p.$length)?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+bi])).Y=bg;bj=((bc<0||bc>=g.$length)?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+bc]);bk=bd.VirtualGridX+bd.VelX>>0;bl=bd.VirtualGridY+bd.VelY>>0;bm=bk;bn=bl;if(((bc<0||bc>=r.$length)?($throwRuntimeError("index out of range"),undefined):r.$array[r.$offset+bc])){bn=bn+(bj.JumpingInitVelY)>>0;}bo=AK(bm,bn);bp=bo[0];bq=bo[1];br=$imul(bd.ColliderRadius,2);bs=$imul(bd.ColliderRadius,4);bt=br;bu=bs;bv=bd.CharacterState;if(bv===(9)){bw=$imul(bd.ColliderRadius,4);bx=$imul(bd.ColliderRadius,2);bt=bw;bu=bx;}else if((bv===(8))||(bv===(4))||(bv===(5))){by=$imul(bd.ColliderRadius,2);bz=$imul(bd.ColliderRadius,2);bt=by;bu=bz;}ca=AK(bt,bu);cb=ca[0];cc=ca[1];cd=AS(bp,bq,cb,cc,0.1,0.1,0.1,0.1,e,f,bd,"Player");$s=6;case 6:if($c){$c=false;cd=cd.$blk();}if(cd&&cd.$blk!==undefined){break s;}ce=cd;((bc<0||bc>=az.$length)?($throwRuntimeError("index out of range"),undefined):az.$array[az.$offset+bc]=ce);$r=c.Add(new BR([ce]));$s=7;case 7:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}cf=((bc<0||bc>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+bc]);if(bd.InAir){cf.VelX=cf.VelX+(0)>>0;cf.VelY=cf.VelY+(-50)>>0;}bb++;$s=4;continue;case 5:cg=$makeSlice(BR,0,b.MeleeBullets.$length);ch=b.MeleeBullets;ci=0;case 8:if(!(ci=ch.$length)?($throwRuntimeError("index out of range"),undefined):ch.$array[ch.$offset+ci]);if(((cj.Bullet.OriginatedRenderFrameId+cj.Bullet.StartupFrames>>0)<=b.Id)&&(((cj.Bullet.OriginatedRenderFrameId+cj.Bullet.StartupFrames>>0)+cj.Bullet.ActiveFrames>>0)>b.Id)){$s=10;continue;}if(((cj.Bullet.OriginatedRenderFrameId+cj.Bullet.StartupFrames>>0)+cj.Bullet.ActiveFrames>>0)>b.Id){$s=11;continue;}$s=12;continue;case 10:cm=(ck=b.PlayersArr,cl=cj.Bullet.OffenderJoinIndex-1>>0,((cl<0||cl>=ck.$length)?($throwRuntimeError("index out of range"),undefined):ck.$array[ck.$offset+cl]));cn=1;if(0>cm.DirX){cn=-cn;}co=AK(cm.VirtualGridX+($imul(cn,cj.Bullet.HitboxOffsetX))>>0,cm.VirtualGridY);cp=co[0];cq=co[1];cr=AK(cj.Bullet.HitboxSizeX,cj.Bullet.HitboxSizeY);cs=cr[0];ct=cr[1];cu=AS(cp,cq,cs,ct,0.1,0.1,0.1,0.1,e,f,cj,"MeleeBullet");$s=13;case 13:if($c){$c=false;cu=cu.$blk();}if(cu&&cu.$blk!==undefined){break s;}cv=cu;$r=c.Add(new BR([cv]));$s=14;case 14:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}cg=$append(cg,cv);$s=12;continue;case 11:n=$append(n,cj);case 12:ci++;$s=8;continue;case 9:cw=b.FireballBullets;cx=0;case 15:if(!(cx=cw.$length)?($throwRuntimeError("index out of range"),undefined):cw.$array[cw.$offset+cx]);if(((cy.Bullet.OriginatedRenderFrameId+cy.Bullet.StartupFrames>>0)>0)+cy.Bullet.ActiveFrames>>0)>b.Id)){$s=17;continue;}if(((cy.Bullet.OriginatedRenderFrameId+cy.Bullet.StartupFrames>>0)+cy.Bullet.ActiveFrames>>0)>b.Id){$s=18;continue;}$s=19;continue;case 17:cz=AK(cy.VirtualGridX,cy.VirtualGridY);da=cz[0];db=cz[1];dc=AK(cy.Bullet.HitboxSizeX,cy.Bullet.HitboxSizeY);dd=dc[0];de=dc[1];df=AS(da,db,dd,de,0.1,0.1,0.1,0.1,e,f,cy,"FireballBullet");$s=20;case 20:if($c){$c=false;df=df.$blk();}if(df&&df.$blk!==undefined){break s;}dg=df;$r=c.Add(new BR([dg]));$s=21;case 21:if($c){$c=false;$r=$r.$blk();}if($r&&$r.$blk!==undefined){break s;}cg=$append(cg,dg);$s=19;continue;case 18:o=$append(o,cy);case 19:cx++;$s=15;continue;case 16:dh=b.PlayersArr;di=0;case 22:if(!(di=dh.$length)?($throwRuntimeError("index out of range"),undefined):dh.$array[dh.$offset+di]);dl=dk.JoinIndex;dm=((dj<0||dj>=az.$length)?($throwRuntimeError("index out of range"),undefined):az.$array[az.$offset+dj]);dn=$assertType(dm.Shape,BI);dq=AP(dl,dm,dn,0.1,(dp=dl-1>>0,((dp<0||dp>=p.$length)?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+dp])));$s=24;case 24:if($c){$c=false;dq=dq.$blk();}if(dq&&dq.$blk!==undefined){break s;}(dr=dl-1>>0,((dr<0||dr>=q.$length)?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+dr]=dq));ds=((dj<0||dj>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+dj]);dt=((dj<0||dj>=g.$length)?($throwRuntimeError("index out of range"),undefined):g.$array[g.$offset+dj]);du=false;dv=dm.Check(0,0,new BD([]));if(!(BE.nil===dv)){$s=25;continue;}$s=26;continue;case 25:dw=dv.Objects;dx=0;case 27:if(!(dx=dw.$length)?($throwRuntimeError("index out of range"),undefined):dw.$array[dw.$offset+dx]);dz=false;ea=false;eb=false;ec=dz;ed=ea;ee=eb;ef=dy.Data;if($assertType(ef,BG,true)[1]){ed=true;}else if($assertType(ef,BA,true)[1]||$assertType(ef,BH,true)[1]){ee=true;}else{ec=true;}if(ee){dx++;$s=27;continue;}eg=$assertType(dy.Shape,BI);ei=AG(0,0,dn,eg);$s=29;case 29:if($c){$c=false;ei=ei.$blk();}if(ei&&ei.$blk!==undefined){break s;}eh=ei;ej=eh[0];ek=eh[1];el=eh[2];em=eh[3];if(!ej){dx++;$s=27;continue;}en=em.OverlapX*0+em.OverlapY*-1;if(ed){eo=(em.Overlap-0.2)*em.OverlapX;ep=(em.Overlap-0.2)*em.OverlapY;ek=eo;el=ep;}eq=(er=dl-1>>0,((er<0||er>=q.$length)?($throwRuntimeError("index out of range"),undefined):q.$array[q.$offset+er])).$get();es=0;while(true){if(!(es=eq.$length)?($throwRuntimeError("index out of range"),undefined):eq.$array[eq.$offset+es]),C);eu=ek*et.X+el*et.Y;if(ec||(ed&&0>eu)){ek=ek-(eu*et.X);el=el-(eu*et.Y);}es++;}ev=dl-1>>0;((ev<0||ev>=p.$length)?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+ev]).X=((ev<0||ev>=p.$length)?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+ev]).X+(ek);ew=dl-1>>0;((ew<0||ew>=p.$length)?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+ew]).Y=((ew<0||ew>=p.$length)?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+ew]).Y+(el);if(0.5=dk.VelY){ds.VelY=0;ds.VelX=0;ex=(ey=X[$Int32.keyFor(ds.CharacterState)],ey!==undefined?[ey.v,true]:[false,false]);ez=ex[1];if(ez){if(8===ds.CharacterState){ds.CharacterState=9;ds.FramesToRecover=dt.LayDownFramesToRecover;}else{fa=0;fb=dk.ColliderRadius;fc=fa;fd=fb;fe=AK(fc,fd);ff=fe[1];fg=dl-1>>0;((fg<0||fg>=p.$length)?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+fg]).Y=((fg<0||fg>=p.$length)?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+fg]).Y-(ff);ds.CharacterState=0;}}}else{fh=(fi=X[$Int32.keyFor(ds.CharacterState)],fi!==undefined?[fi.v,true]:[false,false]);fj=fh[1];if(fj){if(9===ds.CharacterState){if(0===ds.FramesToRecover){ds.CharacterState=10;ds.FramesToRecover=dt.GetUpFramesToRecover;}}else if(10===ds.CharacterState){if(0===ds.FramesToRecover){ds.CharacterState=0;ds.FramesInvinsible=dt.GetUpInvinsibleFrames;}}}}}di++;$s=22;continue;case 23:fk=cg;fl=0;case 30:if(!(fl=fk.$length)?($throwRuntimeError("index out of range"),undefined):fk.$array[fk.$offset+fl]);fn=fm.Check(0,0,new BD([]));fm.Space.Remove(new BR([fm]));fo=true;if(!(BE.nil===fn)){$s=32;continue;}$s=33;continue;case 32:fp=fm.Data;if($assertType(fp,BA,true)[1]){$s=34;continue;}if($assertType(fp,BH,true)[1]){$s=35;continue;}$s=36;continue;case 34:fq=fp.$val;fs=$assertType(fm.Shape,BI);fv=(ft=b.PlayersArr,fu=fq.Bullet.OffenderJoinIndex-1>>0,((fu<0||fu>=ft.$length)?($throwRuntimeError("index out of range"),undefined):ft.$array[ft.$offset+fu]));fw=fn.Objects;fx=0;case 37:if(!(fx=fw.$length)?($throwRuntimeError("index out of range"),undefined):fw.$array[fw.$offset+fx]);fz=$assertType(fy.Shape,BI);ga=fy.Data;if($assertType(ga,BG,true)[1]){$s=39;continue;}$s=40;continue;case 39:gb=ga.$val;if(fq.Bullet.OffenderJoinIndex===gb.JoinIndex){fx++;$s=37;continue;}ge=AG(0,0,fs,fz);$s=42;case 42:if($c){$c=false;ge=ge.$blk();}if(ge&&ge.$blk!==undefined){break s;}gd=ge;gf=gd[0];if(!gf){fx++;$s=37;continue;}fo=false;gg=(gh=W[$Int32.keyFor(gb.CharacterState)],gh!==undefined?[gh.v,true]:[false,false]);gi=gg[1];if(gi){fx++;$s=37;continue;}if(0fv.DirX){gj=-gj;}gk=$imul(gj,fq.Bullet.PushbackVelX);gl=fq.Bullet.PushbackVelY;gm=gk;gn=gl;gp=(go=gb.JoinIndex-1>>0,((go<0||go>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+go]));gp.VelX=gm;gp.VelY=gn;if(fq.Bullet.BlowUp){gp.CharacterState=8;}else{gp.CharacterState=3;}gr=(gq=gb.JoinIndex-1>>0,((gq<0||gq>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+gq])).FramesToRecover;if(fq.Bullet.HitStunFrames>gr){gp.FramesToRecover=fq.Bullet.HitStunFrames;}$s=41;continue;case 40:gc=ga;fo=false;case 41:fx++;$s=37;continue;case 38:$s=36;continue;case 35:fr=fp.$val;gs=$assertType(fm.Shape,BI);gv=(gt=b.PlayersArr,gu=fr.Bullet.OffenderJoinIndex-1>>0,((gu<0||gu>=gt.$length)?($throwRuntimeError("index out of range"),undefined):gt.$array[gt.$offset+gu]));gw=fn.Objects;gx=0;case 43:if(!(gx=gw.$length)?($throwRuntimeError("index out of range"),undefined):gw.$array[gw.$offset+gx]);gz=$assertType(gy.Shape,BI);ha=gy.Data;if($assertType(ha,BG,true)[1]){$s=45;continue;}$s=46;continue;case 45:hb=ha.$val;if(fr.Bullet.OffenderJoinIndex===hb.JoinIndex){gx++;$s=43;continue;}he=AG(0,0,gs,gz);$s=48;case 48:if($c){$c=false;he=he.$blk();}if(he&&he.$blk!==undefined){break s;}hd=he;hf=hd[0];if(!hf){gx++;$s=43;continue;}fo=false;hg=(hh=W[$Int32.keyFor(hb.CharacterState)],hh!==undefined?[hh.v,true]:[false,false]);hi=hg[1];if(hi){gx++;$s=43;continue;}if(0gv.DirX){hj=-hj;}hk=$imul(hj,fr.Bullet.PushbackVelX);hl=fr.Bullet.PushbackVelY;hm=hk;hn=hl;hp=(ho=hb.JoinIndex-1>>0,((ho<0||ho>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+ho]));hp.VelX=hm;hp.VelY=hn;if(fr.Bullet.BlowUp){hp.CharacterState=8;}else{hp.CharacterState=3;}hr=(hq=hb.JoinIndex-1>>0,((hq<0||hq>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+hq])).FramesToRecover;if(fr.Bullet.HitStunFrames>hr){hp.FramesToRecover=fr.Bullet.HitStunFrames;}$s=47;continue;case 46:hc=ha;fo=false;case 47:gx++;$s=43;continue;case 44:case 36:case 33:if(fo){hs=fm.Data;if($assertType(hs,BA,true)[1]){ht=hs.$val;n=$append(n,ht);}else if($assertType(hs,BH,true)[1]){hu=hs.$val;hv=hu.VirtualGridX+hu.VelX>>0;hw=hu.VirtualGridY+hu.VelY>>0;hu.VirtualGridX=hv;hu.VirtualGridY=hw;o=$append(o,hu);}}fl++;$s=30;continue;case 31:hx=b.PlayersArr;hy=0;while(true){if(!(hy=hx.$length)?($throwRuntimeError("index out of range"),undefined):hx.$array[hx.$offset+hy]);ib=ia.JoinIndex;ic=((hz<0||hz>=az.$length)?($throwRuntimeError("index out of range"),undefined):az.$array[az.$offset+hz]);id=((hz<0||hz>=i.$length)?($throwRuntimeError("index out of range"),undefined):i.$array[i.$offset+hz]);ie=AN(ic.X-(ig=ib-1>>0,((ig<0||ig>=p.$length)?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+ig])).X,ic.Y-(ih=ib-1>>0,((ih<0||ih>=p.$length)?($throwRuntimeError("index out of range"),undefined):p.$array[p.$offset+ih])).Y,ic.W*0.5,ic.H*0.5,0,0,0,0,e,f);id.VirtualGridX=ie[0];id.VirtualGridY=ie[1];if(id.InAir){ii=id.CharacterState;ij=ii;if((ij===(0))||(ij===(1))){if(((hz<0||hz>=r.$length)?($throwRuntimeError("index out of range"),undefined):r.$array[r.$offset+hz])||(5===ia.CharacterState)){id.CharacterState=5;}else{id.CharacterState=4;}}else if(ij===(2)){id.CharacterState=6;}else if(ij===(3)){id.CharacterState=7;}}if(!((id.CharacterState===ia.CharacterState))){id.FramesInChState=0;}ik=(il=X[$Int32.keyFor(id.CharacterState)],il!==undefined?[il.v,true]:[false,false]);im=ik[1];if(im){id.ActiveSkillId=-1;id.ActiveSkillHit=-1;}hy++;}io=az;ip=0;while(true){if(!(ip=io.$length)?($throwRuntimeError("index out of range"),undefined):io.$array[io.$offset+ip]);iq.Space.Remove(new BR([iq]));ip++;}$s=-1;return new M.ptr(b.Id+1>>0,i,new $Int64(0,0),n,o,new $Uint64(0,0),false,0);}return;}var $f={$blk:AR,$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,gq,gr,gs,gt,gu,gv,gw,gx,gy,gz,h,ha,hb,hc,hd,he,hf,hg,hh,hi,hj,hk,hl,hm,hn,ho,hp,hq,hr,hs,ht,hu,hv,hw,hx,hy,hz,i,ia,ib,ic,id,ie,ig,ih,ii,ij,ik,il,im,io,ip,iq,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,$s};return $f;};$pkg.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame=AR;AS=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=AL(a,b,c*0.5,d*0.5,e,f,g,h,i,j);n=m[0];o=m[1];p=AT(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:AS,$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=AS;AT=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 BD([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:AT,$c:true,$r,a,b,c,d,e,f,g,h,$s};return $f;};AU=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=AV(a);g=0;h=0;i=g;j=h;k=B.NewConvexPolygon(BS.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 BS([v.X,v.Y]));t=t+(1)>>0;}w=B.NewObject(f.Anchor.X+b,f.Anchor.Y+c,i,j,new BD([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:AU,$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=AU;AV=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=AV;BX.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:BT,tag:""},{prop:"Points",name:"Points",embedded:false,exported:true,typ:BU,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:""},{prop:"BulletTeamId",name:"BulletTeamId",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"ChCollisionTeamId",name:"ChCollisionTeamId",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:BV,tag:""}]);I.init("",[{prop:"BulletLocalId",name:"BulletLocalId",embedded:false,exported:true,typ:$Int32,tag:""},{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:BW,tag:""},{prop:"TeamId",name:"TeamId",embedded:false,exported:true,typ:$Int32,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:AY,tag:""}]);M.init("",[{prop:"Id",name:"Id",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"PlayersArr",name:"PlayersArr",embedded:false,exported:true,typ:BL,tag:""},{prop:"CountdownNanos",name:"CountdownNanos",embedded:false,exported:true,typ:$Int64,tag:""},{prop:"MeleeBullets",name:"MeleeBullets",embedded:false,exported:true,typ:BM,tag:""},{prop:"FireballBullets",name:"FireballBullets",embedded:false,exported:true,typ:BN,tag:""},{prop:"BackendUnconfirmedMask",name:"BackendUnconfirmedMask",embedded:false,exported:true,typ:$Uint64,tag:""},{prop:"ShouldForceResync",name:"ShouldForceResync",embedded:false,exported:true,typ:$Bool,tag:""},{prop:"BulletLocalIdCounter",name:"BulletLocalIdCounter",embedded:false,exported:true,typ:$Int32,tag:""}]);N.init("",[{prop:"InputFrameId",name:"InputFrameId",embedded:false,exported:true,typ:$Int32,tag:""},{prop:"InputList",name:"InputList",embedded:false,exported:true,typ:BK,tag:""},{prop:"ConfirmedList",name:"ConfirmedList",embedded:false,exported:true,typ:$Uint64,tag:""}]);O.init("",[{prop:"FlAct",name:"FlAct",embedded:false,exported:true,typ:$Uint64,tag:""},{prop:"FrAct",name:"FrAct",embedded:false,exported:true,typ:$Uint64,tag:""},{prop:"X",name:"X",embedded:false,exported:true,typ:$Float64,tag:""},{prop:"Y",name:"Y",embedded:false,exported:true,typ:$Float64,tag:""}]);P.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:AY,tag:""}]);R.init([$Int,BG],[$Int],false);S.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:R,tag:""}]);AF.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 AX([new AW([0,0]),new AW([0,2]),new AW([0,-2]),new AW([2,0]),new AW([-2,0]),new AW([1,1]),new AW([-1,-1]),new AW([1,-1]),new AW([-1,1])]);T=$makeMap($Int.keyFor,[{k:1,v:new L.ptr(0,30,30,30,1,2,new AY([new J.ptr(new I.ptr(0,0,0,7,13,30,22,13,9,50,0,5,5,-1,1200,0,2400,3200,false,$makeMap($Int.keyFor,[{k:1,v:2}]),0))]))},{k:2,v:new L.ptr(0,36,36,36,1,11,new AY([new J.ptr(new I.ptr(0,0,0,18,22,36,18,18,9,50,0,5,10,-1,1800,0,2400,3200,false,$makeMap($Int.keyFor,[{k:1,v:3}]),0))]))},{k:3,v:new L.ptr(0,50,50,50,1,12,new AY([new J.ptr(new I.ptr(0,0,0,15,0,0,30,999999999,9,200,700,10,50,500,3200,0,4800,3200,true,false,0))]))},{k:4,v:new L.ptr(0,30,30,30,1,2,new AY([new J.ptr(new I.ptr(0,0,0,7,13,30,22,13,9,50,0,5,5,-1,1200,0,2400,3200,false,$makeMap($Int.keyFor,[{k:1,v:5}]),0))]))},{k:5,v:new L.ptr(0,36,36,36,1,11,new AY([new J.ptr(new I.ptr(0,0,0,18,22,36,18,18,9,50,0,5,10,-1,1800,0,2400,3200,false,$makeMap($Int.keyFor,[{k:1,v:6}]),0))]))},{k:6,v:new L.ptr(0,45,45,45,1,12,new AY([new J.ptr(new I.ptr(0,0,0,15,0,0,28,999999999,9,200,700,10,-10,-1,2400,0,3200,3200,true,false,0))]))},{k:7,v:new L.ptr(0,30,30,30,1,2,new AY([new J.ptr(new I.ptr(0,0,0,7,13,30,22,13,9,50,0,5,5,-1,1200,0,2400,3200,false,$makeMap($Int.keyFor,[{k:1,v:2}]),0))]))},{k:8,v:new L.ptr(0,36,36,36,1,11,new AY([new J.ptr(new I.ptr(0,0,0,18,22,36,18,18,9,50,0,5,10,-1,1800,0,2400,3200,false,$makeMap($Int.keyFor,[{k:1,v:3}]),0))]))},{k:9,v:new L.ptr(0,50,50,50,1,12,new AY([new J.ptr(new I.ptr(0,0,0,15,0,0,30,999999999,9,200,700,10,50,500,3200,0,4800,3200,false,false,0))]))},{k:10,v:new L.ptr(0,40,40,40,1,13,new AY([new K.ptr(0,0,0,0,0,0,800,new I.ptr(0,0,0,15,0,0,999999999,15,9,200,0,20,-1,-1,3200,0,4800,3200,false,false,0))]))},{k:255,v:new L.ptr(0,30,30,30,1,6,new AY([new J.ptr(new I.ptr(0,0,0,3,0,0,20,18,9,50,0,5,-1,-1,1200,0,3200,2400,false,false,0))]))},{k:256,v:new L.ptr(0,20,20,20,1,6,new AY([new J.ptr(new I.ptr(0,0,0,3,0,0,10,15,9,50,0,5,-1,-1,1200,0,3200,2400,false,false,0))]))},{k:257,v:new L.ptr(0,30,30,30,1,6,new AY([new J.ptr(new I.ptr(0,0,0,3,0,0,20,18,9,50,0,5,-1,-1,1200,0,3200,2400,false,false,0))]))}]);$pkg.Characters=$makeMap($Int.keyFor,[{k:0,v:new S.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=T[$Int.keyFor(((b.ActiveSkillId>>0)))],d!==undefined?[d.v,true]:[AZ.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,BA,true)[1]){j=g.$val;if(j.Bullet.CancellableStFrame<=b.FramesInChState&&b.FramesInChState>0)))],d!==undefined?[d.v,true]:[AZ.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,BA,true)[1]){j=g.$val;if(j.Bullet.CancellableStFrame<=b.FramesInChState&&b.FramesInChState>0)))],d!==undefined?[d.v,true]:[AZ.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,BA,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:O,$c:true,$r,a,b,c,d,e,f,g,$s};return $f;};$pkg.GetCollisionSpaceObjsJs=O;P=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: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.GenerateRectColliderJs=P;Q=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:Q,$c:true,$r,a,b,c,d,e,f,g,h,$s};return $f;};$pkg.GenerateConvexPolygonColliderJs=Q;R=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(AF,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:AG.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:R,$c:true,$r,a,b,c,d,e,f,g,h,$s};return $f;};$pkg.GetCharacterConfigsOrderedByJoinIndex=R;S=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:S,$c:true,$r,a,b,c,d,e,f,g,h,i,j,$s};return $f;};$pkg.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs=S;T=function(){$global.gopkgs=$externalize($makeMap($String.keyFor,[{k:"NewVec2DJs",v:new AH(G)},{k:"NewPolygon2DJs",v:new AI(H)},{k:"NewBarrierJs",v:new AJ(I)},{k:"NewPlayerDownsyncJs",v:new AK(J)},{k:"NewMeleeBulletJs",v:new AL(K)},{k:"NewFireballBulletJs",v:new AM(L)},{k:"NewNpcPatrolCue",v:new AN(M)},{k:"NewRoomDownsyncFrameJs",v:new AO(N)},{k:"NewCollisionSpaceJs",v:new AP(F)},{k:"NewInputFrameDownsync",v:new AQ(D)},{k:"NewRingBufferJs",v:new AR(E)},{k:"GenerateRectColliderJs",v:new AS(P)},{k:"GenerateConvexPolygonColliderJs",v:new AT(Q)},{k:"GetCollisionSpaceObjsJs",v:new AV(O)},{k:"WorldToPolygonColliderBLPos",v:new AW(B.WorldToPolygonColliderBLPos)},{k:"PolygonColliderBLToWorldPos",v:new AW(B.PolygonColliderBLToWorldPos)},{k:"WorldToVirtualGridPos",v:new AX(B.WorldToVirtualGridPos)},{k:"VirtualGridToWorldPos",v:new AY(B.VirtualGridToWorldPos)},{k:"GetCharacterConfigsOrderedByJoinIndex",v:new BA(R)},{k:"ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs",v:new BG(S)},{k:"ConvertToDelayedInputFrameId",v:new BH(B.ConvertToDelayedInputFrameId)},{k:"ConvertToNoDelayInputFrameId",v:new BH(B.ConvertToNoDelayInputFrameId)},{k:"ConvertToFirstUsedRenderFrameId",v:new BH(B.ConvertToFirstUsedRenderFrameId)},{k:"ConvertToLastUsedRenderFrameId",v:new BH(B.ConvertToLastUsedRenderFrameId)},{k:"ShouldGenerateInputFrameUpsync",v:new BI(B.ShouldGenerateInputFrameUpsync)}]),BJ);};$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){T();$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 6684f48..a182622 100644 --- a/frontend/assets/resources/pbfiles/room_downsync_frame.proto +++ b/frontend/assets/resources/pbfiles/room_downsync_frame.proto @@ -114,6 +114,46 @@ message MeleeBullet { int32 hitboxSizeY = 17; bool blowUp = 18; + int32 teamId = 19; + + int32 bulletLocalId = 20; +} + +message FireballBullet { + int32 originatedRenderFrameId = 1; + int32 offenderJoinIndex = 2; + + int32 startupFrames = 3; + int32 cancellableStFrame = 4; + int32 cancellableEdFrame = 5; + int32 activeFrames = 6; + + int32 hitStunFrames = 7; + int32 blockStunFrames = 8; + int32 pushbackVelX = 9; + int32 pushbackVelY = 10; + int32 damage = 11; + + int32 selfLockVelX = 12; + int32 selfLockVelY = 13; + + int32 hitboxOffsetX = 14; + int32 hitboxOffsetY = 15; + int32 hitboxSizeX = 16; + int32 hitboxSizeY = 17; + + bool blowUp = 18; + int32 teamId = 19; + + int32 bulletLocalId = 20; + + int32 virtualGridX = 999; + int32 virtualGridY = 1000; + int32 dirX = 1001; + int32 dirY = 1002; + int32 velX = 1003; + int32 velY = 1004; + int32 speed = 1005; } message BattleColliderInfo { @@ -133,7 +173,7 @@ message BattleColliderInfo { double spaceOffsetY = 12; int32 collisionMinStep = 13; - bool frameDataLoggingEnabled = 999; + bool frameDataLoggingEnabled = 1024; } message RoomDownsyncFrame { @@ -141,7 +181,11 @@ message RoomDownsyncFrame { repeated PlayerDownsync playersArr = 2; int64 countdownNanos = 3; 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; + repeated FireballBullet fireballBullets = 5; + + uint64 backendUnconfirmedMask = 1024; // Indexed by "joinIndex", same compression concern as stated in InputFrameDownsync + bool shouldForceResync = 1025; + repeated int32 speciesIdList = 1026; + + int32 bulletLocalIdCounter = 1027; } diff --git a/frontend/assets/scenes/login.fire b/frontend/assets/scenes/login.fire index e3c7ca3..8e744bd 100644 --- a/frontend/assets/scenes/login.fire +++ b/frontend/assets/scenes/login.fire @@ -440,7 +440,7 @@ "array": [ 0, 0, - 210.60543794365393, + 215.64032554232523, 0, 0, 0, diff --git a/frontend/assets/scenes/offline_map.fire b/frontend/assets/scenes/offline_map.fire index f3b8770..a0d54b2 100644 --- a/frontend/assets/scenes/offline_map.fire +++ b/frontend/assets/scenes/offline_map.fire @@ -461,7 +461,7 @@ "array": [ 0, 0, - 210.85914803043164, + 215.64032554232523, 0, 0, 0, diff --git a/frontend/assets/scripts/Map.js b/frontend/assets/scripts/Map.js index d81652b..152e859 100644 --- a/frontend/assets/scripts/Map.js +++ b/frontend/assets/scripts/Map.js @@ -384,7 +384,7 @@ cc.Class({ window.mapIns = self; window.forceBigEndianFloatingNumDecoding = self.forceBigEndianFloatingNumDecoding; - self.showCriticalCoordinateLabels = false; + self.showCriticalCoordinateLabels = true; console.warn("+++++++ Map onLoad()"); @@ -575,21 +575,27 @@ cc.Class({ }, onRoomDownsyncFrame(pbRdf /* pb.RoomDownsyncFrame */ , accompaniedInputFrameDownsyncBatch /* pb.InputFrameDownsyncBatch */ ) { - const jsPlayersArr = new Array().fill(null); - for (let k in pbRdf.playersArr) { + const jsPlayersArr = new Array(pbRdf.playersArr.length).fill(null); + for (let k = 0; k < pbRdf.playersArr.length; ++k) { const pbPlayer = pbRdf.playersArr[k]; const jsPlayer = gopkgs.NewPlayerDownsyncJs(pbPlayer.id, pbPlayer.virtualGridX, pbPlayer.virtualGridY, pbPlayer.dirX, pbPlayer.dirY, pbPlayer.velX, pbPlayer.velY, pbPlayer.framesToRecover, pbPlayer.framesInChState, pbPlayer.activeSkillId, pbPlayer.activeSkillHit, pbPlayer.framesInvinsible, pbPlayer.speed, pbPlayer.battleState, pbPlayer.characterState, pbPlayer.joinIndex, pbPlayer.hp, pbPlayer.maxHp, pbPlayer.colliderRadius, pbPlayer.inAir); jsPlayersArr[k] = jsPlayer; } - const jsMeleeBulletsArr = []; - for (let k in pbRdf.meleeBullets) { + const jsMeleeBulletsArr = new Array(pbRdf.meleeBullets.length).fill(null); + for (let k = 0; k < pbRdf.meleeBullets.length; ++k) { 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); - jsMeleeBulletsArr.push(jsBullet); + const jsMeleeBullet = gopkgs.NewMeleeBulletJs(pbBullet.bulletLocalId, pbBullet.originatedRenderFrameId, pbBullet.offenderJoinIndex, pbBullet.startupFrames, pbBullet.cancellableStFrame, pbBullet.cancellableEdFrame, pbBullet.activeFrames, pbBullet.hitStunFrames, pbBullet.blockStunFrames, pbBullet.pushbackVelX, pbBullet.pushbackVelY, pbBullet.damage, pbBullet.selfLockVelX, pbBullet.selfLockVelY, pbBullet.hitboxOffsetX, pbBullet.hitboxOffsetY, pbBullet.hitboxSizeX, pbBullet.hitboxSizeY, pbBullet.blowUp); + jsMeleeBulletsArr[k] = jsMeleeBullet; + } + const jsFireballBulletsArr = new Array(pbRdf.fireballBullets.length).fill(null); + for (let k = 0; k < pbRdf.fireballBullets.length; ++k) { + const pbBullet = pbRdf.fireballBullets[k]; + const jsFireballBullet = gopkgs.NewFireballBulletJs(pbBullet.bulletLocalId, pbBullet.originatedRenderFrameId, pbBullet.offenderJoinIndex, pbBullet.startupFrames, pbBullet.cancellableStFrame, pbBullet.cancellableEdFrame, pbBullet.activeFrames, pbBullet.hitStunFrames, pbBullet.blockStunFrames, pbBullet.pushbackVelX, pbBullet.pushbackVelY, pbBullet.damage, pbBullet.selfLockVelX, pbBullet.selfLockVelY, pbBullet.hitboxOffsetX, pbBullet.hitboxOffsetY, pbBullet.hitboxSizeX, pbBullet.hitboxSizeY, pbBullet.blowUp, pbBullet.teamId, pbBullet.virtualGridX, pbBullet.virtualGridY, pbBullet.dirX, pbBullet.dirY, pbBullet.velX, pbBullet.velY, pbBullet.speed); + jsFireballBulletsArr[k] = jsFireballBullet; } // This function is also applicable to "re-joining". - const rdf = gopkgs.NewRoomDownsyncFrameJs(pbRdf.id, jsPlayersArr, jsMeleeBulletsArr); + const rdf = gopkgs.NewRoomDownsyncFrameJs(pbRdf.id, jsPlayersArr, pbRdf.bulletLocalIdCounter, jsMeleeBulletsArr, jsFireballBulletsArr); const self = window.mapIns; self.onInputFrameDownsyncBatch(accompaniedInputFrameDownsyncBatch); // Important to do this step before setting IN_BATTLE if (!self.recentRenderCache) { @@ -1285,6 +1291,34 @@ actuallyUsedinputList:{${self.inputFrameDownsyncStr(actuallyUsedInputClone)}}`); g2.stroke(); } } + + for (let k in rdf.FireballBullets) { + const fireballBullet = rdf.FireballBullets[k]; + if ( + fireballBullet.Bullet.OriginatedRenderFrameId + fireballBullet.Bullet.StartupFrames <= rdf.Id + && + fireballBullet.Bullet.OriginatedRenderFrameId + fireballBullet.Bullet.StartupFrames + fireballBullet.Bullet.ActiveFrames > rdf.Id + ) { + const offender = rdf.PlayersArr[fireballBullet.Bullet.OffenderJoinIndex - 1]; + if (1 == offender.JoinIndex) { + g2.strokeColor = cc.Color.BLUE; + } else { + g2.strokeColor = cc.Color.RED; + } + + const [bulletWx, bulletWy] = gopkgs.VirtualGridToWorldPos(fireballBullet.VirtualGridX, fireballBullet.VirtualGridY); + const [halfColliderWidth, halfColliderHeight] = gopkgs.VirtualGridToWorldPos((fireballBullet.Bullet.HitboxSizeX >> 1), (fireballBullet.Bullet.HitboxSizeY >> 1)); + const [bulletCx, bulletCy] = gopkgs.WorldToPolygonColliderBLPos(bulletWx, bulletWy, halfColliderWidth, halfColliderHeight, topPadding, bottomPadding, leftPadding, rightPadding, 0, 0); + const pts = [[0, 0], [leftPadding + halfColliderWidth * 2 + rightPadding, 0], [leftPadding + halfColliderWidth * 2 + rightPadding, bottomPadding + halfColliderHeight * 2 + topPadding], [0, bottomPadding + halfColliderHeight * 2 + topPadding]]; + + g2.moveTo(bulletCx, bulletCy); + for (let j = 0; j < pts.length; j += 1) { + g2.lineTo(pts[j][0] + bulletCx, pts[j][1] + bulletCy); + } + g2.lineTo(bulletCx, bulletCy); + g2.stroke(); + } + } } }, }); diff --git a/frontend/assets/scripts/OfflineMap.js b/frontend/assets/scripts/OfflineMap.js index 687cb68..c13b031 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; @@ -129,7 +129,7 @@ cc.Class({ inAir: true, }), ], - speciesIdList: [4196, 0], + speciesIdList: [4096, 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 81cfd95..f5e476b 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 @@ -4116,6 +4116,8 @@ $root.protos = (function() { * @property {number|null} [hitboxSizeX] MeleeBullet hitboxSizeX * @property {number|null} [hitboxSizeY] MeleeBullet hitboxSizeY * @property {boolean|null} [blowUp] MeleeBullet blowUp + * @property {number|null} [teamId] MeleeBullet teamId + * @property {number|null} [bulletLocalId] MeleeBullet bulletLocalId */ /** @@ -4277,6 +4279,22 @@ $root.protos = (function() { */ MeleeBullet.prototype.blowUp = false; + /** + * MeleeBullet teamId. + * @member {number} teamId + * @memberof protos.MeleeBullet + * @instance + */ + MeleeBullet.prototype.teamId = 0; + + /** + * MeleeBullet bulletLocalId. + * @member {number} bulletLocalId + * @memberof protos.MeleeBullet + * @instance + */ + MeleeBullet.prototype.bulletLocalId = 0; + /** * Creates a new MeleeBullet instance using the specified properties. * @function create @@ -4337,6 +4355,10 @@ $root.protos = (function() { 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); + if (message.teamId != null && Object.hasOwnProperty.call(message, "teamId")) + writer.uint32(/* id 19, wireType 0 =*/152).int32(message.teamId); + if (message.bulletLocalId != null && Object.hasOwnProperty.call(message, "bulletLocalId")) + writer.uint32(/* id 20, wireType 0 =*/160).int32(message.bulletLocalId); return writer; }; @@ -4443,6 +4465,14 @@ $root.protos = (function() { message.blowUp = reader.bool(); break; } + case 19: { + message.teamId = reader.int32(); + break; + } + case 20: { + message.bulletLocalId = reader.int32(); + break; + } default: reader.skipType(tag & 7); break; @@ -4532,6 +4562,12 @@ $root.protos = (function() { if (message.blowUp != null && message.hasOwnProperty("blowUp")) if (typeof message.blowUp !== "boolean") return "blowUp: boolean expected"; + if (message.teamId != null && message.hasOwnProperty("teamId")) + if (!$util.isInteger(message.teamId)) + return "teamId: integer expected"; + if (message.bulletLocalId != null && message.hasOwnProperty("bulletLocalId")) + if (!$util.isInteger(message.bulletLocalId)) + return "bulletLocalId: integer expected"; return null; }; @@ -4583,6 +4619,10 @@ $root.protos = (function() { message.hitboxSizeY = object.hitboxSizeY | 0; if (object.blowUp != null) message.blowUp = Boolean(object.blowUp); + if (object.teamId != null) + message.teamId = object.teamId | 0; + if (object.bulletLocalId != null) + message.bulletLocalId = object.bulletLocalId | 0; return message; }; @@ -4618,6 +4658,8 @@ $root.protos = (function() { object.hitboxSizeX = 0; object.hitboxSizeY = 0; object.blowUp = false; + object.teamId = 0; + object.bulletLocalId = 0; } if (message.originatedRenderFrameId != null && message.hasOwnProperty("originatedRenderFrameId")) object.originatedRenderFrameId = message.originatedRenderFrameId; @@ -4655,6 +4697,10 @@ $root.protos = (function() { object.hitboxSizeY = message.hitboxSizeY; if (message.blowUp != null && message.hasOwnProperty("blowUp")) object.blowUp = message.blowUp; + if (message.teamId != null && message.hasOwnProperty("teamId")) + object.teamId = message.teamId; + if (message.bulletLocalId != null && message.hasOwnProperty("bulletLocalId")) + object.bulletLocalId = message.bulletLocalId; return object; }; @@ -4687,6 +4733,808 @@ $root.protos = (function() { return MeleeBullet; })(); + protos.FireballBullet = (function() { + + /** + * Properties of a FireballBullet. + * @memberof protos + * @interface IFireballBullet + * @property {number|null} [originatedRenderFrameId] FireballBullet originatedRenderFrameId + * @property {number|null} [offenderJoinIndex] FireballBullet offenderJoinIndex + * @property {number|null} [startupFrames] FireballBullet startupFrames + * @property {number|null} [cancellableStFrame] FireballBullet cancellableStFrame + * @property {number|null} [cancellableEdFrame] FireballBullet cancellableEdFrame + * @property {number|null} [activeFrames] FireballBullet activeFrames + * @property {number|null} [hitStunFrames] FireballBullet hitStunFrames + * @property {number|null} [blockStunFrames] FireballBullet blockStunFrames + * @property {number|null} [pushbackVelX] FireballBullet pushbackVelX + * @property {number|null} [pushbackVelY] FireballBullet pushbackVelY + * @property {number|null} [damage] FireballBullet damage + * @property {number|null} [selfLockVelX] FireballBullet selfLockVelX + * @property {number|null} [selfLockVelY] FireballBullet selfLockVelY + * @property {number|null} [hitboxOffsetX] FireballBullet hitboxOffsetX + * @property {number|null} [hitboxOffsetY] FireballBullet hitboxOffsetY + * @property {number|null} [hitboxSizeX] FireballBullet hitboxSizeX + * @property {number|null} [hitboxSizeY] FireballBullet hitboxSizeY + * @property {boolean|null} [blowUp] FireballBullet blowUp + * @property {number|null} [teamId] FireballBullet teamId + * @property {number|null} [bulletLocalId] FireballBullet bulletLocalId + * @property {number|null} [virtualGridX] FireballBullet virtualGridX + * @property {number|null} [virtualGridY] FireballBullet virtualGridY + * @property {number|null} [dirX] FireballBullet dirX + * @property {number|null} [dirY] FireballBullet dirY + * @property {number|null} [velX] FireballBullet velX + * @property {number|null} [velY] FireballBullet velY + * @property {number|null} [speed] FireballBullet speed + */ + + /** + * Constructs a new FireballBullet. + * @memberof protos + * @classdesc Represents a FireballBullet. + * @implements IFireballBullet + * @constructor + * @param {protos.IFireballBullet=} [properties] Properties to set + */ + function FireballBullet(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * FireballBullet originatedRenderFrameId. + * @member {number} originatedRenderFrameId + * @memberof protos.FireballBullet + * @instance + */ + FireballBullet.prototype.originatedRenderFrameId = 0; + + /** + * FireballBullet offenderJoinIndex. + * @member {number} offenderJoinIndex + * @memberof protos.FireballBullet + * @instance + */ + FireballBullet.prototype.offenderJoinIndex = 0; + + /** + * FireballBullet startupFrames. + * @member {number} startupFrames + * @memberof protos.FireballBullet + * @instance + */ + FireballBullet.prototype.startupFrames = 0; + + /** + * FireballBullet cancellableStFrame. + * @member {number} cancellableStFrame + * @memberof protos.FireballBullet + * @instance + */ + FireballBullet.prototype.cancellableStFrame = 0; + + /** + * FireballBullet cancellableEdFrame. + * @member {number} cancellableEdFrame + * @memberof protos.FireballBullet + * @instance + */ + FireballBullet.prototype.cancellableEdFrame = 0; + + /** + * FireballBullet activeFrames. + * @member {number} activeFrames + * @memberof protos.FireballBullet + * @instance + */ + FireballBullet.prototype.activeFrames = 0; + + /** + * FireballBullet hitStunFrames. + * @member {number} hitStunFrames + * @memberof protos.FireballBullet + * @instance + */ + FireballBullet.prototype.hitStunFrames = 0; + + /** + * FireballBullet blockStunFrames. + * @member {number} blockStunFrames + * @memberof protos.FireballBullet + * @instance + */ + FireballBullet.prototype.blockStunFrames = 0; + + /** + * FireballBullet pushbackVelX. + * @member {number} pushbackVelX + * @memberof protos.FireballBullet + * @instance + */ + FireballBullet.prototype.pushbackVelX = 0; + + /** + * FireballBullet pushbackVelY. + * @member {number} pushbackVelY + * @memberof protos.FireballBullet + * @instance + */ + FireballBullet.prototype.pushbackVelY = 0; + + /** + * FireballBullet damage. + * @member {number} damage + * @memberof protos.FireballBullet + * @instance + */ + FireballBullet.prototype.damage = 0; + + /** + * FireballBullet selfLockVelX. + * @member {number} selfLockVelX + * @memberof protos.FireballBullet + * @instance + */ + FireballBullet.prototype.selfLockVelX = 0; + + /** + * FireballBullet selfLockVelY. + * @member {number} selfLockVelY + * @memberof protos.FireballBullet + * @instance + */ + FireballBullet.prototype.selfLockVelY = 0; + + /** + * FireballBullet hitboxOffsetX. + * @member {number} hitboxOffsetX + * @memberof protos.FireballBullet + * @instance + */ + FireballBullet.prototype.hitboxOffsetX = 0; + + /** + * FireballBullet hitboxOffsetY. + * @member {number} hitboxOffsetY + * @memberof protos.FireballBullet + * @instance + */ + FireballBullet.prototype.hitboxOffsetY = 0; + + /** + * FireballBullet hitboxSizeX. + * @member {number} hitboxSizeX + * @memberof protos.FireballBullet + * @instance + */ + FireballBullet.prototype.hitboxSizeX = 0; + + /** + * FireballBullet hitboxSizeY. + * @member {number} hitboxSizeY + * @memberof protos.FireballBullet + * @instance + */ + FireballBullet.prototype.hitboxSizeY = 0; + + /** + * FireballBullet blowUp. + * @member {boolean} blowUp + * @memberof protos.FireballBullet + * @instance + */ + FireballBullet.prototype.blowUp = false; + + /** + * FireballBullet teamId. + * @member {number} teamId + * @memberof protos.FireballBullet + * @instance + */ + FireballBullet.prototype.teamId = 0; + + /** + * FireballBullet bulletLocalId. + * @member {number} bulletLocalId + * @memberof protos.FireballBullet + * @instance + */ + FireballBullet.prototype.bulletLocalId = 0; + + /** + * FireballBullet virtualGridX. + * @member {number} virtualGridX + * @memberof protos.FireballBullet + * @instance + */ + FireballBullet.prototype.virtualGridX = 0; + + /** + * FireballBullet virtualGridY. + * @member {number} virtualGridY + * @memberof protos.FireballBullet + * @instance + */ + FireballBullet.prototype.virtualGridY = 0; + + /** + * FireballBullet dirX. + * @member {number} dirX + * @memberof protos.FireballBullet + * @instance + */ + FireballBullet.prototype.dirX = 0; + + /** + * FireballBullet dirY. + * @member {number} dirY + * @memberof protos.FireballBullet + * @instance + */ + FireballBullet.prototype.dirY = 0; + + /** + * FireballBullet velX. + * @member {number} velX + * @memberof protos.FireballBullet + * @instance + */ + FireballBullet.prototype.velX = 0; + + /** + * FireballBullet velY. + * @member {number} velY + * @memberof protos.FireballBullet + * @instance + */ + FireballBullet.prototype.velY = 0; + + /** + * FireballBullet speed. + * @member {number} speed + * @memberof protos.FireballBullet + * @instance + */ + FireballBullet.prototype.speed = 0; + + /** + * Creates a new FireballBullet instance using the specified properties. + * @function create + * @memberof protos.FireballBullet + * @static + * @param {protos.IFireballBullet=} [properties] Properties to set + * @returns {protos.FireballBullet} FireballBullet instance + */ + FireballBullet.create = function create(properties) { + return new FireballBullet(properties); + }; + + /** + * Encodes the specified FireballBullet message. Does not implicitly {@link protos.FireballBullet.verify|verify} messages. + * @function encode + * @memberof protos.FireballBullet + * @static + * @param {protos.FireballBullet} message FireballBullet message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + FireballBullet.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.originatedRenderFrameId != null && Object.hasOwnProperty.call(message, "originatedRenderFrameId")) + writer.uint32(/* id 1, wireType 0 =*/8).int32(message.originatedRenderFrameId); + if (message.offenderJoinIndex != null && Object.hasOwnProperty.call(message, "offenderJoinIndex")) + 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 0 =*/128).int32(message.hitboxSizeX); + if (message.hitboxSizeY != null && Object.hasOwnProperty.call(message, "hitboxSizeY")) + 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); + if (message.teamId != null && Object.hasOwnProperty.call(message, "teamId")) + writer.uint32(/* id 19, wireType 0 =*/152).int32(message.teamId); + if (message.bulletLocalId != null && Object.hasOwnProperty.call(message, "bulletLocalId")) + writer.uint32(/* id 20, wireType 0 =*/160).int32(message.bulletLocalId); + if (message.virtualGridX != null && Object.hasOwnProperty.call(message, "virtualGridX")) + writer.uint32(/* id 999, wireType 0 =*/7992).int32(message.virtualGridX); + if (message.virtualGridY != null && Object.hasOwnProperty.call(message, "virtualGridY")) + writer.uint32(/* id 1000, wireType 0 =*/8000).int32(message.virtualGridY); + if (message.dirX != null && Object.hasOwnProperty.call(message, "dirX")) + writer.uint32(/* id 1001, wireType 0 =*/8008).int32(message.dirX); + if (message.dirY != null && Object.hasOwnProperty.call(message, "dirY")) + writer.uint32(/* id 1002, wireType 0 =*/8016).int32(message.dirY); + if (message.velX != null && Object.hasOwnProperty.call(message, "velX")) + writer.uint32(/* id 1003, wireType 0 =*/8024).int32(message.velX); + if (message.velY != null && Object.hasOwnProperty.call(message, "velY")) + writer.uint32(/* id 1004, wireType 0 =*/8032).int32(message.velY); + if (message.speed != null && Object.hasOwnProperty.call(message, "speed")) + writer.uint32(/* id 1005, wireType 0 =*/8040).int32(message.speed); + return writer; + }; + + /** + * Encodes the specified FireballBullet message, length delimited. Does not implicitly {@link protos.FireballBullet.verify|verify} messages. + * @function encodeDelimited + * @memberof protos.FireballBullet + * @static + * @param {protos.FireballBullet} message FireballBullet message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + FireballBullet.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a FireballBullet message from the specified reader or buffer. + * @function decode + * @memberof protos.FireballBullet + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {protos.FireballBullet} FireballBullet + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + FireballBullet.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.FireballBullet(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.originatedRenderFrameId = reader.int32(); + break; + } + 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.hitboxOffsetY = reader.int32(); + break; + } + case 16: { + message.hitboxSizeX = reader.int32(); + break; + } + case 17: { + message.hitboxSizeY = reader.int32(); + break; + } + case 18: { + message.blowUp = reader.bool(); + break; + } + case 19: { + message.teamId = reader.int32(); + break; + } + case 20: { + message.bulletLocalId = reader.int32(); + break; + } + case 999: { + message.virtualGridX = reader.int32(); + break; + } + case 1000: { + message.virtualGridY = reader.int32(); + break; + } + case 1001: { + message.dirX = reader.int32(); + break; + } + case 1002: { + message.dirY = reader.int32(); + break; + } + case 1003: { + message.velX = reader.int32(); + break; + } + case 1004: { + message.velY = reader.int32(); + break; + } + case 1005: { + message.speed = reader.int32(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a FireballBullet message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof protos.FireballBullet + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {protos.FireballBullet} FireballBullet + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + FireballBullet.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a FireballBullet message. + * @function verify + * @memberof protos.FireballBullet + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + FireballBullet.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object 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.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.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 (!$util.isInteger(message.hitboxSizeX)) + return "hitboxSizeX: integer expected"; + if (message.hitboxSizeY != null && message.hasOwnProperty("hitboxSizeY")) + 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"; + if (message.teamId != null && message.hasOwnProperty("teamId")) + if (!$util.isInteger(message.teamId)) + return "teamId: integer expected"; + if (message.bulletLocalId != null && message.hasOwnProperty("bulletLocalId")) + if (!$util.isInteger(message.bulletLocalId)) + return "bulletLocalId: integer expected"; + if (message.virtualGridX != null && message.hasOwnProperty("virtualGridX")) + if (!$util.isInteger(message.virtualGridX)) + return "virtualGridX: integer expected"; + if (message.virtualGridY != null && message.hasOwnProperty("virtualGridY")) + if (!$util.isInteger(message.virtualGridY)) + return "virtualGridY: integer expected"; + if (message.dirX != null && message.hasOwnProperty("dirX")) + if (!$util.isInteger(message.dirX)) + return "dirX: integer expected"; + if (message.dirY != null && message.hasOwnProperty("dirY")) + if (!$util.isInteger(message.dirY)) + return "dirY: integer expected"; + if (message.velX != null && message.hasOwnProperty("velX")) + if (!$util.isInteger(message.velX)) + return "velX: integer expected"; + if (message.velY != null && message.hasOwnProperty("velY")) + if (!$util.isInteger(message.velY)) + return "velY: integer expected"; + if (message.speed != null && message.hasOwnProperty("speed")) + if (!$util.isInteger(message.speed)) + return "speed: integer expected"; + return null; + }; + + /** + * Creates a FireballBullet message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof protos.FireballBullet + * @static + * @param {Object.} object Plain object + * @returns {protos.FireballBullet} FireballBullet + */ + FireballBullet.fromObject = function fromObject(object) { + if (object instanceof $root.protos.FireballBullet) + return object; + var message = new $root.protos.FireballBullet(); + 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.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.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 = object.hitboxSizeX | 0; + if (object.hitboxSizeY != null) + message.hitboxSizeY = object.hitboxSizeY | 0; + if (object.blowUp != null) + message.blowUp = Boolean(object.blowUp); + if (object.teamId != null) + message.teamId = object.teamId | 0; + if (object.bulletLocalId != null) + message.bulletLocalId = object.bulletLocalId | 0; + if (object.virtualGridX != null) + message.virtualGridX = object.virtualGridX | 0; + if (object.virtualGridY != null) + message.virtualGridY = object.virtualGridY | 0; + if (object.dirX != null) + message.dirX = object.dirX | 0; + if (object.dirY != null) + message.dirY = object.dirY | 0; + if (object.velX != null) + message.velX = object.velX | 0; + if (object.velY != null) + message.velY = object.velY | 0; + if (object.speed != null) + message.speed = object.speed | 0; + return message; + }; + + /** + * Creates a plain object from a FireballBullet message. Also converts values to other types if specified. + * @function toObject + * @memberof protos.FireballBullet + * @static + * @param {protos.FireballBullet} message FireballBullet + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + FireballBullet.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + 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.pushbackVelX = 0; + object.pushbackVelY = 0; + object.damage = 0; + object.selfLockVelX = 0; + object.selfLockVelY = 0; + object.hitboxOffsetX = 0; + object.hitboxOffsetY = 0; + object.hitboxSizeX = 0; + object.hitboxSizeY = 0; + object.blowUp = false; + object.teamId = 0; + object.bulletLocalId = 0; + object.virtualGridX = 0; + object.virtualGridY = 0; + object.dirX = 0; + object.dirY = 0; + object.velX = 0; + object.velY = 0; + object.speed = 0; + } + 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.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.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 = message.hitboxSizeX; + if (message.hitboxSizeY != null && message.hasOwnProperty("hitboxSizeY")) + object.hitboxSizeY = message.hitboxSizeY; + if (message.blowUp != null && message.hasOwnProperty("blowUp")) + object.blowUp = message.blowUp; + if (message.teamId != null && message.hasOwnProperty("teamId")) + object.teamId = message.teamId; + if (message.bulletLocalId != null && message.hasOwnProperty("bulletLocalId")) + object.bulletLocalId = message.bulletLocalId; + if (message.virtualGridX != null && message.hasOwnProperty("virtualGridX")) + object.virtualGridX = message.virtualGridX; + if (message.virtualGridY != null && message.hasOwnProperty("virtualGridY")) + object.virtualGridY = message.virtualGridY; + if (message.dirX != null && message.hasOwnProperty("dirX")) + object.dirX = message.dirX; + if (message.dirY != null && message.hasOwnProperty("dirY")) + object.dirY = message.dirY; + if (message.velX != null && message.hasOwnProperty("velX")) + object.velX = message.velX; + if (message.velY != null && message.hasOwnProperty("velY")) + object.velY = message.velY; + if (message.speed != null && message.hasOwnProperty("speed")) + object.speed = message.speed; + return object; + }; + + /** + * Converts this FireballBullet to JSON. + * @function toJSON + * @memberof protos.FireballBullet + * @instance + * @returns {Object.} JSON object + */ + FireballBullet.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for FireballBullet + * @function getTypeUrl + * @memberof protos.FireballBullet + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + FireballBullet.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/protos.FireballBullet"; + }; + + return FireballBullet; + })(); + protos.BattleColliderInfo = (function() { /** @@ -4887,7 +5735,7 @@ $root.protos = (function() { if (message.collisionMinStep != null && Object.hasOwnProperty.call(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); + writer.uint32(/* id 1024, wireType 0 =*/8192).bool(message.frameDataLoggingEnabled); return writer; }; @@ -4974,7 +5822,7 @@ $root.protos = (function() { message.collisionMinStep = reader.int32(); break; } - case 999: { + case 1024: { message.frameDataLoggingEnabled = reader.bool(); break; } @@ -5228,9 +6076,11 @@ $root.protos = (function() { * @property {Array.|null} [playersArr] RoomDownsyncFrame playersArr * @property {number|Long|null} [countdownNanos] RoomDownsyncFrame countdownNanos * @property {Array.|null} [meleeBullets] RoomDownsyncFrame meleeBullets + * @property {Array.|null} [fireballBullets] RoomDownsyncFrame fireballBullets * @property {number|Long|null} [backendUnconfirmedMask] RoomDownsyncFrame backendUnconfirmedMask * @property {boolean|null} [shouldForceResync] RoomDownsyncFrame shouldForceResync * @property {Array.|null} [speciesIdList] RoomDownsyncFrame speciesIdList + * @property {number|null} [bulletLocalIdCounter] RoomDownsyncFrame bulletLocalIdCounter */ /** @@ -5244,6 +6094,7 @@ $root.protos = (function() { function RoomDownsyncFrame(properties) { this.playersArr = []; this.meleeBullets = []; + this.fireballBullets = []; this.speciesIdList = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) @@ -5283,6 +6134,14 @@ $root.protos = (function() { */ RoomDownsyncFrame.prototype.meleeBullets = $util.emptyArray; + /** + * RoomDownsyncFrame fireballBullets. + * @member {Array.} fireballBullets + * @memberof protos.RoomDownsyncFrame + * @instance + */ + RoomDownsyncFrame.prototype.fireballBullets = $util.emptyArray; + /** * RoomDownsyncFrame backendUnconfirmedMask. * @member {number|Long} backendUnconfirmedMask @@ -5307,6 +6166,14 @@ $root.protos = (function() { */ RoomDownsyncFrame.prototype.speciesIdList = $util.emptyArray; + /** + * RoomDownsyncFrame bulletLocalIdCounter. + * @member {number} bulletLocalIdCounter + * @memberof protos.RoomDownsyncFrame + * @instance + */ + RoomDownsyncFrame.prototype.bulletLocalIdCounter = 0; + /** * Creates a new RoomDownsyncFrame instance using the specified properties. * @function create @@ -5341,16 +6208,21 @@ $root.protos = (function() { if (message.meleeBullets != null && message.meleeBullets.length) for (var i = 0; i < message.meleeBullets.length; ++i) $root.protos.MeleeBullet.encode(message.meleeBullets[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + if (message.fireballBullets != null && message.fireballBullets.length) + for (var i = 0; i < message.fireballBullets.length; ++i) + $root.protos.FireballBullet.encode(message.fireballBullets[i], writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); if (message.backendUnconfirmedMask != null && Object.hasOwnProperty.call(message, "backendUnconfirmedMask")) - writer.uint32(/* id 5, wireType 0 =*/40).uint64(message.backendUnconfirmedMask); + writer.uint32(/* id 1024, wireType 0 =*/8192).uint64(message.backendUnconfirmedMask); if (message.shouldForceResync != null && Object.hasOwnProperty.call(message, "shouldForceResync")) - writer.uint32(/* id 6, wireType 0 =*/48).bool(message.shouldForceResync); + writer.uint32(/* id 1025, wireType 0 =*/8200).bool(message.shouldForceResync); if (message.speciesIdList != null && message.speciesIdList.length) { - writer.uint32(/* id 7, wireType 2 =*/58).fork(); + writer.uint32(/* id 1026, wireType 2 =*/8210).fork(); for (var i = 0; i < message.speciesIdList.length; ++i) writer.int32(message.speciesIdList[i]); writer.ldelim(); } + if (message.bulletLocalIdCounter != null && Object.hasOwnProperty.call(message, "bulletLocalIdCounter")) + writer.uint32(/* id 1027, wireType 0 =*/8216).int32(message.bulletLocalIdCounter); return writer; }; @@ -5406,14 +6278,20 @@ $root.protos = (function() { break; } case 5: { + if (!(message.fireballBullets && message.fireballBullets.length)) + message.fireballBullets = []; + message.fireballBullets.push($root.protos.FireballBullet.decode(reader, reader.uint32())); + break; + } + case 1024: { message.backendUnconfirmedMask = reader.uint64(); break; } - case 6: { + case 1025: { message.shouldForceResync = reader.bool(); break; } - case 7: { + case 1026: { if (!(message.speciesIdList && message.speciesIdList.length)) message.speciesIdList = []; if ((tag & 7) === 2) { @@ -5424,6 +6302,10 @@ $root.protos = (function() { message.speciesIdList.push(reader.int32()); break; } + case 1027: { + message.bulletLocalIdCounter = reader.int32(); + break; + } default: reader.skipType(tag & 7); break; @@ -5483,6 +6365,15 @@ $root.protos = (function() { return "meleeBullets." + error; } } + if (message.fireballBullets != null && message.hasOwnProperty("fireballBullets")) { + if (!Array.isArray(message.fireballBullets)) + return "fireballBullets: array expected"; + for (var i = 0; i < message.fireballBullets.length; ++i) { + var error = $root.protos.FireballBullet.verify(message.fireballBullets[i]); + if (error) + return "fireballBullets." + error; + } + } if (message.backendUnconfirmedMask != null && message.hasOwnProperty("backendUnconfirmedMask")) if (!$util.isInteger(message.backendUnconfirmedMask) && !(message.backendUnconfirmedMask && $util.isInteger(message.backendUnconfirmedMask.low) && $util.isInteger(message.backendUnconfirmedMask.high))) return "backendUnconfirmedMask: integer|Long expected"; @@ -5496,6 +6387,9 @@ $root.protos = (function() { if (!$util.isInteger(message.speciesIdList[i])) return "speciesIdList: integer[] expected"; } + if (message.bulletLocalIdCounter != null && message.hasOwnProperty("bulletLocalIdCounter")) + if (!$util.isInteger(message.bulletLocalIdCounter)) + return "bulletLocalIdCounter: integer expected"; return null; }; @@ -5542,6 +6436,16 @@ $root.protos = (function() { message.meleeBullets[i] = $root.protos.MeleeBullet.fromObject(object.meleeBullets[i]); } } + if (object.fireballBullets) { + if (!Array.isArray(object.fireballBullets)) + throw TypeError(".protos.RoomDownsyncFrame.fireballBullets: array expected"); + message.fireballBullets = []; + for (var i = 0; i < object.fireballBullets.length; ++i) { + if (typeof object.fireballBullets[i] !== "object") + throw TypeError(".protos.RoomDownsyncFrame.fireballBullets: object expected"); + message.fireballBullets[i] = $root.protos.FireballBullet.fromObject(object.fireballBullets[i]); + } + } if (object.backendUnconfirmedMask != null) if ($util.Long) (message.backendUnconfirmedMask = $util.Long.fromValue(object.backendUnconfirmedMask)).unsigned = true; @@ -5560,6 +6464,8 @@ $root.protos = (function() { for (var i = 0; i < object.speciesIdList.length; ++i) message.speciesIdList[i] = object.speciesIdList[i] | 0; } + if (object.bulletLocalIdCounter != null) + message.bulletLocalIdCounter = object.bulletLocalIdCounter | 0; return message; }; @@ -5579,6 +6485,7 @@ $root.protos = (function() { if (options.arrays || options.defaults) { object.playersArr = []; object.meleeBullets = []; + object.fireballBullets = []; object.speciesIdList = []; } if (options.defaults) { @@ -5594,6 +6501,7 @@ $root.protos = (function() { } else object.backendUnconfirmedMask = options.longs === String ? "0" : 0; object.shouldForceResync = false; + object.bulletLocalIdCounter = 0; } if (message.id != null && message.hasOwnProperty("id")) object.id = message.id; @@ -5612,6 +6520,11 @@ $root.protos = (function() { for (var j = 0; j < message.meleeBullets.length; ++j) object.meleeBullets[j] = $root.protos.MeleeBullet.toObject(message.meleeBullets[j], options); } + if (message.fireballBullets && message.fireballBullets.length) { + object.fireballBullets = []; + for (var j = 0; j < message.fireballBullets.length; ++j) + object.fireballBullets[j] = $root.protos.FireballBullet.toObject(message.fireballBullets[j], options); + } if (message.backendUnconfirmedMask != null && message.hasOwnProperty("backendUnconfirmedMask")) if (typeof message.backendUnconfirmedMask === "number") object.backendUnconfirmedMask = options.longs === String ? String(message.backendUnconfirmedMask) : message.backendUnconfirmedMask; @@ -5624,6 +6537,8 @@ $root.protos = (function() { for (var j = 0; j < message.speciesIdList.length; ++j) object.speciesIdList[j] = message.speciesIdList[j]; } + if (message.bulletLocalIdCounter != null && message.hasOwnProperty("bulletLocalIdCounter")) + object.bulletLocalIdCounter = message.bulletLocalIdCounter; return object; }; diff --git a/jsexport/battle/battle.go b/jsexport/battle/battle.go index 119177c..ffc4ad9 100644 --- a/jsexport/battle/battle.go +++ b/jsexport/battle/battle.go @@ -358,9 +358,9 @@ func calcHardPushbacksNorms(joinIndex int32, playerCollider *resolv.Object, play isBarrier := false switch obj.Data.(type) { case *PlayerDownsync: - case *MeleeBullet: + case *MeleeBullet, *FireballBullet: default: - // By default it's a regular barrier, even if data is nil, note that Golang syntax of switch-case is kind of confusing, this "default" condition is met only if "!*PlayerDownsync && !*MeleeBullet". + // By default it's a regular barrier, even if data is nil, note that Golang syntax of switch-case is kind of confusing, this "default" condition is met only if "!*PlayerDownsync && !*MeleeBullet && !*FireballBullet". isBarrier = true } @@ -471,10 +471,12 @@ 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? + nextRenderFrameFireballBullets := make([]*FireballBullet, 0, len(currRenderFrame.FireballBullets)) effPushbacks := make([]Vec2D, roomCapacity) hardPushbackNorms := make([]*[]Vec2D, roomCapacity) jumpedOrNotList := make([]bool, roomCapacity) + bulletLocalId := currRenderFrame.BulletLocalIdCounter // 1. Process player inputs for i, currPlayerDownsync := range currRenderFrame.PlayersArr { jumpedOrNotList[i] = false @@ -491,36 +493,57 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer if skillConfig, existent := skills[skillId]; existent { thatPlayerInNextFrame.ActiveSkillId = int32(skillId) thatPlayerInNextFrame.ActiveSkillHit = 0 + thatPlayerInNextFrame.FramesToRecover = skillConfig.RecoveryFrames + xfac := int32(1) + if 0 > thatPlayerInNextFrame.DirX { + xfac = -xfac + } + hasLockVel := false // 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.BulletLocalId = bulletLocalId + bulletLocalId++ newBullet.OriginatedRenderFrameId = currRenderFrame.Id 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 } if NO_LOCK_VEL != v.SelfLockVelY { hasLockVel = true thatPlayerInNextFrame.VelY = v.SelfLockVelY } - if false == hasLockVel { - if false == currPlayerDownsync.InAir { - thatPlayerInNextFrame.VelX = 0 - } + case *FireballBullet: + var newBullet FireballBullet = *v // Copied primitive fields into an onstack variable + newBullet.BulletLocalId = bulletLocalId + bulletLocalId++ + xfac := int32(1) + if 0 > thatPlayerInNextFrame.DirX { + xfac = -xfac + } + newBullet.VirtualGridX, newBullet.VirtualGridY = currPlayerDownsync.VirtualGridX+xfac*newBullet.HitboxOffsetX, currPlayerDownsync.VirtualGridY + newBullet.OriginatedRenderFrameId = currRenderFrame.Id + newBullet.OffenderJoinIndex = joinIndex + newBullet.VelX = newBullet.Speed * xfac + newBullet.VelY = 0 + nextRenderFrameFireballBullets = append(nextRenderFrameFireballBullets, &newBullet) + if NO_LOCK_VEL != v.SelfLockVelX { + hasLockVel = true + thatPlayerInNextFrame.VelX = xfac * v.SelfLockVelX + } + if NO_LOCK_VEL != v.SelfLockVelY { + hasLockVel = true + thatPlayerInNextFrame.VelY = v.SelfLockVelY } } + if false == hasLockVel && false == currPlayerDownsync.InAir { + thatPlayerInNextFrame.VelX = 0 + } thatPlayerInNextFrame.CharacterState = skillConfig.BoundChState continue // Don't allow movement if skill is used } @@ -589,11 +612,23 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer 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 { + } else if meleeBullet.OriginatedRenderFrameId+meleeBullet.StartupFrames+meleeBullet.ActiveFrames > currRenderFrame.Id { nextRenderFrameMeleeBullets = append(nextRenderFrameMeleeBullets, meleeBullet) } } + for _, fireballBullet := range currRenderFrame.FireballBullets { + if (fireballBullet.OriginatedRenderFrameId+fireballBullet.StartupFrames < currRenderFrame.Id) && (fireballBullet.OriginatedRenderFrameId+fireballBullet.StartupFrames+fireballBullet.ActiveFrames > currRenderFrame.Id) { + bulletWx, bulletWy := VirtualGridToWorldPos(fireballBullet.VirtualGridX, fireballBullet.VirtualGridY) + hitboxSizeWx, hitboxSizeWy := VirtualGridToWorldPos(fireballBullet.HitboxSizeX, fireballBullet.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, fireballBullet, "FireballBullet") + collisionSys.Add(newBulletCollider) + bulletColliders = append(bulletColliders, newBulletCollider) + } else if fireballBullet.OriginatedRenderFrameId+fireballBullet.StartupFrames+fireballBullet.ActiveFrames > currRenderFrame.Id { + nextRenderFrameFireballBullets = append(nextRenderFrameFireballBullets, fireballBullet) + } + } + // 4. Calc pushbacks for each player (after its movement) w/o bullets for i, currPlayerDownsync := range currRenderFrame.PlayersArr { joinIndex := currPlayerDownsync.JoinIndex @@ -610,7 +645,7 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer switch obj.Data.(type) { case *PlayerDownsync: isAnotherPlayer = true - case *MeleeBullet: + case *MeleeBullet, *FireballBullet: isBullet = true default: // By default it's a regular barrier, even if data is nil @@ -687,50 +722,102 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer 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 + addToNextRenderFrame := true + if nil != collision { + switch v := bulletCollider.Data.(type) { + case *MeleeBullet: + 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 + } + addToNextRenderFrame = false + if _, existent := invinsibleSet[t.CharacterState]; existent { + continue + } + if 0 < t.FramesInvinsible { + continue + } + xfac := int32(1) // By now, straight Punch offset doesn't respect "y-axis" + if 0 > offender.DirX { + xfac = -xfac + } + pushbackVelX, pushbackVelY := xfac*v.PushbackVelX, v.PushbackVelY + atkedPlayerInNextFrame := nextRenderFramePlayers[t.JoinIndex-1] + atkedPlayerInNextFrame.VelX = pushbackVelX + atkedPlayerInNextFrame.VelY = pushbackVelY + if v.BlowUp { + atkedPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_BLOWN_UP1 + } else { + atkedPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_ATKED1 + } + oldFramesToRecover := nextRenderFramePlayers[t.JoinIndex-1].FramesToRecover + if v.HitStunFrames > oldFramesToRecover { + atkedPlayerInNextFrame.FramesToRecover = v.HitStunFrames + } + default: + addToNextRenderFrame = false } - if _, existent := invinsibleSet[t.CharacterState]; existent { - continue - } - if 0 < t.FramesInvinsible { - continue - } - overlapped, _, _, _ := CalcPushbacks(0, 0, bulletShape, defenderShape) - if !overlapped { - continue - } - xfac := int32(1) // By now, straight Punch offset doesn't respect "y-axis" - if 0 > offender.DirX { - xfac = -xfac - } - pushbackVelX, pushbackVelY := xfac*v.PushbackVelX, v.PushbackVelY - atkedPlayerInNextFrame := nextRenderFramePlayers[t.JoinIndex-1] - atkedPlayerInNextFrame.VelX = pushbackVelX - atkedPlayerInNextFrame.VelY = pushbackVelY - if v.BlowUp { - atkedPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_BLOWN_UP1 - } else { - atkedPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_ATKED1 - } - oldFramesToRecover := nextRenderFramePlayers[t.JoinIndex-1].FramesToRecover - if v.HitStunFrames > oldFramesToRecover { - atkedPlayerInNextFrame.FramesToRecover = v.HitStunFrames - } - default: } + case *FireballBullet: + 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 + } + addToNextRenderFrame = false + if _, existent := invinsibleSet[t.CharacterState]; existent { + continue + } + if 0 < t.FramesInvinsible { + continue + } + xfac := int32(1) // By now, straight Punch offset doesn't respect "y-axis" + if 0 > offender.DirX { + xfac = -xfac + } + pushbackVelX, pushbackVelY := xfac*v.PushbackVelX, v.PushbackVelY + atkedPlayerInNextFrame := nextRenderFramePlayers[t.JoinIndex-1] + atkedPlayerInNextFrame.VelX = pushbackVelX + atkedPlayerInNextFrame.VelY = pushbackVelY + if v.BlowUp { + atkedPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_BLOWN_UP1 + } else { + atkedPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_ATKED1 + } + oldFramesToRecover := nextRenderFramePlayers[t.JoinIndex-1].FramesToRecover + if v.HitStunFrames > oldFramesToRecover { + atkedPlayerInNextFrame.FramesToRecover = v.HitStunFrames + } + default: + addToNextRenderFrame = false + } + } + } + } + if addToNextRenderFrame { + switch v := bulletCollider.Data.(type) { + case *MeleeBullet: + nextRenderFrameMeleeBullets = append(nextRenderFrameMeleeBullets, v) + case *FireballBullet: + v.VirtualGridX, v.VirtualGridY = v.VirtualGridX+v.VelX, v.VirtualGridY+v.VelY + nextRenderFrameFireballBullets = append(nextRenderFrameFireballBullets, v) } } } @@ -778,9 +865,10 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *RingBuffer } return &RoomDownsyncFrame{ - Id: currRenderFrame.Id + 1, - PlayersArr: nextRenderFramePlayers, - MeleeBullets: nextRenderFrameMeleeBullets, + Id: currRenderFrame.Id + 1, + PlayersArr: nextRenderFramePlayers, + MeleeBullets: nextRenderFrameMeleeBullets, + FireballBullets: nextRenderFrameFireballBullets, } } diff --git a/jsexport/battle/characterConfig.go b/jsexport/battle/characterConfig.go index 106c9e0..d94ea4f 100644 --- a/jsexport/battle/characterConfig.go +++ b/jsexport/battle/characterConfig.go @@ -108,8 +108,8 @@ var Characters = map[int]*CharacterConfig{ return NO_SKILL }, }, - 4196: &CharacterConfig{ - SpeciesId: 4196, + 4096: &CharacterConfig{ + SpeciesId: 4096, SpeciesName: "Monk", InAirIdleFrameIdxTurningPoint: 42, @@ -437,14 +437,14 @@ var skills = map[int]*Skill{ Speed: int32(float64(8) * WORLD_TO_VIRTUAL_GRID_RATIO), Bullet: Bullet{ StartupFrames: int32(15), - ActiveFrames: int32(30), + ActiveFrames: MAX_INT32, HitStunFrames: int32(15), BlockStunFrames: int32(9), Damage: int32(20), - SelfLockVelX: int32(float64(0.5) * WORLD_TO_VIRTUAL_GRID_RATIO), - SelfLockVelY: int32(float64(5) * WORLD_TO_VIRTUAL_GRID_RATIO), + 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), + PushbackVelY: int32(0), HitboxOffsetX: int32(float64(32) * WORLD_TO_VIRTUAL_GRID_RATIO), HitboxOffsetY: int32(0), HitboxSizeX: int32(float64(48) * WORLD_TO_VIRTUAL_GRID_RATIO), diff --git a/jsexport/battle/room_downsync_frame.go b/jsexport/battle/room_downsync_frame.go index 690b54d..6206e6a 100644 --- a/jsexport/battle/room_downsync_frame.go +++ b/jsexport/battle/room_downsync_frame.go @@ -60,6 +60,8 @@ type Barrier struct { } type Bullet struct { + BulletLocalId int32 // for referencing cached nodes in frontend rendering + // for offender OriginatedRenderFrameId int32 // Copied from the first bullet for all subsequent bullets OffenderJoinIndex int32 // Copied to favor collision handling of the dispatched bullet @@ -116,14 +118,15 @@ type Skill struct { } type RoomDownsyncFrame struct { - Id int32 - PlayersArr []*PlayerDownsync - CountdownNanos int64 - MeleeBullets []*MeleeBullet - FireballBullets []*FireballBullet - BackendUnconfirmedMask uint64 - ShouldForceResync bool - PlayerOpPatternToSkillId map[int]int + Id int32 + PlayersArr []*PlayerDownsync + CountdownNanos int64 + MeleeBullets []*MeleeBullet + FireballBullets []*FireballBullet + BackendUnconfirmedMask uint64 + ShouldForceResync bool + + BulletLocalIdCounter int32 } type InputFrameDownsync struct { diff --git a/jsexport/main.go b/jsexport/main.go index 7c4362f..49fc767 100644 --- a/jsexport/main.go +++ b/jsexport/main.go @@ -69,9 +69,50 @@ func NewPlayerDownsyncJs(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, }) } -func NewMeleeBulletJs(originatedRenderFrameId, offenderJoinIndex, startupFrames, cancellableStFrame, cancellableEdFrame, activeFrames, hitStunFrames, blockStunFrames, pushbackVelX, pushbackVelY, damage, selfLockVelX, selfLockVelY, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY int32, blowUp bool, teamId int32) *js.Object { +func NewMeleeBulletJs(bulletLocalId, originatedRenderFrameId, offenderJoinIndex, startupFrames, cancellableStFrame, cancellableEdFrame, activeFrames, hitStunFrames, blockStunFrames, pushbackVelX, pushbackVelY, damage, selfLockVelX, selfLockVelY, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY int32, blowUp bool, teamId int32) *js.Object { return js.MakeWrapper(&MeleeBullet{ Bullet: Bullet{ + BulletLocalId: bulletLocalId, + OriginatedRenderFrameId: originatedRenderFrameId, + OffenderJoinIndex: offenderJoinIndex, + + StartupFrames: startupFrames, + CancellableStFrame: cancellableStFrame, + CancellableEdFrame: cancellableEdFrame, + ActiveFrames: activeFrames, + + HitStunFrames: hitStunFrames, + BlockStunFrames: blockStunFrames, + PushbackVelX: pushbackVelX, + PushbackVelY: pushbackVelY, + Damage: damage, + + SelfLockVelX: selfLockVelX, + SelfLockVelY: selfLockVelY, + + HitboxOffsetX: hitboxOffsetX, + HitboxOffsetY: hitboxOffsetY, + HitboxSizeX: hitboxSizeX, + HitboxSizeY: hitboxSizeY, + + BlowUp: blowUp, + + TeamId: teamId, + }, + }) +} + +func NewFireballBulletJs(bulletLocalId, originatedRenderFrameId, offenderJoinIndex, startupFrames, cancellableStFrame, cancellableEdFrame, activeFrames, hitStunFrames, blockStunFrames, pushbackVelX, pushbackVelY, damage, selfLockVelX, selfLockVelY, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY int32, blowUp bool, teamId int32, virtualGridX, virtualGridY, dirX, dirY, velX, velY, speed int32) *js.Object { + return js.MakeWrapper(&FireballBullet{ + VirtualGridX: virtualGridX, + VirtualGridY: virtualGridY, + DirX: dirX, + DirY: dirY, + VelX: velX, + VelY: velY, + Speed: speed, + Bullet: Bullet{ + BulletLocalId: bulletLocalId, OriginatedRenderFrameId: originatedRenderFrameId, OffenderJoinIndex: offenderJoinIndex, @@ -110,12 +151,14 @@ func NewNpcPatrolCue(flAct, frAct uint64, x, y float64) *js.Object { }) } -func NewRoomDownsyncFrameJs(id int32, playersArr []*PlayerDownsync, meleeBullets []*MeleeBullet) *js.Object { +func NewRoomDownsyncFrameJs(id int32, playersArr []*PlayerDownsync, bulletLocalIdCounter int32, meleeBullets []*MeleeBullet, fireballBullets []*FireballBullet) *js.Object { // [WARNING] Avoid using "pb.RoomDownsyncFrame" here, in practive "MakeFullWrapper" doesn't expose the public fields for a "protobuf struct" as expected and requires helper functions like "GetCollisionSpaceObjsJs". return js.MakeFullWrapper(&RoomDownsyncFrame{ - Id: id, - PlayersArr: playersArr, - MeleeBullets: meleeBullets, + Id: id, + PlayersArr: playersArr, + BulletLocalIdCounter: bulletLocalIdCounter, + MeleeBullets: meleeBullets, + FireballBullets: fireballBullets, }) } @@ -170,6 +213,7 @@ func main() { "NewBarrierJs": NewBarrierJs, "NewPlayerDownsyncJs": NewPlayerDownsyncJs, "NewMeleeBulletJs": NewMeleeBulletJs, + "NewFireballBulletJs": NewFireballBulletJs, "NewNpcPatrolCue": NewNpcPatrolCue, "NewRoomDownsyncFrameJs": NewRoomDownsyncFrameJs, "NewCollisionSpaceJs": NewCollisionSpaceJs,