Files
Leviathan/Client/Game/game/Main/SEventKeyRes.h
T
2026-06-01 12:46:52 +02:00

215 lines
4.0 KiB
C++

#pragma once
//#include <string>
//Sequence 에서 Event 발생 후, 발생된 Event는 다시 사용 안 한도록 수정된것..
template<typename T, bool UseUpperBound = false>
class KEventKeyRes
{
public:
KEventKeyRes()
{
m_keyCount = 0;
m_keys = NULL;
}
virtual ~KEventKeyRes()
{
if ( m_keys )
delete[] m_keys;
}
/// 최소~최대 이벤트 거리
const KInterval &GetInterval()
{
return m_interval;
}
void SetKeyCount( int count, int nLength = 0 )
{
m_keyCount = count;
m_keys = new T[count];
m_nLength = nLength;
}
/// 전체 길이
int GetLength()
{
return m_nLength;
}
int GetKeyCount()
{
return m_keyCount;
}
/// 초기화
void SetInit()
{
for ( int i=0 ; i<m_keyCount ; ++i )
m_keys[i].bUse = false;
}
void SetKey( int index, T *key, int count = 1 )
{
for ( int i=0 ; i<count ; ++i )
m_keys[index + i] = key[i];
sortKeys( index + count );
if(!UseUpperBound)
{
m_interval.Set( m_keys[0].time, m_keys[index+count-1].time );
}
else
{
m_interval.Set( 0, m_keys[index+count-1].time );
}
}
T& GetKey(int iIndex)
{
assert( iIndex>=0 && iIndex < m_keyCount);
return m_keys[iIndex];
}
void Rearrange()
{
sortKeys( m_keyCount );
m_interval.Set( m_keys[0].time, m_keys[m_keyCount-1].time );
}
void SetWholeKey( T *key, int count )
{
SetKeyCount( count );
SetKey( 0, key, count );
}
int GetIndexNumber(int time)
{
T pred;
pred.time = time;
T *found = std::lower_bound( m_keys, (m_keys + m_keyCount), pred );
return static_cast<int>(found - m_keys);
}
void GetData( DWORD time, T*& key1, T*& key2 )
{
T pred;
pred.time = time;
T * found;
if(!UseUpperBound)
{
found = std::lower_bound( m_keys, (m_keys + m_keyCount), pred );
if ( found == m_keys ) // found first key means time less than first time
{
//시간이 크거나, 같아야 하며, 사용하지 않은것 이면,
if( found->time <= time && found->bUse == false )
key1 = found;
else
key1 = NULL;
key2 = NULL;
return;
}
else if ( found == (m_keys+m_keyCount) ) // found end mark return last key
{
if( m_keys[m_keyCount-1].time <= time && m_keys[m_keyCount-1].bUse == false )
key1 = &m_keys[m_keyCount-1];
else
key1 = NULL;
key2 = NULL;
return;
}
else if ( found->time == time )
{
if( found->time <= time && found->bUse == false )
key1 = found;
else
key1 = NULL;
key2 = NULL;
return;
}
if( (found-1)->time <= time && (found-1)->bUse == false )
key1 = (found-1);
else
key1 = NULL;
if( found->time <= time && found->bUse == false )
key2 = found;
else
key2 = NULL;
return;
}
else
{
found = std::upper_bound( m_keys, (m_keys + m_keyCount), pred );
if ( found == (m_keys+m_keyCount - 1) ) // found first key is last key.
{
if( found->time <= time && found->bUse == false )
key1 = found;
else
key1 = NULL;
if( m_keys[0].time <= time && m_keys[0].bUse == false )
key2 = m_keys;
else
key2 = NULL;
return;
}
else if ( found == (m_keys+m_keyCount) ) // found end mark return last key
{
if( m_keys[m_keyCount-1].time <= time && m_keys[m_keyCount-1].bUse == false )
key1 = &m_keys[m_keyCount-1];
else
key1 = NULL;
key2 = NULL;
return;
}
else if ( found->time == time )
{
if( found->time <= time && found->bUse == false )
key1 = found;
else
key1 = NULL;
key2 = NULL;
return;
}
if( found->time <= time && found->bUse == false )
key1 = found;
else
key1 = NULL;
if( (found + 1)->time <= time && (found + 1)->bUse == false )
key2 = found + 1;
else
key2 = NULL;
return;
}
}
void SetName( const std::string & name )
{
m_strName = name;
}
const std::string & GetName()
{
return m_strName;
}
protected:
void sortKeys( int count )
{
std::sort( m_keys, m_keys+count );
}
KInterval m_interval;
int m_nLength;
int m_keyCount;
T* m_keys;
std::string m_strName;
};