mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-12 20:17:49 +00:00
8a54e258a5
The turning interpolation was completely disabled for v7/8, since it interfered with DIG walk scripts. The result was that DIG was the only v7/8 game that still had (script controlled) turning animations. COMI and FT don't use walk scripts. So the actors would just flip directly from the current facing direction to the target facing. I have now changed parts of the walking code (and some other parts) to better match the original v7/8 code.
102 lines
2.5 KiB
C++
102 lines
2.5 KiB
C++
/* ScummVM - Graphic Adventure Engine
|
|
*
|
|
* ScummVM is the legal property of its developers, whose names
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
* file distributed with this source distribution.
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
*/
|
|
|
|
#include "scumm/util.h"
|
|
#include "common/util.h"
|
|
#include "common/textconsole.h"
|
|
|
|
namespace Scumm {
|
|
|
|
#pragma mark -
|
|
#pragma mark --- Utilities ---
|
|
#pragma mark -
|
|
|
|
void assertRange(int min, int value, int max, const char *desc) {
|
|
if (value < min || value > max) {
|
|
error("%s %d is out of bounds (%d,%d)", desc, value, min, max);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Convert an old style direction to a new style one (angle),
|
|
*/
|
|
int newDirToOldDir(int dir) {
|
|
if (dir >= 71 && dir <= 109)
|
|
return 1;
|
|
if (dir >= 109 && dir <= 251)
|
|
return 2;
|
|
if (dir >= 251 && dir <= 289)
|
|
return 0;
|
|
return 3;
|
|
}
|
|
|
|
/**
|
|
* Convert a new style (angle) direction to an old style one.
|
|
*/
|
|
int oldDirToNewDir(int dir) {
|
|
assert(0 <= dir && dir <= 3);
|
|
const int new_dir_table[4] = { 270, 90, 180, 0 };
|
|
return new_dir_table[dir];
|
|
}
|
|
|
|
/**
|
|
* Convert an angle to a simple direction.
|
|
*/
|
|
int toSimpleDir(int dirType, int dir) {
|
|
if (dirType) {
|
|
const int16 directions[] = { 22, 72, 107, 157, 202, 252, 287, 337 };
|
|
for (int i = 0; i < 7; i++)
|
|
if (dir >= directions[i] && dir <= directions[i+1])
|
|
return i+1;
|
|
} else {
|
|
const int16 directions[] = { 71, 109, 251, 289 };
|
|
for (int i = 0; i < 3; i++)
|
|
if (dir >= directions[i] && dir <= directions[i+1])
|
|
return i+1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Convert a simple direction to an angle.
|
|
*/
|
|
int fromSimpleDir(int dirType, int dir) {
|
|
if (dirType)
|
|
return dir * 45;
|
|
else
|
|
return dir * 90;
|
|
}
|
|
|
|
/**
|
|
* Normalize the given angle - that means, ensure it is positive, and
|
|
* change it to the closest multiple of 45 degree by abusing toSimpleDir.
|
|
*/
|
|
int normalizeAngle(int dirType, int angle) {
|
|
int temp;
|
|
|
|
temp = (angle + 360) % 360;
|
|
|
|
return toSimpleDir(dirType, temp) * (dirType ? 45 : 90);
|
|
}
|
|
|
|
} // End of namespace Scumm
|