From 28ac087bca93232f99ab2fca3755376411caacf5 Mon Sep 17 00:00:00 2001 From: kichikuou Date: Sat, 13 Nov 2021 18:28:43 +0900 Subject: [PATCH] SACT: Improve sprite move animation - Move operation for hidden sprites shouldn't be ignored. - Move time set by SACT.SetMoveTime shouldn't be reset after move. This makes Save Lion in Rance 5D animate smoothly. --- modules/SACT/sprite.c | 13 ++++++------- modules/SACT/sprite_move.c | 14 +++++++++----- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/modules/SACT/sprite.c b/modules/SACT/sprite.c index 656c56c..90b732e 100644 --- a/modules/SACT/sprite.c +++ b/modules/SACT/sprite.c @@ -363,10 +363,8 @@ int sp_set_move(int wNum, int wX, int wY) { sp->move.to.x = wX - sact.origin.x; sp->move.to.y = wY - sact.origin.y; - if (sp->move.time == 0) { - sp->move.time = -1; + if (!sp->move.time && !sp->move.speed) sp->move.speed = 100; - } sp->cur = sp->loc; @@ -382,17 +380,18 @@ int sp_set_movetime(int wNum, int wTime) { sp_assert_no(wNum); sact.sp[wNum]->move.time = wTime * 10; + sact.sp[wNum]->move.speed = 0; return OK; } // スプライト移動速度の設定 -int sp_set_movespeed(int wNum, int wTime) { +int sp_set_movespeed(int wNum, int wSpeed) { sp_assert_no(wNum); - if (wTime == 0) wTime = 1; + if (wSpeed == 0) wSpeed = 1; - sact.sp[wNum]->move.speed = wTime ; - sact.sp[wNum]->move.time = -1; + sact.sp[wNum]->move.speed = wSpeed; + sact.sp[wNum]->move.time = 0; return OK; } diff --git a/modules/SACT/sprite_move.c b/modules/SACT/sprite_move.c index f8a1785..be3b0c9 100644 --- a/modules/SACT/sprite_move.c +++ b/modules/SACT/sprite_move.c @@ -64,7 +64,8 @@ static void move_drain(sprite_t *sp) { sact.teventremovelist = slist_append(sact.teventremovelist, sp); sp->move.moving = FALSE; - sp->move.time = 0; // 移動時間の初期化 + if (sp->move.speed > 0) + sp->move.time = 0; } // SP_MOVE の timer event callback @@ -114,15 +115,18 @@ static int move_cb(sprite_t *sp, agsevent_t *e) { void spev_move_setup(void* data, void* userdata) { sprite_t *sp = (sprite_t *)data; - // 非表示のものは移動しない(いいのかな) - if (!sp->show) return; + // Hidden sprite just moves to its final location. + if (!sp->show) { + sp->cur = sp->loc = sp->move.to; + return; + } // move 開始時刻の記録 sp->move.starttime = sact.movestarttime; sp->move.moving = TRUE; // MOVE_SPEED で設定した場合は、移動量を考慮して移動時間を決定 - if (sp->move.time == -1) { + if (sp->move.speed > 0) { // speed から timeへ int dx = sp->move.to.x - sp->loc.x; int dy = sp->move.to.y - sp->loc.y; @@ -155,7 +159,7 @@ void spev_move_waitend(sprite_t *sp, int dx, int dy, int time) { sp->move.to.x = dx; sp->move.to.y = dy; sp->move.speed = time; - sp->move.time = -1; + sp->move.time = 0; sact.movelist = slist_append(sact.movelist, sp); sact.movestarttime = get_high_counter(SYSTEMCOUNTER_MSEC);