Compare commits

...

46 Commits
v0.6.1 ... v0.8

Author SHA1 Message Date
Wing
dd8b731ade Merge pull request #10 from genxium/force_confirmation_isolation
Improvement on smooth synchronization.
2022-12-01 15:25:57 +08:00
genxium
c4489e0912 Fixed backend downsyncToAll battleState filtering. 2022-12-01 15:23:43 +08:00
genxium
348c889e14 Fixes on resync. 2022-12-01 11:53:37 +08:00
yflu
c6473db561 In progress for fixing recovery upon reconnection. 2022-12-01 00:30:35 +08:00
genxium
e165d49cb1 Further simplified signaling. 2022-11-30 21:51:06 +08:00
genxium
26370dce61 Added necessary locking for backend InputsBuffer. 2022-11-30 16:53:48 +08:00
yflu
f3a12b2aa9 A temp broken commit. 2022-11-30 00:04:52 +08:00
genxium
1f5802ee14 Fixed multiple error handling spots. 2022-11-29 21:32:18 +08:00
yflu
080a384ade Working on reduction of resync received in frontend. 2022-11-29 12:49:49 +08:00
genxium
9469b27348 Updated use of GOPROXY param in Makefile. 2022-11-28 23:49:52 +08:00
Wing
ca5ba83b07 Merge pull request #9 from genxium/frame_anim_compatible
Frame anim compatible
2022-11-27 21:38:24 +08:00
genxium
b1f0cf2c57 Added frame anim compatibility for AttackingCharacter. 2022-11-27 21:33:34 +08:00
genxium
1b43e6d760 Reduced dragonbones exported resource size. 2022-11-27 19:38:26 +08:00
genxium
e0fb21f3fb Fixes for simultaneous reconnection w.r.t. same room, and updates for documentation. 2022-11-27 00:00:39 +08:00
genxium
9bce561441 Minor fix for README. 2022-11-26 00:14:11 +08:00
genxium
52be2a6a79 Simplified frontend anim handling. 2022-11-26 00:04:22 +08:00
genxium
fa491b357d Fixed frontend animation switch after atk and stun. 2022-11-25 22:44:01 +08:00
genxium
695eacaabc Fixed frontend animation switch. 2022-11-25 21:53:30 +08:00
genxium
0324b584a5 Fixed frontend countdown display. 2022-11-25 17:57:10 +08:00
genxium
70e552f5f0 Simplified frontend handling of RoomDownsyncFrame. 2022-11-25 13:26:22 +08:00
genxium
c58e690a47 Updated frontend animation trigger mechanism. 2022-11-25 12:05:22 +08:00
genxium
1593965950 Fixed backend bullet collision handling. 2022-11-25 09:07:43 +08:00
genxium
2a1105efa4 Added collision debug logs in backend. 2022-11-24 21:56:34 +08:00
genxium
04de4666d5 Fixes for melee attack sync. 2022-11-24 20:46:44 +08:00
Wing
2290c57c1c Merge pull request #8 from genxium/character_attack
Added melee attack feature.
2022-11-24 17:51:46 +08:00
genxium
24d5ad9dc8 Drafted backend handling of melee attack. 2022-11-24 17:48:07 +08:00
genxium
fdc296531a A broken commit during backend bullet adaptation. 2022-11-24 12:48:03 +08:00
genxium
becc56f672 Minor fix. 2022-11-23 16:25:08 +08:00
yflu
58c18ab7ae Drafted rollback compatible bullet lifecycle events. 2022-11-23 12:30:30 +08:00
genxium
024d527f3d Drafted attack trigger logic in OfflineMap. 2022-11-22 22:31:06 +08:00
genxium
9b29edaaa1 Added resources for WaterGhost animation. 2022-11-22 16:19:04 +08:00
genxium
360f2fc22b Simplified backend config loading. 2022-11-21 17:27:32 +08:00
yflu
2dbc529978 Fixes for jiggling character animation on resynced. 2022-11-21 00:23:01 +08:00
genxium
d21f59cafa Minor fix. 2022-11-20 21:07:45 +08:00
Wing
335fef66ef Merge pull request #7 from genxium/dungeon_characters
Updated anim of characters, and minor updates to inputs on wire to support atk button.
2022-11-20 20:18:44 +08:00
genxium
52480ab29f Updated TouchEventsManager to support input from Keyboard as well as an additional atk btn. 2022-11-20 20:13:08 +08:00
genxium
971f6461ab Updated charts. 2022-11-20 12:27:29 +08:00
genxium
061aa449c9 Fixes for online map class to use updated character animations. 2022-11-19 22:59:12 +08:00
genxium
78dd9ecd85 Initial commit for offline map, might break the online version. 2022-11-19 20:58:07 +08:00
yflu
d4226137b6 Initial draft of an offline map for testing new characters. 2022-11-17 23:39:32 +08:00
yflu
e432026fec Fixed proto_gen_shortcut script for OSX. 2022-11-17 23:13:53 +08:00
Wing
3e7718ed04 Merge pull request #6 from genxium/dungeon_battle
Added support of ORTHO orientation tmx.
2022-11-17 16:51:11 +08:00
genxium
b78dd54431 Regenerated new resource ccc meta files. 2022-11-17 15:10:17 +08:00
genxium
22fb72afbc Fixed frontend tmx parsing for ortho map. 2022-11-17 15:01:35 +08:00
genxium
7b9172c27b Fixed backend tmx parsing for ortho map. 2022-11-16 21:32:25 +08:00
genxium
7e12853a73 Added fineart resources. 2022-11-16 20:58:12 +08:00
355 changed files with 37976 additions and 8397 deletions

View File

