2022-11-17 15:39:32 +00: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 ;
2022-12-26 07:11:35 +00:00
self . showCriticalCoordinateLabels = false ;
2022-11-17 15:39:32 +00:00
2022-11-19 12:58:07 +00:00
const mapNode = self . node ;
const canvasNode = mapNode . parent ;
self . mainCameraNode = self . canvasNode . getChildByName ( "Main Camera" ) ;
2022-11-17 15:39:32 +00: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 12:58:07 +00:00
self . inputFrameUpsyncDelayTolerance = 2 ;
2022-12-26 07:11:35 +00:00
self . collisionMinStep = 8 ;
2022-11-17 15:39:32 +00:00
2022-12-01 03:35:56 +00:00
self . renderCacheSize = 1024 ;
2022-12-09 09:22:04 +00:00
self . serverFps = 60 ;
2022-11-19 12:58:07 +00:00
self . rollbackEstimatedDt = 0.016667 ;
self . rollbackEstimatedDtMillis = 16.667 ;
self . rollbackEstimatedDtNanos = 16666666 ;
2022-12-12 11:11:59 +00:00
self . tooFastDtIntervalMillis = 0.5 * self . rollbackEstimatedDtMillis ;
2022-11-17 15:39:32 +00:00
const tiledMapIns = self . node . getComponent ( cc . TiledMap ) ;
2022-11-19 12:58:07 +00:00
const fullPathOfTmxFile = cc . js . formatStr ( "map/%s/map" , "dungeon" ) ;
2022-11-17 15:39:32 +00:00
cc . loader . loadRes ( fullPathOfTmxFile , cc . TiledMapAsset , ( err , tmxAsset ) => {
if ( null != err ) {
console . error ( err ) ;
return ;
}
tiledMapIns . tmxAsset = null ;
mapNode . removeAllChildren ( ) ;
2022-12-11 04:20:42 +00: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 15:39:32 +00: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 07:43:25 +00:00
self . spaceOffsetX = ( ( newMapSize . width * newTileSize . width ) >> 1 ) ;
self . spaceOffsetY = ( ( newMapSize . height * newTileSize . height ) >> 1 ) ;
2022-12-26 07:11:35 +00:00
self . _resetCurrentMatch ( ) ;
2022-11-17 15:39:32 +00:00
let barrierIdCounter = 0 ;
const boundaryObjs = tileCollisionManager . extractBoundaryObjects ( self . node ) ;
for ( let boundaryObj of boundaryObjs . barriers ) {
2022-12-26 07:11:35 +00: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 15:39:32 +00:00
2022-12-26 07:11:35 +00:00
const newBarrierCollider = gopkgs . GenerateConvexPolygonColliderJs ( gopkgsBoundary , self . spaceOffsetX , self . spaceOffsetY , gopkgsBarrier , "Barrier" ) ;
self . gopkgsCollisionSys . Add ( newBarrierCollider ) ;
2022-11-17 15:39:32 +00:00
2022-12-11 09:26:55 +00:00
if ( false && self . showCriticalCoordinateLabels ) {
2022-11-17 15:39:32 +00:00
for ( let i = 0 ; i < boundaryObj . length ; ++ i ) {
const barrierVertLabelNode = new cc . Node ( ) ;
switch ( i % 4 ) {
case 0 :
barrierVertLabelNode . color = cc . Color . RED ;
break ;
case 1 :
barrierVertLabelNode . color = cc . Color . GRAY ;
break ;
case 2 :
barrierVertLabelNode . color = cc . Color . BLACK ;
break ;
default :
barrierVertLabelNode . color = cc . Color . MAGENTA ;
break ;
}
const wx = boundaryObj . anchor . x + boundaryObj [ i ] . x ,
wy = boundaryObj . anchor . y + boundaryObj [ i ] . y ;
barrierVertLabelNode . setPosition ( cc . v2 ( wx , wy ) ) ;
const barrierVertLabel = barrierVertLabelNode . addComponent ( cc . Label ) ;
barrierVertLabel . fontSize = 12 ;
barrierVertLabel . lineHeight = barrierVertLabel . fontSize + 1 ;
barrierVertLabel . string = ` ( ${ wx . toFixed ( 1 ) } , ${ wy . toFixed ( 1 ) } ) ` ;
safelyAddChild ( self . node , barrierVertLabelNode ) ;
setLocalZOrder ( barrierVertLabelNode , 5 ) ;
barrierVertLabelNode . active = true ;
}
}
2022-12-26 07:11:35 +00:00
// console.log("Created barrier: ", newBarrierCollider);
2022-11-17 15:39:32 +00:00
++ barrierIdCounter ;
const collisionBarrierIndex = ( self . collisionBarrierIndexPrefix + barrierIdCounter ) ;
2022-12-26 07:11:35 +00:00
self . gopkgsCollisionSysMap [ collisionBarrierIndex ] = newBarrierCollider ;
2022-11-17 15:39:32 +00:00
}
2022-11-19 12:58:07 +00:00
2023-01-01 07:43:25 +00:00
const p1Vpos = gopkgs . WorldToVirtualGridPos ( boundaryObjs . playerStartingPositions [ 0 ] . x , boundaryObjs . playerStartingPositions [ 0 ] . y ) ;
2023-01-01 12:18:35 +00:00
const p2Vpos = gopkgs . WorldToVirtualGridPos ( boundaryObjs . playerStartingPositions [ 1 ] . x , boundaryObjs . playerStartingPositions [ 1 ] . y ) ;
2023-01-01 07:43:25 +00:00
const speedV = gopkgs . WorldToVirtualGridPos ( 1.0 , 0 ) ;
2023-01-01 12:18:35 +00:00
const colliderRadiusV = gopkgs . WorldToVirtualGridPos ( 12.0 , 0 ) ;
2023-01-01 07:43:25 +00:00
2022-11-25 05:24:03 +00:00
const startRdf = window . pb . protos . RoomDownsyncFrame . create ( {
2022-11-19 12:58:07 +00:00
id : window . MAGIC _ROOM _DOWNSYNC _FRAME _ID . BATTLE _START ,
2022-12-26 07:11:35 +00:00
playersArr : [
window . pb . protos . PlayerDownsync . create ( {
2022-11-19 12:58:07 +00:00
id : 10 ,
2022-11-20 13:07:45 +00:00
joinIndex : 1 ,
2023-01-01 07:43:25 +00:00
virtualGridX : p1Vpos [ 0 ] ,
virtualGridY : p1Vpos [ 1 ] ,
speed : speedV [ 0 ] ,
2023-01-01 12:18:35 +00:00
colliderRadius : colliderRadiusV [ 0 ] ,
2022-12-31 07:47:45 +00:00
characterState : window . ATK _CHARACTER _STATE . InAirIdle1NoJump [ 0 ] ,
2022-11-23 07:04:32 +00:00
framesToRecover : 0 ,
2023-01-01 12:18:35 +00:00
dirX : + 2 ,
dirY : 0 ,
velX : 0 ,
velY : 0 ,
inAir : true ,
} ) ,
window . pb . protos . PlayerDownsync . create ( {
id : 11 ,
joinIndex : 2 ,
virtualGridX : p2Vpos [ 0 ] ,
virtualGridY : p2Vpos [ 1 ] ,
speed : speedV [ 0 ] ,
colliderRadius : colliderRadiusV [ 0 ] ,
characterState : window . ATK _CHARACTER _STATE . InAirIdle1NoJump [ 0 ] ,
framesToRecover : 0 ,
dirX : - 2 ,
2022-11-23 14:11:28 +00:00
dirY : 0 ,
2022-12-09 09:22:04 +00:00
velX : 0 ,
velY : 0 ,
inAir : true ,
} ) ,
2022-12-31 07:47:45 +00:00
] ,
2023-01-02 08:36:17 +00:00
speciesIdList : [ 1 , 0 ] ,
2022-11-25 05:24:03 +00:00
} ) ;
2022-12-26 07:11:35 +00:00
2022-11-19 12:58:07 +00:00
self . selfPlayerInfo = {
2022-12-28 10:06:05 +00:00
Id : 10 ,
JoinIndex : 1 ,
2022-11-19 12:58:07 +00:00
} ;
self . onRoomDownsyncFrame ( startRdf ) ;
self . battleState = ALL _BATTLE _STATES . IN _BATTLE ;
2022-11-17 15:39:32 +00:00
} ) ;
} ,
update ( dt ) {
const self = this ;
if ( ALL _BATTLE _STATES . IN _BATTLE == self . battleState ) {
const elapsedMillisSinceLastFrameIdTriggered = performance . now ( ) - self . lastRenderFrameIdTriggeredAt ;
2022-12-12 11:11:59 +00: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 15:39:32 +00: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 12:42:23 +00:00
const noDelayInputFrameId = gopkgs . ConvertToNoDelayInputFrameId ( self . renderFrameId ) ; // It's important that "inputDelayFrames == 0" here
if ( gopkgs . ShouldGenerateInputFrameUpsync ( self . renderFrameId ) ) {
2022-12-24 11:06:31 +00:00
const prevAndCurrInputs = self . getOrPrefabInputFrameUpsync ( noDelayInputFrameId ) ;
2022-11-17 15:39:32 +00:00
prevSelfInput = prevAndCurrInputs [ 0 ] ;
currSelfInput = prevAndCurrInputs [ 1 ] ;
}
2022-12-26 07:11:35 +00:00
const [ prevRdf , rdf ] = self . rollbackAndChase ( self . renderFrameId , self . renderFrameId + 1 , self . gopkgsCollisionSys , self . gopkgsCollisionSysMap , false ) ;
2022-11-25 03:20:05 +00:00
self . applyRoomDownsyncFrameDynamics ( rdf , prevRdf ) ;
2022-12-12 15:17:54 +00:00
self . showDebugBoundaries ( rdf ) ;
2022-12-12 11:11:59 +00:00
++ self . renderFrameId ;
self . lastRenderFrameIdTriggeredAt = performance . now ( ) ;
2022-11-17 15:39:32 +00:00
let t3 = performance . now ( ) ;
} catch ( err ) {
console . error ( "Error during Map.update" , err ) ;
2022-12-11 04:20:42 +00:00
}
}
} ,
2022-12-26 07:11:35 +00:00
2022-11-17 15:39:32 +00:00
} ) ;