mirror of
https://github.com/openmoh/openmohaa.git
synced 2025-04-28 21:57:57 +03:00
324 lines
6.9 KiB
C++
324 lines
6.9 KiB
C++
/*
|
|
===========================================================================
|
|
Copyright (C) 2024 the OpenMoHAA team
|
|
|
|
This file is part of OpenMoHAA source code.
|
|
|
|
OpenMoHAA source code 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 2 of the License,
|
|
or (at your option) any later version.
|
|
|
|
OpenMoHAA source code 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 OpenMoHAA source code; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
===========================================================================
|
|
*/
|
|
|
|
// skeletor.cpp : Skeletor
|
|
|
|
#include "q_shared.h"
|
|
#include "skeletor.h"
|
|
|
|
void SKEL_Message(const char *fmt, ...)
|
|
{
|
|
static char msg[32000];
|
|
va_list va;
|
|
|
|
va_start(va, fmt);
|
|
Q_vsnprintf(msg, sizeof(msg), fmt, va);
|
|
va_end(va);
|
|
Skel_DPrintf(msg);
|
|
}
|
|
|
|
void SKEL_Warning(const char *fmt, ...)
|
|
{
|
|
char msg[1024];
|
|
va_list va;
|
|
|
|
va_start(va, fmt);
|
|
Q_vsnprintf(msg, sizeof(msg), fmt, va);
|
|
va_end(va);
|
|
Skel_DPrintf(msg);
|
|
}
|
|
|
|
void SKEL_Error(const char *fmt, ...)
|
|
{
|
|
char msg[1024];
|
|
va_list va;
|
|
|
|
va_start(va, fmt);
|
|
Q_vsnprintf(msg, sizeof(msg), fmt, va);
|
|
va_end(va);
|
|
Skel_DPrintf(msg);
|
|
}
|
|
|
|
int FileLength(FILE *pFile)
|
|
{
|
|
int iPos;
|
|
int iEnd;
|
|
|
|
iPos = ftell(pFile);
|
|
fseek(pFile, 0, SEEK_END);
|
|
iEnd = ftell(pFile);
|
|
fseek(pFile, iPos, SEEK_SET);
|
|
|
|
return iEnd;
|
|
}
|
|
|
|
|
|
int skelChannelList_s::GlobalChannel(int localchannel) const
|
|
{
|
|
assert(localchannel < MAX_GLOBAL_FROM_LOCAL);
|
|
return m_chanGlobalFromLocal[localchannel];
|
|
}
|
|
|
|
int skelChannelList_s::LocalChannel(int channel) const
|
|
{
|
|
return GetLocalFromGlobal(channel);
|
|
}
|
|
|
|
int skelChannelList_s::GetLocalFromGlobal(int globalChannel) const
|
|
{
|
|
if (!m_chanLocalFromGlobal) {
|
|
return -1;
|
|
}
|
|
|
|
if (globalChannel >= m_numLocalFromGlobal) {
|
|
return -1;
|
|
}
|
|
|
|
return m_chanLocalFromGlobal[globalChannel];
|
|
}
|
|
|
|
|
|
void skelChannelList_s::SetLocalFromGlobal(int channel, int localchannel)
|
|
{
|
|
m_chanLocalFromGlobal[channel] = localchannel;
|
|
}
|
|
|
|
int skelChannelList_s::NumChannels(void) const
|
|
{
|
|
return m_numChannels;
|
|
}
|
|
|
|
void skelChannelList_s::ZeroChannels()
|
|
{
|
|
int i;
|
|
|
|
m_numChannels = 0;
|
|
m_chanLocalFromGlobal = (short *)Skel_Alloc(MAX_SKELETOR_CHANNELS * sizeof(short));
|
|
m_numLocalFromGlobal = MAX_SKELETOR_CHANNELS;
|
|
|
|
for (i = 0; i < MAX_SKELETOR_CHANNELS; i++) {
|
|
m_chanLocalFromGlobal[i] = -1;
|
|
}
|
|
}
|
|
|
|
void skelChannelList_s::PackChannels()
|
|
{
|
|
m_numLocalFromGlobal = MAX_SKELETOR_CHANNELS - 1;
|
|
for (m_numLocalFromGlobal = MAX_SKELETOR_CHANNELS - 1; m_numLocalFromGlobal >= 0; m_numLocalFromGlobal--) {
|
|
if (m_chanLocalFromGlobal[m_numLocalFromGlobal] != -1) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (m_numLocalFromGlobal < MAX_SKELETOR_CHANNELS) {
|
|
m_numLocalFromGlobal++;
|
|
}
|
|
|
|
if (m_numLocalFromGlobal > 0) {
|
|
short *old_array = m_chanLocalFromGlobal;
|
|
int i;
|
|
|
|
m_chanLocalFromGlobal = (short *)Skel_Alloc(m_numLocalFromGlobal * sizeof(m_chanLocalFromGlobal[0]));
|
|
|
|
for (i = 0; i < m_numLocalFromGlobal; i++) {
|
|
m_chanLocalFromGlobal[i] = old_array[i];
|
|
}
|
|
|
|
Skel_Free(old_array);
|
|
} else {
|
|
Skel_Free(m_chanLocalFromGlobal);
|
|
m_chanLocalFromGlobal = NULL;
|
|
m_numLocalFromGlobal = -1;
|
|
}
|
|
}
|
|
|
|
void skelChannelList_s::CleanUpChannels()
|
|
{
|
|
if (m_chanLocalFromGlobal) {
|
|
Skel_Free(m_chanLocalFromGlobal);
|
|
m_chanLocalFromGlobal = NULL;
|
|
}
|
|
|
|
m_numLocalFromGlobal = 0;
|
|
}
|
|
|
|
void skelChannelList_s::InitChannels()
|
|
{
|
|
m_chanLocalFromGlobal = NULL;
|
|
m_numLocalFromGlobal = 0;
|
|
}
|
|
|
|
int skelChannelList_s::AddChannel(int newGlobalChannelNum)
|
|
{
|
|
short int iLocalChannel;
|
|
|
|
if (newGlobalChannelNum == -1) {
|
|
// Fixed in 2.0
|
|
// Set the global from local to -1
|
|
m_chanGlobalFromLocal[m_numChannels] = -1;
|
|
return m_numChannels++;
|
|
}
|
|
|
|
iLocalChannel = GetLocalFromGlobal(newGlobalChannelNum);
|
|
|
|
if (iLocalChannel < 0) {
|
|
iLocalChannel = m_numChannels++;
|
|
|
|
m_chanGlobalFromLocal[iLocalChannel] = newGlobalChannelNum;
|
|
SetLocalFromGlobal(newGlobalChannelNum, iLocalChannel);
|
|
}
|
|
|
|
return iLocalChannel;
|
|
}
|
|
|
|
qboolean skelChannelList_s::HasChannel(ChannelNameTable *nameTable, const char *channelName) const
|
|
{
|
|
short int iGlobalChannel = nameTable->FindNameLookup(channelName);
|
|
|
|
return iGlobalChannel >= 0 && LocalChannel(iGlobalChannel) >= 0;
|
|
}
|
|
|
|
const char *skelChannelList_s::ChannelName(ChannelNameTable *nameTable, int localChannelNum) const
|
|
{
|
|
if (localChannelNum >= this->m_numChannels || localChannelNum < 0) {
|
|
return NULL;
|
|
}
|
|
|
|
if (m_chanGlobalFromLocal[localChannelNum] < 0) {
|
|
return 0;
|
|
}
|
|
|
|
return nameTable->FindName(m_chanGlobalFromLocal[localChannelNum]);
|
|
}
|
|
|
|
void Skel_ExtractFilePath(const char *path, char *dest)
|
|
{
|
|
const char *src = path + strlen(path);
|
|
|
|
while (src != path) {
|
|
if (*(src - 1) == '\\') {
|
|
break;
|
|
}
|
|
|
|
if (*(src - 1) == '/') {
|
|
break;
|
|
}
|
|
|
|
src--;
|
|
}
|
|
|
|
memcpy(dest, src, src - path);
|
|
dest[src - path] = 0;
|
|
}
|
|
|
|
void Skel_ExtractFileBase(const char *path, char *dest)
|
|
{
|
|
const char *src = path + strlen(path);
|
|
const char *dot = src;
|
|
|
|
while (src != path) {
|
|
if (*(src - 1) == '\\') {
|
|
break;
|
|
}
|
|
|
|
if (*(src - 1) == '/') {
|
|
break;
|
|
}
|
|
|
|
src--;
|
|
}
|
|
|
|
while (dot != src) {
|
|
if (*(dot - 1) != '.') {
|
|
break;
|
|
}
|
|
|
|
dot--;
|
|
}
|
|
|
|
if (dot == src) {
|
|
*dest = 0;
|
|
return;
|
|
}
|
|
|
|
memcpy(dest, src, dot - src);
|
|
dest[dot - src] = 0;
|
|
}
|
|
|
|
void Skel_ExtractFileExtension(const char *path, char *dest)
|
|
{
|
|
const char *src = path + strlen(path);
|
|
|
|
while (src != path) {
|
|
if (*(src - 1) == '.') {
|
|
break;
|
|
}
|
|
|
|
src--;
|
|
}
|
|
|
|
if (src == path) {
|
|
*dest = 0;
|
|
return;
|
|
}
|
|
|
|
strcpy(dest, src);
|
|
}
|
|
|
|
const char *Skel_ExtractFileExtension(const char *in)
|
|
{
|
|
static char exten[8];
|
|
int i;
|
|
|
|
for (i = 0; in[i] != 0; i++) {
|
|
if (in[i] == '.') {
|
|
i++;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!in[i]) {
|
|
return "";
|
|
}
|
|
|
|
strncpy(exten, &in[i], sizeof(exten));
|
|
return exten;
|
|
}
|
|
|
|
void Skel_ExtractFileName(const char *path, char *dest)
|
|
{
|
|
const char *src = path + strlen(path);
|
|
|
|
while (src != path) {
|
|
if (*(src - 1) == '\\') {
|
|
break;
|
|
}
|
|
|
|
if (*(src - 1) == '/') {
|
|
break;
|
|
}
|
|
|
|
src--;
|
|
}
|
|
|
|
strcpy(dest, src);
|
|
}
|