@@ -2,9 +2,11 @@
This project is a demo for a websocket-based rollback netcode inspired by [GGPO](https://github.com/pond3r/ggpo/blob/master/doc/README.md).
![gif_demo](./charts/along_wall_interaction_with_reconnection.gif)
_(the following gif is sped up to ~1.5x for file size reduction, kindly note that around ~11s countdown, the attack animation is resumed from a partial progress)_
Please also checkout [this demo video](https://pan.baidu.com/s/1YkfuHjNLzlFVnKiEj6wrDQ?pwd=tkr5) to see how this demo carries out a full 60fps synchronization with the help of _batched input upsync/downsync_ for satisfying network I/O performance.
![gif_demo](./charts/melee_attack_fractional_anim_resume_spedup.gif)
Please also checkout [this demo video](https://pan.baidu.com/s/1U1wb7KWyHorZElNWcS5HHA?pwd=30wh) to see how this demo carries out a full 60fps synchronization with the help of _batched input upsync/downsync_ for satisfying network I/O performance.
The video mainly shows the following features.
- The backend receives inputs from frontend peers and broadcasts back for synchronization.

View File

@@ -1,5 +1,6 @@
PROJECTNAME=server.exe
ROOT_DIR=.
GOPROXY=https://mirrors.aliyun.com/goproxy
all: help
gen-constants:
@@ -13,13 +14,13 @@ run-test-and-hotreload:
ServerEnv=TEST CompileDaemon -log-prefix=false -build="go build" -command="./$(PROJECTNAME)"
build:
go build -o $(ROOT_DIR)/$(PROJECTNAME)
GOPROXY=$(GOPROXY) go build -o $(ROOT_DIR)/$(PROJECTNAME)
run-prod: build-prod
./$(PROJECTNAME)
build-prod:
go build -ldflags "-s -w -X main.VERSION=$(shell git rev-parse --short HEAD)-$(shell date "+%Y%m%d-%H:%M:%S")" -o $(ROOT_DIR)/$(PROJECTNAME)
GOPROXY=$(GOPROXY) go build -ldflags "-s -w -X main.VERSION=$(shell git rev-parse --short HEAD)-$(shell date "+%Y%m%d-%H:%M:%S")" -o $(ROOT_DIR)/$(PROJECTNAME)
.PHONY: help

View File

@@ -5,6 +5,7 @@ import (
. "battle_srv/common"
"battle_srv/common/utils"
"battle_srv/models"
. "battle_srv/protos"
"battle_srv/storage"
"bytes"
"crypto/sha256"
@@ -526,8 +527,10 @@ func (p *playerController) maybeCreatePlayerWechatAuthBinding(userInfo utils.Use
}
if player != nil {
updateInfo := models.Player{
Avatar: userInfo.HeadImgURL,
DisplayName: userInfo.Nickname,
PlayerDownsync: PlayerDownsync{
Avatar: userInfo.HeadImgURL,
DisplayName: userInfo.Nickname,
},
}
tx := storage.MySQLManagerIns.MustBegin()
defer tx.Rollback()
@@ -542,10 +545,12 @@ func (p *playerController) maybeCreatePlayerWechatAuthBinding(userInfo utils.Use
}
now := utils.UnixtimeMilli()
player := models.Player{
CreatedAt: now,
UpdatedAt: now,
DisplayName: userInfo.Nickname,
Avatar: userInfo.HeadImgURL,
PlayerDownsync: PlayerDownsync{
DisplayName: userInfo.Nickname,
Avatar: userInfo.HeadImgURL,
},
CreatedAt: now,
UpdatedAt: now,
}
return p.createNewPlayer(player, userInfo.OpenID, int(Constants.AuthChannel.Wechat))
}
@@ -562,8 +567,10 @@ func (p *playerController) maybeCreatePlayerWechatGameAuthBinding(userInfo utils
}
if player != nil {
updateInfo := models.Player{
Avatar: userInfo.HeadImgURL,
DisplayName: userInfo.Nickname,
PlayerDownsync: PlayerDownsync{
Avatar: userInfo.HeadImgURL,
DisplayName: userInfo.Nickname,
},
}
tx := storage.MySQLManagerIns.MustBegin()
defer tx.Rollback()
@@ -578,10 +585,12 @@ func (p *playerController) maybeCreatePlayerWechatGameAuthBinding(userInfo utils
}
now := utils.UnixtimeMilli()
player := models.Player{
CreatedAt: now,
UpdatedAt: now,
DisplayName: userInfo.Nickname,
Avatar: userInfo.HeadImgURL,
PlayerDownsync: PlayerDownsync{
DisplayName: userInfo.Nickname,
Avatar: userInfo.HeadImgURL,
},
CreatedAt: now,
UpdatedAt: now,
}
return p.createNewPlayer(player, userInfo.OpenID, int(Constants.AuthChannel.WechatGame))
}

View File

@@ -4,6 +4,7 @@ import (
. "battle_srv/common"
"battle_srv/common/utils"
"battle_srv/models"
. "battle_srv/protos"
"battle_srv/storage"
. "dnmshared"
sq "github.com/Masterminds/squirrel"
@@ -71,7 +72,6 @@ func createMysqlData(rows *sqlx.Rows, v string) {
}
}
// 加上tableName参数, 用于pre_conf_data.sqlite里bot_player表的复用 --kobako
func maybeCreateNewPlayerFromBotTable(db *sqlx.DB, tableName string) {
var ls []*dbBotPlayer
err := db.Select(&ls, "SELECT name, magic_phone_country_code, magic_phone_num, display_name FROM "+tableName)
@@ -88,7 +88,6 @@ func maybeCreateNewPlayerFromBotTable(db *sqlx.DB, tableName string) {
panic(err)
}
query = storage.MySQLManagerIns.Rebind(query)
// existNames := make([]string, len(ls), len(ls))
var existPlayers []*models.Player
err = storage.MySQLManagerIns.Select(&existPlayers, query, args...)
if nil != err {
@@ -99,13 +98,11 @@ func maybeCreateNewPlayerFromBotTable(db *sqlx.DB, tableName string) {
var flag bool
for _, v := range existPlayers {
if botPlayer.Name == v.Name {
// 已有数据,合并处理
flag = true
break
}
}
if !flag {
// 找不到,新增
Logger.Debug("create", zap.Any(tableName, botPlayer))
err := createNewBotPlayer(botPlayer)
if err != nil {
@@ -120,11 +117,14 @@ func createNewBotPlayer(p *dbBotPlayer) error {
defer tx.Rollback()
now := utils.UnixtimeMilli()
player := models.Player{
CreatedAt: now,
UpdatedAt: now,
Name: p.Name,
DisplayName: p.DisplayName,
CreatedAt: now,
UpdatedAt: now,
PlayerDownsync: PlayerDownsync{
Name: p.Name,
DisplayName: p.DisplayName,
},
}
err := player.Insert(tx)
if err != nil {
return err

View File

@@ -4,6 +4,7 @@ import (
. "battle_srv/common"
"battle_srv/common/utils"
"battle_srv/models"
. "battle_srv/protos"
"battle_srv/storage"
. "dnmshared"
@@ -75,9 +76,11 @@ func createNewPlayer(p *dbTestPlayer) error {
defer tx.Rollback()
now := utils.UnixtimeMilli()
player := models.Player{
PlayerDownsync: PlayerDownsync{
Name: p.Name,
},
CreatedAt: now,
UpdatedAt: now,
Name: p.Name,
}
err := player.Insert(tx)
if err != nil {

View File

@@ -2,10 +2,9 @@ package models
import (
. "battle_srv/protos"
. "dnmshared/sharedprotos"
)
func toPbPlayers(modelInstances map[int32]*Player) map[int32]*PlayerDownsync {
func toPbPlayers(modelInstances map[int32]*Player, withMetaInfo bool) map[int32]*PlayerDownsync {
toRet := make(map[int32]*PlayerDownsync, 0)
if nil == modelInstances {
return toRet
@@ -13,18 +12,22 @@ func toPbPlayers(modelInstances map[int32]*Player) map[int32]*PlayerDownsync {
for k, last := range modelInstances {
toRet[k] = &PlayerDownsync{
Id: last.Id,
VirtualGridX: last.VirtualGridX,
VirtualGridY: last.VirtualGridY,
Dir: &Direction{
Dx: last.Dir.Dx,
Dy: last.Dir.Dy,
},
Speed: last.Speed,
BattleState: last.BattleState,
Score: last.Score,
Removed: last.Removed,
JoinIndex: last.JoinIndex,
Id: last.Id,
VirtualGridX: last.VirtualGridX,
VirtualGridY: last.VirtualGridY,
DirX: last.DirX,
DirY: last.DirY,
ColliderRadius: last.ColliderRadius,
Speed: last.Speed,
BattleState: last.BattleState,
Score: last.Score,
Removed: last.Removed,
JoinIndex: last.JoinIndex,
}
if withMetaInfo {
toRet[k].Name = last.Name
toRet[k].DisplayName = last.DisplayName
toRet[k].Avatar = last.Avatar
}
}

View File

@@ -1,11 +1,13 @@
package models
import (
"database/sql"
. "dnmshared/sharedprotos"
. "battle_srv/protos"
"battle_srv/storage"
. "dnmshared"
"fmt"
sq "github.com/Masterminds/squirrel"
"github.com/jmoiron/sqlx"
"go.uber.org/zap"
)
type PlayerBattleState struct {
@@ -33,12 +35,7 @@ func InitPlayerBattleStateIns() {
}
type Player struct {
// Meta info fields
Id int32 `json:"id,omitempty" db:"id"`
Name string `json:"name,omitempty" db:"name"`
DisplayName string `json:"displayName,omitempty" db:"display_name"`
Avatar string `json:"avatar,omitempty"`
ColliderRadius float64 `json:"-"`
PlayerDownsync
// DB only fields
CreatedAt int64 `db:"created_at"`
@@ -46,19 +43,10 @@ type Player struct {
DeletedAt NullInt64 `db:"deleted_at"`
TutorialStage int `db:"tutorial_stage"`
// in-battle info fields
VirtualGridX int32
VirtualGridY int32
Dir *Direction
Speed int32
BattleState int32
LastMoveGmtMillis int32
Score int32
Removed bool
JoinIndex int32
// other in-battle info fields
LastSentInputFrameId int32
AckingFrameId int32
AckingInputFrameId int32
LastSentInputFrameId int32
}
func ExistPlayerByName(name string) (bool, error) {
@@ -74,15 +62,43 @@ func GetPlayerById(id int) (*Player, error) {
}
func getPlayer(cond sq.Eq) (*Player, error) {
var p Player
err := getObj("player", cond, &p)
if err == sql.ErrNoRows {
return nil, nil
p := Player{}
pd := PlayerDownsync{}
query, args, err := sq.Select("*").From("player").Where(cond).Limit(1).ToSql()
if err != nil {
return nil, err
}
p.Dir = &Direction{
Dx: 0,
Dy: 0,
rows, err := storage.MySQLManagerIns.Queryx(query, args...)
if err != nil {
return nil, err
}
cols, err := rows.Columns()
if nil != err {
panic(err)
}
for rows.Next() {
// TODO: Do it more elegantly, but by now I don't have time to learn reflection of Golang
vals := rowValues(rows, cols)
for i, col := range cols {
val := *vals[i].(*interface{})
if "id" == col {
pd.Id = int32(val.(int64))
}
if "name" == col {
switch v := val.(type) {
case []byte:
pd.Name = string(v)
default:
pd.Name = fmt.Sprintf("%v", v)
}
}
if "created_at" == col {
p.CreatedAt = int64(val.(int64))
}
}
Logger.Debug("Queried player from db", zap.Any("cond", cond), zap.Any("p", p), zap.Any("pd", pd), zap.Any("cols", cols), zap.Any("rowValues", vals))
}
p.PlayerDownsync = pd
return &p, nil
}
@@ -113,8 +129,6 @@ func Update(tx *sqlx.Tx, id int32, p *Player) (bool, error) {
}
result, err := tx.Exec(query, args...)
if err != nil {
fmt.Println("ERRRRRRR: ")
fmt.Println(err)
return false, err
}
rowsAffected, err := result.RowsAffected()

View File

@@ -10,6 +10,17 @@ import (
"go.uber.org/zap"
)
func rowValues(rows *sqlx.Rows, cols []string) []interface{} {
results := make([]interface{}, len(cols))
for i := range results {
results[i] = new(interface{})
}
if err := rows.Scan(results[:]...); err != nil {
panic(err)
}
return results
}
func exist(t string, cond sq.Eq) (bool, error) {
c, err := getCount(t, cond)
if err != nil {

View File

@@ -1,5 +1,10 @@
package models
import (
. "battle_srv/protos"
"sync"
)
type RingBuffer struct {
Ed int32 // write index, open index
St int32 // read index, closed index
@@ -21,6 +26,10 @@ func NewRingBuffer(n int32) *RingBuffer {
}
func (rb *RingBuffer) Put(pItem interface{}) {
for rb.Cnt >= rb.N-1 {
// Make room for the new element
rb.Pop()
}
rb.Eles[rb.Ed] = pItem
rb.EdFrameId++
rb.Cnt++
@@ -69,5 +78,47 @@ func (rb *RingBuffer) GetByOffset(offsetFromSt int32) interface{} {
}
func (rb *RingBuffer) GetByFrameId(frameId int32) interface{} {
if frameId >= rb.EdFrameId {
return nil
}
return rb.GetByOffset(frameId - rb.StFrameId)
}
func (rb *RingBuffer) cloneInputFrameDownsyncsByFrameIdRange(stFrameId, edFrameId int32, mux *sync.Mutex) (int32, []*InputFrameDownsync) {
dst := make([]*InputFrameDownsync, 0, rb.Cnt)
if nil != mux {
mux.Lock()
defer func() {
mux.Unlock()
}()
}
prevFrameFound := true
j := stFrameId
for j < edFrameId {
tmp := rb.GetByFrameId(j)
if nil == tmp {
if false == prevFrameFound {
// The "id"s are always consecutive
break
} else {
prevFrameFound = false
continue
}
}
foo := tmp.(*InputFrameDownsync)
bar := &InputFrameDownsync{
InputFrameId: foo.InputFrameId,
InputList: make([]uint64, len(foo.InputList)),
ConfirmedList: foo.ConfirmedList,
}
for i, input := range foo.InputList {
bar.InputList[i] = input
}
dst = append(dst, bar)
j++
}
return j, dst
}

File diff suppressed because it is too large Load Diff

View File

@@ -5,6 +5,7 @@ import (
. "dnmshared"
"fmt"
"go.uber.org/zap"
"strings"
"sync"
)
@@ -21,11 +22,13 @@ var (
func (pPq *RoomHeap) PrintInOrder() {
pq := *pPq
fmt.Printf("The RoomHeap instance now contains:\n")
s := make([]string, 0)
s = append(s, fmt.Sprintf("The RoomHeap instance now contains:"))
for i := 0; i < len(pq); i++ {
fmt.Printf("{index: %d, roomID: %d, score: %.2f} ", i, pq[i].Id, pq[i].Score)
s = append(s, fmt.Sprintf("{index: %d, roomID: %d, score: %.2f} ", i, pq[i].Id, pq[i].Score))
}
fmt.Printf("\n")
Logger.Debug(strings.Join(s, "\n"))
}
func (pq RoomHeap) Len() int { return len(pq) }

File diff suppressed because it is too large Load Diff

View File

@@ -16,7 +16,6 @@ import (
"time"
. "dnmshared"
"runtime/debug"
)
const (
@@ -47,9 +46,8 @@ func Serve(c *gin.Context) {
c.AbortWithStatus(http.StatusBadRequest)
return
}
Logger.Info("Finding PlayerLogin record for ws authentication:", zap.Any("intAuthToken", token))
boundRoomId := 0
expectRoomId := 0
expectedRoomId := 0
var err error
if boundRoomIdStr, hasBoundRoomId := c.GetQuery("boundRoomId"); hasBoundRoomId {
boundRoomId, err = strconv.Atoi(boundRoomIdStr)
@@ -58,27 +56,28 @@ func Serve(c *gin.Context) {
c.AbortWithStatus(http.StatusBadRequest)
return
}
Logger.Info("Finding PlayerLogin record for ws authentication:", zap.Any("intAuthToken", token), zap.Any("boundRoomId", boundRoomId))
}
if expectRoomIdStr, hasExpectRoomId := c.GetQuery("expectedRoomId"); hasExpectRoomId {
expectRoomId, err = strconv.Atoi(expectRoomIdStr)
Logger.Debug("Finding PlayerLogin record for ws authentication:", zap.Any("intAuthToken", token), zap.Any("boundRoomId", boundRoomId))
} else if expectedRoomIdStr, hasExpectRoomId := c.GetQuery("expectedRoomId"); hasExpectRoomId {
expectedRoomId, err = strconv.Atoi(expectedRoomIdStr)
if err != nil {
c.AbortWithStatus(http.StatusBadRequest)
return
}
Logger.Info("Finding PlayerLogin record for ws authentication:", zap.Any("intAuthToken", token), zap.Any("expectedRoomId", expectRoomId))
Logger.Debug("Finding PlayerLogin record for ws authentication:", zap.Any("intAuthToken", token), zap.Any("expectedRoomId", expectedRoomId))
} else {
Logger.Debug("Finding PlayerLogin record for ws authentication:", zap.Any("intAuthToken", token))
}
// TODO: Wrap the following 2 stmts by sql transaction!
playerId, err := models.GetPlayerIdByToken(token)
if err != nil || playerId == 0 {
// TODO: Abort with specific message.
Logger.Info("PlayerLogin record not found for ws authentication:", zap.Any("intAuthToken", token))
Logger.Warn("PlayerLogin record not found for ws authentication:", zap.Any("intAuthToken", token))
c.AbortWithStatus(http.StatusBadRequest)
return
}
Logger.Info("PlayerLogin record has been found for ws authentication:", zap.Any("playerId", playerId))
Logger.Info("PlayerLogin record has been found for ws authentication:", zap.Any("playerId", playerId), zap.Any("intAuthToken", token), zap.Any("boundRoomId", boundRoomId), zap.Any("expectedRoomId", expectedRoomId))
conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
if err != nil {
@@ -160,14 +159,14 @@ func Serve(c *gin.Context) {
signalToCloseConnOfThisPlayer(Constants.RetCode.PlayerNotFound, "")
}
Logger.Info("Player has logged in and its profile is found from persistent storage:", zap.Any("playerId", playerId), zap.Any("play", pPlayer))
Logger.Debug("Player has logged in and its profile is found from persistent storage:", zap.Any("playerId", playerId), zap.Any("player", pPlayer))
// Find a room to join.
Logger.Info("About to acquire RoomHeapMux for player:", zap.Any("playerId", playerId))
Logger.Debug("About to acquire RoomHeapMux for player:", zap.Any("playerId", playerId))
(*(models.RoomHeapMux)).Lock()
defer func() {
(*(models.RoomHeapMux)).Unlock()
Logger.Info("Released RoomHeapMux for player:", zap.Any("playerId", playerId))
Logger.Debug("Released RoomHeapMux for player:", zap.Any("playerId", playerId))
}()
defer func() {
if r := recover(); r != nil {
@@ -175,13 +174,12 @@ func Serve(c *gin.Context) {
signalToCloseConnOfThisPlayer(Constants.RetCode.UnknownError, "")
}
}()
Logger.Info("Acquired RoomHeapMux for player:", zap.Any("playerId", playerId))
Logger.Debug("Acquired RoomHeapMux for player:", zap.Any("playerId", playerId))
// Logger.Info("The RoomHeapManagerIns has:", zap.Any("addr", fmt.Sprintf("%p", models.RoomHeapManagerIns)), zap.Any("size", len(*(models.RoomHeapManagerIns))))
playerSuccessfullyAddedToRoom := false
if 0 < boundRoomId {
if tmpPRoom, existent := (*models.RoomMapManagerIns)[int32(boundRoomId)]; existent {
pRoom = tmpPRoom
Logger.Info("Successfully got:\n", zap.Any("roomId", pRoom.Id), zap.Any("playerId", playerId), zap.Any("forBoundRoomId", boundRoomId))
res := pRoom.ReAddPlayerIfPossible(pPlayer, conn, signalToCloseConnOfThisPlayer)
if !res {
Logger.Warn("Failed to get:\n", zap.Any("roomId", pRoom.Id), zap.Any("playerId", playerId), zap.Any("forBoundRoomId", boundRoomId))
@@ -189,19 +187,16 @@ func Serve(c *gin.Context) {
playerSuccessfullyAddedToRoom = true
}
}
}
if 0 < expectRoomId {
if tmpRoom, existent := (*models.RoomMapManagerIns)[int32(expectRoomId)]; existent {
} else if 0 < expectedRoomId {
if tmpRoom, existent := (*models.RoomMapManagerIns)[int32(expectedRoomId)]; existent {
pRoom = tmpRoom
Logger.Info("Successfully got:\n", zap.Any("roomId", pRoom.Id), zap.Any("playerId", playerId), zap.Any("forExpectedRoomId", expectRoomId))
if pRoom.ReAddPlayerIfPossible(pPlayer, conn, signalToCloseConnOfThisPlayer) {
playerSuccessfullyAddedToRoom = true
} else if pRoom.AddPlayerIfPossible(pPlayer, conn, signalToCloseConnOfThisPlayer) {
playerSuccessfullyAddedToRoom = true
} else {
Logger.Warn("Failed to get:\n", zap.Any("roomId", pRoom.Id), zap.Any("playerId", playerId), zap.Any("forExpectedRoomId", expectRoomId))
Logger.Warn("Failed to get:\n", zap.Any("roomId", pRoom.Id), zap.Any("playerId", playerId), zap.Any("forExpectedRoomId", expectedRoomId))
playerSuccessfullyAddedToRoom = false
}
@@ -221,7 +216,7 @@ func Serve(c *gin.Context) {
signalToCloseConnOfThisPlayer(Constants.RetCode.LocallyNoAvailableRoom, fmt.Sprintf("Cannot pop a (*Room) for playerId == %v!", playerId))
} else {
pRoom = tmpRoom
Logger.Info("Successfully popped:\n", zap.Any("roomId", pRoom.Id), zap.Any("playerId", playerId))
Logger.Info("Successfully popped:\n", zap.Any("roomId", pRoom.Id), zap.Any("forPlayerId", playerId))
res := pRoom.AddPlayerIfPossible(pPlayer, conn, signalToCloseConnOfThisPlayer)
if !res {
signalToCloseConnOfThisPlayer(Constants.RetCode.PlayerNotAddableToRoom, fmt.Sprintf("AddPlayerIfPossible returns false for roomId == %v, playerId == %v!", pRoom.Id, playerId))
@@ -247,8 +242,8 @@ func Serve(c *gin.Context) {
bciFrame := &pb.BattleColliderInfo{
BoundRoomId: pRoom.Id,
StageName: pRoom.StageName,
StrToVec2DListMap: pRoom.RawBattleStrToVec2DListMap,
StrToPolygon2DListMap: pRoom.RawBattleStrToPolygon2DListMap,
StrToVec2DListMap: pRoom.StrToVec2DListMap,
StrToPolygon2DListMap: pRoom.StrToPolygon2DListMap,
StageDiscreteW: pRoom.StageDiscreteW,
StageDiscreteH: pRoom.StageDiscreteH,
StageTileW: pRoom.StageTileW,
@@ -269,6 +264,10 @@ func Serve(c *gin.Context) {
WorldToVirtualGridRatio: pRoom.WorldToVirtualGridRatio,
VirtualGridToWorldRatio: pRoom.VirtualGridToWorldRatio,
SpAtkLookupFrames: pRoom.SpAtkLookupFrames,
RenderCacheSize: pRoom.RenderCacheSize,
MeleeSkillConfig: pRoom.MeleeSkillConfig,
}
resp := &pb.WsResp{
@@ -357,7 +356,7 @@ func Serve(c *gin.Context) {
receivingLoopAgainstPlayer := func() error {
defer func() {
if r := recover(); r != nil {
Logger.Error("Goroutine `receivingLoopAgainstPlayer`, recovery spot#1, recovered from: ", zap.Any("panic", r), zap.Any("callstack", debug.Stack()))
Logger.Error("Goroutine `receivingLoopAgainstPlayer`, recovery spot#1, recovered from: ", zap.Any("panic", r))
}
Logger.Info("Goroutine `receivingLoopAgainstPlayer` is stopped for:", zap.Any("playerId", playerId), zap.Any("roomId", pRoom.Id))
}()
@@ -366,7 +365,7 @@ func Serve(c *gin.Context) {
return nil
}
// Tries to receive from client-side in a non-blocking manner.
// 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()
if nil != err {
Logger.Error("About to `signalToCloseConnOfThisPlayer`", zap.Any("roomId", pRoom.Id), zap.Any("playerId", playerId), zap.Error(err))

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

File diff suppressed because one or more lines are too long

View File

@@ -1,3 +1,8 @@
# Double playback speed of a video
```
ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" output.mp4
```
# GIF creation cmd reference
```
ffmpeg -ss 12 -t 13 -i input.mp4 -vf "fps=10,scale=480:-1" -loop 0 output.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 MiB

View File

@@ -5,7 +5,7 @@ all: help
GOPROXY=https://mirrors.aliyun.com/goproxy
build:
go build -o $(ROOT_DIR)/$(PROJECTNAME)
GOPROXY=$(GOPROXY) go build -o $(ROOT_DIR)/$(PROJECTNAME)
run: build
./$(PROJECTNAME)

View File

@@ -4,6 +4,7 @@ go 1.19
require (
dnmshared v0.0.0
battle_srv v0.0.0
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0
github.com/hajimehoshi/ebiten/v2 v2.4.7
github.com/solarlune/resolv v0.5.1
@@ -26,3 +27,4 @@ require (
)
replace dnmshared => ../dnmshared
replace battle_srv => ../battle_srv

View File

@@ -85,8 +85,9 @@ type Game struct {
func NewGame() *Game {
stageName := "simple" // Use this for calibration
// stageName := "simple" // Use this for calibration in isometric orientation
// stageName := "richsoil"
stageName := "dungeon"
stageDiscreteW, stageDiscreteH, stageTileW, stageTileH, playerPosMap, barrierMap, err := parseStage(stageName)
if nil != err {
panic(err)

View File

@@ -1,6 +1,7 @@
package main
import (
. "battle_srv/protos"
. "dnmshared"
. "dnmshared/sharedprotos"
"fmt"
@@ -56,7 +57,7 @@ func NewWorldColliderDisplay(game *Game, stageDiscreteW, stageDiscreteH, stageTi
world.Space = space
moveToCollide := true
moveToCollide := false
if moveToCollide {
newVx, newVy := int32(-2959), int32(-2261)
effPushback := Vec2D{X: float64(0), Y: float64(0)}
@@ -84,6 +85,75 @@ func NewWorldColliderDisplay(game *Game, stageDiscreteW, stageDiscreteH, stageTi
Logger.Info(fmt.Sprintf("effPushback={%v, %v}", effPushback.X, effPushback.Y))
}
}
meleeBullet := &MeleeBullet{
// for offender
StartupFrames: int32(18),
ActiveFrames: int32(1),
RecoveryFrames: int32(61),
RecoveryFramesOnBlock: int32(61),
RecoveryFramesOnHit: int32(61),
Moveforward: &Vec2D{
X: 0,
Y: 0,
},
HitboxOffset: float64(24.0),
HitboxSize: &Vec2D{
X: float64(45.0),
Y: float64(32.0),
},
// for defender
HitStunFrames: int32(18),
BlockStunFrames: int32(9),
Pushback: float64(22.0),
ReleaseTriggerType: int32(1), // 1: rising-edge, 2: falling-edge
Damage: int32(5),
}
bulletLeftToRight := true
if bulletLeftToRight {
xfac := float64(1.0)
offenderWx, offenderWy := playerPosList.Eles[0].X, playerPosList.Eles[0].Y
bulletWx, bulletWy := offenderWx+xfac*meleeBullet.HitboxOffset, offenderWy
newBulletCollider := GenerateRectCollider(bulletWx, bulletWy, meleeBullet.HitboxSize.X, meleeBullet.HitboxSize.Y, spaceOffsetX, spaceOffsetY, "MeleeBullet")
space.Add(newBulletCollider)
bulletShape := newBulletCollider.Shape.(*resolv.ConvexPolygon)
Logger.Warn(fmt.Sprintf("bullet ->: Added bullet collider to space: a=%v", ConvexPolygonStr(bulletShape)))
if collision := newBulletCollider.Check(0, 0); collision != nil {
for _, obj := range collision.Objects {
objShape := obj.Shape.(*resolv.ConvexPolygon)
if overlapped, pushbackX, pushbackY, overlapResult := CalcPushbacks(0, 0, bulletShape, objShape); overlapped {
Logger.Warn(fmt.Sprintf("bullet ->: Overlapped: a=%v, b=%v, pushbackX=%v, pushbackY=%v", ConvexPolygonStr(bulletShape), ConvexPolygonStr(objShape), pushbackX, pushbackY))
} else {
Logger.Warn(fmt.Sprintf("bullet ->: Collided BUT not overlapped: a=%v, b=%v, overlapResult=%v", ConvexPolygonStr(bulletShape), ConvexPolygonStr(objShape), overlapResult))
}
}
}
}
bulletRightToLeft := true
if bulletRightToLeft {
xfac := float64(-1.0)
offenderWx, offenderWy := playerPosList.Eles[1].X, playerPosList.Eles[1].Y
bulletWx, bulletWy := offenderWx+xfac*meleeBullet.HitboxOffset, offenderWy
newBulletCollider := GenerateRectCollider(bulletWx, bulletWy, meleeBullet.HitboxSize.X, meleeBullet.HitboxSize.Y, spaceOffsetX, spaceOffsetY, "MeleeBullet")
space.Add(newBulletCollider)
bulletShape := newBulletCollider.Shape.(*resolv.ConvexPolygon)
Logger.Warn(fmt.Sprintf("bullet <-: Added bullet collider to space: a=%v", ConvexPolygonStr(bulletShape)))
if collision := newBulletCollider.Check(0, 0); collision != nil {
for _, obj := range collision.Objects {
objShape := obj.Shape.(*resolv.ConvexPolygon)
if overlapped, pushbackX, pushbackY, overlapResult := CalcPushbacks(0, 0, bulletShape, objShape); overlapped {
Logger.Warn(fmt.Sprintf("bullet <-: Overlapped: a=%v, b=%v, pushbackX=%v, pushbackY=%v", ConvexPolygonStr(bulletShape), ConvexPolygonStr(objShape), pushbackX, pushbackY))
} else {
Logger.Warn(fmt.Sprintf("bullet <-: Collided BUT not overlapped: a=%v, b=%v, overlapResult=%v", ConvexPolygonStr(bulletShape), ConvexPolygonStr(objShape), overlapResult))
}
}
}
}
return world
}
@@ -98,6 +168,9 @@ func (world *WorldColliderDisplay) Draw(screen *ebiten.Image) {
if o.HasTags("Player") {
drawColor := color.RGBA{0, 255, 0, 255}
DrawPolygon(screen, o.Shape.(*resolv.ConvexPolygon), drawColor)
} else if o.HasTags("MeleeBullet") {
drawColor := color.RGBA{0, 0, 255, 255}
DrawPolygon(screen, o.Shape.(*resolv.ConvexPolygon), drawColor)
} else {
drawColor := color.RGBA{60, 60, 60, 255}
DrawPolygon(screen, o.Shape.(*resolv.ConvexPolygon), drawColor)

View File

@@ -20,6 +20,10 @@ func ConvexPolygonStr(body *resolv.ConvexPolygon) string {
func GenerateRectCollider(origX, origY, w, h, spaceOffsetX, spaceOffsetY float64, tag string) *resolv.Object {
cx, cy := WorldToPolygonColliderAnchorPos(origX, origY, w*0.5, h*0.5, spaceOffsetX, spaceOffsetY)
return GenerateRectColliderInCollisionSpace(cx, cy, w, h, tag)
}
func GenerateRectColliderInCollisionSpace(cx, cy, w, h float64, tag string) *resolv.Object {
collider := resolv.NewObject(cx, cy, w, h, tag)
shape := resolv.NewRectangle(0, 0, w, h)
collider.SetShape(shape)

View File

@@ -406,6 +406,12 @@ type TileRectilinearSize struct {
}
func (pTmxMapIns *TmxMap) continuousObjLayerVecToContinuousMapNodeVec(continuousObjLayerVec *Vec2D) Vec2D {
if "orthogonal" == pTmxMapIns.Orientation {
return Vec2D{
X: continuousObjLayerVec.X,
Y: -continuousObjLayerVec.Y,
}
}
var tileRectilinearSize TileRectilinearSize
tileRectilinearSize.Width = float64(pTmxMapIns.TileWidth)
tileRectilinearSize.Height = float64(pTmxMapIns.TileHeight)
@@ -428,18 +434,24 @@ func (pTmxMapIns *TmxMap) continuousObjLayerVecToContinuousMapNodeVec(continuous
}
func (pTmxMapIns *TmxMap) continuousObjLayerOffsetToContinuousMapNodePos(continuousObjLayerOffset *Vec2D) Vec2D {
layerOffset := Vec2D{
X: 0,
Y: float64(pTmxMapIns.Height*pTmxMapIns.TileHeight) * 0.5,
var layerOffset Vec2D
if "orthogonal" == pTmxMapIns.Orientation {
layerOffset = Vec2D{
X: -float64(pTmxMapIns.Width*pTmxMapIns.TileWidth) * 0.5,
Y: float64(pTmxMapIns.Height*pTmxMapIns.TileHeight) * 0.5,
}
} else {
// "isometric" == pTmxMapIns.Orientation
layerOffset = Vec2D{
X: 0,
Y: float64(pTmxMapIns.Height*pTmxMapIns.TileHeight) * 0.5,
}
}
calibratedVec := continuousObjLayerOffset
convertedVec := pTmxMapIns.continuousObjLayerVecToContinuousMapNodeVec(calibratedVec)
convertedVec := pTmxMapIns.continuousObjLayerVecToContinuousMapNodeVec(continuousObjLayerOffset)
toRet := Vec2D{
return Vec2D{
X: layerOffset.X + convertedVec.X,
Y: layerOffset.Y + convertedVec.Y,
}
return toRet
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1 @@
{"width":128,"imagePath":"SoldierElf_tex.png","height":128,"name":"SoldierElf","SubTexture":[{"frameHeight":45,"y":1,"frameX":0,"width":34,"frameY":0,"height":44,"name":"cape","frameWidth":34,"x":70},{"width":10,"y":107,"height":14,"name":"shouder_l","x":74},{"width":11,"y":107,"height":14,"name":"forearm_l","x":61},{"width":15,"y":93,"height":16,"name":"hand_l","x":1},{"width":30,"y":61,"height":30,"name":"weapon_hand_l","x":1},{"width":8,"y":101,"height":11,"name":"thigh_l","x":86},{"width":12,"y":93,"height":17,"name":"calf_l","x":18},{"width":20,"y":113,"height":8,"name":"foot_l","x":39},{"width":28,"y":61,"height":31,"name":"pelvis","x":33},{"width":8,"y":88,"height":11,"name":"thigh_r","x":77},{"width":12,"y":88,"height":17,"name":"calf_r","x":63},{"width":20,"y":113,"height":8,"name":"foot_r","x":17},{"width":13,"y":94,"height":12,"name":"shouder_r","x":45},{"width":67,"y":1,"height":58,"name":"chest","x":1},{"width":11,"y":94,"height":17,"name":"forearm_r","x":32},{"width":14,"y":111,"height":13,"name":"hand_r","x":1},{"frameHeight":39,"y":47,"frameX":-2,"width":34,"frameY":0,"height":39,"name":"we_bl_4_f_1","frameWidth":36,"x":70}]}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

View File

@@ -0,0 +1 @@
{"imagePath":"Soldier_02_tex.png","width":128,"name":"Soldier_02","SubTexture":[{"x":53,"y":44,"width":23,"name":"biu","height":22},{"x":76,"y":68,"width":9,"name":"rightArm","height":14},{"y":35,"frameY":0,"height":32,"frameWidth":29,"frameX":-1,"frameHeight":32,"width":27,"name":"yinmoqe00","x":89},{"x":53,"y":1,"width":34,"name":"body","height":41},{"x":78,"y":44,"width":9,"name":"rightShoulder","height":13},{"y":50,"frameY":0,"height":18,"frameWidth":19,"frameX":0,"frameHeight":18,"width":19,"name":"rightFrontArm","x":23},{"x":23,"y":70,"width":14,"name":"rightHand","height":14},{"y":68,"frameY":0,"height":12,"frameWidth":12,"frameX":0,"frameHeight":12,"width":12,"name":"leftArm","x":62},{"x":1,"y":73,"width":13,"name":"leftShoulder","height":12},{"x":1,"y":50,"width":20,"name":"leftFrontArm","height":21},{"x":89,"y":1,"width":33,"name":"head","height":32},{"x":1,"y":1,"width":50,"name":"head2","height":47},{"x":44,"y":68,"width":16,"name":"leftHand","height":14},{"y":59,"frameY":-2,"height":4,"frameWidth":8,"frameX":-1,"frameHeight":8,"width":4,"name":"huomiao01","x":78}],"height":128}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

@@ -0,0 +1 @@
{"width":128,"SubTexture":[{"frameWidth":23,"y":50,"frameX":-2,"frameHeight":22,"frameY":-2,"width":19,"height":19,"name":"biu","x":1},{"width":9,"y":50,"height":14,"name":"rightArm","x":42},{"frameWidth":29,"y":34,"frameX":-6,"frameHeight":32,"frameY":0,"width":20,"height":32,"name":"yinmoqe00","x":88},{"frameWidth":34,"y":1,"frameX":0,"frameHeight":41,"frameY":0,"width":33,"height":39,"name":"body","x":53},{"width":9,"y":56,"height":13,"name":"rightShoulder","x":74},{"frameWidth":19,"y":50,"frameX":0,"frameHeight":18,"frameY":0,"width":18,"height":17,"name":"rightFrontArm","x":22},{"width":14,"y":50,"height":14,"name":"rightHand","x":110},{"width":12,"y":42,"height":12,"name":"leftArm","x":74},{"width":13,"y":66,"height":12,"name":"leftShoulder","x":110},{"frameWidth":20,"y":42,"frameX":-1,"frameHeight":21,"frameY":0,"width":19,"height":21,"name":"leftFrontArm","x":53},{"width":50,"y":1,"height":47,"name":"head2","x":1},{"frameWidth":33,"y":1,"frameX":-1,"frameHeight":32,"frameY":0,"width":32,"height":31,"name":"head","x":88},{"width":16,"y":34,"height":14,"name":"leftHand","x":110},{"frameWidth":8,"y":1,"frameX":-2,"frameHeight":8,"frameY":-3,"width":2,"height":2,"name":"huomiao01","x":122}],"height":128,"name":"SoldierWaterGhost","imagePath":"SoldierWaterGhost_tex.png"}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

View File

@@ -1,31 +0,0 @@
{
"__type__": "cc.AnimationClip",
"_name": "Bottom",
"_objFlags": 0,
"_native": "",
"_duration": 0.25,
"sample": 12,
"speed": 1,
"wrapMode": "2",
"curveData": {
"comps": {
"cc.Sprite": {
"spriteFrame": [
{
"frame": 0,
"value": {
"__uuid__": "783f1240-d608-40be-8108-3013ab53cfe6"
}
},
{
"frame": 0.16666666666666666,
"value": {
"__uuid__": "393e649b-addb-4f91-b687-438433026c8d"
}
}
]
}
}
},
"events": []
}

View File

@@ -1,5 +0,0 @@
{
"ver": "2.1.0",
"uuid": "115ea7bb-d47f-4d3c-a52a-f46584346c3f",
"subMetas": {}
}

View File

@@ -1,31 +0,0 @@
{
"__type__": "cc.AnimationClip",
"_name": "BottomLeft",
"_objFlags": 0,
"_native": "",
"_duration": 0.25,
"sample": 12,
"speed": 1,
"wrapMode": "2",
"curveData": {
"comps": {
"cc.Sprite": {
"spriteFrame": [
{
"frame": 0,
"value": {
"__uuid__": "748c55f0-e761-40f6-b13b-e416b3d8a55c"
}
},
{
"frame": 0.16666666666666666,
"value": {
"__uuid__": "6164bac7-9882-43ce-b3d0-9d062d6d0b49"
}
}
]
}
}
},
"events": []
}

View File

@@ -1,5 +0,0 @@
{
"ver": "2.1.0",
"uuid": "a1bf7c7c-b9f7-4b65-86e3-f86a9e798fb6",
"subMetas": {}
}

View File

@@ -1,31 +0,0 @@
{
"__type__": "cc.AnimationClip",
"_name": "BottomRight",
"_objFlags": 0,
"_native": "",
"_duration": 0.25,
"sample": 12,
"speed": 1,
"wrapMode": "2",
"curveData": {
"comps": {
"cc.Sprite": {
"spriteFrame": [
{
"frame": 0,
"value": {
"__uuid__": "34cf9fbb-8def-4faf-a56e-123b4c45706c"
}
},
{
"frame": 0.16666666666666666,
"value": {
"__uuid__": "b6709dd6-6ba7-4222-af38-de79ac80ce8b"
}
}
]
}
}
},
"events": []
}

View File

@@ -1,5 +0,0 @@
{
"ver": "2.1.0",
"uuid": "d5af527a-9f0c-4398-b2dd-84426be7bd32",
"subMetas": {}
}

View File

@@ -1,31 +0,0 @@
{
"__type__": "cc.AnimationClip",
"_name": "Left",
"_objFlags": 0,
"_native": "",
"_duration": 0.25,
"sample": 12,
"speed": 1,
"wrapMode": "2",
"curveData": {
"comps": {
"cc.Sprite": {
"spriteFrame": [
{
"frame": 0,
"value": {
"__uuid__": "02cd24e3-1c4a-46d7-85af-9034c9445ba7"
}
},
{
"frame": 0.16666666666666666,
"value": {
"__uuid__": "1f121837-a493-4a41-90e5-74ea560930ad"
}
}
]
}
}
},
"events": []
}

View File

@@ -1,5 +0,0 @@
{
"ver": "2.1.0",
"uuid": "b60618d7-569d-4f13-bdeb-f20341fbadb6",
"subMetas": {}
}

View File

@@ -1,31 +0,0 @@
{
"__type__": "cc.AnimationClip",
"_name": "Right",
"_objFlags": 0,
"_native": "",
"_duration": 0.25,
"sample": 12,
"speed": 1,
"wrapMode": "2",
"curveData": {
"comps": {
"cc.Sprite": {
"spriteFrame": [
{
"frame": 0,
"value": {
"__uuid__": "a6ec6a1c-dde5-459d-84f9-7b2b8a163e7b"
}
},
{
"frame": 0.16666666666666666,
"value": {
"__uuid__": "b5d11244-f30a-4b0d-b67b-23648d253d44"
}
}
]
}
}
},
"events": []
}

View File

@@ -1,5 +0,0 @@
{
"ver": "2.1.0",
"uuid": "0b3fb38e-9110-4191-9b72-6b64a224d049",
"subMetas": {}
}

View File

@@ -1,31 +0,0 @@
{
"__type__": "cc.AnimationClip",
"_name": "Top",
"_objFlags": 0,
"_native": "",
"_duration": 0.25,
"sample": 12,
"speed": 1,
"wrapMode": "2",
"curveData": {
"comps": {
"cc.Sprite": {
"spriteFrame": [
{
"frame": 0,
"value": {
"__uuid__": "8967d249-e9cf-4e44-85e8-6b9377129d9e"
}
},
{
"frame": 0.16666666666666666,
"value": {
"__uuid__": "492a57fb-6a5c-423a-bcfe-0695a7828881"
}
}
]
}
}
},
"events": []
}

View File

@@ -1,5 +0,0 @@
{
"ver": "2.1.0",
"uuid": "1bc6de53-800b-4da3-ab8e-4a45e3aa4230",
"subMetas": {}
}

View File

@@ -1,31 +0,0 @@
{
"__type__": "cc.AnimationClip",
"_name": "TopLeft",
"_objFlags": 0,
"_native": "",
"_duration": 0.25,
"sample": 12,
"speed": 1,
"wrapMode": "2",
"curveData": {
"comps": {
"cc.Sprite": {
"spriteFrame": [
{
"frame": 0,
"value": {
"__uuid__": "96187689-85df-46e8-b4db-410eae03c135"
}
},
{
"frame": 0.16666666666666666,
"value": {
"__uuid__": "6b002583-7688-43d3-b3fa-102ae0046628"
}
}
]
}
}
},
"events": []
}

View File

@@ -1,5 +0,0 @@
{
"ver": "2.1.0",
"uuid": "ee0d670c-893e-4e4d-96dd-5571db18ee97",
"subMetas": {}
}

View File

@@ -1,31 +0,0 @@
{
"__type__": "cc.AnimationClip",
"_name": "TopRight",
"_objFlags": 0,
"_native": "",
"_duration": 0.25,
"sample": 12,
"speed": 1,
"wrapMode": "2",
"curveData": {
"comps": {
"cc.Sprite": {
"spriteFrame": [
{
"frame": 0,
"value": {
"__uuid__": "ba89046f-8b70-4edb-9f61-534dff476325"
}
},
{
"frame": 0.16666666666666666,
"value": {
"__uuid__": "bc1ef316-d6ad-4538-b223-a0fed8094609"
}
}
]
}
}
},
"events": []
}

View File

@@ -1,5 +0,0 @@
{
"ver": "2.1.0",
"uuid": "596df84a-2e4e-4f1d-967c-a82649f564a8",
"subMetas": {}
}

View File

@@ -1,43 +0,0 @@
{
"__type__": "cc.AnimationClip",
"_name": "attackedLeft",
"_objFlags": 0,
"_native": "",
"_duration": 0.3333333333333333,
"sample": 12,
"speed": 1,
"wrapMode": "2",
"curveData": {
"comps": {
"cc.Sprite": {
"spriteFrame": [
{
"frame": 0,
"value": {
"__uuid__": "02cd24e3-1c4a-46d7-85af-9034c9445ba7"
}
},
{
"frame": 0.08333333333333333,
"value": {
"__uuid__": "8c522ad3-ee82-41a7-892e-05c05442e2e3"
}
},
{
"frame": 0.16666666666666666,
"value": {
"__uuid__": "1f121837-a493-4a41-90e5-74ea560930ad"
}
},
{
"frame": 0.25,
"value": {
"__uuid__": "1c0ec5ec-51cb-467d-b597-8e69ce580cfd"
}
}
]
}
}
},
"events": []
}

View File

@@ -1,5 +0,0 @@
{
"ver": "2.1.0",
"uuid": "8acc4e9f-3c47-4b66-9a9d-d012709680f6",
"subMetas": {}
}

View File

@@ -1,43 +0,0 @@
{
"__type__": "cc.AnimationClip",
"_name": "attackedRight",
"_objFlags": 0,
"_native": "",
"_duration": 0.3333333333333333,
"sample": 12,
"speed": 1,
"wrapMode": "2",
"curveData": {
"comps": {
"cc.Sprite": {
"spriteFrame": [
{
"frame": 0,
"value": {
"__uuid__": "a6ec6a1c-dde5-459d-84f9-7b2b8a163e7b"
}
},
{
"frame": 0.08333333333333333,
"value": {
"__uuid__": "d5ec0aaf-d4a9-4b2e-b9c1-bdc54b355b73"
}
},
{
"frame": 0.16666666666666666,
"value": {
"__uuid__": "b5d11244-f30a-4b0d-b67b-23648d253d44"
}
},
{
"frame": 0.25,
"value": {
"__uuid__": "360dfc7d-4ed1-4fb9-8d2f-7533d05a4830"
}
}
]
}
}
},
"events": []
}

View File

@@ -1,5 +0,0 @@
{
"ver": "2.1.0",
"uuid": "c7cda0cd-dbce-4722-abd2-aeca28263a21",
"subMetas": {}
}

View File

@@ -1,31 +0,0 @@
{
"__type__": "cc.AnimationClip",
"_name": "Bottom",
"_objFlags": 0,
"_native": "",
"_duration": 0.25,
"sample": 12,
"speed": 1,
"wrapMode": "2",
"curveData": {
"comps": {
"cc.Sprite": {
"spriteFrame": [
{
"frame": 0,
"value": {
"__uuid__": "c79694bc-ff6f-416b-9047-b82f41fe791a"
}
},
{
"frame": 0.16666666666666666,
"value": {
"__uuid__": "609c77a2-bdfe-4967-8de6-646532302c97"
}
}
]
}
}
},
"events": []
}

View File

@@ -1,5 +0,0 @@
{
"ver": "2.1.0",
"uuid": "28194c48-ae3b-4197-8263-0d474ae8b9bc",
"subMetas": {}
}

View File

@@ -1,31 +0,0 @@
{
"__type__": "cc.AnimationClip",
"_name": "BottomLeft",
"_objFlags": 0,
"_native": "",
"_duration": 0.25,
"sample": 12,
"speed": 1,
"wrapMode": "2",
"curveData": {
"comps": {
"cc.Sprite": {
"spriteFrame": [
{
"frame": 0,
"value": {
"__uuid__": "07b6d385-3f51-48c1-8165-38756b3d84fa"
}
},
{
"frame": 0.16666666666666666,
"value": {
"__uuid__": "c627bf3b-0e97-4423-aeea-54c7511894d6"
}
}
]
}
}
},
"events": []
}

View File

@@ -1,5 +0,0 @@
{
"ver": "2.1.0",
"uuid": "e1c45a36-2022-4b18-a2db-b5e2e0a120ed",
"subMetas": {}
}

View File

@@ -1,31 +0,0 @@
{
"__type__": "cc.AnimationClip",
"_name": "BottomRight",
"_objFlags": 0,
"_native": "",
"_duration": 0.25,
"sample": 12,
"speed": 1,
"wrapMode": "2",
"curveData": {
"comps": {
"cc.Sprite": {
"spriteFrame": [
{
"frame": 0,
"value": {
"__uuid__": "d0327836-1910-4c6a-9291-c8bb044c54f5"
}
},
{
"frame": 0.16666666666666666,
"value": {
"__uuid__": "1d3e614a-bb2a-4b1d-87ca-0cddd6e03fff"
}
}
]
}
}
},
"events": []
}

View File

@@ -1,5 +0,0 @@
{
"ver": "2.1.0",
"uuid": "126dff26-0ace-439d-89b5-b888aa52d159",
"subMetas": {}
}

View File

@@ -1,31 +0,0 @@
{
"__type__": "cc.AnimationClip",
"_name": "Left",
"_objFlags": 0,
"_native": "",
"_duration": 0.25,
"sample": 12,
"speed": 1,
"wrapMode": "2",
"curveData": {
"comps": {
"cc.Sprite": {
"spriteFrame": [
{
"frame": 0,
"value": {
"__uuid__": "c9528117-c878-41aa-ad5d-641fefcaa89f"
}
},
{
"frame": 0.16666666666666666,
"value": {
"__uuid__": "c0e5d042-8bc1-449b-9a2d-7844129c5188"
}
}
]
}
}
},
"events": []
}

View File

@@ -1,5 +0,0 @@
{
"ver": "2.1.0",
"uuid": "95c2d541-8f99-446a-a7e0-094130ce6d41",
"subMetas": {}
}

View File

@@ -1,31 +0,0 @@
{
"__type__": "cc.AnimationClip",
"_name": "Right",
"_objFlags": 0,
"_native": "",
"_duration": 0.25,
"sample": 12,
"speed": 1,
"wrapMode": "2",
"curveData": {
"comps": {
"cc.Sprite": {
"spriteFrame": [
{
"frame": 0,
"value": {
"__uuid__": "1054cf4c-69a5-4834-8966-03bc613d4483"
}
},
{
"frame": 0.16666666666666666,
"value": {
"__uuid__": "b88522bd-8b6b-44a1-9c84-5518ae7f5c2c"
}
}
]
}
}
},
"events": []
}

View File

@@ -1,5 +0,0 @@
{
"ver": "2.1.0",
"uuid": "380f5fa0-f77f-434a-8f39-d545ee6823c5",
"subMetas": {}
}

View File

@@ -1,31 +0,0 @@
{
"__type__": "cc.AnimationClip",
"_name": "Top",
"_objFlags": 0,
"_native": "",
"_duration": 0.25,
"sample": 12,
"speed": 1,
"wrapMode": "2",
"curveData": {
"comps": {
"cc.Sprite": {
"spriteFrame": [
{
"frame": 0,
"value": {
"__uuid__": "9702ca76-66c8-4ea9-a976-45f86e15830a"
}
},
{
"frame": 0.16666666666666666,
"value": {
"__uuid__": "6390f1c3-b4cc-41df-acfb-645e8f90fb36"
}
}
]
}
}
},
"events": []
}

View File

@@ -1,5 +0,0 @@
{
"ver": "2.1.0",
"uuid": "a306c6de-ccd8-492b-bfec-c6be0a4cbde2",
"subMetas": {}
}

View File

@@ -1,31 +0,0 @@
{
"__type__": "cc.AnimationClip",
"_name": "TopLeft",
"_objFlags": 0,
"_native": "",
"_duration": 0.25,
"sample": 12,
"speed": 1,
"wrapMode": "2",
"curveData": {
"comps": {
"cc.Sprite": {
"spriteFrame": [
{
"frame": 0,
"value": {
"__uuid__": "a669112a-f263-443d-9757-60d0372e0fe8"
}
},
{
"frame": 0.16666666666666666,
"value": {
"__uuid__": "3ed70f56-3b60-4bda-9d2a-8d4b5ecb12f9"
}
}
]
}
}
},
"events": []
}

View File

@@ -1,5 +0,0 @@
{
"ver": "2.1.0",
"uuid": "f496072b-51fd-4406-abbd-9885ac23f7a9",
"subMetas": {}
}

View File

@@ -1,31 +0,0 @@
{
"__type__": "cc.AnimationClip",
"_name": "TopRight",
"_objFlags": 0,
"_native": "",
"_duration": 0.25,
"sample": 12,
"speed": 1,
"wrapMode": "2",
"curveData": {
"comps": {
"cc.Sprite": {
"spriteFrame": [
{
"frame": 0,
"value": {
"__uuid__": "3d84f335-85c4-4dd0-a5d3-38f4da1e1611"
}
},
{
"frame": 0.16666666666666666,
"value": {
"__uuid__": "6d36877f-dc27-4ebc-9407-14fbcf2314df"
}
}
]
}
}
},
"events": []
}

View File

@@ -1,5 +0,0 @@
{
"ver": "2.1.0",
"uuid": "6405ad8b-3084-4b67-8c2e-9b4d34fa3d09",
"subMetas": {}
}

View File

@@ -1,43 +0,0 @@
{
"__type__": "cc.AnimationClip",
"_name": "attackedLeft",
"_objFlags": 0,
"_native": "",
"_duration": 0.3333333333333333,
"sample": 12,
"speed": 1,
"wrapMode": "2",
"curveData": {
"comps": {
"cc.Sprite": {
"spriteFrame": [
{
"frame": 0,
"value": {
"__uuid__": "c9528117-c878-41aa-ad5d-641fefcaa89f"
}
},
{
"frame": 0.08333333333333333,
"value": {
"__uuid__": "987c7dc0-e81f-4891-979d-0998794e6889"
}
},
{
"frame": 0.16666666666666666,
"value": {
"__uuid__": "c0e5d042-8bc1-449b-9a2d-7844129c5188"
}
},
{
"frame": 0.25,
"value": {
"__uuid__": "9205c378-c50c-4303-af32-dbf9422375cf"
}
}
]
}
}
},
"events": []
}

View File

@@ -1,5 +0,0 @@
{
"ver": "2.1.0",
"uuid": "af16cdcb-6e82-4be6-806d-9fc52ae99fff",
"subMetas": {}
}

View File

@@ -1,43 +0,0 @@
{
"__type__": "cc.AnimationClip",
"_name": "attackedRight",
"_objFlags": 0,
"_native": "",
"_duration": 0.3333333333333333,
"sample": 12,
"speed": 1,
"wrapMode": "2",
"curveData": {
"comps": {
"cc.Sprite": {
"spriteFrame": [
{
"frame": 0,
"value": {
"__uuid__": "1054cf4c-69a5-4834-8966-03bc613d4483"
}
},
{
"frame": 0.08333333333333333,
"value": {
"__uuid__": "8f3cf81e-1251-4013-b684-13f2830c7425"
}
},
{
"frame": 0.16666666666666666,
"value": {
"__uuid__": "b88522bd-8b6b-44a1-9c84-5518ae7f5c2c"
}
},
{
"frame": 0.25,
"value": {
"__uuid__": "69f1bd37-6628-4fd1-b0f2-08073d1edb29"
}
}
]
}
}
},
"events": []
}

View File

@@ -1,5 +0,0 @@
{
"ver": "2.1.0",
"uuid": "02eba566-4d22-4fa7-99d7-f032f5845421",
"subMetas": {}
}

View File

@@ -1,6 +1,6 @@
{
"ver": "1.0.1",
"uuid": "135f388e-7e75-4ece-b267-4e07835cba74",
"uuid": "8f2f76c7-649c-414a-80be-b2daef4ed580",
"isSubpackage": false,
"subpackageName": "",
"subMetas": {}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"imagePath":"SoldierWaterGhost_tex.png","width":64,"height":64,"name":"SoldierWaterGhost","SubTexture":[{"frameY":-1,"y":27,"frameWidth":12,"frameHeight":11,"width":10,"height":10,"name":"biu","frameX":-1,"x":1},{"width":5,"y":23,"height":7,"name":"rightArm","x":40},{"frameY":0,"y":19,"frameWidth":15,"frameHeight":16,"width":10,"height":16,"name":"yinmoqe00","frameX":-3,"x":47},{"frameY":0,"y":1,"frameWidth":17,"frameHeight":21,"width":17,"height":20,"name":"body","frameX":0,"x":28},{"width":5,"y":37,"height":7,"name":"rightShoulder","x":42},{"frameY":0,"y":27,"frameWidth":10,"frameHeight":9,"width":9,"height":9,"name":"rightFrontArm","frameX":0,"x":13},{"width":7,"y":38,"height":7,"name":"rightHand","x":13},{"width":6,"y":36,"height":6,"name":"leftArm","x":34},{"width":7,"y":39,"height":6,"name":"leftShoulder","x":1},{"frameY":0,"y":23,"frameWidth":10,"frameHeight":11,"width":10,"height":11,"name":"leftFrontArm","frameX":-1,"x":28},{"width":25,"y":1,"height":24,"name":"head2","x":1},{"frameY":0,"y":1,"frameWidth":17,"frameHeight":16,"width":16,"height":16,"name":"head","frameX":-1,"x":47},{"width":8,"y":36,"height":7,"name":"leftHand","x":24},{"frameY":-2,"y":32,"frameWidth":4,"frameHeight":4,"width":1,"height":1,"name":"huomiao01","frameX":-1,"x":42}]}

View File

@@ -0,0 +1,7 @@
{
"ver": "1.0.0",
"uuid": "e9e703e9-3589-4713-b889-28b23406d220",
"atlasJson": "{\"imagePath\":\"SoldierWaterGhost_tex.png\",\"width\":64,\"height\":64,\"name\":\"SoldierWaterGhost\",\"SubTexture\":[{\"frameY\":-1,\"y\":27,\"frameWidth\":12,\"frameHeight\":11,\"width\":10,\"height\":10,\"name\":\"biu\",\"frameX\":-1,\"x\":1},{\"width\":5,\"y\":23,\"height\":7,\"name\":\"rightArm\",\"x\":40},{\"frameY\":0,\"y\":19,\"frameWidth\":15,\"frameHeight\":16,\"width\":10,\"height\":16,\"name\":\"yinmoqe00\",\"frameX\":-3,\"x\":47},{\"frameY\":0,\"y\":1,\"frameWidth\":17,\"frameHeight\":21,\"width\":17,\"height\":20,\"name\":\"body\",\"frameX\":0,\"x\":28},{\"width\":5,\"y\":37,\"height\":7,\"name\":\"rightShoulder\",\"x\":42},{\"frameY\":0,\"y\":27,\"frameWidth\":10,\"frameHeight\":9,\"width\":9,\"height\":9,\"name\":\"rightFrontArm\",\"frameX\":0,\"x\":13},{\"width\":7,\"y\":38,\"height\":7,\"name\":\"rightHand\",\"x\":13},{\"width\":6,\"y\":36,\"height\":6,\"name\":\"leftArm\",\"x\":34},{\"width\":7,\"y\":39,\"height\":6,\"name\":\"leftShoulder\",\"x\":1},{\"frameY\":0,\"y\":23,\"frameWidth\":10,\"frameHeight\":11,\"width\":10,\"height\":11,\"name\":\"leftFrontArm\",\"frameX\":-1,\"x\":28},{\"width\":25,\"y\":1,\"height\":24,\"name\":\"head2\",\"x\":1},{\"frameY\":0,\"y\":1,\"frameWidth\":17,\"frameHeight\":16,\"width\":16,\"height\":16,\"name\":\"head\",\"frameX\":-1,\"x\":47},{\"width\":8,\"y\":36,\"height\":7,\"name\":\"leftHand\",\"x\":24},{\"frameY\":-2,\"y\":32,\"frameWidth\":4,\"frameHeight\":4,\"width\":1,\"height\":1,\"name\":\"huomiao01\",\"frameX\":-1,\"x\":42}]}",
"texture": "def168c3-3f07-43f9-a460-36b397c70a57",
"subMetas": {}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

@@ -1,6 +1,6 @@
{
"ver": "2.3.3",
"uuid": "c30bd4d7-efdc-410c-8bdf-4a3dfc77bebd",
"uuid": "def168c3-3f07-43f9-a460-36b397c70a57",
"type": "sprite",
"wrapMode": "clamp",
"filterMode": "bilinear",
@@ -9,21 +9,21 @@
"packable": true,
"platformSettings": {},
"subMetas": {
"Tile_W300_H300_S01": {
"SoldierWaterGhost_tex": {
"ver": "1.0.4",
"uuid": "66b49304-7b5b-442c-92a5-d2b368abf659",
"rawTextureUuid": "c30bd4d7-efdc-410c-8bdf-4a3dfc77bebd",
"uuid": "52fb0606-bbea-433c-803b-bf5ce936a0df",
"rawTextureUuid": "def168c3-3f07-43f9-a460-36b397c70a57",
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 4,
"offsetY": -24.5,
"trimX": 97,
"trimY": 85,
"width": 114,
"height": 179,
"rawWidth": 300,
"rawHeight": 300,
"offsetX": 0,
"offsetY": 9,
"trimX": 1,
"trimY": 1,
"width": 62,
"height": 44,
"rawWidth": 64,
"rawHeight": 64,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,

View File

@@ -1,6 +1,6 @@
{
"ver": "1.0.1",
"uuid": "0e243c83-a137-4880-9bfe-9e1b57adc453",
"uuid": "2202f4f4-b792-4dea-8302-633315aded66",
"isSubpackage": false,
"subpackageName": "",
"subMetas": {}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"width":128,"SubTexture":[{"frameWidth":34,"y":1,"frameHeight":45,"width":34,"frameX":0,"height":44,"name":"cape","frameY":0,"x":70},{"width":10,"y":107,"height":14,"name":"shouder_l","x":74},{"width":11,"y":107,"height":14,"name":"forearm_l","x":61},{"width":15,"y":93,"height":16,"name":"hand_l","x":1},{"width":30,"y":61,"height":30,"name":"weapon_hand_l","x":1},{"width":8,"y":88,"height":11,"name":"thigh_l","x":77},{"width":12,"y":93,"height":17,"name":"calf_l","x":18},{"width":20,"y":113,"height":8,"name":"foot_l","x":39},{"width":28,"y":61,"height":31,"name":"pelvis","x":33},{"width":8,"y":101,"height":11,"name":"thigh_r","x":86},{"width":12,"y":88,"height":17,"name":"calf_r","x":63},{"width":20,"y":113,"height":8,"name":"foot_r","x":17},{"width":13,"y":94,"height":12,"name":"shouder_r","x":45},{"width":67,"y":1,"height":58,"name":"chest","x":1},{"width":11,"y":94,"height":17,"name":"forearm_r","x":32},{"width":14,"y":111,"height":13,"name":"hand_r","x":1},{"frameWidth":36,"y":47,"frameHeight":39,"width":34,"frameX":-2,"height":39,"name":"we_bl_4_f_1","frameY":0,"x":70}],"height":128,"name":"SoldierElf","imagePath":"SoldierElf_tex.png"}

View File

@@ -0,0 +1,7 @@
{
"ver": "1.0.0",
"uuid": "24d7bb8f-577c-4e5d-b730-56613ca8685d",
"atlasJson": "{\"width\":128,\"SubTexture\":[{\"frameWidth\":34,\"y\":1,\"frameHeight\":45,\"width\":34,\"frameX\":0,\"height\":44,\"name\":\"cape\",\"frameY\":0,\"x\":70},{\"width\":10,\"y\":107,\"height\":14,\"name\":\"shouder_l\",\"x\":74},{\"width\":11,\"y\":107,\"height\":14,\"name\":\"forearm_l\",\"x\":61},{\"width\":15,\"y\":93,\"height\":16,\"name\":\"hand_l\",\"x\":1},{\"width\":30,\"y\":61,\"height\":30,\"name\":\"weapon_hand_l\",\"x\":1},{\"width\":8,\"y\":88,\"height\":11,\"name\":\"thigh_l\",\"x\":77},{\"width\":12,\"y\":93,\"height\":17,\"name\":\"calf_l\",\"x\":18},{\"width\":20,\"y\":113,\"height\":8,\"name\":\"foot_l\",\"x\":39},{\"width\":28,\"y\":61,\"height\":31,\"name\":\"pelvis\",\"x\":33},{\"width\":8,\"y\":101,\"height\":11,\"name\":\"thigh_r\",\"x\":86},{\"width\":12,\"y\":88,\"height\":17,\"name\":\"calf_r\",\"x\":63},{\"width\":20,\"y\":113,\"height\":8,\"name\":\"foot_r\",\"x\":17},{\"width\":13,\"y\":94,\"height\":12,\"name\":\"shouder_r\",\"x\":45},{\"width\":67,\"y\":1,\"height\":58,\"name\":\"chest\",\"x\":1},{\"width\":11,\"y\":94,\"height\":17,\"name\":\"forearm_r\",\"x\":32},{\"width\":14,\"y\":111,\"height\":13,\"name\":\"hand_r\",\"x\":1},{\"frameWidth\":36,\"y\":47,\"frameHeight\":39,\"width\":34,\"frameX\":-2,\"height\":39,\"name\":\"we_bl_4_f_1\",\"frameY\":0,\"x\":70}],\"height\":128,\"name\":\"SoldierElf\",\"imagePath\":\"SoldierElf_tex.png\"}",
"texture": "050fb016-1a1f-4341-8367-283bfeddc4a8",
"subMetas": {}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

View File

@@ -0,0 +1,34 @@
{
"ver": "2.3.3",
"uuid": "050fb016-1a1f-4341-8367-283bfeddc4a8",
"type": "sprite",
"wrapMode": "clamp",
"filterMode": "bilinear",
"premultiplyAlpha": false,
"genMipmaps": false,
"packable": true,
"platformSettings": {},
"subMetas": {
"SoldierElf_tex": {
"ver": "1.0.4",
"uuid": "c62e1779-f92b-40d3-bf4f-7ab747e33d6e",
"rawTextureUuid": "050fb016-1a1f-4341-8367-283bfeddc4a8",
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": -11.5,
"offsetY": 1.5,
"trimX": 1,
"trimY": 1,
"width": 103,
"height": 123,
"rawWidth": 128,
"rawHeight": 128,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"subMetas": {}
}
}
}

View File

@@ -1,6 +1,6 @@
{
"ver": "1.0.1",
"uuid": "51c54820-d753-4be8-a855-5760eed8f7ef",
"uuid": "f1176719-d1d6-4af5-89c6-ddff16ab85fd",
"isSubpackage": false,
"subpackageName": "",
"subMetas": {}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"width":64,"imagePath":"SoldierFireGhost_tex.png","SubTexture":[{"frameWidth":12,"y":42,"frameHeight":11,"width":11,"frameX":-1,"height":11,"name":"biu","frameY":0,"x":16},{"width":5,"y":42,"height":7,"name":"rightArm","x":29},{"frameWidth":15,"y":27,"frameHeight":16,"width":13,"frameX":-1,"height":16,"name":"yinmoqe00","frameY":0,"x":1},{"width":17,"y":1,"height":21,"name":"body","x":28},{"width":5,"y":42,"height":7,"name":"rightShoulder","x":36},{"width":10,"y":45,"height":9,"name":"rightFrontArm","x":1},{"width":7,"y":56,"height":7,"name":"rightHand","x":1},{"width":6,"y":55,"height":6,"name":"leftArm","x":32},{"width":7,"y":55,"height":6,"name":"leftShoulder","x":23},{"width":10,"y":27,"height":11,"name":"leftFrontArm","x":16},{"width":17,"y":24,"height":16,"name":"head","x":28},{"width":25,"y":1,"height":24,"name":"head2","x":1},{"width":8,"y":55,"height":7,"name":"leftHand","x":13},{"frameWidth":4,"y":51,"frameHeight":4,"width":2,"frameX":-1,"height":2,"name":"huomiao01","frameY":-1,"x":29}],"height":64,"name":"SoldierFireGhost"}

View File

@@ -0,0 +1,7 @@
{
"ver": "1.0.0",
"uuid": "4a9187d5-a9ad-4464-a03c-d2f3cc277051",
"atlasJson": "{\"width\":64,\"imagePath\":\"SoldierFireGhost_tex.png\",\"SubTexture\":[{\"frameWidth\":12,\"y\":42,\"frameHeight\":11,\"width\":11,\"frameX\":-1,\"height\":11,\"name\":\"biu\",\"frameY\":0,\"x\":16},{\"width\":5,\"y\":42,\"height\":7,\"name\":\"rightArm\",\"x\":29},{\"frameWidth\":15,\"y\":27,\"frameHeight\":16,\"width\":13,\"frameX\":-1,\"height\":16,\"name\":\"yinmoqe00\",\"frameY\":0,\"x\":1},{\"width\":17,\"y\":1,\"height\":21,\"name\":\"body\",\"x\":28},{\"width\":5,\"y\":42,\"height\":7,\"name\":\"rightShoulder\",\"x\":36},{\"width\":10,\"y\":45,\"height\":9,\"name\":\"rightFrontArm\",\"x\":1},{\"width\":7,\"y\":56,\"height\":7,\"name\":\"rightHand\",\"x\":1},{\"width\":6,\"y\":55,\"height\":6,\"name\":\"leftArm\",\"x\":32},{\"width\":7,\"y\":55,\"height\":6,\"name\":\"leftShoulder\",\"x\":23},{\"width\":10,\"y\":27,\"height\":11,\"name\":\"leftFrontArm\",\"x\":16},{\"width\":17,\"y\":24,\"height\":16,\"name\":\"head\",\"x\":28},{\"width\":25,\"y\":1,\"height\":24,\"name\":\"head2\",\"x\":1},{\"width\":8,\"y\":55,\"height\":7,\"name\":\"leftHand\",\"x\":13},{\"frameWidth\":4,\"y\":51,\"frameHeight\":4,\"width\":2,\"frameX\":-1,\"height\":2,\"name\":\"huomiao01\",\"frameY\":-1,\"x\":29}],\"height\":64,\"name\":\"SoldierFireGhost\"}",
"texture": "700d963b-2192-4219-a066-8be5b3db7453",
"subMetas": {}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

@@ -0,0 +1,34 @@
{
"ver": "2.3.3",
"uuid": "700d963b-2192-4219-a066-8be5b3db7453",
"type": "sprite",
"wrapMode": "clamp",
"filterMode": "bilinear",
"premultiplyAlpha": false,
"genMipmaps": false,
"packable": true,
"platformSettings": {},
"subMetas": {
"SoldierFireGhost_tex": {
"ver": "1.0.4",
"uuid": "8ef8a6b3-0bac-4cf1-bba0-ab090f4d9e52",
"rawTextureUuid": "700d963b-2192-4219-a066-8be5b3db7453",
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": -9,
"offsetY": 0,
"trimX": 1,
"trimY": 1,
"width": 44,
"height": 62,
"rawWidth": 64,
"rawHeight": 64,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"subMetas": {}
}
}
}

View File

@@ -0,0 +1,7 @@
{
"ver": "1.0.1",
"uuid": "3b7d864f-c9fd-4030-a6dc-9814ee12fec1",
"isSubpackage": false,
"subpackageName": "",
"subMetas": {}
}

View File

@@ -0,0 +1,229 @@
{
"__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": []
}

View File

@@ -0,0 +1,5 @@
{
"ver": "2.1.0",
"uuid": "c738236a-0702-45f8-aa38-99457b051997",
"subMetas": {}
}

View File

@@ -0,0 +1,133 @@
{
"__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": []
}

View File

@@ -0,0 +1,5 @@
{
"ver": "2.1.0",
"uuid": "c69bcceb-d7d1-4e33-9623-e2a374a0a6b6",
"subMetas": {}
}

View File

@@ -0,0 +1,432 @@
{
"__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": []
}
]
}

Some files were not shown because too many files have changed in this diff Show More