package main import ( "github.com/gopherjs/gopherjs/js" . "jsexport/battle" "resolv" ) /* [WARNING] Should avoid using "MakeFullWrapper" as much as possible, and completely remove its usage in 60fps calls like "update(dt)" on frontend! */ func NewCollisionHolder() *js.Object { return js.MakeWrapper(resolv.NewCollision()) } func NewInputFrameDownsync(inputFrameId int32, inputList []uint64, confirmedList uint64) *js.Object { return js.MakeWrapper(&InputFrameDownsync{ InputFrameId: inputFrameId, InputList: inputList, ConfirmedList: confirmedList, }) } func NewRingBufferJs(n int32) *js.Object { return js.MakeWrapper(resolv.NewRingBuffer(n)) } func NewCollisionSpaceJs(spaceW, spaceH, minStepW, minStepH int) *js.Object { return js.MakeWrapper(resolv.NewSpace(spaceW, spaceH, minStepW, minStepH)) } func NewVec2DJs(x, y float64) *js.Object { return js.MakeWrapper(&Vec2D{ X: x, Y: y, }) } func NewPolygon2DJs(anchor *Vec2D, points []*Vec2D) *js.Object { return js.MakeWrapper(&Polygon2D{ Anchor: anchor, Points: points, }) } func NewBarrierJs(boundary *Polygon2D) *js.Object { return js.MakeWrapper(&Barrier{ Boundary: boundary, }) } func NewPlayerDownsyncJs(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, framesToRecover, framesInChState, activeSkillId, activeSkillHit, framesInvinsible, speed, battleState, characterState, joinIndex, hp, maxHp, colliderRadius int32, inAir, onWall bool, onWallNormX, onWallNormY int32, capturedByInertia bool, bulletTeamId, chCollisionTeamId int32, revivalVirtualGridX, revivalVirtualGridY int32) *js.Object { return js.MakeWrapper(NewPlayerDownsync(id, virtualGridX, virtualGridY, dirX, dirY, velX, velY, framesToRecover, framesInChState, activeSkillId, activeSkillHit, framesInvinsible, speed, battleState, characterState, joinIndex, hp, maxHp, colliderRadius, inAir, onWall, onWallNormX, onWallNormY, capturedByInertia, bulletTeamId, chCollisionTeamId, revivalVirtualGridX, revivalVirtualGridY)) } func NewMeleeBulletJs(bulletLocalId, originatedRenderFrameId, offenderJoinIndex, startupFrames, cancellableStFrame, cancellableEdFrame, activeFrames, hitStunFrames, blockStunFrames, pushbackVelX, pushbackVelY, damage, selfLockVelX, selfLockVelY, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY int32, blowUp bool, teamId, blState, framesInBlState, explosionFrames, speciesId int32) *js.Object { return js.MakeWrapper(NewMeleeBullet(bulletLocalId, originatedRenderFrameId, offenderJoinIndex, startupFrames, cancellableStFrame, cancellableEdFrame, activeFrames, hitStunFrames, blockStunFrames, pushbackVelX, pushbackVelY, damage, selfLockVelX, selfLockVelY, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY, blowUp, teamId, blState, framesInBlState, explosionFrames, speciesId)) } 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, blState, framesInBlState, explosionFrames, speciesId int32) *js.Object { return js.MakeWrapper(NewFireballBullet(bulletLocalId, originatedRenderFrameId, offenderJoinIndex, startupFrames, cancellableStFrame, cancellableEdFrame, activeFrames, hitStunFrames, blockStunFrames, pushbackVelX, pushbackVelY, damage, selfLockVelX, selfLockVelY, hitboxOffsetX, hitboxOffsetY, hitboxSizeX, hitboxSizeY, blowUp, teamId, virtualGridX, virtualGridY, dirX, dirY, velX, velY, speed, blState, framesInBlState, explosionFrames, speciesId)) } func NewNpcPatrolCue(flAct, frAct uint64, x, y float64) *js.Object { return js.MakeWrapper(&NpcPatrolCue{ FlAct: flAct, FrAct: frAct, X: x, Y: y, }) } 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.MakeWrapper(&RoomDownsyncFrame{ Id: id, BulletLocalIdCounter: bulletLocalIdCounter, PlayersArr: playersArr, MeleeBullets: meleeBullets, FireballBullets: fireballBullets, }) } func GetCollisionSpaceObjsJs(space *resolv.Space) []*js.Object { // [WARNING] We couldn't just use the existing method "space.Objects()" to access them in JavaScript, there'd a stackoverflow error objs := space.Objects() ret := make([]*js.Object, len(objs)) for i, obj := range objs { ret[i] = js.MakeWrapper(obj) } return ret } func GenerateConvexPolygonColliderJs(unalignedSrc *Polygon2D, spaceOffsetX, spaceOffsetY float64, data interface{}, tag string) *js.Object { return js.MakeWrapper(GenerateConvexPolygonCollider(unalignedSrc, spaceOffsetX, spaceOffsetY, data, tag)) } func GetCharacterConfigsOrderedByJoinIndex(speciesIdList []int) []*js.Object { ret := make([]*js.Object, len(speciesIdList), len(speciesIdList)) for i, speciesId := range speciesIdList { ret[i] = js.MakeFullWrapper(Characters[speciesId]) } return ret } func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs(inputsBuffer *resolv.RingBuffer, currRenderFrameId int32, collisionSys *resolv.Space, collisionSysMap map[int32]*resolv.Object, collisionSpaceOffsetX, collisionSpaceOffsetY float64, chConfigsOrderedByJoinIndex []*CharacterConfig, renderFrameBuffer *resolv.RingBuffer, collision *resolv.Collision, effPushbacks []*Vec2D, hardPushbackNormsArr [][]*Vec2D, jumpedOrNotList []bool) bool { // We need access to all fields of RoomDownsyncFrame for displaying in frontend return ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer, currRenderFrameId, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, chConfigsOrderedByJoinIndex, renderFrameBuffer, collision, effPushbacks, hardPushbackNormsArr, jumpedOrNotList) } func GetRoomDownsyncFrame(renderFrameBuffer *resolv.RingBuffer, frameId int32) *js.Object { // [WARNING] Calling "renderFrameBuffer.GetByFrameId(frameId)" directly from transpiled frontend code would automatically invoke the expensive "$externalize" and "$mapArray"! See profiling result for more details. candidate := renderFrameBuffer.GetByFrameId(frameId) if nil == candidate { return nil } return js.MakeWrapper(candidate.(*RoomDownsyncFrame)) } func GetInputFrameDownsync(inputsBuffer *resolv.RingBuffer, inputFrameId int32) *js.Object { candidate := inputsBuffer.GetByFrameId(inputFrameId) if nil == candidate { return nil } return js.MakeWrapper(candidate.(*InputFrameDownsync)) } func GetInput(ifd *InputFrameDownsync, i int) uint64 { // [WARNING] Calling "ifd.GetInputList()" directly from transpiled frontend code would make a copy of the array. return ifd.InputList[i] } func GetPlayer(rdf *RoomDownsyncFrame, i int) *js.Object { // [WARNING] Calling "rdf.GetPlayersArr()" directly from transpiled frontend code would automatically invoke the expensive "$externalize" and "$mapArray"! See profiling result for more details. return js.MakeWrapper(rdf.PlayersArr[i]) } func GetMeleeBullet(rdf *RoomDownsyncFrame, i int) *js.Object { if TERMINATING_BULLET_LOCAL_ID == rdf.MeleeBullets[i].GetBulletLocalId() { return nil } return js.MakeWrapper(rdf.MeleeBullets[i]) } func GetFireballBullet(rdf *RoomDownsyncFrame, i int) *js.Object { if TERMINATING_BULLET_LOCAL_ID == rdf.FireballBullets[i].GetBulletLocalId() { return nil } return js.MakeWrapper(rdf.FireballBullets[i]) } func main() { js.Global.Set("gopkgs", map[string]interface{}{ "NewVec2DJs": NewVec2DJs, "NewPolygon2DJs": NewPolygon2DJs, "NewBarrierJs": NewBarrierJs, "NewPlayerDownsyncJs": NewPlayerDownsyncJs, "NewMeleeBulletJs": NewMeleeBulletJs, "NewFireballBulletJs": NewFireballBulletJs, "NewNpcPatrolCue": NewNpcPatrolCue, "NewRoomDownsyncFrameJs": NewRoomDownsyncFrameJs, "NewCollisionSpaceJs": NewCollisionSpaceJs, "NewCollisionHolder": NewCollisionHolder, "NewInputFrameDownsync": NewInputFrameDownsync, "NewRingBufferJs": NewRingBufferJs, "GenerateConvexPolygonColliderJs": GenerateConvexPolygonColliderJs, "GetCollisionSpaceObjsJs": GetCollisionSpaceObjsJs, "WorldToPolygonColliderBLPos": WorldToPolygonColliderBLPos, // No need to wrap primitive return types "PolygonColliderBLToWorldPos": PolygonColliderBLToWorldPos, "WorldToVirtualGridPos": WorldToVirtualGridPos, "VirtualGridToWorldPos": VirtualGridToWorldPos, "GetCharacterConfigsOrderedByJoinIndex": GetCharacterConfigsOrderedByJoinIndex, "ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs": ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs, "ConvertToDelayedInputFrameId": ConvertToDelayedInputFrameId, "ConvertToNoDelayInputFrameId": ConvertToNoDelayInputFrameId, "ConvertToFirstUsedRenderFrameId": ConvertToFirstUsedRenderFrameId, "ConvertToLastUsedRenderFrameId": ConvertToLastUsedRenderFrameId, "ShouldGenerateInputFrameUpsync": ShouldGenerateInputFrameUpsync, "IsGeneralBulletActive": IsGeneralBulletActive, "GetRoomDownsyncFrame": GetRoomDownsyncFrame, "GetInputFrameDownsync": GetInputFrameDownsync, "GetPlayer": GetPlayer, "GetMeleeBullet": GetMeleeBullet, "GetFireballBullet": GetFireballBullet, "GetInput": GetInput, }) }