Compare commits

...

43 Commits

Author SHA1 Message Date
genxium
dc66be1599 Improved use of backend ConvertToLastUsedRenderFrameId. 2022-12-06 20:56:09 +08:00
genxium
858eba5243 Updated comments. 2022-12-06 13:53:27 +08:00
Wing
d113cffc7d Merge pull request #13 from genxium/downsync-order-preservation
Fixes for downsync order preservation.
2022-12-06 11:54:49 +08:00
genxium
6af9a14be5 Fixes for downsync order preservation. 2022-12-06 11:49:00 +08:00
genxium
e3fe773634 Fixed (refRenderFrameId, snapshotStFrameId) pairing in "markConfirmationIfApplicable". 2022-12-05 21:17:18 +08:00
genxium
17cac19c62 Fix on backend "createInputsBufferSnapshot". 2022-12-05 17:27:44 +08:00
Wing
26bdd41285 Merge pull request #11 from genxium/backend_locking_improvement
Improved backend implementation.
2022-12-05 15:27:30 +08:00
genxium
6bf70463fa Improved backend implementation. 2022-12-05 15:23:56 +08:00
genxium
e3d844abad Improving backend use of room.InputsBufferLock. 2022-12-04 23:37:01 +08:00
genxium
0373665382 Minor updates on ringbuffer and formatting. 2022-12-02 10:20:58 +08:00
genxium
3b0db64792 Updated README. 2022-12-01 15:46:36 +08:00
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
116 changed files with 30219 additions and 4768 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.33x for file size reduction, kindly note that around ~8s 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/smooth_melee_attack_spedup.gif)
Please also checkout [this demo video](https://pan.baidu.com/s/172AmIKxbFgGXZzWVqxNUPA?pwd=e2tp) 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,16 +1,19 @@
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 {
ADDED_PENDING_BATTLE_COLLIDER_ACK int32
READDED_PENDING_BATTLE_COLLIDER_ACK int32
READDED_BATTLE_COLLIDER_ACKED int32
ACTIVE int32
DISCONNECTED int32
LOST int32
@@ -24,21 +27,17 @@ func InitPlayerBattleStateIns() {
PlayerBattleStateIns = PlayerBattleState{
ADDED_PENDING_BATTLE_COLLIDER_ACK: 0,
READDED_PENDING_BATTLE_COLLIDER_ACK: 1,
ACTIVE: 2,
DISCONNECTED: 3,
LOST: 4,
EXPELLED_DURING_GAME: 5,
EXPELLED_IN_DISMISSAL: 6,
READDED_BATTLE_COLLIDER_ACKED: 2,
ACTIVE: 3,
DISCONNECTED: 4,
LOST: 5,
EXPELLED_DURING_GAME: 6,
EXPELLED_IN_DISMISSAL: 7,
}
}
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 +45,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 +64,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 +131,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

@@ -21,6 +21,10 @@ func NewRingBuffer(n int32) *RingBuffer {
}
func (rb *RingBuffer) Put(pItem interface{}) {
for 0 < rb.Cnt && rb.Cnt >= rb.N {
// Make room for the new element
rb.Pop()
}
rb.Eles[rb.Ed] = pItem
rb.EdFrameId++
rb.Cnt++
@@ -69,5 +73,8 @@ func (rb *RingBuffer) GetByOffset(offsetFromSt int32) interface{} {
}
func (rb *RingBuffer) GetByFrameId(frameId int32) interface{} {
if frameId >= rb.EdFrameId || frameId < rb.StFrameId {
return nil
}
return rb.GetByOffset(frameId - rb.StFrameId)
}

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))
@@ -271,6 +266,8 @@ func Serve(c *gin.Context) {
VirtualGridToWorldRatio: pRoom.VirtualGridToWorldRatio,
SpAtkLookupFrames: pRoom.SpAtkLookupFrames,
RenderCacheSize: pRoom.RenderCacheSize,
MeleeSkillConfig: pRoom.MeleeSkillConfig,
}
resp := &pb.WsResp{
@@ -359,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))
}()
@@ -368,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))

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: 6.0 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

