mirror of
https://github.com/genxium/DelayNoMore
synced 2025-10-18 21:16:48 +00:00
Compare commits
17 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
14bb6fa1ea | ||
|
3c15e21652 | ||
|
727e66787f | ||
|
9eb6ad26ef | ||
|
847607f3e6 | ||
|
8d2665ebd7 | ||
|
1694287083 | ||
|
e63ce2c484 | ||
|
a28c9a31f9 | ||
|
3b186c7f75 | ||
|
34c4a24b64 | ||
|
4e7c3060fe | ||
|
2928cbbe3c | ||
|
850eee20a8 | ||
|
5eec7fcfe7 | ||
|
4e42c0770c | ||
|
8647c1a859 |
@@ -2,15 +2,17 @@
|
|||||||
1. Server received too late (solution: force confirmation)
|
1. Server received too late (solution: force confirmation)
|
||||||
2. Client received too late (solution: prediction and frame chasing, big impact on user experience because the graphics will be inconsistent if mismatches occur too often)
|
2. Client received too late (solution: prediction and frame chasing, big impact on user experience because the graphics will be inconsistent if mismatches occur too often)
|
||||||
|
|
||||||
# Potential avalanche from local lag
|
# Potential avalanche from `ACTIVE SLOW TICKER`
|
||||||
Under the current "input delay" algorithm, the lag of a single player would cause all the other players to receive outdated commands, e.g. when at a certain moment
|
Under the current "input delay" algorithm, the lag of a single player would cause all the other players to receive outdated commands, e.g. when at a certain moment
|
||||||
- player#1: renderFrameId = 100, significantly lagged due to local CPU overheated
|
- player#1: renderFrameId = 100, **still active in battle but significantly lagged** due to local CPU overheated
|
||||||
- player#2: renderFrameId = 240
|
- player#2: renderFrameId = 240
|
||||||
- player#3: renderFrameId = 239
|
- player#3: renderFrameId = 239
|
||||||
- player#4: renderFrameId = 242
|
- player#4: renderFrameId = 242
|
||||||
|
|
||||||
players #2, #3 #4 would receive "outdated(in their subjective feelings) but all-confirmed commands" from then on, thus forced to rollback and chase many frames - the lag due to "large range of frame-chasing" would then further deteriorate the situation - like an avalanche.
|
players #2, #3 #4 would receive "outdated(in their subjective feelings) but all-confirmed commands" from then on, thus forced to rollback and chase many frames - the lag due to "large range of frame-chasing" would then further deteriorate the situation - like an avalanche.
|
||||||
|
|
||||||
|
**BE CAUTIOUS, THIS `ACTIVE SLOW TICKER` SITUATION HAPPENS QUITE OFTEN FOR REAL DEVICES** where different operating systems and temporary CPU overheat cause different lags for different player in a same battle! If not properly handled, slow tickers would be `inputing in the "history" of other players`, resulting in too frequent prediction mismatch and thus inconsistent graphics for other players!
|
||||||
|
|
||||||
In a "no-server & p2p" setup, I couldn't think of a proper way to cope with such edge case. Solely on the frontend we could only mitigate the impact to players #2, #3, #4, e.g. a potential lag due to "large range of frame-chasing" is proactively avoided in `<proj-root>/frontend/assets/scripts/Map.js, function update(dt)`.
|
In a "no-server & p2p" setup, I couldn't think of a proper way to cope with such edge case. Solely on the frontend we could only mitigate the impact to players #2, #3, #4, e.g. a potential lag due to "large range of frame-chasing" is proactively avoided in `<proj-root>/frontend/assets/scripts/Map.js, function update(dt)`.
|
||||||
|
|
||||||
To be fair, **a "p2p" setup can reduce round-trip to single-trip**, but w/o a point of authority in such case player#1 needs a way to recognize the slowness (e.g. check the received peer inputs) and ticks faster for a while to catch up; in contrast in a "server as authority" setup, the server could force confirming an inputFrame without player#1's upsync, and notify player#1 to apply a "roomDownsyncFrame" as well as drop all its outdated local inputFrames.
|
To be fair, **a "p2p" setup can reduce round-trip to single-trip**, but w/o a point of authority in such case player#1 needs a way to recognize the slowness (e.g. check the received peer inputs) and ticks faster for a while to catch up; in contrast in a "server as authority" setup, the server could force confirming an inputFrame without player#1's upsync, and notify player#1 to apply a "roomDownsyncFrame" as well as drop all its outdated local inputFrames.
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
PROJECTNAME=server.exe
|
PROJECTNAME=server.exe
|
||||||
ROOT_DIR=.
|
ROOT_DIR=.
|
||||||
GOPROXY=https://mirrors.aliyun.com/goproxy
|
#GOPROXY=https://mirrors.aliyun.com/goproxy
|
||||||
|
GOPROXY=https://goproxy.io
|
||||||
all: help
|
all: help
|
||||||
|
|
||||||
gen-constants:
|
gen-constants:
|
||||||
|
0
battle_srv/check_daemon.sh
Normal file → Executable file
0
battle_srv/check_daemon.sh
Normal file → Executable file
@@ -1,28 +1,29 @@
|
|||||||
{
|
{
|
||||||
"RET_CODE": {
|
"RET_CODE": {
|
||||||
"__comment__":"基础",
|
"__comment__": "Websocket",
|
||||||
"OK": 9000,
|
"OK": 3000,
|
||||||
"UNKNOWN_ERROR": 9001,
|
"UNKNOWN_ERROR": 3001,
|
||||||
"INVALID_REQUEST_PARAM": 9002,
|
"INVALID_REQUEST_PARAM": 3002,
|
||||||
"IS_TEST_ACC": 9003,
|
"IS_TEST_ACC": 3003,
|
||||||
"MYSQL_ERROR": 9004,
|
"MYSQL_ERROR": 3004,
|
||||||
"NONEXISTENT_ACT": 9005,
|
"NONEXISTENT_ACT": 3005,
|
||||||
"LACK_OF_DIAMOND": 9006,
|
"LACK_OF_DIAMOND": 3006,
|
||||||
"LACK_OF_GOLD": 9007,
|
"LACK_OF_GOLD": 3007,
|
||||||
"LACK_OF_ENERGY": 9008,
|
"LACK_OF_ENERGY": 3008,
|
||||||
"NONEXISTENT_ACT_HANDLER": 9009,
|
"NONEXISTENT_ACT_HANDLER": 3009,
|
||||||
"LOCALLY_NO_AVAILABLE_ROOM": 9010,
|
"LOCALLY_NO_AVAILABLE_ROOM": 3010,
|
||||||
"LOCALLY_NO_SPECIFIED_ROOM": 9011,
|
"LOCALLY_NO_SPECIFIED_ROOM": 3011,
|
||||||
"PLAYER_NOT_ADDABLE_TO_ROOM": 9012,
|
"PLAYER_NOT_ADDABLE_TO_ROOM": 3012,
|
||||||
"PLAYER_NOT_READDABLE_TO_ROOM": 9013,
|
"PLAYER_NOT_READDABLE_TO_ROOM": 3013,
|
||||||
"PLAYER_NOT_FOUND": 9014,
|
"PLAYER_NOT_FOUND": 3014,
|
||||||
"PLAYER_CHEATING": 9015,
|
"PLAYER_CHEATING": 3015,
|
||||||
"WECHAT_SERVER_ERROR": 9016,
|
"WECHAT_SERVER_ERROR": 3016,
|
||||||
"IS_BOT_ACC": 9017,
|
"IS_BOT_ACC": 3017,
|
||||||
|
"ACTIVE_WATCHDOG": 3018,
|
||||||
|
"BATTLE_STOPPED": 3019,
|
||||||
|
"CLIENT_MISMATCHED_RENDER_FRAME": 3020,
|
||||||
|
|
||||||
"__comment__":"SMS",
|
"__comment__": "OTHERS",
|
||||||
"SMS_CAPTCHA_REQUESTED_TOO_FREQUENTLY": 5001,
|
|
||||||
"SMS_CAPTCHA_NOT_MATCH": 5002,
|
|
||||||
"INVALID_TOKEN": 2001,
|
"INVALID_TOKEN": 2001,
|
||||||
|
|
||||||
"DUPLICATED": 2002,
|
"DUPLICATED": 2002,
|
||||||
@@ -39,12 +40,15 @@
|
|||||||
"FAILED_TO_DELETE": 2015,
|
"FAILED_TO_DELETE": 2015,
|
||||||
"FAILED_TO_CREATE": 2016,
|
"FAILED_TO_CREATE": 2016,
|
||||||
"INCORRECT_PHONE_NUMBER": 2018,
|
"INCORRECT_PHONE_NUMBER": 2018,
|
||||||
"INSUFFICIENT_MEM_TO_ALLOCATE_CONNECTION": 3001,
|
"INSUFFICIENT_MEM_TO_ALLOCATE_CONNECTION": 2019,
|
||||||
"PASSWORD_RESET_CODE_GENERATION_PER_EMAIL_TOO_FREQUENTLY": 4000,
|
"PASSWORD_RESET_CODE_GENERATION_PER_EMAIL_TOO_FREQUENTLY": 2020,
|
||||||
"TRADE_CREATION_TOO_FREQUENTLY": 4002,
|
"TRADE_CREATION_TOO_FREQUENTLY": 2021,
|
||||||
"MAP_NOT_UNLOCKED": 4003,
|
"MAP_NOT_UNLOCKED": 2022,
|
||||||
|
|
||||||
|
"GET_SMS_CAPTCHA_RESP_ERROR_CODE": 2023,
|
||||||
|
"SMS_CAPTCHA_REQUESTED_TOO_FREQUENTLY": 2024,
|
||||||
|
"SMS_CAPTCHA_NOT_MATCH": 2025,
|
||||||
|
|
||||||
"GET_SMS_CAPTCHA_RESP_ERROR_CODE": 5003,
|
|
||||||
"NOT_IMPLEMENTED_YET": 65535
|
"NOT_IMPLEMENTED_YET": 65535
|
||||||
},
|
},
|
||||||
"AUTH_CHANNEL": {
|
"AUTH_CHANNEL": {
|
||||||
@@ -62,6 +66,6 @@
|
|||||||
},
|
},
|
||||||
"WS": {
|
"WS": {
|
||||||
"INTERVAL_TO_PING": 2000,
|
"INTERVAL_TO_PING": 2000,
|
||||||
"WILL_KICK_IF_INACTIVE_FOR": 6000
|
"WILL_KICK_IF_INACTIVE_FOR": 4000
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -15,10 +15,13 @@ type constants struct {
|
|||||||
SmsValidResendPeriodSeconds int `json:"SMS_VALID_RESEND_PERIOD_SECONDS"`
|
SmsValidResendPeriodSeconds int `json:"SMS_VALID_RESEND_PERIOD_SECONDS"`
|
||||||
} `json:"PLAYER"`
|
} `json:"PLAYER"`
|
||||||
RetCode struct {
|
RetCode struct {
|
||||||
|
ActiveWatchdog int `json:"ACTIVE_WATCHDOG"`
|
||||||
|
BattleStopped int `json:"BATTLE_STOPPED"`
|
||||||
Duplicated int `json:"DUPLICATED"`
|
Duplicated int `json:"DUPLICATED"`
|
||||||
FailedToCreate int `json:"FAILED_TO_CREATE"`
|
FailedToCreate int `json:"FAILED_TO_CREATE"`
|
||||||
FailedToDelete int `json:"FAILED_TO_DELETE"`
|
FailedToDelete int `json:"FAILED_TO_DELETE"`
|
||||||
FailedToUpdate int `json:"FAILED_TO_UPDATE"`
|
FailedToUpdate int `json:"FAILED_TO_UPDATE"`
|
||||||
|
GetSmsCaptchaRespErrorCode int `json:"GET_SMS_CAPTCHA_RESP_ERROR_CODE"`
|
||||||
IncorrectCaptcha int `json:"INCORRECT_CAPTCHA"`
|
IncorrectCaptcha int `json:"INCORRECT_CAPTCHA"`
|
||||||
IncorrectHandle int `json:"INCORRECT_HANDLE"`
|
IncorrectHandle int `json:"INCORRECT_HANDLE"`
|
||||||
IncorrectPassword int `json:"INCORRECT_PASSWORD"`
|
IncorrectPassword int `json:"INCORRECT_PASSWORD"`
|
||||||
@@ -28,27 +31,26 @@ type constants struct {
|
|||||||
InvalidEmailLiteral int `json:"INVALID_EMAIL_LITERAL"`
|
InvalidEmailLiteral int `json:"INVALID_EMAIL_LITERAL"`
|
||||||
InvalidRequestParam int `json:"INVALID_REQUEST_PARAM"`
|
InvalidRequestParam int `json:"INVALID_REQUEST_PARAM"`
|
||||||
InvalidToken int `json:"INVALID_TOKEN"`
|
InvalidToken int `json:"INVALID_TOKEN"`
|
||||||
IsTestAcc int `json:"IS_TEST_ACC"`
|
|
||||||
IsBotAcc int `json:"IS_BOT_ACC"`
|
IsBotAcc int `json:"IS_BOT_ACC"`
|
||||||
|
IsTestAcc int `json:"IS_TEST_ACC"`
|
||||||
LackOfDiamond int `json:"LACK_OF_DIAMOND"`
|
LackOfDiamond int `json:"LACK_OF_DIAMOND"`
|
||||||
LackOfEnergy int `json:"LACK_OF_ENERGY"`
|
LackOfEnergy int `json:"LACK_OF_ENERGY"`
|
||||||
LackOfGold int `json:"LACK_OF_GOLD"`
|
LackOfGold int `json:"LACK_OF_GOLD"`
|
||||||
|
LocallyNoAvailableRoom int `json:"LOCALLY_NO_AVAILABLE_ROOM"`
|
||||||
|
LocallyNoSpecifiedRoom int `json:"LOCALLY_NO_SPECIFIED_ROOM"`
|
||||||
MapNotUnlocked int `json:"MAP_NOT_UNLOCKED"`
|
MapNotUnlocked int `json:"MAP_NOT_UNLOCKED"`
|
||||||
MysqlError int `json:"MYSQL_ERROR"`
|
MysqlError int `json:"MYSQL_ERROR"`
|
||||||
GetSmsCaptchaRespErrorCode int `json:"GET_SMS_CAPTCHA_RESP_ERROR_CODE"`
|
|
||||||
NewHandleConflict int `json:"NEW_HANDLE_CONFLICT"`
|
NewHandleConflict int `json:"NEW_HANDLE_CONFLICT"`
|
||||||
NonexistentAct int `json:"NONEXISTENT_ACT"`
|
NonexistentAct int `json:"NONEXISTENT_ACT"`
|
||||||
NonexistentActHandler int `json:"NONEXISTENT_ACT_HANDLER"`
|
NonexistentActHandler int `json:"NONEXISTENT_ACT_HANDLER"`
|
||||||
LocallyNoAvailableRoom int `json:"LOCALLY_NO_AVAILABLE_ROOM"`
|
|
||||||
LocallyNoSpecifiedRoom int `json:"LOCALLY_NO_SPECIFIED_ROOM"`
|
|
||||||
PlayerNotAddableToRoom int `json:"PLAYER_NOT_ADDABLE_TO_ROOM"`
|
|
||||||
PlayerNotReAddableToRoom int `json:"PLAYER_NOT_READDABLE_TO_ROOM"`
|
|
||||||
PlayerNotFound int `json:"PLAYER_NOT_FOUND"`
|
|
||||||
PlayerCheating int `json:"PLAYER_CHEATING"`
|
|
||||||
NotImplementedYet int `json:"NOT_IMPLEMENTED_YET"`
|
NotImplementedYet int `json:"NOT_IMPLEMENTED_YET"`
|
||||||
NoAssociatedEmail int `json:"NO_ASSOCIATED_EMAIL"`
|
NoAssociatedEmail int `json:"NO_ASSOCIATED_EMAIL"`
|
||||||
Ok int `json:"OK"`
|
Ok int `json:"OK"`
|
||||||
PasswordResetCodeGenerationPerEmailTooFrequently int `json:"PASSWORD_RESET_CODE_GENERATION_PER_EMAIL_TOO_FREQUENTLY"`
|
PasswordResetCodeGenerationPerEmailTooFrequently int `json:"PASSWORD_RESET_CODE_GENERATION_PER_EMAIL_TOO_FREQUENTLY"`
|
||||||
|
PlayerCheating int `json:"PLAYER_CHEATING"`
|
||||||
|
PlayerNotAddableToRoom int `json:"PLAYER_NOT_ADDABLE_TO_ROOM"`
|
||||||
|
PlayerNotFound int `json:"PLAYER_NOT_FOUND"`
|
||||||
|
PlayerNotReaddableToRoom int `json:"PLAYER_NOT_READDABLE_TO_ROOM"`
|
||||||
SendEmailTimeout int `json:"SEND_EMAIL_TIMEOUT"`
|
SendEmailTimeout int `json:"SEND_EMAIL_TIMEOUT"`
|
||||||
SmsCaptchaNotMatch int `json:"SMS_CAPTCHA_NOT_MATCH"`
|
SmsCaptchaNotMatch int `json:"SMS_CAPTCHA_NOT_MATCH"`
|
||||||
SmsCaptchaRequestedTooFrequently int `json:"SMS_CAPTCHA_REQUESTED_TOO_FREQUENTLY"`
|
SmsCaptchaRequestedTooFrequently int `json:"SMS_CAPTCHA_REQUESTED_TOO_FREQUENTLY"`
|
||||||
|
@@ -61,13 +61,13 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
ATK_CHARACTER_STATE_IDLE1 = 0
|
ATK_CHARACTER_STATE_IDLE1 = int32(0)
|
||||||
ATK_CHARACTER_STATE_WALKING = 1
|
ATK_CHARACTER_STATE_WALKING = int32(1)
|
||||||
ATK_CHARACTER_STATE_ATK1 = 2
|
ATK_CHARACTER_STATE_ATK1 = int32(2)
|
||||||
ATK_CHARACTER_STATE_ATKED1 = 3
|
ATK_CHARACTER_STATE_ATKED1 = int32(3)
|
||||||
ATK_CHARACTER_STATE_INAIR_IDLE1 = 4
|
ATK_CHARACTER_STATE_INAIR_IDLE1 = int32(4)
|
||||||
ATK_CHARACTER_STATE_INAIR_ATK1 = 5
|
ATK_CHARACTER_STATE_INAIR_ATK1 = int32(5)
|
||||||
ATK_CHARACTER_STATE_INAIR_ATKED1 = 6
|
ATK_CHARACTER_STATE_INAIR_ATKED1 = int32(6)
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -151,6 +151,7 @@ type Room struct {
|
|||||||
*/
|
*/
|
||||||
PlayerDownsyncSessionDict map[int32]*websocket.Conn
|
PlayerDownsyncSessionDict map[int32]*websocket.Conn
|
||||||
PlayerDownsyncChanDict map[int32](chan InputsBufferSnapshot)
|
PlayerDownsyncChanDict map[int32](chan InputsBufferSnapshot)
|
||||||
|
PlayerActiveWatchdogDict map[int32](*Watchdog)
|
||||||
PlayerSignalToCloseDict map[int32]SignalToCloseConnCbType
|
PlayerSignalToCloseDict map[int32]SignalToCloseConnCbType
|
||||||
Score float32
|
Score float32
|
||||||
State int32
|
State int32
|
||||||
@@ -161,16 +162,18 @@ type Room struct {
|
|||||||
DismissalWaitGroup sync.WaitGroup
|
DismissalWaitGroup sync.WaitGroup
|
||||||
Barriers map[int32]*Barrier
|
Barriers map[int32]*Barrier
|
||||||
InputsBuffer *RingBuffer // Indices are STRICTLY consecutive
|
InputsBuffer *RingBuffer // Indices are STRICTLY consecutive
|
||||||
InputsBufferLock sync.Mutex // Guards [InputsBuffer, LastAllConfirmedInputFrameId, LastAllConfirmedInputList, LastAllConfirmedInputFrameIdWithChange]
|
InputsBufferLock sync.Mutex // Guards [InputsBuffer, LatestPlayerUpsyncedInputFrameId, LastAllConfirmedInputFrameId, LastAllConfirmedInputList, LastAllConfirmedInputFrameIdWithChange]
|
||||||
RenderFrameBuffer *RingBuffer // Indices are STRICTLY consecutive
|
RenderFrameBuffer *RingBuffer // Indices are STRICTLY consecutive
|
||||||
|
LatestPlayerUpsyncedInputFrameId int32
|
||||||
LastAllConfirmedInputFrameId int32
|
LastAllConfirmedInputFrameId int32
|
||||||
LastAllConfirmedInputFrameIdWithChange int32
|
LastAllConfirmedInputFrameIdWithChange int32
|
||||||
LastAllConfirmedInputList []uint64
|
LastAllConfirmedInputList []uint64
|
||||||
JoinIndexBooleanArr []bool
|
JoinIndexBooleanArr []bool
|
||||||
|
|
||||||
BackendDynamicsEnabled bool
|
BackendDynamicsEnabled bool
|
||||||
LastRenderFrameIdTriggeredAt int64
|
ForceAllResyncOnAnyActiveSlowTicker bool
|
||||||
PlayerDefaultSpeed int32
|
LastRenderFrameIdTriggeredAt int64
|
||||||
|
PlayerDefaultSpeed int32
|
||||||
|
|
||||||
BulletBattleLocalIdCounter int32
|
BulletBattleLocalIdCounter int32
|
||||||
dilutedRollbackEstimatedDtNanos int64
|
dilutedRollbackEstimatedDtNanos int64
|
||||||
@@ -206,6 +209,12 @@ func (pR *Room) AddPlayerIfPossible(pPlayerFromDbInit *Player, session *websocke
|
|||||||
pR.Players[playerId] = pPlayerFromDbInit
|
pR.Players[playerId] = pPlayerFromDbInit
|
||||||
pR.PlayerDownsyncSessionDict[playerId] = session
|
pR.PlayerDownsyncSessionDict[playerId] = session
|
||||||
pR.PlayerSignalToCloseDict[playerId] = signalToCloseConnOfThisPlayer
|
pR.PlayerSignalToCloseDict[playerId] = signalToCloseConnOfThisPlayer
|
||||||
|
newWatchdog := NewWatchdog(ConstVals.Ws.WillKickIfInactiveFor, func() {
|
||||||
|
Logger.Warn("Conn inactive watchdog triggered#1:", zap.Any("playerId", playerId), zap.Any("roomId", pR.Id), zap.Any("roomState", pR.State), zap.Any("roomEffectivePlayerCount", pR.EffectivePlayerCount))
|
||||||
|
signalToCloseConnOfThisPlayer(Constants.RetCode.ActiveWatchdog, "")
|
||||||
|
})
|
||||||
|
newWatchdog.Stop()
|
||||||
|
pR.PlayerActiveWatchdogDict[playerId] = newWatchdog
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -237,6 +246,10 @@ func (pR *Room) ReAddPlayerIfPossible(pTmpPlayerInstance *Player, session *webso
|
|||||||
|
|
||||||
pR.PlayerDownsyncSessionDict[playerId] = session
|
pR.PlayerDownsyncSessionDict[playerId] = session
|
||||||
pR.PlayerSignalToCloseDict[playerId] = signalToCloseConnOfThisPlayer
|
pR.PlayerSignalToCloseDict[playerId] = signalToCloseConnOfThisPlayer
|
||||||
|
pR.PlayerActiveWatchdogDict[playerId] = NewWatchdog(ConstVals.Ws.WillKickIfInactiveFor, func() {
|
||||||
|
Logger.Warn("Conn inactive watchdog triggered#2:", zap.Any("playerId", playerId), zap.Any("roomId", pR.Id), zap.Any("roomState", pR.State), zap.Any("roomEffectivePlayerCount", pR.EffectivePlayerCount))
|
||||||
|
signalToCloseConnOfThisPlayer(Constants.RetCode.ActiveWatchdog, "")
|
||||||
|
}) // For ReAdded player the new watchdog starts immediately
|
||||||
|
|
||||||
Logger.Warn("ReAddPlayerIfPossible finished.", zap.Any("roomId", pR.Id), zap.Any("playerId", playerId), zap.Any("joinIndex", pEffectiveInRoomPlayerInstance.JoinIndex), zap.Any("playerBattleState", pEffectiveInRoomPlayerInstance.BattleState), zap.Any("roomState", pR.State), zap.Any("roomEffectivePlayerCount", pR.EffectivePlayerCount), zap.Any("AckingFrameId", pEffectiveInRoomPlayerInstance.AckingFrameId), zap.Any("AckingInputFrameId", pEffectiveInRoomPlayerInstance.AckingInputFrameId), zap.Any("LastSentInputFrameId", pEffectiveInRoomPlayerInstance.LastSentInputFrameId))
|
Logger.Warn("ReAddPlayerIfPossible finished.", zap.Any("roomId", pR.Id), zap.Any("playerId", playerId), zap.Any("joinIndex", pEffectiveInRoomPlayerInstance.JoinIndex), zap.Any("playerBattleState", pEffectiveInRoomPlayerInstance.BattleState), zap.Any("roomState", pR.State), zap.Any("roomEffectivePlayerCount", pR.EffectivePlayerCount), zap.Any("AckingFrameId", pEffectiveInRoomPlayerInstance.AckingFrameId), zap.Any("AckingInputFrameId", pEffectiveInRoomPlayerInstance.AckingInputFrameId), zap.Any("LastSentInputFrameId", pEffectiveInRoomPlayerInstance.LastSentInputFrameId))
|
||||||
return true
|
return true
|
||||||
@@ -367,11 +380,10 @@ func (pR *Room) InputsBufferString(allDetails bool) string {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
f := tmp.(*InputFrameDownsync)
|
f := tmp.(*InputFrameDownsync)
|
||||||
//s = append(s, fmt.Sprintf("{inputFrameId: %v, inputList: %v, &inputList: %p, confirmedList: %v}", f.InputFrameId, f.InputList, &(f.InputList), f.ConfirmedList))
|
s = append(s, fmt.Sprintf("{\"inputFrameId\":%d,\"inputList\":%v,\"confirmedList\":\"%d\"}", f.InputFrameId, f.InputList, f.ConfirmedList))
|
||||||
s = append(s, fmt.Sprintf("{inputFrameId: %v, inputList: %v, confirmedList: %v}", f.InputFrameId, f.InputList, f.ConfirmedList))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return strings.Join(s, "; ")
|
return strings.Join(s, "\n")
|
||||||
} else {
|
} else {
|
||||||
return fmt.Sprintf("{renderFrameId: %d, stInputFrameId: %d, edInputFrameId: %d, lastAllConfirmedInputFrameIdWithChange: %d, lastAllConfirmedInputFrameId: %d}", pR.RenderFrameId, pR.InputsBuffer.StFrameId, pR.InputsBuffer.EdFrameId, pR.LastAllConfirmedInputFrameIdWithChange, pR.LastAllConfirmedInputFrameId)
|
return fmt.Sprintf("{renderFrameId: %d, stInputFrameId: %d, edInputFrameId: %d, lastAllConfirmedInputFrameIdWithChange: %d, lastAllConfirmedInputFrameId: %d}", pR.RenderFrameId, pR.InputsBuffer.StFrameId, pR.InputsBuffer.EdFrameId, pR.LastAllConfirmedInputFrameIdWithChange, pR.LastAllConfirmedInputFrameId)
|
||||||
}
|
}
|
||||||
@@ -420,6 +432,9 @@ func (pR *Room) StartBattle() {
|
|||||||
pR.LastRenderFrameIdTriggeredAt = utils.UnixtimeNano()
|
pR.LastRenderFrameIdTriggeredAt = utils.UnixtimeNano()
|
||||||
battleStartedAt := utils.UnixtimeNano()
|
battleStartedAt := utils.UnixtimeNano()
|
||||||
Logger.Info("The `battleMainLoop` is started for:", zap.Any("roomId", pR.Id))
|
Logger.Info("The `battleMainLoop` is started for:", zap.Any("roomId", pR.Id))
|
||||||
|
for _, watchdog := range pR.PlayerActiveWatchdogDict {
|
||||||
|
watchdog.Kick()
|
||||||
|
}
|
||||||
for {
|
for {
|
||||||
stCalculation := utils.UnixtimeNano()
|
stCalculation := utils.UnixtimeNano()
|
||||||
elapsedNanosSinceLastFrameIdTriggered := stCalculation - pR.LastRenderFrameIdTriggeredAt
|
elapsedNanosSinceLastFrameIdTriggered := stCalculation - pR.LastRenderFrameIdTriggeredAt
|
||||||
@@ -451,10 +466,7 @@ func (pR *Room) StartBattle() {
|
|||||||
thatPlayerBattleState := atomic.LoadInt32(&(player.BattleState)) // Might be changed in "OnPlayerDisconnected/OnPlayerLost" from other threads
|
thatPlayerBattleState := atomic.LoadInt32(&(player.BattleState)) // Might be changed in "OnPlayerDisconnected/OnPlayerLost" from other threads
|
||||||
// [WARNING] DON'T try to send any message to an inactive player!
|
// [WARNING] DON'T try to send any message to an inactive player!
|
||||||
switch thatPlayerBattleState {
|
switch thatPlayerBattleState {
|
||||||
case PlayerBattleStateIns.DISCONNECTED:
|
case PlayerBattleStateIns.DISCONNECTED, PlayerBattleStateIns.LOST, PlayerBattleStateIns.EXPELLED_DURING_GAME, PlayerBattleStateIns.EXPELLED_IN_DISMISSAL:
|
||||||
case PlayerBattleStateIns.LOST:
|
|
||||||
case PlayerBattleStateIns.EXPELLED_DURING_GAME:
|
|
||||||
case PlayerBattleStateIns.EXPELLED_IN_DISMISSAL:
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
kickoffFrame := pR.RenderFrameBuffer.GetByFrameId(0).(*RoomDownsyncFrame)
|
kickoffFrame := pR.RenderFrameBuffer.GetByFrameId(0).(*RoomDownsyncFrame)
|
||||||
@@ -500,16 +512,12 @@ func (pR *Room) StartBattle() {
|
|||||||
case inputsBufferSnapshot := <-playerDownsyncChan:
|
case inputsBufferSnapshot := <-playerDownsyncChan:
|
||||||
nowBattleState := atomic.LoadInt32(&pR.State)
|
nowBattleState := atomic.LoadInt32(&pR.State)
|
||||||
switch nowBattleState {
|
switch nowBattleState {
|
||||||
case RoomBattleStateIns.IDLE:
|
case RoomBattleStateIns.IDLE, RoomBattleStateIns.STOPPING_BATTLE_FOR_SETTLEMENT, RoomBattleStateIns.IN_SETTLEMENT, RoomBattleStateIns.IN_DISMISSAL:
|
||||||
case RoomBattleStateIns.STOPPING_BATTLE_FOR_SETTLEMENT:
|
|
||||||
case RoomBattleStateIns.IN_SETTLEMENT:
|
|
||||||
case RoomBattleStateIns.IN_DISMISSAL:
|
|
||||||
Logger.Warn(fmt.Sprintf("Battle is not waiting/preparing/active for playerDownsyncChan for (roomId: %d, playerId:%d)", pR.Id, playerId))
|
Logger.Warn(fmt.Sprintf("Battle is not waiting/preparing/active for playerDownsyncChan for (roomId: %d, playerId:%d)", pR.Id, playerId))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
pR.downsyncToSinglePlayer(playerId, player, inputsBufferSnapshot.RefRenderFrameId, inputsBufferSnapshot.UnconfirmedMask, inputsBufferSnapshot.ToSendInputFrameDownsyncs, inputsBufferSnapshot.ShouldForceResync)
|
||||||
pR.downsyncToSinglePlayer(playerId, player, inputsBufferSnapshot.RefRenderFrameId, inputsBufferSnapshot.UnconfirmedMask, inputsBufferSnapshot.ToSendInputFrameDownsyncs)
|
//Logger.Info(fmt.Sprintf("Sent inputsBufferSnapshot(refRenderFrameId:%d, unconfirmedMask:%v) to for (roomId: %d, playerId:%d)#2", inputsBufferSnapshot.RefRenderFrameId, inputsBufferSnapshot.UnconfirmedMask, pR.Id, playerId))
|
||||||
Logger.Debug(fmt.Sprintf("Sent inputsBufferSnapshot(refRenderFrameId:%d, unconfirmedMask:%v) to for (roomId: %d, playerId:%d)#2", inputsBufferSnapshot.RefRenderFrameId, inputsBufferSnapshot.UnconfirmedMask, pR.Id, playerId))
|
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -565,6 +573,10 @@ func (pR *Room) OnBattleCmdReceived(pReq *WsReq) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if watchdog, existent := pR.PlayerActiveWatchdogDict[playerId]; existent {
|
||||||
|
watchdog.Kick()
|
||||||
|
}
|
||||||
|
|
||||||
atomic.StoreInt32(&(player.AckingFrameId), ackingFrameId)
|
atomic.StoreInt32(&(player.AckingFrameId), ackingFrameId)
|
||||||
atomic.StoreInt32(&(player.AckingInputFrameId), ackingInputFrameId)
|
atomic.StoreInt32(&(player.AckingInputFrameId), ackingInputFrameId)
|
||||||
|
|
||||||
@@ -729,6 +741,10 @@ func (pR *Room) OnDismissed() {
|
|||||||
pR.PlayersArr = make([]*Player, pR.Capacity)
|
pR.PlayersArr = make([]*Player, pR.Capacity)
|
||||||
pR.CollisionSysMap = make(map[int32]*resolv.Object)
|
pR.CollisionSysMap = make(map[int32]*resolv.Object)
|
||||||
pR.PlayerDownsyncSessionDict = make(map[int32]*websocket.Conn)
|
pR.PlayerDownsyncSessionDict = make(map[int32]*websocket.Conn)
|
||||||
|
for _, oldWatchdog := range pR.PlayerActiveWatchdogDict {
|
||||||
|
oldWatchdog.Stop()
|
||||||
|
}
|
||||||
|
pR.PlayerActiveWatchdogDict = make(map[int32]*Watchdog)
|
||||||
for _, oldChan := range pR.PlayerDownsyncChanDict {
|
for _, oldChan := range pR.PlayerDownsyncChanDict {
|
||||||
close(oldChan)
|
close(oldChan)
|
||||||
}
|
}
|
||||||
@@ -740,6 +756,7 @@ func (pR *Room) OnDismissed() {
|
|||||||
pR.RenderFrameBuffer = NewRingBuffer(pR.RenderCacheSize)
|
pR.RenderFrameBuffer = NewRingBuffer(pR.RenderCacheSize)
|
||||||
pR.InputsBuffer = NewRingBuffer((pR.RenderCacheSize >> 1) + 1)
|
pR.InputsBuffer = NewRingBuffer((pR.RenderCacheSize >> 1) + 1)
|
||||||
|
|
||||||
|
pR.LatestPlayerUpsyncedInputFrameId = -1
|
||||||
pR.LastAllConfirmedInputFrameId = -1
|
pR.LastAllConfirmedInputFrameId = -1
|
||||||
pR.LastAllConfirmedInputFrameIdWithChange = -1
|
pR.LastAllConfirmedInputFrameIdWithChange = -1
|
||||||
pR.LastAllConfirmedInputList = make([]uint64, pR.Capacity)
|
pR.LastAllConfirmedInputList = make([]uint64, pR.Capacity)
|
||||||
@@ -747,25 +764,26 @@ func (pR *Room) OnDismissed() {
|
|||||||
pR.RenderFrameId = 0
|
pR.RenderFrameId = 0
|
||||||
pR.CurDynamicsRenderFrameId = 0
|
pR.CurDynamicsRenderFrameId = 0
|
||||||
pR.InputDelayFrames = 8
|
pR.InputDelayFrames = 8
|
||||||
pR.NstDelayFrames = 8
|
pR.NstDelayFrames = 16
|
||||||
pR.InputScaleFrames = uint32(2)
|
pR.InputScaleFrames = uint32(2)
|
||||||
pR.ServerFps = 60
|
pR.ServerFps = 60
|
||||||
pR.RollbackEstimatedDtMillis = 16.667 // Use fixed-and-low-precision to mitigate the inconsistent floating-point-number issue between Golang and JavaScript
|
pR.RollbackEstimatedDtMillis = 16.667 // Use fixed-and-low-precision to mitigate the inconsistent floating-point-number issue between Golang and JavaScript
|
||||||
pR.RollbackEstimatedDtNanos = 16666666 // A little smaller than the actual per frame time, just for logging FAST FRAME
|
pR.RollbackEstimatedDtNanos = 16666666 // A little smaller than the actual per frame time, just for logging FAST FRAME
|
||||||
dilutedServerFps := float64(55.0)
|
dilutedServerFps := float64(58.0) // Don't set this value too small, otherwise we might miss force confirmation needs for slow tickers!
|
||||||
pR.dilutedRollbackEstimatedDtNanos = int64(float64(pR.RollbackEstimatedDtNanos) * float64(pR.ServerFps) / dilutedServerFps)
|
pR.dilutedRollbackEstimatedDtNanos = int64(float64(pR.RollbackEstimatedDtNanos) * float64(pR.ServerFps) / dilutedServerFps)
|
||||||
pR.BattleDurationFrames = 120 * pR.ServerFps
|
pR.BattleDurationFrames = 60 * pR.ServerFps
|
||||||
pR.BattleDurationNanos = int64(pR.BattleDurationFrames) * (pR.RollbackEstimatedDtNanos + 1)
|
pR.BattleDurationNanos = int64(pR.BattleDurationFrames) * (pR.RollbackEstimatedDtNanos + 1)
|
||||||
pR.InputFrameUpsyncDelayTolerance = 2
|
pR.InputFrameUpsyncDelayTolerance = (pR.NstDelayFrames >> pR.InputScaleFrames) - 1 // this value should be strictly smaller than (NstDelayFrames >> InputScaleFrames), otherwise "type#1 forceConfirmation" might become a lag avalanche
|
||||||
pR.MaxChasingRenderFramesPerUpdate = 8
|
pR.MaxChasingRenderFramesPerUpdate = 12 // Don't set this value too high to avoid exhausting frontend CPU within a single frame
|
||||||
|
|
||||||
pR.BackendDynamicsEnabled = true // [WARNING] When "false", recovery upon reconnection wouldn't work!
|
pR.BackendDynamicsEnabled = true // [WARNING] When "false", recovery upon reconnection wouldn't work!
|
||||||
|
pR.ForceAllResyncOnAnyActiveSlowTicker = true // See tradeoff discussion in "downsyncToAllPlayers"
|
||||||
punchSkillId := int32(1)
|
punchSkillId := int32(1)
|
||||||
pR.MeleeSkillConfig = make(map[int32]*MeleeBullet, 0)
|
pR.MeleeSkillConfig = make(map[int32]*MeleeBullet, 0)
|
||||||
pR.MeleeSkillConfig[punchSkillId] = &MeleeBullet{
|
pR.MeleeSkillConfig[punchSkillId] = &MeleeBullet{
|
||||||
// for offender
|
// for offender
|
||||||
StartupFrames: int32(10),
|
StartupFrames: int32(10),
|
||||||
ActiveFrames: int32(3),
|
ActiveFrames: int32(10),
|
||||||
RecoveryFrames: int32(34),
|
RecoveryFrames: int32(34),
|
||||||
RecoveryFramesOnBlock: int32(34),
|
RecoveryFramesOnBlock: int32(34),
|
||||||
RecoveryFramesOnHit: int32(34),
|
RecoveryFramesOnHit: int32(34),
|
||||||
@@ -837,10 +855,7 @@ func (pR *Room) OnPlayerDisconnected(playerId int32) {
|
|||||||
if player, existent := pR.Players[playerId]; existent {
|
if player, existent := pR.Players[playerId]; existent {
|
||||||
thatPlayerBattleState := atomic.LoadInt32(&(player.BattleState))
|
thatPlayerBattleState := atomic.LoadInt32(&(player.BattleState))
|
||||||
switch thatPlayerBattleState {
|
switch thatPlayerBattleState {
|
||||||
case PlayerBattleStateIns.DISCONNECTED:
|
case PlayerBattleStateIns.DISCONNECTED, PlayerBattleStateIns.LOST, PlayerBattleStateIns.EXPELLED_DURING_GAME, PlayerBattleStateIns.EXPELLED_IN_DISMISSAL:
|
||||||
case PlayerBattleStateIns.LOST:
|
|
||||||
case PlayerBattleStateIns.EXPELLED_DURING_GAME:
|
|
||||||
case PlayerBattleStateIns.EXPELLED_IN_DISMISSAL:
|
|
||||||
Logger.Info("Room OnPlayerDisconnected[early return #1]:", zap.Any("playerId", playerId), zap.Any("playerBattleState", pR.Players[playerId].BattleState), zap.Any("roomId", pR.Id), zap.Any("nowRoomBattleState", pR.State), zap.Any("nowRoomEffectivePlayerCount", pR.EffectivePlayerCount))
|
Logger.Info("Room OnPlayerDisconnected[early return #1]:", zap.Any("playerId", playerId), zap.Any("playerBattleState", pR.Players[playerId].BattleState), zap.Any("roomId", pR.Id), zap.Any("nowRoomBattleState", pR.State), zap.Any("nowRoomEffectivePlayerCount", pR.EffectivePlayerCount))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -863,7 +878,7 @@ func (pR *Room) OnPlayerDisconnected(playerId int32) {
|
|||||||
default:
|
default:
|
||||||
atomic.StoreInt32(&(pR.Players[playerId].BattleState), PlayerBattleStateIns.DISCONNECTED)
|
atomic.StoreInt32(&(pR.Players[playerId].BattleState), PlayerBattleStateIns.DISCONNECTED)
|
||||||
pR.clearPlayerNetworkSession(playerId) // Still need clear the network session pointers, because "OnPlayerDisconnected" is only triggered from "signalToCloseConnOfThisPlayer" in "ws/serve.go", when the same player reconnects the network session pointers will be re-assigned
|
pR.clearPlayerNetworkSession(playerId) // Still need clear the network session pointers, because "OnPlayerDisconnected" is only triggered from "signalToCloseConnOfThisPlayer" in "ws/serve.go", when the same player reconnects the network session pointers will be re-assigned
|
||||||
Logger.Warn("OnPlayerDisconnected finished:", zap.Any("roomId", pR.Id), zap.Any("playerId", playerId), zap.Any("playerBattleState", pR.Players[playerId].BattleState), zap.Any("nowRoomBattleState", pR.State), zap.Any("nowRoomEffectivePlayerCount", pR.EffectivePlayerCount))
|
Logger.Warn("OnPlayerDisconnected finished:", zap.Any("roomId", pR.Id), zap.Any("playerId", playerId), zap.Any("playerBattleState", pR.Players[playerId].BattleState), zap.Any("nowRoomBattleState", pR.State), zap.Any("nowRoomEffectivePlayerCount", pR.EffectivePlayerCount), zap.Any("now InputsBuffer", pR.InputsBufferString(true)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -892,6 +907,8 @@ func (pR *Room) clearPlayerNetworkSession(playerId int32) {
|
|||||||
if _, y := pR.PlayerDownsyncSessionDict[playerId]; y {
|
if _, y := pR.PlayerDownsyncSessionDict[playerId]; y {
|
||||||
Logger.Debug("clearPlayerNetworkSession:", zap.Any("roomId", pR.Id), zap.Any("playerId", playerId))
|
Logger.Debug("clearPlayerNetworkSession:", zap.Any("roomId", pR.Id), zap.Any("playerId", playerId))
|
||||||
// [WARNING] No need to close "pR.PlayerDownsyncChanDict[playerId]" immediately!
|
// [WARNING] No need to close "pR.PlayerDownsyncChanDict[playerId]" immediately!
|
||||||
|
pR.PlayerActiveWatchdogDict[playerId].Stop()
|
||||||
|
delete(pR.PlayerActiveWatchdogDict, playerId)
|
||||||
delete(pR.PlayerDownsyncSessionDict, playerId)
|
delete(pR.PlayerDownsyncSessionDict, playerId)
|
||||||
delete(pR.PlayerSignalToCloseDict, playerId)
|
delete(pR.PlayerSignalToCloseDict, playerId)
|
||||||
}
|
}
|
||||||
@@ -954,7 +971,6 @@ func (pR *Room) OnPlayerBattleColliderAcked(playerId int32) bool {
|
|||||||
if false == existing {
|
if false == existing {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
shouldTryToStartBattle := true
|
shouldTryToStartBattle := true
|
||||||
Logger.Debug(fmt.Sprintf("OnPlayerBattleColliderAcked-before: roomId=%v, roomState=%v, targetPlayerId=%v, targetPlayerBattleState=%v, capacity=%v, EffectivePlayerCount=%v", pR.Id, pR.State, targetPlayer.Id, targetPlayer.BattleState, pR.Capacity, pR.EffectivePlayerCount))
|
Logger.Debug(fmt.Sprintf("OnPlayerBattleColliderAcked-before: roomId=%v, roomState=%v, targetPlayerId=%v, targetPlayerBattleState=%v, capacity=%v, EffectivePlayerCount=%v", pR.Id, pR.State, targetPlayer.Id, targetPlayer.BattleState, pR.Capacity, pR.EffectivePlayerCount))
|
||||||
targetPlayerBattleState := atomic.LoadInt32(&(targetPlayer.BattleState))
|
targetPlayerBattleState := atomic.LoadInt32(&(targetPlayer.BattleState))
|
||||||
@@ -987,6 +1003,7 @@ func (pR *Room) OnPlayerBattleColliderAcked(playerId int32) bool {
|
|||||||
case PlayerBattleStateIns.READDED_PENDING_BATTLE_COLLIDER_ACK:
|
case PlayerBattleStateIns.READDED_PENDING_BATTLE_COLLIDER_ACK:
|
||||||
shouldTryToStartBattle = false
|
shouldTryToStartBattle = false
|
||||||
atomic.StoreInt32(&(targetPlayer.BattleState), PlayerBattleStateIns.READDED_BATTLE_COLLIDER_ACKED)
|
atomic.StoreInt32(&(targetPlayer.BattleState), PlayerBattleStateIns.READDED_BATTLE_COLLIDER_ACKED)
|
||||||
|
Logger.Warn(fmt.Sprintf("OnPlayerBattleColliderAcked-reAdded: roomId=%v, roomState=%v, targetPlayerId=%v, targetPlayerBattleState=%v, capacity=%v, EffectivePlayerCount=%v", pR.Id, pR.State, targetPlayer.Id, targetPlayer.BattleState, pR.Capacity, pR.EffectivePlayerCount))
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1047,7 +1064,7 @@ func (pR *Room) shouldPrefabInputFrameDownsync(prevRenderFrameId int32, renderFr
|
|||||||
return false, -1
|
return false, -1
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pR *Room) prefabInputFrameDownsync(inputFrameId int32) *InputFrameDownsync {
|
func (pR *Room) getOrPrefabInputFrameDownsync(inputFrameId int32) *InputFrameDownsync {
|
||||||
/*
|
/*
|
||||||
[WARNING] This function MUST BE called while "pR.InputsBufferLock" is locked.
|
[WARNING] This function MUST BE called while "pR.InputsBufferLock" is locked.
|
||||||
|
|
||||||
@@ -1067,7 +1084,11 @@ func (pR *Room) prefabInputFrameDownsync(inputFrameId int32) *InputFrameDownsync
|
|||||||
ConfirmedList: uint64(0),
|
ConfirmedList: uint64(0),
|
||||||
}
|
}
|
||||||
|
|
||||||
tmp2 := pR.InputsBuffer.GetByFrameId(j - 1) // There's no need for the backend to find the "lastAllConfirmed inputs" for prefabbing, either "BackendDynamicsEnabled" is true or false
|
j2 := j - 1
|
||||||
|
if 0 <= pR.LastAllConfirmedInputFrameId && j2 >= pR.LastAllConfirmedInputFrameId {
|
||||||
|
j2 = pR.LastAllConfirmedInputFrameId
|
||||||
|
}
|
||||||
|
tmp2 := pR.InputsBuffer.GetByFrameId(j2)
|
||||||
if nil != tmp2 {
|
if nil != tmp2 {
|
||||||
prevInputFrameDownsync := tmp2.(*InputFrameDownsync)
|
prevInputFrameDownsync := tmp2.(*InputFrameDownsync)
|
||||||
for i, _ := range currInputFrameDownsync.InputList {
|
for i, _ := range currInputFrameDownsync.InputList {
|
||||||
@@ -1086,6 +1107,7 @@ func (pR *Room) prefabInputFrameDownsync(inputFrameId int32) *InputFrameDownsync
|
|||||||
|
|
||||||
func (pR *Room) markConfirmationIfApplicable(inputFrameUpsyncBatch []*InputFrameUpsync, playerId int32, player *Player) *InputsBufferSnapshot {
|
func (pR *Room) markConfirmationIfApplicable(inputFrameUpsyncBatch []*InputFrameUpsync, playerId int32, player *Player) *InputsBufferSnapshot {
|
||||||
// [WARNING] This function MUST BE called while "pR.InputsBufferLock" is locked!
|
// [WARNING] This function MUST BE called while "pR.InputsBufferLock" is locked!
|
||||||
|
// Step#1, put the received "inputFrameUpsyncBatch" into "pR.InputsBuffer"
|
||||||
for _, inputFrameUpsync := range inputFrameUpsyncBatch {
|
for _, inputFrameUpsync := range inputFrameUpsyncBatch {
|
||||||
clientInputFrameId := inputFrameUpsync.InputFrameId
|
clientInputFrameId := inputFrameUpsync.InputFrameId
|
||||||
if clientInputFrameId < pR.InputsBuffer.StFrameId {
|
if clientInputFrameId < pR.InputsBuffer.StFrameId {
|
||||||
@@ -1094,25 +1116,24 @@ func (pR *Room) markConfirmationIfApplicable(inputFrameUpsyncBatch []*InputFrame
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if clientInputFrameId < pR.LastAllConfirmedInputFrameId {
|
if clientInputFrameId < pR.LastAllConfirmedInputFrameId {
|
||||||
Logger.Info(fmt.Sprintf("Omitting obsolete inputFrameUpsync#2: roomId=%v, playerId=%v, clientInputFrameId=%v, InputsBuffer=%v", pR.Id, playerId, clientInputFrameId, pR.InputsBufferString(false)))
|
Logger.Debug(fmt.Sprintf("Omitting obsolete inputFrameUpsync#2: roomId=%v, playerId=%v, clientInputFrameId=%v, InputsBuffer=%v", pR.Id, playerId, clientInputFrameId, pR.InputsBufferString(false)))
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if clientInputFrameId > pR.InputsBuffer.EdFrameId {
|
if clientInputFrameId > pR.InputsBuffer.EdFrameId {
|
||||||
Logger.Warn(fmt.Sprintf("Dropping too advanced inputFrameUpsync: roomId=%v, playerId=%v, clientInputFrameId=%v, InputsBuffer=%v; is this player cheating?", pR.Id, playerId, clientInputFrameId, pR.InputsBufferString(false)))
|
Logger.Warn(fmt.Sprintf("Dropping too advanced inputFrameUpsync: roomId=%v, playerId=%v, clientInputFrameId=%v, InputsBuffer=%v; is this player cheating?", pR.Id, playerId, clientInputFrameId, pR.InputsBufferString(false)))
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
var targetInputFrameDownsync *InputFrameDownsync = nil
|
// by now "clientInputFrameId <= pR.InputsBuffer.EdFrameId"
|
||||||
if clientInputFrameId == pR.InputsBuffer.EdFrameId {
|
targetInputFrameDownsync := pR.getOrPrefabInputFrameDownsync(clientInputFrameId)
|
||||||
targetInputFrameDownsync = pR.prefabInputFrameDownsync(clientInputFrameId)
|
|
||||||
Logger.Debug(fmt.Sprintf("OnBattleCmdReceived-Prefabbed new inputFrameDownsync from inputFrameUpsync: roomId=%v, playerId=%v, clientInputFrameId=%v, InputsBuffer=%v", pR.Id, playerId, clientInputFrameId, pR.InputsBufferString(false)))
|
|
||||||
} else {
|
|
||||||
targetInputFrameDownsync = pR.InputsBuffer.GetByFrameId(clientInputFrameId).(*InputFrameDownsync)
|
|
||||||
Logger.Debug(fmt.Sprintf("OnBattleCmdReceived-stuffing inputFrameDownsync from inputFrameUpsync: roomId=%v, playerId=%v, clientInputFrameId=%v, InputsBuffer=%v", pR.Id, playerId, clientInputFrameId, pR.InputsBufferString(false)))
|
|
||||||
}
|
|
||||||
targetInputFrameDownsync.InputList[player.JoinIndex-1] = inputFrameUpsync.Encoded
|
targetInputFrameDownsync.InputList[player.JoinIndex-1] = inputFrameUpsync.Encoded
|
||||||
targetInputFrameDownsync.ConfirmedList |= uint64(1 << uint32(player.JoinIndex-1))
|
targetInputFrameDownsync.ConfirmedList |= uint64(1 << uint32(player.JoinIndex-1))
|
||||||
|
|
||||||
|
if clientInputFrameId > pR.LatestPlayerUpsyncedInputFrameId {
|
||||||
|
pR.LatestPlayerUpsyncedInputFrameId = clientInputFrameId
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Step#2, mark confirmation without forcing
|
||||||
newAllConfirmedCount := int32(0)
|
newAllConfirmedCount := int32(0)
|
||||||
inputFrameId1 := pR.LastAllConfirmedInputFrameId + 1
|
inputFrameId1 := pR.LastAllConfirmedInputFrameId + 1
|
||||||
totPlayerCnt := uint32(pR.Capacity)
|
totPlayerCnt := uint32(pR.Capacity)
|
||||||
@@ -1130,113 +1151,100 @@ func (pR *Room) markConfirmationIfApplicable(inputFrameUpsyncBatch []*InputFrame
|
|||||||
for _, player := range pR.PlayersArr {
|
for _, player := range pR.PlayersArr {
|
||||||
thatPlayerBattleState := atomic.LoadInt32(&(player.BattleState))
|
thatPlayerBattleState := atomic.LoadInt32(&(player.BattleState))
|
||||||
thatPlayerJoinMask := uint64(1 << uint32(player.JoinIndex-1))
|
thatPlayerJoinMask := uint64(1 << uint32(player.JoinIndex-1))
|
||||||
if 0 == (inputFrameDownsync.ConfirmedList & thatPlayerJoinMask) {
|
isSlowTicker := (0 == (inputFrameDownsync.ConfirmedList & thatPlayerJoinMask))
|
||||||
if thatPlayerBattleState == PlayerBattleStateIns.ACTIVE {
|
isActiveSlowTicker := (isSlowTicker && thatPlayerBattleState == PlayerBattleStateIns.ACTIVE)
|
||||||
shouldBreakConfirmation = true
|
if isActiveSlowTicker {
|
||||||
break
|
shouldBreakConfirmation = true // Could be an `ACTIVE SLOW TICKER` here, but no action needed for now
|
||||||
} else {
|
break
|
||||||
Logger.Debug(fmt.Sprintf("markConfirmationIfApplicable for roomId=%v, skipping UNCONFIRMED BUT INACTIVE player(id:%v, joinIndex:%v) while checking inputFrameId=[%v, %v): InputsBuffer=%v", pR.Id, player.Id, player.JoinIndex, inputFrameId1, pR.InputsBuffer.EdFrameId, pR.InputsBufferString(false)))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Logger.Debug(fmt.Sprintf("markConfirmationIfApplicable for roomId=%v, skipping UNCONFIRMED BUT INACTIVE player(id:%v, joinIndex:%v) while checking inputFrameId=[%v, %v): InputsBuffer=%v", pR.Id, player.Id, player.JoinIndex, inputFrameId1, pR.InputsBuffer.EdFrameId, pR.InputsBufferString(false)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if shouldBreakConfirmation {
|
if shouldBreakConfirmation {
|
||||||
break
|
break
|
||||||
} else {
|
|
||||||
newAllConfirmedCount += 1
|
|
||||||
pR.onInputFrameDownsyncAllConfirmed(inputFrameDownsync, -1)
|
|
||||||
}
|
}
|
||||||
|
newAllConfirmedCount += 1
|
||||||
|
pR.onInputFrameDownsyncAllConfirmed(inputFrameDownsync, -1)
|
||||||
}
|
}
|
||||||
|
|
||||||
if 0 < newAllConfirmedCount {
|
if 0 < newAllConfirmedCount {
|
||||||
refRenderFrameIdIfNeeded := pR.CurDynamicsRenderFrameId - 1
|
|
||||||
/*
|
/*
|
||||||
[WARNING]
|
[WARNING]
|
||||||
|
|
||||||
If "pR.InputsBufferLock" was previously held by "doBattleMainLoopPerTickBackendDynamicsWithProperLocking", then this value would be just (pR.LastAllConfirmedInputFrameId - newAllConfirmedCount).
|
If "pR.InputsBufferLock" was previously held by "doBattleMainLoopPerTickBackendDynamicsWithProperLocking", then "snapshotStFrameId" would be just (LastAllConfirmedInputFrameId - newAllConfirmedCount).
|
||||||
|
|
||||||
However if "pR.InputsBufferLock" was previously held by another "OnBattleCmdReceived", this value might be smaller than (pR.LastAllConfirmedInputFrameId - newAllConfirmedCount)!
|
However if "pR.InputsBufferLock" was previously held by another "OnBattleCmdReceived", the proper value for "snapshotStFrameId" might be smaller than (pR.LastAllConfirmedInputFrameId - newAllConfirmedCount) -- but why? Especially when we've already wrapped this whole function in "InputsBufferLock", the order of "markConfirmationIfApplicable" generated snapshots is preserved for sending, isn't (LastAllConfirmedInputFrameId - newAllConfirmedCount) good enough here?
|
||||||
|
|
||||||
|
Unfortunately no, for a reconnected player to get recovered asap (of course with BackendDynamicsEnabled), we put a check of READDED_BATTLE_COLLIDER_ACKED in "downsyncToSinglePlayer" -- which could be called right after "markConfirmationIfApplicable" yet without going through "forceConfirmationIfApplicable" -- and if a READDED_BATTLE_COLLIDER_ACKED player is found there we need a proper "(refRenderFrameId, snapshotStFrameId)" pair for that player!
|
||||||
*/
|
*/
|
||||||
snapshotStFrameId := pR.ConvertToInputFrameId(refRenderFrameIdIfNeeded, pR.InputDelayFrames)
|
snapshotStFrameId := (pR.LastAllConfirmedInputFrameId - newAllConfirmedCount)
|
||||||
// Duplicate downsynced inputFrameIds will be filtered out by frontend.
|
refRenderFrameIdIfNeeded := pR.CurDynamicsRenderFrameId - 1
|
||||||
toSendInputFrameDownsyncs := pR.cloneInputsBuffer(snapshotStFrameId, pR.LastAllConfirmedInputFrameId+1)
|
refSnapshotStFrameId := pR.ConvertToInputFrameId(refRenderFrameIdIfNeeded, pR.InputDelayFrames)
|
||||||
Logger.Debug(fmt.Sprintf("markConfirmationIfApplicable for roomId=%v returning newAllConfirmedCount=%d: InputsBuffer=%v", pR.Id, newAllConfirmedCount, pR.InputsBufferString(false)))
|
if refSnapshotStFrameId < snapshotStFrameId {
|
||||||
return &InputsBufferSnapshot{
|
snapshotStFrameId = refSnapshotStFrameId
|
||||||
RefRenderFrameId: refRenderFrameIdIfNeeded,
|
|
||||||
UnconfirmedMask: uint64(0),
|
|
||||||
ToSendInputFrameDownsyncs: toSendInputFrameDownsyncs,
|
|
||||||
}
|
}
|
||||||
|
Logger.Debug(fmt.Sprintf("markConfirmationIfApplicable for roomId=%v returning newAllConfirmedCount=%d: InputsBuffer=%v", pR.Id, newAllConfirmedCount, pR.InputsBufferString(false)))
|
||||||
|
return pR.produceInputsBufferSnapshotWithCurDynamicsRenderFrameAsRef(uint64(0), snapshotStFrameId, pR.LastAllConfirmedInputFrameId+1)
|
||||||
} else {
|
} else {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pR *Room) forceConfirmationIfApplicable(prevRenderFrameId int32) *InputsBufferSnapshot {
|
func (pR *Room) forceConfirmationIfApplicable(prevRenderFrameId int32) uint64 {
|
||||||
// [WARNING] This function MUST BE called while "pR.InputsBufferLock" is locked!
|
// [WARNING] This function MUST BE called while "pR.InputsBufferLock" is locked!
|
||||||
// Force confirmation of non-all-confirmed inputFrame EXACTLY ONE AT A TIME, returns the non-confirmed mask of players, e.g. in a 4-player-battle returning 1001 means that players with JoinIndex=1 and JoinIndex=4 are non-confirmed for inputFrameId2
|
|
||||||
|
|
||||||
renderFrameId1 := (pR.RenderFrameId - pR.NstDelayFrames) // the renderFrameId which should've been rendered on frontend
|
|
||||||
if 0 > renderFrameId1 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
ok := false
|
|
||||||
renderFrameId2 := int32(-1)
|
|
||||||
if ok, renderFrameId2 = pR.shouldPrefabInputFrameDownsync(prevRenderFrameId-pR.NstDelayFrames, renderFrameId1); !ok {
|
|
||||||
/*
|
|
||||||
The backend "shouldPrefabInputFrameDownsync" shares the same rule as frontend "shouldGenerateInputFrameUpsync".
|
|
||||||
|
|
||||||
It's also important that "forceConfirmationIfApplicable" is NOT EXECUTED for every renderFrame, such that when a player is forced to resync, it has some time, i.e. (1 << InputScaleFrames) renderFrames, to upsync again.
|
|
||||||
*/
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
inputFrameId2 := pR.ConvertToInputFrameId(renderFrameId2, 0) // The inputFrame to force confirmation (if necessary)
|
|
||||||
if inputFrameId2 < pR.LastAllConfirmedInputFrameId {
|
|
||||||
// No need to force confirmation, the inputFrames already arrived
|
|
||||||
Logger.Debug(fmt.Sprintf("inputFrameId2=%v is already all-confirmed for roomId=%v[type#1], no need to force confirmation of it", inputFrameId2, pR.Id))
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
tmp := pR.InputsBuffer.GetByFrameId(inputFrameId2)
|
|
||||||
if nil == tmp {
|
|
||||||
panic(fmt.Sprintf("inputFrameId2=%v doesn't exist for roomId=%v, this is abnormal because the server should prefab inputFrameDownsync in a most advanced pace, check the prefab logic! InputsBuffer=%v", inputFrameId2, pR.Id, pR.InputsBufferString(false)))
|
|
||||||
}
|
|
||||||
|
|
||||||
totPlayerCnt := uint32(pR.Capacity)
|
totPlayerCnt := uint32(pR.Capacity)
|
||||||
allConfirmedMask := uint64((1 << totPlayerCnt) - 1)
|
allConfirmedMask := uint64((1 << totPlayerCnt) - 1)
|
||||||
|
unconfirmedMask := uint64(0)
|
||||||
// Force confirmation of "inputFrame2"
|
if pR.LatestPlayerUpsyncedInputFrameId > (pR.LastAllConfirmedInputFrameId + (pR.NstDelayFrames >> pR.InputScaleFrames)) {
|
||||||
inputFrame2 := tmp.(*InputFrameDownsync)
|
// Type#1 check whether there's a significantly slow ticker among players
|
||||||
oldConfirmedList := inputFrame2.ConfirmedList
|
oldLastAllConfirmedInputFrameId := pR.LastAllConfirmedInputFrameId
|
||||||
unconfirmedMask := (oldConfirmedList ^ allConfirmedMask)
|
for j := pR.LastAllConfirmedInputFrameId + 1; j <= pR.LatestPlayerUpsyncedInputFrameId; j++ {
|
||||||
inputFrame2.ConfirmedList = allConfirmedMask
|
tmp := pR.InputsBuffer.GetByFrameId(j)
|
||||||
pR.onInputFrameDownsyncAllConfirmed(inputFrame2, -1)
|
if nil == tmp {
|
||||||
|
panic(fmt.Sprintf("inputFrameId=%v doesn't exist for roomId=%v! InputsBuffer=%v", j, pR.Id, pR.InputsBufferString(false)))
|
||||||
if 0 < unconfirmedMask {
|
}
|
||||||
// This condition should be rarely met!
|
inputFrameDownsync := tmp.(*InputFrameDownsync)
|
||||||
/*
|
unconfirmedMask |= (allConfirmedMask ^ inputFrameDownsync.ConfirmedList)
|
||||||
Upon resynced on frontend, "refRenderFrameId" is now set to as advanced as possible, and it's the frontend's responsibility now to pave way for the "gap inputFrames"
|
inputFrameDownsync.ConfirmedList = allConfirmedMask
|
||||||
|
pR.onInputFrameDownsyncAllConfirmed(inputFrameDownsync, -1)
|
||||||
If "NstDelayFrames" becomes larger, "pR.RenderFrameId - refRenderFrameId" possibly becomes larger because the force confirmation is delayed more.
|
|
||||||
|
|
||||||
Upon resync, it's still possible that "refRenderFrameId < frontend.chaserRenderFrameId" -- and this is allowed.
|
|
||||||
*/
|
|
||||||
refRenderFrameIdIfNeeded := pR.ConvertToLastUsedRenderFrameId(pR.LastAllConfirmedInputFrameId, pR.InputDelayFrames)
|
|
||||||
if 0 > refRenderFrameIdIfNeeded {
|
|
||||||
// Without a "refRenderFrame", there's no point to force confirmation, i.e. nothing to downsync to the "ACTIVE but slowly ticking frontend(s)"
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
snapshotStFrameId := pR.ConvertToInputFrameId(refRenderFrameIdIfNeeded, pR.InputDelayFrames)
|
if 0 < unconfirmedMask {
|
||||||
toSendInputFrameDownsyncs := pR.cloneInputsBuffer(snapshotStFrameId, pR.LastAllConfirmedInputFrameId+1)
|
Logger.Debug(fmt.Sprintf("[type#1 forceConfirmation] For roomId=%d@renderFrameId=%d, curDynamicsRenderFrameId=%d, LatestPlayerUpsyncedInputFrameId:%d, LastAllConfirmedInputFrameId:%d, (pR.NstDelayFrames >> pR.InputScaleFrames):%d, InputFrameUpsyncDelayTolerance:%d, unconfirmedMask=%d; there's a slow ticker suspect, forcing all-confirmation", pR.Id, pR.RenderFrameId, pR.CurDynamicsRenderFrameId, pR.LatestPlayerUpsyncedInputFrameId, oldLastAllConfirmedInputFrameId, (pR.NstDelayFrames >> pR.InputScaleFrames), pR.InputFrameUpsyncDelayTolerance, unconfirmedMask))
|
||||||
return &InputsBufferSnapshot{
|
|
||||||
RefRenderFrameId: refRenderFrameIdIfNeeded,
|
|
||||||
UnconfirmedMask: unconfirmedMask,
|
|
||||||
ToSendInputFrameDownsyncs: toSendInputFrameDownsyncs,
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
// Type#2 helps resolve the edge case when all players are disconnected temporarily
|
||||||
|
shouldForceResync := false
|
||||||
|
for _, player := range pR.PlayersArr {
|
||||||
|
playerBattleState := atomic.LoadInt32(&(player.BattleState))
|
||||||
|
if PlayerBattleStateIns.READDED_BATTLE_COLLIDER_ACKED == playerBattleState {
|
||||||
|
shouldForceResync = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if shouldForceResync {
|
||||||
|
Logger.Warn(fmt.Sprintf("[type#2 forceConfirmation] For roomId=%d@renderFrameId=%d, curDynamicsRenderFrameId=%d, LatestPlayerUpsyncedInputFrameId:%d, LastAllConfirmedInputFrameId:%d; there's at least one reconnected player, forcing all-confirmation", pR.Id, pR.RenderFrameId, pR.CurDynamicsRenderFrameId, pR.LatestPlayerUpsyncedInputFrameId, pR.LastAllConfirmedInputFrameId))
|
||||||
|
unconfirmedMask = allConfirmedMask
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return unconfirmedMask
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pR *Room) produceInputsBufferSnapshotWithCurDynamicsRenderFrameAsRef(unconfirmedMask uint64, snapshotStFrameId, snapshotEdFrameId int32) *InputsBufferSnapshot {
|
||||||
|
// [WARNING] This function MUST BE called while "pR.InputsBufferLock" is locked!
|
||||||
|
refRenderFrameIdIfNeeded := pR.CurDynamicsRenderFrameId - 1
|
||||||
|
if 0 > refRenderFrameIdIfNeeded {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
// Duplicate downsynced inputFrameIds will be filtered out by frontend.
|
||||||
|
toSendInputFrameDownsyncs := pR.cloneInputsBuffer(snapshotStFrameId, snapshotEdFrameId)
|
||||||
|
|
||||||
|
return &InputsBufferSnapshot{
|
||||||
|
RefRenderFrameId: refRenderFrameIdIfNeeded,
|
||||||
|
UnconfirmedMask: unconfirmedMask,
|
||||||
|
ToSendInputFrameDownsyncs: toSendInputFrameDownsyncs,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pR *Room) applyInputFrameDownsyncDynamics(fromRenderFrameId int32, toRenderFrameId int32, spaceOffsetX, spaceOffsetY float64) {
|
func (pR *Room) applyInputFrameDownsyncDynamics(fromRenderFrameId int32, toRenderFrameId int32, spaceOffsetX, spaceOffsetY float64) {
|
||||||
@@ -1346,7 +1354,7 @@ func (pR *Room) applyInputFrameDownsyncDynamicsOnSingleRenderFrame(delayedInputF
|
|||||||
if !characStateAlreadyInAir && characStateIsInterruptWaivable {
|
if !characStateAlreadyInAir && characStateIsInterruptWaivable {
|
||||||
thatPlayerInNextFrame.VelY = pR.JumpingInitVelY
|
thatPlayerInNextFrame.VelY = pR.JumpingInitVelY
|
||||||
if 1 == currPlayerDownsync.JoinIndex {
|
if 1 == currPlayerDownsync.JoinIndex {
|
||||||
Logger.Info(fmt.Sprintf("playerId=%v, joinIndex=%v jumped at {renderFrame.id: %d, virtualX: %d, virtualY: %d, nextVelX: %d, nextVelY: %d}, delayedInputFrame.id=%d", playerId, joinIndex, currRenderFrame.Id, currPlayerDownsync.VirtualGridX, currPlayerDownsync.VirtualGridY, thatPlayerInNextFrame.VelX, thatPlayerInNextFrame.VelY, delayedInputFrame.InputFrameId))
|
Logger.Info(fmt.Sprintf("playerId=%v, joinIndex=%v jumped at {renderFrame.id: %d, virtualX: %d, virtualY: %d, nextVelX: %d, nextVelY: %d, nextCharacterState=%d, inAir=%v}, delayedInputFrame.id=%d", playerId, joinIndex, currRenderFrame.Id, currPlayerDownsync.VirtualGridX, currPlayerDownsync.VirtualGridY, thatPlayerInNextFrame.VelX, thatPlayerInNextFrame.VelY, thatPlayerInNextFrame.CharacterState, currPlayerDownsync.InAir, delayedInputFrame.InputFrameId))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1450,63 +1458,61 @@ func (pR *Room) applyInputFrameDownsyncDynamicsOnSingleRenderFrame(delayedInputF
|
|||||||
currPlayerDownsync, thatPlayerInNextFrame := currRenderFrame.Players[playerId], nextRenderFramePlayers[playerId]
|
currPlayerDownsync, thatPlayerInNextFrame := currRenderFrame.Players[playerId], nextRenderFramePlayers[playerId]
|
||||||
fallStopping := false
|
fallStopping := false
|
||||||
possiblyFallStoppedOnAnotherPlayer := false
|
possiblyFallStoppedOnAnotherPlayer := false
|
||||||
collision := playerCollider.Check(0, 0)
|
if collision := playerCollider.Check(0, 0); nil != collision {
|
||||||
if nil == collision {
|
for _, obj := range collision.Objects {
|
||||||
continue
|
isBarrier, isAnotherPlayer, isBullet := false, false, false
|
||||||
}
|
switch obj.Data.(type) {
|
||||||
for _, obj := range collision.Objects {
|
case *Barrier:
|
||||||
isBarrier, isAnotherPlayer, isBullet := false, false, false
|
isBarrier = true
|
||||||
switch obj.Data.(type) {
|
case *Player:
|
||||||
case *Barrier:
|
isAnotherPlayer = true
|
||||||
isBarrier = true
|
case *MeleeBullet:
|
||||||
case *Player:
|
isBullet = true
|
||||||
isAnotherPlayer = true
|
}
|
||||||
case *MeleeBullet:
|
if isBullet {
|
||||||
isBullet = true
|
// ignore bullets for this step
|
||||||
}
|
continue
|
||||||
if isBullet {
|
}
|
||||||
// ignore bullets for this step
|
bShape := obj.Shape.(*resolv.ConvexPolygon)
|
||||||
continue
|
overlapped, pushbackX, pushbackY, overlapResult := CalcPushbacks(0, 0, playerShape, bShape)
|
||||||
}
|
if !overlapped {
|
||||||
bShape := obj.Shape.(*resolv.ConvexPolygon)
|
continue
|
||||||
overlapped, pushbackX, pushbackY, overlapResult := CalcPushbacks(0, 0, playerShape, bShape)
|
}
|
||||||
if !overlapped {
|
normAlignmentWithGravity := (overlapResult.OverlapX*float64(0) + overlapResult.OverlapY*float64(-1.0))
|
||||||
continue
|
landedOnGravityPushback := (pR.SnapIntoPlatformThreshold < normAlignmentWithGravity) // prevents false snapping on the lateral sides
|
||||||
}
|
if landedOnGravityPushback {
|
||||||
normAlignmentWithGravity := (overlapResult.OverlapX*float64(0) + overlapResult.OverlapY*float64(-1.0))
|
// kindly note that one player might land on top of another player, and snapping is also required in such case
|
||||||
landedOnGravityPushback := (pR.SnapIntoPlatformThreshold < normAlignmentWithGravity) // prevents false snapping on the lateral sides
|
pushbackX, pushbackY = (overlapResult.Overlap-pR.SnapIntoPlatformOverlap)*overlapResult.OverlapX, (overlapResult.Overlap-pR.SnapIntoPlatformOverlap)*overlapResult.OverlapY
|
||||||
if landedOnGravityPushback {
|
thatPlayerInNextFrame.InAir = false
|
||||||
// kindly note that one player might land on top of another player, and snapping is also required in such case
|
|
||||||
pushbackX, pushbackY = (overlapResult.Overlap-pR.SnapIntoPlatformOverlap)*overlapResult.OverlapX, (overlapResult.Overlap-pR.SnapIntoPlatformOverlap)*overlapResult.OverlapY
|
|
||||||
thatPlayerInNextFrame.InAir = false
|
|
||||||
}
|
|
||||||
if isAnotherPlayer {
|
|
||||||
// [WARNING] See comments of this substep in frontend.
|
|
||||||
pushbackX, pushbackY = (overlapResult.Overlap-pR.SnapIntoPlatformOverlap*2)*overlapResult.OverlapX, (overlapResult.Overlap-pR.SnapIntoPlatformOverlap*2)*overlapResult.OverlapY
|
|
||||||
}
|
|
||||||
for _, hardPushbackNorm := range hardPushbackNorms[joinIndex-1] {
|
|
||||||
projectedMagnitude := pushbackX*hardPushbackNorm.X + pushbackY*hardPushbackNorm.Y
|
|
||||||
if isBarrier || (isAnotherPlayer && 0 > projectedMagnitude) {
|
|
||||||
pushbackX -= projectedMagnitude * hardPushbackNorm.X
|
|
||||||
pushbackY -= projectedMagnitude * hardPushbackNorm.Y
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
effPushbacks[joinIndex-1].X += pushbackX
|
|
||||||
effPushbacks[joinIndex-1].Y += pushbackY
|
|
||||||
if currPlayerDownsync.InAir && landedOnGravityPushback {
|
|
||||||
fallStopping = true
|
|
||||||
if isAnotherPlayer {
|
if isAnotherPlayer {
|
||||||
possiblyFallStoppedOnAnotherPlayer = true
|
// [WARNING] See comments of this substep in frontend.
|
||||||
|
pushbackX, pushbackY = (overlapResult.Overlap-pR.SnapIntoPlatformOverlap*2)*overlapResult.OverlapX, (overlapResult.Overlap-pR.SnapIntoPlatformOverlap*2)*overlapResult.OverlapY
|
||||||
}
|
}
|
||||||
}
|
for _, hardPushbackNorm := range hardPushbackNorms[joinIndex-1] {
|
||||||
if 1 == joinIndex {
|
projectedMagnitude := pushbackX*hardPushbackNorm.X + pushbackY*hardPushbackNorm.Y
|
||||||
halfColliderWidth, halfColliderHeight := player.ColliderRadius, player.ColliderRadius+player.ColliderRadius // avoid multiplying
|
if isBarrier || (isAnotherPlayer && 0 > projectedMagnitude) {
|
||||||
if fallStopping {
|
pushbackX -= projectedMagnitude * hardPushbackNorm.X
|
||||||
Logger.Info(fmt.Sprintf("playerId=%d, joinIndex=%d fallStopping#1\n{renderFrame.id: %d, possiblyFallStoppedOnAnotherPlayer: %v}\nplayerColliderPos=%v, effPushback={%.3f, %.3f}, overlapMag=%.4f", playerId, joinIndex, currRenderFrame.Id, possiblyFallStoppedOnAnotherPlayer, RectCenterStr(playerCollider, halfColliderWidth, halfColliderHeight, topPadding, bottomPadding, leftPadding, rightPadding, pR.collisionSpaceOffsetX, pR.collisionSpaceOffsetY), effPushbacks[joinIndex-1].X, effPushbacks[joinIndex-1].Y, overlapResult.Overlap))
|
pushbackY -= projectedMagnitude * hardPushbackNorm.Y
|
||||||
} else if currPlayerDownsync.InAir && isBarrier && !landedOnGravityPushback {
|
}
|
||||||
Logger.Warn(fmt.Sprintf("playerId=%d, joinIndex=%d inAir & pushed back by barrier & not landed at {renderFrame.id: %d}\nplayerColliderPos=%v, effPushback={%.3f, %.3f}, overlapMag=%.4f, len(hardPushbackNorms)=%d", playerId, joinIndex, currRenderFrame.Id, RectCenterStr(playerCollider, halfColliderWidth, halfColliderHeight, topPadding, bottomPadding, leftPadding, rightPadding, pR.collisionSpaceOffsetX, pR.collisionSpaceOffsetY), effPushbacks[joinIndex-1].X, effPushbacks[joinIndex-1].Y, overlapResult.Overlap, len(hardPushbackNorms)))
|
}
|
||||||
} else if currPlayerDownsync.InAir && isAnotherPlayer {
|
effPushbacks[joinIndex-1].X += pushbackX
|
||||||
Logger.Warn(fmt.Sprintf("playerId=%d, joinIndex=%d inAir & pushed back by another player\n{renderFrame.id: %d}\nplayerColliderPos=%v, anotherPlayerColliderPos=%v, effPushback={%.3f, %.3f}, landedOnGravityPushback=%v, fallStopping=%v, overlapMag=%.4f, len(hardPushbackNorms)=%d", playerId, joinIndex, currRenderFrame.Id, RectCenterStr(playerCollider, halfColliderWidth, halfColliderHeight, topPadding, bottomPadding, leftPadding, rightPadding, pR.collisionSpaceOffsetX, pR.collisionSpaceOffsetY), RectCenterStr(obj, halfColliderWidth, halfColliderHeight, topPadding, bottomPadding, leftPadding, rightPadding, pR.collisionSpaceOffsetX, pR.collisionSpaceOffsetY), effPushbacks[joinIndex-1].X, effPushbacks[joinIndex-1].Y, landedOnGravityPushback, fallStopping, overlapResult.Overlap, len(hardPushbackNorms)))
|
effPushbacks[joinIndex-1].Y += pushbackY
|
||||||
|
if currPlayerDownsync.InAir && landedOnGravityPushback {
|
||||||
|
fallStopping = true
|
||||||
|
if isAnotherPlayer {
|
||||||
|
possiblyFallStoppedOnAnotherPlayer = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if 1 == joinIndex {
|
||||||
|
halfColliderWidth, halfColliderHeight := player.ColliderRadius, player.ColliderRadius+player.ColliderRadius // avoid multiplying
|
||||||
|
if fallStopping {
|
||||||
|
Logger.Debug(fmt.Sprintf("playerId=%d, joinIndex=%d fallStopping#1\n{renderFrame.id: %d, possiblyFallStoppedOnAnotherPlayer: %v}\nplayerColliderPos=%v, effPushback={%.3f, %.3f}, overlapMag=%.4f", playerId, joinIndex, currRenderFrame.Id, possiblyFallStoppedOnAnotherPlayer, RectCenterStr(playerCollider, halfColliderWidth, halfColliderHeight, topPadding, bottomPadding, leftPadding, rightPadding, pR.collisionSpaceOffsetX, pR.collisionSpaceOffsetY), effPushbacks[joinIndex-1].X, effPushbacks[joinIndex-1].Y, overlapResult.Overlap))
|
||||||
|
} else if currPlayerDownsync.InAir && isBarrier && !landedOnGravityPushback {
|
||||||
|
//Logger.Warn(fmt.Sprintf("playerId=%d, joinIndex=%d inAir & pushed back by barrier & not landed at {renderFrame.id: %d}\nplayerColliderPos=%v, effPushback={%.3f, %.3f}, overlapMag=%.4f, len(hardPushbackNorms)=%d", playerId, joinIndex, currRenderFrame.Id, RectCenterStr(playerCollider, halfColliderWidth, halfColliderHeight, topPadding, bottomPadding, leftPadding, rightPadding, pR.collisionSpaceOffsetX, pR.collisionSpaceOffsetY), effPushbacks[joinIndex-1].X, effPushbacks[joinIndex-1].Y, overlapResult.Overlap, len(hardPushbackNorms)))
|
||||||
|
} else if currPlayerDownsync.InAir && isAnotherPlayer {
|
||||||
|
//Logger.Warn(fmt.Sprintf("playerId=%d, joinIndex=%d inAir & pushed back by another player\n{renderFrame.id: %d}\nplayerColliderPos=%v, anotherPlayerColliderPos=%v, effPushback={%.3f, %.3f}, landedOnGravityPushback=%v, fallStopping=%v, overlapMag=%.4f, len(hardPushbackNorms)=%d", playerId, joinIndex, currRenderFrame.Id, RectCenterStr(playerCollider, halfColliderWidth, halfColliderHeight, topPadding, bottomPadding, leftPadding, rightPadding, pR.collisionSpaceOffsetX, pR.collisionSpaceOffsetY), RectCenterStr(obj, halfColliderWidth, halfColliderHeight, topPadding, bottomPadding, leftPadding, rightPadding, pR.collisionSpaceOffsetX, pR.collisionSpaceOffsetY), effPushbacks[joinIndex-1].X, effPushbacks[joinIndex-1].Y, landedOnGravityPushback, fallStopping, overlapResult.Overlap, len(hardPushbackNorms)))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1517,15 +1523,14 @@ func (pR *Room) applyInputFrameDownsyncDynamicsOnSingleRenderFrame(delayedInputF
|
|||||||
thatPlayerInNextFrame.FramesToRecover = 0
|
thatPlayerInNextFrame.FramesToRecover = 0
|
||||||
}
|
}
|
||||||
if currPlayerDownsync.InAir {
|
if currPlayerDownsync.InAir {
|
||||||
switch thatPlayerInNextFrame.CharacterState {
|
oldNextCharacterState := thatPlayerInNextFrame.CharacterState
|
||||||
case ATK_CHARACTER_STATE_IDLE1:
|
switch oldNextCharacterState {
|
||||||
case ATK_CHARACTER_STATE_WALKING:
|
case ATK_CHARACTER_STATE_IDLE1, ATK_CHARACTER_STATE_WALKING:
|
||||||
thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_INAIR_IDLE1
|
thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_INAIR_IDLE1
|
||||||
case ATK_CHARACTER_STATE_ATK1:
|
case ATK_CHARACTER_STATE_ATK1:
|
||||||
thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_INAIR_ATK1
|
thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_INAIR_ATK1
|
||||||
case ATK_CHARACTER_STATE_ATKED1:
|
case ATK_CHARACTER_STATE_ATKED1:
|
||||||
thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_INAIR_ATKED1
|
thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_INAIR_ATKED1
|
||||||
default:
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1554,7 +1559,7 @@ func (pR *Room) applyInputFrameDownsyncDynamicsOnSingleRenderFrame(delayedInputF
|
|||||||
for _, hardPushbackNorm := range hardPushbackNorms[joinIndex-1] {
|
for _, hardPushbackNorm := range hardPushbackNorms[joinIndex-1] {
|
||||||
projectedMagnitude := pushbackX*hardPushbackNorm.X + pushbackY*hardPushbackNorm.Y
|
projectedMagnitude := pushbackX*hardPushbackNorm.X + pushbackY*hardPushbackNorm.Y
|
||||||
if 0 > projectedMagnitude {
|
if 0 > projectedMagnitude {
|
||||||
Logger.Info(fmt.Sprintf("defenderPlayerId=%d, joinIndex=%d reducing bullet pushback={%.3f, %.3f} by {%.3f, %.3f} where hardPushbackNorm={%.3f, %.3f}, projectedMagnitude=%.3f at renderFrame.id=%d", t.Id, joinIndex, pushbackX, pushbackY, projectedMagnitude*hardPushbackNorm.X, projectedMagnitude*hardPushbackNorm.Y, hardPushbackNorm.X, hardPushbackNorm.Y, projectedMagnitude, currRenderFrame.Id))
|
//Logger.Debug(fmt.Sprintf("defenderPlayerId=%d, joinIndex=%d reducing bullet pushback={%.3f, %.3f} by {%.3f, %.3f} where hardPushbackNorm={%.3f, %.3f}, projectedMagnitude=%.3f at renderFrame.id=%d", t.Id, joinIndex, pushbackX, pushbackY, projectedMagnitude*hardPushbackNorm.X, projectedMagnitude*hardPushbackNorm.Y, hardPushbackNorm.X, hardPushbackNorm.Y, projectedMagnitude, currRenderFrame.Id))
|
||||||
pushbackX -= projectedMagnitude * hardPushbackNorm.X
|
pushbackX -= projectedMagnitude * hardPushbackNorm.X
|
||||||
pushbackY -= projectedMagnitude * hardPushbackNorm.Y
|
pushbackY -= projectedMagnitude * hardPushbackNorm.Y
|
||||||
}
|
}
|
||||||
@@ -1649,7 +1654,7 @@ func (pR *Room) refreshColliders(spaceW, spaceH int32) {
|
|||||||
|
|
||||||
topPadding, bottomPadding, leftPadding, rightPadding := pR.SnapIntoPlatformOverlap, pR.SnapIntoPlatformOverlap, pR.SnapIntoPlatformOverlap, pR.SnapIntoPlatformOverlap
|
topPadding, bottomPadding, leftPadding, rightPadding := pR.SnapIntoPlatformOverlap, pR.SnapIntoPlatformOverlap, pR.SnapIntoPlatformOverlap, pR.SnapIntoPlatformOverlap
|
||||||
|
|
||||||
minStep := (int(float64(pR.PlayerDefaultSpeed)*pR.VirtualGridToWorldRatio) << 2) // the approx minimum distance a player can move per frame in world coordinate
|
minStep := (int(float64(pR.PlayerDefaultSpeed)*pR.VirtualGridToWorldRatio) << 3) // the approx minimum distance a player can move per frame in world coordinate
|
||||||
pR.Space = resolv.NewSpace(int(spaceW), int(spaceH), minStep, minStep) // allocate a new collision space everytime after a battle is settled
|
pR.Space = resolv.NewSpace(int(spaceW), int(spaceH), minStep, minStep) // allocate a new collision space everytime after a battle is settled
|
||||||
for _, player := range pR.Players {
|
for _, player := range pR.Players {
|
||||||
wx, wy := VirtualGridToWorldPos(player.VirtualGridX, player.VirtualGridY, pR.VirtualGridToWorldRatio)
|
wx, wy := VirtualGridToWorldPos(player.VirtualGridX, player.VirtualGridY, pR.VirtualGridToWorldRatio)
|
||||||
@@ -1688,13 +1693,12 @@ func (pR *Room) doBattleMainLoopPerTickBackendDynamicsWithProperLocking(prevRend
|
|||||||
|
|
||||||
if ok, thatRenderFrameId := pR.shouldPrefabInputFrameDownsync(prevRenderFrameId, pR.RenderFrameId); ok {
|
if ok, thatRenderFrameId := pR.shouldPrefabInputFrameDownsync(prevRenderFrameId, pR.RenderFrameId); ok {
|
||||||
noDelayInputFrameId := pR.ConvertToInputFrameId(thatRenderFrameId, 0)
|
noDelayInputFrameId := pR.ConvertToInputFrameId(thatRenderFrameId, 0)
|
||||||
if existingInputFrame := pR.InputsBuffer.GetByFrameId(noDelayInputFrameId); nil == existingInputFrame {
|
pR.getOrPrefabInputFrameDownsync(noDelayInputFrameId)
|
||||||
pR.prefabInputFrameDownsync(noDelayInputFrameId)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Force setting all-confirmed of buffered inputFrames periodically, kindly note that if "pR.BackendDynamicsEnabled", what we want to achieve is "recovery upon reconnection", which certainly requires "forceConfirmationIfApplicable" to move "pR.LastAllConfirmedInputFrameId" forward as much as possible
|
// Force setting all-confirmed of buffered inputFrames periodically, kindly note that if "pR.BackendDynamicsEnabled", what we want to achieve is "recovery upon reconnection", which certainly requires "forceConfirmationIfApplicable" to move "pR.LastAllConfirmedInputFrameId" forward as much as possible
|
||||||
inputsBufferSnapshot := pR.forceConfirmationIfApplicable(prevRenderFrameId)
|
oldLastAllConfirmedInputFrameId := pR.LastAllConfirmedInputFrameId
|
||||||
|
unconfirmedMask := pR.forceConfirmationIfApplicable(prevRenderFrameId)
|
||||||
|
|
||||||
if 0 <= pR.LastAllConfirmedInputFrameId {
|
if 0 <= pR.LastAllConfirmedInputFrameId {
|
||||||
dynamicsStartedAt := utils.UnixtimeNano()
|
dynamicsStartedAt := utils.UnixtimeNano()
|
||||||
@@ -1705,8 +1709,25 @@ func (pR *Room) doBattleMainLoopPerTickBackendDynamicsWithProperLocking(prevRend
|
|||||||
*pDynamicsDuration = utils.UnixtimeNano() - dynamicsStartedAt
|
*pDynamicsDuration = utils.UnixtimeNano() - dynamicsStartedAt
|
||||||
}
|
}
|
||||||
|
|
||||||
if nil != inputsBufferSnapshot {
|
/*
|
||||||
// Logger.Warn(fmt.Sprintf("roomId=%v, room.RenderFrameId=%v, room.CurDynamicsRenderFrameId=%v, room.LastAllConfirmedInputFrameId=%v, unconfirmedMask=%v", pR.Id, pR.RenderFrameId, pR.CurDynamicsRenderFrameId, pR.LastAllConfirmedInputFrameId, inputsBufferSnapshot.UnconfirmedMask))
|
[WARNING]
|
||||||
|
|
||||||
|
It's critical to create the snapshot AFTER "applyInputFrameDownsyncDynamics" for `ACTIVE SLOW TICKER` to avoid lag avalanche (see `<proj-root>/ConcerningEdgeCases.md` for introduction).
|
||||||
|
|
||||||
|
Consider that in a 4-player battle, player#1 is once disconnected but soon reconnected in 2 seconds, during its absence, "markConfirmationIfApplicable" would skip it and increment "LastAllConfirmedInputFrameId" and when backend is sending "DOWNSYNC_MSG_ACT_FORCED_RESYNC" it'd be always based on "LatestPlayerUpsyncedInputFrameId == LastAllConfirmedInputFrameId" thus NOT triggering "[type#1 forceConfirmation]".
|
||||||
|
|
||||||
|
However, if player#1 remains connected but ticks very slowly (i.e. an "ACTIVE SLOW TICKER"), "markConfirmationIfApplicable" couldn't increment "LastAllConfirmedInputFrameId", thus "[type#1 forceConfirmation]" will be triggered, but what's worse is that after "[type#1 forceConfirmation]" if the "refRenderFrameId" is not advanced enough, player#1 could never catch up even if it resumed from slow ticking!
|
||||||
|
*/
|
||||||
|
|
||||||
|
if 0 < unconfirmedMask {
|
||||||
|
// [WARNING] As "pR.CurDynamicsRenderFrameId" was just incremented above, "refSnapshotStFrameId" is most possibly larger than "oldLastAllConfirmedInputFrameId + 1", therefore this initial assignment is critical for `ACTIVE NORMAL TICKER`s to receive consecutive ids of inputFrameDownsync.
|
||||||
|
snapshotStFrameId := oldLastAllConfirmedInputFrameId + 1
|
||||||
|
refSnapshotStFrameId := pR.ConvertToInputFrameId(pR.CurDynamicsRenderFrameId-1, pR.InputDelayFrames)
|
||||||
|
if refSnapshotStFrameId < snapshotStFrameId {
|
||||||
|
snapshotStFrameId = refSnapshotStFrameId
|
||||||
|
}
|
||||||
|
inputsBufferSnapshot := pR.produceInputsBufferSnapshotWithCurDynamicsRenderFrameAsRef(unconfirmedMask, snapshotStFrameId, pR.LastAllConfirmedInputFrameId+1)
|
||||||
|
Logger.Debug(fmt.Sprintf("[forceConfirmation] roomId=%v, room.RenderFrameId=%v, room.CurDynamicsRenderFrameId=%v, room.LastAllConfirmedInputFrameId=%v, unconfirmedMask=%v", pR.Id, pR.RenderFrameId, pR.CurDynamicsRenderFrameId, pR.LastAllConfirmedInputFrameId, unconfirmedMask))
|
||||||
pR.downsyncToAllPlayers(inputsBufferSnapshot)
|
pR.downsyncToAllPlayers(inputsBufferSnapshot)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1730,30 +1751,57 @@ func (pR *Room) downsyncToAllPlayers(inputsBufferSnapshot *InputsBufferSnapshot)
|
|||||||
|
|
||||||
The difference from our current approach is that the "pR.PlayerDownsyncChanDict[playerId]" in use is a Golang channel, i.e. when executing #4 it automatically executes #3 (before) & #7 (after) as well, thus we couldn't do #5 & #6 in between.
|
The difference from our current approach is that the "pR.PlayerDownsyncChanDict[playerId]" in use is a Golang channel, i.e. when executing #4 it automatically executes #3 (before) & #7 (after) as well, thus we couldn't do #5 & #6 in between.
|
||||||
*/
|
*/
|
||||||
for playerId, playerDownsyncChan := range pR.PlayerDownsyncChanDict {
|
if true == pR.BackendDynamicsEnabled {
|
||||||
|
for _, player := range pR.PlayersArr {
|
||||||
|
/*
|
||||||
|
[WARNING] Since v0.9.1, the inconsistence between frontend & backend collision handling results became too difficult to track, therefore before we can let frontend use a Golang compiled library for "applyInputFrameDownsyncDynamicsOnSingleRenderFrame", it's a compromise here to force resync for all players in a same room if any player recovered from a reconnection (when it's most likely for anyone to notice an inconsistence).
|
||||||
|
|
||||||
|
That said, we ensured that if "false == BackendDynamicsEnabled" and noone ever disconnects & reconnects, the frontend collision handling results are always consistent.
|
||||||
|
*/
|
||||||
|
playerBattleState := atomic.LoadInt32(&(player.BattleState))
|
||||||
|
if PlayerBattleStateIns.READDED_BATTLE_COLLIDER_ACKED == playerBattleState {
|
||||||
|
inputsBufferSnapshot.ShouldForceResync = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
[WARNING] There's a tradeoff for setting/unsetting "ForceAllResyncOnAnyActiveSlowTicker" here, if the `ACTIVE SLOW TICKER` doesn't resume for a long period of time, the current approach is to kick it out by "connWatchdog" instead of forcing resync of all players in the same battle all the way along.
|
||||||
|
|
||||||
|
[FIXME]
|
||||||
|
In practice, I tested in internet environment by toggling player#1 "CPU throttling: 1x -> 4x -> 1x -> 6x -> 1x" and checked the logs of all players which showed that "all received inputFrameIds are consecutive for all players", yet not forcing resync of all players here still result in occasional inconsistent graphics for the `ACTIVE NORMAL TICKER`s.
|
||||||
|
|
||||||
|
More investigation into this issue is needed, it's possible that the inconsistent graphics is just a result of difference of backend/frontend collision calculations, yet before it's totally resolved we'd keep forcing resync here.
|
||||||
|
*/
|
||||||
|
thatPlayerJoinMask := uint64(1 << uint32(player.JoinIndex-1))
|
||||||
|
isActiveSlowTicker := (0 < (thatPlayerJoinMask & inputsBufferSnapshot.UnconfirmedMask)) && (PlayerBattleStateIns.ACTIVE == playerBattleState)
|
||||||
|
if pR.ForceAllResyncOnAnyActiveSlowTicker && isActiveSlowTicker {
|
||||||
|
inputsBufferSnapshot.ShouldForceResync = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, player := range pR.PlayersArr {
|
||||||
/*
|
/*
|
||||||
[WARNING] While the order of generation of "inputsBufferSnapshot" is preserved for sending, the underlying network I/O blocking action is dispatched to "downsyncLoop of each player" such that "markConfirmationIfApplicable & forceConfirmationIfApplicable" can re-hold "pR.InputsBufferLock" asap and proceed with more inputFrameUpsyncs.
|
[WARNING] While the order of generation of "inputsBufferSnapshot" is preserved for sending, the underlying network I/O blocking action is dispatched to "downsyncLoop of each player" such that "markConfirmationIfApplicable & forceConfirmationIfApplicable" can re-hold "pR.InputsBufferLock" asap and proceed with more inputFrameUpsyncs.
|
||||||
|
|
||||||
The use of "downsyncLoop of each player" also waives the need of guarding each "pR.PlayerDownsyncSessionDict[playerId]" from multithread-access (e.g. by a "pR.PlayerDownsyncSessionMutexDict[playerId]"), i.e. Gorilla v1.2.0 "conn.WriteMessage" isn't thread-safe https://github.com/gorilla/websocket/blob/v1.2.0/conn.go#L585.
|
The use of "downsyncLoop of each player" also waives the need of guarding each "pR.PlayerDownsyncSessionDict[playerId]" from multithread-access (e.g. by a "pR.PlayerDownsyncSessionMutexDict[playerId]"), i.e. Gorilla v1.2.0 "conn.WriteMessage" isn't thread-safe https://github.com/gorilla/websocket/blob/v1.2.0/conn.go#L585.
|
||||||
*/
|
*/
|
||||||
if player, existent := pR.Players[playerId]; existent {
|
playerBattleState := atomic.LoadInt32(&(player.BattleState))
|
||||||
playerBattleState := atomic.LoadInt32(&(player.BattleState))
|
switch playerBattleState {
|
||||||
switch playerBattleState {
|
case PlayerBattleStateIns.DISCONNECTED, PlayerBattleStateIns.LOST, PlayerBattleStateIns.EXPELLED_DURING_GAME, PlayerBattleStateIns.EXPELLED_IN_DISMISSAL, PlayerBattleStateIns.ADDED_PENDING_BATTLE_COLLIDER_ACK, PlayerBattleStateIns.READDED_PENDING_BATTLE_COLLIDER_ACK:
|
||||||
case PlayerBattleStateIns.DISCONNECTED:
|
continue
|
||||||
case PlayerBattleStateIns.LOST:
|
}
|
||||||
case PlayerBattleStateIns.EXPELLED_DURING_GAME:
|
|
||||||
case PlayerBattleStateIns.EXPELLED_IN_DISMISSAL:
|
if playerDownsyncChan, existent := pR.PlayerDownsyncChanDict[player.Id]; existent {
|
||||||
case PlayerBattleStateIns.ADDED_PENDING_BATTLE_COLLIDER_ACK:
|
|
||||||
case PlayerBattleStateIns.READDED_PENDING_BATTLE_COLLIDER_ACK:
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
playerDownsyncChan <- (*inputsBufferSnapshot)
|
playerDownsyncChan <- (*inputsBufferSnapshot)
|
||||||
// Logger.Info(fmt.Sprintf("Sent inputsBufferSnapshot(refRenderFrameId:%d, unconfirmedMask:%v) to for (roomId: %d, playerId:%d, playerDownsyncChan:%p)#1", inputsBufferSnapshot.RefRenderFrameId, inputsBufferSnapshot.UnconfirmedMask, pR.Id, playerId, playerDownsyncChan))
|
//Logger.Info(fmt.Sprintf("Sent inputsBufferSnapshot(refRenderFrameId:%d, unconfirmedMask:%v) to for (roomId: %d, playerId:%d, playerDownsyncChan:%p)#1", inputsBufferSnapshot.RefRenderFrameId, inputsBufferSnapshot.UnconfirmedMask, pR.Id, player.Id, playerDownsyncChan))
|
||||||
|
} else {
|
||||||
|
Logger.Warn(fmt.Sprintf("playerDownsyncChan for (roomId: %d, playerId:%d) is gone", pR.Id, player.Id))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pR *Room) downsyncToSinglePlayer(playerId int32, player *Player, refRenderFrameId int32, unconfirmedMask uint64, toSendInputFrameDownsyncsSnapshot []*InputFrameDownsync) {
|
func (pR *Room) downsyncToSinglePlayer(playerId int32, player *Player, refRenderFrameId int32, unconfirmedMask uint64, toSendInputFrameDownsyncsSnapshot []*InputFrameDownsync, shouldForceResync bool) {
|
||||||
/*
|
/*
|
||||||
[WARNING] This function MUST BE called while "pR.InputsBufferLock" is unlocked -- otherwise the network I/O blocking of "sendSafely" might cause significant lag for "markConfirmationIfApplicable & forceConfirmationIfApplicable"!
|
[WARNING] This function MUST BE called while "pR.InputsBufferLock" is unlocked -- otherwise the network I/O blocking of "sendSafely" might cause significant lag for "markConfirmationIfApplicable & forceConfirmationIfApplicable"!
|
||||||
|
|
||||||
@@ -1763,33 +1811,22 @@ func (pR *Room) downsyncToSinglePlayer(playerId int32, player *Player, refRender
|
|||||||
playerJoinIndex := player.JoinIndex - 1
|
playerJoinIndex := player.JoinIndex - 1
|
||||||
playerBattleState := atomic.LoadInt32(&(player.BattleState))
|
playerBattleState := atomic.LoadInt32(&(player.BattleState))
|
||||||
switch playerBattleState {
|
switch playerBattleState {
|
||||||
case PlayerBattleStateIns.DISCONNECTED:
|
case PlayerBattleStateIns.DISCONNECTED, PlayerBattleStateIns.LOST, PlayerBattleStateIns.EXPELLED_DURING_GAME, PlayerBattleStateIns.EXPELLED_IN_DISMISSAL, PlayerBattleStateIns.ADDED_PENDING_BATTLE_COLLIDER_ACK, PlayerBattleStateIns.READDED_PENDING_BATTLE_COLLIDER_ACK:
|
||||||
case PlayerBattleStateIns.LOST:
|
|
||||||
case PlayerBattleStateIns.EXPELLED_DURING_GAME:
|
|
||||||
case PlayerBattleStateIns.EXPELLED_IN_DISMISSAL:
|
|
||||||
case PlayerBattleStateIns.ADDED_PENDING_BATTLE_COLLIDER_ACK:
|
|
||||||
case PlayerBattleStateIns.READDED_PENDING_BATTLE_COLLIDER_ACK:
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isSlowTicker := (0 < (unconfirmedMask & uint64(1<<uint32(playerJoinIndex))))
|
||||||
shouldResync1 := (PlayerBattleStateIns.READDED_BATTLE_COLLIDER_ACKED == playerBattleState) // i.e. implies that "MAGIC_LAST_SENT_INPUT_FRAME_ID_READDED == player.LastSentInputFrameId"
|
shouldResync1 := (PlayerBattleStateIns.READDED_BATTLE_COLLIDER_ACKED == playerBattleState) // i.e. implies that "MAGIC_LAST_SENT_INPUT_FRAME_ID_READDED == player.LastSentInputFrameId"
|
||||||
shouldResync2 := (0 < (unconfirmedMask & uint64(1<<uint32(playerJoinIndex)))) // This condition is critical, if we don't send resync upon this condition, the "reconnected or slowly-clocking player" might never get its input synced
|
shouldResync2 := isSlowTicker // This condition is critical, if we don't send resync upon this condition, the "reconnected or slowly-clocking player" might never get its input synced
|
||||||
// shouldResync2 := (0 < unconfirmedMask) // An easier version of the above, might keep sending "refRenderFrame"s to still connected players when any player is disconnected
|
shouldResync3 := shouldForceResync
|
||||||
shouldResyncOverall := (shouldResync1 || shouldResync2)
|
shouldResyncOverall := (shouldResync1 || shouldResync2 || shouldResync3)
|
||||||
|
|
||||||
if shouldResyncOverall {
|
|
||||||
// A rejoined player, should guarantee that when it resyncs to "refRenderFrameId" a matching inputFrame to apply exists
|
|
||||||
Logger.Debug(fmt.Sprintf("Resyncing player: roomId=%v, playerId=%v, playerJoinIndex=%v, renderFrameId=%v, curDynamicsRenderFrameId=%v, playerLastSentInputFrameId=%v, refRenderFrameId=%v", pR.Id, playerId, player.JoinIndex, pR.RenderFrameId, pR.CurDynamicsRenderFrameId, player.LastSentInputFrameId, refRenderFrameId))
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Resync helps
|
Resync helps
|
||||||
1. when player with a slower frontend clock lags significantly behind and thus wouldn't get its inputUpsync recognized due to faster "forceConfirmation"
|
1. when player with a slower frontend clock lags significantly behind and thus wouldn't get its inputUpsync recognized due to faster "forceConfirmation"
|
||||||
2. reconnection
|
2. reconnection
|
||||||
*/
|
*/
|
||||||
|
toSendInputFrameIdSt, toSendInputFrameIdEd := toSendInputFrameDownsyncsSnapshot[0].InputFrameId, toSendInputFrameDownsyncsSnapshot[len(toSendInputFrameDownsyncsSnapshot)-1].InputFrameId+1
|
||||||
//toSendInputFrameIdSt, toSendInputFrameIdEd := toSendInputFrameDownsyncsSnapshot[0].InputFrameId, toSendInputFrameDownsyncsSnapshot[len(toSendInputFrameDownsyncsSnapshot)-1].InputFrameId+1
|
|
||||||
_, toSendInputFrameIdEd := toSendInputFrameDownsyncsSnapshot[0].InputFrameId, toSendInputFrameDownsyncsSnapshot[len(toSendInputFrameDownsyncsSnapshot)-1].InputFrameId+1
|
|
||||||
if pR.BackendDynamicsEnabled && shouldResyncOverall {
|
if pR.BackendDynamicsEnabled && shouldResyncOverall {
|
||||||
tmp := pR.RenderFrameBuffer.GetByFrameId(refRenderFrameId)
|
tmp := pR.RenderFrameBuffer.GetByFrameId(refRenderFrameId)
|
||||||
if nil == tmp {
|
if nil == tmp {
|
||||||
@@ -1800,9 +1837,15 @@ func (pR *Room) downsyncToSinglePlayer(playerId int32, player *Player, refRender
|
|||||||
for _, player := range pR.PlayersArr {
|
for _, player := range pR.PlayersArr {
|
||||||
refRenderFrame.Players[player.Id].ColliderRadius = player.ColliderRadius // hardcoded for now
|
refRenderFrame.Players[player.Id].ColliderRadius = player.ColliderRadius // hardcoded for now
|
||||||
}
|
}
|
||||||
|
if shouldResync3 {
|
||||||
|
refRenderFrame.ShouldForceResync = true
|
||||||
|
}
|
||||||
refRenderFrame.BackendUnconfirmedMask = unconfirmedMask
|
refRenderFrame.BackendUnconfirmedMask = unconfirmedMask
|
||||||
pR.sendSafely(refRenderFrame, toSendInputFrameDownsyncsSnapshot, DOWNSYNC_MSG_ACT_FORCED_RESYNC, playerId, false)
|
pR.sendSafely(refRenderFrame, toSendInputFrameDownsyncsSnapshot, DOWNSYNC_MSG_ACT_FORCED_RESYNC, playerId, false)
|
||||||
// Logger.Warn(fmt.Sprintf("Sent refRenderFrameId=%v & inputFrameIds [%d, %d), for roomId=%v, playerId=%d, playerJoinIndex=%d, renderFrameId=%d, curDynamicsRenderFrameId=%d, playerLastSentInputFrameId=%d: InputsBuffer=%v", refRenderFrameId, toSendInputFrameIdSt, toSendInputFrameIdEd, pR.Id, playerId, player.JoinIndex, pR.RenderFrameId, pR.CurDynamicsRenderFrameId, player.LastSentInputFrameId, pR.InputsBufferString(false)))
|
//Logger.Warn(fmt.Sprintf("Sent refRenderFrameId=%v & inputFrameIds [%d, %d), for roomId=%v, playerId=%d, playerJoinIndex=%d, renderFrameId=%d, curDynamicsRenderFrameId=%d, playerLastSentInputFrameId=%d: InputsBuffer=%v", refRenderFrameId, toSendInputFrameIdSt, toSendInputFrameIdEd, pR.Id, playerId, player.JoinIndex, pR.RenderFrameId, pR.CurDynamicsRenderFrameId, player.LastSentInputFrameId, pR.InputsBufferString(false)))
|
||||||
|
if shouldResync1 {
|
||||||
|
Logger.Warn(fmt.Sprintf("Sent refRenderFrameId=%v & inputFrameIds [%d, %d), for roomId=%v, playerId=%d, playerJoinIndex=%d, renderFrameId=%d, curDynamicsRenderFrameId=%d, playerLastSentInputFrameId=%d: shouldResync1=%v, shouldResync2=%v, shouldResync3=%v, playerBattleState=%d", refRenderFrameId, toSendInputFrameIdSt, toSendInputFrameIdEd, pR.Id, playerId, player.JoinIndex, pR.RenderFrameId, pR.CurDynamicsRenderFrameId, player.LastSentInputFrameId, shouldResync1, shouldResync2, shouldResync3, playerBattleState))
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
pR.sendSafely(nil, toSendInputFrameDownsyncsSnapshot, DOWNSYNC_MSG_ACT_INPUT_BATCH, playerId, false)
|
pR.sendSafely(nil, toSendInputFrameDownsyncsSnapshot, DOWNSYNC_MSG_ACT_INPUT_BATCH, playerId, false)
|
||||||
}
|
}
|
||||||
|
27
battle_srv/models/watchdog.go
Normal file
27
battle_srv/models/watchdog.go
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
package models
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Watchdog struct {
|
||||||
|
interval time.Duration
|
||||||
|
timer *time.Timer
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewWatchdog(interval time.Duration, callback func()) *Watchdog {
|
||||||
|
w := Watchdog{
|
||||||
|
interval: interval,
|
||||||
|
timer: time.AfterFunc(interval, callback),
|
||||||
|
}
|
||||||
|
return &w
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *Watchdog) Stop() {
|
||||||
|
w.timer.Stop()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *Watchdog) Kick() {
|
||||||
|
w.timer.Stop()
|
||||||
|
w.timer.Reset(w.interval)
|
||||||
|
}
|
@@ -670,6 +670,7 @@ type InputsBufferSnapshot struct {
|
|||||||
RefRenderFrameId int32 `protobuf:"varint,1,opt,name=refRenderFrameId,proto3" json:"refRenderFrameId,omitempty"`
|
RefRenderFrameId int32 `protobuf:"varint,1,opt,name=refRenderFrameId,proto3" json:"refRenderFrameId,omitempty"`
|
||||||
UnconfirmedMask uint64 `protobuf:"varint,2,opt,name=unconfirmedMask,proto3" json:"unconfirmedMask,omitempty"`
|
UnconfirmedMask uint64 `protobuf:"varint,2,opt,name=unconfirmedMask,proto3" json:"unconfirmedMask,omitempty"`
|
||||||
ToSendInputFrameDownsyncs []*InputFrameDownsync `protobuf:"bytes,3,rep,name=toSendInputFrameDownsyncs,proto3" json:"toSendInputFrameDownsyncs,omitempty"`
|
ToSendInputFrameDownsyncs []*InputFrameDownsync `protobuf:"bytes,3,rep,name=toSendInputFrameDownsyncs,proto3" json:"toSendInputFrameDownsyncs,omitempty"`
|
||||||
|
ShouldForceResync bool `protobuf:"varint,4,opt,name=shouldForceResync,proto3" json:"shouldForceResync,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *InputsBufferSnapshot) Reset() {
|
func (x *InputsBufferSnapshot) Reset() {
|
||||||
@@ -725,6 +726,13 @@ func (x *InputsBufferSnapshot) GetToSendInputFrameDownsyncs() []*InputFrameDowns
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (x *InputsBufferSnapshot) GetShouldForceResync() bool {
|
||||||
|
if x != nil {
|
||||||
|
return x.ShouldForceResync
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
type MeleeBullet struct {
|
type MeleeBullet struct {
|
||||||
state protoimpl.MessageState
|
state protoimpl.MessageState
|
||||||
sizeCache protoimpl.SizeCache
|
sizeCache protoimpl.SizeCache
|
||||||
@@ -1199,6 +1207,7 @@ type RoomDownsyncFrame struct {
|
|||||||
CountdownNanos int64 `protobuf:"varint,3,opt,name=countdownNanos,proto3" json:"countdownNanos,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
|
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
|
BackendUnconfirmedMask uint64 `protobuf:"varint,5,opt,name=backendUnconfirmedMask,proto3" json:"backendUnconfirmedMask,omitempty"` // Indexed by "joinIndex", same compression concern as stated in InputFrameDownsync
|
||||||
|
ShouldForceResync bool `protobuf:"varint,6,opt,name=shouldForceResync,proto3" json:"shouldForceResync,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *RoomDownsyncFrame) Reset() {
|
func (x *RoomDownsyncFrame) Reset() {
|
||||||
@@ -1268,6 +1277,13 @@ func (x *RoomDownsyncFrame) GetBackendUnconfirmedMask() uint64 {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (x *RoomDownsyncFrame) GetShouldForceResync() bool {
|
||||||
|
if x != nil {
|
||||||
|
return x.ShouldForceResync
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
var File_room_downsync_frame_proto protoreflect.FileDescriptor
|
var File_room_downsync_frame_proto protoreflect.FileDescriptor
|
||||||
|
|
||||||
var file_room_downsync_frame_proto_rawDesc = []byte{
|
var file_room_downsync_frame_proto_rawDesc = []byte{
|
||||||
@@ -1373,7 +1389,7 @@ var file_room_downsync_frame_proto_rawDesc = []byte{
|
|||||||
0x74, 0x63, 0x68, 0x12, 0x36, 0x0a, 0x08, 0x62, 0x63, 0x69, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x18,
|
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,
|
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,
|
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, 0xc6, 0x01, 0x0a, 0x14,
|
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,
|
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,
|
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, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10,
|
||||||
@@ -1386,196 +1402,201 @@ var file_room_downsync_frame_proto_rawDesc = []byte{
|
|||||||
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d,
|
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,
|
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,
|
0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73,
|
||||||
0x79, 0x6e, 0x63, 0x73, 0x22, 0xe5, 0x05, 0x0a, 0x0b, 0x4d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75,
|
0x79, 0x6e, 0x63, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x46, 0x6f,
|
||||||
0x6c, 0x6c, 0x65, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x4c, 0x6f,
|
0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52,
|
||||||
0x63, 0x61, 0x6c, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x62, 0x61, 0x74,
|
0x11, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x79,
|
||||||
0x74, 0x6c, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x74,
|
0x6e, 0x63, 0x22, 0xe5, 0x05, 0x0a, 0x0b, 0x4d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c,
|
||||||
0x61, 0x72, 0x74, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28,
|
0x65, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x4c, 0x6f, 0x63, 0x61,
|
||||||
0x05, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73,
|
0x6c, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x62, 0x61, 0x74, 0x74, 0x6c,
|
||||||
0x12, 0x22, 0x0a, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73,
|
0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x72,
|
||||||
0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x72,
|
0x74, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52,
|
||||||
0x61, 0x6d, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79,
|
0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x22,
|
||||||
0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x72, 0x65,
|
0x0a, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03,
|
||||||
0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x15,
|
0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x61, 0x6d,
|
||||||
0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e,
|
0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72,
|
||||||
0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x72, 0x65, 0x63,
|
0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f,
|
||||||
0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x42, 0x6c, 0x6f,
|
0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x72, 0x65,
|
||||||
0x63, 0x6b, 0x12, 0x30, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72,
|
0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x42, 0x6c,
|
||||||
0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x48, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52,
|
0x6f, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x72, 0x65, 0x63, 0x6f, 0x76,
|
||||||
0x13, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f,
|
0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b,
|
||||||
0x6e, 0x48, 0x69, 0x74, 0x12, 0x35, 0x0a, 0x0b, 0x6d, 0x6f, 0x76, 0x65, 0x66, 0x6f, 0x72, 0x77,
|
0x12, 0x30, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d,
|
||||||
0x61, 0x72, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x73, 0x68, 0x61, 0x72,
|
0x65, 0x73, 0x4f, 0x6e, 0x48, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x72,
|
||||||
0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x56, 0x65, 0x63, 0x32, 0x44, 0x52, 0x0b,
|
0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x48,
|
||||||
0x6d, 0x6f, 0x76, 0x65, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x68,
|
0x69, 0x74, 0x12, 0x35, 0x0a, 0x0b, 0x6d, 0x6f, 0x76, 0x65, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72,
|
||||||
0x69, 0x74, 0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28,
|
0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64,
|
||||||
0x01, 0x52, 0x0c, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12,
|
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x56, 0x65, 0x63, 0x32, 0x44, 0x52, 0x0b, 0x6d, 0x6f,
|
||||||
0x33, 0x0a, 0x0a, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20,
|
0x76, 0x65, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x68, 0x69, 0x74,
|
||||||
0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74,
|
0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52,
|
||||||
0x6f, 0x73, 0x2e, 0x56, 0x65, 0x63, 0x32, 0x44, 0x52, 0x0a, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78,
|
0x0c, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x33, 0x0a,
|
||||||
0x53, 0x69, 0x7a, 0x65, 0x12, 0x38, 0x0a, 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74,
|
0x0a, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28,
|
||||||
0x65, 0x64, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18,
|
0x0b, 0x32, 0x13, 0x2e, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73,
|
||||||
0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65,
|
0x2e, 0x56, 0x65, 0x63, 0x32, 0x44, 0x52, 0x0a, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x53, 0x69,
|
||||||
0x64, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x24,
|
0x7a, 0x65, 0x12, 0x38, 0x0a, 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64,
|
||||||
0x0a, 0x0d, 0x68, 0x69, 0x74, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18,
|
0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x0a, 0x20,
|
||||||
0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x68, 0x69, 0x74, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72,
|
0x01, 0x28, 0x05, 0x52, 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x52,
|
||||||
0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x75,
|
0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d,
|
||||||
0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x62,
|
0x68, 0x69, 0x74, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0b, 0x20,
|
||||||
0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x1a,
|
0x01, 0x28, 0x05, 0x52, 0x0d, 0x68, 0x69, 0x74, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d,
|
||||||
0x0a, 0x08, 0x70, 0x75, 0x73, 0x68, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01,
|
0x65, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x75, 0x6e, 0x46,
|
||||||
0x52, 0x08, 0x70, 0x75, 0x73, 0x68, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x2e, 0x0a, 0x12, 0x72, 0x65,
|
0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x62, 0x6c, 0x6f,
|
||||||
0x6c, 0x65, 0x61, 0x73, 0x65, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65,
|
0x63, 0x6b, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08,
|
||||||
0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x54,
|
0x70, 0x75, 0x73, 0x68, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08,
|
||||||
0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x61,
|
0x70, 0x75, 0x73, 0x68, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x2e, 0x0a, 0x12, 0x72, 0x65, 0x6c, 0x65,
|
||||||
0x6d, 0x61, 0x67, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x64, 0x61, 0x6d, 0x61,
|
0x61, 0x73, 0x65, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0e,
|
||||||
0x67, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4a, 0x6f,
|
0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x54, 0x72, 0x69,
|
||||||
0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x6f,
|
0x67, 0x67, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x61, 0x6d, 0x61,
|
||||||
0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78,
|
0x67, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65,
|
||||||
0x12, 0x2a, 0x0a, 0x10, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x61, 0x79,
|
0x12, 0x2c, 0x0a, 0x11, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e,
|
||||||
0x65, 0x72, 0x49, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6f, 0x66, 0x66, 0x65,
|
0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x6f, 0x66, 0x66,
|
||||||
0x6e, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0x22, 0xf2, 0x0e, 0x0a,
|
0x65, 0x6e, 0x64, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x2a,
|
||||||
0x12, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x49,
|
0x0a, 0x10, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72,
|
||||||
0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65,
|
0x49, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64,
|
||||||
0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d,
|
0x65, 0x72, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0x22, 0xf2, 0x0e, 0x0a, 0x12, 0x42,
|
||||||
0x65, 0x12, 0x5f, 0x0a, 0x11, 0x73, 0x74, 0x72, 0x54, 0x6f, 0x56, 0x65, 0x63, 0x32, 0x44, 0x4c,
|
0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66,
|
||||||
0x69, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70,
|
0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01,
|
||||||
0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c,
|
0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12,
|
||||||
0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x53, 0x74, 0x72, 0x54, 0x6f, 0x56, 0x65,
|
0x5f, 0x0a, 0x11, 0x73, 0x74, 0x72, 0x54, 0x6f, 0x56, 0x65, 0x63, 0x32, 0x44, 0x4c, 0x69, 0x73,
|
||||||
0x63, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52,
|
0x74, 0x4d, 0x61, 0x70, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x72, 0x6f,
|
||||||
0x11, 0x73, 0x74, 0x72, 0x54, 0x6f, 0x56, 0x65, 0x63, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d,
|
0x74, 0x6f, 0x73, 0x2e, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64,
|
||||||
0x61, 0x70, 0x12, 0x6b, 0x0a, 0x15, 0x73, 0x74, 0x72, 0x54, 0x6f, 0x50, 0x6f, 0x6c, 0x79, 0x67,
|
0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x53, 0x74, 0x72, 0x54, 0x6f, 0x56, 0x65, 0x63, 0x32,
|
||||||
0x6f, 0x6e, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x18, 0x03, 0x20, 0x03, 0x28,
|
0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x73,
|
||||||
0x0b, 0x32, 0x35, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x42, 0x61, 0x74, 0x74, 0x6c,
|
0x74, 0x72, 0x54, 0x6f, 0x56, 0x65, 0x63, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x70,
|
||||||
0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x53, 0x74,
|
0x12, 0x6b, 0x0a, 0x15, 0x73, 0x74, 0x72, 0x54, 0x6f, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e,
|
||||||
0x72, 0x54, 0x6f, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74,
|
0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32,
|
||||||
0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x15, 0x73, 0x74, 0x72, 0x54, 0x6f, 0x50,
|
0x35, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43,
|
||||||
0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x12,
|
0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x53, 0x74, 0x72, 0x54,
|
||||||
0x26, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x67, 0x65, 0x44, 0x69, 0x73, 0x63, 0x72, 0x65, 0x74, 0x65,
|
0x6f, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61,
|
||||||
0x57, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x67, 0x65, 0x44, 0x69,
|
0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x15, 0x73, 0x74, 0x72, 0x54, 0x6f, 0x50, 0x6f, 0x6c,
|
||||||
0x73, 0x63, 0x72, 0x65, 0x74, 0x65, 0x57, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x67, 0x65,
|
0x79, 0x67, 0x6f, 0x6e, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x12, 0x26, 0x0a,
|
||||||
0x44, 0x69, 0x73, 0x63, 0x72, 0x65, 0x74, 0x65, 0x48, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52,
|
0x0e, 0x73, 0x74, 0x61, 0x67, 0x65, 0x44, 0x69, 0x73, 0x63, 0x72, 0x65, 0x74, 0x65, 0x57, 0x18,
|
||||||
0x0e, 0x73, 0x74, 0x61, 0x67, 0x65, 0x44, 0x69, 0x73, 0x63, 0x72, 0x65, 0x74, 0x65, 0x48, 0x12,
|
0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x67, 0x65, 0x44, 0x69, 0x73, 0x63,
|
||||||
0x1e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x57, 0x18, 0x06, 0x20,
|
0x72, 0x65, 0x74, 0x65, 0x57, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x67, 0x65, 0x44, 0x69,
|
||||||
0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x57, 0x12,
|
0x73, 0x63, 0x72, 0x65, 0x74, 0x65, 0x48, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x73,
|
||||||
0x1e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x48, 0x18, 0x07, 0x20,
|
0x74, 0x61, 0x67, 0x65, 0x44, 0x69, 0x73, 0x63, 0x72, 0x65, 0x74, 0x65, 0x48, 0x12, 0x1e, 0x0a,
|
||||||
0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x48, 0x12,
|
0x0a, 0x73, 0x74, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x57, 0x18, 0x06, 0x20, 0x01, 0x28,
|
||||||
0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x54, 0x6f, 0x50, 0x69, 0x6e,
|
0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x57, 0x12, 0x1e, 0x0a,
|
||||||
0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61,
|
0x0a, 0x73, 0x74, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x48, 0x18, 0x07, 0x20, 0x01, 0x28,
|
||||||
0x6c, 0x54, 0x6f, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x34, 0x0a, 0x15, 0x77, 0x69, 0x6c, 0x6c, 0x4b,
|
0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x48, 0x12, 0x26, 0x0a,
|
||||||
0x69, 0x63, 0x6b, 0x49, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x6f, 0x72,
|
0x0e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x54, 0x6f, 0x50, 0x69, 0x6e, 0x67, 0x18,
|
||||||
0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x77, 0x69, 0x6c, 0x6c, 0x4b, 0x69, 0x63, 0x6b,
|
0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x54,
|
||||||
0x49, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x6f, 0x72, 0x12, 0x20, 0x0a,
|
0x6f, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x34, 0x0a, 0x15, 0x77, 0x69, 0x6c, 0x6c, 0x4b, 0x69, 0x63,
|
||||||
0x0b, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x01,
|
0x6b, 0x49, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x6f, 0x72, 0x18, 0x09,
|
||||||
0x28, 0x05, 0x52, 0x0b, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12,
|
0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x77, 0x69, 0x6c, 0x6c, 0x4b, 0x69, 0x63, 0x6b, 0x49, 0x66,
|
||||||
0x32, 0x0a, 0x14, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,
|
0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x6f, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x62,
|
||||||
0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x62,
|
0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05,
|
||||||
0x61, 0x74, 0x74, 0x6c, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x61,
|
0x52, 0x0b, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x32, 0x0a,
|
||||||
0x6d, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x44, 0x75, 0x72,
|
0x14, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46,
|
||||||
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03,
|
0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x62, 0x61, 0x74,
|
||||||
0x52, 0x13, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
|
0x74, 0x6c, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65,
|
||||||
0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x46,
|
0x73, 0x12, 0x30, 0x0a, 0x13, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74,
|
||||||
0x70, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72,
|
0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13,
|
||||||
0x46, 0x70, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x44, 0x65, 0x6c, 0x61,
|
0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61,
|
||||||
0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x69,
|
0x6e, 0x6f, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x46, 0x70, 0x73,
|
||||||
0x6e, 0x70, 0x75, 0x74, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12,
|
0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x46, 0x70,
|
||||||
0x2a, 0x0a, 0x10, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x46, 0x72, 0x61,
|
0x73, 0x12, 0x2a, 0x0a, 0x10, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x46,
|
||||||
0x6d, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x69, 0x6e, 0x70, 0x75, 0x74,
|
0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x69, 0x6e, 0x70,
|
||||||
0x53, 0x63, 0x61, 0x6c, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x6e,
|
0x75, 0x74, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x2a, 0x0a,
|
||||||
0x73, 0x74, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x11, 0x20,
|
0x10, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65,
|
||||||
0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x73, 0x74, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x46, 0x72, 0x61,
|
0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x53, 0x63,
|
||||||
0x6d, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x1e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d,
|
0x61, 0x6c, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x73, 0x74,
|
||||||
0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x54, 0x6f, 0x6c, 0x65,
|
0x44, 0x65, 0x6c, 0x61, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28,
|
||||||
0x72, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1e, 0x69, 0x6e, 0x70,
|
0x05, 0x52, 0x0e, 0x6e, 0x73, 0x74, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65,
|
||||||
0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x44, 0x65, 0x6c,
|
0x73, 0x12, 0x46, 0x0a, 0x1e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55,
|
||||||
0x61, 0x79, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x48, 0x0a, 0x1f, 0x6d,
|
0x70, 0x73, 0x79, 0x6e, 0x63, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61,
|
||||||
0x61, 0x78, 0x43, 0x68, 0x61, 0x73, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46,
|
0x6e, 0x63, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1e, 0x69, 0x6e, 0x70, 0x75, 0x74,
|
||||||
0x72, 0x61, 0x6d, 0x65, 0x73, 0x50, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x13,
|
0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x44, 0x65, 0x6c, 0x61, 0x79,
|
||||||
0x20, 0x01, 0x28, 0x05, 0x52, 0x1f, 0x6d, 0x61, 0x78, 0x43, 0x68, 0x61, 0x73, 0x69, 0x6e, 0x67,
|
0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x48, 0x0a, 0x1f, 0x6d, 0x61, 0x78,
|
||||||
0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x50, 0x65, 0x72, 0x55,
|
0x43, 0x68, 0x61, 0x73, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61,
|
||||||
0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x42,
|
0x6d, 0x65, 0x73, 0x50, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x13, 0x20, 0x01,
|
||||||
0x61, 0x74, 0x74, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x05,
|
0x28, 0x05, 0x52, 0x1f, 0x6d, 0x61, 0x78, 0x43, 0x68, 0x61, 0x73, 0x69, 0x6e, 0x67, 0x52, 0x65,
|
||||||
0x52, 0x11, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x53, 0x74,
|
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,
|
0x61, 0x74, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x42, 0x61, 0x74,
|
||||||
0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73,
|
0x74, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11,
|
||||||
0x18, 0x15, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b,
|
0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74,
|
||||||
0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69,
|
0x65, 0x12, 0x3c, 0x0a, 0x19, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x45, 0x73, 0x74,
|
||||||
0x73, 0x12, 0x3a, 0x0a, 0x18, 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, 0x15,
|
||||||
0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x18, 0x16, 0x20,
|
0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x45, 0x73,
|
||||||
0x01, 0x28, 0x03, 0x52, 0x18, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x45, 0x73, 0x74,
|
0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x12,
|
||||||
0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x12, 0x38, 0x0a,
|
0x3a, 0x0a, 0x18, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x45, 0x73, 0x74, 0x69, 0x6d,
|
||||||
0x17, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x54, 0x6f, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47,
|
0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28,
|
||||||
0x72, 0x69, 0x64, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x17, 0x20, 0x01, 0x28, 0x01, 0x52, 0x17,
|
0x03, 0x52, 0x18, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x45, 0x73, 0x74, 0x69, 0x6d,
|
||||||
0x77, 0x6f, 0x72, 0x6c, 0x64, 0x54, 0x6f, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72,
|
0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x12, 0x38, 0x0a, 0x17, 0x77,
|
||||||
0x69, 0x64, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x38, 0x0a, 0x17, 0x76, 0x69, 0x72, 0x74, 0x75,
|
0x6f, 0x72, 0x6c, 0x64, 0x54, 0x6f, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69,
|
||||||
0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x54, 0x6f, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x52, 0x61, 0x74,
|
0x64, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x17, 0x20, 0x01, 0x28, 0x01, 0x52, 0x17, 0x77, 0x6f,
|
||||||
0x69, 0x6f, 0x18, 0x18, 0x20, 0x01, 0x28, 0x01, 0x52, 0x17, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61,
|
0x72, 0x6c, 0x64, 0x54, 0x6f, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64,
|
||||||
0x6c, 0x47, 0x72, 0x69, 0x64, 0x54, 0x6f, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x52, 0x61, 0x74, 0x69,
|
0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x38, 0x0a, 0x17, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c,
|
||||||
0x6f, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x70, 0x41, 0x74, 0x6b, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70,
|
0x47, 0x72, 0x69, 0x64, 0x54, 0x6f, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x52, 0x61, 0x74, 0x69, 0x6f,
|
||||||
0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x73, 0x70,
|
0x18, 0x18, 0x20, 0x01, 0x28, 0x01, 0x52, 0x17, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47,
|
||||||
0x41, 0x74, 0x6b, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12,
|
0x72, 0x69, 0x64, 0x54, 0x6f, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12,
|
||||||
0x28, 0x0a, 0x0f, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69,
|
0x2c, 0x0a, 0x11, 0x73, 0x70, 0x41, 0x74, 0x6b, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x46, 0x72,
|
||||||
0x7a, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72,
|
0x61, 0x6d, 0x65, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x73, 0x70, 0x41, 0x74,
|
||||||
0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x5c, 0x0a, 0x10, 0x6d, 0x65, 0x6c,
|
0x6b, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x0a,
|
||||||
0x65, 0x65, 0x53, 0x6b, 0x69, 0x6c, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x1b, 0x20,
|
0x0f, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65,
|
||||||
0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x42, 0x61, 0x74,
|
0x18, 0x1a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x43, 0x61,
|
||||||
0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x2e,
|
0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x5c, 0x0a, 0x10, 0x6d, 0x65, 0x6c, 0x65, 0x65,
|
||||||
0x4d, 0x65, 0x6c, 0x65, 0x65, 0x53, 0x6b, 0x69, 0x6c, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
|
0x53, 0x6b, 0x69, 0x6c, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x1b, 0x20, 0x03, 0x28,
|
||||||
0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x6d, 0x65, 0x6c, 0x65, 0x65, 0x53, 0x6b, 0x69, 0x6c,
|
0x0b, 0x32, 0x30, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x42, 0x61, 0x74, 0x74, 0x6c,
|
||||||
0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x38, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x49,
|
0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x4d, 0x65,
|
||||||
0x6e, 0x74, 0x6f, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x4f, 0x76, 0x65, 0x72, 0x6c,
|
0x6c, 0x65, 0x65, 0x53, 0x6b, 0x69, 0x6c, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e,
|
||||||
0x61, 0x70, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x01, 0x52, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x49, 0x6e,
|
0x74, 0x72, 0x79, 0x52, 0x10, 0x6d, 0x65, 0x6c, 0x65, 0x65, 0x53, 0x6b, 0x69, 0x6c, 0x6c, 0x43,
|
||||||
0x74, 0x6f, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x4f, 0x76, 0x65, 0x72, 0x6c, 0x61,
|
0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x38, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x49, 0x6e, 0x74,
|
||||||
0x70, 0x12, 0x3c, 0x0a, 0x19, 0x73, 0x6e, 0x61, 0x70, 0x49, 0x6e, 0x74, 0x6f, 0x50, 0x6c, 0x61,
|
0x6f, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x4f, 0x76, 0x65, 0x72, 0x6c, 0x61, 0x70,
|
||||||
0x74, 0x66, 0x6f, 0x72, 0x6d, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x1d,
|
0x18, 0x1c, 0x20, 0x01, 0x28, 0x01, 0x52, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x49, 0x6e, 0x74, 0x6f,
|
||||||
0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x73, 0x6e, 0x61, 0x70, 0x49, 0x6e, 0x74, 0x6f, 0x50, 0x6c,
|
0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x4f, 0x76, 0x65, 0x72, 0x6c, 0x61, 0x70, 0x12,
|
||||||
0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12,
|
0x3c, 0x0a, 0x19, 0x73, 0x6e, 0x61, 0x70, 0x49, 0x6e, 0x74, 0x6f, 0x50, 0x6c, 0x61, 0x74, 0x66,
|
||||||
0x28, 0x0a, 0x0f, 0x6a, 0x75, 0x6d, 0x70, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x69, 0x74, 0x56, 0x65,
|
0x6f, 0x72, 0x6d, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x1d, 0x20, 0x01,
|
||||||
0x6c, 0x59, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x6a, 0x75, 0x6d, 0x70, 0x69, 0x6e,
|
0x28, 0x01, 0x52, 0x19, 0x73, 0x6e, 0x61, 0x70, 0x49, 0x6e, 0x74, 0x6f, 0x50, 0x6c, 0x61, 0x74,
|
||||||
0x67, 0x49, 0x6e, 0x69, 0x74, 0x56, 0x65, 0x6c, 0x59, 0x12, 0x1a, 0x0a, 0x08, 0x67, 0x72, 0x61,
|
0x66, 0x6f, 0x72, 0x6d, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x28, 0x0a,
|
||||||
0x76, 0x69, 0x74, 0x79, 0x58, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x67, 0x72, 0x61,
|
0x0f, 0x6a, 0x75, 0x6d, 0x70, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x69, 0x74, 0x56, 0x65, 0x6c, 0x59,
|
||||||
0x76, 0x69, 0x74, 0x79, 0x58, 0x12, 0x1a, 0x0a, 0x08, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x79,
|
0x18, 0x1e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x6a, 0x75, 0x6d, 0x70, 0x69, 0x6e, 0x67, 0x49,
|
||||||
0x59, 0x18, 0x20, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x79,
|
0x6e, 0x69, 0x74, 0x56, 0x65, 0x6c, 0x59, 0x12, 0x1a, 0x0a, 0x08, 0x67, 0x72, 0x61, 0x76, 0x69,
|
||||||
0x59, 0x1a, 0x5d, 0x0a, 0x16, 0x53, 0x74, 0x72, 0x54, 0x6f, 0x56, 0x65, 0x63, 0x32, 0x44, 0x4c,
|
0x74, 0x79, 0x58, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x67, 0x72, 0x61, 0x76, 0x69,
|
||||||
0x69, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b,
|
0x74, 0x79, 0x58, 0x12, 0x1a, 0x0a, 0x08, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x79, 0x59, 0x18,
|
||||||
0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a,
|
0x20, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x79, 0x59, 0x1a,
|
||||||
0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73,
|
0x5d, 0x0a, 0x16, 0x53, 0x74, 0x72, 0x54, 0x6f, 0x56, 0x65, 0x63, 0x32, 0x44, 0x4c, 0x69, 0x73,
|
||||||
0x68, 0x61, 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x56, 0x65, 0x63, 0x32,
|
0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79,
|
||||||
0x44, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01,
|
0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76,
|
||||||
0x1a, 0x65, 0x0a, 0x1a, 0x53, 0x74, 0x72, 0x54, 0x6f, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e,
|
0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x68, 0x61,
|
||||||
0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10,
|
0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x56, 0x65, 0x63, 0x32, 0x44, 0x4c,
|
||||||
0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79,
|
0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x65,
|
||||||
0x12, 0x31, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
|
0x0a, 0x1a, 0x53, 0x74, 0x72, 0x54, 0x6f, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x32, 0x44,
|
||||||
0x1b, 0x2e, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x50,
|
0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03,
|
||||||
0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61,
|
0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x31,
|
||||||
0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x58, 0x0a, 0x15, 0x4d, 0x65, 0x6c, 0x65, 0x65,
|
0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e,
|
||||||
0x53, 0x6b, 0x69, 0x6c, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79,
|
0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x50, 0x6f, 0x6c,
|
||||||
0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b,
|
0x79, 0x67, 0x6f, 0x6e, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
|
||||||
0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
|
0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x58, 0x0a, 0x15, 0x4d, 0x65, 0x6c, 0x65, 0x65, 0x53, 0x6b,
|
||||||
0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4d, 0x65, 0x6c, 0x65, 0x65,
|
0x69, 0x6c, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10,
|
||||||
0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38,
|
0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79,
|
||||||
0x01, 0x22, 0xd2, 0x02, 0x0a, 0x11, 0x52, 0x6f, 0x6f, 0x6d, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79,
|
0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
|
||||||
0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,
|
0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75,
|
||||||
0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x40, 0x0a, 0x07, 0x70, 0x6c, 0x61, 0x79, 0x65,
|
0x6c, 0x6c, 0x65, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22,
|
||||||
0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
|
0x80, 0x03, 0x0a, 0x11, 0x52, 0x6f, 0x6f, 0x6d, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63,
|
||||||
0x73, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72,
|
0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
|
||||||
0x61, 0x6d, 0x65, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79,
|
0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x40, 0x0a, 0x07, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73,
|
||||||
0x52, 0x07, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x75,
|
0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e,
|
||||||
0x6e, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28,
|
0x52, 0x6f, 0x6f, 0x6d, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d,
|
||||||
0x03, 0x52, 0x0e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x61, 0x6e, 0x6f,
|
0x65, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07,
|
||||||
0x73, 0x12, 0x37, 0x0a, 0x0c, 0x6d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74,
|
0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x75, 0x6e, 0x74,
|
||||||
0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73,
|
0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52,
|
||||||
0x2e, 0x4d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x0c, 0x6d, 0x65,
|
0x0e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x12,
|
||||||
0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x36, 0x0a, 0x16, 0x62, 0x61,
|
0x37, 0x0a, 0x0c, 0x6d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x18,
|
||||||
0x63, 0x6b, 0x65, 0x6e, 0x64, 0x55, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64,
|
0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4d,
|
||||||
0x4d, 0x61, 0x73, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x16, 0x62, 0x61, 0x63, 0x6b,
|
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,
|
0x65, 0x6e, 0x64, 0x55, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4d, 0x61,
|
||||||
0x73, 0x6b, 0x1a, 0x52, 0x0a, 0x0c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74,
|
0x73, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x16, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e,
|
||||||
0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52,
|
0x64, 0x55, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4d, 0x61, 0x73, 0x6b,
|
||||||
0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20,
|
0x12, 0x2c, 0x0a, 0x11, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x52,
|
||||||
0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x50, 0x6c, 0x61,
|
0x65, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x73, 0x68, 0x6f,
|
||||||
0x79, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x05, 0x76, 0x61, 0x6c,
|
0x75, 0x6c, 0x64, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x1a, 0x52,
|
||||||
0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x13, 0x5a, 0x11, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65,
|
0x0a, 0x0c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10,
|
||||||
0x5f, 0x73, 0x72, 0x76, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f,
|
0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79,
|
||||||
0x74, 0x6f, 0x33,
|
0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 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, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02,
|
||||||
|
0x38, 0x01, 0x42, 0x13, 0x5a, 0x11, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x73, 0x72, 0x76,
|
||||||
|
0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
3
battle_srv/start_daemon.sh
Normal file → Executable file
3
battle_srv/start_daemon.sh
Normal file → Executable file
@@ -7,6 +7,7 @@ fi
|
|||||||
|
|
||||||
basedir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
|
basedir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
|
||||||
|
|
||||||
|
PROJECTNAME=server.exe
|
||||||
OS_USER=$USER
|
OS_USER=$USER
|
||||||
ServerEnv=$1
|
ServerEnv=$1
|
||||||
LOG_PATH="/var/log/treasure-hunter.log"
|
LOG_PATH="/var/log/treasure-hunter.log"
|
||||||
@@ -17,5 +18,5 @@ PID_FILE="$basedir/treasure-hunter.pid"
|
|||||||
sudo su - root -c "touch $LOG_PATH"
|
sudo su - root -c "touch $LOG_PATH"
|
||||||
sudo su - root -c "chown $OS_USER:$OS_USER $LOG_PATH"
|
sudo su - root -c "chown $OS_USER:$OS_USER $LOG_PATH"
|
||||||
|
|
||||||
ServerEnv=$ServerEnv $basedir/server >$LOG_PATH 2>&1 &
|
ServerEnv=$ServerEnv $basedir/$PROJECTNAME >$LOG_PATH 2>&1 &
|
||||||
echo $! > $PID_FILE
|
echo $! > $PID_FILE
|
||||||
|
0
battle_srv/stop_daemon.sh
Normal file → Executable file
0
battle_srv/stop_daemon.sh
Normal file → Executable file
@@ -373,7 +373,7 @@ func Serve(c *gin.Context) {
|
|||||||
// TODO: Is there any potential edge-trigger improvement like the epoll approach mentioned above for the following statement? See discussion in https://github.com/gorilla/websocket/issues/122
|
// TODO: Is there any potential edge-trigger improvement like the epoll approach mentioned above for the following statement? See discussion in https://github.com/gorilla/websocket/issues/122
|
||||||
_, bytes, err := conn.ReadMessage()
|
_, bytes, err := conn.ReadMessage()
|
||||||
if nil != err {
|
if nil != err {
|
||||||
Logger.Error("About to `signalToCloseConnOfThisPlayer`", zap.Any("roomId", pRoom.Id), zap.Any("playerId", playerId), zap.Error(err))
|
Logger.Error("About to `signalToCloseConnOfThisPlayer` due to conn.ReadMessage err", zap.Any("roomId", pRoom.Id), zap.Any("playerId", playerId), zap.Error(err))
|
||||||
signalToCloseConnOfThisPlayer(Constants.RetCode.UnknownError, "")
|
signalToCloseConnOfThisPlayer(Constants.RetCode.UnknownError, "")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@@ -7,3 +7,10 @@ ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" output.mp4
|
|||||||
```
|
```
|
||||||
ffmpeg -ss 12 -t 13 -i input.mp4 -vf "fps=10,scale=480:-1" -loop 0 output.gif
|
ffmpeg -ss 12 -t 13 -i input.mp4 -vf "fps=10,scale=480:-1" -loop 0 output.gif
|
||||||
```
|
```
|
||||||
|
|
||||||
|
# Extract GIF (with alpha channel, e.g. exported from Fighter Factory Studio) to PNG sequence
|
||||||
|
```
|
||||||
|
ffmpeg -vsync vfr -i input.gif output%d.png
|
||||||
|
```
|
||||||
|
|
||||||
|
The `-vsync vfr` tells ffmpeg to disrespect the original delays set within the GIF file, otherwise many duplicate frame will be extracted by the default 60FPS.
|
||||||
|
@@ -2,7 +2,8 @@ PROJECTNAME=viscol.exe
|
|||||||
ROOT_DIR=.
|
ROOT_DIR=.
|
||||||
all: help
|
all: help
|
||||||
## Available proxies for downloading go modules are listed in "https://github.com/golang/go/wiki/Modules#how-do-i-use-vendoring-with-modules-is-vendoring-going-away".
|
## Available proxies for downloading go modules are listed in "https://github.com/golang/go/wiki/Modules#how-do-i-use-vendoring-with-modules-is-vendoring-going-away".
|
||||||
GOPROXY=https://mirrors.aliyun.com/goproxy
|
#GOPROXY=https://mirrors.aliyun.com/goproxy
|
||||||
|
GOPROXY=https://goproxy.io
|
||||||
|
|
||||||
build:
|
build:
|
||||||
GOPROXY=$(GOPROXY) go build -o $(ROOT_DIR)/$(PROJECTNAME)
|
GOPROXY=$(GOPROXY) go build -o $(ROOT_DIR)/$(PROJECTNAME)
|
||||||
|
@@ -19,7 +19,7 @@ func ConvexPolygonStr(body *resolv.ConvexPolygon) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func RectCenterStr(body *resolv.Object, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY float64) string {
|
func RectCenterStr(body *resolv.Object, halfBoundingW, halfBoundingH, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY float64) string {
|
||||||
return fmt.Sprintf("{%.2f, %.2f}", body.X + leftPadding + halfBoundingW - spaceOffsetX, body.Y + bottomPadding + halfBoundingH - spaceOffsetY)
|
return fmt.Sprintf("{%.2f, %.2f}", body.X+leftPadding+halfBoundingW-spaceOffsetX, body.Y+bottomPadding+halfBoundingH-spaceOffsetY)
|
||||||
}
|
}
|
||||||
|
|
||||||
func GenerateRectCollider(wx, wy, w, h, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY float64, tag string) *resolv.Object {
|
func GenerateRectCollider(wx, wy, w, h, topPadding, bottomPadding, leftPadding, rightPadding, spaceOffsetX, spaceOffsetY float64, tag string) *resolv.Object {
|
||||||
|
@@ -377,10 +377,6 @@ func ParseTmxLayersAndGroups(pTmxMapIns *TmxMap, gidBoundariesMap map[int]StrToP
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, singleObjInTmxFile := range objGroup.Objects {
|
for _, singleObjInTmxFile := range objGroup.Objects {
|
||||||
if nil == singleObjInTmxFile.Properties.Property || "boundary_type" != singleObjInTmxFile.Properties.Property[0].Name || "barrier" != singleObjInTmxFile.Properties.Property[0].Value {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if nil == singleObjInTmxFile.Polyline {
|
if nil == singleObjInTmxFile.Polyline {
|
||||||
pts := make([]*Vec2D, 4)
|
pts := make([]*Vec2D, 4)
|
||||||
s := make([]string, 0)
|
s := make([]string, 0)
|
||||||
|
@@ -23,9 +23,9 @@ var constants = {
|
|||||||
FILE_NAME: {
|
FILE_NAME: {
|
||||||
TREASURE_PICKEDUP: "TreasurePicked",
|
TREASURE_PICKEDUP: "TreasurePicked",
|
||||||
CRASHED_BY_TRAP_BULLET: "CrashedByTrapBullet",
|
CRASHED_BY_TRAP_BULLET: "CrashedByTrapBullet",
|
||||||
HIGH_SCORE_TREASURE_PICKED:"HighScoreTreasurePicked",
|
HIGH_SCORE_TREASURE_PICKED: "HighScoreTreasurePicked",
|
||||||
COUNT_DOWN_10SEC_TO_END:"countDown10SecToEnd",
|
COUNT_DOWN_10SEC_TO_END: "countDown10SecToEnd",
|
||||||
BGM: "BGM"
|
BGM: "BGM"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
ROUTE_PATH: (_ROUTE_PATH = {
|
ROUTE_PATH: (_ROUTE_PATH = {
|
||||||
@@ -55,39 +55,41 @@ var constants = {
|
|||||||
},
|
},
|
||||||
RET_CODE: {
|
RET_CODE: {
|
||||||
/**
|
/**
|
||||||
* NOTE: The "RET_CODE"s from 1000-1015 are reserved for the websocket "WebsocketStdCloseCode"s.
|
* NOTE: The "RET_CODE"s from 1000-1015 are reserved for the websocket "WebsocketStdCloseCode"s, custom codes should be between 3000-4999
|
||||||
*
|
*
|
||||||
* References
|
* References
|
||||||
* - https://tools.ietf.org/html/rfc6455#section-7.4
|
* - https://tools.ietf.org/html/rfc6455#section-7.4
|
||||||
* - https://godoc.org/github.com/gorilla/websocket#pkg-constants.
|
* - https://godoc.org/github.com/gorilla/websocket#pkg-constants.
|
||||||
*/
|
*/
|
||||||
"__comment__": "基础",
|
"__comment__": "Websocket",
|
||||||
"OK": 9000,
|
"OK": 3000,
|
||||||
"UNKNOWN_ERROR": 9001,
|
"UNKNOWN_ERROR": 3001,
|
||||||
"INVALID_REQUEST_PARAM": 9002,
|
"INVALID_REQUEST_PARAM": 3002,
|
||||||
"IS_TEST_ACC": 9003,
|
"IS_TEST_ACC": 3003,
|
||||||
"MYSQL_ERROR": 9004,
|
"MYSQL_ERROR": 3004,
|
||||||
"NONEXISTENT_ACT": 9005,
|
"NONEXISTENT_ACT": 3005,
|
||||||
"LACK_OF_DIAMOND": 9006,
|
"LACK_OF_DIAMOND": 3006,
|
||||||
"LACK_OF_GOLD": 9007,
|
"LACK_OF_GOLD": 3007,
|
||||||
"LACK_OF_ENERGY": 9008,
|
"LACK_OF_ENERGY": 3008,
|
||||||
"NONEXISTENT_ACT_HANDLER": 9009,
|
"NONEXISTENT_ACT_HANDLER": 3009,
|
||||||
"LOCALLY_NO_AVAILABLE_ROOM": 9010,
|
"LOCALLY_NO_AVAILABLE_ROOM": 3010,
|
||||||
"LOCALLY_NO_SPECIFIED_ROOM": 9011,
|
"LOCALLY_NO_SPECIFIED_ROOM": 3011,
|
||||||
"PLAYER_NOT_ADDABLE_TO_ROOM": 9012,
|
"PLAYER_NOT_ADDABLE_TO_ROOM": 3012,
|
||||||
"PLAYER_NOT_READDABLE_TO_ROOM": 9013,
|
"PLAYER_NOT_READDABLE_TO_ROOM": 3013,
|
||||||
"PLAYER_NOT_FOUND": 9014,
|
"PLAYER_NOT_FOUND": 3014,
|
||||||
"PLAYER_CHEATING": 9015,
|
"PLAYER_CHEATING": 3015,
|
||||||
|
"WECHAT_SERVER_ERROR": 3016,
|
||||||
|
"IS_BOT_ACC": 3017,
|
||||||
|
"ACTIVE_WATCHDOG": 3018,
|
||||||
|
"BATTLE_STOPPED": 3019,
|
||||||
|
"CLIENT_MISMATCHED_RENDER_FRAME": 3020,
|
||||||
|
|
||||||
"__comment__": "SMS",
|
"__comment__": "OTHERS",
|
||||||
"SMS_CAPTCHA_REQUESTED_TOO_FREQUENTLY": 5001,
|
|
||||||
"SMS_CAPTCHA_NOT_MATCH": 5002,
|
|
||||||
"INVALID_TOKEN": 2001,
|
"INVALID_TOKEN": 2001,
|
||||||
|
|
||||||
"DUPLICATED": 2002,
|
"DUPLICATED": 2002,
|
||||||
"INCORRECT_HANDLE": 2004,
|
"INCORRECT_HANDLE": 2004,
|
||||||
"NONEXISTENT_HANDLE": 2005,
|
|
||||||
"INCORRECT_PASSWORD": 2006,
|
"INCORRECT_PASSWORD": 2006,
|
||||||
"INCORRECT_CAPTCHA": 2007,
|
"INCORRECT_CAPTCHA": 2007,
|
||||||
"INVALID_EMAIL_LITERAL": 2008,
|
"INVALID_EMAIL_LITERAL": 2008,
|
||||||
@@ -99,9 +101,14 @@ var constants = {
|
|||||||
"FAILED_TO_DELETE": 2015,
|
"FAILED_TO_DELETE": 2015,
|
||||||
"FAILED_TO_CREATE": 2016,
|
"FAILED_TO_CREATE": 2016,
|
||||||
"INCORRECT_PHONE_NUMBER": 2018,
|
"INCORRECT_PHONE_NUMBER": 2018,
|
||||||
"PASSWORD_RESET_CODE_GENERATION_PER_EMAIL_TOO_FREQUENTLY": 4000,
|
"INSUFFICIENT_MEM_TO_ALLOCATE_CONNECTION": 2019,
|
||||||
"TRADE_CREATION_TOO_FREQUENTLY": 4002,
|
"PASSWORD_RESET_CODE_GENERATION_PER_EMAIL_TOO_FREQUENTLY": 2020,
|
||||||
"MAP_NOT_UNLOCKED": 4003,
|
"TRADE_CREATION_TOO_FREQUENTLY": 2021,
|
||||||
|
"MAP_NOT_UNLOCKED": 2022,
|
||||||
|
|
||||||
|
"GET_SMS_CAPTCHA_RESP_ERROR_CODE": 2023,
|
||||||
|
"SMS_CAPTCHA_REQUESTED_TOO_FREQUENTLY": 2024,
|
||||||
|
"SMS_CAPTCHA_NOT_MATCH": 2025,
|
||||||
|
|
||||||
"NOT_IMPLEMENTED_YET": 65535
|
"NOT_IMPLEMENTED_YET": 65535
|
||||||
},
|
},
|
||||||
|
@@ -1,229 +0,0 @@
|
|||||||
{
|
|
||||||
"__type__": "cc.AnimationClip",
|
|
||||||
"_name": "Atk1",
|
|
||||||
"_objFlags": 0,
|
|
||||||
"_native": "",
|
|
||||||
"_duration": 0.5833333333333334,
|
|
||||||
"sample": 60,
|
|
||||||
"speed": 1,
|
|
||||||
"wrapMode": 1,
|
|
||||||
"curveData": {
|
|
||||||
"comps": {
|
|
||||||
"cc.Sprite": {
|
|
||||||
"spriteFrame": [
|
|
||||||
{
|
|
||||||
"frame": 0,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "7fedc57f-6998-45fc-899d-ea5edd41ab13"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.016666666666666666,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "d55c2f3c-9110-4627-b8b2-0f9395f0d145"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.03333333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "1228879d-d28e-48e4-a3ce-5ceda0d1831f"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.05,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "e88dd5c4-cc5d-46e0-88de-e382e2bcadd7"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.06666666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "df069f5c-7fc0-4731-bb7f-9d2032498e4c"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.08333333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "4815763d-64e1-4b15-b795-38900861c651"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.1,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "0dca4f06-bf25-4e7f-ac3a-1687e284f5d6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.11666666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "de8db3c9-affd-45ef-a536-e2d28ebc8094"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.13333333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "baaafb8b-9c1a-45ea-ba80-eb8048b61b57"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.15,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "9ffa7db6-1aec-4a1e-a8a9-118f2a6e50dc"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.16666666666666666,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "f2f296ad-0e19-4b00-b061-8c9edff98d0d"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.18333333333333332,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "3e546607-d27f-40fa-9967-771c55a12590"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.2,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "fece0129-e8ae-45be-b963-e2b821add0d3"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.21666666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "f5f48bec-3d2a-49de-9416-26cc75d34e32"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.23333333333333334,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "b083cfc9-a439-4600-b336-b50ca08b68c4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.25,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "d04003f5-16c1-4510-898b-9148b76eb958"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.26666666666666666,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "2159f038-bffa-480c-a2bd-c305868f2fd9"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.2833333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "1d3de292-7dd4-4e28-b1d2-23fc38318390"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.3,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "3031ca7c-e1f7-4d14-b29e-5a7102cab245"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.31666666666666665,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "987e9d14-b6fc-46c7-93ed-8914e42bfa8b"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.3333333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "327db66e-2136-4d52-9727-399d60715a86"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.35,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "82ab2dcd-22e9-490f-96c4-4786018c91d0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.36666666666666664,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "36812959-85a6-40fb-9a38-1b4d871eba92"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.38333333333333336,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "2941d74c-7b9c-43dc-a5c4-45952220d9a2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.4,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "4aed2032-25d5-42fd-983a-4473e2985a99"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.4166666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "3db216c1-3362-4404-8db6-11615bfa6e64"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.43333333333333335,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "2cf0cb17-cbb0-4d64-9c91-83639a363158"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.45,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "9c057e2c-1dc4-4c6c-adb7-85bf691cefb5"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.4666666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "49c07a7f-2ace-4e2b-ba4c-724aad12ec5c"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.48333333333333334,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "cec3c067-c958-4988-b113-2f10d7f4f5ea"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.5,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "ad57f789-a25a-411c-b130-62a8ab16177f"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.5166666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "3c2a21a5-7c85-48f3-95ff-0d7a32e5e852"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.5333333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "fe15eece-07a5-4d15-927b-af980aea7693"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.55,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "30ac103a-0f2b-45db-9442-461479beeb0d"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.5666666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "76272ec6-0721-4496-941b-5cb6a52b2c35"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"events": []
|
|
||||||
}
|
|
@@ -1,133 +0,0 @@
|
|||||||
{
|
|
||||||
"__type__": "cc.AnimationClip",
|
|
||||||
"_name": "Atked1",
|
|
||||||
"_objFlags": 0,
|
|
||||||
"_native": "",
|
|
||||||
"_duration": 0.31666666666666665,
|
|
||||||
"sample": 60,
|
|
||||||
"speed": 1,
|
|
||||||
"wrapMode": 1,
|
|
||||||
"curveData": {
|
|
||||||
"comps": {
|
|
||||||
"cc.Sprite": {
|
|
||||||
"spriteFrame": [
|
|
||||||
{
|
|
||||||
"frame": 0,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "6fd7cfcb-95b2-4197-a065-6bc48365f855"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.016666666666666666,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "39aaeff6-3116-4e12-8ec4-9362a8a2fea2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.03333333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "fb4e42e6-0fae-48d4-a600-217e01d43e57"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.05,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "2af606d7-4b3d-4355-95d1-a3ab673d2a2e"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.06666666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "be18e65b-346c-4efb-84cb-7f317fcaf8ac"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.08333333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "d269af72-8b89-420c-ba9e-6892cda06e80"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.1,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "30539c9d-6dbb-4409-8562-6c24b12010c2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.11666666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "96b655f9-9a90-4cb1-86ab-0be881ad8983"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.13333333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "a86f8107-3d8d-426e-9a17-c856c1ab292a"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.15,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "d7f99f14-9257-426a-9e90-a948e7ca8d23"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.16666666666666666,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "809dcbcf-9edd-4b8b-8bc8-42394ce0a9c2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.18333333333333332,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "f3e74927-2eea-4306-ba0a-c89972ca88f1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.2,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "af7a23f6-9b5c-4fe8-aa74-741f18500866"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.21666666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "4cc6ecdb-3741-4a2e-87a0-a93739a38d37"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.23333333333333334,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "f809b6d3-6f5b-4cf4-b148-5cf7fdf407a5"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.25,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "b1c9e526-fe26-42a8-9257-7e5549847273"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.26666666666666666,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "db62c862-7553-4f99-b758-8c4a4aec438a"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.2833333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "55f68905-bff7-48ea-b497-5077f49b2aca"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.3,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "b01f45f9-c394-4706-aae1-d1d26a84f48a"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"events": []
|
|
||||||
}
|
|
@@ -1,432 +0,0 @@
|
|||||||
{
|
|
||||||
"__type__": "cc.AnimationClip",
|
|
||||||
"_name": "Idle1",
|
|
||||||
"_objFlags": 0,
|
|
||||||
"_native": "",
|
|
||||||
"_duration": 1.1166666666666667,
|
|
||||||
"sample": 60,
|
|
||||||
"speed": 1,
|
|
||||||
"wrapMode": 2,
|
|
||||||
"curveData": {
|
|
||||||
"comps": {
|
|
||||||
"cc.Sprite": {
|
|
||||||
"spriteFrame": [
|
|
||||||
{
|
|
||||||
"frame": 0,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "91bba749-7338-4bdc-b9a2-0450a183378f"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.016666666666666666,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "31b10e1f-7433-4c0d-b9a7-576adc0cdb51"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.03333333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "80d4afc7-d21a-4eec-ab5e-ec833e1e905b"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.05,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "d75070b5-3dbe-4d77-886e-8851f31e8ac8"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.06666666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "a30e880e-1ff1-434d-bdbc-a3a2e0de671b"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.08333333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "87cec524-adf7-48a6-af37-b1bae14b9317"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.1,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "d415a590-b4bf-4590-834a-b075705e063a"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.11666666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "e8b7eb99-0b52-4f01-8dd3-6c1ff23a8552"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.13333333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "599c03fd-c5f1-45b1-9cd8-0164f8e82fe0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.15,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "0f71de95-9947-40da-929f-dd25bf43884e"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.16666666666666666,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "99980a57-3af2-4c23-84b8-87759ee79e10"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.18333333333333332,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "ab001dd3-587c-4a23-adbc-5f0d3eedccaf"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.2,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "9869ec96-1c78-482e-bff8-95d0b064d0f6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.21666666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "0863d34e-0116-4134-b17e-32dae8f1589f"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.23333333333333334,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "10454569-56bb-4721-9a94-49015f5e11cc"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.25,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "b13c9ee9-a497-43b3-9b54-83250bc62cc6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.26666666666666666,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "80e898d9-10a9-4817-988c-7571744173e7"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.2833333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "0e4e927d-0c67-43a1-aade-a6b5ea3fe498"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.3,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "6c327da9-60a2-4b63-89ca-05e7bb9b8c5f"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.31666666666666665,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "9e71217f-0580-481e-b2ea-8886eb7cf492"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.3333333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "ed851c4e-6a42-4643-8d50-1bac3d55b1ac"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.35,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "3a4738ba-bf3c-47cf-98f7-7e68aba0c96c"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.36666666666666664,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "d035e717-c8ab-4cdc-b59f-c61c9e85990a"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.38333333333333336,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "4bf6ea06-54bf-4c25-87f7-c7d9dca56fab"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.4,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "a4b324b1-1191-43ee-ac76-a4536d1dbac7"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.4166666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "4e2ac5fa-1c68-4cbd-80e6-a94af579796d"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.43333333333333335,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "64cd0353-429a-4a47-a6fc-b0f12e565e94"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.45,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "3fa0ae73-f8f8-455f-82c3-24a428379e95"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.4666666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "a4679596-56d5-44f2-a349-7579ad7fbe33"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.48333333333333334,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "3293d474-dfb3-412a-aca1-ce76f70a2181"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.5,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "9794aec3-5e18-4df4-bae2-296f7c5ed935"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.5166666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "4373d7b7-ea22-4ba2-a6df-c0672d4310a2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.5333333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "89b6617e-2131-4bc6-840a-048af7944bb8"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.55,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "9c267a7b-ab24-49b4-a2f3-26d885799f23"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.5666666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "df3255ea-00af-47c2-9deb-4ccd27a62706"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.5833333333333334,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "e15242c9-29ba-411a-a93f-dddad5613956"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.6,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "ef3f8029-d5cc-4024-95ca-1f2aa062a0d5"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.6166666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "7b48f205-a1e8-4233-8c72-11ae9c0ccea7"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.6333333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "ffc69bce-fd84-42d8-b8c9-fe05e6c7fa03"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.65,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "81805795-ab34-47c1-ab45-57f54d28e72f"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.6666666666666666,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "adae26a6-7991-4583-966c-4364ba35474d"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.6833333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "ab51a779-10b7-4039-ac45-6ada002e702f"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.7,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "173d4746-0af5-40ae-a472-ba6406c700dc"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.7166666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "4054d644-4b5c-473d-ad2c-1c1eb06b01d7"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.7333333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "0f55009f-71dc-4e70-8152-7dbc2a16a17c"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.75,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "d273f52f-4ec1-4ccf-8820-92879682213e"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.7666666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "37c2f336-a3c8-4b46-8031-d48c3f36c675"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.7833333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "8cee57cb-5e79-4fe9-8368-745b38a37021"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.8,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "4e67aa7d-d6a6-405b-99c4-ef5be609fdf4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.8166666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "b0b7fc1a-f42a-4977-bfef-93841bdfa2f8"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.8333333333333334,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "352bbb78-d87c-425d-b39e-a401432f0070"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.85,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "9aaadf6a-808f-44f4-b7a8-392138851168"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.8666666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "a319abd0-a689-400c-8f2a-94ccc70e50f9"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.8833333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "2efd4c0f-10c1-41be-81b5-40b3d10cb863"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.9,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "8b94f28d-7da8-4e83-a9d6-46072b24a847"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.9166666666666666,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "1f153a21-9a57-4bf7-a7bb-fa2a2e3b9484"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.9333333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "2d3ad677-51b8-4d53-924c-dea3f66f0510"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.95,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "68aabf9d-5b21-4405-b92d-18a837895c37"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.9666666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "cb893520-96b5-4ce4-a9dd-90ca4eac1882"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.9833333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "498ee98f-7211-4495-99fe-662aee098217"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 1,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "da05be2e-e07f-4081-a99d-9c1b1459b862"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 1.0166666666666666,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "46e64686-1071-4db2-8f3d-4a0a00dc8e10"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 1.0333333333333334,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "5a082e4d-d615-411f-880e-b03bda363cea"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 1.05,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "6d582b00-b973-4397-8866-32f531d4366e"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 1.0666666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "1de67f2c-e9ea-438d-8f30-b7c40159bc92"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 1.0833333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "6e98330a-9709-44e1-8704-aa6430bd8236"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 1.1,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "b2557433-9168-4b78-a9ac-78b33633b1d8"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"events": [
|
|
||||||
{
|
|
||||||
"frame": 0,
|
|
||||||
"func": "",
|
|
||||||
"params": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0,
|
|
||||||
"func": "",
|
|
||||||
"params": []
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
@@ -1,205 +0,0 @@
|
|||||||
{
|
|
||||||
"__type__": "cc.AnimationClip",
|
|
||||||
"_name": "InAirIdle1",
|
|
||||||
"_objFlags": 0,
|
|
||||||
"_native": "",
|
|
||||||
"_duration": 0.5166666666666667,
|
|
||||||
"sample": 60,
|
|
||||||
"speed": 1,
|
|
||||||
"wrapMode": 2,
|
|
||||||
"curveData": {
|
|
||||||
"comps": {
|
|
||||||
"cc.Sprite": {
|
|
||||||
"spriteFrame": [
|
|
||||||
{
|
|
||||||
"frame": 0,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "dd02916e-9ac8-4fe7-a944-d6082eb9007a"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.016666666666666666,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "1906b14b-f3a2-4dc9-9e0d-99e3b334e67b"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.03333333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "1b4f284c-be67-403b-9f5d-59aa641d3c92"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.05,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "6feb197e-2013-48fd-bbbb-3d2809cb1d63"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.06666666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "2db4e807-a5d2-4c09-b033-a0ae97e5d0bf"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.08333333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "73958a6b-31a7-4bb8-babd-1aefba55a793"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.1,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "9545ca77-8002-4ad1-a91e-1e343cdf0e0b"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.11666666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "581e4c15-9de3-4b72-a91a-2e82ac6b092c"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.13333333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "4af94082-f36b-4b9e-9077-bd458fd0b188"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.15,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "5463290d-7b25-4625-8be5-1a16dbe3bd83"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.16666666666666666,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "e507775a-1009-47a8-b1a8-8ade0104e4c2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.18333333333333332,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "6583a9e1-92fb-4db2-9437-9d2b26bc5920"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.2,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "b07e2da2-d1f2-4ec8-acdf-92706d0be9e0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.21666666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "dd60bf4f-6b5f-4385-9e46-1e49e6a7cfbe"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.23333333333333334,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "46811e43-c874-41d5-8799-6fafc904cd5a"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.25,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "0a370e7e-e25f-4faf-9a76-73b246338a4d"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.26666666666666666,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "1f003135-e929-4a05-9029-76e7cb8c76ef"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.2833333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "b78015ba-98e4-4ccd-9852-a7ec053a0ba4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.3,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "0589abef-dc0d-4d33-a084-25b273ca1368"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.31666666666666665,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "20542755-bbfa-43cd-b593-e73d121b5ed6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.3333333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "5d5ac5af-3da7-4b22-9183-5885736e2ca7"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.35,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "47bbe2a2-a983-4aca-8a3e-6cd6df5eee03"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.36666666666666664,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "6d3fb572-d6af-4b7e-9350-9ff482569127"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.38333333333333336,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "573cfba0-4534-4886-849a-61f4f2cbd349"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.4,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "0b4ebd8a-6316-4802-aa24-49ab08e6a75b"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.4166666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "5b7fff7b-5818-4be8-b65d-c212d15e6e71"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.43333333333333335,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "f964ec77-c016-44fa-8f55-3e59ae30283d"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.45,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "679a79eb-85c6-4445-8517-36465c57c6da"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.4666666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "8764bb9b-4b08-4bc5-b9e5-93af39321c70"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.48333333333333334,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "f291785e-2685-4ba0-b38b-9607972ce6f0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.5,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "a4e84eb9-b866-4cdc-8925-a5d29c65aea5"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"events": []
|
|
||||||
}
|
|
@@ -1,385 +0,0 @@
|
|||||||
{
|
|
||||||
"__type__": "cc.AnimationClip",
|
|
||||||
"_name": "Walking",
|
|
||||||
"_objFlags": 0,
|
|
||||||
"_native": "",
|
|
||||||
"_duration": 1.0166666666666666,
|
|
||||||
"sample": 60,
|
|
||||||
"speed": 1,
|
|
||||||
"wrapMode": 2,
|
|
||||||
"curveData": {
|
|
||||||
"comps": {
|
|
||||||
"cc.Sprite": {
|
|
||||||
"spriteFrame": [
|
|
||||||
{
|
|
||||||
"frame": 0,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "5a9af6ac-cccc-4964-90a1-7136468d64ae"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.016666666666666666,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "e62f3718-263c-4a93-8405-55aca440180f"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.03333333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "700a3fef-00d2-437a-a323-cc79802d76f5"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.05,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "bf8ce5ef-5171-45ab-97dd-8c9da2dbcd5a"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.06666666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "0894f61a-e4a0-458d-890e-aa3d60e4bf4f"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.08333333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "1995a986-6421-427c-92fe-4e3bae551e67"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.1,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "4ca1ce37-410d-4437-8b7a-498292e74bc6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.11666666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "1e23a398-6051-4a69-a71d-7ea4909da77e"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.13333333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "ef18849a-0d4d-4bfe-a707-073958511ca6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.15,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "f217d368-9fc9-48cd-b635-059a7bc472a4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.16666666666666666,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "b312cebf-3945-40c7-a367-3bc1d6689109"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.18333333333333332,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "476ddde6-8fd9-40cc-a789-0a08ebff5352"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.2,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "b27f06dc-217d-4b68-a747-4c1d3c27151f"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.21666666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "83d15d82-f23d-40c4-b4ef-da4ce6964fc9"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.23333333333333334,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "7cc81715-c432-4ee2-bf67-a77a4dadcd89"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.25,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "463ae409-a045-40d1-ac44-1f2aac439065"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.26666666666666666,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "84e68a5e-f23b-4570-ac4f-d85f1eba292c"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.2833333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "ce73c3ce-b543-4f9b-892c-27b76a9c84dc"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.3,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "25280250-fab5-464c-b26e-1a5f1733aa09"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.31666666666666665,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "abf595ad-a861-482c-8f5a-43f243516a5b"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.3333333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "238ce540-4c4a-41c0-967c-32218e3dfd3c"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.35,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "0a3f1bbf-788b-4d78-b737-2ec5364fe5a4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.36666666666666664,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "c6397500-a2d9-4d68-b874-299bbc4a2173"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.38333333333333336,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "914aeb36-e7ab-4676-8016-8cf3a4fef6c6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.4,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "1c7a050e-c52b-4402-911d-bc2d9ffed627"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.4166666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "74eaaf1d-5de5-411d-86d4-839022712426"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.43333333333333335,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "b42fe407-2c81-4960-a697-0125815e1bc7"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.45,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "9395f625-e627-4a0a-85cb-05f9b3a99d48"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.4666666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "5805ad62-293f-4d81-ad59-ac290ba2e2d3"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.48333333333333334,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "9c79bea6-dc45-4113-ace8-c7145cc889db"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.5,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "cabc4d77-a49d-4c43-9144-01c5283fe206"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.5166666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "0514d19b-a3ad-478d-99da-fa91190148b7"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.5333333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "57646810-7598-4723-b12f-5e15e8299aaa"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.55,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "65e5cbd3-15f3-4526-a347-db55ac24bf51"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.5666666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "1555d6f4-1bdf-4b64-99b2-bb13195257f4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.5833333333333334,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "843e335d-fdb6-4a23-9949-3c81d977fb21"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.6,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "781f66e7-dd7f-4ff5-a38e-9423762b4b52"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.6166666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "ef990cae-899c-451f-91fd-7a42ac949534"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.6333333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "a2df488a-e91b-46b0-8c25-2ba8551ab539"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.65,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "6650a6e0-6ddd-42ec-af68-1a1a032e19b5"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.6666666666666666,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "9a54c669-7f7d-41e4-8939-1853967d0dbf"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.6833333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "da04432e-3845-465b-9ddf-ce2bd7c7174e"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.7,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "aa7a792d-22dc-4d28-8d27-52ddfcd8d147"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.7166666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "ceb00ecc-d391-4b19-b9d6-e53792590c46"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.7333333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "33b3fa05-9894-4393-b9ce-f819c5818bf3"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.75,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "972cc5ec-ca1c-4127-8e21-f339df92a4fd"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.7666666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "3874c9de-2b47-4327-b4f8-c61d3896cefe"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.7833333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "4a6f08e6-7f96-4451-8f71-7bee8cd63cf2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.8,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "256f3d2b-4cb9-4523-bf7a-c48380e249bb"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.8166666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "4c40c070-9cba-44f9-acd6-2408f569f21c"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.8333333333333334,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "454bfff4-b8a1-4f90-b708-bbf295b99498"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.85,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "f0288374-f487-4870-b921-8baf851bb865"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.8666666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "2fd06c6a-c3de-4b7f-bef7-1cba61c9909c"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.8833333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "d4d08680-1b77-4b44-92bd-be27c03747fa"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.9,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "5a85b0ce-7a4e-4d84-b4fb-089cdff45265"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.9166666666666666,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "ac515982-6ac2-462c-b186-c4468b489e39"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.9333333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "92571718-c75c-4c09-9aac-b1b043bb70a7"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.95,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "a248383c-2cf6-487e-8941-a05f6c08bc60"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.9666666666666667,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "c4f035dc-a01e-4b8e-a1b7-f4faf9515e99"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 0.9833333333333333,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "a6f9c9b4-1129-4b6a-b4c3-2a3d425c746a"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"frame": 1,
|
|
||||||
"value": {
|
|
||||||
"__uuid__": "d99d68fa-73c7-4057-98ec-9aa45864c050"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"events": []
|
|
||||||
}
|
|
7
frontend/assets/resources/animation/UltramanTiga.meta
Normal file
7
frontend/assets/resources/animation/UltramanTiga.meta
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"ver": "1.0.1",
|
||||||
|
"uuid": "d7459b4f-ba3f-4ead-9e0d-ec2387c9ee1f",
|
||||||
|
"isSubpackage": false,
|
||||||
|
"subpackageName": "",
|
||||||
|
"subMetas": {}
|
||||||
|
}
|
43
frontend/assets/resources/animation/UltramanTiga/Atk1.anim
Normal file
43
frontend/assets/resources/animation/UltramanTiga/Atk1.anim
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"__type__": "cc.AnimationClip",
|
||||||
|
"_name": "Atk1",
|
||||||
|
"_objFlags": 0,
|
||||||
|
"_native": "",
|
||||||
|
"_duration": 0.36666666666666664,
|
||||||
|
"sample": 60,
|
||||||
|
"speed": 1,
|
||||||
|
"wrapMode": 1,
|
||||||
|
"curveData": {
|
||||||
|
"comps": {
|
||||||
|
"cc.Sprite": {
|
||||||
|
"spriteFrame": [
|
||||||
|
{
|
||||||
|
"frame": 0,
|
||||||
|
"value": {
|
||||||
|
"__uuid__": "a5607dff-7c39-47bc-8f27-86586f219387"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"frame": 0.11666666666666667,
|
||||||
|
"value": {
|
||||||
|
"__uuid__": "bbcfe7c4-2341-4d58-b758-17920dbc4e0e"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"frame": 0.2833333333333333,
|
||||||
|
"value": {
|
||||||
|
"__uuid__": "93e45cd6-652b-4732-8139-587170884ae4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"frame": 0.35,
|
||||||
|
"value": {
|
||||||
|
"__uuid__": "2c65c72d-34c0-424c-9a7e-2d961a68a1b6"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"events": []
|
||||||
|
}
|
25
frontend/assets/resources/animation/UltramanTiga/Atked1.anim
Normal file
25
frontend/assets/resources/animation/UltramanTiga/Atked1.anim
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"__type__": "cc.AnimationClip",
|
||||||
|
"_name": "Atked1",
|
||||||
|
"_objFlags": 0,
|
||||||
|
"_native": "",
|
||||||
|
"_duration": 0.016666666666666666,
|
||||||
|
"sample": 60,
|
||||||
|
"speed": 1,
|
||||||
|
"wrapMode": 1,
|
||||||
|
"curveData": {
|
||||||
|
"comps": {
|
||||||
|
"cc.Sprite": {
|
||||||
|
"spriteFrame": [
|
||||||
|
{
|
||||||
|
"frame": 0,
|
||||||
|
"value": {
|
||||||
|
"__uuid__": "26166514-7b99-4e18-a3ef-515718a7597f"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"events": []
|
||||||
|
}
|
54
frontend/assets/resources/animation/UltramanTiga/Idle1.anim
Normal file
54
frontend/assets/resources/animation/UltramanTiga/Idle1.anim
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"__type__": "cc.AnimationClip",
|
||||||
|
"_name": "Idle1",
|
||||||
|
"_objFlags": 0,
|
||||||
|
"_native": "",
|
||||||
|
"_duration": 0.11666666666666667,
|
||||||
|
"sample": 60,
|
||||||
|
"speed": 0.3,
|
||||||
|
"wrapMode": 2,
|
||||||
|
"curveData": {
|
||||||
|
"comps": {
|
||||||
|
"cc.Sprite": {
|
||||||
|
"spriteFrame": [
|
||||||
|
{
|
||||||
|
"frame": 0,
|
||||||
|
"value": {
|
||||||
|
"__uuid__": "3437907b-f662-4805-9723-78839fd930f5"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"frame": 0.03333333333333333,
|
||||||
|
"value": {
|
||||||
|
"__uuid__": "86de4c9c-202c-417b-abdb-7f5d4ae87045"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"frame": 0.06666666666666667,
|
||||||
|
"value": {
|
||||||
|
"__uuid__": "2e8dd9ad-e227-405f-a22a-33079051e709"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"frame": 0.1,
|
||||||
|
"value": {
|
||||||
|
"__uuid__": "03d976f3-4abb-40e9-85b9-ff532009b7ea"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"events": [
|
||||||
|
{
|
||||||
|
"frame": 0,
|
||||||
|
"func": "",
|
||||||
|
"params": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"frame": 0,
|
||||||
|
"func": "",
|
||||||
|
"params": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@@ -0,0 +1,37 @@
|
|||||||
|
{
|
||||||
|
"__type__": "cc.AnimationClip",
|
||||||
|
"_name": "InAirAtk1",
|
||||||
|
"_objFlags": 0,
|
||||||
|
"_native": "",
|
||||||
|
"_duration": 0.35,
|
||||||
|
"sample": 60,
|
||||||
|
"speed": 1,
|
||||||
|
"wrapMode": 1,
|
||||||
|
"curveData": {
|
||||||
|
"comps": {
|
||||||
|
"cc.Sprite": {
|
||||||
|
"spriteFrame": [
|
||||||
|
{
|
||||||
|
"frame": 0.016666666666666666,
|
||||||
|
"value": {
|
||||||
|
"__uuid__": "58e0a91a-e6ce-482d-8668-713867301837"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"frame": 0.2,
|
||||||
|
"value": {
|
||||||
|
"__uuid__": "aca5205f-5749-42fa-be3b-4f4888faf766"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"frame": 0.3333333333333333,
|
||||||
|
"value": {
|
||||||
|
"__uuid__": "d0f43a74-3f79-42b6-9d1e-a6c17c0cd07f"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"events": []
|
||||||
|
}
|
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"ver": "2.1.0",
|
||||||
|
"uuid": "8710591c-3f5e-4911-83e7-42cc18be6af9",
|
||||||
|
"subMetas": {}
|
||||||
|
}
|
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"__type__": "cc.AnimationClip",
|
||||||
|
"_name": "InAirIdle1",
|
||||||
|
"_objFlags": 0,
|
||||||
|
"_native": "",
|
||||||
|
"_duration": 0.016666666666666666,
|
||||||
|
"sample": 60,
|
||||||
|
"speed": 0.1,
|
||||||
|
"wrapMode": 2,
|
||||||
|
"curveData": {
|
||||||
|
"comps": {
|
||||||
|
"cc.Sprite": {
|
||||||
|
"spriteFrame": [
|
||||||
|
{
|
||||||
|
"frame": 0,
|
||||||
|
"value": {
|
||||||
|
"__uuid__": "ca385337-356e-49eb-8081-36b1505411a2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"events": []
|
||||||
|
}
|
@@ -0,0 +1,551 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>frames</key>
|
||||||
|
<dict>
|
||||||
|
<key>Atk1_1.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{74,85}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{74,85}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{176,366},{74,85}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<key>Atk1_2.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{74,85}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{74,85}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{0,375},{74,85}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>Atk1_3.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{74,85}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{74,85}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{85,388},{74,85}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>Atk1_4.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{74,85}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{74,85}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{0,449},{74,85}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>Atk1_5.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{74,85}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{74,85}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{0,375},{74,85}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>Atk1_6.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{74,85}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{74,85}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{85,462},{74,85}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>Atked1_1.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{47,82}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{47,82}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{170,451},{47,82}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>Atked1_2.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{47,82}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{47,82}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{170,498},{47,82}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>Idle1_1.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{56,86}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{56,86}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{190,194},{56,86}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<key>Idle1_2.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{56,86}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{56,86}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{185,280},{56,86}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<key>Idle1_3.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{56,86}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{56,86}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{90,332},{56,86}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>Idle1_4.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{56,86}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{56,86}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{185,280},{56,86}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<key>InAirAtk1_1.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{63,95}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{63,95}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{104,43},{63,95}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>InAirAtk1_2.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{63,95}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{63,95}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{0,86},{63,95}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>InAirAtk1_3.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{63,95}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{63,95}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{95,106},{63,95}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>InAirAtk1_4.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{63,95}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{63,95}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{0,149},{63,95}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>InAirAtk1_5.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{63,95}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{63,95}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{104,43},{63,95}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>InAirAtk1_6.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{63,95}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{63,95}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{95,169},{63,95}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>InAirAtk1_7.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{63,95}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{63,95}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{0,212},{63,95}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>InAirAtked1_1.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{47,82}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{47,82}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{170,451},{47,82}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>InAirAtked1_2.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{47,82}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{47,82}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{170,498},{47,82}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>InAirIdle1_1.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{43,104}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{43,104}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{0,0},{43,104}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>InAirIdle1_2.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{43,104}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{43,104}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{104,0},{43,104}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>InAirIdle1_3.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{43,104}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{43,104}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{208,0},{43,104}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<key>InAirIdle1_4.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{43,104}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{43,104}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{104,0},{43,104}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>InAirIdle1_5.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{43,104}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{43,104}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{0,0},{43,104}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>InAirIdle1_6.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{43,104}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{43,104}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{0,43},{43,104}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>Walking_1.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{50,90}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{50,90}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{199,104},{50,90}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<key>Walking_2.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{50,90}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{50,90}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{95,232},{50,90}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>Walking_3.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{50,90}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{50,90}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{0,275},{50,90}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>Walking_4.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{50,90}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{50,90}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{90,282},{50,90}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>Walking_5.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{50,90}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{50,90}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{0,325},{50,90}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>Walking_6.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{50,90}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{50,90}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{90,282},{50,90}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>Walking_7.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{50,90}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{50,90}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{0,275},{50,90}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>Walking_8.png</key>
|
||||||
|
<dict>
|
||||||
|
<key>aliases</key>
|
||||||
|
<array/>
|
||||||
|
<key>spriteOffset</key>
|
||||||
|
<string>{0,0}</string>
|
||||||
|
<key>spriteSize</key>
|
||||||
|
<string>{50,90}</string>
|
||||||
|
<key>spriteSourceSize</key>
|
||||||
|
<string>{50,90}</string>
|
||||||
|
<key>textureRect</key>
|
||||||
|
<string>{{95,232},{50,90}}</string>
|
||||||
|
<key>textureRotated</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<key>metadata</key>
|
||||||
|
<dict>
|
||||||
|
<key>format</key>
|
||||||
|
<integer>3</integer>
|
||||||
|
<key>pixelFormat</key>
|
||||||
|
<string>RGBA8888</string>
|
||||||
|
<key>premultiplyAlpha</key>
|
||||||
|
<false/>
|
||||||
|
<key>realTextureFileName</key>
|
||||||
|
<string>UltramanTiga.png</string>
|
||||||
|
<key>size</key>
|
||||||
|
<string>{252,545}</string>
|
||||||
|
<key>smartupdate</key>
|
||||||
|
<string>$TexturePacker:SmartUpdate:4a857ca23ea86a140850bef35b0258da:88d012415ccd7dd313108f39b071523a:1c886ab62fdbd8d1a0c538b1b57b3521$</string>
|
||||||
|
<key>textureFileName</key>
|
||||||
|
<string>UltramanTiga.png</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
@@ -0,0 +1,782 @@
|
|||||||
|
{
|
||||||
|
"ver": "1.2.4",
|
||||||
|
"uuid": "5d522f7b-359b-4f38-ac35-55fdbee56cae",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"size": {
|
||||||
|
"width": 252,
|
||||||
|
"height": 545
|
||||||
|
},
|
||||||
|
"type": "Texture Packer",
|
||||||
|
"subMetas": {
|
||||||
|
"Atk1_1.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "8e9ca384-97ec-4e75-a285-6d74d64a3c3c",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": false,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 176,
|
||||||
|
"trimY": 366,
|
||||||
|
"width": 74,
|
||||||
|
"height": 85,
|
||||||
|
"rawWidth": 74,
|
||||||
|
"rawHeight": 85,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"Atk1_2.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "a5607dff-7c39-47bc-8f27-86586f219387",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": true,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 0,
|
||||||
|
"trimY": 375,
|
||||||
|
"width": 74,
|
||||||
|
"height": 85,
|
||||||
|
"rawWidth": 74,
|
||||||
|
"rawHeight": 85,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"Atk1_3.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "bbcfe7c4-2341-4d58-b758-17920dbc4e0e",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": true,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 85,
|
||||||
|
"trimY": 388,
|
||||||
|
"width": 74,
|
||||||
|
"height": 85,
|
||||||
|
"rawWidth": 74,
|
||||||
|
"rawHeight": 85,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"Atk1_4.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "93e45cd6-652b-4732-8139-587170884ae4",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": true,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 0,
|
||||||
|
"trimY": 449,
|
||||||
|
"width": 74,
|
||||||
|
"height": 85,
|
||||||
|
"rawWidth": 74,
|
||||||
|
"rawHeight": 85,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"Atk1_5.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "2c65c72d-34c0-424c-9a7e-2d961a68a1b6",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": true,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 0,
|
||||||
|
"trimY": 375,
|
||||||
|
"width": 74,
|
||||||
|
"height": 85,
|
||||||
|
"rawWidth": 74,
|
||||||
|
"rawHeight": 85,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"Atk1_6.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "d977ee77-cde3-47be-b63d-82a5b116b69a",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": true,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 85,
|
||||||
|
"trimY": 462,
|
||||||
|
"width": 74,
|
||||||
|
"height": 85,
|
||||||
|
"rawWidth": 74,
|
||||||
|
"rawHeight": 85,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"Atked1_1.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "26166514-7b99-4e18-a3ef-515718a7597f",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": true,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 170,
|
||||||
|
"trimY": 451,
|
||||||
|
"width": 47,
|
||||||
|
"height": 82,
|
||||||
|
"rawWidth": 47,
|
||||||
|
"rawHeight": 82,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"Atked1_2.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "98d06843-f140-4d6a-9aa6-0949a1690dca",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": true,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 170,
|
||||||
|
"trimY": 498,
|
||||||
|
"width": 47,
|
||||||
|
"height": 82,
|
||||||
|
"rawWidth": 47,
|
||||||
|
"rawHeight": 82,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"Idle1_1.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "3437907b-f662-4805-9723-78839fd930f5",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": false,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 190,
|
||||||
|
"trimY": 194,
|
||||||
|
"width": 56,
|
||||||
|
"height": 86,
|
||||||
|
"rawWidth": 56,
|
||||||
|
"rawHeight": 86,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"Idle1_2.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "86de4c9c-202c-417b-abdb-7f5d4ae87045",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": false,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 185,
|
||||||
|
"trimY": 280,
|
||||||
|
"width": 56,
|
||||||
|
"height": 86,
|
||||||
|
"rawWidth": 56,
|
||||||
|
"rawHeight": 86,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"Idle1_3.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "2e8dd9ad-e227-405f-a22a-33079051e709",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": true,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 90,
|
||||||
|
"trimY": 332,
|
||||||
|
"width": 56,
|
||||||
|
"height": 86,
|
||||||
|
"rawWidth": 56,
|
||||||
|
"rawHeight": 86,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"Idle1_4.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "03d976f3-4abb-40e9-85b9-ff532009b7ea",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": false,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 185,
|
||||||
|
"trimY": 280,
|
||||||
|
"width": 56,
|
||||||
|
"height": 86,
|
||||||
|
"rawWidth": 56,
|
||||||
|
"rawHeight": 86,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"InAirAtk1_1.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "d0f43a74-3f79-42b6-9d1e-a6c17c0cd07f",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": true,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 104,
|
||||||
|
"trimY": 43,
|
||||||
|
"width": 63,
|
||||||
|
"height": 95,
|
||||||
|
"rawWidth": 63,
|
||||||
|
"rawHeight": 95,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"InAirAtk1_2.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "58e0a91a-e6ce-482d-8668-713867301837",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": true,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 0,
|
||||||
|
"trimY": 86,
|
||||||
|
"width": 63,
|
||||||
|
"height": 95,
|
||||||
|
"rawWidth": 63,
|
||||||
|
"rawHeight": 95,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"InAirAtk1_3.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "aca5205f-5749-42fa-be3b-4f4888faf766",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": true,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 95,
|
||||||
|
"trimY": 106,
|
||||||
|
"width": 63,
|
||||||
|
"height": 95,
|
||||||
|
"rawWidth": 63,
|
||||||
|
"rawHeight": 95,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"InAirAtk1_4.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "4b08f81b-4412-4d98-aa39-11fc140b00a2",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": true,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 0,
|
||||||
|
"trimY": 149,
|
||||||
|
"width": 63,
|
||||||
|
"height": 95,
|
||||||
|
"rawWidth": 63,
|
||||||
|
"rawHeight": 95,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"InAirAtk1_5.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "618142b5-4eb9-4b06-948c-9346381af4b4",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": true,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 104,
|
||||||
|
"trimY": 43,
|
||||||
|
"width": 63,
|
||||||
|
"height": 95,
|
||||||
|
"rawWidth": 63,
|
||||||
|
"rawHeight": 95,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"InAirAtk1_6.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "caf2aac4-bb75-41f2-8deb-334b20b36cc2",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": true,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 95,
|
||||||
|
"trimY": 169,
|
||||||
|
"width": 63,
|
||||||
|
"height": 95,
|
||||||
|
"rawWidth": 63,
|
||||||
|
"rawHeight": 95,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"InAirAtk1_7.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "b5368d17-52da-4a4b-82e9-7808a973a16d",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": true,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 0,
|
||||||
|
"trimY": 212,
|
||||||
|
"width": 63,
|
||||||
|
"height": 95,
|
||||||
|
"rawWidth": 63,
|
||||||
|
"rawHeight": 95,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"InAirAtked1_1.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "e643e1e4-6a6a-4c73-995c-d49e3c4c750c",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": true,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 170,
|
||||||
|
"trimY": 451,
|
||||||
|
"width": 47,
|
||||||
|
"height": 82,
|
||||||
|
"rawWidth": 47,
|
||||||
|
"rawHeight": 82,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"InAirAtked1_2.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "982e48da-cac3-4c1e-96f6-3c659c43ecdd",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": true,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 170,
|
||||||
|
"trimY": 498,
|
||||||
|
"width": 47,
|
||||||
|
"height": 82,
|
||||||
|
"rawWidth": 47,
|
||||||
|
"rawHeight": 82,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"InAirIdle1_1.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "55dc7736-f0bc-46b8-9705-efcdb19ddb85",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": true,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 0,
|
||||||
|
"trimY": 0,
|
||||||
|
"width": 43,
|
||||||
|
"height": 104,
|
||||||
|
"rawWidth": 43,
|
||||||
|
"rawHeight": 104,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"InAirIdle1_2.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "5a18d76d-6e98-43c9-8f0a-99111256e1d5",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": true,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 104,
|
||||||
|
"trimY": 0,
|
||||||
|
"width": 43,
|
||||||
|
"height": 104,
|
||||||
|
"rawWidth": 43,
|
||||||
|
"rawHeight": 104,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"InAirIdle1_3.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "7c0bb61d-15f8-4d41-9225-2a1f339b80b1",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": false,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 208,
|
||||||
|
"trimY": 0,
|
||||||
|
"width": 43,
|
||||||
|
"height": 104,
|
||||||
|
"rawWidth": 43,
|
||||||
|
"rawHeight": 104,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"InAirIdle1_4.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "7cb60116-3f96-44bb-9bf7-6fbfc2ca9772",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": true,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 104,
|
||||||
|
"trimY": 0,
|
||||||
|
"width": 43,
|
||||||
|
"height": 104,
|
||||||
|
"rawWidth": 43,
|
||||||
|
"rawHeight": 104,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"InAirIdle1_5.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "e8d32f3e-0b66-4b35-b4ed-7823a047cc88",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": true,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 0,
|
||||||
|
"trimY": 0,
|
||||||
|
"width": 43,
|
||||||
|
"height": 104,
|
||||||
|
"rawWidth": 43,
|
||||||
|
"rawHeight": 104,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"InAirIdle1_6.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "ca385337-356e-49eb-8081-36b1505411a2",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": true,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 0,
|
||||||
|
"trimY": 43,
|
||||||
|
"width": 43,
|
||||||
|
"height": 104,
|
||||||
|
"rawWidth": 43,
|
||||||
|
"rawHeight": 104,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"Walking_1.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "b706e9a2-827e-42bc-9920-c0e644eb8a75",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": false,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 199,
|
||||||
|
"trimY": 104,
|
||||||
|
"width": 50,
|
||||||
|
"height": 90,
|
||||||
|
"rawWidth": 50,
|
||||||
|
"rawHeight": 90,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"Walking_2.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "f9141513-f9b3-4fc8-8900-b793294c82c6",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": true,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 95,
|
||||||
|
"trimY": 232,
|
||||||
|
"width": 50,
|
||||||
|
"height": 90,
|
||||||
|
"rawWidth": 50,
|
||||||
|
"rawHeight": 90,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"Walking_3.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "6e12b8d0-488c-4885-9b4a-712af055be78",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": true,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 0,
|
||||||
|
"trimY": 275,
|
||||||
|
"width": 50,
|
||||||
|
"height": 90,
|
||||||
|
"rawWidth": 50,
|
||||||
|
"rawHeight": 90,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"Walking_4.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "a4be80d2-4593-4d92-994b-de7fc66642f0",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": true,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 90,
|
||||||
|
"trimY": 282,
|
||||||
|
"width": 50,
|
||||||
|
"height": 90,
|
||||||
|
"rawWidth": 50,
|
||||||
|
"rawHeight": 90,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"Walking_5.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "bc355af2-caa1-4458-be7f-f84184d27c11",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": true,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 0,
|
||||||
|
"trimY": 325,
|
||||||
|
"width": 50,
|
||||||
|
"height": 90,
|
||||||
|
"rawWidth": 50,
|
||||||
|
"rawHeight": 90,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"Walking_6.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "4fa095aa-f08d-4baa-84c9-10e8eac6ea01",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": true,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 90,
|
||||||
|
"trimY": 282,
|
||||||
|
"width": 50,
|
||||||
|
"height": 90,
|
||||||
|
"rawWidth": 50,
|
||||||
|
"rawHeight": 90,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"Walking_7.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "01424fa9-4b4b-472a-ae90-923d0877fb66",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": true,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 0,
|
||||||
|
"trimY": 275,
|
||||||
|
"width": 50,
|
||||||
|
"height": 90,
|
||||||
|
"rawWidth": 50,
|
||||||
|
"rawHeight": 90,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
},
|
||||||
|
"Walking_8.png": {
|
||||||
|
"ver": "1.0.4",
|
||||||
|
"uuid": "5d8fe180-61eb-448d-bbcf-100d1763ebc8",
|
||||||
|
"rawTextureUuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"trimType": "auto",
|
||||||
|
"trimThreshold": 1,
|
||||||
|
"rotated": true,
|
||||||
|
"offsetX": 0,
|
||||||
|
"offsetY": 0,
|
||||||
|
"trimX": 95,
|
||||||
|
"trimY": 232,
|
||||||
|
"width": 50,
|
||||||
|
"height": 90,
|
||||||
|
"rawWidth": 50,
|
||||||
|
"rawHeight": 90,
|
||||||
|
"borderTop": 0,
|
||||||
|
"borderBottom": 0,
|
||||||
|
"borderLeft": 0,
|
||||||
|
"borderRight": 0,
|
||||||
|
"spriteType": "normal",
|
||||||
|
"subMetas": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
After Width: | Height: | Size: 15 KiB |
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"ver": "2.3.3",
|
||||||
|
"uuid": "b4ea3971-8f28-4cc7-96a4-83f10dce229f",
|
||||||
|
"type": "raw",
|
||||||
|
"wrapMode": "clamp",
|
||||||
|
"filterMode": "bilinear",
|
||||||
|
"premultiplyAlpha": false,
|
||||||
|
"genMipmaps": false,
|
||||||
|
"packable": true,
|
||||||
|
"platformSettings": {},
|
||||||
|
"subMetas": {}
|
||||||
|
}
|
@@ -0,0 +1,67 @@
|
|||||||
|
{
|
||||||
|
"__type__": "cc.AnimationClip",
|
||||||
|
"_name": "Walking",
|
||||||
|
"_objFlags": 0,
|
||||||
|
"_native": "",
|
||||||
|
"_duration": 0.36666666666666664,
|
||||||
|
"sample": 60,
|
||||||
|
"speed": 1,
|
||||||
|
"wrapMode": 2,
|
||||||
|
"curveData": {
|
||||||
|
"comps": {
|
||||||
|
"cc.Sprite": {
|
||||||
|
"spriteFrame": [
|
||||||
|
{
|
||||||
|
"frame": 0,
|
||||||
|
"value": {
|
||||||
|
"__uuid__": "b706e9a2-827e-42bc-9920-c0e644eb8a75"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"frame": 0.05,
|
||||||
|
"value": {
|
||||||
|
"__uuid__": "f9141513-f9b3-4fc8-8900-b793294c82c6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"frame": 0.1,
|
||||||
|
"value": {
|
||||||
|
"__uuid__": "6e12b8d0-488c-4885-9b4a-712af055be78"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"frame": 0.16666666666666666,
|
||||||
|
"value": {
|
||||||
|
"__uuid__": "a4be80d2-4593-4d92-994b-de7fc66642f0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"frame": 0.21666666666666667,
|
||||||
|
"value": {
|
||||||
|
"__uuid__": "bc355af2-caa1-4458-be7f-f84184d27c11"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"frame": 0.26666666666666666,
|
||||||
|
"value": {
|
||||||
|
"__uuid__": "4fa095aa-f08d-4baa-84c9-10e8eac6ea01"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"frame": 0.31666666666666665,
|
||||||
|
"value": {
|
||||||
|
"__uuid__": "01424fa9-4b4b-472a-ae90-923d0877fb66"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"frame": 0.35,
|
||||||
|
"value": {
|
||||||
|
"__uuid__": "5d8fe180-61eb-448d-bbcf-100d1763ebc8"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"events": []
|
||||||
|
}
|
@@ -1,18 +1,18 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<map version="1.2" tiledversion="1.2.3" orientation="orthogonal" renderorder="right-down" width="128" height="128" tilewidth="16" tileheight="16" infinite="0" nextlayerid="3" nextobjectid="87">
|
<map version="1.2" tiledversion="1.2.3" orientation="orthogonal" renderorder="right-down" width="128" height="128" tilewidth="16" tileheight="16" infinite="0" nextlayerid="4" nextobjectid="104">
|
||||||
<tileset firstgid="1" source="tiles0.tsx"/>
|
<tileset firstgid="1" source="tiles0.tsx"/>
|
||||||
<tileset firstgid="65" source="tiles1.tsx"/>
|
<tileset firstgid="65" source="tiles1.tsx"/>
|
||||||
<tileset firstgid="129" source="tiles2.tsx"/>
|
<tileset firstgid="129" source="tiles2.tsx"/>
|
||||||
<layer id="2" name="Ground" width="128" height="128">
|
<layer id="2" name="Ground" width="128" height="128">
|
||||||
<data encoding="base64" compression="zlib">
|
<data encoding="base64" compression="zlib">
|
||||||
eJzt3DFq3EAUgOFlTRoXJiEkkNQpAr5EyuDKVdKl8k1yh9wg94wMK1DEaqXVjvRGel/xgXFh7PnfSBqx+O5wONwBAAAAAAAAAAAAAAAAAMAM9yfRvwfreelo+78kFN0hsv/xpO3/q/E04LhD+v/ff4j++9Pt/zTS/76CVvov1/8c/fft9W//cHJubfrXhOhW+q/bPwP99Y/uENn//QzRzfSP7b+nGdBf/+gOW+xfE/1z9rf/c/cvMQP6b5f9r7/+efuXmAH9y69t+07x942W3vv666//Nvp/OtE/T/9u7+7X+uuvf1z/tyNK9u/SP7b/WPdz/f80flyp7e/5r57+U9s/Hzz/b8XU/lPbH/XflLH+5xo/Nh4G2vf79z1fSf+4/ufaP3T0uy/R/2Pji/7V9L903e/2L03/evvPeUa8lv7r958yA/21LNl3TMn+xwpa1Ni/1BpfMqe9/vvpf82MLPGz9d/GDCxF/9wzoL/+mftHr3+07Oe/6PWPpn9u+uemf27656Z/bvrnpn9u+uemf27656Z/bvrnpn9u+uemf276z7eHzwnpX0//dyPeDNB/H/3t/7r77/Fzovrnpv+6hu7tkf2PFbSouf/Pk/71vv1+9B7Wf9n+l+75+m/XlP5DZ65XY+e1yOv6Nf2jO9Tav+389Qa3ns/1j93/tyrxjkb/5fqXfp821L/WGcjef63936rtPZH+6/ZvZyDq/73oP96/5PP8pfPDEP3r2f+3zsGc/mveJ/SfZu4cfJ7Z/2/ju/7V9J+r6f9tbv/WknOQvT/xHQAAAAAAAAAAAAAAAID1/QPUuKyX
|
eJzt3MFq1EAcwOFli5ceikUU9NyD4Et47qle9OapLyB60ZMgvoIH776nWUggxkySnZ1kksx3+KC0S2jn9082E5ZeHQ6HKwAAAAAAAAAAAAAAAAAAiHBdy/17sJzHlqb/Y4Fyd8jZ/1hr+n+s3Accd0j/f/uH6L8/7f73I/2vV9BK//n699F/305/+/Na39p0rwm5W+m/bP8S6K9/7g45+z+LkLuZ/nn772kG9Nc/d4ct9l8T/cvs7/wvu3+KGdB/u5z/+utfbv8UM6B/+rVtnin+uNDc577++uu/jf4va/qX07/du/21/vrrn6//0xEp+7fpn7f/WPe+/r8q78/U9Hf/t57+U9s/HNz/b8XU/lPbH/XflLH+fY3fVG4C7bv9ux7OpH++/n3tb1q63efo/6Jyp/9q+g9d99v9U9N/vf1j7hHPpf/y/afMQHctU/Ydk7L/cQUt1tg/1RoPiWmv/376nzMjcxxb/23MwFz0L3sG9Ne/5P651z+30vd/udc/N/3Lpn/Z9C+b/mXTv2z6l03/sulfNv3Lpn/Z9C+b/mXTv2z6l03/9boL0H8d/ef6nFCo+xxzoP96+t+OeBKg/z7656B/fG/9t23t93/6769/6L29+fm7hNrHDF2ffP573Ida93rffD/3OXzp+a//sKH3/C3177tG6D8stOc6Gduv3U44fs72Tf/cHdbav+n8+gKX7s/nbK///Guf4hnNXO31T/88LdQ/xwxM2SOU3n+p87+x1HOiqXtE/Zft38zAnP/v5ZxnBPr/L+X9/ND+IeR7hJj2+o/3u3QOYvrHzMDPSPpPEzsHrw5x/f9UvgRaN75VPtWv1X/e/rGq/m9j+598PoT7f2297tTyd03/6f3J3wEAAAAAAAAAAAAAAABY3l9OOPTh
|
||||||
</data>
|
</data>
|
||||||
</layer>
|
</layer>
|
||||||
<objectgroup id="1" name="PlayerStartingPos">
|
<objectgroup id="1" name="PlayerStartingPos">
|
||||||
<object id="135" x="1010" y="1432">
|
<object id="135" x="999" y="1608">
|
||||||
<point/>
|
<point/>
|
||||||
</object>
|
</object>
|
||||||
<object id="137" x="950" y="1432">
|
<object id="137" x="875" y="1450">
|
||||||
<point/>
|
<point/>
|
||||||
</object>
|
</object>
|
||||||
</objectgroup>
|
</objectgroup>
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
<property name="boundary_type" value="barrier"/>
|
<property name="boundary_type" value="barrier"/>
|
||||||
</properties>
|
</properties>
|
||||||
</object>
|
</object>
|
||||||
<object id="55" x="735" y="1552" width="113.5" height="15.5">
|
<object id="55" x="736" y="1552" width="112" height="16">
|
||||||
<properties>
|
<properties>
|
||||||
<property name="boundary_type" value="barrier"/>
|
<property name="boundary_type" value="barrier"/>
|
||||||
</properties>
|
</properties>
|
||||||
@@ -80,12 +80,12 @@
|
|||||||
<property name="boundary_type" value="barrier"/>
|
<property name="boundary_type" value="barrier"/>
|
||||||
</properties>
|
</properties>
|
||||||
</object>
|
</object>
|
||||||
<object id="73" x="783.75" y="1567.5" width="96.25" height="15.5">
|
<object id="73" x="784" y="1568" width="96" height="16">
|
||||||
<properties>
|
<properties>
|
||||||
<property name="boundary_type" value="barrier"/>
|
<property name="boundary_type" value="barrier"/>
|
||||||
</properties>
|
</properties>
|
||||||
</object>
|
</object>
|
||||||
<object id="74" x="815.75" y="1583.75" width="96.25" height="15.5">
|
<object id="74" x="816" y="1584" width="96" height="16">
|
||||||
<properties>
|
<properties>
|
||||||
<property name="boundary_type" value="barrier"/>
|
<property name="boundary_type" value="barrier"/>
|
||||||
</properties>
|
</properties>
|
||||||
@@ -95,18 +95,6 @@
|
|||||||
<property name="boundary_type" value="barrier"/>
|
<property name="boundary_type" value="barrier"/>
|
||||||
</properties>
|
</properties>
|
||||||
</object>
|
</object>
|
||||||
<object id="80" x="1296" y="1600">
|
|
||||||
<properties>
|
|
||||||
<property name="boundary_type" value="barrier"/>
|
|
||||||
</properties>
|
|
||||||
<polyline points="0,0 -32.5,0 -32.25,-16.5 -16.5,-16.5"/>
|
|
||||||
</object>
|
|
||||||
<object id="82" x="1328" y="1616">
|
|
||||||
<properties>
|
|
||||||
<property name="boundary_type" value="barrier"/>
|
|
||||||
</properties>
|
|
||||||
<polyline points="0,0 -64.5,0 -64.0038,-15.75 -16.4734,-15.75"/>
|
|
||||||
</object>
|
|
||||||
<object id="83" x="640" y="480" width="1056" height="16">
|
<object id="83" x="640" y="480" width="1056" height="16">
|
||||||
<properties>
|
<properties>
|
||||||
<property name="boundary_type" value="barrier"/>
|
<property name="boundary_type" value="barrier"/>
|
||||||
@@ -127,5 +115,90 @@
|
|||||||
<property name="boundary_type" value="barrier"/>
|
<property name="boundary_type" value="barrier"/>
|
||||||
</properties>
|
</properties>
|
||||||
</object>
|
</object>
|
||||||
|
<object id="87" x="1456" y="1568" width="224" height="48">
|
||||||
|
<properties>
|
||||||
|
<property name="boundary_type" value="barrier"/>
|
||||||
|
</properties>
|
||||||
|
</object>
|
||||||
|
<object id="88" x="1264" y="1584" width="16" height="32">
|
||||||
|
<properties>
|
||||||
|
<property name="boundary_type" value="barrier"/>
|
||||||
|
</properties>
|
||||||
|
</object>
|
||||||
|
<object id="89" x="1280" y="1600" width="16" height="16">
|
||||||
|
<properties>
|
||||||
|
<property name="boundary_type" value="barrier"/>
|
||||||
|
</properties>
|
||||||
|
</object>
|
||||||
|
<object id="90" x="1232" y="1408" width="304" height="16">
|
||||||
|
<properties>
|
||||||
|
<property name="boundary_type" value="barrier"/>
|
||||||
|
</properties>
|
||||||
|
</object>
|
||||||
|
<object id="91" x="1440" y="1584" width="16" height="32">
|
||||||
|
<properties>
|
||||||
|
<property name="boundary_type" value="barrier"/>
|
||||||
|
</properties>
|
||||||
|
</object>
|
||||||
|
<object id="92" x="1424" y="1600" width="16" height="16">
|
||||||
|
<properties>
|
||||||
|
<property name="boundary_type" value="barrier"/>
|
||||||
|
</properties>
|
||||||
|
</object>
|
||||||
|
<object id="93" x="1488" y="1552" width="192" height="16">
|
||||||
|
<properties>
|
||||||
|
<property name="boundary_type" value="barrier"/>
|
||||||
|
</properties>
|
||||||
|
</object>
|
||||||
|
<object id="94" x="1504" y="1536" width="176" height="16">
|
||||||
|
<properties>
|
||||||
|
<property name="boundary_type" value="barrier"/>
|
||||||
|
</properties>
|
||||||
|
</object>
|
||||||
|
<object id="95" x="1520" y="1520" width="160" height="16">
|
||||||
|
<properties>
|
||||||
|
<property name="boundary_type" value="barrier"/>
|
||||||
|
</properties>
|
||||||
|
</object>
|
||||||
|
<object id="96" x="1568" y="1408" width="16" height="16">
|
||||||
|
<properties>
|
||||||
|
<property name="boundary_type" value="barrier"/>
|
||||||
|
</properties>
|
||||||
|
</object>
|
||||||
|
<object id="97" x="1248" y="1328" width="158" height="16">
|
||||||
|
<properties>
|
||||||
|
<property name="boundary_type" value="barrier"/>
|
||||||
|
</properties>
|
||||||
|
</object>
|
||||||
|
<object id="98" x="1280" y="1312" width="96" height="16">
|
||||||
|
<properties>
|
||||||
|
<property name="boundary_type" value="barrier"/>
|
||||||
|
</properties>
|
||||||
|
</object>
|
||||||
|
<object id="99" x="1536" y="1504" width="144" height="16">
|
||||||
|
<properties>
|
||||||
|
<property name="boundary_type" value="barrier"/>
|
||||||
|
</properties>
|
||||||
|
</object>
|
||||||
|
<object id="100" x="1552" y="1488" width="128" height="16">
|
||||||
|
<properties>
|
||||||
|
<property name="boundary_type" value="barrier"/>
|
||||||
|
</properties>
|
||||||
|
</object>
|
||||||
|
<object id="101" x="1568" y="1472" width="112" height="16">
|
||||||
|
<properties>
|
||||||
|
<property name="boundary_type" value="barrier"/>
|
||||||
|
</properties>
|
||||||
|
</object>
|
||||||
|
<object id="102" x="1584" y="1456" width="96" height="16">
|
||||||
|
<properties>
|
||||||
|
<property name="boundary_type" value="barrier"/>
|
||||||
|
</properties>
|
||||||
|
</object>
|
||||||
|
<object id="103" x="1600" y="1440" width="80" height="16">
|
||||||
|
<properties>
|
||||||
|
<property name="boundary_type" value="barrier"/>
|
||||||
|
</properties>
|
||||||
|
</object>
|
||||||
</objectgroup>
|
</objectgroup>
|
||||||
</map>
|
</map>
|
||||||
|
@@ -76,6 +76,7 @@ message InputsBufferSnapshot {
|
|||||||
int32 refRenderFrameId = 1;
|
int32 refRenderFrameId = 1;
|
||||||
uint64 unconfirmedMask = 2;
|
uint64 unconfirmedMask = 2;
|
||||||
repeated InputFrameDownsync toSendInputFrameDownsyncs = 3;
|
repeated InputFrameDownsync toSendInputFrameDownsyncs = 3;
|
||||||
|
bool shouldForceResync = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
message MeleeBullet {
|
message MeleeBullet {
|
||||||
@@ -151,4 +152,5 @@ message RoomDownsyncFrame {
|
|||||||
int64 countdownNanos = 3;
|
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
|
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
|
uint64 backendUnconfirmedMask = 5; // Indexed by "joinIndex", same compression concern as stated in InputFrameDownsync
|
||||||
|
bool shouldForceResync = 6;
|
||||||
}
|
}
|
||||||
|
@@ -779,7 +779,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"__type__": "cc.Node",
|
"__type__": "cc.Node",
|
||||||
"_name": "SoldierFireGhostFrameAnim",
|
"_name": "UltramanTiga",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
"_parent": {
|
"_parent": {
|
||||||
"__id__": 11
|
"__id__": 11
|
||||||
@@ -826,8 +826,8 @@
|
|||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
1,
|
1,
|
||||||
1,
|
0.7,
|
||||||
1,
|
0.7,
|
||||||
1
|
1
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -870,7 +870,7 @@
|
|||||||
"__uuid__": "43dbf141-be76-48c3-bdef-29233ccbe30d"
|
"__uuid__": "43dbf141-be76-48c3-bdef-29233ccbe30d"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"__uuid__": "c738236a-0702-45f8-aa38-99457b051997"
|
"__uuid__": "8710591c-3f5e-4911-83e7-42cc18be6af9"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"__uuid__": "c69bcceb-d7d1-4e33-9623-e2a374a0a6b6"
|
"__uuid__": "c69bcceb-d7d1-4e33-9623-e2a374a0a6b6"
|
||||||
@@ -907,7 +907,7 @@
|
|||||||
"_fillRange": 0,
|
"_fillRange": 0,
|
||||||
"_isTrimmedMode": true,
|
"_isTrimmedMode": true,
|
||||||
"_atlas": {
|
"_atlas": {
|
||||||
"__uuid__": "145769c8-a259-42bc-8cce-6e035f493c70"
|
"__uuid__": "5d522f7b-359b-4f38-ac35-55fdbee56cae"
|
||||||
},
|
},
|
||||||
"_id": ""
|
"_id": ""
|
||||||
},
|
},
|
||||||
@@ -919,7 +919,7 @@
|
|||||||
"asset": {
|
"asset": {
|
||||||
"__uuid__": "59bff7a2-23e1-4d69-bce7-afb37eae196a"
|
"__uuid__": "59bff7a2-23e1-4d69-bce7-afb37eae196a"
|
||||||
},
|
},
|
||||||
"fileId": "4c+Ci1MGpP47N3wJ0ujhEm",
|
"fileId": "17JdhftghBYr81MfV9i6cy",
|
||||||
"sync": false
|
"sync": false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -78,19 +78,19 @@
|
|||||||
"_active": true,
|
"_active": true,
|
||||||
"_components": [
|
"_components": [
|
||||||
{
|
{
|
||||||
"__id__": 29
|
"__id__": 37
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"__id__": 30
|
"__id__": 38
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"__id__": 31
|
"__id__": 39
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"__id__": 32
|
"__id__": 40
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"__id__": 33
|
"__id__": 41
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"_prefab": null,
|
"_prefab": null,
|
||||||
@@ -158,7 +158,7 @@
|
|||||||
"__id__": 5
|
"__id__": 5
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"__id__": 28
|
"__id__": 36
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"_prefab": null,
|
"_prefab": null,
|
||||||
@@ -279,13 +279,13 @@
|
|||||||
},
|
},
|
||||||
"_children": [
|
"_children": [
|
||||||
{
|
{
|
||||||
"__id__": 22
|
"__id__": 30
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"_active": true,
|
"_active": true,
|
||||||
"_components": [
|
"_components": [
|
||||||
{
|
{
|
||||||
"__id__": 27
|
"__id__": 35
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"_prefab": null,
|
"_prefab": null,
|
||||||
@@ -352,6 +352,12 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"__id__": 20
|
"__id__": 20
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__id__": 22
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__id__": 26
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"_active": true,
|
"_active": true,
|
||||||
@@ -447,7 +453,7 @@
|
|||||||
"array": [
|
"array": [
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
216.50635094610968,
|
215.81269742929726,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
@@ -1043,10 +1049,10 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"__type__": "cc.Node",
|
"__type__": "cc.Node",
|
||||||
"_name": "JoystickBG",
|
"_name": "BtnA",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
"_parent": {
|
"_parent": {
|
||||||
"__id__": 6
|
"__id__": 7
|
||||||
},
|
},
|
||||||
"_children": [
|
"_children": [
|
||||||
{
|
{
|
||||||
@@ -1054,12 +1060,70 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"_active": true,
|
"_active": true,
|
||||||
|
"_components": [],
|
||||||
|
"_prefab": null,
|
||||||
|
"_opacity": 255,
|
||||||
|
"_color": {
|
||||||
|
"__type__": "cc.Color",
|
||||||
|
"r": 255,
|
||||||
|
"g": 255,
|
||||||
|
"b": 255,
|
||||||
|
"a": 255
|
||||||
|
},
|
||||||
|
"_contentSize": {
|
||||||
|
"__type__": "cc.Size",
|
||||||
|
"width": 200,
|
||||||
|
"height": 200
|
||||||
|
},
|
||||||
|
"_anchorPoint": {
|
||||||
|
"__type__": "cc.Vec2",
|
||||||
|
"x": 0.5,
|
||||||
|
"y": 0.5
|
||||||
|
},
|
||||||
|
"_trs": {
|
||||||
|
"__type__": "TypedArray",
|
||||||
|
"ctor": "Float64Array",
|
||||||
|
"array": [
|
||||||
|
143.689,
|
||||||
|
-584.849,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0.66667,
|
||||||
|
0.66667,
|
||||||
|
0.66667
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"_eulerAngles": {
|
||||||
|
"__type__": "cc.Vec3",
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"_skewX": 0,
|
||||||
|
"_skewY": 0,
|
||||||
|
"_is3DNode": false,
|
||||||
|
"_groupIndex": 0,
|
||||||
|
"groupIndex": 0,
|
||||||
|
"_id": "35ITFOFadFX5FVNVNUZbrn"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__type__": "cc.Node",
|
||||||
|
"_name": "Background",
|
||||||
|
"_objFlags": 0,
|
||||||
|
"_parent": {
|
||||||
|
"__id__": 22
|
||||||
|
},
|
||||||
|
"_children": [],
|
||||||
|
"_active": true,
|
||||||
"_components": [
|
"_components": [
|
||||||
{
|
{
|
||||||
"__id__": 25
|
"__id__": 24
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"__id__": 26
|
"__id__": 25
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"_prefab": null,
|
"_prefab": null,
|
||||||
@@ -1073,8 +1137,8 @@
|
|||||||
},
|
},
|
||||||
"_contentSize": {
|
"_contentSize": {
|
||||||
"__type__": "cc.Size",
|
"__type__": "cc.Size",
|
||||||
"width": 400,
|
"width": 200,
|
||||||
"height": 400
|
"height": 200
|
||||||
},
|
},
|
||||||
"_anchorPoint": {
|
"_anchorPoint": {
|
||||||
"__type__": "cc.Vec2",
|
"__type__": "cc.Vec2",
|
||||||
@@ -1108,6 +1172,324 @@
|
|||||||
"_is3DNode": false,
|
"_is3DNode": false,
|
||||||
"_groupIndex": 0,
|
"_groupIndex": 0,
|
||||||
"groupIndex": 0,
|
"groupIndex": 0,
|
||||||
|
"_id": "8f/j+BH3VFzowR9kS36/D8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__type__": "cc.Sprite",
|
||||||
|
"_name": "",
|
||||||
|
"_objFlags": 0,
|
||||||
|
"node": {
|
||||||
|
"__id__": 23
|
||||||
|
},
|
||||||
|
"_enabled": true,
|
||||||
|
"_materials": [
|
||||||
|
{
|
||||||
|
"__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"_srcBlendFactor": 770,
|
||||||
|
"_dstBlendFactor": 771,
|
||||||
|
"_spriteFrame": {
|
||||||
|
"__uuid__": "350fd890-3d28-4e53-9dfa-1bf00d857737"
|
||||||
|
},
|
||||||
|
"_type": 1,
|
||||||
|
"_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": "bdYe//0u9Dj79RLi8Rt6un"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__type__": "cc.Widget",
|
||||||
|
"_name": "",
|
||||||
|
"_objFlags": 0,
|
||||||
|
"node": {
|
||||||
|
"__id__": 23
|
||||||
|
},
|
||||||
|
"_enabled": true,
|
||||||
|
"alignMode": 0,
|
||||||
|
"_target": null,
|
||||||
|
"_alignFlags": 45,
|
||||||
|
"_left": 0,
|
||||||
|
"_right": 0,
|
||||||
|
"_top": 0,
|
||||||
|
"_bottom": 0,
|
||||||
|
"_verticalCenter": 0,
|
||||||
|
"_horizontalCenter": 0,
|
||||||
|
"_isAbsLeft": true,
|
||||||
|
"_isAbsRight": true,
|
||||||
|
"_isAbsTop": true,
|
||||||
|
"_isAbsBottom": true,
|
||||||
|
"_isAbsHorizontalCenter": true,
|
||||||
|
"_isAbsVerticalCenter": true,
|
||||||
|
"_originalWidth": 100,
|
||||||
|
"_originalHeight": 40,
|
||||||
|
"_id": "98p5OL5fdGep1z6jWXKTu9"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__type__": "cc.Node",
|
||||||
|
"_name": "BtnB",
|
||||||
|
"_objFlags": 0,
|
||||||
|
"_parent": {
|
||||||
|
"__id__": 7
|
||||||
|
},
|
||||||
|
"_children": [
|
||||||
|
{
|
||||||
|
"__id__": 27
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"_active": true,
|
||||||
|
"_components": [],
|
||||||
|
"_prefab": null,
|
||||||
|
"_opacity": 255,
|
||||||
|
"_color": {
|
||||||
|
"__type__": "cc.Color",
|
||||||
|
"r": 255,
|
||||||
|
"g": 255,
|
||||||
|
"b": 255,
|
||||||
|
"a": 255
|
||||||
|
},
|
||||||
|
"_contentSize": {
|
||||||
|
"__type__": "cc.Size",
|
||||||
|
"width": 200,
|
||||||
|
"height": 200
|
||||||
|
},
|
||||||
|
"_anchorPoint": {
|
||||||
|
"__type__": "cc.Vec2",
|
||||||
|
"x": 0.5,
|
||||||
|
"y": 0.5
|
||||||
|
},
|
||||||
|
"_trs": {
|
||||||
|
"__type__": "TypedArray",
|
||||||
|
"ctor": "Float64Array",
|
||||||
|
"array": [
|
||||||
|
370.368,
|
||||||
|
-424.647,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0.66667,
|
||||||
|
0.66667,
|
||||||
|
0.66667
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"_eulerAngles": {
|
||||||
|
"__type__": "cc.Vec3",
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"_skewX": 0,
|
||||||
|
"_skewY": 0,
|
||||||
|
"_is3DNode": false,
|
||||||
|
"_groupIndex": 0,
|
||||||
|
"groupIndex": 0,
|
||||||
|
"_id": "92c5tbNsZPG7f09UQLXv+j"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__type__": "cc.Node",
|
||||||
|
"_name": "Background",
|
||||||
|
"_objFlags": 0,
|
||||||
|
"_parent": {
|
||||||
|
"__id__": 26
|
||||||
|
},
|
||||||
|
"_children": [],
|
||||||
|
"_active": true,
|
||||||
|
"_components": [
|
||||||
|
{
|
||||||
|
"__id__": 28
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__id__": 29
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"_prefab": null,
|
||||||
|
"_opacity": 255,
|
||||||
|
"_color": {
|
||||||
|
"__type__": "cc.Color",
|
||||||
|
"r": 255,
|
||||||
|
"g": 255,
|
||||||
|
"b": 255,
|
||||||
|
"a": 255
|
||||||
|
},
|
||||||
|
"_contentSize": {
|
||||||
|
"__type__": "cc.Size",
|
||||||
|
"width": 200,
|
||||||
|
"height": 200
|
||||||
|
},
|
||||||
|
"_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": "96xSPG8lxPZIsW+n65WcbU"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__type__": "cc.Sprite",
|
||||||
|
"_name": "",
|
||||||
|
"_objFlags": 0,
|
||||||
|
"node": {
|
||||||
|
"__id__": 27
|
||||||
|
},
|
||||||
|
"_enabled": true,
|
||||||
|
"_materials": [
|
||||||
|
{
|
||||||
|
"__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"_srcBlendFactor": 770,
|
||||||
|
"_dstBlendFactor": 771,
|
||||||
|
"_spriteFrame": {
|
||||||
|
"__uuid__": "a2170e4c-df31-41ef-be73-f4f605e75821"
|
||||||
|
},
|
||||||
|
"_type": 1,
|
||||||
|
"_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": "2euUQEzg9FdZu2ijWBxgrr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__type__": "cc.Widget",
|
||||||
|
"_name": "",
|
||||||
|
"_objFlags": 0,
|
||||||
|
"node": {
|
||||||
|
"__id__": 27
|
||||||
|
},
|
||||||
|
"_enabled": true,
|
||||||
|
"alignMode": 0,
|
||||||
|
"_target": null,
|
||||||
|
"_alignFlags": 45,
|
||||||
|
"_left": 0,
|
||||||
|
"_right": 0,
|
||||||
|
"_top": 0,
|
||||||
|
"_bottom": 0,
|
||||||
|
"_verticalCenter": 0,
|
||||||
|
"_horizontalCenter": 0,
|
||||||
|
"_isAbsLeft": true,
|
||||||
|
"_isAbsRight": true,
|
||||||
|
"_isAbsTop": true,
|
||||||
|
"_isAbsBottom": true,
|
||||||
|
"_isAbsHorizontalCenter": true,
|
||||||
|
"_isAbsVerticalCenter": true,
|
||||||
|
"_originalWidth": 100,
|
||||||
|
"_originalHeight": 40,
|
||||||
|
"_id": "5bXB50moJH9aH7RcbRuSS5"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__type__": "cc.Node",
|
||||||
|
"_name": "JoystickBG",
|
||||||
|
"_objFlags": 0,
|
||||||
|
"_parent": {
|
||||||
|
"__id__": 6
|
||||||
|
},
|
||||||
|
"_children": [
|
||||||
|
{
|
||||||
|
"__id__": 31
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"_active": true,
|
||||||
|
"_components": [
|
||||||
|
{
|
||||||
|
"__id__": 33
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__id__": 34
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"_prefab": null,
|
||||||
|
"_opacity": 255,
|
||||||
|
"_color": {
|
||||||
|
"__type__": "cc.Color",
|
||||||
|
"r": 255,
|
||||||
|
"g": 255,
|
||||||
|
"b": 255,
|
||||||
|
"a": 255
|
||||||
|
},
|
||||||
|
"_contentSize": {
|
||||||
|
"__type__": "cc.Size",
|
||||||
|
"width": 400,
|
||||||
|
"height": 400
|
||||||
|
},
|
||||||
|
"_anchorPoint": {
|
||||||
|
"__type__": "cc.Vec2",
|
||||||
|
"x": 0.5,
|
||||||
|
"y": 0.5
|
||||||
|
},
|
||||||
|
"_trs": {
|
||||||
|
"__type__": "TypedArray",
|
||||||
|
"ctor": "Float64Array",
|
||||||
|
"array": [
|
||||||
|
-380,
|
||||||
|
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": "88u3wQvvdO8pbrNWhs3ifP"
|
"_id": "88u3wQvvdO8pbrNWhs3ifP"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1115,13 +1497,13 @@
|
|||||||
"_name": "Joystick",
|
"_name": "Joystick",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
"_parent": {
|
"_parent": {
|
||||||
"__id__": 22
|
"__id__": 30
|
||||||
},
|
},
|
||||||
"_children": [],
|
"_children": [],
|
||||||
"_active": true,
|
"_active": true,
|
||||||
"_components": [
|
"_components": [
|
||||||
{
|
{
|
||||||
"__id__": 24
|
"__id__": 32
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"_prefab": null,
|
"_prefab": null,
|
||||||
@@ -1177,7 +1559,7 @@
|
|||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 23
|
"__id__": 31
|
||||||
},
|
},
|
||||||
"_enabled": true,
|
"_enabled": true,
|
||||||
"_materials": [
|
"_materials": [
|
||||||
@@ -1211,7 +1593,7 @@
|
|||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 22
|
"__id__": 30
|
||||||
},
|
},
|
||||||
"_enabled": true,
|
"_enabled": true,
|
||||||
"_materials": [
|
"_materials": [
|
||||||
@@ -1245,7 +1627,7 @@
|
|||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 22
|
"__id__": 30
|
||||||
},
|
},
|
||||||
"_enabled": true,
|
"_enabled": true,
|
||||||
"alignMode": 0,
|
"alignMode": 0,
|
||||||
@@ -1408,10 +1790,10 @@
|
|||||||
"__id__": 3
|
"__id__": 3
|
||||||
},
|
},
|
||||||
"stickhead": {
|
"stickhead": {
|
||||||
"__id__": 23
|
"__id__": 31
|
||||||
},
|
},
|
||||||
"base": {
|
"base": {
|
||||||
"__id__": 22
|
"__id__": 30
|
||||||
},
|
},
|
||||||
"joyStickEps": 0.1,
|
"joyStickEps": 0.1,
|
||||||
"magicLeanLowerBound": 0.414,
|
"magicLeanLowerBound": 0.414,
|
||||||
@@ -1431,6 +1813,12 @@
|
|||||||
},
|
},
|
||||||
"linearMovingEps": 0.1,
|
"linearMovingEps": 0.1,
|
||||||
"scaleByEps": 0.0375,
|
"scaleByEps": 0.0375,
|
||||||
|
"btnA": {
|
||||||
|
"__id__": 22
|
||||||
|
},
|
||||||
|
"btnB": {
|
||||||
|
"__id__": 26
|
||||||
|
},
|
||||||
"_id": "e9oVYTr7ROlpp/IrNjBUmR"
|
"_id": "e9oVYTr7ROlpp/IrNjBUmR"
|
||||||
}
|
}
|
||||||
]
|
]
|
@@ -440,7 +440,7 @@
|
|||||||
"array": [
|
"array": [
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
216.50635094610968,
|
210.4441731196186,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
@@ -78,19 +78,19 @@
|
|||||||
"_active": true,
|
"_active": true,
|
||||||
"_components": [
|
"_components": [
|
||||||
{
|
{
|
||||||
"__id__": 19
|
"__id__": 27
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"__id__": 20
|
"__id__": 28
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"__id__": 21
|
"__id__": 29
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"__id__": 22
|
"__id__": 30
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"__id__": 23
|
"__id__": 31
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"_prefab": null,
|
"_prefab": null,
|
||||||
@@ -289,13 +289,13 @@
|
|||||||
},
|
},
|
||||||
"_children": [
|
"_children": [
|
||||||
{
|
{
|
||||||
"__id__": 13
|
"__id__": 21
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"_active": true,
|
"_active": true,
|
||||||
"_components": [
|
"_components": [
|
||||||
{
|
{
|
||||||
"__id__": 18
|
"__id__": 26
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"_prefab": null,
|
"_prefab": null,
|
||||||
@@ -359,6 +359,12 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"__id__": 11
|
"__id__": 11
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__id__": 13
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__id__": 17
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"_active": true,
|
"_active": true,
|
||||||
@@ -607,10 +613,10 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"__type__": "cc.Node",
|
"__type__": "cc.Node",
|
||||||
"_name": "JoystickBG",
|
"_name": "BtnA",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
"_parent": {
|
"_parent": {
|
||||||
"__id__": 7
|
"__id__": 8
|
||||||
},
|
},
|
||||||
"_children": [
|
"_children": [
|
||||||
{
|
{
|
||||||
@@ -618,12 +624,70 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"_active": true,
|
"_active": true,
|
||||||
|
"_components": [],
|
||||||
|
"_prefab": null,
|
||||||
|
"_opacity": 255,
|
||||||
|
"_color": {
|
||||||
|
"__type__": "cc.Color",
|
||||||
|
"r": 255,
|
||||||
|
"g": 255,
|
||||||
|
"b": 255,
|
||||||
|
"a": 255
|
||||||
|
},
|
||||||
|
"_contentSize": {
|
||||||
|
"__type__": "cc.Size",
|
||||||
|
"width": 200,
|
||||||
|
"height": 200
|
||||||
|
},
|
||||||
|
"_anchorPoint": {
|
||||||
|
"__type__": "cc.Vec2",
|
||||||
|
"x": 0.5,
|
||||||
|
"y": 0.5
|
||||||
|
},
|
||||||
|
"_trs": {
|
||||||
|
"__type__": "TypedArray",
|
||||||
|
"ctor": "Float64Array",
|
||||||
|
"array": [
|
||||||
|
143.689,
|
||||||
|
-584.849,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0.66667,
|
||||||
|
0.66667,
|
||||||
|
0.66667
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"_eulerAngles": {
|
||||||
|
"__type__": "cc.Vec3",
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"_skewX": 0,
|
||||||
|
"_skewY": 0,
|
||||||
|
"_is3DNode": false,
|
||||||
|
"_groupIndex": 0,
|
||||||
|
"groupIndex": 0,
|
||||||
|
"_id": "a5pbciqqBEiYlyy7SLwP4V"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__type__": "cc.Node",
|
||||||
|
"_name": "Background",
|
||||||
|
"_objFlags": 0,
|
||||||
|
"_parent": {
|
||||||
|
"__id__": 13
|
||||||
|
},
|
||||||
|
"_children": [],
|
||||||
|
"_active": true,
|
||||||
"_components": [
|
"_components": [
|
||||||
{
|
{
|
||||||
"__id__": 16
|
"__id__": 15
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"__id__": 17
|
"__id__": 16
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"_prefab": null,
|
"_prefab": null,
|
||||||
@@ -637,8 +701,8 @@
|
|||||||
},
|
},
|
||||||
"_contentSize": {
|
"_contentSize": {
|
||||||
"__type__": "cc.Size",
|
"__type__": "cc.Size",
|
||||||
"width": 400,
|
"width": 200,
|
||||||
"height": 400
|
"height": 200
|
||||||
},
|
},
|
||||||
"_anchorPoint": {
|
"_anchorPoint": {
|
||||||
"__type__": "cc.Vec2",
|
"__type__": "cc.Vec2",
|
||||||
@@ -672,6 +736,324 @@
|
|||||||
"_is3DNode": false,
|
"_is3DNode": false,
|
||||||
"_groupIndex": 0,
|
"_groupIndex": 0,
|
||||||
"groupIndex": 0,
|
"groupIndex": 0,
|
||||||
|
"_id": "ffojLoj41JCpizkLkManxw"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__type__": "cc.Sprite",
|
||||||
|
"_name": "",
|
||||||
|
"_objFlags": 0,
|
||||||
|
"node": {
|
||||||
|
"__id__": 14
|
||||||
|
},
|
||||||
|
"_enabled": true,
|
||||||
|
"_materials": [
|
||||||
|
{
|
||||||
|
"__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"_srcBlendFactor": 770,
|
||||||
|
"_dstBlendFactor": 771,
|
||||||
|
"_spriteFrame": {
|
||||||
|
"__uuid__": "350fd890-3d28-4e53-9dfa-1bf00d857737"
|
||||||
|
},
|
||||||
|
"_type": 1,
|
||||||
|
"_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": "21Oz9QwBZPALzRoJujKVPG"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__type__": "cc.Widget",
|
||||||
|
"_name": "",
|
||||||
|
"_objFlags": 0,
|
||||||
|
"node": {
|
||||||
|
"__id__": 14
|
||||||
|
},
|
||||||
|
"_enabled": true,
|
||||||
|
"alignMode": 0,
|
||||||
|
"_target": null,
|
||||||
|
"_alignFlags": 45,
|
||||||
|
"_left": 0,
|
||||||
|
"_right": 0,
|
||||||
|
"_top": 0,
|
||||||
|
"_bottom": 0,
|
||||||
|
"_verticalCenter": 0,
|
||||||
|
"_horizontalCenter": 0,
|
||||||
|
"_isAbsLeft": true,
|
||||||
|
"_isAbsRight": true,
|
||||||
|
"_isAbsTop": true,
|
||||||
|
"_isAbsBottom": true,
|
||||||
|
"_isAbsHorizontalCenter": true,
|
||||||
|
"_isAbsVerticalCenter": true,
|
||||||
|
"_originalWidth": 100,
|
||||||
|
"_originalHeight": 40,
|
||||||
|
"_id": "beUmgK1D1M07I7kTL4NFLK"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__type__": "cc.Node",
|
||||||
|
"_name": "BtnB",
|
||||||
|
"_objFlags": 0,
|
||||||
|
"_parent": {
|
||||||
|
"__id__": 8
|
||||||
|
},
|
||||||
|
"_children": [
|
||||||
|
{
|
||||||
|
"__id__": 18
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"_active": true,
|
||||||
|
"_components": [],
|
||||||
|
"_prefab": null,
|
||||||
|
"_opacity": 255,
|
||||||
|
"_color": {
|
||||||
|
"__type__": "cc.Color",
|
||||||
|
"r": 255,
|
||||||
|
"g": 255,
|
||||||
|
"b": 255,
|
||||||
|
"a": 255
|
||||||
|
},
|
||||||
|
"_contentSize": {
|
||||||
|
"__type__": "cc.Size",
|
||||||
|
"width": 200,
|
||||||
|
"height": 200
|
||||||
|
},
|
||||||
|
"_anchorPoint": {
|
||||||
|
"__type__": "cc.Vec2",
|
||||||
|
"x": 0.5,
|
||||||
|
"y": 0.5
|
||||||
|
},
|
||||||
|
"_trs": {
|
||||||
|
"__type__": "TypedArray",
|
||||||
|
"ctor": "Float64Array",
|
||||||
|
"array": [
|
||||||
|
370.368,
|
||||||
|
-424.647,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0.66667,
|
||||||
|
0.66667,
|
||||||
|
0.66667
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"_eulerAngles": {
|
||||||
|
"__type__": "cc.Vec3",
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"_skewX": 0,
|
||||||
|
"_skewY": 0,
|
||||||
|
"_is3DNode": false,
|
||||||
|
"_groupIndex": 0,
|
||||||
|
"groupIndex": 0,
|
||||||
|
"_id": "9eZHUAtItPMKp7OrItdaWA"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__type__": "cc.Node",
|
||||||
|
"_name": "Background",
|
||||||
|
"_objFlags": 0,
|
||||||
|
"_parent": {
|
||||||
|
"__id__": 17
|
||||||
|
},
|
||||||
|
"_children": [],
|
||||||
|
"_active": true,
|
||||||
|
"_components": [
|
||||||
|
{
|
||||||
|
"__id__": 19
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__id__": 20
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"_prefab": null,
|
||||||
|
"_opacity": 255,
|
||||||
|
"_color": {
|
||||||
|
"__type__": "cc.Color",
|
||||||
|
"r": 255,
|
||||||
|
"g": 255,
|
||||||
|
"b": 255,
|
||||||
|
"a": 255
|
||||||
|
},
|
||||||
|
"_contentSize": {
|
||||||
|
"__type__": "cc.Size",
|
||||||
|
"width": 200,
|
||||||
|
"height": 200
|
||||||
|
},
|
||||||
|
"_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": "e2JXxje+hAC7LjZqzgq8RF"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__type__": "cc.Sprite",
|
||||||
|
"_name": "",
|
||||||
|
"_objFlags": 0,
|
||||||
|
"node": {
|
||||||
|
"__id__": 18
|
||||||
|
},
|
||||||
|
"_enabled": true,
|
||||||
|
"_materials": [
|
||||||
|
{
|
||||||
|
"__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"_srcBlendFactor": 770,
|
||||||
|
"_dstBlendFactor": 771,
|
||||||
|
"_spriteFrame": {
|
||||||
|
"__uuid__": "a2170e4c-df31-41ef-be73-f4f605e75821"
|
||||||
|
},
|
||||||
|
"_type": 1,
|
||||||
|
"_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": "54DvUzQvpKMrmsuRaQRSxf"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__type__": "cc.Widget",
|
||||||
|
"_name": "",
|
||||||
|
"_objFlags": 0,
|
||||||
|
"node": {
|
||||||
|
"__id__": 18
|
||||||
|
},
|
||||||
|
"_enabled": true,
|
||||||
|
"alignMode": 0,
|
||||||
|
"_target": null,
|
||||||
|
"_alignFlags": 45,
|
||||||
|
"_left": 0,
|
||||||
|
"_right": 0,
|
||||||
|
"_top": 0,
|
||||||
|
"_bottom": 0,
|
||||||
|
"_verticalCenter": 0,
|
||||||
|
"_horizontalCenter": 0,
|
||||||
|
"_isAbsLeft": true,
|
||||||
|
"_isAbsRight": true,
|
||||||
|
"_isAbsTop": true,
|
||||||
|
"_isAbsBottom": true,
|
||||||
|
"_isAbsHorizontalCenter": true,
|
||||||
|
"_isAbsVerticalCenter": true,
|
||||||
|
"_originalWidth": 100,
|
||||||
|
"_originalHeight": 40,
|
||||||
|
"_id": "5fVLGAIhROj6UDGotnneup"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__type__": "cc.Node",
|
||||||
|
"_name": "JoystickBG",
|
||||||
|
"_objFlags": 0,
|
||||||
|
"_parent": {
|
||||||
|
"__id__": 7
|
||||||
|
},
|
||||||
|
"_children": [
|
||||||
|
{
|
||||||
|
"__id__": 22
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"_active": true,
|
||||||
|
"_components": [
|
||||||
|
{
|
||||||
|
"__id__": 24
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__id__": 25
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"_prefab": null,
|
||||||
|
"_opacity": 255,
|
||||||
|
"_color": {
|
||||||
|
"__type__": "cc.Color",
|
||||||
|
"r": 255,
|
||||||
|
"g": 255,
|
||||||
|
"b": 255,
|
||||||
|
"a": 255
|
||||||
|
},
|
||||||
|
"_contentSize": {
|
||||||
|
"__type__": "cc.Size",
|
||||||
|
"width": 400,
|
||||||
|
"height": 400
|
||||||
|
},
|
||||||
|
"_anchorPoint": {
|
||||||
|
"__type__": "cc.Vec2",
|
||||||
|
"x": 0.5,
|
||||||
|
"y": 0.5
|
||||||
|
},
|
||||||
|
"_trs": {
|
||||||
|
"__type__": "TypedArray",
|
||||||
|
"ctor": "Float64Array",
|
||||||
|
"array": [
|
||||||
|
-380,
|
||||||
|
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": "88u3wQvvdO8pbrNWhs3ifP"
|
"_id": "88u3wQvvdO8pbrNWhs3ifP"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -679,13 +1061,13 @@
|
|||||||
"_name": "Joystick",
|
"_name": "Joystick",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
"_parent": {
|
"_parent": {
|
||||||
"__id__": 13
|
"__id__": 21
|
||||||
},
|
},
|
||||||
"_children": [],
|
"_children": [],
|
||||||
"_active": true,
|
"_active": true,
|
||||||
"_components": [
|
"_components": [
|
||||||
{
|
{
|
||||||
"__id__": 15
|
"__id__": 23
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"_prefab": null,
|
"_prefab": null,
|
||||||
@@ -741,7 +1123,7 @@
|
|||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 14
|
"__id__": 22
|
||||||
},
|
},
|
||||||
"_enabled": true,
|
"_enabled": true,
|
||||||
"_materials": [
|
"_materials": [
|
||||||
@@ -775,7 +1157,7 @@
|
|||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 13
|
"__id__": 21
|
||||||
},
|
},
|
||||||
"_enabled": true,
|
"_enabled": true,
|
||||||
"_materials": [
|
"_materials": [
|
||||||
@@ -809,7 +1191,7 @@
|
|||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 13
|
"__id__": 21
|
||||||
},
|
},
|
||||||
"_enabled": true,
|
"_enabled": true,
|
||||||
"alignMode": 0,
|
"alignMode": 0,
|
||||||
@@ -944,10 +1326,10 @@
|
|||||||
"__id__": 3
|
"__id__": 3
|
||||||
},
|
},
|
||||||
"stickhead": {
|
"stickhead": {
|
||||||
"__id__": 14
|
"__id__": 22
|
||||||
},
|
},
|
||||||
"base": {
|
"base": {
|
||||||
"__id__": 13
|
"__id__": 21
|
||||||
},
|
},
|
||||||
"joyStickEps": 0.1,
|
"joyStickEps": 0.1,
|
||||||
"magicLeanLowerBound": 0.414,
|
"magicLeanLowerBound": 0.414,
|
||||||
@@ -967,6 +1349,12 @@
|
|||||||
},
|
},
|
||||||
"linearMovingEps": 0.1,
|
"linearMovingEps": 0.1,
|
||||||
"scaleByEps": 0.0375,
|
"scaleByEps": 0.0375,
|
||||||
|
"btnA": {
|
||||||
|
"__id__": 13
|
||||||
|
},
|
||||||
|
"btnB": {
|
||||||
|
"__id__": 17
|
||||||
|
},
|
||||||
"_id": "e9oVYTr7ROlpp/IrNjBUmR"
|
"_id": "e9oVYTr7ROlpp/IrNjBUmR"
|
||||||
}
|
}
|
||||||
]
|
]
|
@@ -98,7 +98,7 @@ cc.Class({
|
|||||||
}
|
}
|
||||||
|
|
||||||
let newCharacterState = rdfPlayer.characterState;
|
let newCharacterState = rdfPlayer.characterState;
|
||||||
const newAnimName = window.ATK_CHARACTER_STATE_ARR[newCharacterState][1];
|
let newAnimName = window.ATK_CHARACTER_STATE_ARR[newCharacterState][1];
|
||||||
let playingAnimName = null;
|
let playingAnimName = null;
|
||||||
let underlyingAnimationCtrl = null;
|
let underlyingAnimationCtrl = null;
|
||||||
|
|
||||||
|
@@ -11,6 +11,7 @@ window.ALL_MAP_STATES = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
window.ALL_BATTLE_STATES = {
|
window.ALL_BATTLE_STATES = {
|
||||||
|
NONE: -1,
|
||||||
WAITING: 0,
|
WAITING: 0,
|
||||||
IN_BATTLE: 1,
|
IN_BATTLE: 1,
|
||||||
IN_SETTLEMENT: 2,
|
IN_SETTLEMENT: 2,
|
||||||
@@ -98,6 +99,9 @@ cc.Class({
|
|||||||
bulletTriggerEnabled: {
|
bulletTriggerEnabled: {
|
||||||
default: false
|
default: false
|
||||||
},
|
},
|
||||||
|
closeOnForcedtoResyncNotSelf: {
|
||||||
|
default: true
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
_inputFrameIdDebuggable(inputFrameId) {
|
_inputFrameIdDebuggable(inputFrameId) {
|
||||||
@@ -121,7 +125,8 @@ cc.Class({
|
|||||||
return (confirmedList + 1) == (1 << this.playerRichInfoDict.size);
|
return (confirmedList + 1) == (1 << this.playerRichInfoDict.size);
|
||||||
},
|
},
|
||||||
|
|
||||||
_generateInputFrameUpsync(inputFrameId) {
|
getOrPrefabInputFrameUpsync(inputFrameId) {
|
||||||
|
// TODO: find some kind of synchronization mechanism against "onInputFrameDownsyncBatch"!
|
||||||
const self = this;
|
const self = this;
|
||||||
if (
|
if (
|
||||||
null == self.ctrl ||
|
null == self.ctrl ||
|
||||||
@@ -133,28 +138,27 @@ cc.Class({
|
|||||||
let previousSelfInput = null,
|
let previousSelfInput = null,
|
||||||
currSelfInput = null;
|
currSelfInput = null;
|
||||||
const joinIndex = self.selfPlayerInfo.joinIndex;
|
const joinIndex = self.selfPlayerInfo.joinIndex;
|
||||||
// [WARNING] The while-loop here handles a situation where the "resync rdf & accompaniedInputFrameDownsyncBatch" mismatched and we have to predict some "gap-inputFrames"!
|
const existingInputFrame = self.recentInputCache.getByFrameId(inputFrameId);
|
||||||
while (self.recentInputCache.edFrameId <= inputFrameId) {
|
const previousInputFrameDownsyncWithPrediction = self.getCachedInputFrameDownsyncWithPrediction(inputFrameId - 1);
|
||||||
// TODO: find some kind of synchronization mechanism against "onInputFrameDownsyncBatch"!
|
previousSelfInput = (null == previousInputFrameDownsyncWithPrediction ? null : previousInputFrameDownsyncWithPrediction.inputList[joinIndex - 1]);
|
||||||
const previousInputFrameDownsyncWithPrediction = self.getCachedInputFrameDownsyncWithPrediction(inputFrameId - 1);
|
if (null != existingInputFrame) {
|
||||||
previousSelfInput = (null == previousInputFrameDownsyncWithPrediction ? null : previousInputFrameDownsyncWithPrediction.inputList[joinIndex - 1]);
|
// This could happen upon either [type#1] or [type#2] forceConfirmation, where "refRenderFrame" is accompanied by some "inputFrameDownsyncs". The check here also guarantees that we don't override history
|
||||||
|
console.log(`noDelayInputFrameId=${inputFrameId} already exists in recentInputCache: recentInputCache=${self._stringifyRecentInputCache(false)}`);
|
||||||
|
return [previousSelfInput, existingInputFrame.inputList[joinIndex - 1]];
|
||||||
|
}
|
||||||
|
|
||||||
// If "forceConfirmation" is active on backend, there's a chance that the already downsynced "inputFrameDownsync"s are ahead of a locally generating inputFrameId, in this case we respect the downsynced one.
|
const prefabbedInputList = (null == previousInputFrameDownsyncWithPrediction ? new Array(self.playerRichInfoDict.size).fill(0) : previousInputFrameDownsyncWithPrediction.inputList.slice());
|
||||||
const existingInputFrame = self.recentInputCache.getByFrameId(inputFrameId);
|
currSelfInput = self.ctrl.getEncodedInput(); // When "null == existingInputFrame", it'd be safe to say that the realtime "self.ctrl.getEncodedInput()" is for the requested "inputFrameId"
|
||||||
if (null != existingInputFrame && self._allConfirmed(existingInputFrame.confirmedList)) {
|
prefabbedInputList[(joinIndex - 1)] = currSelfInput;
|
||||||
console.log(`noDelayInputFrameId=${inputFrameId} already exists in recentInputCache and is all-confirmed: recentInputCache=${self._stringifyRecentInputCache(false)}`);
|
while (self.recentInputCache.edFrameId <= inputFrameId) {
|
||||||
return [previousSelfInput, existingInputFrame.inputList[joinIndex - 1]];
|
// Fill the gap
|
||||||
}
|
|
||||||
const prefabbedInputList = (null == previousInputFrameDownsyncWithPrediction ? new Array(self.playerRichInfoDict.size).fill(0) : previousInputFrameDownsyncWithPrediction.inputList.slice());
|
|
||||||
currSelfInput = self.ctrl.getEncodedInput();
|
|
||||||
prefabbedInputList[(joinIndex - 1)] = currSelfInput;
|
|
||||||
const prefabbedInputFrameDownsync = window.pb.protos.InputFrameDownsync.create({
|
const prefabbedInputFrameDownsync = window.pb.protos.InputFrameDownsync.create({
|
||||||
inputFrameId: self.recentInputCache.edFrameId,
|
inputFrameId: self.recentInputCache.edFrameId,
|
||||||
inputList: prefabbedInputList,
|
inputList: prefabbedInputList,
|
||||||
confirmedList: (1 << (self.selfPlayerInfo.joinIndex - 1))
|
confirmedList: (1 << (self.selfPlayerInfo.joinIndex - 1))
|
||||||
});
|
});
|
||||||
|
|
||||||
self.recentInputCache.put(prefabbedInputFrameDownsync); // A prefabbed inputFrame, would certainly be adding a new inputFrame to the cache, because server only downsyncs "all-confirmed inputFrames"
|
self.recentInputCache.put(prefabbedInputFrameDownsync);
|
||||||
}
|
}
|
||||||
|
|
||||||
return [previousSelfInput, currSelfInput];
|
return [previousSelfInput, currSelfInput];
|
||||||
@@ -200,7 +204,6 @@ cc.Class({
|
|||||||
playerId: self.selfPlayerInfo.id,
|
playerId: self.selfPlayerInfo.id,
|
||||||
act: window.UPSYNC_MSG_ACT_PLAYER_CMD,
|
act: window.UPSYNC_MSG_ACT_PLAYER_CMD,
|
||||||
joinIndex: self.selfPlayerInfo.joinIndex,
|
joinIndex: self.selfPlayerInfo.joinIndex,
|
||||||
ackingFrameId: self.lastAllConfirmedRenderFrameId,
|
|
||||||
ackingInputFrameId: self.lastAllConfirmedInputFrameId,
|
ackingInputFrameId: self.lastAllConfirmedInputFrameId,
|
||||||
inputFrameUpsyncBatch: inputFrameUpsyncBatch,
|
inputFrameUpsyncBatch: inputFrameUpsyncBatch,
|
||||||
}).finish();
|
}).finish();
|
||||||
@@ -222,15 +225,19 @@ cc.Class({
|
|||||||
onDestroy() {
|
onDestroy() {
|
||||||
const self = this;
|
const self = this;
|
||||||
console.warn("+++++++ Map onDestroy()");
|
console.warn("+++++++ Map onDestroy()");
|
||||||
if (null == self.battleState || ALL_BATTLE_STATES.WAITING == self.battleState) {
|
if (null == self.battleState || ALL_BATTLE_STATES.IN_BATTLE != self.battleState) {
|
||||||
window.clearBoundRoomIdInBothVolatileAndPersistentStorage();
|
window.clearBoundRoomIdInBothVolatileAndPersistentStorage();
|
||||||
}
|
}
|
||||||
if (null != window.handleBattleColliderInfo) {
|
if (null != window.handleBattleColliderInfo) {
|
||||||
window.handleBattleColliderInfo = null;
|
window.handleBattleColliderInfo = null;
|
||||||
}
|
}
|
||||||
if (null != window.handleClientSessionError) {
|
},
|
||||||
window.handleClientSessionError = null;
|
|
||||||
}
|
onManualRejoinRequired(labelString) {
|
||||||
|
const self = this;
|
||||||
|
self.battleState = ALL_BATTLE_STATES.NONE; // Effectively stops "update(dt)"
|
||||||
|
self.showPopupInCanvas(self.gameRuleNode);
|
||||||
|
self.popupSimplePressToGo(labelString, false);
|
||||||
},
|
},
|
||||||
|
|
||||||
popupSimplePressToGo(labelString, hideYesButton) {
|
popupSimplePressToGo(labelString, hideYesButton) {
|
||||||
@@ -288,10 +295,9 @@ cc.Class({
|
|||||||
|
|
||||||
self.renderFrameId = 0; // After battle started
|
self.renderFrameId = 0; // After battle started
|
||||||
self.bulletBattleLocalIdCounter = 0;
|
self.bulletBattleLocalIdCounter = 0;
|
||||||
self.lastAllConfirmedRenderFrameId = -1;
|
|
||||||
self.lastAllConfirmedInputFrameId = -1;
|
self.lastAllConfirmedInputFrameId = -1;
|
||||||
self.lastUpsyncInputFrameId = -1;
|
self.lastUpsyncInputFrameId = -1;
|
||||||
self.chaserRenderFrameId = -1; // at any moment, "lastAllConfirmedRenderFrameId <= chaserRenderFrameId <= renderFrameId", but "chaserRenderFrameId" would fluctuate according to "onInputFrameDownsyncBatch"
|
self.chaserRenderFrameId = -1; // at any moment, "chaserRenderFrameId <= renderFrameId", but "chaserRenderFrameId" would fluctuate according to "onInputFrameDownsyncBatch"
|
||||||
|
|
||||||
self.recentRenderCache = new RingBuffer(self.renderCacheSize);
|
self.recentRenderCache = new RingBuffer(self.renderCacheSize);
|
||||||
|
|
||||||
@@ -310,6 +316,8 @@ cc.Class({
|
|||||||
|
|
||||||
self.battleState = ALL_BATTLE_STATES.WAITING;
|
self.battleState = ALL_BATTLE_STATES.WAITING;
|
||||||
|
|
||||||
|
self.othersForcedDownsyncRenderFrameDict = new Map();
|
||||||
|
|
||||||
self.countdownNanos = null;
|
self.countdownNanos = null;
|
||||||
if (self.countdownLabel) {
|
if (self.countdownLabel) {
|
||||||
self.countdownLabel.string = "";
|
self.countdownLabel.string = "";
|
||||||
@@ -334,20 +342,9 @@ cc.Class({
|
|||||||
self.showCriticalCoordinateLabels = false;
|
self.showCriticalCoordinateLabels = false;
|
||||||
|
|
||||||
console.warn("+++++++ Map onLoad()");
|
console.warn("+++++++ Map onLoad()");
|
||||||
window.handleClientSessionError = function() {
|
|
||||||
console.warn('+++++++ Common handleClientSessionError()');
|
|
||||||
|
|
||||||
if (ALL_BATTLE_STATES.IN_SETTLEMENT == self.battleState) {
|
|
||||||
console.log("Battled ended by settlement");
|
|
||||||
} else {
|
|
||||||
console.warn("Connection lost, going back to login page");
|
|
||||||
window.clearLocalStorageAndBackToLoginScene(true);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const mapNode = self.node;
|
const mapNode = self.node;
|
||||||
const canvasNode = mapNode.parent;
|
const canvasNode = mapNode.parent;
|
||||||
cc.director.getCollisionManager().enabled = false;
|
|
||||||
// self.musicEffectManagerScriptIns = self.node.getComponent("MusicEffectManager");
|
// self.musicEffectManagerScriptIns = self.node.getComponent("MusicEffectManager");
|
||||||
self.musicEffectManagerScriptIns = null;
|
self.musicEffectManagerScriptIns = null;
|
||||||
|
|
||||||
@@ -580,6 +577,7 @@ cc.Class({
|
|||||||
onRoomDownsyncFrame(rdf, accompaniedInputFrameDownsyncBatch) {
|
onRoomDownsyncFrame(rdf, accompaniedInputFrameDownsyncBatch) {
|
||||||
// This function is also applicable to "re-joining".
|
// This function is also applicable to "re-joining".
|
||||||
const self = window.mapIns;
|
const self = window.mapIns;
|
||||||
|
self.onInputFrameDownsyncBatch(accompaniedInputFrameDownsyncBatch); // Important to do this step before setting IN_BATTLE
|
||||||
if (!self.recentRenderCache) {
|
if (!self.recentRenderCache) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -587,16 +585,27 @@ cc.Class({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const shouldForceDumping1 = (window.MAGIC_ROOM_DOWNSYNC_FRAME_ID.BATTLE_START == rdf.id);
|
const shouldForceDumping1 = (window.MAGIC_ROOM_DOWNSYNC_FRAME_ID.BATTLE_START == rdf.id);
|
||||||
const shouldForceDumping2 = (rdf.id > self.renderFrameId + self.renderFrameIdLagTolerance);
|
let shouldForceDumping2 = (rdf.id >= self.renderFrameId + self.renderFrameIdLagTolerance);
|
||||||
|
let shouldForceResync = rdf.shouldForceResync;
|
||||||
const [dumpRenderCacheRet, oldStRenderFrameId, oldEdRenderFrameId] = (shouldForceDumping1 || shouldForceDumping2) ? self.recentRenderCache.setByFrameId(rdf, rdf.id) : [window.RING_BUFF_CONSECUTIVE_SET, null, null];
|
const notSelfUnconfirmed = (0 == (rdf.backendUnconfirmedMask & (1 << (self.selfPlayerInfo.joinIndex - 1))));
|
||||||
if (window.RING_BUFF_FAILED_TO_SET == dumpRenderCacheRet) {
|
if (notSelfUnconfirmed) {
|
||||||
throw `Failed to dump render cache#1 (maybe recentRenderCache too small)! rdf.id=${rdf.id}, lastAllConfirmedRenderFrameId=${self.lastAllConfirmedRenderFrameId}, lastAllConfirmedInputFrameId=${self.lastAllConfirmedInputFrameId}; recentRenderCache=${self._stringifyRecentRenderCache(false)}, recentInputCache=${self._stringifyRecentInputCache(false)}`;
|
shouldForceDumping2 = false;
|
||||||
|
shouldForceResync = false;
|
||||||
|
self.othersForcedDownsyncRenderFrameDict.set(rdf.id, rdf);
|
||||||
}
|
}
|
||||||
if (window.MAGIC_ROOM_DOWNSYNC_FRAME_ID.BATTLE_START < rdf.id && window.RING_BUFF_CONSECUTIVE_SET == dumpRenderCacheRet) {
|
/*
|
||||||
|
TODO
|
||||||
|
|
||||||
|
If "BackendUnconfirmedMask" is non-all-1 and contains the current player, show a label/button to hint manual reconnection. Note that the continuity of "recentInputCache" is not a good indicator, because due to network delay upon a [type#1 forceConfirmation] a player might just lag in upsync networking and have all consecutive inputFrameIds locally.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const [dumpRenderCacheRet, oldStRenderFrameId, oldEdRenderFrameId] = (shouldForceDumping1 || shouldForceDumping2 || shouldForceResync) ? self.recentRenderCache.setByFrameId(rdf, rdf.id) : [window.RING_BUFF_CONSECUTIVE_SET, null, null];
|
||||||
|
if (window.RING_BUFF_FAILED_TO_SET == dumpRenderCacheRet) {
|
||||||
|
throw `Failed to dump render cache#1 (maybe recentRenderCache too small)! rdf.id=${rdf.id}, lastAllConfirmedInputFrameId=${self.lastAllConfirmedInputFrameId}; recentRenderCache=${self._stringifyRecentRenderCache(false)}, recentInputCache=${self._stringifyRecentInputCache(false)}`;
|
||||||
|
}
|
||||||
|
if (!shouldForceResync && (window.MAGIC_ROOM_DOWNSYNC_FRAME_ID.BATTLE_START < rdf.id && window.RING_BUFF_CONSECUTIVE_SET == dumpRenderCacheRet)) {
|
||||||
/*
|
/*
|
||||||
Don't change
|
Don't change
|
||||||
- lastAllConfirmedRenderFrameId, it's updated only in "rollbackAndChase" (except for when RING_BUFF_NON_CONSECUTIVE_SET)
|
|
||||||
- chaserRenderFrameId, it's updated only in "rollbackAndChase & onInputFrameDownsyncBatch" (except for when RING_BUFF_NON_CONSECUTIVE_SET)
|
- chaserRenderFrameId, it's updated only in "rollbackAndChase & onInputFrameDownsyncBatch" (except for when RING_BUFF_NON_CONSECUTIVE_SET)
|
||||||
*/
|
*/
|
||||||
return dumpRenderCacheRet;
|
return dumpRenderCacheRet;
|
||||||
@@ -614,21 +623,19 @@ cc.Class({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (null == self.renderFrameId || self.renderFrameId <= rdf.id) {
|
if (shouldForceDumping1 || shouldForceDumping2 || shouldForceResync) {
|
||||||
// In fact, not having "window.RING_BUFF_CONSECUTIVE_SET == dumpRenderCacheRet" should already imply that "self.renderFrameId <= rdf.id", but here we double check and log the anomaly
|
// In fact, not having "window.RING_BUFF_CONSECUTIVE_SET == dumpRenderCacheRet" should already imply that "self.renderFrameId <= rdf.id", but here we double check and log the anomaly
|
||||||
|
|
||||||
if (window.MAGIC_ROOM_DOWNSYNC_FRAME_ID.BATTLE_START == rdf.id) {
|
if (window.MAGIC_ROOM_DOWNSYNC_FRAME_ID.BATTLE_START == rdf.id) {
|
||||||
console.log('On battle started! renderFrameId=', rdf.id);
|
console.log('On battle started! renderFrameId=', rdf.id);
|
||||||
} else {
|
} else {
|
||||||
self.hideFindingPlayersGUI(rdf);
|
self.hideFindingPlayersGUI(rdf);
|
||||||
self.onInputFrameDownsyncBatch(accompaniedInputFrameDownsyncBatch); // Important to do this step before setting IN_BATTLE
|
console.warn(`Got resync@localRenderFrameId=${self.renderFrameId} -> rdf.id=${rdf.id} & rdf.backendUnconfirmedMask=${rdf.backendUnconfirmedMask}, @lastAllConfirmedInputFrameId=${self.lastAllConfirmedInputFrameId}, @chaserRenderFrameId=${self.chaserRenderFrameId}, @localRecentInputCache=${mapIns._stringifyRecentInputCache(false)}`);
|
||||||
console.warn(`Got resync@localRenderFrameId=${self.renderFrameId} -> rdf.id=${rdf.id} & rdf.backendUnconfirmedMask=${rdf.backendUnconfirmedMask}, @lastAllConfirmedRenderFrameId=${self.lastAllConfirmedRenderFrameId}, @lastAllConfirmedInputFrameId=${self.lastAllConfirmedInputFrameId}, @chaserRenderFrameId=${self.chaserRenderFrameId}, @localRecentInputCache=${mapIns._stringifyRecentInputCache(false)}`);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
self.renderFrameId = rdf.id;
|
self.renderFrameId = rdf.id;
|
||||||
self.lastRenderFrameIdTriggeredAt = performance.now();
|
self.lastRenderFrameIdTriggeredAt = performance.now();
|
||||||
// In this case it must be true that "rdf.id > chaserRenderFrameId >= lastAllConfirmedRenderFrameId".
|
// In this case it must be true that "rdf.id > chaserRenderFrameId".
|
||||||
self.lastAllConfirmedRenderFrameId = rdf.id;
|
|
||||||
self.chaserRenderFrameId = rdf.id;
|
self.chaserRenderFrameId = rdf.id;
|
||||||
const candidateLastAllConfirmedInputFrame = self._convertToInputFrameId(rdf.id - 1, self.inputDelayFrames);
|
const candidateLastAllConfirmedInputFrame = self._convertToInputFrameId(rdf.id - 1, self.inputDelayFrames);
|
||||||
if (self.lastAllConfirmedInputFrame < candidateLastAllConfirmedInputFrame) {
|
if (self.lastAllConfirmedInputFrame < candidateLastAllConfirmedInputFrame) {
|
||||||
@@ -666,8 +673,45 @@ cc.Class({
|
|||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
equalPlayers(lhs, rhs) {
|
||||||
|
if (null == lhs || null == rhs) return false;
|
||||||
|
if (lhs.virtualGridX != rhs.virtualGridX) return false;
|
||||||
|
if (lhs.virtualGridY != rhs.virtualGridY) return false;
|
||||||
|
if (lhs.dirX != rhs.dirX) return false;
|
||||||
|
if (lhs.dirY != rhs.dirY) return false;
|
||||||
|
if (lhs.velX != rhs.velX) return false;
|
||||||
|
if (lhs.velY != rhs.velY) return false;
|
||||||
|
if (lhs.speed != rhs.speed) return false;
|
||||||
|
if (lhs.framesToRecover != rhs.framesToRecover) return false;
|
||||||
|
if (lhs.hp != rhs.hp) return false;
|
||||||
|
if (lhs.maxHp != rhs.maxHp) return false;
|
||||||
|
if (lhs.characterState != rhs.characterState) return false;
|
||||||
|
if (lhs.inAir != rhs.inAir) return false;
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
equalMeleeBullets(lhs, rhs) {
|
||||||
|
if (null == lhs || null == rhs) return false;
|
||||||
|
if (lhs.battleLocalId != rhs.battleLocalId) return false;
|
||||||
|
if (lhs.offenderPlayerId != rhs.offenderPlayerId) return false;
|
||||||
|
if (lhs.offenderJoinIndex != rhs.offenderJoinIndex) return false;
|
||||||
|
if (lhs.originatedRenderFrameId != rhs.originatedRenderFrameId) return false;
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
equalRoomDownsyncFrames(lhs, rhs) {
|
||||||
|
if (null == lhs || null == rhs) return false;
|
||||||
|
for (let k in lhs.players) {
|
||||||
|
if (!this.equalPlayers(lhs.players[k], rhs.players[k])) return false;
|
||||||
|
}
|
||||||
|
for (let k in lhs.meleeBullets) {
|
||||||
|
if (!this.equalMeleeBullets(lhs.meleeBullets[k], rhs.meleeBullets[k])) return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
onInputFrameDownsyncBatch(batch) {
|
onInputFrameDownsyncBatch(batch) {
|
||||||
// TODO: find some kind of synchronization mechanism against "_generateInputFrameUpsync"!
|
// TODO: find some kind of synchronization mechanism against "getOrPrefabInputFrameUpsync"!
|
||||||
const self = this;
|
const self = this;
|
||||||
if (!self.recentInputCache) {
|
if (!self.recentInputCache) {
|
||||||
return;
|
return;
|
||||||
@@ -680,9 +724,10 @@ cc.Class({
|
|||||||
for (let k in batch) {
|
for (let k in batch) {
|
||||||
const inputFrameDownsync = batch[k];
|
const inputFrameDownsync = batch[k];
|
||||||
const inputFrameDownsyncId = inputFrameDownsync.inputFrameId;
|
const inputFrameDownsyncId = inputFrameDownsync.inputFrameId;
|
||||||
if (inputFrameDownsyncId < self.lastAllConfirmedInputFrameId) {
|
if (inputFrameDownsyncId <= self.lastAllConfirmedInputFrameId) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
// [WARNING] Take all "inputFrameDownsync" from backend as all-confirmed, it'll be later checked by "rollbackAndChase".
|
||||||
self.lastAllConfirmedInputFrameId = inputFrameDownsyncId;
|
self.lastAllConfirmedInputFrameId = inputFrameDownsyncId;
|
||||||
const localInputFrame = self.recentInputCache.getByFrameId(inputFrameDownsyncId);
|
const localInputFrame = self.recentInputCache.getByFrameId(inputFrameDownsyncId);
|
||||||
if (null != localInputFrame
|
if (null != localInputFrame
|
||||||
@@ -693,11 +738,10 @@ cc.Class({
|
|||||||
) {
|
) {
|
||||||
firstPredictedYetIncorrectInputFrameId = inputFrameDownsyncId;
|
firstPredictedYetIncorrectInputFrameId = inputFrameDownsyncId;
|
||||||
}
|
}
|
||||||
// [WARNING] Take all "inputFrameDownsync" from backend as all-confirmed, it'll be later checked by "rollbackAndChase".
|
|
||||||
inputFrameDownsync.confirmedList = (1 << self.playerRichInfoDict.size) - 1;
|
inputFrameDownsync.confirmedList = (1 << self.playerRichInfoDict.size) - 1;
|
||||||
const [ret, oldStFrameId, oldEdFrameId] = self.recentInputCache.setByFrameId(inputFrameDownsync, inputFrameDownsync.inputFrameId);
|
const [ret, oldStFrameId, oldEdFrameId] = self.recentInputCache.setByFrameId(inputFrameDownsync, inputFrameDownsync.inputFrameId);
|
||||||
if (window.RING_BUFF_FAILED_TO_SET == ret) {
|
if (window.RING_BUFF_FAILED_TO_SET == ret) {
|
||||||
throw `Failed to dump input cache (maybe recentInputCache too small)! inputFrameDownsync.inputFrameId=${inputFrameDownsync.inputFrameId}, lastAllConfirmedRenderFrameId=${self.lastAllConfirmedRenderFrameId}, lastAllConfirmedInputFrameId=${self.lastAllConfirmedInputFrameId}; recentRenderCache=${self._stringifyRecentRenderCache(false)}, recentInputCache=${self._stringifyRecentInputCache(false)}`;
|
throw `Failed to dump input cache (maybe recentInputCache too small)! inputFrameDownsync.inputFrameId=${inputFrameDownsync.inputFrameId}, lastAllConfirmedInputFrameId=${self.lastAllConfirmedInputFrameId}; recentRenderCache=${self._stringifyRecentRenderCache(false)}, recentInputCache=${self._stringifyRecentInputCache(false)}`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -711,8 +755,6 @@ cc.Class({
|
|||||||
/*
|
/*
|
||||||
A typical case is as follows.
|
A typical case is as follows.
|
||||||
--------------------------------------------------------
|
--------------------------------------------------------
|
||||||
[self.lastAllConfirmedRenderFrameId] : 22
|
|
||||||
|
|
||||||
<renderFrameId1> : 36
|
<renderFrameId1> : 36
|
||||||
|
|
||||||
|
|
||||||
@@ -722,7 +764,8 @@ cc.Class({
|
|||||||
--------------------------------------------------------
|
--------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
// The actual rollback-and-chase would later be executed in update(dt).
|
// The actual rollback-and-chase would later be executed in update(dt).
|
||||||
console.warn(`Mismatched input detected, resetting chaserRenderFrameId: ${self.chaserRenderFrameId}->${renderFrameId1} by firstPredictedYetIncorrectInputFrameId: ${inputFrameId1}`);
|
console.warn(`Mismatched input detected, resetting chaserRenderFrameId: ${self.chaserRenderFrameId}->${renderFrameId1} by firstPredictedYetIncorrectInputFrameId: ${inputFrameId1}
|
||||||
|
lastAllConfirmedInputFrameId=${self.lastAllConfirmedInputFrameId}`);
|
||||||
self.chaserRenderFrameId = renderFrameId1;
|
self.chaserRenderFrameId = renderFrameId1;
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -739,7 +782,7 @@ cc.Class({
|
|||||||
logBattleStats() {
|
logBattleStats() {
|
||||||
const self = this;
|
const self = this;
|
||||||
let s = [];
|
let s = [];
|
||||||
s.push(`Battle stats: renderFrameId=${self.renderFrameId}, lastAllConfirmedRenderFrameId=${self.lastAllConfirmedRenderFrameId}, lastUpsyncInputFrameId=${self.lastUpsyncInputFrameId}, lastAllConfirmedInputFrameId=${self.lastAllConfirmedInputFrameId}, chaserRenderFrameId=${self.chaserRenderFrameId}; recentRenderCache=${self._stringifyRecentRenderCache(false)}, recentInputCache=${self._stringifyRecentInputCache(false)}`);
|
s.push(`Battle stats: renderFrameId=${self.renderFrameId}, lastUpsyncInputFrameId=${self.lastUpsyncInputFrameId}, lastAllConfirmedInputFrameId=${self.lastAllConfirmedInputFrameId}, chaserRenderFrameId=${self.chaserRenderFrameId}; recentRenderCache=${self._stringifyRecentRenderCache(false)}, recentInputCache=${self._stringifyRecentInputCache(false)}`);
|
||||||
|
|
||||||
for (let i = self.recentInputCache.stFrameId; i < self.recentInputCache.edFrameId; ++i) {
|
for (let i = self.recentInputCache.stFrameId; i < self.recentInputCache.edFrameId; ++i) {
|
||||||
const inputFrameDownsync = self.recentInputCache.getByFrameId(i);
|
const inputFrameDownsync = self.recentInputCache.getByFrameId(i);
|
||||||
@@ -754,6 +797,8 @@ cc.Class({
|
|||||||
if (ALL_BATTLE_STATES.IN_BATTLE != self.battleState) {
|
if (ALL_BATTLE_STATES.IN_BATTLE != self.battleState) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
window.closeWSConnection(constants.RET_CODE.BATTLE_STOPPED);
|
||||||
|
self.battleState = ALL_BATTLE_STATES.IN_SETTLEMENT;
|
||||||
self.countdownNanos = null;
|
self.countdownNanos = null;
|
||||||
self.logBattleStats();
|
self.logBattleStats();
|
||||||
if (self.musicEffectManagerScriptIns) {
|
if (self.musicEffectManagerScriptIns) {
|
||||||
@@ -764,7 +809,6 @@ cc.Class({
|
|||||||
const resultPanelScriptIns = resultPanelNode.getComponent("ResultPanel");
|
const resultPanelScriptIns = resultPanelNode.getComponent("ResultPanel");
|
||||||
resultPanelScriptIns.showPlayerInfo(self.playerRichInfoDict);
|
resultPanelScriptIns.showPlayerInfo(self.playerRichInfoDict);
|
||||||
window.clearBoundRoomIdInBothVolatileAndPersistentStorage();
|
window.clearBoundRoomIdInBothVolatileAndPersistentStorage();
|
||||||
self.battleState = ALL_BATTLE_STATES.IN_SETTLEMENT;
|
|
||||||
self.showPopupInCanvas(resultPanelNode);
|
self.showPopupInCanvas(resultPanelNode);
|
||||||
|
|
||||||
// Clear player info
|
// Clear player info
|
||||||
@@ -778,7 +822,7 @@ cc.Class({
|
|||||||
if (1 == joinIndex) {
|
if (1 == joinIndex) {
|
||||||
playerScriptIns.setSpecies("SoldierWaterGhost");
|
playerScriptIns.setSpecies("SoldierWaterGhost");
|
||||||
} else if (2 == joinIndex) {
|
} else if (2 == joinIndex) {
|
||||||
playerScriptIns.setSpecies("SoldierFireGhostFrameAnim");
|
playerScriptIns.setSpecies("UltramanTiga");
|
||||||
}
|
}
|
||||||
|
|
||||||
const [wx, wy] = self.virtualGridToWorldPos(vx, vy);
|
const [wx, wy] = self.virtualGridToWorldPos(vx, vy);
|
||||||
@@ -827,7 +871,7 @@ cc.Class({
|
|||||||
currSelfInput = null;
|
currSelfInput = null;
|
||||||
const noDelayInputFrameId = self._convertToInputFrameId(self.renderFrameId, 0); // It's important that "inputDelayFrames == 0" here
|
const noDelayInputFrameId = self._convertToInputFrameId(self.renderFrameId, 0); // It's important that "inputDelayFrames == 0" here
|
||||||
if (self.shouldGenerateInputFrameUpsync(self.renderFrameId)) {
|
if (self.shouldGenerateInputFrameUpsync(self.renderFrameId)) {
|
||||||
[prevSelfInput, currSelfInput] = self._generateInputFrameUpsync(noDelayInputFrameId);
|
[prevSelfInput, currSelfInput] = self.getOrPrefabInputFrameUpsync(noDelayInputFrameId);
|
||||||
}
|
}
|
||||||
|
|
||||||
let t0 = performance.now();
|
let t0 = performance.now();
|
||||||
@@ -843,11 +887,16 @@ cc.Class({
|
|||||||
if (nextChaserRenderFrameId > self.renderFrameId) {
|
if (nextChaserRenderFrameId > self.renderFrameId) {
|
||||||
nextChaserRenderFrameId = self.renderFrameId;
|
nextChaserRenderFrameId = self.renderFrameId;
|
||||||
}
|
}
|
||||||
self.rollbackAndChase(prevChaserRenderFrameId, nextChaserRenderFrameId, self.collisionSys, self.collisionSysMap, true);
|
if (prevChaserRenderFrameId < nextChaserRenderFrameId) {
|
||||||
|
// Do not execute "rollbackAndChase" when "prevChaserRenderFrameId == nextChaserRenderFrameId", otherwise if "nextChaserRenderFrameId == self.renderFrameId" we'd be wasting computing power once.
|
||||||
|
self.rollbackAndChase(prevChaserRenderFrameId, nextChaserRenderFrameId, self.collisionSys, self.collisionSysMap, true);
|
||||||
|
}
|
||||||
let t2 = performance.now();
|
let t2 = performance.now();
|
||||||
|
|
||||||
// Inside the following "self.rollbackAndChase" actually ROLLS FORWARD w.r.t. the corresponding delayedInputFrame, REGARDLESS OF whether or not "self.chaserRenderFrameId == self.renderFrameId" now.
|
// Inside the following "self.rollbackAndChase" actually ROLLS FORWARD w.r.t. the corresponding delayedInputFrame, REGARDLESS OF whether or not "self.chaserRenderFrameId == self.renderFrameId" now.
|
||||||
const [prevRdf, rdf] = self.rollbackAndChase(self.renderFrameId, self.renderFrameId + 1, self.collisionSys, self.collisionSysMap, false);
|
const latestRdfResults = self.rollbackAndChase(self.renderFrameId, self.renderFrameId + 1, self.collisionSys, self.collisionSysMap, false);
|
||||||
|
let prevRdf = latestRdfResults[0],
|
||||||
|
rdf = latestRdfResults[1];
|
||||||
/*
|
/*
|
||||||
const nonTrivialChaseEnded = (prevChaserRenderFrameId < nextChaserRenderFrameId && nextChaserRenderFrameId == self.renderFrameId);
|
const nonTrivialChaseEnded = (prevChaserRenderFrameId < nextChaserRenderFrameId && nextChaserRenderFrameId == self.renderFrameId);
|
||||||
if (nonTrivialChaseEnded) {
|
if (nonTrivialChaseEnded) {
|
||||||
@@ -855,6 +904,20 @@ cc.Class({
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
// [WARNING] Don't try to get "prevRdf(i.e. renderFrameId == latest-1)" by "self.recentRenderCache.getByFrameId(...)" here, as the cache might have been updated by asynchronous "onRoomDownsyncFrame(...)" calls!
|
// [WARNING] Don't try to get "prevRdf(i.e. renderFrameId == latest-1)" by "self.recentRenderCache.getByFrameId(...)" here, as the cache might have been updated by asynchronous "onRoomDownsyncFrame(...)" calls!
|
||||||
|
if (self.othersForcedDownsyncRenderFrameDict.has(rdf.id)) {
|
||||||
|
const delayedInputFrameId = self._convertToInputFrameId(rdf.id, 0);
|
||||||
|
const othersForcedDownsyncRenderFrame = self.othersForcedDownsyncRenderFrameDict.get(rdf.id);
|
||||||
|
if (self.lastAllConfirmedInputFrameId >= delayedInputFrameId && !self.equalRoomDownsyncFrames(othersForcedDownsyncRenderFrame, rdf)) {
|
||||||
|
console.warn(`Mismatched render frame@rdf.id=${rdf.id} w/ inputFrameId=${delayedInputFrameId}, @lastAllConfirmedInputFrameId=${self.lastAllConfirmedInputFrameId}, @chaserRenderFrameId=${self.chaserRenderFrameId}:
|
||||||
|
rdf=${JSON.stringify(rdf)}
|
||||||
|
othersForcedDownsyncRenderFrame=${JSON.stringify(othersForcedDownsyncRenderFrame)}
|
||||||
|
recentRenderCache=${self._stringifyRecentRenderCache(true)}
|
||||||
|
recentInputCache=${self._stringifyRecentInputCache(true)}`);
|
||||||
|
closeWSConnection(constants.RET_CODE.CLIENT_MISMATCHED_RENDER_FRAME, "");
|
||||||
|
self.onManualRejoinRequired("[DEBUG] CLIENT_MISMATCHED_RENDER_FRAME");
|
||||||
|
rdf = othersForcedDownsyncRenderFrame;
|
||||||
|
}
|
||||||
|
}
|
||||||
self.applyRoomDownsyncFrameDynamics(rdf, prevRdf);
|
self.applyRoomDownsyncFrameDynamics(rdf, prevRdf);
|
||||||
self.showDebugBoundaries(rdf);
|
self.showDebugBoundaries(rdf);
|
||||||
++self.renderFrameId; // [WARNING] It's important to increment the renderFrameId AFTER all the operations above!!!
|
++self.renderFrameId; // [WARNING] It's important to increment the renderFrameId AFTER all the operations above!!!
|
||||||
@@ -940,6 +1003,7 @@ cc.Class({
|
|||||||
|
|
||||||
showPopupInCanvas(toShowNode) {
|
showPopupInCanvas(toShowNode) {
|
||||||
const self = this;
|
const self = this;
|
||||||
|
toShowNode.active = true;
|
||||||
self.disableInputControls();
|
self.disableInputControls();
|
||||||
self.transitToState(ALL_MAP_STATES.SHOWING_MODAL_POPUP);
|
self.transitToState(ALL_MAP_STATES.SHOWING_MODAL_POPUP);
|
||||||
safelyAddChild(self.widgetsAboveAllNode, toShowNode);
|
safelyAddChild(self.widgetsAboveAllNode, toShowNode);
|
||||||
@@ -1077,11 +1141,13 @@ cc.Class({
|
|||||||
getCachedInputFrameDownsyncWithPrediction(inputFrameId) {
|
getCachedInputFrameDownsyncWithPrediction(inputFrameId) {
|
||||||
const self = this;
|
const self = this;
|
||||||
const inputFrameDownsync = self.recentInputCache.getByFrameId(inputFrameId);
|
const inputFrameDownsync = self.recentInputCache.getByFrameId(inputFrameId);
|
||||||
const lastAllConfirmedInputFrame = self.recentInputCache.getByFrameId(self.lastAllConfirmedInputFrameId);
|
if (null != inputFrameDownsync && inputFrameId > self.lastAllConfirmedInputFrameId) {
|
||||||
if (null != inputFrameDownsync && null != lastAllConfirmedInputFrame && inputFrameId > self.lastAllConfirmedInputFrameId) {
|
const lastAllConfirmedInputFrame = self.recentInputCache.getByFrameId(self.lastAllConfirmedInputFrameId);
|
||||||
for (let i = 0; i < inputFrameDownsync.inputList.length; ++i) {
|
if (null != lastAllConfirmedInputFrame) {
|
||||||
if (i == (self.selfPlayerInfo.joinIndex - 1)) continue;
|
for (let i = 0; i < inputFrameDownsync.inputList.length; ++i) {
|
||||||
inputFrameDownsync.inputList[i] = (lastAllConfirmedInputFrame.inputList[i] & 15); // Don't predict attack input!
|
if (i == (self.selfPlayerInfo.joinIndex - 1)) continue;
|
||||||
|
inputFrameDownsync.inputList[i] = (lastAllConfirmedInputFrame.inputList[i] & 15); // Don't predict attack input!
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1322,13 +1388,17 @@ cc.Class({
|
|||||||
|
|
||||||
if (1 == joinIndex) {
|
if (1 == joinIndex) {
|
||||||
if (fallStopping) {
|
if (fallStopping) {
|
||||||
|
/*
|
||||||
console.info(`playerId=${playerId}, joinIndex=${thatPlayerInNextFrame.joinIndex} fallStopping#1:
|
console.info(`playerId=${playerId}, joinIndex=${thatPlayerInNextFrame.joinIndex} fallStopping#1:
|
||||||
{renderFrame.id: ${currRenderFrame.id}, possiblyFallStoppedOnAnotherPlayer: ${possiblyFallStoppedOnAnotherPlayer}}
|
{renderFrame.id: ${currRenderFrame.id}, possiblyFallStoppedOnAnotherPlayer: ${possiblyFallStoppedOnAnotherPlayer}}
|
||||||
playerColliderPos=${self.stringifyColliderCenterInWorld(playerCollider, halfColliderWidth, halfColliderHeight, topPadding, bottomPadding, leftPadding, rightPadding)}, effPushback={${effPushbacks[joinIndex - 1][0].toFixed(3)}, ${effPushbacks[joinIndex - 1][1].toFixed(3)}}, overlayMag=${result.overlap.toFixed(4)}`);
|
playerColliderPos=${self.stringifyColliderCenterInWorld(playerCollider, halfColliderWidth, halfColliderHeight, topPadding, bottomPadding, leftPadding, rightPadding)}, effPushback={${effPushbacks[joinIndex - 1][0].toFixed(3)}, ${effPushbacks[joinIndex - 1][1].toFixed(3)}}, overlayMag=${result.overlap.toFixed(4)}`);
|
||||||
|
*/
|
||||||
} else if (currPlayerDownsync.inAir && isBarrier && !landedOnGravityPushback) {
|
} else if (currPlayerDownsync.inAir && isBarrier && !landedOnGravityPushback) {
|
||||||
|
/*
|
||||||
console.warn(`playerId=${playerId}, joinIndex=${currPlayerDownsync.joinIndex} inAir & pushed back by barrier & not landed:
|
console.warn(`playerId=${playerId}, joinIndex=${currPlayerDownsync.joinIndex} inAir & pushed back by barrier & not landed:
|
||||||
{renderFrame.id: ${currRenderFrame.id}}
|
{renderFrame.id: ${currRenderFrame.id}}
|
||||||
playerColliderPos=${self.stringifyColliderCenterInWorld(playerCollider, halfColliderWidth, halfColliderHeight, topPadding, bottomPadding, leftPadding, rightPadding)}, effPushback={${effPushbacks[joinIndex - 1][0].toFixed(3)}, ${effPushbacks[joinIndex - 1][1].toFixed(3)}}, overlayMag=${result.overlap.toFixed(4)}, len(hardPushbackNorms)=${hardPushbackNorms.length}`);
|
playerColliderPos=${self.stringifyColliderCenterInWorld(playerCollider, halfColliderWidth, halfColliderHeight, topPadding, bottomPadding, leftPadding, rightPadding)}, effPushback={${effPushbacks[joinIndex - 1][0].toFixed(3)}, ${effPushbacks[joinIndex - 1][1].toFixed(3)}}, overlayMag=${result.overlap.toFixed(4)}, len(hardPushbackNorms)=${hardPushbackNorms.length}`);
|
||||||
|
*/
|
||||||
} else if (currPlayerDownsync.inAir && isAnotherPlayer) {
|
} else if (currPlayerDownsync.inAir && isAnotherPlayer) {
|
||||||
console.warn(`playerId=${playerId}, joinIndex=${currPlayerDownsync.joinIndex} inAir and pushed back by another player
|
console.warn(`playerId=${playerId}, joinIndex=${currPlayerDownsync.joinIndex} inAir and pushed back by another player
|
||||||
{renderFrame.id: ${currRenderFrame.id}}
|
{renderFrame.id: ${currRenderFrame.id}}
|
||||||
@@ -1454,39 +1524,28 @@ playerColliderPos=${self.stringifyColliderCenterInWorld(playerCollider, halfColl
|
|||||||
const self = this;
|
const self = this;
|
||||||
let prevLatestRdf = null,
|
let prevLatestRdf = null,
|
||||||
latestRdf = null;
|
latestRdf = null;
|
||||||
|
|
||||||
for (let i = renderFrameIdSt; i < renderFrameIdEd; i++) {
|
for (let i = renderFrameIdSt; i < renderFrameIdEd; i++) {
|
||||||
latestRdf = self.recentRenderCache.getByFrameId(i); // typed "RoomDownsyncFrame"; [WARNING] When "true == isChasing", this function can be interruptted by "onRoomDownsyncFrame(rdf)" asynchronously anytime, making this line return "null"!
|
const currRdf = self.recentRenderCache.getByFrameId(i); // typed "RoomDownsyncFrame"; [WARNING] When "true == isChasing" and using Firefox, this function could be interruptted by "onRoomDownsyncFrame(rdf)" asynchronously anytime, making this line return "null"!
|
||||||
if (null == latestRdf) {
|
if (null == currRdf) {
|
||||||
console.warn(`Couldn't find renderFrame for i=${i} to rollback, self.renderFrameId=${self.renderFrameId}, lastAllConfirmedRenderFrameId=${self.lastAllConfirmedRenderFrameId}, lastAllConfirmedInputFrameId=${self.lastAllConfirmedInputFrameId}, might've been interruptted by onRoomDownsyncFrame`);
|
throw `Couldn't find renderFrame for i=${i} to rollback (are you using Firefox?), self.renderFrameId=${self.renderFrameId}, lastAllConfirmedInputFrameId=${self.lastAllConfirmedInputFrameId}, might've been interruptted by onRoomDownsyncFrame`;
|
||||||
return [prevLatestRdf, latestRdf];
|
|
||||||
}
|
}
|
||||||
const j = self._convertToInputFrameId(i, self.inputDelayFrames);
|
const j = self._convertToInputFrameId(i, self.inputDelayFrames);
|
||||||
const delayedInputFrame = self.getCachedInputFrameDownsyncWithPrediction(j);
|
const delayedInputFrame = self.recentInputCache.getByFrameId(j); // Don't make prediction here, the inputFrameDownsyncs in recentInputCache was already predicted while prefabbing
|
||||||
if (null == delayedInputFrame) {
|
if (null == delayedInputFrame) {
|
||||||
// Shouldn't happen!
|
// Shouldn't happen!
|
||||||
throw `Failed to get cached delayedInputFrame for i=${i}, j=${j}, renderFrameId=${self.renderFrameId}, lastAllConfirmedRenderFrameId=${self.lastAllConfirmedRenderFrameId}, lastUpsyncInputFrameId=${self.lastUpsyncInputFrameId}, lastAllConfirmedInputFrameId=${self.lastAllConfirmedInputFrameId}, chaserRenderFrameId=${self.chaserRenderFrameId}; recentRenderCache=${self._stringifyRecentRenderCache(false)}, recentInputCache=${self._stringifyRecentInputCache(false)}`;
|
throw `Failed to get cached delayedInputFrame for i=${i}, j=${j}, renderFrameId=${self.renderFrameId}, lastUpsyncInputFrameId=${self.lastUpsyncInputFrameId}, lastAllConfirmedInputFrameId=${self.lastAllConfirmedInputFrameId}, chaserRenderFrameId=${self.chaserRenderFrameId}; recentRenderCache=${self._stringifyRecentRenderCache(false)}, recentInputCache=${self._stringifyRecentInputCache(false)}`;
|
||||||
}
|
|
||||||
prevLatestRdf = latestRdf;
|
|
||||||
latestRdf = self.applyInputFrameDownsyncDynamicsOnSingleRenderFrame(delayedInputFrame, prevLatestRdf, collisionSys, collisionSysMap);
|
|
||||||
if (
|
|
||||||
self._allConfirmed(delayedInputFrame.confirmedList)
|
|
||||||
&&
|
|
||||||
latestRdf.id > self.lastAllConfirmedRenderFrameId
|
|
||||||
) {
|
|
||||||
// We got a more up-to-date "all-confirmed-render-frame".
|
|
||||||
self.lastAllConfirmedRenderFrameId = latestRdf.id;
|
|
||||||
if (latestRdf.id > self.chaserRenderFrameId) {
|
|
||||||
// it must be true that "chaserRenderFrameId >= lastAllConfirmedRenderFrameId", regardeless of the "isChasing" param
|
|
||||||
self.chaserRenderFrameId = latestRdf.id;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
const nextRdf = self.applyInputFrameDownsyncDynamicsOnSingleRenderFrame(delayedInputFrame, currRdf, collisionSys, collisionSysMap);
|
||||||
|
|
||||||
if (true == isChasing) {
|
if (true == isChasing) {
|
||||||
// Move the cursor "self.chaserRenderFrameId", keep in mind that "self.chaserRenderFrameId" is not monotonic!
|
// [WARNING] Move the cursor "self.chaserRenderFrameId" when "true == isChasing", keep in mind that "self.chaserRenderFrameId" is not monotonic!
|
||||||
self.chaserRenderFrameId = latestRdf.id;
|
self.chaserRenderFrameId = nextRdf.id;
|
||||||
|
} else if (nextRdf.id == self.chaserRenderFrameId + 1) {
|
||||||
|
self.chaserRenderFrameId = nextRdf.id; // To avoid redundant calculation
|
||||||
}
|
}
|
||||||
self.recentRenderCache.setByFrameId(latestRdf, latestRdf.id);
|
self.recentRenderCache.setByFrameId(nextRdf, nextRdf.id);
|
||||||
|
prevLatestRdf = currRdf;
|
||||||
|
latestRdf = nextRdf;
|
||||||
}
|
}
|
||||||
|
|
||||||
return [prevLatestRdf, latestRdf];
|
return [prevLatestRdf, latestRdf];
|
||||||
|
@@ -15,8 +15,6 @@ cc.Class({
|
|||||||
window.mapIns = self;
|
window.mapIns = self;
|
||||||
self.showCriticalCoordinateLabels = true;
|
self.showCriticalCoordinateLabels = true;
|
||||||
|
|
||||||
cc.director.getCollisionManager().enabled = false;
|
|
||||||
|
|
||||||
const mapNode = self.node;
|
const mapNode = self.node;
|
||||||
const canvasNode = mapNode.parent;
|
const canvasNode = mapNode.parent;
|
||||||
|
|
||||||
@@ -47,7 +45,7 @@ cc.Class({
|
|||||||
1: {
|
1: {
|
||||||
// for offender
|
// for offender
|
||||||
startupFrames: 10,
|
startupFrames: 10,
|
||||||
activeFrames: 3,
|
activeFrames: 20,
|
||||||
recoveryFrames: 34, // usually but not always "startupFrames+activeFrames", I hereby set it to be 1 frame more than the actual animation to avoid critical transition, i.e. when the animation is 1 frame from ending but "rdfPlayer.framesToRecover" is already counted 0 and the player triggers an other same attack, making an effective bullet trigger but no animation is played due to same animName is still playing
|
recoveryFrames: 34, // usually but not always "startupFrames+activeFrames", I hereby set it to be 1 frame more than the actual animation to avoid critical transition, i.e. when the animation is 1 frame from ending but "rdfPlayer.framesToRecover" is already counted 0 and the player triggers an other same attack, making an effective bullet trigger but no animation is played due to same animName is still playing
|
||||||
recoveryFramesOnBlock: 34,
|
recoveryFramesOnBlock: 34,
|
||||||
recoveryFramesOnHit: 34,
|
recoveryFramesOnHit: 34,
|
||||||
@@ -196,7 +194,7 @@ cc.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
self.selfPlayerInfo = {
|
self.selfPlayerInfo = {
|
||||||
id: 10
|
id: 11
|
||||||
};
|
};
|
||||||
self._initPlayerRichInfoDict(startRdf.players);
|
self._initPlayerRichInfoDict(startRdf.players);
|
||||||
self.onRoomDownsyncFrame(startRdf);
|
self.onRoomDownsyncFrame(startRdf);
|
||||||
|
@@ -116,31 +116,28 @@ TileCollisionManager.prototype.extractBoundaryObjects = function(withTiledMapNod
|
|||||||
const allObjectGroups = tiledMapIns.getObjectGroups();
|
const allObjectGroups = tiledMapIns.getObjectGroups();
|
||||||
for (let i = 0; i < allObjectGroups.length; ++i) {
|
for (let i = 0; i < allObjectGroups.length; ++i) {
|
||||||
var objectGroup = allObjectGroups[i];
|
var objectGroup = allObjectGroups[i];
|
||||||
if ("PlayerStartingPos" == objectGroup.getGroupName()) {
|
|
||||||
var allObjects = objectGroup.getObjects();
|
|
||||||
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; // FIXME: I don't know why CocosCreator did this, it's stupid and MIGHT NOT WORK IN ISOMETRIC orientation!
|
|
||||||
let wpos = this.continuousObjLayerOffsetToContinuousMapNodePos(withTiledMapNode, cc.v2(origX, origY));
|
|
||||||
toRet.playerStartingPositions.push(wpos);
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if ("barrier_and_shelter" != objectGroup.getProperty("type")) continue;
|
|
||||||
var allObjects = objectGroup.getObjects();
|
var allObjects = objectGroup.getObjects();
|
||||||
for (let j = 0; j < allObjects.length; ++j) {
|
switch (objectGroup.getGroupName()) {
|
||||||
let object = allObjects[j];
|
case "PlayerStartingPos":
|
||||||
let gid = object.gid;
|
for (let j = 0; j < allObjects.length; ++j) {
|
||||||
if (0 < gid) {
|
const cccMaskedX = allObjects[j].x,
|
||||||
continue;
|
cccMaskedY = allObjects[j].y;
|
||||||
}
|
const origX = cccMaskedX,
|
||||||
const boundaryType = object.boundary_type;
|
origY = withTiledMapNode.getContentSize().height - cccMaskedY; // FIXME: I don't know why CocosCreator did this, it's stupid and MIGHT NOT WORK IN ISOMETRIC orientation!
|
||||||
let toPushBarrier = [];
|
let wpos = this.continuousObjLayerOffsetToContinuousMapNodePos(withTiledMapNode, cc.v2(origX, origY));
|
||||||
toPushBarrier.boundaryType = boundaryType;
|
toRet.playerStartingPositions.push(wpos);
|
||||||
switch (boundaryType) {
|
}
|
||||||
case "barrier":
|
break;
|
||||||
|
case "Barrier":
|
||||||
|
for (let j = 0; j < allObjects.length; ++j) {
|
||||||
|
let object = allObjects[j];
|
||||||
|
let gid = object.gid;
|
||||||
|
if (0 < gid) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const boundaryType = object.boundary_type;
|
||||||
|
let toPushBarrier = [];
|
||||||
|
toPushBarrier.boundaryType = boundaryType;
|
||||||
let polylinePoints = object.polylinePoints;
|
let polylinePoints = object.polylinePoints;
|
||||||
if (null == polylinePoints) {
|
if (null == polylinePoints) {
|
||||||
polylinePoints = [{
|
polylinePoints = [{
|
||||||
@@ -163,10 +160,8 @@ TileCollisionManager.prototype.extractBoundaryObjects = function(withTiledMapNod
|
|||||||
}
|
}
|
||||||
toPushBarrier.anchor = this.continuousObjLayerOffsetToContinuousMapNodePos(withTiledMapNode, object.offset); // DON'T use "(object.x, object.y)" which are wrong/meaningless!
|
toPushBarrier.anchor = this.continuousObjLayerOffsetToContinuousMapNodePos(withTiledMapNode, object.offset); // DON'T use "(object.x, object.y)" which are wrong/meaningless!
|
||||||
toRet.barriers.push(toPushBarrier);
|
toRet.barriers.push(toPushBarrier);
|
||||||
break;
|
}
|
||||||
default:
|
break;
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -88,6 +88,14 @@ cc.Class({
|
|||||||
default: 0.0375,
|
default: 0.0375,
|
||||||
type: cc.Float
|
type: cc.Float
|
||||||
},
|
},
|
||||||
|
btnA: {
|
||||||
|
default: null,
|
||||||
|
type: cc.Node
|
||||||
|
},
|
||||||
|
btnB: {
|
||||||
|
default: null,
|
||||||
|
type: cc.Node
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
start() {},
|
start() {},
|
||||||
@@ -137,6 +145,7 @@ cc.Class({
|
|||||||
});
|
});
|
||||||
translationListenerNode.inTouchPoints = new Map();
|
translationListenerNode.inTouchPoints = new Map();
|
||||||
|
|
||||||
|
/*
|
||||||
zoomingListenerNode.on(cc.Node.EventType.TOUCH_START, function(event) {
|
zoomingListenerNode.on(cc.Node.EventType.TOUCH_START, function(event) {
|
||||||
self._touchStartEvent(event);
|
self._touchStartEvent(event);
|
||||||
});
|
});
|
||||||
@@ -150,6 +159,37 @@ cc.Class({
|
|||||||
self._touchEndEvent(event);
|
self._touchEndEvent(event);
|
||||||
});
|
});
|
||||||
zoomingListenerNode.inTouchPoints = new Map();
|
zoomingListenerNode.inTouchPoints = new Map();
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (self.btnA) {
|
||||||
|
self.btnA.on(cc.Node.EventType.TOUCH_START, function(evt) {
|
||||||
|
self.cachedBtnALevel = 1;
|
||||||
|
evt.target.runAction(cc.scaleTo(0.1, 0.3));
|
||||||
|
});
|
||||||
|
self.btnA.on(cc.Node.EventType.TOUCH_END, function(evt) {
|
||||||
|
self.cachedBtnALevel = 0;
|
||||||
|
evt.target.runAction(cc.scaleTo(0.1, 1.0));
|
||||||
|
});
|
||||||
|
self.btnA.on(cc.Node.EventType.TOUCH_CANCEL, function(evt) {
|
||||||
|
self.cachedBtnALevel = 0;
|
||||||
|
evt.target.runAction(cc.scaleTo(0.1, 1.0));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self.btnB) {
|
||||||
|
self.btnB.on(cc.Node.EventType.TOUCH_START, function(evt) {
|
||||||
|
self.cachedBtnBLevel = 1;
|
||||||
|
evt.target.runAction(cc.scaleTo(0.1, 0.3));
|
||||||
|
});
|
||||||
|
self.btnB.on(cc.Node.EventType.TOUCH_END, function(evt) {
|
||||||
|
self.cachedBtnBLevel = 0;
|
||||||
|
evt.target.runAction(cc.scaleTo(0.1, 1.0));
|
||||||
|
});
|
||||||
|
self.btnB.on(cc.Node.EventType.TOUCH_CANCEL, function(evt) {
|
||||||
|
self.cachedBtnBLevel = 0;
|
||||||
|
evt.target.runAction(cc.scaleTo(0.1, 1.0));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Setup keyboard controls for the ease of attach debugging
|
// Setup keyboard controls for the ease of attach debugging
|
||||||
cc.systemEvent.on(cc.SystemEvent.EventType.KEY_DOWN, function(evt) {
|
cc.systemEvent.on(cc.SystemEvent.EventType.KEY_DOWN, function(evt) {
|
||||||
|
@@ -12,7 +12,6 @@ window.DOWNSYNC_MSG_ACT_INPUT_BATCH = 2;
|
|||||||
window.DOWNSYNC_MSG_ACT_BATTLE_STOPPED = 3;
|
window.DOWNSYNC_MSG_ACT_BATTLE_STOPPED = 3;
|
||||||
window.DOWNSYNC_MSG_ACT_FORCED_RESYNC = 4;
|
window.DOWNSYNC_MSG_ACT_FORCED_RESYNC = 4;
|
||||||
|
|
||||||
|
|
||||||
window.sendSafely = function(msgStr) {
|
window.sendSafely = function(msgStr) {
|
||||||
/**
|
/**
|
||||||
* - "If the data can't be sent (for example, because it needs to be buffered but the buffer is full), the socket is closed automatically."
|
* - "If the data can't be sent (for example, because it needs to be buffered but the buffer is full), the socket is closed automatically."
|
||||||
@@ -28,10 +27,13 @@ window.sendUint8AsBase64Safely = function(msgUint8Arr) {
|
|||||||
window.clientSession.send(_uint8ToBase64(msgUint8Arr));
|
window.clientSession.send(_uint8ToBase64(msgUint8Arr));
|
||||||
}
|
}
|
||||||
|
|
||||||
window.closeWSConnection = function() {
|
window.closeWSConnection = function(code, reason) {
|
||||||
if (null == window.clientSession || window.clientSession.readyState != WebSocket.OPEN) return;
|
if (null == window.clientSession || window.clientSession.readyState != WebSocket.OPEN) {
|
||||||
|
console.log(`"window.clientSession" is already closed or destroyed.`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
console.log(`Closing "window.clientSession" from the client-side.`);
|
console.log(`Closing "window.clientSession" from the client-side.`);
|
||||||
window.clientSession.close();
|
window.clientSession.close(code, reason);
|
||||||
}
|
}
|
||||||
|
|
||||||
window.getBoundRoomIdFromPersistentStorage = function() {
|
window.getBoundRoomIdFromPersistentStorage = function() {
|
||||||
@@ -144,9 +146,10 @@ window.initPersistentSessionClient = function(onopenCb, expectedRoomId) {
|
|||||||
if (null == evt || null == evt.data) {
|
if (null == evt || null == evt.data) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// FIXME: In practice, it seems like the thread invoking "onmessage" could be different from "Map.update(dt)", which makes it necessary to guard "recentRenderCache & recentInputCache" for "getOrPrefabInputFrameUpsync & rollbackAndChase & onRoomDownsyncFrame & onInputFrameDownsyncBatch" to avoid mysterious RAM contamination, but there's no explicit mutex in JavaScript for browsers -- this issue is found in Firefox (108.0.1, 64-bit, Windows 11), but not in Chrome (108.0.5359.125, Official Build, 64-bit, Windows 11) -- just breakpoint in "Map.rollbackAndChase" then see whether the logs of "onmessage" can still be printed and whether the values of "recentRenderCache & recentInputCache" change in console).
|
||||||
try {
|
try {
|
||||||
const resp = window.pb.protos.WsResp.decode(new Uint8Array(evt.data));
|
const resp = window.pb.protos.WsResp.decode(new Uint8Array(evt.data));
|
||||||
// console.log(`Got non-empty onmessage decoded: resp.act=${resp.act}`);
|
//console.log(`Got non-empty onmessage decoded: resp.act=${resp.act}`);
|
||||||
switch (resp.act) {
|
switch (resp.act) {
|
||||||
case window.DOWNSYNC_MSG_ACT_HB_REQ:
|
case window.DOWNSYNC_MSG_ACT_HB_REQ:
|
||||||
window.handleHbRequirements(resp);
|
window.handleHbRequirements(resp);
|
||||||
@@ -183,39 +186,37 @@ window.initPersistentSessionClient = function(onopenCb, expectedRoomId) {
|
|||||||
|
|
||||||
clientSession.onerror = function(evt) {
|
clientSession.onerror = function(evt) {
|
||||||
console.error("Error caught on the WS clientSession: ", evt);
|
console.error("Error caught on the WS clientSession: ", evt);
|
||||||
if (window.handleClientSessionError) {
|
window.clearLocalStorageAndBackToLoginScene(true);
|
||||||
window.handleClientSessionError();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
clientSession.onclose = function(evt) {
|
clientSession.onclose = function(evt) {
|
||||||
// [WARNING] The callback "onclose" might be called AFTER the webpage is refreshed with "1001 == evt.code".
|
// [WARNING] The callback "onclose" might be called AFTER the webpage is refreshed with "1001 == evt.code".
|
||||||
console.warn("The WS clientSession is closed: ", evt, clientSession);
|
console.warn(`The WS clientSession is closed: evt=${JSON.stringify(evt)}, evt.code=${evt.code}`);
|
||||||
if (false == evt.wasClean) {
|
switch (evt.code) {
|
||||||
/*
|
case constants.RET_CODE.CLIENT_MISMATCHED_RENDER_FRAME:
|
||||||
Chrome doesn't allow the use of "CustomCloseCode"s (yet) and will callback with a "WebsocketStdCloseCode 1006" and "false == evt.wasClean" here. See https://tools.ietf.org/html/rfc6455#section-7.4 for more information.
|
break;
|
||||||
*/
|
case constants.RET_CODE.BATTLE_STOPPED:
|
||||||
if (window.handleClientSessionError) {
|
// deliberately do nothing
|
||||||
window.handleClientSessionError();
|
break;
|
||||||
}
|
case constants.RET_CODE.PLAYER_NOT_ADDABLE_TO_ROOM:
|
||||||
} else {
|
case constants.RET_CODE.PLAYER_NOT_READDABLE_TO_ROOM:
|
||||||
switch (evt.code) {
|
window.clearBoundRoomIdInBothVolatileAndPersistentStorage(); // To favor the player to join other rooms
|
||||||
case constants.RET_CODE.PLAYER_NOT_ADDABLE_TO_ROOM:
|
mapIns.onManualRejoinRequired("Couldn't join any room at the moment, please retry");
|
||||||
case constants.RET_CODE.PLAYER_NOT_READDABLE_TO_ROOM:
|
break;
|
||||||
window.clearBoundRoomIdInBothVolatileAndPersistentStorage();
|
case constants.RET_CODE.ACTIVE_WATCHDOG:
|
||||||
break;
|
mapIns.onManualRejoinRequired("Disconnected due to long-time inactivity, please rejoin");
|
||||||
case constants.RET_CODE.UNKNOWN_ERROR:
|
break;
|
||||||
case constants.RET_CODE.MYSQL_ERROR:
|
case constants.RET_CODE.UNKNOWN_ERROR:
|
||||||
case constants.RET_CODE.PLAYER_NOT_FOUND:
|
case constants.RET_CODE.MYSQL_ERROR:
|
||||||
case constants.RET_CODE.PLAYER_CHEATING:
|
case constants.RET_CODE.PLAYER_NOT_FOUND:
|
||||||
case 1006: // Peer(i.e. the backend) gone unexpectedly
|
case constants.RET_CODE.PLAYER_CHEATING:
|
||||||
if (window.handleClientSessionError) {
|
case 1006: // Peer(i.e. the backend) gone unexpectedly
|
||||||
window.handleClientSessionError();
|
console.warn(`recentRenderCache=${mapIns._stringifyRecentRenderCache(true)}
|
||||||
}
|
recentInputCache=${mapIns._stringifyRecentInputCache(true)}`);
|
||||||
break;
|
window.clearLocalStorageAndBackToLoginScene(true);
|
||||||
default:
|
break;
|
||||||
break;
|
default:
|
||||||
}
|
break;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@@ -226,19 +227,7 @@ window.clearLocalStorageAndBackToLoginScene = function(shouldRetainBoundRoomIdIn
|
|||||||
if (window.mapIns && window.mapIns.musicEffectManagerScriptIns) {
|
if (window.mapIns && window.mapIns.musicEffectManagerScriptIns) {
|
||||||
window.mapIns.musicEffectManagerScriptIns.stopAllMusic();
|
window.mapIns.musicEffectManagerScriptIns.stopAllMusic();
|
||||||
}
|
}
|
||||||
/**
|
|
||||||
* Here I deliberately removed the callback in the "common `handleClientSessionError` callback"
|
|
||||||
* within which another invocation to `clearLocalStorageAndBackToLoginScene` will be made.
|
|
||||||
*
|
|
||||||
* It'll be re-assigned to the common one upon reentrance of `Map.onLoad`.
|
|
||||||
*
|
|
||||||
* -- YFLu 2019-04-06
|
|
||||||
*/
|
|
||||||
window.handleClientSessionError = () => {
|
|
||||||
console.warn("+++++++ Special handleClientSessionError() assigned within `clearLocalStorageAndBackToLoginScene`");
|
|
||||||
// TBD.
|
|
||||||
window.handleClientSessionError = null; // To ensure that it's called at most once.
|
|
||||||
};
|
|
||||||
window.closeWSConnection();
|
window.closeWSConnection();
|
||||||
window.clearSelfPlayer();
|
window.clearSelfPlayer();
|
||||||
if (true != shouldRetainBoundRoomIdInBothVolatileAndPersistentStorage) {
|
if (true != shouldRetainBoundRoomIdInBothVolatileAndPersistentStorage) {
|
||||||
|
@@ -3654,6 +3654,7 @@ $root.protos = (function() {
|
|||||||
* @property {number|null} [refRenderFrameId] InputsBufferSnapshot refRenderFrameId
|
* @property {number|null} [refRenderFrameId] InputsBufferSnapshot refRenderFrameId
|
||||||
* @property {number|Long|null} [unconfirmedMask] InputsBufferSnapshot unconfirmedMask
|
* @property {number|Long|null} [unconfirmedMask] InputsBufferSnapshot unconfirmedMask
|
||||||
* @property {Array.<protos.InputFrameDownsync>|null} [toSendInputFrameDownsyncs] InputsBufferSnapshot toSendInputFrameDownsyncs
|
* @property {Array.<protos.InputFrameDownsync>|null} [toSendInputFrameDownsyncs] InputsBufferSnapshot toSendInputFrameDownsyncs
|
||||||
|
* @property {boolean|null} [shouldForceResync] InputsBufferSnapshot shouldForceResync
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -3696,6 +3697,14 @@ $root.protos = (function() {
|
|||||||
*/
|
*/
|
||||||
InputsBufferSnapshot.prototype.toSendInputFrameDownsyncs = $util.emptyArray;
|
InputsBufferSnapshot.prototype.toSendInputFrameDownsyncs = $util.emptyArray;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* InputsBufferSnapshot shouldForceResync.
|
||||||
|
* @member {boolean} shouldForceResync
|
||||||
|
* @memberof protos.InputsBufferSnapshot
|
||||||
|
* @instance
|
||||||
|
*/
|
||||||
|
InputsBufferSnapshot.prototype.shouldForceResync = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new InputsBufferSnapshot instance using the specified properties.
|
* Creates a new InputsBufferSnapshot instance using the specified properties.
|
||||||
* @function create
|
* @function create
|
||||||
@@ -3727,6 +3736,8 @@ $root.protos = (function() {
|
|||||||
if (message.toSendInputFrameDownsyncs != null && message.toSendInputFrameDownsyncs.length)
|
if (message.toSendInputFrameDownsyncs != null && message.toSendInputFrameDownsyncs.length)
|
||||||
for (var i = 0; i < message.toSendInputFrameDownsyncs.length; ++i)
|
for (var i = 0; i < message.toSendInputFrameDownsyncs.length; ++i)
|
||||||
$root.protos.InputFrameDownsync.encode(message.toSendInputFrameDownsyncs[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
|
$root.protos.InputFrameDownsync.encode(message.toSendInputFrameDownsyncs[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
|
||||||
|
if (message.shouldForceResync != null && Object.hasOwnProperty.call(message, "shouldForceResync"))
|
||||||
|
writer.uint32(/* id 4, wireType 0 =*/32).bool(message.shouldForceResync);
|
||||||
return writer;
|
return writer;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -3775,6 +3786,10 @@ $root.protos = (function() {
|
|||||||
message.toSendInputFrameDownsyncs.push($root.protos.InputFrameDownsync.decode(reader, reader.uint32()));
|
message.toSendInputFrameDownsyncs.push($root.protos.InputFrameDownsync.decode(reader, reader.uint32()));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 4: {
|
||||||
|
message.shouldForceResync = reader.bool();
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
reader.skipType(tag & 7);
|
reader.skipType(tag & 7);
|
||||||
break;
|
break;
|
||||||
@@ -3825,6 +3840,9 @@ $root.protos = (function() {
|
|||||||
return "toSendInputFrameDownsyncs." + error;
|
return "toSendInputFrameDownsyncs." + error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (message.shouldForceResync != null && message.hasOwnProperty("shouldForceResync"))
|
||||||
|
if (typeof message.shouldForceResync !== "boolean")
|
||||||
|
return "shouldForceResync: boolean expected";
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -3861,6 +3879,8 @@ $root.protos = (function() {
|
|||||||
message.toSendInputFrameDownsyncs[i] = $root.protos.InputFrameDownsync.fromObject(object.toSendInputFrameDownsyncs[i]);
|
message.toSendInputFrameDownsyncs[i] = $root.protos.InputFrameDownsync.fromObject(object.toSendInputFrameDownsyncs[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (object.shouldForceResync != null)
|
||||||
|
message.shouldForceResync = Boolean(object.shouldForceResync);
|
||||||
return message;
|
return message;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -3886,6 +3906,7 @@ $root.protos = (function() {
|
|||||||
object.unconfirmedMask = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
|
object.unconfirmedMask = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
|
||||||
} else
|
} else
|
||||||
object.unconfirmedMask = options.longs === String ? "0" : 0;
|
object.unconfirmedMask = options.longs === String ? "0" : 0;
|
||||||
|
object.shouldForceResync = false;
|
||||||
}
|
}
|
||||||
if (message.refRenderFrameId != null && message.hasOwnProperty("refRenderFrameId"))
|
if (message.refRenderFrameId != null && message.hasOwnProperty("refRenderFrameId"))
|
||||||
object.refRenderFrameId = message.refRenderFrameId;
|
object.refRenderFrameId = message.refRenderFrameId;
|
||||||
@@ -3899,6 +3920,8 @@ $root.protos = (function() {
|
|||||||
for (var j = 0; j < message.toSendInputFrameDownsyncs.length; ++j)
|
for (var j = 0; j < message.toSendInputFrameDownsyncs.length; ++j)
|
||||||
object.toSendInputFrameDownsyncs[j] = $root.protos.InputFrameDownsync.toObject(message.toSendInputFrameDownsyncs[j], options);
|
object.toSendInputFrameDownsyncs[j] = $root.protos.InputFrameDownsync.toObject(message.toSendInputFrameDownsyncs[j], options);
|
||||||
}
|
}
|
||||||
|
if (message.shouldForceResync != null && message.hasOwnProperty("shouldForceResync"))
|
||||||
|
object.shouldForceResync = message.shouldForceResync;
|
||||||
return object;
|
return object;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -5576,6 +5599,7 @@ $root.protos = (function() {
|
|||||||
* @property {number|Long|null} [countdownNanos] RoomDownsyncFrame countdownNanos
|
* @property {number|Long|null} [countdownNanos] RoomDownsyncFrame countdownNanos
|
||||||
* @property {Array.<protos.MeleeBullet>|null} [meleeBullets] RoomDownsyncFrame meleeBullets
|
* @property {Array.<protos.MeleeBullet>|null} [meleeBullets] RoomDownsyncFrame meleeBullets
|
||||||
* @property {number|Long|null} [backendUnconfirmedMask] RoomDownsyncFrame backendUnconfirmedMask
|
* @property {number|Long|null} [backendUnconfirmedMask] RoomDownsyncFrame backendUnconfirmedMask
|
||||||
|
* @property {boolean|null} [shouldForceResync] RoomDownsyncFrame shouldForceResync
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -5635,6 +5659,14 @@ $root.protos = (function() {
|
|||||||
*/
|
*/
|
||||||
RoomDownsyncFrame.prototype.backendUnconfirmedMask = $util.Long ? $util.Long.fromBits(0,0,true) : 0;
|
RoomDownsyncFrame.prototype.backendUnconfirmedMask = $util.Long ? $util.Long.fromBits(0,0,true) : 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RoomDownsyncFrame shouldForceResync.
|
||||||
|
* @member {boolean} shouldForceResync
|
||||||
|
* @memberof protos.RoomDownsyncFrame
|
||||||
|
* @instance
|
||||||
|
*/
|
||||||
|
RoomDownsyncFrame.prototype.shouldForceResync = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new RoomDownsyncFrame instance using the specified properties.
|
* Creates a new RoomDownsyncFrame instance using the specified properties.
|
||||||
* @function create
|
* @function create
|
||||||
@@ -5673,6 +5705,8 @@ $root.protos = (function() {
|
|||||||
$root.protos.MeleeBullet.encode(message.meleeBullets[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
|
$root.protos.MeleeBullet.encode(message.meleeBullets[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
|
||||||
if (message.backendUnconfirmedMask != null && Object.hasOwnProperty.call(message, "backendUnconfirmedMask"))
|
if (message.backendUnconfirmedMask != null && Object.hasOwnProperty.call(message, "backendUnconfirmedMask"))
|
||||||
writer.uint32(/* id 5, wireType 0 =*/40).uint64(message.backendUnconfirmedMask);
|
writer.uint32(/* id 5, wireType 0 =*/40).uint64(message.backendUnconfirmedMask);
|
||||||
|
if (message.shouldForceResync != null && Object.hasOwnProperty.call(message, "shouldForceResync"))
|
||||||
|
writer.uint32(/* id 6, wireType 0 =*/48).bool(message.shouldForceResync);
|
||||||
return writer;
|
return writer;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -5748,6 +5782,10 @@ $root.protos = (function() {
|
|||||||
message.backendUnconfirmedMask = reader.uint64();
|
message.backendUnconfirmedMask = reader.uint64();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 6: {
|
||||||
|
message.shouldForceResync = reader.bool();
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
reader.skipType(tag & 7);
|
reader.skipType(tag & 7);
|
||||||
break;
|
break;
|
||||||
@@ -5815,6 +5853,9 @@ $root.protos = (function() {
|
|||||||
if (message.backendUnconfirmedMask != null && message.hasOwnProperty("backendUnconfirmedMask"))
|
if (message.backendUnconfirmedMask != null && message.hasOwnProperty("backendUnconfirmedMask"))
|
||||||
if (!$util.isInteger(message.backendUnconfirmedMask) && !(message.backendUnconfirmedMask && $util.isInteger(message.backendUnconfirmedMask.low) && $util.isInteger(message.backendUnconfirmedMask.high)))
|
if (!$util.isInteger(message.backendUnconfirmedMask) && !(message.backendUnconfirmedMask && $util.isInteger(message.backendUnconfirmedMask.low) && $util.isInteger(message.backendUnconfirmedMask.high)))
|
||||||
return "backendUnconfirmedMask: integer|Long expected";
|
return "backendUnconfirmedMask: integer|Long expected";
|
||||||
|
if (message.shouldForceResync != null && message.hasOwnProperty("shouldForceResync"))
|
||||||
|
if (typeof message.shouldForceResync !== "boolean")
|
||||||
|
return "shouldForceResync: boolean expected";
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -5870,6 +5911,8 @@ $root.protos = (function() {
|
|||||||
message.backendUnconfirmedMask = object.backendUnconfirmedMask;
|
message.backendUnconfirmedMask = object.backendUnconfirmedMask;
|
||||||
else if (typeof object.backendUnconfirmedMask === "object")
|
else if (typeof object.backendUnconfirmedMask === "object")
|
||||||
message.backendUnconfirmedMask = new $util.LongBits(object.backendUnconfirmedMask.low >>> 0, object.backendUnconfirmedMask.high >>> 0).toNumber(true);
|
message.backendUnconfirmedMask = new $util.LongBits(object.backendUnconfirmedMask.low >>> 0, object.backendUnconfirmedMask.high >>> 0).toNumber(true);
|
||||||
|
if (object.shouldForceResync != null)
|
||||||
|
message.shouldForceResync = Boolean(object.shouldForceResync);
|
||||||
return message;
|
return message;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -5902,6 +5945,7 @@ $root.protos = (function() {
|
|||||||
object.backendUnconfirmedMask = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
|
object.backendUnconfirmedMask = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
|
||||||
} else
|
} else
|
||||||
object.backendUnconfirmedMask = options.longs === String ? "0" : 0;
|
object.backendUnconfirmedMask = options.longs === String ? "0" : 0;
|
||||||
|
object.shouldForceResync = false;
|
||||||
}
|
}
|
||||||
if (message.id != null && message.hasOwnProperty("id"))
|
if (message.id != null && message.hasOwnProperty("id"))
|
||||||
object.id = message.id;
|
object.id = message.id;
|
||||||
@@ -5926,6 +5970,8 @@ $root.protos = (function() {
|
|||||||
object.backendUnconfirmedMask = options.longs === String ? String(message.backendUnconfirmedMask) : message.backendUnconfirmedMask;
|
object.backendUnconfirmedMask = options.longs === String ? String(message.backendUnconfirmedMask) : message.backendUnconfirmedMask;
|
||||||
else
|
else
|
||||||
object.backendUnconfirmedMask = options.longs === String ? $util.Long.prototype.toString.call(message.backendUnconfirmedMask) : options.longs === Number ? new $util.LongBits(message.backendUnconfirmedMask.low >>> 0, message.backendUnconfirmedMask.high >>> 0).toNumber(true) : message.backendUnconfirmedMask;
|
object.backendUnconfirmedMask = options.longs === String ? $util.Long.prototype.toString.call(message.backendUnconfirmedMask) : options.longs === Number ? new $util.LongBits(message.backendUnconfirmedMask.low >>> 0, message.backendUnconfirmedMask.high >>> 0).toNumber(true) : message.backendUnconfirmedMask;
|
||||||
|
if (message.shouldForceResync != null && message.hasOwnProperty("shouldForceResync"))
|
||||||
|
object.shouldForceResync = message.shouldForceResync;
|
||||||
return object;
|
return object;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -17,13 +17,13 @@
|
|||||||
},
|
},
|
||||||
"encryptJs": true,
|
"encryptJs": true,
|
||||||
"excludeScenes": [
|
"excludeScenes": [
|
||||||
"475b849b-44b3-4390-982d-bd0d9e695093"
|
"368b10b6-88fc-423c-9fcd-545d9fc673bd"
|
||||||
],
|
],
|
||||||
"fb-instant-games": {},
|
"fb-instant-games": {},
|
||||||
"includeSDKBox": false,
|
"includeSDKBox": false,
|
||||||
"inlineSpriteFrames": true,
|
"inlineSpriteFrames": true,
|
||||||
"inlineSpriteFrames_native": true,
|
"inlineSpriteFrames_native": true,
|
||||||
"md5Cache": true,
|
"md5Cache": false,
|
||||||
"mergeStartScene": true,
|
"mergeStartScene": true,
|
||||||
"optimizeHotUpdate": false,
|
"optimizeHotUpdate": false,
|
||||||
"orientation": {
|
"orientation": {
|
||||||
|
@@ -34,7 +34,6 @@
|
|||||||
"design-resolution-width": 960,
|
"design-resolution-width": 960,
|
||||||
"excluded-modules": [
|
"excluded-modules": [
|
||||||
"Collider",
|
"Collider",
|
||||||
"DragonBones",
|
|
||||||
"Geom Utils",
|
"Geom Utils",
|
||||||
"Mesh",
|
"Mesh",
|
||||||
"MotionStreak",
|
"MotionStreak",
|
||||||
@@ -69,7 +68,7 @@
|
|||||||
"shelter_z_reducer",
|
"shelter_z_reducer",
|
||||||
"shelter"
|
"shelter"
|
||||||
],
|
],
|
||||||
"last-module-event-record-time": 1579766511782,
|
"last-module-event-record-time": 1671346284377,
|
||||||
"simulator-orientation": false,
|
"simulator-orientation": false,
|
||||||
"simulator-resolution": {
|
"simulator-resolution": {
|
||||||
"height": 640,
|
"height": 640,
|
||||||
|
Reference in New Issue
Block a user