2022-11-17 23:39:32 +08:00
const i18n = require ( 'LanguageData' );
i18n . init ( window . language ); // languageID should be equal to the one we input in New Language ID input field
const OnlineMap = require ( './Map' );
cc . Class ({
extends : OnlineMap ,
onDestroy () {
console . warn ( "+++++++ Map onDestroy()" );
},
onLoad () {
const self = this ;
window . mapIns = self ;
2023-01-10 12:08:15 +08:00
self . showCriticalCoordinateLabels = true ;
2022-11-17 23:39:32 +08:00
2022-11-19 20:58:07 +08:00
const mapNode = self . node ;
const canvasNode = mapNode . parent ;
self . mainCameraNode = self . canvasNode . getChildByName ( "Main Camera" );
2022-11-17 23:39:32 +08:00
self . mainCamera = self . mainCameraNode . getComponent ( cc . Camera );
for ( let child of self . mainCameraNode . children ) {
child . setScale ( 1 / self . mainCamera . zoomRatio );
}
self . widgetsAboveAllNode = self . mainCameraNode . getChildByName ( "WidgetsAboveAll" );
self . mainCameraNode . setPosition ( cc . v2 ());
/** Init required prefab ended. */
2022-11-19 20:58:07 +08:00
self . inputFrameUpsyncDelayTolerance = 2 ;
2022-12-26 15:11:35 +08:00
self . collisionMinStep = 8 ;
2022-11-17 23:39:32 +08:00
2022-12-01 11:35:56 +08:00
self . renderCacheSize = 1024 ;
2022-12-09 17:22:04 +08:00
self . serverFps = 60 ;
2022-11-19 20:58:07 +08:00
self . rollbackEstimatedDt = 0.016667 ;
self . rollbackEstimatedDtMillis = 16.667 ;
self . rollbackEstimatedDtNanos = 16666666 ;
2022-12-12 19:11:59 +08:00
self . tooFastDtIntervalMillis = 0.5 * self . rollbackEstimatedDtMillis ;
2022-11-17 23:39:32 +08:00
const tiledMapIns = self . node . getComponent ( cc . TiledMap );
2022-11-19 20:58:07 +08:00
const fullPathOfTmxFile = cc . js . formatStr ( "map/%s/map" , "dungeon" );
2022-11-17 23:39:32 +08:00
cc . loader . loadRes ( fullPathOfTmxFile , cc . TiledMapAsset , ( err , tmxAsset ) => {
if ( null != err ) {
console . error ( err );
return ;
}
tiledMapIns . tmxAsset = null ;
mapNode . removeAllChildren ();
2022-12-11 12:20:42 +08:00
if ( self . showCriticalCoordinateLabels ) {
const drawer = new cc . Node ();
drawer . setPosition ( cc . v2 ( 0 , 0 ))
safelyAddChild ( self . node , drawer );
setLocalZOrder ( drawer , 999 );
const g = drawer . addComponent ( cc . Graphics );
g . lineWidth = 2 ;
self . g = g ;
}
2022-11-17 23:39:32 +08:00
tiledMapIns . tmxAsset = tmxAsset ;
const newMapSize = tiledMapIns . getMapSize ();
const newTileSize = tiledMapIns . getTileSize ();
self . node . setContentSize ( newMapSize . width * newTileSize . width , newMapSize . height * newTileSize . height );
self . node . setPosition ( cc . v2 ( 0 , 0 ));
2023-01-01 15:43:25 +08:00
self . spaceOffsetX = (( newMapSize . width * newTileSize . width ) >> 1 );
self . spaceOffsetY = (( newMapSize . height * newTileSize . height ) >> 1 );
2022-12-26 15:11:35 +08:00
self . _resetCurrentMatch ();
2022-11-17 23:39:32 +08:00
let barrierIdCounter = 0 ;
const boundaryObjs = tileCollisionManager . extractBoundaryObjects ( self . node );
for ( let boundaryObj of boundaryObjs . barriers ) {
2022-12-26 15:11:35 +08:00
const gopkgsBoundaryAnchor = gopkgs . NewVec2DJs ( boundaryObj . anchor . x , boundaryObj . anchor . y );
const gopkgsBoundaryPts = Array . from ( boundaryObj , p => {
return gopkgs . NewVec2DJs ( p . x , p . y );
});
const gopkgsBoundary = gopkgs . NewPolygon2DJs ( gopkgsBoundaryAnchor , gopkgsBoundaryPts );
const gopkgsBarrier = gopkgs . NewBarrierJs ( gopkgsBoundary );
2022-11-17 23:39:32 +08:00
2022-12-26 15:11:35 +08:00
const newBarrierCollider = gopkgs . GenerateConvexPolygonColliderJs ( gopkgsBoundary , self . spaceOffsetX , self . spaceOffsetY , gopkgsBarrier , "Barrier" );
self . gopkgsCollisionSys . Add ( newBarrierCollider );
2022-11-17 23:39:32 +08:00
2022-12-26 15:11:35 +08:00
// console.log("Created barrier: ", newBarrierCollider);
2022-11-17 23:39:32 +08:00
++ barrierIdCounter ;
const collisionBarrierIndex = ( self . collisionBarrierIndexPrefix + barrierIdCounter );
2022-12-26 15:11:35 +08:00
self . gopkgsCollisionSysMap [ collisionBarrierIndex ] = newBarrierCollider ;
2022-11-17 23:39:32 +08:00
}
2023-01-04 23:48:00 +08:00
self . initDebugDrawers ();
2022-11-19 20:58:07 +08:00
2023-01-01 15:43:25 +08:00
const p1Vpos = gopkgs . WorldToVirtualGridPos ( boundaryObjs . playerStartingPositions [ 0 ]. x , boundaryObjs . playerStartingPositions [ 0 ]. y );
2023-01-01 20:18:35 +08:00
const p2Vpos = gopkgs . WorldToVirtualGridPos ( boundaryObjs . playerStartingPositions [ 1 ]. x , boundaryObjs . playerStartingPositions [ 1 ]. y );
const colliderRadiusV = gopkgs . WorldToVirtualGridPos ( 12.0 , 0 );
2023-01-01 15:43:25 +08:00
2023-01-12 16:09:20 +08:00
const speciesIdList = [ 1 , 4096 ];
const chConfigsOrderedByJoinIndex = gopkgs . GetCharacterConfigsOrderedByJoinIndex ( speciesIdList );
2022-11-25 13:24:03 +08:00
const startRdf = window . pb . protos . RoomDownsyncFrame . create ({
2022-11-19 20:58:07 +08:00
id : window . MAGIC_ROOM_DOWNSYNC_FRAME_ID . BATTLE_START ,
2022-12-26 15:11:35 +08:00
playersArr : [
window . pb . protos . PlayerDownsync . create ({
2022-11-19 20:58:07 +08:00
id : 10 ,
2022-11-20 21:07:45 +08:00
joinIndex : 1 ,
2023-01-01 15:43:25 +08:00
virtualGridX : p1Vpos [ 0 ],
virtualGridY : p1Vpos [ 1 ],
2023-01-12 16:09:20 +08:00
speed : chConfigsOrderedByJoinIndex [ 0 ]. Speed ,
2023-01-01 20:18:35 +08:00
colliderRadius : colliderRadiusV [ 0 ],
2022-12-31 15:47:45 +08:00
characterState : window . ATK_CHARACTER_STATE . InAirIdle1NoJump [ 0 ],
2022-11-23 15:04:32 +08:00
framesToRecover : 0 ,
2023-01-01 20:18:35 +08:00
dirX : + 2 ,
dirY : 0 ,
velX : 0 ,
velY : 0 ,
inAir : true ,
2023-01-12 16:09:20 +08:00
onWall : false ,
2023-01-01 20:18:35 +08:00
}),
window . pb . protos . PlayerDownsync . create ({
id : 11 ,
joinIndex : 2 ,
virtualGridX : p2Vpos [ 0 ],
virtualGridY : p2Vpos [ 1 ],
2023-01-12 16:09:20 +08:00
speed : chConfigsOrderedByJoinIndex [ 1 ]. Speed ,
2023-01-01 20:18:35 +08:00
colliderRadius : colliderRadiusV [ 0 ],
characterState : window . ATK_CHARACTER_STATE . InAirIdle1NoJump [ 0 ],
framesToRecover : 0 ,
dirX : - 2 ,
2022-11-23 22:11:28 +08:00
dirY : 0 ,
2022-12-09 17:22:04 +08:00
velX : 0 ,
velY : 0 ,
inAir : true ,
2023-01-12 16:09:20 +08:00
onWall : false ,
2022-12-09 17:22:04 +08:00
}),
2022-12-31 15:47:45 +08:00
],
2023-01-12 16:09:20 +08:00
speciesIdList : speciesIdList ,
2022-11-25 13:24:03 +08:00
});
2022-12-26 15:11:35 +08:00
2022-11-19 20:58:07 +08:00
self . selfPlayerInfo = {
2022-12-28 18:06:05 +08:00
Id : 10 ,
JoinIndex : 1 ,
2022-11-19 20:58:07 +08:00
};
self . onRoomDownsyncFrame ( startRdf );
self . battleState = ALL_BATTLE_STATES . IN_BATTLE ;
2022-11-17 23:39:32 +08:00
});
},
update ( dt ) {
const self = this ;
if ( ALL_BATTLE_STATES . IN_BATTLE == self . battleState ) {
const elapsedMillisSinceLastFrameIdTriggered = performance . now () - self . lastRenderFrameIdTriggeredAt ;
2022-12-12 19:11:59 +08:00
if ( elapsedMillisSinceLastFrameIdTriggered < self . tooFastDtIntervalMillis ) {
// [WARNING] We should avoid a frontend ticking too fast to prevent cheating, as well as ticking too slow to cause a "resync avalanche" that impacts user experience!
2022-11-17 23:39:32 +08:00
// console.debug("Avoiding too fast frame@renderFrameId=", self.renderFrameId, ": elapsedMillisSinceLastFrameIdTriggered=", elapsedMillisSinceLastFrameIdTriggered);
return ;
}
try {
let st = performance . now ();
let prevSelfInput = null ,
currSelfInput = null ;
2023-01-02 20:42:23 +08:00
const noDelayInputFrameId = gopkgs . ConvertToNoDelayInputFrameId ( self . renderFrameId ); // It's important that "inputDelayFrames == 0" here
if ( gopkgs . ShouldGenerateInputFrameUpsync ( self . renderFrameId )) {
2022-12-24 19:06:31 +08:00
const prevAndCurrInputs = self . getOrPrefabInputFrameUpsync ( noDelayInputFrameId );
2022-11-17 23:39:32 +08:00
prevSelfInput = prevAndCurrInputs [ 0 ];
currSelfInput = prevAndCurrInputs [ 1 ];
}
2022-12-26 15:11:35 +08:00
const [ prevRdf , rdf ] = self . rollbackAndChase ( self . renderFrameId , self . renderFrameId + 1 , self . gopkgsCollisionSys , self . gopkgsCollisionSysMap , false );
2022-11-25 11:20:05 +08:00
self . applyRoomDownsyncFrameDynamics ( rdf , prevRdf );
2022-12-12 23:17:54 +08:00
self . showDebugBoundaries ( rdf );
2022-12-12 19:11:59 +08:00
++ self . renderFrameId ;
self . lastRenderFrameIdTriggeredAt = performance . now ();
2022-11-17 23:39:32 +08:00
let t3 = performance . now ();
} catch ( err ) {
console . error ( "Error during Map.update" , err );
2022-12-11 12:20:42 +08:00
}
}
},
2022-12-26 15:11:35 +08:00
2022-11-17 23:39:32 +08:00
});