@@ -1,6 +1,7 @@
package main
import (
. "battle_srv/protos"
. "dnmshared"
. "dnmshared/sharedprotos"
"fmt"
@@ -36,7 +37,7 @@ func NewWorldColliderDisplay(game *Game, stageDiscreteW, stageDiscreteH, stageTi
virtualGridToWorldRatio := 0.1
playerDefaultSpeed := 20
minStep := (int(float64(playerDefaultSpeed)*virtualGridToWorldRatio) << 2)
playerColliderRadius := float64(16)
playerColliderRadius := float64(24)
playerColliders := make([]*resolv.Object, len(playerPosList.Eles))
space := resolv.NewSpace(int(spaceW), int(spaceH), minStep, minStep)
for i, playerPos := range playerPosList.Eles {
@@ -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

@@ -1,7 +1,7 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.28.1
// protoc v3.7.1
// protoc v3.21.4
// source: geometry.proto
package sharedprotos

Binary file not shown.

Binary file not shown.

View File

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

View File

Before

Width:  |  Height:  |  Size: 5.4 KiB

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

@@ -0,0 +1,34 @@
{
"ver": "2.3.3",
"uuid": "def168c3-3f07-43f9-a460-36b397c70a57",
"type": "sprite",
"wrapMode": "clamp",
"filterMode": "bilinear",
"premultiplyAlpha": false,
"genMipmaps": false,
"packable": true,
"platformSettings": {},
"subMetas": {
"SoldierWaterGhost_tex": {
"ver": "1.0.4",
"uuid": "52fb0606-bbea-433c-803b-bf5ce936a0df",
"rawTextureUuid": "def168c3-3f07-43f9-a460-36b397c70a57",
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 9,
"trimX": 1,
"trimY": 1,
"width": 62,
"height": 44,
"rawWidth": 64,
"rawHeight": 64,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"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

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

@@ -1,7 +1,7 @@
{
"ver": "1.0.0",
"uuid": "4a9187d5-a9ad-4464-a03c-d2f3cc277051",
"atlasJson": "{\"width\":128,\"SubTexture\":[{\"frameWidth\":23,\"y\":44,\"frameHeight\":22,\"width\":22,\"frameX\":-1,\"height\":22,\"name\":\"biu\",\"frameY\":0,\"x\":53},{\"width\":9,\"y\":68,\"height\":14,\"name\":\"rightArm\",\"x\":76},{\"frameWidth\":29,\"y\":35,\"frameHeight\":32,\"width\":26,\"frameX\":-1,\"height\":32,\"name\":\"yinmoqe00\",\"frameY\":0,\"x\":89},{\"width\":34,\"y\":1,\"height\":41,\"name\":\"body\",\"x\":53},{\"width\":9,\"y\":44,\"height\":13,\"name\":\"rightShoulder\",\"x\":77},{\"width\":19,\"y\":50,\"height\":18,\"name\":\"rightFrontArm\",\"x\":23},{\"width\":14,\"y\":70,\"height\":14,\"name\":\"rightHand\",\"x\":23},{\"width\":12,\"y\":68,\"height\":12,\"name\":\"leftArm\",\"x\":62},{\"width\":13,\"y\":73,\"height\":12,\"name\":\"leftShoulder\",\"x\":1},{\"width\":20,\"y\":50,\"height\":21,\"name\":\"leftFrontArm\",\"x\":1},{\"width\":33,\"y\":1,\"height\":32,\"name\":\"head\",\"x\":89},{\"width\":50,\"y\":1,\"height\":47,\"name\":\"head2\",\"x\":1},{\"width\":16,\"y\":68,\"height\":14,\"name\":\"leftHand\",\"x\":44},{\"frameWidth\":8,\"y\":59,\"frameHeight\":8,\"width\":4,\"frameX\":-1,\"height\":4,\"name\":\"huomiao01\",\"frameY\":-2,\"x\":77}],\"height\":128,\"name\":\"SoldierFireGhost\",\"imagePath\":\"SoldierFireGhost_tex.png\"}",
"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.

Before

Width:  |  Height:  |  Size: 8.3 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

@@ -16,14 +16,14 @@
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": -2.5,
"offsetY": 21,
"offsetX": -9,
"offsetY": 0,
"trimX": 1,
"trimY": 1,
"width": 121,
"height": 84,
"rawWidth": 128,
"rawHeight": 128,
"width": 44,
"height": 62,
"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": "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": []
}
]
}

View File

@@ -0,0 +1,5 @@
{
"ver": "2.1.0",
"uuid": "252b321f-81f4-485c-85bd-ea44d298cb76",
"subMetas": {}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 470 KiB

View File

@@ -0,0 +1,12 @@
{
"ver": "2.3.3",
"uuid": "143f86bf-12d1-4e83-bdb9-a80ccc8b57d2",
"type": "raw",
"wrapMode": "clamp",
"filterMode": "bilinear",
"premultiplyAlpha": false,
"genMipmaps": false,
"packable": true,
"platformSettings": {},
"subMetas": {}
}

View File

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

View File

@@ -0,0 +1,5 @@
{
"ver": "2.1.0",
"uuid": "f51bb583-0010-48f3-a6a1-451a78ac2d65",
"subMetas": {}
}

View File

@@ -1,17 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.2" tiledversion="1.2.3" orientation="orthogonal" renderorder="right-down" width="64" height="64" tilewidth="16" tileheight="16" infinite="0" nextlayerid="2" nextobjectid="12">
<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="39">
<tileset firstgid="1" source="tiles0.tsx"/>
<tileset firstgid="65" source="tiles1.tsx"/>
<layer id="1" name="Ground" width="64" height="64">
<tileset firstgid="129" source="tiles2.tsx"/>
<layer id="2" name="Ground" width="128" height="128">
<data encoding="base64" compression="zlib">
eJzt0jEOwjAUREGLkiLmALRU3In7HwMKkFCUCCwiNrKnmCbVvh8fSikHAAAA/qruYEOr84Zd+vM9re0v+vXr1z9S/7f0l3KZ9dXZ91r67QeAXxyf0jv0Z/tvO9iS7F+T3ucG+Xuk96RvkN4CMJLaIL0VttLy7r19euHdA+zX6YP0vlR3z/3ax2tfarw+TAO0L/VPb3ruXvv3o7z7lv70zuQN0vtgz+6DDSsZ
eJzt2q1u22AYhuEo1UhBtYFWKh/bmRRMRYNFPZPxwcKi7jznSInkWk7teG5ex88FLhQD570d5/PP1WazuQIAAAAAAAAAAAAAAAAAgAmu96r3g/N5bjn0fw5U3aGy/3bv0P+p8XDEdoX0f9//GP3Xp93/YaD/9QJa6f95/fvov26773671zeb7jmhupX+5+2fQH/9qztU9v8yQXUz/fXXX3/9a/ovgf7666+//vrrf1n9/4zc7tue/uvq/9Z4PfLZ7vnz38ZP/cv7T53p4Z7i7/+kv/7667/bl/sO/dff/77T3+9ff/3r+38dMGf/Nv1r+w917+v/0vh1okN/67/l9B/b/nFj/X8pxvYf236r/0UZ6t/X+Efj5kj7bv+uxxPpX9e/r/1NS7f7Z/S/a3zXfzH9Pzrvt/vPTf/l9p+yRjyV/ufvP+YY6M5yzr5D5uy/XUCLJfafa8YfmdJe//X0r6Z/9jGgv/7661/doqp/9fyrpV//Vc+/mv7Z9M+mfzb9s+mfTf9s+mfTP5v+2fTPpn82/bPpn03/bPpn0z+b/tn0z6Z/Nv2z6Z/N+9/Z9M+mfzb//9n0z6Z/Nv2z6Z9N/2z6Z9M/m/7Z0vtT3wEAAAAAAAAAAAAAAAA4v39IY4NC
</data>
</layer>
<objectgroup id="1" name="PlayerStartingPos">
<object id="135" x="512" y="512">
<object id="135" x="1090" y="833.667">
<point/>
</object>
<object id="137" x="640" y="640">
<object id="137" x="1215" y="830.5">
<point/>
</object>
</objectgroup>
@@ -19,71 +20,149 @@
<properties>
<property name="type" value="barrier_and_shelter"/>
</properties>
<object id="1" x="400" y="224.5">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="0,0 0,141.5 17,141.5 17,-1"/>
</object>
<object id="2" x="559.5" y="207.5">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="0,0 1,158.5 17,158.5 17,0"/>
</object>
<object id="3" x="448.5" y="353">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="0,0 0,14.5 -49,14.5 -49,-1.5"/>
</object>
<object id="4" x="577.5" y="351.5">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="0,0 -98,1 -98,16 -1,15.5"/>
</object>
<object id="5" x="449.333" y="654.667">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="0,0 -178.667,0.666667 -178.667,17.3333 -0.666667,17.3333"/>
</object>
<object id="6" x="432.5" y="703.5">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="0,0 -191.667,0.666667 -191.667,17.3333 -0.715174,17.3333"/>
</object>
<object id="7" x="400" y="751">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="0,0 -191.667,0.666667 -191.667,17.3333 -0.715174,17.3333"/>
</object>
<object id="8" x="-9.33333" y="-13.3333">
<object id="8" x="648.242" y="480.606">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="0,0 0,18.6667 1041.33,21.3333 1041.33,-1.33333"/>
</object>
<object id="9" x="-9.33333" y="1014.67">
<object id="9" x="650.667" y="1604.67">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="0,0 0,18.6667 1041.33,21.3333 1041.33,-1.33333"/>
</object>
<object id="10" x="-14" y="-40">
<object id="10" x="634.485" y="505.455">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="0,0 4,1110 24,1110 24,-8"/>
</object>
<object id="11" x="1014" y="-42">
<object id="11" x="1677.64" y="501.333">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="0,0 4,1110 24,1110 24,-8"/>
</object>
<object id="14" x="688.667" y="464">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="0,0 -0.666667,78 33.3333,78 32,-0.666667"/>
</object>
<object id="15" x="833.333" y="495.333">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="0,0 -112,1.33333 -111.333,44.6667 -1.33333,44.6667"/>
</object>
<object id="17" x="832" y="574">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="0,0 -67.3333,0 -67.3333,-76.6667 0.666667,-76"/>
</object>
<object id="18" x="865.333" y="606.667">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="0,0 -210,-0.666667 -210,143.333 0,142.667"/>
</object>
<object id="19" x="754.667" y="1055.33">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="-2,1.33333 -100,0.666667 -97.3333,-454 -9.33333,-451.333"/>
</object>
<object id="20" x="769.333" y="747.333">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="0,0 -115.333,0.666667 -114.667,160.667 -2,162"/>
</object>
<object id="21" x="768" y="960.667">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="0,0 -18,0.666667 -18.6667,95.3333 0,95.3333"/>
</object>
<object id="23" x="786" y="1058.67">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="0,0 0,-52.6667 -20,-52 -19.3333,-1.33333"/>
</object>
<object id="24" x="1118.67" y="749.333">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="0,0 -0.666667,-94 -254,-93.3333 -256.667,1.33333"/>
</object>
<object id="25" x="1168" y="975.333">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="0,0 0,16.6667 224.667,17.3333 225.333,-2"/>
</object>
<object id="28" x="1394.67" y="958">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="0,0 -210.667,1.33333 -210.667,17.3333 -2,18"/>
</object>
<object id="29" x="1119" y="654.5">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="0,0 0,63.5 272.5,65 273,-1"/>
</object>
<object id="30" x="1136.5" y="717.5">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="0,0 -0.5,17 255,17.5 255,1.5"/>
</object>
<object id="31" x="1152" y="735.667">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="0,0 0,15 80.3333,15.3333 80.3333,-2"/>
</object>
<object id="32" x="1280.67" y="734.667">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="0,0 -0.666667,64.3333 48,65 48,0"/>
</object>
<object id="34" x="1329" y="783">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="0,0 63.3333,0.333333 63,-48.3333 -0.666667,-48.3333"/>
</object>
<object id="35" x="1296.67" y="799">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="0,0 -0.666667,31.3333 31.3333,31.6667 31.3333,-0.333333"/>
</object>
<object id="36" x="1280" y="848">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="0,0 0.333333,62 112,63 111.667,-1.33333"/>
</object>
<object id="37" x="1392.33" y="911.333">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="0,0 -81.3333,-0.666667 -81,45 -0.666667,46.3333"/>
</object>
<object id="38" x="1344.33" y="800.667">
<properties>
<property name="boundary_type" value="barrier"/>
</properties>
<polyline points="0,0 0,46.3333 47,46.3333 47,-1"/>
</object>
</objectgroup>
</map>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<tileset version="1.2" tiledversion="1.2.3" name="tiles2" tilewidth="16" tileheight="16" tilecount="64" columns="16">
<image source="watabou_pixel_dungeon_orig_files/tiles2.png" width="256" height="64"/>
</tileset>

View File

@@ -0,0 +1,5 @@
{
"ver": "2.0.0",
"uuid": "2e53500f-f9c8-4b5b-b74c-f2adbc2ec34d",
"subMetas": {}
}

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