Initial import master
authorSimon Morgan <sjm@sjm.io>
Sun, 31 Dec 2017 15:43:44 +0000 (15:43 +0000)
committerSimon Morgan <sjm@sjm.io>
Sun, 31 Dec 2017 15:43:44 +0000 (15:43 +0000)
30 files changed:
Audio.cpp [new file with mode: 0644]
Audio.h [new file with mode: 0644]
Audio_DLL.cpp [new file with mode: 0644]
C2_Ice.MAK [new file with mode: 0644]
C2_Ice.dsp [new file with mode: 0644]
C2_Ice.dsw [new file with mode: 0644]
C2_Ice.opt [new file with mode: 0644]
C2_Ice.plg [new file with mode: 0644]
Characters.cpp [new file with mode: 0644]
Game.cpp [new file with mode: 0644]
Hunt.h [new file with mode: 0644]
Hunt2.cpp [new file with mode: 0644]
IceAge.eal [new file with mode: 0644]
Interface.cpp [new file with mode: 0644]
Loading.cpp [new file with mode: 0644]
Render3DFX.cpp [new file with mode: 0644]
RenderSoft.cpp [new file with mode: 0644]
Resources.cpp [new file with mode: 0644]
a.bat [new file with mode: 0644]
action.ico [new file with mode: 0644]
mathematics.cpp [new file with mode: 0644]
renderasm.cpp [new file with mode: 0644]
renderd3d.cpp [new file with mode: 0644]
resource.h [new file with mode: 0644]
resource.rc [new file with mode: 0644]
trophy00.sav [new file with mode: 0644]
trophy01.sav [new file with mode: 0644]
v_3dfx.ren [new file with mode: 0644]
v_d3d.ren [new file with mode: 0644]
v_soft.ren [new file with mode: 0644]

diff --git a/Audio.cpp b/Audio.cpp
new file mode 100644 (file)
index 0000000..15e3d70
--- /dev/null
+++ b/Audio.cpp
@@ -0,0 +1,616 @@
+#include <windows.h>\r
+#include <math.h>\r
+\r
+#define _AUDIO_\r
+#include "audio.h"\r
+\r
+HANDLE hAudioThread;\r
+DWORD  AudioTId;\r
+WAVEFORMATEX wf;\r
+HWND hwndApp;\r
+BOOL AudioNeedRestore;\r
+char logtt[128];\r
+void PrintLog(LPSTR l);\r
+\r
+int  InitDirectSound( HWND );\r
+BOOL CALLBACK EnumerateSoundDevice(GUID FAR *, LPSTR, LPSTR, LPVOID );\r
+\r
+void Audio_MixSound(int DestAddr, int SrcAddr, int MixLen, int LVolume, int RVolume);\r
+void Audio_MixChannels();\r
+void Audio_MixAmbient();\r
+void Audio_MixAmbient3d();\r
+\r
+\r
+DWORD WINAPI ProcessAudioThread (LPVOID ptr)\r
+{\r
+   for (;;) {\r
+    if (iSoundActive)\r
+       ProcessAudio();\r
+    Sleep(70);\r
+   }\r
+   return 0;\r
+}\r
+\r
+\r
+\r
+void Init_SetCooperative()\r
+{\r
+       \r
+}\r
+\r
+\r
+int InitDirectSound( HWND hwnd)\r
+{\r
+   PrintLog("\n");\r
+   PrintLog("==Init Direct Sound==\n");\r
\r
+   HRESULT hres;\r
+   iTotalSoundDevices = 0;   \r
+\r
+   lpSoundBuffer = (char*) _SoundBufferData;\r
+   if( !lpSoundBuffer )\r
+      return 0;\r
+   PrintLog("Back Sound Buffer created.\n");\r
+\r
+   for( int i = 0; i < MAX_SOUND_DEVICE; i++ )       \r
+      sdd[i].DSC.dwSize = sizeof( DSCAPS );\r
+      \r
+\r
+   hres = DirectSoundEnumerate( (LPDSENUMCALLBACK)EnumerateSoundDevice, NULL);\r
+   if( hres != DS_OK ) {\r
+      wsprintf(logtt, "DirectSoundEnumerate Error: %Xh\n", hres);\r
+         PrintLog(logtt);\r
+      return 0;\r
+   }\r
+   PrintLog("DirectSoundEnumerate: Ok\n");\r
+\r
+\r
+   iTotal16SD = 0;\r
+   for( i = 0; i < iTotalSoundDevices; i++ ) {\r
+      LPDIRECTSOUND lpds;\r
+      if( DirectSoundCreate( &sdd[i].Guid, &lpds, NULL ) != DS_OK ) continue;\r
+\r
+      if( lpds->GetCaps( &sdd[i].DSC ) != DS_OK ) continue;\r
+\r
+      if( sdd[i].DSC.dwFlags & (DSCAPS_PRIMARY16BIT | DSCAPS_PRIMARYSTEREO | DSCAPS_SECONDARY16BIT | DSCAPS_SECONDARYSTEREO ) ) {\r
+         sdd[i].status = 1;\r
+         iTotal16SD++;\r
+                wsprintf(logtt,"Acceptable device: %d\n",i);\r
+                PrintLog(logtt);\r
+      }\r
+   }\r
+\r
+   if (!iTotal16SD) return 0;\r
+   iCurrentDriver = 0;\r
+   while( !sdd[iCurrentDriver].status )\r
+          iCurrentDriver++;\r
+   \r
+   wsprintf(logtt,"Device selected  : %d\n",iCurrentDriver);\r
+   PrintLog(logtt);\r
+\r
+\r
+   hres = DirectSoundCreate( &sdd[iCurrentDriver].Guid, &lpDS, NULL );   \r
+   if( (hres != DS_OK) || (!lpDS) ) {\r
+         wsprintf(logtt, "DirectSoundCreate Error: %Xh\n", hres);\r
+         PrintLog(logtt);\r
+      return 0;\r
+   }\r
+   PrintLog("DirectSoundCreate: Ok\n");\r
+\r
+\r
+   PrimaryMode = TRUE;\r
+   PrintLog("Attempting to set WRITEPRIMARY CooperativeLevel:\n");\r
+   hres = lpDS->SetCooperativeLevel( hwnd, DSSCL_WRITEPRIMARY );\r
+   if (hres != DS_OK) {          \r
+         wsprintf(logtt, "SetCooperativeLevel Error: %Xh\n", hres);\r
+         PrintLog(logtt);\r
+      PrimaryMode = FALSE;\r
+   } else\r
+    PrintLog("Set Cooperative  : Ok\n");\r
+\r
+\r
+   if (!PrimaryMode) {\r
+          PrintLog("Attempting to set EXCLUSIVE CooperativeLevel:\n");\r
+          hres = lpDS->SetCooperativeLevel( hwnd, DSSCL_EXCLUSIVE);\r
+       if (hres != DS_OK) {         \r
+            wsprintf(logtt, "==>>SetCooperativeLevel Error: %Xh\n", hres);\r
+            PrintLog(logtt);\r
+                return 0;\r
+          }   \r
+       PrintLog("Set Cooperative  : Ok\n");\r
+   }\r
+\r
+\r
+/*======= creating primary buffer ==============*/\r
+   CopyMemory( &WaveFormat, &wf, sizeof( WAVEFORMATEX ) );\r
+   \r
+   DSBUFFERDESC dsbd;\r
+   dsbd.dwSize = sizeof( DSBUFFERDESC );\r
+   dsbd.dwFlags = DSBCAPS_PRIMARYBUFFER;\r
+   dsbd.dwBufferBytes = 0;\r
+   dsbd.lpwfxFormat = NULL; \r
+   dsbd.dwReserved = 0;\r
+   \r
+   hres = lpDS->CreateSoundBuffer( &dsbd, &lpdsPrimary, NULL );\r
+   if( hres != DS_OK ) {\r
+         wsprintf(logtt, "==>>CreatePrimarySoundBuffer Error: %Xh\n", hres);\r
+         PrintLog(logtt);\r
+      return 0;\r
+   }   \r
+   PrintLog("CreateSoundBuffer: Ok (Primary)\n");\r
+   lpdsWork = lpdsPrimary;\r
+\r
+   hres = lpdsPrimary->SetFormat( &wf );\r
+   if( hres != DS_OK ) {\r
+         wsprintf(logtt, "SetFormat Error: %Xh\n", hres);\r
+         PrintLog(logtt);\r
+      return 0;\r
+   }   \r
+   PrintLog("SetFormat        : Ok\n");\r
+   \r
+\r
+\r
+\r
+\r
+   if (PrimaryMode) goto SKIPSECONDARY;\r
+\r
+// ========= creating secondary ================//\r
+   dsbd.dwSize = sizeof( DSBUFFERDESC );\r
+   dsbd.dwFlags = 0;\r
+   dsbd.dwBufferBytes = 2*8192;\r
+   dsbd.lpwfxFormat = &wf; \r
+   dsbd.dwReserved = 0;\r
+   \r
+   hres = lpDS->CreateSoundBuffer( &dsbd, &lpdsSecondary, NULL );\r
+   if( hres != DS_OK ) {\r
+         wsprintf(logtt, "CreateSecondarySoundBuffer Error: %Xh\n", hres);\r
+         PrintLog(logtt);\r
+      return 0;\r
+   }   \r
+   PrintLog("CreateSoundBuffer: Ok (Secondary)\n");\r
+   lpdsWork = lpdsSecondary;\r
+\r
+\r
+SKIPSECONDARY:\r
+   \r
+   \r
+   DSBCAPS dsbc;\r
+   dsbc.dwSize = sizeof( DSBCAPS );\r
+   lpdsWork->GetCaps( &dsbc );\r
+   iBufferLength = dsbc.dwBufferBytes;\r
+   iBufferLength /= 8192;\r
+         \r
+   hres = lpdsWork->Play( 0, 0, DSBPLAY_LOOPING );\r
+   if( hres != DS_OK ) {\r
+      wsprintf(logtt, "Play Error: %Xh\n", hres);\r
+         PrintLog(logtt);\r
+      return 0;   \r
+   }\r
+   PrintLog("Play             : Ok\n");\r
+   \r
+\r
+\r
+\r
+   iSoundActive = 1;\r
+   FillMemory( channel, sizeof( CHANNEL )*MAX_CHANNEL, 0 );\r
+   ambient.iLength = 0;\r
+\r
+   hAudioThread = CreateThread(NULL, 0, ProcessAudioThread, NULL, 0, &AudioTId);\r
+   SetThreadPriority(hAudioThread, THREAD_PRIORITY_HIGHEST);\r
+\r
+   PrintLog("Direct Sound activated.\n");\r
+   return 1;\r
+}\r
+\r
+\r
+void InitAudioSystem(HWND hw)\r
+{   \r
+   hwndApp = hw;\r
+   wf.wFormatTag      = WAVE_FORMAT_PCM;\r
+   wf.nChannels       = 2;\r
+   wf.nSamplesPerSec  = 11025*2;\r
+   wf.nAvgBytesPerSec = 44100*2;\r
+   wf.nBlockAlign     = 4;\r
+   wf.wBitsPerSample  = 16;\r
+   wf.cbSize          = 0;\r
+   if( !InitDirectSound( hwndApp ) )\r
+      PrintLog("Sound System failed\n");\r
+}\r
+\r
+\r
+void AudioStop()\r
+{\r
+  FillMemory(&ambient, sizeof(ambient), 0);\r
+  FillMemory(&mambient, sizeof(mambient), 0);\r
+  FillMemory(&ambient2, sizeof(ambient2), 0);\r
+  FillMemory(channel, sizeof( CHANNEL )*MAX_CHANNEL, 0 );\r
+  AudioNeedRestore = TRUE;\r
+}\r
+\r
+\r
+void AudioSetCameraPos(float cx, float cy, float cz, float ca, float cb)\r
+{\r
+  xCamera = (int) cx;\r
+  yCamera = (int) cy;\r
+  zCamera = (int) cz;\r
+  alphaCamera = ca;\r
+  cosa = (float)cos(ca);\r
+  sina = (float)sin(ca);\r
+}\r
+\r
+\r
+void SetAmbient(int length, short int* lpdata, int av)\r
+{\r
+   if (!iSoundActive) return;\r
+   \r
+   if (ambient.lpData == lpdata) return;\r
+      \r
+   ambient2 = ambient;\r
+\r
+   ambient.iLength = length;\r
+   ambient.lpData = lpdata;\r
+   ambient.iPosition = 0;\r
+   ambient.volume = 0;\r
+   ambient.avolume = av;\r
+}\r
+\r
+\r
+void SetAmbient3d(int length, short int* lpdata, float cx, float cy, float cz)\r
+{\r
+   if (!iSoundActive) return;\r
+   \r
+   if (mambient.iPosition >= length) mambient.iPosition = 0;\r
+      \r
+   mambient.iLength = length;\r
+   mambient.lpData = lpdata;\r
+   mambient.x = cx;\r
+   mambient.y = cy;\r
+   mambient.z = cz;   \r
+}\r
+\r
+\r
+\r
+void AddVoice3dv(int length, short int* lpdata, float cx, float cy, float cz, int vol)\r
+{\r
+   if (!iSoundActive) return;\r
+   if (lpdata == 0) return;\r
+\r
+   for( int i = 0; i < MAX_CHANNEL; i++ ) \r
+     if( !channel[i].status ) {                  \r
+         channel[i].iLength = length;\r
+         channel[i].lpData  = lpdata;\r
+         channel[i].iPosition = 0;\r
+\r
+         channel[i].x = (int)cx;\r
+         channel[i].y = (int)cy;\r
+         channel[i].z = (int)cz;\r
+\r
+         channel[i].status = 1;\r
+                channel[i].volume = vol;\r
+\r
+         return;\r
+      }\r
+   return;\r
+}\r
+\r
+\r
+void AddVoice3d(int length, short int* lpdata, float cx, float cy, float cz)\r
+{\r
+   AddVoice3dv(length, lpdata, cx, cy, cz, 256);\r
+}\r
+\r
+\r
+void AddVoicev(int length, short int* lpdata, int v)\r
+{      \r
+   AddVoice3dv(length, lpdata, 0, 0, 0, v);   \r
+}\r
+\r
+\r
+\r
+void AddVoice(int length, short int* lpdata)\r
+{\r
+   AddVoice3dv(length, lpdata, 0,0,0, 256);\r
+}\r
+\r
+\r
+\r
+\r
+BOOL CALLBACK EnumerateSoundDevice( GUID* lpGuid, LPSTR lpstrDescription, LPSTR lpstrModule, LPVOID lpContext)\r
+{\r
+   if( lpGuid == NULL )\r
+       if( !iTotalSoundDevices )\r
+           return TRUE;\r
+       else\r
+           return FALSE;   \r
+   wsprintf(logtt,"Device%d: ",iTotalSoundDevices);\r
+   PrintLog(logtt);\r
+   PrintLog(lpstrDescription);\r
+   PrintLog("/");\r
+   PrintLog(lpstrModule);\r
+   PrintLog("\n");\r
+   \r
+\r
+   CopyMemory( &sdd[iTotalSoundDevices].Guid, lpGuid, sizeof( GUID ) );\r
+\r
+   iTotalSoundDevices++;\r
+\r
+   return TRUE;\r
+}\r
+\r
+\r
+void Audio_Shutdown()\r
+{\r
+   if (!iSoundActive) return;\r
+   \r
+   lpdsWork->Stop();      \r
+   TerminateThread(hAudioThread ,0);\r
+}\r
+\r
+void Audio_Restore()\r
+{\r
+   if (!iSoundActive) return;\r
+   \r
+   lpdsWork->Stop();      \r
+   lpdsWork->Restore();\r
+   HRESULT hres = lpdsWork->Play( 0, 0, DSBPLAY_LOOPING );   \r
+   if (hres != DS_OK) AudioNeedRestore = TRUE;\r
+                 else AudioNeedRestore = FALSE;\r
+   \r
+   if (!AudioNeedRestore)\r
+          PrintLog("Audio restored.\n");\r
+}\r
+\r
+\r
+int ProcessAudio()\r
+{\r
+   LPVOID lpStart1;\r
+   LPVOID lpStart2;\r
+   DWORD  len1, len2;\r
+   HRESULT hres;\r
+   static int PrevBlock = 1;            \r
+\r
+   if (AudioNeedRestore) Audio_Restore();\r
+   if (AudioNeedRestore) return 1;\r
+\r
+   hres = lpdsWork->GetCurrentPosition( &len1, &dwWritePos );\r
+   hres = lpdsWork->GetCurrentPosition( &len2, &dwWritePos );\r
+   if( hres != DS_OK ) { AudioNeedRestore = TRUE; return 0; }\r
+\r
+   if ( (len1>len2) || (len1<len2+16) ) \r
+       hres = lpdsWork->GetCurrentPosition( &len2, &dwWritePos );   \r
+   \r
+   if (len1+len2==0) {\r
+          Sleep(5);\r
+          lpdsWork->GetCurrentPosition( &len2, &dwWritePos );\r
+       if (!len2) { AudioNeedRestore = TRUE; return 0; }\r
+   }\r
+\r
+   dwPlayPos = len2;\r
+\r
+   int CurBlock = dwPlayPos / (4096*2);\r
+   if (CurBlock==PrevBlock) return 1;\r
+\r
+   if( (int)dwPlayPos < CurBlock*4096*2 + 2) return 1; // it's no time to put info\r
+\r
+   FillMemory( lpSoundBuffer, MAX_BUFFER_LENGTH*2, 0 );\r
+   Audio_MixChannels();\r
+   Audio_MixAmbient();\r
+   Audio_MixAmbient3d();\r
+\r
+   PrevBlock = CurBlock; \r
+   int NextBlock = (CurBlock + 1) % iBufferLength;\r
+   hres = lpdsWork->Lock(NextBlock*4096*2, 4096*2, &lpStart1, &len1, &lpStart2, &len2, 0 );\r
+   if( hres != DS_OK ) {                    \r
+         return 0;      \r
+                }\r
+   \r
+   CopyMemory( lpStart1, lpSoundBuffer, 4096*2);\r
+         \r
+   hres = lpdsWork->Unlock( lpStart1, len1, lpStart2, len2 );\r
+   if( hres != DS_OK ) \r
+         return 0;         \r
+   \r
+   return 1;\r
+}\r
+\r
+\r
+void CalcLRVolumes(int v0, int x, int y, int z, int &lv, int &rv)\r
+{\r
+   if (x==0) {\r
+    lv = v0*180;\r
+    rv = v0*180;\r
+    return;  }\r
+\r
+   v0*=200;\r
+   x-=xCamera;\r
+   y-=yCamera;\r
+   z-=zCamera;\r
+   float xx = (float)x * cosa + (float)z * sina;\r
+   float yy = (float)y;\r
+   float zz = (float)fabs((float)z * cosa - (float)x * sina);\r
+\r
+   float xa = (float)fabs(xx);\r
+   float l = 0.8f;\r
+   float r = 0.8f;\r
+   float d = (float)sqrt( xx*xx + yy*yy + zz*zz) - MIN_RADIUS;\r
+   float k;\r
+   if (d<=0) k=1.f;\r
+    //else k = (MAX_RADIUS - d) / MAX_RADIUS;\r
+     else k = 1224.f / (1224 + d);\r
+   if (d>6000) {\r
+          d-=6000;\r
+          k = k * (4000 - d) / (4000);\r
+        }\r
+   if (k<0) k=0.f;\r
+\r
+   float fi = (float)atan2(xa, zz);\r
+   r = 0.7f + 0.3f * fi / (3.141593f/2.f);\r
+   l = 0.7f - 0.6f * fi / (3.141593f/2.f);\r
+\r
+   if (xx>0) { lv=(int)(v0*l*k); rv=(int)(v0*r*k); }\r
+        else { lv=(int)(v0*r*k); rv=(int)(v0*l*k); }\r
+}\r
+\r
+\r
+void Audio_MixChannels()\r
+{\r
+    int iMixLen;\r
+    int srcofs;\r
+    int LV, RV;\r
+\r
+    for( int i = 0; i < MAX_CHANNEL; i++ )        \r
+      if( channel[ i ].status ) {\r
+         if( channel[ i ].iPosition + 2048*2 >= channel[ i ].iLength )\r
+             iMixLen = (channel[ i ].iLength - channel[ i ].iPosition)>>1;\r
+          else\r
+             iMixLen = 1024*2;\r
+\r
+         srcofs = (int) channel[i].lpData + channel[i].iPosition;\r
+         CalcLRVolumes(channel[i].volume, channel[i].x, channel[i].y, channel[i].z, LV, RV);\r
+         if (LV || RV)\r
+           Audio_MixSound((int)lpSoundBuffer, srcofs, iMixLen, LV, RV);\r
+\r
+         if (channel[ i ].iPosition + 2048*2 >= channel[ i ].iLength ) \r
+           channel[ i ].status = 0; else channel[ i ].iPosition += 2048*2;         \r
+      }\r
+}\r
+\r
+\r
+void Audio_DoMixAmbient(AMBIENT &ambient)\r
+{\r
+    if (ambient.lpData==0) return;\r
+    int iMixLen,srcofs;    \r
+       int v = (32000 * ambient.volume * ambient.avolume) / 256 / 256;\r
+\r
+    if( ambient.iPosition + 2048*2 >= ambient.iLength )\r
+         iMixLen = (ambient.iLength - ambient.iPosition)>>1;\r
+       else iMixLen = 1024*2;\r
+\r
+    srcofs = (int) ambient.lpData + ambient.iPosition;\r
+    Audio_MixSound((int)lpSoundBuffer, srcofs, iMixLen, v, v);\r
+\r
+    if (ambient.iPosition + 2048*2 >= ambient.iLength ) \r
+       ambient.iPosition=0; else ambient.iPosition += 2048*2;\r
+    \r
+    if (iMixLen<1024*2) {\r
+      Audio_MixSound((int)lpSoundBuffer + iMixLen*4, \r
+                     (int)ambient.lpData, 1024*2-iMixLen, v, v);\r
+      ambient.iPosition+=(1024*2-iMixLen)*2;\r
+    }\r
+}\r
+\r
+\r
+void Audio_MixAmbient()\r
+{\r
+       Audio_DoMixAmbient(ambient);\r
+       if (ambient.volume<256) ambient.volume = min(ambient.volume+16, 256);\r
+\r
+       if (ambient2.volume) Audio_DoMixAmbient(ambient2);\r
+       if (ambient2.volume>0) ambient2.volume = max(ambient2.volume-16, 0);    \r
+}\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+void Audio_MixAmbient3d()\r
+{\r
+    if (mambient.lpData==0) return;\r
+    int iMixLen,srcofs;    \r
+       int LV, RV;\r
+\r
+       CalcLRVolumes(256, (int)mambient.x, (int)mambient.y, (int)mambient.z, LV, RV);\r
+       if (!(LV || RV)) return;\r
+\r
+\r
+    if( mambient.iPosition + 2048*2 >= mambient.iLength )\r
+         iMixLen = (mambient.iLength - mambient.iPosition)>>1;\r
+       else iMixLen = 1024*2;\r
+\r
+    srcofs = (int) mambient.lpData + mambient.iPosition;\r
+    Audio_MixSound((int)lpSoundBuffer, srcofs, iMixLen, LV, RV);\r
+\r
+    if (mambient.iPosition + 2048*2 >= mambient.iLength ) \r
+        mambient.iPosition=0; else mambient.iPosition += 2048*2;\r
+    \r
+    if (iMixLen<1024*2) {\r
+      Audio_MixSound((int)lpSoundBuffer + iMixLen*4, \r
+                     (int)mambient.lpData, 1024*2-iMixLen, LV, RV);\r
+      mambient.iPosition+=(1024*2-iMixLen)*2;\r
+    }\r
+}\r
+\r
+\r
+\r
+\r
+\r
+\r
+void Audio_MixSound(int DestAddr, int SrcAddr, int MixLen, int LVolume, int RVolume) \r
+{\r
+_asm {\r
+       mov      edi, DestAddr                    \r
+       mov      ecx, MixLen         \r
+       mov      esi, SrcAddr\r
+     }\r
+      \r
+SOUND_CYCLE :\r
+\r
+_asm {                \r
+       movsx    eax, word ptr [esi]\r
+       imul     LVolume\r
+       sar      eax, 16\r
+       mov      bx, word ptr [edi]\r
+               \r
+       add      ax, bx\r
+       jo       LEFT_CHECK_OVERFLOW\r
+       mov      word ptr [edi], ax\r
+       jmp      CYCLE_RIGHT\r
+ }\r
+LEFT_CHECK_OVERFLOW :\r
+__asm {\r
+       cmp      bx, 0\r
+       js       LEFT_MAX_NEGATIVE\r
+       mov      ax, 32767\r
+       mov      word ptr [edi], ax\r
+       jmp      CYCLE_RIGHT\r
+}\r
+LEFT_MAX_NEGATIVE :\r
+__asm  mov      word ptr [edi], -32767\r
+                           \r
+      \r
+\r
+\r
+CYCLE_RIGHT :\r
+__asm {\r
+       movsx    eax, word ptr [esi]\r
+       imul     dword ptr RVolume\r
+       sar      eax, 16\r
+       mov      bx, word ptr [edi+2]\r
+               \r
+       add      ax, bx\r
+       jo       RIGHT_CHECK_OVERFLOW\r
+       mov      word ptr [edi+2], ax\r
+       jmp      CYCLE_CONTINUE\r
+} \r
+RIGHT_CHECK_OVERFLOW :\r
+__asm {\r
+       cmp      bx, 0\r
+       js       RIGHT_MAX_NEGATIVE\r
+       mov      word ptr [edi+2], 32767\r
+       jmp      CYCLE_CONTINUE\r
+}\r
+RIGHT_MAX_NEGATIVE :\r
+__asm  mov      word ptr [edi+2], -32767\r
+      \r
+CYCLE_CONTINUE :  \r
+__asm {\r
+       add      edi, 4\r
+       add      esi, 2\r
+       dec      ecx\r
+       jnz      SOUND_CYCLE\r
+}\r
+}
\ No newline at end of file
diff --git a/Audio.h b/Audio.h
new file mode 100644 (file)
index 0000000..e6e2f11
--- /dev/null
+++ b/Audio.h
@@ -0,0 +1,101 @@
+#include <dsound.h>\r
+\r
+#ifdef _AUDIO_\r
+   #define _SOUND_H_\r
+#else\r
+   #define _SOUND_H_ extern\r
+#endif\r
+\r
+#define MAX_SOUND_DEVICE      16\r
+#define MAX_VOICE             1024\r
+#define MAX_CHANNEL           16\r
+#define MAX_SB_LENGTH         1024             // number of shorts of the buffer\r
+#define MAX_BUFFER_LENGTH     MAX_SB_LENGTH*4  // real lenght of buffer in bytes\r
+\r
+#define LEFT_LOW        32\r
+#define LEFT_MIDDLE     88\r
+#define LEFT_HIGH       144\r
+\r
+#define RIGHT_LOW       144\r
+#define RIGHT_MIDDLE    200\r
+#define RIGHT_HIGH      256\r
+\r
+#define MAX_RADIUS         6000\r
+#define MIN_RADIUS         512\r
+\r
+\r
+typedef struct tagSOUNDDEVICEDESC {\r
+   GUID Guid;\r
+   char* lpstrDescription;\r
+   char* lpstrModule;\r
+   DSCAPS DSC;\r
+   int status;\r
+} SOUNDDEVICEDESC;\r
+\r
+typedef struct tagCHANNEL {   \r
+   int status;     // 0 means that channel is free\r
+   int iLength;    // filled when appropriate voice is assigned to the channel \r
+   int iPosition;  // position of next portion to read\r
+   short int* lpData;\r
+   int x, y, z;    // coords of the voice\r
+   int volume;   // for aligning\r
+} CHANNEL;\r
+\r
+typedef struct tagAMBIENT {\r
+   int iLength;\r
+   short int* lpData;      // voice this channel is referenced to   \r
+   int iPosition;  // position of next portion to read   \r
+   int volume, avolume;\r
+} AMBIENT;\r
+\r
+typedef struct tagMAMBIENT {\r
+   int iLength;\r
+   short int* lpData;      // voice this channel is referenced to   \r
+   int iPosition;  // position of next portion to read         \r
+   float x,y,z;    \r
+} MAMBIENT;\r
+\r
+\r
+\r
+\r
+\r
+void  AddVoice(int, short int*);\r
+void  AddVoicev(int, short int*);\r
+void  AddVoice3d(int, short int*, float, float, float);\r
+void  AddVoice3dv(int, short int*, float, float, float, int);\r
+\r
+void SetAmbient(int, short int*, int);\r
+void SetAmbient3d(int, short int*, float, float, float);\r
+void SetAmbient3d(int, short int*, float, float, float, int);\r
+void InitAudioSystem(HWND);\r
+\r
+int  ProcessAudio( void );\r
+void AudioSetCameraPosition( float, float, float,  float, float);\r
+void AudioStop();\r
+\r
+\r
+\r
+_SOUND_H_ SOUNDDEVICEDESC sdd[MAX_SOUND_DEVICE];\r
+_SOUND_H_ int iTotalSoundDevices;\r
+_SOUND_H_ int iTotal16SD;\r
+_SOUND_H_ int iCurrentDriver;\r
+_SOUND_H_ int iBufferLength;\r
+_SOUND_H_ int iSoundActive; // prevent playing voices on not ready device\r
+_SOUND_H_ int iNeedNextWritePosition; // is set to 1 when first voice is added\r
+_SOUND_H_ DWORD dwPlayPos;\r
+_SOUND_H_ DWORD dwWritePos;\r
+\r
+_SOUND_H_ char _SoundBufferData[1024*16];\r
+_SOUND_H_ char* lpSoundBuffer;\r
+\r
+_SOUND_H_ LPDIRECTSOUND lpDS;\r
+_SOUND_H_ WAVEFORMATEX WaveFormat;\r
+_SOUND_H_ LPDIRECTSOUNDBUFFER lpdsPrimary, lpdsSecondary, lpdsWork;\r
+_SOUND_H_ BOOL PrimaryMode;\r
+\r
+_SOUND_H_ CHANNEL channel[ MAX_CHANNEL ];\r
+_SOUND_H_ AMBIENT ambient, ambient2;\r
+_SOUND_H_ MAMBIENT mambient;\r
+\r
+_SOUND_H_ int xCamera, yCamera, zCamera;\r
+_SOUND_H_ float alphaCamera, cosa, sina;\r
diff --git a/Audio_DLL.cpp b/Audio_DLL.cpp
new file mode 100644 (file)
index 0000000..311cf52
--- /dev/null
@@ -0,0 +1,175 @@
+#include <windows.h>\r
+#include "hunt.h"\r
+\r
+#define req_versionH 0x0001\r
+#define req_versionL 0x0002\r
+\r
+HINSTANCE hAudioDLL = NULL;\r
+void DoHalt(LPSTR);\r
+\r
+typedef void (WINAPI * LPFUNC1)(void);\r
+typedef void (WINAPI * LPFUNC2)(HWND, HANDLE);\r
+typedef void (WINAPI * LPFUNC3)(float, float, float, float, float);\r
+typedef void (WINAPI * LPFUNC4)(int, short int*, int);\r
+typedef void (WINAPI * LPFUNC5)(int, short int*, float, float, float);\r
+typedef void (WINAPI * LPFUNC6)(int, short int*, float, float, float, int);\r
+\r
+typedef int  (WINAPI * LPFUNC7)(void);\r
+typedef void (WINAPI * LPFUNC8)(int, float);\r
+\r
+typedef void (WINAPI * LPFUNC9)(int, AudioQuad *);\r
+LPFUNC9 audio_uploadgeometry;\r
+\r
+LPFUNC1 audio_restore;\r
+LPFUNC1 audiostop;\r
+LPFUNC1 audio_shutdown;\r
+\r
+LPFUNC2 initaudiosystem;\r
+LPFUNC3 audiosetcamerapos;\r
+LPFUNC4 setambient;\r
+LPFUNC5 setambient3d;\r
+LPFUNC6 addvoice3dv;\r
+LPFUNC7 audio_getversion;\r
+LPFUNC8 audio_setenvironment;\r
+\r
+\r
+void Audio_Shutdown()\r
+{\r
+       if (audio_shutdown) audio_shutdown();\r
+       if (hAudioDLL)          FreeLibrary(hAudioDLL);\r
+       hAudioDLL = NULL;\r
+       audio_shutdown = NULL;\r
+}\r
+\r
+\r
+void InitAudioSystem(HWND hw, HANDLE hlog, int  driver)\r
+{\r
+       Audio_Shutdown();\r
+\r
+       switch (driver) {\r
+       case 0:\r
+         hAudioDLL = LoadLibrary("a_soft.dll");\r
+         if (!hAudioDLL) DoHalt("Can't load A_SOFT.DLL");     \r
+         break;\r
+       case 1:\r
+        hAudioDLL = LoadLibrary("a_ds3d.dll");\r
+        if (!hAudioDLL) DoHalt("Can't load A_DS3D.DLL");\r
+        break;\r
+       case 2:\r
+        hAudioDLL = LoadLibrary("a_a3d.dll");\r
+        if (!hAudioDLL) DoHalt("Can't load A_A3D.DLL");\r
+        break;\r
+       case 3:\r
+        hAudioDLL = LoadLibrary("a_eax.dll");\r
+        if (!hAudioDLL) DoHalt("Can't load A_EAX.DLL");\r
+        break;     \r
+       }\r
+       \r
+\r
+       initaudiosystem   = (LPFUNC2) GetProcAddress(hAudioDLL, "InitAudioSystem");\r
+       if (!initaudiosystem) DoHalt("Can't find procedure address.");\r
+       \r
+       audio_restore     = (LPFUNC1) GetProcAddress(hAudioDLL, "Audio_Restore");\r
+       if (!audio_restore) DoHalt("Can't find procedure address.");\r
+\r
+       audiostop         = (LPFUNC1) GetProcAddress(hAudioDLL, "AudioStop");\r
+       if (!audiostop)   DoHalt("Can't find procedure address.");\r
+\r
+       audio_shutdown    = (LPFUNC1) GetProcAddress(hAudioDLL, "Audio_Shutdown");\r
+       if (!audio_shutdown) DoHalt("Can't find procedure address.");\r
+\r
+       audiosetcamerapos = (LPFUNC3) GetProcAddress(hAudioDLL, "AudioSetCameraPos");\r
+       if (!audiosetcamerapos) DoHalt("Can't find procedure address.");\r
+\r
+       setambient        = (LPFUNC4) GetProcAddress(hAudioDLL, "SetAmbient");\r
+       if (!setambient) DoHalt("Can't find procedure address.");\r
+\r
+       setambient3d      = (LPFUNC5) GetProcAddress(hAudioDLL, "SetAmbient3d");\r
+       if (!setambient3d) DoHalt("Can't find procedure address.");\r
+\r
+       addvoice3dv       = (LPFUNC6) GetProcAddress(hAudioDLL, "AddVoice3dv");\r
+       if (!addvoice3dv) DoHalt("Can't find procedure address.");      \r
+\r
+       audio_getversion  = (LPFUNC7) GetProcAddress(hAudioDLL, "Audio_GetVersion");\r
+       if (!audio_getversion) DoHalt("Can't find procedure address.");\r
+\r
+       audio_setenvironment = (LPFUNC8) GetProcAddress(hAudioDLL, "Audio_SetEnvironment");\r
+       if (!audio_setenvironment) DoHalt("Can't find procedure address.");\r
+\r
+       audio_uploadgeometry = (LPFUNC9) GetProcAddress(hAudioDLL, "Audio_UploadGeometry");\r
+       if (!audio_uploadgeometry) DoHalt("Can't find procedure Audio_UploadGeometry address.");\r
+\r
+       int v1 = audio_getversion()>>16;\r
+       int v2 = audio_getversion() & 0xFFFF;\r
+       if ( (v1!=req_versionH) || (v2<req_versionL) )\r
+               DoHalt("Incorrect audio driver version.");\r
+\r
+       initaudiosystem(hw, hlog);              \r
+}\r
+\r
+void Audio_UploadGeometry()\r
+{\r
+       UploadGeometry();\r
+       audio_uploadgeometry(AudioFCount, data);\r
+}\r
+\r
+void AudioStop()\r
+{\r
+    audiostop();\r
+}\r
+\r
+void Audio_Restore()\r
+{\r
+       if (audio_restore)\r
+         audio_restore();\r
+}\r
+\r
+\r
+\r
+void AudioSetCameraPos(float cx, float cy, float cz, float ca, float cb)\r
+{      \r
+       audiosetcamerapos(cx, cy, cz, ca, cb);          \r
+}\r
+\r
+\r
+void Audio_SetEnvironment(int e, float f)\r
+{\r
+   audio_setenvironment(e, f);\r
+}\r
+\r
+void SetAmbient(int length, short int* lpdata, int av)\r
+{\r
+       setambient(length, lpdata, av);\r
+}\r
+\r
+\r
+void SetAmbient3d(int length, short int* lpdata, float cx, float cy, float cz)\r
+{\r
+       setambient3d(length, lpdata, cx, cy, cz);\r
+}\r
+\r
+\r
+void AddVoice3dv(int length, short int* lpdata, float cx, float cy, float cz, int vol)\r
+{\r
+       addvoice3dv(length, lpdata, cx, cy, cz, vol);\r
+}\r
+\r
+\r
+\r
+\r
+void AddVoice3d(int length, short int* lpdata, float cx, float cy, float cz)\r
+{\r
+   AddVoice3dv(length, lpdata, cx, cy, cz, 256);   \r
+}\r
+\r
+\r
+void AddVoicev(int length, short int* lpdata, int v)\r
+{      \r
+   AddVoice3dv(length, lpdata, 0,0,0, v);   \r
+}\r
+\r
+\r
+void AddVoice(int length, short int* lpdata)\r
+{\r
+   AddVoice3dv(length, lpdata, 0,0,0, 256);\r
+}
\ No newline at end of file
diff --git a/C2_Ice.MAK b/C2_Ice.MAK
new file mode 100644 (file)
index 0000000..c0b865f
--- /dev/null
@@ -0,0 +1,895 @@
+# Microsoft Developer Studio Generated NMAKE File, Based on C2.DSP\r
+!IF "$(CFG)" == ""\r
+CFG=C2 - Win32 Debug_D3D\r
+!MESSAGE No configuration specified. Defaulting to C2 - Win32 Debug_D3D.\r
+!ENDIF \r
+\r
+!IF "$(CFG)" != "C2 - Win32 Debug_Soft" && "$(CFG)" != "C2 - Win32 Debug_3DFX"\\r
+ && "$(CFG)" != "C2 - Win32 Debug_D3D" && "$(CFG)" != "C2 - Win32 Release_Soft"\\r
+ && "$(CFG)" != "C2 - Win32 Release_3DFX" && "$(CFG)" !=\\r
+ "C2 - Win32 Release_D3D"\r
+!MESSAGE Invalid configuration "$(CFG)" specified.\r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "C2.MAK" CFG="C2 - Win32 Debug_D3D"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "C2 - Win32 Debug_Soft" (based on "Win32 (x86) Application")\r
+!MESSAGE "C2 - Win32 Debug_3DFX" (based on "Win32 (x86) Application")\r
+!MESSAGE "C2 - Win32 Debug_D3D" (based on "Win32 (x86) Application")\r
+!MESSAGE "C2 - Win32 Release_Soft" (based on "Win32 (x86) Application")\r
+!MESSAGE "C2 - Win32 Release_3DFX" (based on "Win32 (x86) Application")\r
+!MESSAGE "C2 - Win32 Release_D3D" (based on "Win32 (x86) Application")\r
+!MESSAGE \r
+!ERROR An invalid configuration is specified.\r
+!ENDIF \r
+\r
+!IF "$(OS)" == "Windows_NT"\r
+NULL=\r
+!ELSE \r
+NULL=nul\r
+!ENDIF \r
+\r
+!IF  "$(CFG)" == "C2 - Win32 Debug_Soft"\r
+\r
+OUTDIR=.\DEBUG_S\r
+INTDIR=.\DEBUG_S\r
+# Begin Custom Macros\r
+OutDir=.\DEBUG_S\r
+# End Custom Macros\r
+\r
+!IF "$(RECURSE)" == "0" \r
+\r
+ALL : "$(OUTDIR)\C2.exe"\r
+\r
+!ELSE \r
+\r
+ALL : "$(OUTDIR)\C2.exe"\r
+\r
+!ENDIF \r
+\r
+CLEAN :\r
+       -@erase "$(INTDIR)\Audio_DLL.obj"\r
+       -@erase "$(INTDIR)\Characters.obj"\r
+       -@erase "$(INTDIR)\Game.obj"\r
+       -@erase "$(INTDIR)\Hunt2.obj"\r
+       -@erase "$(INTDIR)\Interface.obj"\r
+       -@erase "$(INTDIR)\mathematics.obj"\r
+       -@erase "$(INTDIR)\Render3DFX.obj"\r
+       -@erase "$(INTDIR)\renderd3d.obj"\r
+       -@erase "$(INTDIR)\RenderSoft.obj"\r
+       -@erase "$(INTDIR)\resource.res"\r
+       -@erase "$(INTDIR)\Resources.obj"\r
+       -@erase "$(INTDIR)\vc50.idb"\r
+       -@erase "$(INTDIR)\vc50.pdb"\r
+       -@erase "$(OUTDIR)\C2.exe"\r
+       -@erase "$(OUTDIR)\C2.ilk"\r
+       -@erase "$(OUTDIR)\C2.pdb"\r
+\r
+"$(OUTDIR)" :\r
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"\r
+\r
+CPP=cl.exe\r
+CPP_PROJ=/nologo /MLd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS"\\r
+ /D "_soft" /Fp"$(INTDIR)\C2.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c \r
+CPP_OBJS=.\DEBUG_S/\r
+CPP_SBRS=.\r
+\r
+.c{$(CPP_OBJS)}.obj::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+.cpp{$(CPP_OBJS)}.obj::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+.cxx{$(CPP_OBJS)}.obj::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+.c{$(CPP_SBRS)}.sbr::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+.cpp{$(CPP_SBRS)}.sbr::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+.cxx{$(CPP_SBRS)}.sbr::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+MTL=midl.exe\r
+MTL_PROJ=/nologo /D "_DEBUG" /mktyplib203 /o NUL /win32 \r
+RSC=rc.exe\r
+RSC_PROJ=/l 0x409 /fo"$(INTDIR)\resource.res" /d "_DEBUG" \r
+BSC32=bscmake.exe\r
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\C2.bsc" \r
+BSC32_SBRS= \\r
+       \r
+LINK32=link.exe\r
+LINK32_FLAGS=ole32.lib oleaut32.lib odbc32.lib odbccp32.lib kernel32.lib\\r
+ user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib\\r
+ uuid.lib winmm.lib ddraw.lib dsound.lib wsock32.lib GLIDE2x.LIB SST1INIT.LIB\\r
+ /nologo /subsystem:windows /incremental:yes /pdb:"$(OUTDIR)\C2.pdb" /debug\\r
+ /machine:I386 /out:"$(OUTDIR)\C2.exe" /pdbtype:sept \r
+LINK32_OBJS= \\r
+       "$(INTDIR)\Audio_DLL.obj" \\r
+       "$(INTDIR)\Characters.obj" \\r
+       "$(INTDIR)\Game.obj" \\r
+       "$(INTDIR)\Hunt2.obj" \\r
+       "$(INTDIR)\Interface.obj" \\r
+       "$(INTDIR)\mathematics.obj" \\r
+       "$(INTDIR)\Render3DFX.obj" \\r
+       "$(INTDIR)\renderd3d.obj" \\r
+       "$(INTDIR)\RenderSoft.obj" \\r
+       "$(INTDIR)\resource.res" \\r
+       "$(INTDIR)\Resources.obj"\r
+\r
+"$(OUTDIR)\C2.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)\r
+    $(LINK32) @<<\r
+  $(LINK32_FLAGS) $(LINK32_OBJS)\r
+<<\r
+\r
+!ELSEIF  "$(CFG)" == "C2 - Win32 Debug_3DFX"\r
+\r
+OUTDIR=.\DEBUG_FX\r
+INTDIR=.\DEBUG_FX\r
+# Begin Custom Macros\r
+OutDir=.\DEBUG_FX\r
+# End Custom Macros\r
+\r
+!IF "$(RECURSE)" == "0" \r
+\r
+ALL : "$(OUTDIR)\C2.exe"\r
+\r
+!ELSE \r
+\r
+ALL : "$(OUTDIR)\C2.exe"\r
+\r
+!ENDIF \r
+\r
+CLEAN :\r
+       -@erase "$(INTDIR)\Audio_DLL.obj"\r
+       -@erase "$(INTDIR)\Characters.obj"\r
+       -@erase "$(INTDIR)\Game.obj"\r
+       -@erase "$(INTDIR)\Hunt2.obj"\r
+       -@erase "$(INTDIR)\Interface.obj"\r
+       -@erase "$(INTDIR)\mathematics.obj"\r
+       -@erase "$(INTDIR)\Render3DFX.obj"\r
+       -@erase "$(INTDIR)\renderd3d.obj"\r
+       -@erase "$(INTDIR)\RenderSoft.obj"\r
+       -@erase "$(INTDIR)\resource.res"\r
+       -@erase "$(INTDIR)\Resources.obj"\r
+       -@erase "$(INTDIR)\vc50.idb"\r
+       -@erase "$(INTDIR)\vc50.pdb"\r
+       -@erase "$(OUTDIR)\C2.exe"\r
+       -@erase "$(OUTDIR)\C2.ilk"\r
+       -@erase "$(OUTDIR)\C2.pdb"\r
+\r
+"$(OUTDIR)" :\r
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"\r
+\r
+CPP=cl.exe\r
+CPP_PROJ=/nologo /MLd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS"\\r
+ /D "_3dfx" /Fp"$(INTDIR)\C2.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c \r
+CPP_OBJS=.\DEBUG_FX/\r
+CPP_SBRS=.\r
+\r
+.c{$(CPP_OBJS)}.obj::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+.cpp{$(CPP_OBJS)}.obj::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+.cxx{$(CPP_OBJS)}.obj::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+.c{$(CPP_SBRS)}.sbr::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+.cpp{$(CPP_SBRS)}.sbr::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+.cxx{$(CPP_SBRS)}.sbr::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+MTL=midl.exe\r
+MTL_PROJ=/nologo /D "_DEBUG" /mktyplib203 /o NUL /win32 \r
+RSC=rc.exe\r
+RSC_PROJ=/l 0x409 /fo"$(INTDIR)\resource.res" /d "_DEBUG" \r
+BSC32=bscmake.exe\r
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\C2.bsc" \r
+BSC32_SBRS= \\r
+       \r
+LINK32=link.exe\r
+LINK32_FLAGS=ole32.lib oleaut32.lib odbc32.lib odbccp32.lib kernel32.lib\\r
+ user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib\\r
+ uuid.lib winmm.lib ddraw.lib dsound.lib wsock32.lib GLIDE2x.LIB SST1INIT.LIB\\r
+ /nologo /subsystem:windows /incremental:yes /pdb:"$(OUTDIR)\C2.pdb" /debug\\r
+ /machine:I386 /out:"$(OUTDIR)\C2.exe" /pdbtype:sept \r
+LINK32_OBJS= \\r
+       "$(INTDIR)\Audio_DLL.obj" \\r
+       "$(INTDIR)\Characters.obj" \\r
+       "$(INTDIR)\Game.obj" \\r
+       "$(INTDIR)\Hunt2.obj" \\r
+       "$(INTDIR)\Interface.obj" \\r
+       "$(INTDIR)\mathematics.obj" \\r
+       "$(INTDIR)\Render3DFX.obj" \\r
+       "$(INTDIR)\renderd3d.obj" \\r
+       "$(INTDIR)\RenderSoft.obj" \\r
+       "$(INTDIR)\resource.res" \\r
+       "$(INTDIR)\Resources.obj"\r
+\r
+"$(OUTDIR)\C2.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)\r
+    $(LINK32) @<<\r
+  $(LINK32_FLAGS) $(LINK32_OBJS)\r
+<<\r
+\r
+!ELSEIF  "$(CFG)" == "C2 - Win32 Debug_D3D"\r
+\r
+OUTDIR=.\DEBUG_3D\r
+INTDIR=.\DEBUG_3D\r
+# Begin Custom Macros\r
+OutDir=.\DEBUG_3D\r
+# End Custom Macros\r
+\r
+!IF "$(RECURSE)" == "0" \r
+\r
+ALL : "$(OUTDIR)\C2.exe"\r
+\r
+!ELSE \r
+\r
+ALL : "$(OUTDIR)\C2.exe"\r
+\r
+!ENDIF \r
+\r
+CLEAN :\r
+       -@erase "$(INTDIR)\Audio_DLL.obj"\r
+       -@erase "$(INTDIR)\Characters.obj"\r
+       -@erase "$(INTDIR)\Game.obj"\r
+       -@erase "$(INTDIR)\Hunt2.obj"\r
+       -@erase "$(INTDIR)\Interface.obj"\r
+       -@erase "$(INTDIR)\mathematics.obj"\r
+       -@erase "$(INTDIR)\Render3DFX.obj"\r
+       -@erase "$(INTDIR)\renderd3d.obj"\r
+       -@erase "$(INTDIR)\RenderSoft.obj"\r
+       -@erase "$(INTDIR)\resource.res"\r
+       -@erase "$(INTDIR)\Resources.obj"\r
+       -@erase "$(INTDIR)\vc50.idb"\r
+       -@erase "$(INTDIR)\vc50.pdb"\r
+       -@erase "$(OUTDIR)\C2.exe"\r
+       -@erase "$(OUTDIR)\C2.ilk"\r
+       -@erase "$(OUTDIR)\C2.pdb"\r
+\r
+"$(OUTDIR)" :\r
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"\r
+\r
+CPP=cl.exe\r
+CPP_PROJ=/nologo /MLd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS"\\r
+ /D "_d3d" /Fp"$(INTDIR)\C2.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c \r
+CPP_OBJS=.\DEBUG_3D/\r
+CPP_SBRS=.\r
+\r
+.c{$(CPP_OBJS)}.obj::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+.cpp{$(CPP_OBJS)}.obj::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+.cxx{$(CPP_OBJS)}.obj::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+.c{$(CPP_SBRS)}.sbr::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+.cpp{$(CPP_SBRS)}.sbr::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+.cxx{$(CPP_SBRS)}.sbr::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+MTL=midl.exe\r
+MTL_PROJ=/nologo /D "_DEBUG" /mktyplib203 /o NUL /win32 \r
+RSC=rc.exe\r
+RSC_PROJ=/l 0x409 /fo"$(INTDIR)\resource.res" /d "_DEBUG" \r
+BSC32=bscmake.exe\r
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\C2.bsc" \r
+BSC32_SBRS= \\r
+       \r
+LINK32=link.exe\r
+LINK32_FLAGS=ole32.lib oleaut32.lib odbc32.lib odbccp32.lib kernel32.lib\\r
+ user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib\\r
+ uuid.lib winmm.lib ddraw.lib dsound.lib wsock32.lib GLIDE2x.LIB SST1INIT.LIB\\r
+ /nologo /subsystem:windows /incremental:yes /pdb:"$(OUTDIR)\C2.pdb" /debug\\r
+ /machine:I386 /out:"$(OUTDIR)\C2.exe" /pdbtype:sept \r
+LINK32_OBJS= \\r
+       "$(INTDIR)\Audio_DLL.obj" \\r
+       "$(INTDIR)\Characters.obj" \\r
+       "$(INTDIR)\Game.obj" \\r
+       "$(INTDIR)\Hunt2.obj" \\r
+       "$(INTDIR)\Interface.obj" \\r
+       "$(INTDIR)\mathematics.obj" \\r
+       "$(INTDIR)\Render3DFX.obj" \\r
+       "$(INTDIR)\renderd3d.obj" \\r
+       "$(INTDIR)\RenderSoft.obj" \\r
+       "$(INTDIR)\resource.res" \\r
+       "$(INTDIR)\Resources.obj"\r
+\r
+"$(OUTDIR)\C2.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)\r
+    $(LINK32) @<<\r
+  $(LINK32_FLAGS) $(LINK32_OBJS)\r
+<<\r
+\r
+!ELSEIF  "$(CFG)" == "C2 - Win32 Release_Soft"\r
+\r
+OUTDIR=.\REL_SOFT\r
+INTDIR=.\REL_SOFT\r
+# Begin Custom Macros\r
+OutDir=.\REL_SOFT\r
+# End Custom Macros\r
+\r
+!IF "$(RECURSE)" == "0" \r
+\r
+ALL : "$(OUTDIR)\v_soft.ren"\r
+\r
+!ELSE \r
+\r
+ALL : "$(OUTDIR)\v_soft.ren"\r
+\r
+!ENDIF \r
+\r
+CLEAN :\r
+       -@erase "$(INTDIR)\Audio_DLL.obj"\r
+       -@erase "$(INTDIR)\Characters.obj"\r
+       -@erase "$(INTDIR)\Game.obj"\r
+       -@erase "$(INTDIR)\Hunt2.obj"\r
+       -@erase "$(INTDIR)\Interface.obj"\r
+       -@erase "$(INTDIR)\mathematics.obj"\r
+       -@erase "$(INTDIR)\Render3DFX.obj"\r
+       -@erase "$(INTDIR)\renderd3d.obj"\r
+       -@erase "$(INTDIR)\RenderSoft.obj"\r
+       -@erase "$(INTDIR)\resource.res"\r
+       -@erase "$(INTDIR)\Resources.obj"\r
+       -@erase "$(INTDIR)\vc50.idb"\r
+       -@erase "$(OUTDIR)\v_soft.ilk"\r
+       -@erase "$(OUTDIR)\v_soft.ren"\r
+\r
+"$(OUTDIR)" :\r
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"\r
+\r
+CPP=cl.exe\r
+CPP_PROJ=/nologo /G5 /ML /W3 /Gi /GX /O2 /Ob2 /D "WIN32" /D "NDEBUG" /D\\r
+ "_WINDOWS" /D "_soft" /Fp"$(INTDIR)\C2.pch" /YX /Fo"$(INTDIR)\\"\\r
+ /Fd"$(INTDIR)\\" /FD /c \r
+CPP_OBJS=.\REL_SOFT/\r
+CPP_SBRS=.\r
+\r
+.c{$(CPP_OBJS)}.obj::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+.cpp{$(CPP_OBJS)}.obj::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+.cxx{$(CPP_OBJS)}.obj::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+.c{$(CPP_SBRS)}.sbr::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+.cpp{$(CPP_SBRS)}.sbr::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+.cxx{$(CPP_SBRS)}.sbr::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+MTL=midl.exe\r
+MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /o NUL /win32 \r
+RSC=rc.exe\r
+RSC_PROJ=/l 0x409 /fo"$(INTDIR)\resource.res" /d "NDEBUG" \r
+BSC32=bscmake.exe\r
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\C2.bsc" \r
+BSC32_SBRS= \\r
+       \r
+LINK32=link.exe\r
+LINK32_FLAGS=ole32.lib oleaut32.lib odbc32.lib odbccp32.lib kernel32.lib\\r
+ user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib\\r
+ uuid.lib winmm.lib ddraw.lib dsound.lib wsock32.lib GLIDE2x.LIB SST1INIT.LIB\\r
+ /nologo /subsystem:windows /incremental:yes /pdb:"$(OUTDIR)\v_soft.pdb"\\r
+ /machine:I386 /out:"$(OUTDIR)\v_soft.ren" \r
+LINK32_OBJS= \\r
+       "$(INTDIR)\Audio_DLL.obj" \\r
+       "$(INTDIR)\Characters.obj" \\r
+       "$(INTDIR)\Game.obj" \\r
+       "$(INTDIR)\Hunt2.obj" \\r
+       "$(INTDIR)\Interface.obj" \\r
+       "$(INTDIR)\mathematics.obj" \\r
+       "$(INTDIR)\Render3DFX.obj" \\r
+       "$(INTDIR)\renderd3d.obj" \\r
+       "$(INTDIR)\RenderSoft.obj" \\r
+       "$(INTDIR)\resource.res" \\r
+       "$(INTDIR)\Resources.obj"\r
+\r
+"$(OUTDIR)\v_soft.ren" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)\r
+    $(LINK32) @<<\r
+  $(LINK32_FLAGS) $(LINK32_OBJS)\r
+<<\r
+\r
+!ELSEIF  "$(CFG)" == "C2 - Win32 Release_3DFX"\r
+\r
+OUTDIR=.\REL_3DFX\r
+INTDIR=.\REL_3DFX\r
+# Begin Custom Macros\r
+OutDir=.\REL_3DFX\r
+# End Custom Macros\r
+\r
+!IF "$(RECURSE)" == "0" \r
+\r
+ALL : "$(OUTDIR)\v_3dfx.ren"\r
+\r
+!ELSE \r
+\r
+ALL : "$(OUTDIR)\v_3dfx.ren"\r
+\r
+!ENDIF \r
+\r
+CLEAN :\r
+       -@erase "$(INTDIR)\Audio_DLL.obj"\r
+       -@erase "$(INTDIR)\Characters.obj"\r
+       -@erase "$(INTDIR)\Game.obj"\r
+       -@erase "$(INTDIR)\Hunt2.obj"\r
+       -@erase "$(INTDIR)\Interface.obj"\r
+       -@erase "$(INTDIR)\mathematics.obj"\r
+       -@erase "$(INTDIR)\Render3DFX.obj"\r
+       -@erase "$(INTDIR)\renderd3d.obj"\r
+       -@erase "$(INTDIR)\RenderSoft.obj"\r
+       -@erase "$(INTDIR)\resource.res"\r
+       -@erase "$(INTDIR)\Resources.obj"\r
+       -@erase "$(INTDIR)\vc50.idb"\r
+       -@erase "$(OUTDIR)\v_3dfx.ilk"\r
+       -@erase "$(OUTDIR)\v_3dfx.ren"\r
+\r
+"$(OUTDIR)" :\r
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"\r
+\r
+CPP=cl.exe\r
+CPP_PROJ=/nologo /G5 /ML /W3 /Gi /GX /O2 /Ob2 /D "WIN32" /D "NDEBUG" /D\\r
+ "_WINDOWS" /D "_3dfx" /Fp"$(INTDIR)\C2.pch" /YX /Fo"$(INTDIR)\\"\\r
+ /Fd"$(INTDIR)\\" /FD /c \r
+CPP_OBJS=.\REL_3DFX/\r
+CPP_SBRS=.\r
+\r
+.c{$(CPP_OBJS)}.obj::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+.cpp{$(CPP_OBJS)}.obj::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+.cxx{$(CPP_OBJS)}.obj::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+.c{$(CPP_SBRS)}.sbr::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+.cpp{$(CPP_SBRS)}.sbr::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+.cxx{$(CPP_SBRS)}.sbr::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+MTL=midl.exe\r
+MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /o NUL /win32 \r
+RSC=rc.exe\r
+RSC_PROJ=/l 0x409 /fo"$(INTDIR)\resource.res" /d "NDEBUG" \r
+BSC32=bscmake.exe\r
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\C2.bsc" \r
+BSC32_SBRS= \\r
+       \r
+LINK32=link.exe\r
+LINK32_FLAGS=ole32.lib oleaut32.lib odbc32.lib odbccp32.lib kernel32.lib\\r
+ user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib\\r
+ uuid.lib winmm.lib ddraw.lib dsound.lib wsock32.lib GLIDE2x.LIB SST1INIT.LIB\\r
+ /nologo /subsystem:windows /incremental:yes /pdb:"$(OUTDIR)\v_3dfx.pdb"\\r
+ /machine:I386 /out:"$(OUTDIR)\v_3dfx.ren" \r
+LINK32_OBJS= \\r
+       "$(INTDIR)\Audio_DLL.obj" \\r
+       "$(INTDIR)\Characters.obj" \\r
+       "$(INTDIR)\Game.obj" \\r
+       "$(INTDIR)\Hunt2.obj" \\r
+       "$(INTDIR)\Interface.obj" \\r
+       "$(INTDIR)\mathematics.obj" \\r
+       "$(INTDIR)\Render3DFX.obj" \\r
+       "$(INTDIR)\renderd3d.obj" \\r
+       "$(INTDIR)\RenderSoft.obj" \\r
+       "$(INTDIR)\resource.res" \\r
+       "$(INTDIR)\Resources.obj"\r
+\r
+"$(OUTDIR)\v_3dfx.ren" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)\r
+    $(LINK32) @<<\r
+  $(LINK32_FLAGS) $(LINK32_OBJS)\r
+<<\r
+\r
+!ELSEIF  "$(CFG)" == "C2 - Win32 Release_D3D"\r
+\r
+OUTDIR=.\REL_D3D\r
+INTDIR=.\REL_D3D\r
+# Begin Custom Macros\r
+OutDir=.\REL_D3D\r
+# End Custom Macros\r
+\r
+!IF "$(RECURSE)" == "0" \r
+\r
+ALL : "$(OUTDIR)\v_d3d.ren"\r
+\r
+!ELSE \r
+\r
+ALL : "$(OUTDIR)\v_d3d.ren"\r
+\r
+!ENDIF \r
+\r
+CLEAN :\r
+       -@erase "$(INTDIR)\Audio_DLL.obj"\r
+       -@erase "$(INTDIR)\Characters.obj"\r
+       -@erase "$(INTDIR)\Game.obj"\r
+       -@erase "$(INTDIR)\Hunt2.obj"\r
+       -@erase "$(INTDIR)\Interface.obj"\r
+       -@erase "$(INTDIR)\mathematics.obj"\r
+       -@erase "$(INTDIR)\Render3DFX.obj"\r
+       -@erase "$(INTDIR)\renderd3d.obj"\r
+       -@erase "$(INTDIR)\RenderSoft.obj"\r
+       -@erase "$(INTDIR)\resource.res"\r
+       -@erase "$(INTDIR)\Resources.obj"\r
+       -@erase "$(INTDIR)\vc50.idb"\r
+       -@erase "$(OUTDIR)\v_d3d.ilk"\r
+       -@erase "$(OUTDIR)\v_d3d.ren"\r
+\r
+"$(OUTDIR)" :\r
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"\r
+\r
+CPP=cl.exe\r
+CPP_PROJ=/nologo /G5 /ML /W3 /Gi /GX /O2 /Ob2 /D "WIN32" /D "NDEBUG" /D\\r
+ "_WINDOWS" /D "_d3d" /Fp"$(INTDIR)\C2.pch" /YX /Fo"$(INTDIR)\\"\\r
+ /Fd"$(INTDIR)\\" /FD /c \r
+CPP_OBJS=.\REL_D3D/\r
+CPP_SBRS=.\r
+\r
+.c{$(CPP_OBJS)}.obj::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+.cpp{$(CPP_OBJS)}.obj::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+.cxx{$(CPP_OBJS)}.obj::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+.c{$(CPP_SBRS)}.sbr::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+.cpp{$(CPP_SBRS)}.sbr::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+.cxx{$(CPP_SBRS)}.sbr::\r
+   $(CPP) @<<\r
+   $(CPP_PROJ) $< \r
+<<\r
+\r
+MTL=midl.exe\r
+MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /o NUL /win32 \r
+RSC=rc.exe\r
+RSC_PROJ=/l 0x409 /fo"$(INTDIR)\resource.res" /d "NDEBUG" \r
+BSC32=bscmake.exe\r
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\C2.bsc" \r
+BSC32_SBRS= \\r
+       \r
+LINK32=link.exe\r
+LINK32_FLAGS=ole32.lib oleaut32.lib odbc32.lib odbccp32.lib kernel32.lib\\r
+ user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib\\r
+ uuid.lib winmm.lib ddraw.lib dsound.lib wsock32.lib GLIDE2x.LIB SST1INIT.LIB\\r
+ /nologo /subsystem:windows /incremental:yes /pdb:"$(OUTDIR)\v_d3d.pdb"\\r
+ /machine:I386 /out:"$(OUTDIR)\v_d3d.ren" \r
+LINK32_OBJS= \\r
+       "$(INTDIR)\Audio_DLL.obj" \\r
+       "$(INTDIR)\Characters.obj" \\r
+       "$(INTDIR)\Game.obj" \\r
+       "$(INTDIR)\Hunt2.obj" \\r
+       "$(INTDIR)\Interface.obj" \\r
+       "$(INTDIR)\mathematics.obj" \\r
+       "$(INTDIR)\Render3DFX.obj" \\r
+       "$(INTDIR)\renderd3d.obj" \\r
+       "$(INTDIR)\RenderSoft.obj" \\r
+       "$(INTDIR)\resource.res" \\r
+       "$(INTDIR)\Resources.obj"\r
+\r
+"$(OUTDIR)\v_d3d.ren" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)\r
+    $(LINK32) @<<\r
+  $(LINK32_FLAGS) $(LINK32_OBJS)\r
+<<\r
+\r
+!ENDIF \r
+\r
+\r
+!IF "$(CFG)" == "C2 - Win32 Debug_Soft" || "$(CFG)" == "C2 - Win32 Debug_3DFX"\\r
+ || "$(CFG)" == "C2 - Win32 Debug_D3D" || "$(CFG)" == "C2 - Win32 Release_Soft"\\r
+ || "$(CFG)" == "C2 - Win32 Release_3DFX" || "$(CFG)" ==\\r
+ "C2 - Win32 Release_D3D"\r
+SOURCE=.\Audio_DLL.cpp\r
+\r
+"$(INTDIR)\Audio_DLL.obj" : $(SOURCE) "$(INTDIR)"\r
+\r
+\r
+SOURCE=.\Characters.cpp\r
+DEP_CPP_CHARA=\\r
+       ".\Hunt.h"\\r
+       \r
+\r
+"$(INTDIR)\Characters.obj" : $(SOURCE) $(DEP_CPP_CHARA) "$(INTDIR)"\r
+\r
+\r
+SOURCE=.\Game.cpp\r
+DEP_CPP_GAME_=\\r
+       ".\Hunt.h"\\r
+       \r
+\r
+"$(INTDIR)\Game.obj" : $(SOURCE) $(DEP_CPP_GAME_) "$(INTDIR)"\r
+\r
+\r
+SOURCE=.\Hunt2.cpp\r
+DEP_CPP_HUNT2=\\r
+       ".\Hunt.h"\\r
+       \r
+\r
+"$(INTDIR)\Hunt2.obj" : $(SOURCE) $(DEP_CPP_HUNT2) "$(INTDIR)"\r
+\r
+\r
+SOURCE=.\Interface.cpp\r
+DEP_CPP_INTER=\\r
+       ".\Hunt.h"\\r
+       \r
+\r
+"$(INTDIR)\Interface.obj" : $(SOURCE) $(DEP_CPP_INTER) "$(INTDIR)"\r
+\r
+\r
+SOURCE=.\mathematics.cpp\r
+DEP_CPP_MATHE=\\r
+       ".\Hunt.h"\\r
+       \r
+\r
+"$(INTDIR)\mathematics.obj" : $(SOURCE) $(DEP_CPP_MATHE) "$(INTDIR)"\r
+\r
+\r
+SOURCE=.\Render3DFX.cpp\r
+\r
+!IF  "$(CFG)" == "C2 - Win32 Debug_Soft"\r
+\r
+\r
+"$(INTDIR)\Render3DFX.obj" : $(SOURCE) "$(INTDIR)"\r
+\r
+\r
+!ELSEIF  "$(CFG)" == "C2 - Win32 Debug_3DFX"\r
+\r
+DEP_CPP_RENDE=\\r
+       "..\..\vc\include\3dfx.h"\\r
+       "..\..\vc\include\glide.h"\\r
+       "..\..\vc\include\glidesys.h"\\r
+       "..\..\vc\include\glideutl.h"\\r
+       "..\..\vc\include\sst1vid.h"\\r
+       ".\Hunt.h"\\r
+       \r
+\r
+"$(INTDIR)\Render3DFX.obj" : $(SOURCE) $(DEP_CPP_RENDE) "$(INTDIR)"\r
+\r
+\r
+!ELSEIF  "$(CFG)" == "C2 - Win32 Debug_D3D"\r
+\r
+\r
+"$(INTDIR)\Render3DFX.obj" : $(SOURCE) "$(INTDIR)"\r
+\r
+\r
+!ELSEIF  "$(CFG)" == "C2 - Win32 Release_Soft"\r
+\r
+\r
+"$(INTDIR)\Render3DFX.obj" : $(SOURCE) "$(INTDIR)"\r
+\r
+\r
+!ELSEIF  "$(CFG)" == "C2 - Win32 Release_3DFX"\r
+\r
+DEP_CPP_RENDE=\\r
+       "..\..\vc\include\3dfx.h"\\r
+       "..\..\vc\include\glide.h"\\r
+       "..\..\vc\include\glidesys.h"\\r
+       "..\..\vc\include\glideutl.h"\\r
+       "..\..\vc\include\sst1vid.h"\\r
+       ".\Hunt.h"\\r
+       \r
+\r
+"$(INTDIR)\Render3DFX.obj" : $(SOURCE) $(DEP_CPP_RENDE) "$(INTDIR)"\r
+\r
+\r
+!ELSEIF  "$(CFG)" == "C2 - Win32 Release_D3D"\r
+\r
+\r
+"$(INTDIR)\Render3DFX.obj" : $(SOURCE) "$(INTDIR)"\r
+\r
+\r
+!ENDIF \r
+\r
+SOURCE=.\renderd3d.cpp\r
+\r
+!IF  "$(CFG)" == "C2 - Win32 Debug_Soft"\r
+\r
+\r
+"$(INTDIR)\renderd3d.obj" : $(SOURCE) "$(INTDIR)"\r
+\r
+\r
+!ELSEIF  "$(CFG)" == "C2 - Win32 Debug_3DFX"\r
+\r
+\r
+"$(INTDIR)\renderd3d.obj" : $(SOURCE) "$(INTDIR)"\r
+\r
+\r
+!ELSEIF  "$(CFG)" == "C2 - Win32 Debug_D3D"\r
+\r
+DEP_CPP_RENDER=\\r
+       ".\Hunt.h"\\r
+       \r
+\r
+"$(INTDIR)\renderd3d.obj" : $(SOURCE) $(DEP_CPP_RENDER) "$(INTDIR)"\r
+\r
+\r
+!ELSEIF  "$(CFG)" == "C2 - Win32 Release_Soft"\r
+\r
+\r
+"$(INTDIR)\renderd3d.obj" : $(SOURCE) "$(INTDIR)"\r
+\r
+\r
+!ELSEIF  "$(CFG)" == "C2 - Win32 Release_3DFX"\r
+\r
+\r
+"$(INTDIR)\renderd3d.obj" : $(SOURCE) "$(INTDIR)"\r
+\r
+\r
+!ELSEIF  "$(CFG)" == "C2 - Win32 Release_D3D"\r
+\r
+DEP_CPP_RENDER=\\r
+       ".\Hunt.h"\\r
+       \r
+\r
+"$(INTDIR)\renderd3d.obj" : $(SOURCE) $(DEP_CPP_RENDER) "$(INTDIR)"\r
+\r
+\r
+!ENDIF \r
+\r
+SOURCE=.\RenderSoft.cpp\r
+\r
+!IF  "$(CFG)" == "C2 - Win32 Debug_Soft"\r
+\r
+DEP_CPP_RENDERS=\\r
+       ".\Hunt.h"\\r
+       ".\renderasm.cpp"\\r
+       \r
+\r
+"$(INTDIR)\RenderSoft.obj" : $(SOURCE) $(DEP_CPP_RENDERS) "$(INTDIR)"\r
+\r
+\r
+!ELSEIF  "$(CFG)" == "C2 - Win32 Debug_3DFX"\r
+\r
+\r
+"$(INTDIR)\RenderSoft.obj" : $(SOURCE) "$(INTDIR)"\r
+\r
+\r
+!ELSEIF  "$(CFG)" == "C2 - Win32 Debug_D3D"\r
+\r
+\r
+"$(INTDIR)\RenderSoft.obj" : $(SOURCE) "$(INTDIR)"\r
+\r
+\r
+!ELSEIF  "$(CFG)" == "C2 - Win32 Release_Soft"\r
+\r
+DEP_CPP_RENDERS=\\r
+       ".\Hunt.h"\\r
+       ".\renderasm.cpp"\\r
+       \r
+\r
+"$(INTDIR)\RenderSoft.obj" : $(SOURCE) $(DEP_CPP_RENDERS) "$(INTDIR)"\r
+\r
+\r
+!ELSEIF  "$(CFG)" == "C2 - Win32 Release_3DFX"\r
+\r
+\r
+"$(INTDIR)\RenderSoft.obj" : $(SOURCE) "$(INTDIR)"\r
+\r
+\r
+!ELSEIF  "$(CFG)" == "C2 - Win32 Release_D3D"\r
+\r
+\r
+"$(INTDIR)\RenderSoft.obj" : $(SOURCE) "$(INTDIR)"\r
+\r
+\r
+!ENDIF \r
+\r
+SOURCE=.\resource.rc\r
+DEP_RSC_RESOU=\\r
+       ".\action.ico"\\r
+       \r
+\r
+"$(INTDIR)\resource.res" : $(SOURCE) $(DEP_RSC_RESOU) "$(INTDIR)"\r
+       $(RSC) $(RSC_PROJ) $(SOURCE)\r
+\r
+\r
+SOURCE=.\Resources.cpp\r
+DEP_CPP_RESOUR=\\r
+       ".\Hunt.h"\\r
+       \r
+\r
+"$(INTDIR)\Resources.obj" : $(SOURCE) $(DEP_CPP_RESOUR) "$(INTDIR)"\r
+\r
+\r
+\r
+!ENDIF \r
+\r
diff --git a/C2_Ice.dsp b/C2_Ice.dsp
new file mode 100644 (file)
index 0000000..35a6fda
--- /dev/null
@@ -0,0 +1,282 @@
+# Microsoft Developer Studio Project File - Name="C2" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Application" 0x0101\r
+\r
+CFG=C2 - Win32 Debug_D3D\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "C2_Ice.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "C2_Ice.mak" CFG="C2 - Win32 Debug_D3D"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "C2 - Win32 Debug_Soft" (based on "Win32 (x86) Application")\r
+!MESSAGE "C2 - Win32 Debug_3DFX" (based on "Win32 (x86) Application")\r
+!MESSAGE "C2 - Win32 Debug_D3D" (based on "Win32 (x86) Application")\r
+!MESSAGE "C2 - Win32 Release_Soft" (based on "Win32 (x86) Application")\r
+!MESSAGE "C2 - Win32 Release_3DFX" (based on "Win32 (x86) Application")\r
+!MESSAGE "C2 - Win32 Release_D3D" (based on "Win32 (x86) Application")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=C:\VC98\BIN\VECTORCL.EXE\r
+MTL=midl.exe\r
+RSC=rc.exe\r
+\r
+!IF  "$(CFG)" == "C2 - Win32 Debug_Soft"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "C2___Win"\r
+# PROP BASE Intermediate_Dir "C2___Win"\r
+# PROP BASE Ignore_Export_Lib 0\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "DEBUG_S"\r
+# PROP Intermediate_Dir "DEBUG_S"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c\r
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_soft" /YX /FD /c\r
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32\r
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32\r
+# ADD BASE RSC /l 0x409 /d "_DEBUG"\r
+# ADD RSC /l 0x409 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 ole32.lib oleaut32.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib uuid.lib winmm.lib ddraw.lib dsound.lib wsock32.lib GLIDE2x.LIB SST1INIT.LIB /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept\r
+# ADD LINK32 ole32.lib oleaut32.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib uuid.lib winmm.lib ddraw.lib dsound.lib wsock32.lib GLIDE2x.LIB SST1INIT.LIB /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept\r
+\r
+!ELSEIF  "$(CFG)" == "C2 - Win32 Debug_3DFX"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "C2___Wi0"\r
+# PROP BASE Intermediate_Dir "C2___Wi0"\r
+# PROP BASE Ignore_Export_Lib 0\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "DEBUG_FX"\r
+# PROP Intermediate_Dir "DEBUG_FX"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c\r
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_3dfx" /YX /FD /c\r
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32\r
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32\r
+# ADD BASE RSC /l 0x409 /d "_DEBUG"\r
+# ADD RSC /l 0x409 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 ole32.lib oleaut32.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib uuid.lib winmm.lib ddraw.lib dsound.lib wsock32.lib GLIDE2x.LIB SST1INIT.LIB /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept\r
+# ADD LINK32 ole32.lib oleaut32.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib uuid.lib winmm.lib ddraw.lib dsound.lib wsock32.lib GLIDE2x.LIB SST1INIT.LIB /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept\r
+\r
+!ELSEIF  "$(CFG)" == "C2 - Win32 Debug_D3D"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "C2___Wi1"\r
+# PROP BASE Intermediate_Dir "C2___Wi1"\r
+# PROP BASE Ignore_Export_Lib 0\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "DEBUG_3D"\r
+# PROP Intermediate_Dir "DEBUG_3D"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c\r
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_d3d" /YX /FD /c\r
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32\r
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32\r
+# ADD BASE RSC /l 0x409 /d "_DEBUG"\r
+# ADD RSC /l 0x409 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 ole32.lib oleaut32.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib uuid.lib winmm.lib ddraw.lib dsound.lib wsock32.lib GLIDE2x.LIB SST1INIT.LIB /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept\r
+# ADD LINK32 ole32.lib oleaut32.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib uuid.lib winmm.lib ddraw.lib dsound.lib wsock32.lib GLIDE2x.LIB SST1INIT.LIB /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept\r
+\r
+!ELSEIF  "$(CFG)" == "C2 - Win32 Release_Soft"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "C2___Wi2"\r
+# PROP BASE Intermediate_Dir "C2___Wi2"\r
+# PROP BASE Ignore_Export_Lib 0\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "REL_SOFT"\r
+# PROP Intermediate_Dir "REL_SOFT"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /G5 /W3 /Gi /GX /O2 /Ob2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c\r
+# ADD CPP /nologo /G5 /W3 /Gi /GX /O2 /Ob2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_soft" /YX /FD /c\r
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32\r
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32\r
+# ADD BASE RSC /l 0x409 /d "NDEBUG"\r
+# ADD RSC /l 0x409 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 ole32.lib oleaut32.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib uuid.lib winmm.lib ddraw.lib dsound.lib wsock32.lib GLIDE2x.LIB SST1INIT.LIB /nologo /subsystem:windows /incremental:yes /machine:I386\r
+# ADD LINK32 ole32.lib oleaut32.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib uuid.lib winmm.lib ddraw.lib dsound.lib wsock32.lib GLIDE2x.LIB SST1INIT.LIB /nologo /subsystem:windows /incremental:yes /machine:I386 /out:"REL_SOFT/v_soft.ren"\r
+\r
+!ELSEIF  "$(CFG)" == "C2 - Win32 Release_3DFX"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "C2___Wi3"\r
+# PROP BASE Intermediate_Dir "C2___Wi3"\r
+# PROP BASE Ignore_Export_Lib 0\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "REL_3DFX"\r
+# PROP Intermediate_Dir "REL_3DFX"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /G5 /W3 /Gi /GX /O2 /Ob2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c\r
+# ADD CPP /nologo /G5 /W3 /Gi /GX /O2 /Ob2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_3dfx" /YX /FD /c\r
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32\r
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32\r
+# ADD BASE RSC /l 0x409 /d "NDEBUG"\r
+# ADD RSC /l 0x409 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 ole32.lib oleaut32.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib uuid.lib winmm.lib ddraw.lib dsound.lib wsock32.lib GLIDE2x.LIB SST1INIT.LIB /nologo /subsystem:windows /incremental:yes /machine:I386\r
+# ADD LINK32 ole32.lib oleaut32.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib uuid.lib winmm.lib ddraw.lib dsound.lib wsock32.lib GLIDE2x.LIB SST1INIT.LIB /nologo /subsystem:windows /incremental:yes /machine:I386 /out:"REL_3DFX/v_3dfx.ren"\r
+\r
+!ELSEIF  "$(CFG)" == "C2 - Win32 Release_D3D"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "C2___Wi4"\r
+# PROP BASE Intermediate_Dir "C2___Wi4"\r
+# PROP BASE Ignore_Export_Lib 0\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "REL_D3D"\r
+# PROP Intermediate_Dir "REL_D3D"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /G5 /W3 /Gi /GX /O2 /Ob2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c\r
+# ADD CPP /nologo /G5 /W3 /Gi /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_d3d" /YX /FD /c\r
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32\r
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32\r
+# ADD BASE RSC /l 0x409 /d "NDEBUG"\r
+# ADD RSC /l 0x409 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 ole32.lib oleaut32.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib uuid.lib winmm.lib ddraw.lib dsound.lib wsock32.lib GLIDE2x.LIB SST1INIT.LIB /nologo /subsystem:windows /incremental:yes /machine:I386\r
+# ADD LINK32 ole32.lib oleaut32.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib uuid.lib winmm.lib ddraw.lib dsound.lib wsock32.lib sincos.obj /nologo /subsystem:windows /incremental:yes /machine:I386 /out:"v_d3d.ren"\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "C2 - Win32 Debug_Soft"\r
+# Name "C2 - Win32 Debug_3DFX"\r
+# Name "C2 - Win32 Debug_D3D"\r
+# Name "C2 - Win32 Release_Soft"\r
+# Name "C2 - Win32 Release_3DFX"\r
+# Name "C2 - Win32 Release_D3D"\r
+# Begin Source File\r
+\r
+SOURCE=.\Action.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\Audio_DLL.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\Characters.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\Game.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\Hunt.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\Hunt2.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\Interface.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\mathematics.cpp\r
+\r
+!IF  "$(CFG)" == "C2 - Win32 Debug_Soft"\r
+\r
+!ELSEIF  "$(CFG)" == "C2 - Win32 Debug_3DFX"\r
+\r
+!ELSEIF  "$(CFG)" == "C2 - Win32 Debug_D3D"\r
+\r
+!ELSEIF  "$(CFG)" == "C2 - Win32 Release_Soft"\r
+\r
+!ELSEIF  "$(CFG)" == "C2 - Win32 Release_3DFX"\r
+\r
+!ELSEIF  "$(CFG)" == "C2 - Win32 Release_D3D"\r
+\r
+# ADD CPP /YX\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\Render3DFX.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\renderd3d.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\RenderSoft.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\resource.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\resource.rc\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\Resources.cpp\r
+# End Source File\r
+# End Target\r
+# End Project\r
diff --git a/C2_Ice.dsw b/C2_Ice.dsw
new file mode 100644 (file)
index 0000000..de83eff
--- /dev/null
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00\r
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!\r
+\r
+###############################################################################\r
+\r
+Project: "C2"=.\C2_Ice.dsp - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Global:\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<3>\r
+{{{\r
+}}}\r
+\r
+###############################################################################\r
+\r
diff --git a/C2_Ice.opt b/C2_Ice.opt
new file mode 100644 (file)
index 0000000..3c5439c
Binary files /dev/null and b/C2_Ice.opt differ
diff --git a/C2_Ice.plg b/C2_Ice.plg
new file mode 100644 (file)
index 0000000..0bb9765
--- /dev/null
@@ -0,0 +1,64 @@
+<html>\r
+<body>\r
+<pre>\r
+<h1>Build Log</h1>\r
+<h3>\r
+--------------------Configuration: C2 - Win32 Release_D3D--------------------\r
+</h3>\r
+<h3>Command Lines</h3>\r
+Creating temporary file "C:\WINDOWS\TEMP\RSP50D0.TMP" with contents\r
+[\r
+/nologo /G5 /ML /W3 /Gi /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_d3d" /Fp"REL_D3D/C2_Ice.pch" /YX /Fo"REL_D3D/" /Fd"REL_D3D/" /FD /c \r
+"C:\MSD50\MyProjects\AudioDrivers\C2_Ice\Characters.cpp"\r
+]\r
+Creating command line "cl.exe @C:\WINDOWS\TEMP\RSP50D0.TMP" \r
+Creating temporary file "C:\WINDOWS\TEMP\RSP50D1.TMP" with contents\r
+[\r
+ole32.lib oleaut32.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib uuid.lib winmm.lib ddraw.lib dsound.lib wsock32.lib sincos.obj /nologo /subsystem:windows /incremental:yes /pdb:"REL_D3D/v_d3d.pdb" /machine:I386 /out:"v_d3d.ren" \r
+.\REL_D3D\Audio_DLL.obj\r
+.\REL_D3D\Characters.obj\r
+.\REL_D3D\Game.obj\r
+.\REL_D3D\Hunt2.obj\r
+.\REL_D3D\Interface.obj\r
+.\REL_D3D\mathematics.obj\r
+.\REL_D3D\Render3DFX.obj\r
+.\REL_D3D\renderd3d.obj\r
+.\REL_D3D\RenderSoft.obj\r
+.\REL_D3D\Resources.obj\r
+.\REL_D3D\resource.res\r
+]\r
+Creating command line "link.exe @C:\WINDOWS\TEMP\RSP50D1.TMP"\r
+<h3>Output Window</h3>\r
+Compiling...\r
+Characters.cpp\r
+C:\MSD50\MyProjects\AudioDrivers\C2_Ice\Characters.cpp(1217) : warning C4305: '=' : truncation from 'const double' to 'float'\r
+C:\MSD50\MyProjects\AudioDrivers\C2_Ice\Characters.cpp(1218) : warning C4305: '=' : truncation from 'const double' to 'float'\r
+C:\MSD50\MyProjects\AudioDrivers\C2_Ice\Characters.cpp(1219) : warning C4305: '=' : truncation from 'const double' to 'float'\r
+C:\MSD50\MyProjects\AudioDrivers\C2_Ice\Characters.cpp(1220) : warning C4305: '=' : truncation from 'const double' to 'float'\r
+C:\MSD50\MyProjects\AudioDrivers\C2_Ice\Characters.cpp(1664) : warning C4305: '=' : truncation from 'const double' to 'float'\r
+C:\MSD50\MyProjects\AudioDrivers\C2_Ice\Characters.cpp(1665) : warning C4305: '=' : truncation from 'const double' to 'float'\r
+C:\MSD50\MyProjects\AudioDrivers\C2_Ice\Characters.cpp(1861) : warning C4305: '=' : truncation from 'const double' to 'float'\r
+C:\MSD50\MyProjects\AudioDrivers\C2_Ice\Characters.cpp(1862) : warning C4305: '=' : truncation from 'const double' to 'float'\r
+C:\MSD50\MyProjects\AudioDrivers\C2_Ice\Characters.cpp(2055) : warning C4305: '=' : truncation from 'const double' to 'float'\r
+C:\MSD50\MyProjects\AudioDrivers\C2_Ice\Characters.cpp(2056) : warning C4305: '=' : truncation from 'const double' to 'float'\r
+C:\MSD50\MyProjects\AudioDrivers\C2_Ice\Characters.cpp(2251) : warning C4305: '=' : truncation from 'const double' to 'float'\r
+C:\MSD50\MyProjects\AudioDrivers\C2_Ice\Characters.cpp(2252) : warning C4305: '=' : truncation from 'const double' to 'float'\r
+C:\MSD50\MyProjects\AudioDrivers\C2_Ice\Characters.cpp(2447) : warning C4305: '=' : truncation from 'const double' to 'float'\r
+C:\MSD50\MyProjects\AudioDrivers\C2_Ice\Characters.cpp(2448) : warning C4305: '=' : truncation from 'const double' to 'float'\r
+C:\MSD50\MyProjects\AudioDrivers\C2_Ice\Characters.cpp(2642) : warning C4305: '=' : truncation from 'const double' to 'float'\r
+C:\MSD50\MyProjects\AudioDrivers\C2_Ice\Characters.cpp(2643) : warning C4305: '=' : truncation from 'const double' to 'float'\r
+C:\MSD50\MyProjects\AudioDrivers\C2_Ice\Characters.cpp(2848) : warning C4305: '=' : truncation from 'const double' to 'float'\r
+C:\MSD50\MyProjects\AudioDrivers\C2_Ice\Characters.cpp(2849) : warning C4305: '=' : truncation from 'const double' to 'float'\r
+C:\MSD50\MyProjects\AudioDrivers\C2_Ice\Characters.cpp(3036) : warning C4305: '=' : truncation from 'const double' to 'float'\r
+C:\MSD50\MyProjects\AudioDrivers\C2_Ice\Characters.cpp(3037) : warning C4305: '=' : truncation from 'const double' to 'float'\r
+C:\MSD50\MyProjects\AudioDrivers\C2_Ice\Characters.cpp(3519) : warning C4244: '=' : conversion from 'int' to 'float', possible loss of data\r
+C:\MSD50\MyProjects\AudioDrivers\C2_Ice\Characters.cpp(3520) : warning C4244: '=' : conversion from 'int' to 'float', possible loss of data\r
+Linking...\r
+\r
+\r
+\r
+<h3>Results</h3>\r
+v_d3d.ren - 0 error(s), 22 warning(s)\r
+</pre>\r
+</body>\r
+</html>\r
diff --git a/Characters.cpp b/Characters.cpp
new file mode 100644 (file)
index 0000000..766a1c9
--- /dev/null
@@ -0,0 +1,3690 @@
+#include "Hunt.h"\r
+#include "stdio.h"\r
+\r
+BOOL NewPhase;\r
+\r
+#define fx_DIE    0\r
+\r
+\r
+\r
+\r
+//======= new ============//\r
+#define PIG_WALK   0\r
+#define PIG_RUN    1\r
+#define PIG_IDLE1  2 \r
+#define PIG_IDLE2  3\r
+#define PIG_IDLE3  4\r
+#define PIG_DIE    5\r
+#define PIG_SLP    6\r
+\r
+#define DIM_FLY    0\r
+#define DIM_FLYP   1\r
+#define DIM_FALL   2\r
+#define DIM_DIE    3\r
+\r
+#define BRO_WALK   0\r
+#define BRO_RUN    1\r
+#define BRO_IDLE1  2 \r
+#define BRO_IDLE2  3\r
+#define BRO_IDLE3  4\r
+#define BRO_DIE    5\r
+#define BRO_SLP    6\r
+\r
+#define DIA_WALK   0\r
+#define DIA_RUN    1\r
+#define DIA_SWIM   1\r
+#define DIA_IDLE1  2\r
+#define DIA_IDLE2  3\r
+#define DIA_JUMP   4\r
+#define DIA_SLIDE  5\r
+#define DIA_EAT    6\r
+#define DIA_DIE    7\r
+#define DIA_SLP    8\r
+\r
+#define DER_WALK   0\r
+#define DER_RUN    1\r
+#define DER_IDLE1  2 \r
+#define DER_IDLE2  3\r
+#define DER_DIE    4\r
+#define DER_SLP    5\r
+\r
+#define MAM_WALK   0\r
+#define MAM_RUN    1\r
+#define MAM_IDLE1  2 \r
+#define MAM_IDLE2  3\r
+#define MAM_DIE    4\r
+#define MAM_SLP    5\r
+\r
+\r
+// \r
+\r
+int CurDino;\r
+\r
+void SetNewTargetPlace(TCharacter *cptr, float R);\r
+\r
+\r
+void ProcessPrevPhase(TCharacter *cptr)\r
+{\r
+   cptr->PPMorphTime+=TimeDt;\r
+   if (cptr->PPMorphTime > PMORPHTIME) cptr->PrevPhase = cptr->Phase;\r
+\r
+   cptr->PrevPFTime+=TimeDt;\r
+   cptr->PrevPFTime %= cptr->pinfo->Animation[cptr->PrevPhase].AniTime;\r
+}\r
+\r
+\r
+void ActivateCharacterFx(TCharacter *cptr)\r
+{\r
+       if (cptr->AI) //== not hunter ==//\r
+        if (UNDERWATER) return;\r
+       int fx = cptr->pinfo->Anifx[cptr->Phase];\r
+       if (fx==-1) return;\r
+\r
+       if ( VectorLength(SubVectors(PlayerPos, cptr->pos) ) > 68 * 256) return;\r
+\r
+    AddVoice3d(cptr->pinfo->SoundFX[fx].length,\r
+               cptr->pinfo->SoundFX[fx].lpData,\r
+               cptr->pos.x,cptr->pos.y,cptr->pos.z);       \r
+}\r
+\r
+\r
+void ResetCharacter(TCharacter *cptr)\r
+{\r
+        cptr->AI     = DinoInfo[cptr->CType].AI;\r
+     cptr->pinfo  = &ChInfo[cptr->CType];\r
+        cptr->State  =  0;\r
+        cptr->StateF =  0;\r
+        cptr->Phase  =  0;\r
+     cptr->FTime  =  0;\r
+        cptr->PrevPhase   = 0;\r
+        cptr->PrevPFTime  = 0;\r
+        cptr->PPMorphTime = 0;\r
+        cptr->beta    =  0;\r
+        cptr->gamma   =  0;\r
+        cptr->tggamma =  0;\r
+        cptr->bend    =  0;\r
+        cptr->rspeed  =  0;\r
+        cptr->AfraidTime = 0;\r
+        cptr->BloodTTime = 0;\r
+        cptr->BloodTime  = 0;\r
+\r
+        cptr->lookx = (float)f_cos(cptr->alpha);\r
+     cptr->lookz = (float)f_sin(cptr->alpha);\r
+        \r
+        cptr->Health = DinoInfo[cptr->CType].Health0;\r
+        if (OptAgres>128) cptr->Health= (cptr->Health*OptAgres)/128;\r
+\r
+        cptr->scale =  (float)(DinoInfo[cptr->CType].Scale0 + rRand(DinoInfo[cptr->CType].ScaleA)) / 1000.f;\r
+}\r
+\r
+\r
+void AddDeadBody(TCharacter *cptr, int phase)\r
+{\r
+   if (!MyHealth) return;\r
+\r
+   if (ExitTime) \r
+         AddMessage("Transportation cancelled.");  \r
+   ExitTime = 0;\r
+\r
+   OPTICMODE = FALSE;\r
+   BINMODE = FALSE;\r
+   Characters[ChCount].CType = 0;\r
+   Characters[ChCount].alpha = CameraAlpha;\r
+   ResetCharacter(&Characters[ChCount]);\r
+\r
+   int v = rRand(3);\r
+   if (phase != HUNT_BREATH)\r
+      AddVoicev(fxScream[r].length, fxScream[r].lpData, 256);\r
+\r
+   Characters[ChCount].Health = 0;\r
+   MyHealth = 0;\r
+   if (cptr) {\r
+        float pl = 170;\r
+        //if (cptr->AI==AI_SPINO) pl = 200.f;\r
+        //if (cptr->AI==AI_CERAT) pl = 320.f;   \r
+     Characters[ChCount].pos.x = cptr->pos.x + cptr->lookx * pl * cptr->scale;\r
+     Characters[ChCount].pos.z = cptr->pos.z + cptr->lookz * pl * cptr->scale;\r
+        Characters[ChCount].pos.y = GetLandQH(Characters[ChCount].pos.x, Characters[ChCount].pos.z);\r
+   } else {\r
+        Characters[ChCount].pos.x = PlayerX;\r
+     Characters[ChCount].pos.z = PlayerZ;\r
+        Characters[ChCount].pos.y = PlayerY;\r
+   }\r
+   \r
+   Characters[ChCount].Phase = phase;\r
+   Characters[ChCount].PrevPhase = phase;\r
+\r
+   ActivateCharacterFx(&Characters[ChCount]);\r
+   \r
+\r
+   DemoPoint.pos = Characters[ChCount].pos;              \r
+   DemoPoint.DemoTime = 1;                      \r
+   DemoPoint.CIndex = ChCount;\r
+\r
+   ChCount++;\r
+}\r
+\r
+\r
+\r
+float AngleDifference(float a, float b)\r
+{\r
+ a-=b;\r
+ a = (float)fabs(a);\r
+ if (a > pi) a = 2*pi - a;\r
+ return a;\r
+}\r
+\r
+float CorrectedAlpha(float a, float b)\r
+{\r
+       float d = (float)fabs(a-b);\r
+       if (d<pi) return (a+b)/2;\r
+            else d = (a+pi*2-b);\r
+\r
+       if (d<0) d+=2*pi;\r
+       if (d>2*pi) d-=2*pi;\r
+       return d;\r
+}\r
+\r
+void ThinkY_Beta_Gamma(TCharacter *cptr, float blook, float glook, float blim, float glim)\r
+{\r
+    cptr->pos.y = GetLandH(cptr->pos.x, cptr->pos.z);\r
+\r
+    //=== beta ===//\r
+    float hlook  = GetLandH(cptr->pos.x + cptr->lookx * blook, cptr->pos.z + cptr->lookz * blook);\r
+    float hlook2 = GetLandH(cptr->pos.x - cptr->lookx * blook, cptr->pos.z - cptr->lookz * blook);    \r
+       DeltaFunc(cptr->beta, (hlook2 - hlook) / (blook * 3.2f), TimeDt / 800.f);\r
+\r
+    if (cptr->beta > blim) cptr->beta = blim;\r
+    if (cptr->beta <-blim) cptr->beta =-blim;\r
+\r
+    //=== gamma ===//\r
+    hlook = GetLandH(cptr->pos.x + cptr->lookz * glook, cptr->pos.z - cptr->lookx*glook);\r
+    hlook2 = GetLandH(cptr->pos.x - cptr->lookz * glook, cptr->pos.z + cptr->lookx*glook);\r
+    cptr->tggamma =(hlook - hlook2) / (glook * 3.2f);\r
+    if (cptr->tggamma > glim) cptr->tggamma = glim;\r
+    if (cptr->tggamma <-glim) cptr->tggamma =-glim;      \r
+/*\r
+       if (DEBUG) cptr->tggamma = 0;\r
+       if (DEBUG) cptr->beta    = 0;\r
+       */\r
+}\r
+\r
+\r
+\r
+\r
+int CheckPlaceCollisionP(Vector3d &v)\r
+{\r
+   int ccx = (int)v.x / 256;\r
+   int ccz = (int)v.z / 256;\r
+\r
+   if (ccx<4 || ccz<4 || ccx>1008 || ccz>1008) return 1;\r
+\r
+   int F = (FMap[ccz][ccx-1] | FMap[ccz-1][ccx] | FMap[ccz-1][ccx-1] |\r
+               FMap[ccz][ccx] | \r
+                   FMap[ccz+1][ccx] | FMap[ccz][ccx+1] | FMap[ccz+1][ccx+1]);\r
+\r
+   if (F & (fmWater + fmNOWAY)) return 1;\r
+\r
+\r
+   float h = GetLandH(v.x, v.z);\r
+   v.y = h;\r
+\r
+   float hh = GetLandH(v.x-164, v.z-164); if ( fabs(hh-h) > 160 ) return 1;\r
+         hh = GetLandH(v.x+164, v.z-164); if ( fabs(hh-h) > 160 ) return 1;\r
+                hh = GetLandH(v.x-164, v.z+164); if ( fabs(hh-h) > 160 ) return 1;\r
+                hh = GetLandH(v.x+164, v.z+164); if ( fabs(hh-h) > 160 ) return 1;\r
+  \r
+   for (int z=-2; z<=2; z++)\r
+    for (int x=-2; x<=2; x++) \r
+      if (OMap[ccz+z][ccx+x]!=255) {\r
+        int ob = OMap[ccz+z][ccx+x];\r
+               if (MObjects[ob].info.Radius<10) continue;\r
+        float CR = (float)MObjects[ob].info.Radius + 64;\r
+        \r
+        float oz = (ccz+z) * 256.f + 128.f;\r
+        float ox = (ccx+x) * 256.f + 128.f;\r
+        \r
+        float r = (float) sqrt( (ox-v.x)*(ox-v.x) + (oz-v.z)*(oz-v.z) );\r
+        if (r<CR) return 1;\r
+         }\r
+\r
+   return 0;\r
+}\r
+\r
+\r
+\r
+\r
+int CheckPlaceCollision(Vector3d &v, BOOL wc, BOOL mc)\r
+{\r
+   int ccx = (int)v.x / 256;\r
+   int ccz = (int)v.z / 256;\r
+\r
+   if (ccx<4 || ccz<4 || ccx>1018 || ccz>1018) return 1;\r
+\r
+   if (wc)\r
+   if ( (FMap[ccz][ccx-1] | FMap[ccz-1][ccx] | FMap[ccz-1][ccx-1] |\r
+            FMap[ccz][ccx] | \r
+                FMap[ccz+1][ccx] | FMap[ccz][ccx+1] | FMap[ccz+1][ccx+1]) & fmWater)\r
+          return 1;\r
+\r
+\r
+   float h = GetLandH(v.x, v.z);\r
+   if (! (FMap[ccz][ccx] & fmWater) )\r
+     if (fabs(h - v.y) > 64) return 1;\r
+   \r
+   v.y = h;\r
+\r
+   float hh = GetLandH(v.x-64, v.z-64); if ( fabs(hh-h) > 100 ) return 1;\r
+         hh = GetLandH(v.x+64, v.z-64); if ( fabs(hh-h) > 100 ) return 1;\r
+                hh = GetLandH(v.x-64, v.z+64); if ( fabs(hh-h) > 100 ) return 1;\r
+                hh = GetLandH(v.x+64, v.z+64); if ( fabs(hh-h) > 100 ) return 1;\r
+\r
+  if (mc)\r
+   for (int z=-2; z<=2; z++)\r
+    for (int x=-2; x<=2; x++) \r
+      if (OMap[ccz+z][ccx+x]!=255) {\r
+        int ob = OMap[ccz+z][ccx+x];\r
+               if (MObjects[ob].info.Radius<10) continue;\r
+        float CR = (float)MObjects[ob].info.Radius + 64;\r
+        \r
+        float oz = (ccz+z) * 256.f + 128.f;\r
+        float ox = (ccx+x) * 256.f + 128.f;\r
+        \r
+        float r = (float) sqrt( (ox-v.x)*(ox-v.x) + (oz-v.z)*(oz-v.z) );\r
+        if (r<CR) return 1;\r
+         }\r
+\r
+   return 0;\r
+}\r
+\r
+\r
+\r
+\r
+\r
+\r
+int CheckPlaceCollision2(Vector3d &v, BOOL wc)\r
+{\r
+   int ccx = (int)v.x / 256;\r
+   int ccz = (int)v.z / 256;      \r
+\r
+   if (ccx<4 || ccz<4 || ccx>1018 || ccz>1018) return 1;\r
+\r
+   if (wc)\r
+   if ( (FMap[ccz][ccx-1] | FMap[ccz-1][ccx] | FMap[ccz-1][ccx-1] |\r
+            FMap[ccz][ccx] | \r
+                FMap[ccz+1][ccx] | FMap[ccz][ccx+1] | FMap[ccz+1][ccx+1]) & fmWater)\r
+          return 1;\r
+\r
+   float h = GetLandH(v.x, v.z);\r
+   /*if (! (FMap[ccz][ccx] & fmWater) )\r
+     if (fabs(h - v.y) > 64) return 1;*/\r
+   v.y = h;\r
+\r
+   float hh = GetLandH(v.x-64, v.z-64); if ( fabs(hh-h) > 100 ) return 1;\r
+         hh = GetLandH(v.x+64, v.z-64); if ( fabs(hh-h) > 100 ) return 1;\r
+                hh = GetLandH(v.x-64, v.z+64); if ( fabs(hh-h) > 100 ) return 1;\r
+                hh = GetLandH(v.x+64, v.z+64); if ( fabs(hh-h) > 100 ) return 1;\r
+\r
+   return 0;\r
+}\r
+\r
+\r
+\r
+int CheckPossiblePath(TCharacter *cptr, BOOL wc, BOOL mc)\r
+{\r
+  Vector3d p = cptr->pos;\r
+  float lookx = (float)f_cos(cptr->tgalpha);\r
+  float lookz = (float)f_sin(cptr->tgalpha);\r
+  int c=0;\r
+  for (int t=0; t<20; t++) {    \r
+    p.x+=lookx * 64.f;\r
+       p.z+=lookz * 64.f;\r
+    if (CheckPlaceCollision(p, wc, mc)) c++;\r
+  }\r
+  return c;\r
+}\r
+\r
+\r
+void LookForAWay(TCharacter *cptr, BOOL wc, BOOL mc)\r
+{\r
+  float alpha = cptr->tgalpha;\r
+  float dalpha = 15.f;\r
+  float afound = alpha;\r
+  int maxp = 16;\r
+  int curp;\r
+\r
+  if (!CheckPossiblePath(cptr, wc, mc)) { cptr->NoWayCnt=0; return; }\r
+  \r
+  cptr->NoWayCnt++;\r
+  for (int i=0; i<12; i++) {\r
+       cptr->tgalpha = alpha+dalpha*pi/180.f;\r
+       curp=CheckPossiblePath(cptr, wc, mc) + (i>>1);\r
+       if (!curp) return;\r
+       if (curp<maxp) {\r
+               maxp = curp;\r
+        afound = cptr->tgalpha;\r
+       }\r
+\r
+       cptr->tgalpha = alpha-dalpha*pi/180.f;\r
+       curp=CheckPossiblePath(cptr, wc, mc) + (i>>1);\r
+       if (!curp) return;\r
+       if (curp<maxp) {\r
+               maxp = curp;\r
+        afound = cptr->tgalpha;\r
+       }\r
+\r
+       dalpha+=15.f;\r
+  }\r
\r
+  cptr->tgalpha = afound;\r
+}\r
+\r
+\r
+\r
+\r
+BOOL ReplaceCharacterForward(TCharacter *cptr)\r
+{\r
+  float al = CameraAlpha + (float)siRand(2048) / 2048.f;\r
+  float sa = (float)f_sin(al);\r
+  float ca = (float)f_cos(al);\r
+  Vector3d p;\r
+  p.x = PlayerX + sa * (ctViewR+rRand(10))*256;\r
+  p.z = PlayerZ - ca * (ctViewR+rRand(10))*256;\r
+  p.y = GetLandH(p.x, p.z); \r
+\r
+  if (p.x <  16*256) return FALSE;\r
+  if (p.z <  16*256) return FALSE;\r
+  if (p.x >1000*256) return FALSE;\r
+  if (p.z >1000*256) return FALSE;\r
+  \r
+  if (CheckPlaceCollisionP(p)) return FALSE;\r
+\r
+  cptr->State = 0;\r
+  cptr->pos = p;  \r
+  //cptr->tgx = cptr->pos.x + siRand(2048);\r
+  //cptr->tgz = cptr->pos.z + siRand(2048);     \r
+  SetNewTargetPlace(cptr, 2048);  \r
+\r
+  if (cptr->AI==AI_ARCHEO) //===== dimor ========//\r
+         cptr->pos.y+=1048.f;\r
+  return TRUE;\r
+}\r
+\r
+\r
+void Characters_AddSecondaryOne(int ctype)\r
+{\r
+        if (ChCount>64) return;\r
+     Characters[ChCount].CType = ctype;\r
+        int tr = 0;\r
+replace1:\r
+        tr++;\r
+        if (tr>128) return;\r
+        Characters[ChCount].pos.x = PlayerX + siRand(20040);\r
+     Characters[ChCount].pos.z = PlayerZ + siRand(20040);\r
+        Characters[ChCount].pos.y = GetLandH(Characters[ChCount].pos.x, \r
+                                                 Characters[ChCount].pos.z);\r
+\r
+        if (CheckPlaceCollisionP(Characters[ChCount].pos)) goto replace1;\r
+\r
+        if ( fabs(Characters[ChCount].pos.x - PlayerX) + \r
+             fabs(Characters[ChCount].pos.z - PlayerZ) < 256 * 40 )\r
+                 goto replace1;                  \r
+\r
+     Characters[ChCount].tgx = Characters[ChCount].pos.x;\r
+     Characters[ChCount].tgz = Characters[ChCount].pos.z;\r
+        Characters[ChCount].tgtime = 0;\r
+\r
+        ResetCharacter(&Characters[ChCount]);     \r
+        ChCount++;\r
+}\r
+\r
+\r
+\r
+void MoveCharacter(TCharacter *cptr, float dx, float dz, BOOL wc, BOOL mc)\r
+{\r
+       //return;    //000000000000000000000000000000000000000000000\r
+       //000000000000000000000000000000000000000000000\r
+//000000000000000000000000000000000000000000000//000000000000000000000000000000000000000000000//000000000000000000000000000000000000000000000\r
+\r
+\r
+   Vector3d p = cptr->pos;\r
+\r
+   if (CheckPlaceCollision2(p, wc)) {\r
+        cptr->pos.x+=dx / 2; \r
+        cptr->pos.z+=dz / 2; \r
+        return;\r
+   }\r
+   \r
+   p.x+=dx;\r
+   p.z+=dz;\r
+   \r
+   if (!CheckPlaceCollision2(p, wc)) {\r
+          cptr->pos = p; \r
+          return;\r
+   }\r
+\r
+   p = cptr->pos;\r
+   p.x+=dx/2;   \r
+   p.z+=dz/2;\r
+   if (!CheckPlaceCollision2(p, wc)) cptr->pos = p;       \r
+   p = cptr->pos;\r
+\r
+   p.x+=dx/4;\r
+   //if (!CheckPlaceCollision2(p)) cptr->pos = p;            \r
+   p.z+=dz/4;\r
+   //if (!CheckPlaceCollision2(p)) cptr->pos = p;         \r
+   cptr->pos = p;      \r
+}\r
+\r
+\r
+\r
+\r
+void MoveCharacter2(TCharacter *cptr, float dx, float dz)\r
+{\r
+       cptr->pos.x+=dx; \r
+    cptr->pos.z+=dz; \r
+}\r
+\r
+\r
+\r
+\r
+void SetNewTargetPlace(TCharacter *cptr, float R)\r
+{\r
+        Vector3d p;\r
+        int tr = 0;\r
+replace:\r
+     p.x = cptr->pos.x + siRand((int)R); if (p.x<512) p.x = 512; if (p.x>1018*256) p.x = 1018*256;\r
+     p.z = cptr->pos.z + siRand((int)R); if (p.z<512) p.z = 512; if (p.z>1018*256) p.z = 1018*256;         \r
+        p.y = GetLandH(p.x, p.z);\r
+        tr++;\r
+        if (tr<128) \r
+         if ( fabs(p.x - cptr->pos.x) + fabs(p.z - cptr->pos.z) < R / 2.f) goto replace;\r
+                \r
+        R+=512;\r
+\r
+        if (tr<256)\r
+        if (CheckPlaceCollisionP(p)) goto replace;\r
+\r
+        cptr->tgtime = 0;\r
+        cptr->tgx = p.x;\r
+        cptr->tgz = p.z;\r
+}\r
+\r
+\r
+\r
+void SetNewTargetPlace_Brahi(TCharacter *cptr, float R)\r
+{\r
+        Vector3d p;\r
+        int tr = 0;\r
+replace:\r
+     p.x = cptr->pos.x + siRand((int)R); if (p.x<512) p.x = 512; if (p.x>1018*256) p.x = 1018*256;\r
+     p.z = cptr->pos.z + siRand((int)R); if (p.z<512) p.z = 512; if (p.z>1018*256) p.z = 1018*256;      \r
+        tr++;\r
+        if (tr<16)\r
+          if ( fabs(p.x - cptr->pos.x) + fabs(p.z - cptr->pos.z) < R / 2.f) goto replace;               \r
+\r
+        p.y = GetLandH(p.x, p.z);\r
+        float wy = GetLandUpH(p.x, p.z) - p.y;\r
+\r
+        if (tr<128) {\r
+         if (wy > 400) goto replace;\r
+         if (wy < 200) goto replace;\r
+        }\r
+\r
+        cptr->tgtime = 0;\r
+        cptr->tgx = p.x;\r
+        cptr->tgz = p.z;\r
+}\r
+\r
+\r
+\r
+void AnimateHuntDead(TCharacter *cptr)\r
+{    \r
+  \r
+       //if (!cptr->FTime) ActivateCharacterFx(cptr);\r
+       \r
+       ProcessPrevPhase(cptr);\r
+       BOOL NewPhase = FALSE;\r
+       \r
+       cptr->FTime+=TimeDt;      \r
+    if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {          \r
+               NewPhase = TRUE;                \r
+               if (cptr->Phase==2)\r
+                       cptr->FTime = cptr->pinfo->Animation[cptr->Phase].AniTime-1;    \r
+               else\r
+                       cptr->FTime = 0;                \r
+\r
+               if (cptr->Phase==1) {                   \r
+                       cptr->FTime=0;\r
+                       cptr->Phase=2;\r
+               }\r
+\r
+               ActivateCharacterFx(cptr);\r
+       }\r
+        \r
+\r
+    float h = GetLandH(cptr->pos.x, cptr->pos.z);\r
+       DeltaFunc(cptr->pos.y, h, TimeDt / 5.f);\r
+\r
+       if (cptr->Phase==2)\r
+               if (cptr->pos.y > h+3) {\r
+                       cptr->FTime = 0;\r
+                       //MessageBeep(0xFFFFFFFF);\r
+               }\r
+\r
+       \r
+         if (cptr->pos.y < h + 256) {\r
+        //=== beta ===//\r
+                 float blook = 256;\r
+        float hlook  = GetLandH(cptr->pos.x + cptr->lookx * blook, cptr->pos.z + cptr->lookz * blook);\r
+        float hlook2 = GetLandH(cptr->pos.x - cptr->lookx * blook, cptr->pos.z - cptr->lookz * blook);    \r
+           DeltaFunc(cptr->beta, (hlook2 - hlook) / (blook * 3.2f), TimeDt / 1800.f);\r
+\r
+        if (cptr->beta > 0.4f) cptr->beta = 0.4f;\r
+        if (cptr->beta <-0.4f) cptr->beta =-0.4f;\r
+\r
+        //=== gamma ===//\r
+                 float glook = 256;\r
+        hlook = GetLandH(cptr->pos.x + cptr->lookz * glook, cptr->pos.z - cptr->lookx*glook);\r
+        hlook2 = GetLandH(cptr->pos.x - cptr->lookz * glook, cptr->pos.z + cptr->lookx*glook);\r
+        cptr->tggamma =(hlook - hlook2) / (glook * 3.2f);\r
+        if (cptr->tggamma > 0.4f) cptr->tggamma = 0.4f;\r
+        if (cptr->tggamma <-0.4f) cptr->tggamma =-0.4f;      \r
+               DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 1800.f); \r
+         }\r
\r
+\r
+         TCharacter *cptr2 = &Characters[DemoPoint.CIndex];    \r
+}\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+void AnimateDiatrDead(TCharacter *cptr)\r
+{    \r
+\r
+  if (cptr->Phase!=DIA_DIE && cptr->Phase!=DIA_SLP) {    \r
+    if (cptr->PPMorphTime>128) {\r
+     cptr->PrevPhase = cptr->Phase;\r
+     cptr->PrevPFTime  = cptr->FTime;\r
+     cptr->PPMorphTime = 0; }    \r
+\r
+    cptr->FTime = 0;\r
+    cptr->Phase = DIA_DIE;   \r
+       ActivateCharacterFx(cptr);\r
+  } else {    \r
+    ProcessPrevPhase(cptr);\r
+\r
+    cptr->FTime+=TimeDt;      \r
+    if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime)\r
+               if (Tranq) {\r
+                       cptr->FTime=0;\r
+                       cptr->Phase = DIA_SLP;\r
+                       ActivateCharacterFx(cptr);\r
+               } else\r
+        cptr->FTime = cptr->pinfo->Animation[cptr->Phase].AniTime-1;\r
+  }\r
+\r
+//======= movement ===========//\r
+   DeltaFunc(cptr->vspeed, 0, TimeDt / 800.f);          \r
+   cptr->pos.x+=cptr->lookx * cptr->vspeed * TimeDt;\r
+   cptr->pos.z+=cptr->lookz * cptr->vspeed * TimeDt;\r
+\r
+   ThinkY_Beta_Gamma(cptr, 100, 96, 0.6f, 0.5f);\r
+   DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 1600.f);\r
+}\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+void AnimatePigDead(TCharacter *cptr)\r
+{    \r
+\r
+  if (cptr->Phase!=PIG_DIE && cptr->Phase!=PIG_SLP) {    \r
+    if (cptr->PPMorphTime>128) {\r
+     cptr->PrevPhase = cptr->Phase;\r
+     cptr->PrevPFTime  = cptr->FTime;\r
+     cptr->PPMorphTime = 0; }\r
+    \r
+    cptr->FTime = 0;\r
+    cptr->Phase = PIG_DIE;   \r
+       ActivateCharacterFx(cptr);\r
+  } else {    \r
+    ProcessPrevPhase(cptr);\r
+\r
+    cptr->FTime+=TimeDt;      \r
+    if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime)\r
+               if (Tranq) {\r
+                       cptr->FTime=0;\r
+                       cptr->Phase = PIG_SLP;\r
+                       ActivateCharacterFx(cptr);\r
+               } else\r
+        cptr->FTime = cptr->pinfo->Animation[cptr->Phase].AniTime-1;\r
+  }\r
+\r
+//======= movement ===========//\r
+   DeltaFunc(cptr->vspeed, 0, TimeDt / 800.f);          \r
+   cptr->pos.x+=cptr->lookx * cptr->vspeed * TimeDt;\r
+   cptr->pos.z+=cptr->lookz * cptr->vspeed * TimeDt;   \r
+\r
+   ThinkY_Beta_Gamma(cptr, 100, 96, 0.6f, 0.5f);   \r
+     \r
+   DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 1600.f);\r
+}\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+void AnimateDimorDead(TCharacter *cptr)\r
+{    \r
+\r
+  if (cptr->Phase!=DIM_FALL && cptr->Phase!=DIM_DIE) {    \r
+    if (cptr->PPMorphTime>128) {\r
+     cptr->PrevPhase = cptr->Phase;\r
+     cptr->PrevPFTime  = cptr->FTime;\r
+     cptr->PPMorphTime = 0; }    \r
+\r
+    cptr->FTime = 0;\r
+    cptr->Phase = DIM_FALL;\r
+       cptr->rspeed = 0;\r
+       ActivateCharacterFx(cptr);\r
+       return;\r
+  }    \r
+    \r
+  ProcessPrevPhase(cptr);\r
+\r
+  cptr->FTime+=TimeDt;\r
+  if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime)       \r
+    if (cptr->Phase == DIM_DIE)\r
+       cptr->FTime = cptr->pinfo->Animation[cptr->Phase].AniTime-1;\r
+    else\r
+       cptr->FTime%= cptr->pinfo->Animation[cptr->Phase].AniTime;\r
+  \r
+\r
+//======= movement ===========//\r
+   if (cptr->Phase == DIM_DIE)\r
+     DeltaFunc(cptr->vspeed, 0, TimeDt / 400.f);          \r
+   else\r
+        DeltaFunc(cptr->vspeed, 0, TimeDt / 1200.f);\r
+\r
+   cptr->pos.x+=cptr->lookx * cptr->vspeed * TimeDt;\r
+   cptr->pos.z+=cptr->lookz * cptr->vspeed * TimeDt;\r
+\r
+   if (cptr->Phase == DIM_FALL) {\r
+          float wh = GetLandUpH(cptr->pos.x, cptr->pos.z);\r
+          float lh = GetLandH  (cptr->pos.x, cptr->pos.z);\r
+          BOOL OnWater = (wh > lh);\r
+          if (OnWater)\r
+                  if (cptr->pos.y>=wh && (cptr->pos.y+cptr->rspeed * TimeDt / 1024) <wh) {\r
+                          AddWCircle(cptr->pos.x+siRand(128), cptr->pos.z+siRand(128), 2.0);\r
+                          AddWCircle(cptr->pos.x+siRand(128), cptr->pos.z+siRand(128), 2.5);\r
+                          AddWCircle(cptr->pos.x+siRand(128), cptr->pos.z+siRand(128), 3.0);\r
+                          AddWCircle(cptr->pos.x+siRand(128), cptr->pos.z+siRand(128), 3.5);\r
+                          AddWCircle(cptr->pos.x+siRand(128), cptr->pos.z+siRand(128), 3.0);\r
+                  }\r
+          cptr->pos.y+=cptr->rspeed * TimeDt / 1024;\r
+          cptr->rspeed-=TimeDt*2.56f;\r
+\r
+          if (cptr->pos.y<lh) {\r
+                  cptr->pos.y = lh;\r
+                  if (OnWater) {\r
+                          AddElements(cptr->pos.x+siRand(128), lh, cptr->pos.z+siRand(128), 4, 10);\r
+                          AddElements(cptr->pos.x+siRand(128), lh, cptr->pos.z+siRand(128), 4, 10);\r
+                          AddElements(cptr->pos.x+siRand(128), lh, cptr->pos.z+siRand(128), 4, 10);\r
+                  }\r
+\r
+                  if (cptr->PPMorphTime>128) {\r
+            cptr->PrevPhase = cptr->Phase;\r
+            cptr->PrevPFTime  = cptr->FTime;\r
+            cptr->PPMorphTime = 0; }\r
+\r
+                  cptr->Phase = DIM_DIE;\r
+                  cptr->FTime = 0;\r
+                  ActivateCharacterFx(cptr);\r
+          }\r
+   }    else    {\r
+     ThinkY_Beta_Gamma(cptr, 140, 126, 0.6f, 0.5f);     \r
+     DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 1600.f);    \r
+   }   \r
+}\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+void AnimateBronDead(TCharacter *cptr)\r
+{    \r
+\r
+  if (cptr->Phase!=BRO_DIE && cptr->Phase!=BRO_SLP) {    \r
+    if (cptr->PPMorphTime>128) {\r
+     cptr->PrevPhase = cptr->Phase;\r
+     cptr->PrevPFTime  = cptr->FTime;\r
+     cptr->PPMorphTime = 0; }     \r
+\r
+    cptr->FTime = 0;\r
+    cptr->Phase = BRO_DIE;   \r
+       ActivateCharacterFx(cptr);\r
+  } else {    \r
+    ProcessPrevPhase(cptr);\r
+\r
+    cptr->FTime+=TimeDt;      \r
+    if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime)\r
+               if (Tranq) {\r
+                       cptr->FTime=0;\r
+                       cptr->Phase = BRO_SLP;\r
+                       ActivateCharacterFx(cptr);\r
+               } else\r
+        cptr->FTime = cptr->pinfo->Animation[cptr->Phase].AniTime-1;\r
+  }\r
+\r
+//======= movement ===========//\r
+   DeltaFunc(cptr->vspeed, 0, TimeDt / 800.f);          \r
+   cptr->pos.x+=cptr->lookx * cptr->vspeed * TimeDt;\r
+   cptr->pos.z+=cptr->lookz * cptr->vspeed * TimeDt;   \r
+\r
+   ThinkY_Beta_Gamma(cptr, 100, 96, 0.6f, 0.5f);   \r
+     \r
+   DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 1600.f);\r
+}\r
+\r
+\r
+\r
+void AnimateHogDead(TCharacter *cptr)\r
+{    \r
+\r
+  if (cptr->Phase!=BRO_DIE && cptr->Phase!=BRO_SLP) {    \r
+    if (cptr->PPMorphTime>128) {\r
+     cptr->PrevPhase = cptr->Phase;\r
+     cptr->PrevPFTime  = cptr->FTime;\r
+     cptr->PPMorphTime = 0; }     \r
+\r
+    cptr->FTime = 0;\r
+    cptr->Phase = BRO_DIE;   \r
+       ActivateCharacterFx(cptr);\r
+  } else {    \r
+    ProcessPrevPhase(cptr);\r
+\r
+    cptr->FTime+=TimeDt;      \r
+    if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime)\r
+               if (Tranq) {\r
+                       cptr->FTime=0;\r
+                       cptr->Phase = BRO_SLP;\r
+                       ActivateCharacterFx(cptr);\r
+               } else\r
+        cptr->FTime = cptr->pinfo->Animation[cptr->Phase].AniTime-1;\r
+  }\r
+\r
+//======= movement ===========//\r
+   DeltaFunc(cptr->vspeed, 0, TimeDt / 800.f);          \r
+   cptr->pos.x+=cptr->lookx * cptr->vspeed * TimeDt;\r
+   cptr->pos.z+=cptr->lookz * cptr->vspeed * TimeDt;   \r
+\r
+   ThinkY_Beta_Gamma(cptr, 100, 96, 0.6f, 0.5f);   \r
+     \r
+   DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 1600.f);\r
+}\r
+\r
+\r
+\r
+void AnimateRhinoDead(TCharacter *cptr)\r
+{    \r
+\r
+  if (cptr->Phase!=BRO_DIE && cptr->Phase!=BRO_SLP) {    \r
+    if (cptr->PPMorphTime>128) {\r
+     cptr->PrevPhase = cptr->Phase;\r
+     cptr->PrevPFTime  = cptr->FTime;\r
+     cptr->PPMorphTime = 0; }     \r
+\r
+    cptr->FTime = 0;\r
+    cptr->Phase = BRO_DIE;   \r
+       ActivateCharacterFx(cptr);\r
+  } else {    \r
+    ProcessPrevPhase(cptr);\r
+\r
+    cptr->FTime+=TimeDt;      \r
+    if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime)\r
+               if (Tranq) {\r
+                       cptr->FTime=0;\r
+                       cptr->Phase = BRO_SLP;\r
+                       ActivateCharacterFx(cptr);\r
+               } else\r
+        cptr->FTime = cptr->pinfo->Animation[cptr->Phase].AniTime-1;\r
+  }\r
+\r
+//======= movement ===========//\r
+   DeltaFunc(cptr->vspeed, 0, TimeDt / 800.f);          \r
+   cptr->pos.x+=cptr->lookx * cptr->vspeed * TimeDt;\r
+   cptr->pos.z+=cptr->lookz * cptr->vspeed * TimeDt;   \r
+\r
+   ThinkY_Beta_Gamma(cptr, 100, 96, 0.6f, 0.5f);   \r
+     \r
+   DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 1600.f);\r
+}\r
+\r
+\r
+\r
+void AnimateSmiloDead(TCharacter *cptr)\r
+{    \r
+\r
+  if (cptr->Phase!=BRO_DIE && cptr->Phase!=BRO_SLP) {    \r
+    if (cptr->PPMorphTime>128) {\r
+     cptr->PrevPhase = cptr->Phase;\r
+     cptr->PrevPFTime  = cptr->FTime;\r
+     cptr->PPMorphTime = 0; }     \r
+\r
+    cptr->FTime = 0;\r
+    cptr->Phase = BRO_DIE;   \r
+       ActivateCharacterFx(cptr);\r
+  } else {    \r
+    ProcessPrevPhase(cptr);\r
+\r
+    cptr->FTime+=TimeDt;      \r
+    if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime)\r
+               if (Tranq) {\r
+                       cptr->FTime=0;\r
+                       cptr->Phase = BRO_SLP;\r
+                       ActivateCharacterFx(cptr);\r
+               } else\r
+        cptr->FTime = cptr->pinfo->Animation[cptr->Phase].AniTime-1;\r
+  }\r
+\r
+//======= movement ===========//\r
+   DeltaFunc(cptr->vspeed, 0, TimeDt / 800.f);          \r
+   cptr->pos.x+=cptr->lookx * cptr->vspeed * TimeDt;\r
+   cptr->pos.z+=cptr->lookz * cptr->vspeed * TimeDt;   \r
+\r
+   ThinkY_Beta_Gamma(cptr, 100, 96, 0.6f, 0.5f);   \r
+     \r
+   DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 1600.f);\r
+}\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+void AnimateDeerDead(TCharacter *cptr)\r
+{    \r
+\r
+  if (cptr->Phase!=DER_DIE && cptr->Phase!=DER_SLP) {    \r
+    if (cptr->PPMorphTime>128) {\r
+     cptr->PrevPhase = cptr->Phase;\r
+     cptr->PrevPFTime  = cptr->FTime;\r
+     cptr->PPMorphTime = 0; }\r
+    \r
+    cptr->FTime = 0;\r
+    cptr->Phase = DER_DIE;   \r
+       ActivateCharacterFx(cptr);\r
+  } else {    \r
+    ProcessPrevPhase(cptr);\r
+\r
+    cptr->FTime+=TimeDt;      \r
+    if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime)\r
+               if (Tranq) {\r
+                       cptr->FTime=0;\r
+                       cptr->Phase = DER_SLP;\r
+                       ActivateCharacterFx(cptr);\r
+               } else\r
+        cptr->FTime = cptr->pinfo->Animation[cptr->Phase].AniTime-1;\r
+  }\r
+\r
+//======= movement ===========//\r
+   DeltaFunc(cptr->vspeed, 0, TimeDt / 800.f);          \r
+   cptr->pos.x+=cptr->lookx * cptr->vspeed * TimeDt;\r
+   cptr->pos.z+=cptr->lookz * cptr->vspeed * TimeDt;   \r
+\r
+   ThinkY_Beta_Gamma(cptr, 100, 96, 0.6f, 0.5f);   \r
+     \r
+   DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 1600.f);\r
+}\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+void AnimateDiatr(TCharacter *cptr)\r
+{\r
+   NewPhase = FALSE;\r
+   int _Phase = cptr->Phase;\r
+   int _FTime = cptr->FTime;\r
+   float _tgalpha = cptr->tgalpha;\r
+\r
+\r
+TBEGIN:\r
+   float targetx = cptr->tgx;\r
+   float targetz = cptr->tgz;\r
+   float targetdx = targetx - cptr->pos.x;\r
+   float targetdz = targetz - cptr->pos.z;\r
+\r
+   float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );    \r
+\r
+   float playerdx = PlayerX - cptr->pos.x - cptr->lookx * 108;\r
+   float playerdz = PlayerZ - cptr->pos.z - cptr->lookz * 108;\r
+   float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );    \r
+   if (cptr->State==2) { if (cptr->Phase!=DIA_JUMP) NewPhase=TRUE; cptr->State=1; cptr->Phase=DIA_RUN;}\r
+\r
+   \r
+   if (GetLandUpH(cptr->pos.x, cptr->pos.z) - GetLandH(cptr->pos.x, cptr->pos.z) > 140 * cptr->scale)\r
+          cptr->StateF |= csONWATER; else\r
+          cptr->StateF &= (!csONWATER);\r
+\r
+   if (cptr->Phase == DIA_EAT) goto NOTHINK;\r
+   \r
+//============================================//   \r
+   if (!MyHealth) cptr->State = 0;\r
+   if (cptr->State) {                          \r
+          if (pdist > ctViewR*140+OptAgres/8) {\r
+                       nv.x = playerdx; nv.z = playerdz; nv.y = 0;\r
+               NormVector(nv, 2048.f);\r
+            cptr->tgx = cptr->pos.x - nv.x;\r
+            cptr->tgz = cptr->pos.z - nv.z;\r
+                       cptr->tgtime = 0;\r
+                       cptr->AfraidTime-=TimeDt;\r
+                       if (cptr->AfraidTime<=0) {\r
+                        cptr->AfraidTime=0; cptr->State = 0;                    \r
+                       }                       \r
+          } else {\r
+            cptr->tgx = PlayerX;\r
+            cptr->tgz = PlayerZ;                       \r
+                       cptr->tgtime = 0;\r
+          }\r
+     \r
+        if (!(cptr->StateF & csONWATER))\r
+         if (pdist<1324 * cptr->scale && pdist>900 * cptr->scale) \r
+          if (AngleDifference(cptr->alpha, FindVectorAlpha(playerdx, playerdz)) < 0.2f)\r
+           cptr->Phase = DIA_JUMP;\r
+\r
+        if (pdist<300) \r
+         if (fabs(PlayerY - cptr->pos.y - 120) < 256) {            \r
+                 if (!(cptr->StateF & csONWATER)) {\r
+               cptr->vspeed/= 8.0f;\r
+               cptr->State = 1;\r
+               cptr->Phase = DIA_EAT;     \r
+                }\r
+          \r
+          AddDeadBody(cptr, HUNT_EAT);    \r
+        }\r
+   }\r
+\r
+   if (!cptr->State) {    \r
+       cptr->AfraidTime = 0;\r
+       if (tdist<456) {\r
+       SetNewTargetPlace(cptr, 8048.f);                \r
+          goto TBEGIN; }\r
+   }\r
+\r
+NOTHINK:\r
+   if (pdist<2048) cptr->NoFindCnt = 0;\r
+   if (cptr->NoFindCnt) cptr->NoFindCnt--; else \r
+   {\r
+    cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);      \r
+       if (cptr->State && pdist>1648) { \r
+               cptr->tgalpha += (float)f_sin(RealTime/824.f) / 4.f;\r
+               if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;\r
+        if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;\r
+       }\r
+       }\r
+\r
+   LookForAWay(cptr, FALSE, TRUE);\r
+   if (cptr->NoWayCnt>12) { cptr->NoWayCnt=0; cptr->NoFindCnt = 16 + rRand(20); }\r
+\r
+\r
+   if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;\r
+   if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;\r
+  \r
+//===============================================//\r
+\r
+   ProcessPrevPhase(cptr);\r
+   \r
+\r
+//======== select new phase =======================//\r
+   cptr->FTime+=TimeDt;   \r
+   \r
+   if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {       \r
+       cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;\r
+       NewPhase = TRUE; }\r
+   \r
+   if (cptr->Phase==DIA_EAT)  goto ENDPSELECT; \r
+   if (NewPhase && _Phase==DIA_JUMP) { cptr->Phase = DIA_RUN; goto ENDPSELECT; }   \r
+\r
+   if (cptr->Phase== DIA_JUMP) goto ENDPSELECT;    \r
+   \r
+   if (NewPhase) \r
+        if (!cptr->State)\r
+      if (rRand(128)>110) {\r
+                       cptr->Phase = DIA_IDLE1 + rRand(1);                 \r
+            goto ENDPSELECT;\r
+         } else cptr->Phase = DIA_WALK; else cptr->Phase = DIA_RUN;\r
+            \r
+   if (cptr->Phase!=DIA_IDLE1 && cptr->Phase!=DIA_IDLE2)\r
+   if (!cptr->State) cptr->Phase=DIA_WALK; else\r
+        if (fabs(cptr->tgalpha - cptr->alpha)<1.0 ||\r
+            fabs(cptr->tgalpha - cptr->alpha)>2*pi-1.0) \r
+                cptr->Phase = DIA_RUN; else cptr->Phase=DIA_WALK;\r
+\r
+   if (cptr->StateF & csONWATER) cptr->Phase = DIA_SWIM;\r
+   if (cptr->Slide>40) cptr->Phase = DIA_SLIDE;\r
+   \r
+   \r
+ENDPSELECT:\r
+\r
+//====== process phase changing ===========//\r
+   if ( (_Phase != cptr->Phase) || NewPhase)\r
+        ActivateCharacterFx(cptr);        \r
+   \r
+   if (_Phase != cptr->Phase) {     \r
+    //==== set proportional FTime for better morphing =//       \r
+   if (MORPHP)\r
+    if (_Phase<=3 && cptr->Phase<=3)\r
+        cptr->FTime = _FTime * cptr->pinfo->Animation[cptr->Phase].AniTime / cptr->pinfo->Animation[_Phase].AniTime + 64;\r
+    else if (!NewPhase) cptr->FTime = 0;\r
+\r
+    if (cptr->PPMorphTime>128) {\r
+     cptr->PrevPhase = _Phase;\r
+     cptr->PrevPFTime  = _FTime;\r
+     cptr->PPMorphTime = 0; }\r
+   }\r
+  \r
+   cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;   \r
+\r
+      \r
+   \r
+   //========== rotation to tgalpha ===================//\r
+   \r
+   float rspd, currspeed, tgbend;\r
+   float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);   \r
+   float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;\r
+\r
+   if (cptr->Phase==DIA_JUMP  || cptr->Phase==DIA_EAT ||\r
+          cptr->Phase==DIA_IDLE1 || cptr->Phase==DIA_IDLE2) goto SKIPROT;\r
+   \r
+   if (drspd > 0.02)   \r
+    if (cptr->tgalpha > cptr->alpha) currspeed = 0.6f + drspd*1.2f;\r
+                                else currspeed =-0.6f - drspd*1.2f;\r
+     else currspeed = 0;\r
+   if (cptr->AfraidTime) currspeed*=2.5;\r
+   \r
+   if (dalpha > pi) currspeed*=-1;\r
+   if ((cptr->StateF & csONWATER) || cptr->Phase==DIA_WALK) currspeed/=1.4f;\r
+         \r
+   if (cptr->AfraidTime) DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 160.f);\r
+                    else DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 180.f);\r
+\r
+   tgbend = drspd/3;\r
+   if (tgbend>pi/5) tgbend = pi/5;\r
+\r
+   tgbend*= SGN(currspeed);\r
+   if (fabs(tgbend) > fabs(cptr->bend)) DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 800.f);\r
+                                   else DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 600.f);\r
+\r
+   \r
+   rspd=cptr->rspeed * TimeDt / 1024.f;\r
+   if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;\r
+                      else cptr->alpha+=rspd;\r
+   \r
+\r
+   if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;\r
+   if (cptr->alpha < 0     ) cptr->alpha+= pi * 2;\r
+\r
+SKIPROT:\r
+\r
+   //======= set slide mode ===========//\r
+   if (!cptr->Slide && cptr->vspeed>0.6 && cptr->Phase!=DIA_JUMP)\r
+     if (AngleDifference(cptr->tgalpha, cptr->alpha)>pi*2/3.f) {         \r
+         cptr->Slide = (int)(cptr->vspeed*700.f);\r
+         cptr->slidex = cptr->lookx;\r
+         cptr->slidez = cptr->lookz;         \r
+         cptr->vspeed = 0;\r
+     }\r
+\r
+\r
+\r
+//========== movement ==============================//\r
+   cptr->lookx = (float)f_cos(cptr->alpha);\r
+   cptr->lookz = (float)f_sin(cptr->alpha);\r
+\r
+   float curspeed = 0;\r
+   if (cptr->Phase == DIA_RUN ) curspeed = 0.640*2;\r
+   if (cptr->Phase == DIA_JUMP) curspeed = 0.600*2;\r
+   if (cptr->Phase == DIA_WALK) curspeed = 0.224*2;\r
+   if (cptr->Phase == DIA_SWIM) curspeed = 0.300*2;\r
+   if (cptr->Phase == DIA_EAT)  curspeed = 0.0f;\r
+\r
+   if (cptr->Phase == DIA_RUN && cptr->Slide) {\r
+    curspeed /= 8;\r
+    if (drspd > pi / 2.f) curspeed=0; else \r
+    if (drspd > pi / 4.f) curspeed*=2.f - 4.f*drspd / pi; \r
+   } else \r
+    if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;\r
+\r
+//========== process speed =============//\r
+   \r
+   DeltaFunc(cptr->vspeed, curspeed, TimeDt / 500.f);    \r
+   \r
+   if (cptr->Phase==DIA_JUMP) cptr->vspeed = 1.1f;\r
+\r
+   MoveCharacter(cptr, cptr->lookx * cptr->vspeed * TimeDt * cptr->scale,\r
+                          cptr->lookz * cptr->vspeed * TimeDt * cptr->scale, FALSE, TRUE);\r
+\r
+   \r
+//========== slide ==============//\r
+   if (cptr->Slide) {\r
+     MoveCharacter(cptr, cptr->slidex * cptr->Slide / 600.f * TimeDt * cptr->scale,\r
+                                cptr->slidez * cptr->Slide / 600.f * TimeDt * cptr->scale, FALSE, TRUE);     \r
+\r
+     cptr->Slide-=TimeDt;\r
+     if (cptr->Slide<0) cptr->Slide=0;\r
+   }\r
+    \r
+\r
+//============ Y movement =================//   \r
+   if (cptr->StateF & csONWATER) {\r
+    cptr->pos.y = GetLandUpH(cptr->pos.x, cptr->pos.z) - 160 * cptr->scale;\r
+    cptr->beta/=2;\r
+    cptr->tggamma=0;    \r
+   } else {            \r
+       ThinkY_Beta_Gamma(cptr, 98, 84, 0.4f, 0.3f);            \r
+   }\r
+\r
+   //=== process to tggamma ===//   \r
+   if (cptr->Phase==DIA_WALK) cptr->tggamma+= cptr->rspeed / 9.0f;\r
+                         else cptr->tggamma+= cptr->rspeed / 6.0f;\r
+   if (cptr->Phase==DIA_JUMP) cptr->tggamma=0;\r
+\r
+   DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 1624.f);\r
+\r
+\r
+//==================================================//   \r
+  \r
+}\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+void AnimatePig(TCharacter *cptr)\r
+{\r
+   NewPhase = FALSE;\r
+   int _Phase = cptr->Phase;\r
+   int _FTime = cptr->FTime;\r
+   float _tgalpha = cptr->tgalpha;\r
+   if (cptr->AfraidTime) cptr->AfraidTime = max(0, cptr->AfraidTime - TimeDt);\r
+   if (cptr->State==2) { NewPhase=TRUE; cptr->State=1; }\r
+\r
+TBEGIN:\r
+   float targetx = cptr->tgx;\r
+   float targetz = cptr->tgz;\r
+   float targetdx = targetx - cptr->pos.x;\r
+   float targetdz = targetz - cptr->pos.z;\r
+\r
+   float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );       \r
+\r
+   float playerdx = PlayerX - cptr->pos.x;\r
+   float playerdz = PlayerZ - cptr->pos.z;\r
+   float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );    \r
+   \r
+\r
+   //=========== run away =================//\r
+   \r
+   if (cptr->State) {          \r
+       if (!cptr->AfraidTime) {\r
+        if (pdist<2048.f) cptr->AfraidTime = (5 + rRand(5)) * 1024; \r
+       \r
+       if (!cptr->AfraidTime)\r
+        if (pdist > 4096.f) { \r
+               cptr->State = 0; \r
+               SetNewTargetPlace(cptr, 2048.f);\r
+               goto TBEGIN; }\r
+       }\r
+\r
+\r
+       nv.x = playerdx; nv.z = playerdz; nv.y = 0;\r
+       NormVector(nv, 2048.f);\r
+    cptr->tgx = cptr->pos.x - nv.x;\r
+    cptr->tgz = cptr->pos.z - nv.z;\r
+       cptr->tgtime = 0;\r
+   }\r
+\r
+   if (pdist>(ctViewR+20)*256) \r
+          if (ReplaceCharacterForward(cptr)) goto TBEGIN;\r
+\r
+\r
+   //======== exploring area ===============//\r
+   if (!cptr->State) {\r
+        cptr->AfraidTime = 0;\r
+        if (pdist<812.f) { \r
+                cptr->State = 1; \r
+                cptr->AfraidTime = (5 + rRand(5)) * 1024;\r
+                cptr->Phase = PIG_RUN;\r
+                goto TBEGIN;  }\r
+        \r
+\r
+        if (tdist<456) {          \r
+       SetNewTargetPlace(cptr, 2048.f);\r
+          goto TBEGIN; }               \r
+   } \r
+   \r
+   \r
+//============================================//        \r
+\r
+   if (cptr->NoFindCnt) cptr->NoFindCnt--;\r
+                   else cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);   \r
+   LookForAWay(cptr, TRUE, TRUE);\r
+   if (cptr->NoWayCnt>8) { cptr->NoWayCnt=0; cptr->NoFindCnt = 8 + rRand(80); }\r
+\r
+   if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;\r
+   if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;\r
+  \r
+//===============================================//\r
+\r
+   ProcessPrevPhase(cptr);   \r
+\r
+//======== select new phase =======================//\r
+   cptr->FTime+=TimeDt;\r
+   \r
+   if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {       \r
+       cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;\r
+       NewPhase = TRUE; }   \r
+              \r
+   if (NewPhase) \r
+          if (!cptr->State) {\r
+                  if (cptr->Phase == PIG_IDLE1 || cptr->Phase == PIG_IDLE2 || cptr->Phase == PIG_IDLE3) {\r
+                        if (rRand(128)>96) cptr->Phase = PIG_WALK;\r
+                                      else cptr->Phase = PIG_IDLE1 + rRand(2);\r
+                        goto ENDPSELECT;\r
+                  }               \r
+                  if (rRand(128) > 120) cptr->Phase=PIG_IDLE1; else cptr->Phase=PIG_WALK; \r
+          } else\r
+          if (cptr->AfraidTime) cptr->Phase = PIG_RUN; \r
+                           else cptr->Phase = PIG_WALK;        \r
+      \r
+ENDPSELECT:\r
+\r
+//====== process phase changing ===========//\r
+   if ( (_Phase != cptr->Phase) || NewPhase)\r
+        ActivateCharacterFx(cptr);        \r
+   \r
+   if (_Phase != cptr->Phase) {         \r
+    if (_Phase<=1 && cptr->Phase<=1)\r
+        cptr->FTime = _FTime * cptr->pinfo->Animation[cptr->Phase].AniTime / cptr->pinfo->Animation[_Phase].AniTime + 64;\r
+    else if (!NewPhase) cptr->FTime = 0;\r
+\r
+    if (cptr->PPMorphTime>128) {\r
+     cptr->PrevPhase = _Phase;\r
+     cptr->PrevPFTime  = _FTime;\r
+     cptr->PPMorphTime = 0; }\r
+   }\r
+  \r
+   cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;   \r
+\r
+      \r
+   \r
+   //========== rotation to tgalpha ===================//\r
+   \r
+   float rspd, currspeed, tgbend;\r
+   float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);   \r
+   float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;\r
+\r
+\r
+   if (cptr->Phase == PIG_IDLE1 || cptr->Phase == PIG_IDLE2 || cptr->Phase == PIG_IDLE3) goto SKIPROT;\r
+   if (drspd > 0.02)\r
+    if (cptr->tgalpha > cptr->alpha) currspeed = 0.8f + drspd*1.4f;\r
+                                else currspeed =-0.8f - drspd*1.4f;\r
+     else currspeed = 0;\r
+   \r
+   if (cptr->AfraidTime) currspeed*=1.5;\r
+   if (dalpha > pi) currspeed*=-1;\r
+   if ((cptr->State & csONWATER) || cptr->Phase==PIG_WALK) currspeed/=1.4f;\r
+      \r
+   DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 260.f);\r
+\r
+   tgbend = drspd/2;\r
+   if (tgbend>pi/2) tgbend = pi/2;\r
+\r
+   tgbend*= SGN(currspeed);\r
+   if (fabs(tgbend) > fabs(cptr->bend)) DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 800.f);\r
+                                   else DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 400.f);\r
+\r
+   \r
+   rspd=cptr->rspeed * TimeDt / 1024.f;\r
+   if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;\r
+                      else cptr->alpha+=rspd;\r
+   \r
+\r
+   if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;\r
+   if (cptr->alpha < 0     ) cptr->alpha+= pi * 2;\r
+\r
+SKIPROT:   \r
+\r
+//========== movement ==============================//\r
+   cptr->lookx = (float)f_cos(cptr->alpha);\r
+   cptr->lookz = (float)f_sin(cptr->alpha);\r
+\r
+   float curspeed = 0;\r
+   if (cptr->Phase == PIG_RUN ) curspeed = 0.6f;   \r
+   if (cptr->Phase == PIG_WALK) curspeed = 0.2f;\r
+      \r
+   if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;\r
+\r
+//========== process speed =============//\r
+   curspeed*=cptr->scale;\r
+   DeltaFunc(cptr->vspeed, curspeed, TimeDt / 1024.f);    \r
+      \r
+   MoveCharacter(cptr, cptr->lookx * cptr->vspeed * TimeDt,\r
+                          cptr->lookz * cptr->vspeed * TimeDt, TRUE, TRUE);      \r
+\r
+   ThinkY_Beta_Gamma(cptr, 64, 32, 0.7f, 0.4f);         \r
+   if (cptr->Phase==PIG_WALK) cptr->tggamma+= cptr->rspeed / 12.0f;\r
+                         else cptr->tggamma+= cptr->rspeed / 8.0f;   \r
+   DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 2048.f);\r
+}\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+void AnimateBron(TCharacter *cptr)\r
+{\r
+   NewPhase = FALSE;\r
+   int _Phase = cptr->Phase;\r
+   int _FTime = cptr->FTime;\r
+   float _tgalpha = cptr->tgalpha;\r
+   if (cptr->AfraidTime) cptr->AfraidTime = max(0, cptr->AfraidTime - TimeDt);\r
+   if (cptr->State==2) { NewPhase=TRUE; cptr->State=1; }\r
+\r
+TBEGIN:\r
+   float targetx = cptr->tgx;\r
+   float targetz = cptr->tgz;\r
+   float targetdx = targetx - cptr->pos.x;\r
+   float targetdz = targetz - cptr->pos.z;\r
+\r
+   float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );       \r
+\r
+   //float playerdx = PlayerX - cptr->pos.x;\r
+   //float playerdz = PlayerZ - cptr->pos.z;\r
+\r
+   float playerdx = PlayerX - cptr->pos.x - cptr->lookx * 300 * cptr->scale;\r
+   float playerdz = PlayerZ - cptr->pos.z - cptr->lookz * 300 * cptr->scale;\r
+\r
+   float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );    \r
+   \r
+\r
+   //=========== run away =================//\r
+   \r
+   if (cptr->State) {    \r
+    if (pdist < 6000) cptr->AfraidTime = 8000;\r
+\r
+       if (!cptr->AfraidTime) {\r
+               cptr->State = 0; \r
+               SetNewTargetPlace(cptr, 8048.f);\r
+               goto TBEGIN; \r
+       }\r
+\r
+       if (pdist > 256*16+OptAgres/8) {\r
+         nv.x = playerdx; nv.z = playerdz; nv.y = 0;\r
+         NormVector(nv, 2048.f);\r
+      cptr->tgx = cptr->pos.x - nv.x;\r
+      cptr->tgz = cptr->pos.z - nv.z;\r
+         cptr->tgtime = 0;\r
+       } else {\r
+               cptr->tgx = PlayerX;\r
+        cptr->tgz = PlayerZ;                                   \r
+               cptr->tgtime = 0;\r
+       }\r
+   }\r
+\r
+   if (MyHealth)\r
+   if (pdist<300) \r
+        if (fabs(PlayerY - cptr->pos.y - 160) < 256) {                                                 \r
+          cptr->State = 0;                              \r
+          AddDeadBody(cptr, HUNT_EAT);    \r
+        }\r
+\r
+   //======== exploring area ===============//\r
+   if (!cptr->State) {\r
+        cptr->AfraidTime = 0;   \r
+        \r
+        if (tdist<456) {          \r
+       SetNewTargetPlace(cptr, 8048.f);\r
+          goto TBEGIN; }               \r
+   } \r
+   \r
+   \r
+//============================================//   \r
+   if (pdist<2048) cptr->NoFindCnt = 0;   \r
+   if (cptr->NoFindCnt) cptr->NoFindCnt--;\r
+   else {\r
+    cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);       \r
+    if (cptr->AfraidTime) \r
+      if (pdist>12*256) { \r
+               cptr->tgalpha += (float)f_sin(RealTime/1024.f) / 3.f;\r
+               if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;\r
+        if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;\r
+       }\r
+   }\r
+   \r
+\r
+   LookForAWay(cptr, TRUE, TRUE);\r
+   if (cptr->NoWayCnt>8) { cptr->NoWayCnt=0; cptr->NoFindCnt = 48 + rRand(80); }\r
+\r
+   if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;\r
+   if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;\r
+  \r
+//===============================================//\r
+\r
+   ProcessPrevPhase(cptr);   \r
+\r
+//======== select new phase =======================//\r
+   cptr->FTime+=TimeDt;\r
+   \r
+   if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {       \r
+       cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;\r
+       NewPhase = TRUE; }\r
+              \r
+   if (NewPhase) \r
+          if (!cptr->State) {\r
+                  if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) {\r
+                        if (rRand(128) > 64 && cptr->Phase == BRO_IDLE3) \r
+                             cptr->Phase = BRO_WALK;\r
+                        else cptr->Phase = BRO_IDLE1 + rRand(2);\r
+                        goto ENDPSELECT;\r
+                  }               \r
+                  if (rRand(128) > 124) cptr->Phase=BRO_IDLE1; else cptr->Phase=BRO_WALK; \r
+          } else\r
+          if (cptr->AfraidTime) cptr->Phase = BRO_RUN; \r
+                           else cptr->Phase = BRO_WALK;        \r
+      \r
+ENDPSELECT:\r
+\r
+//====== process phase changing ===========//\r
+   if ( (_Phase != cptr->Phase) || NewPhase)\r
+        ActivateCharacterFx(cptr);        \r
+   \r
+   if (_Phase != cptr->Phase) {         \r
+    if (_Phase<=1 && cptr->Phase<=1)\r
+        cptr->FTime = _FTime * cptr->pinfo->Animation[cptr->Phase].AniTime / cptr->pinfo->Animation[_Phase].AniTime + 64;\r
+    else if (!NewPhase) cptr->FTime = 0;\r
+\r
+    if (cptr->PPMorphTime>128) {\r
+     cptr->PrevPhase = _Phase;\r
+     cptr->PrevPFTime  = _FTime;\r
+     cptr->PPMorphTime = 0; }\r
+   }\r
+  \r
+   cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;   \r
+\r
+      \r
+   \r
+   //========== rotation to tgalpha ===================//\r
+   \r
+   float rspd, currspeed, tgbend;\r
+   float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);   \r
+   float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;\r
+\r
+\r
+   if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) goto SKIPROT;\r
+   if (drspd > 0.02)\r
+    if (cptr->tgalpha > cptr->alpha) currspeed = 0.2f + drspd*1.0f;\r
+                                else currspeed =-0.2f - drspd*1.0f;\r
+     else currspeed = 0;\r
+   \r
+   if (cptr->AfraidTime) currspeed*=1.5;\r
+   if (dalpha > pi) currspeed*=-1;\r
+   if ((cptr->State & csONWATER) || cptr->Phase==BRO_WALK) currspeed/=1.4f;\r
+      \r
+   DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 400.f);\r
+\r
+   tgbend = drspd/3.5f;\r
+   if (tgbend>pi/2.f) tgbend = pi/2.f;\r
+\r
+   tgbend*= SGN(currspeed);\r
+   if (fabs(tgbend) > fabs(cptr->bend)) DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1600.f);\r
+                                   else DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1200.f);\r
+\r
+   \r
+   rspd=cptr->rspeed * TimeDt / 612.f;\r
+   if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;\r
+                      else cptr->alpha+=rspd;\r
+   \r
+\r
+   if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;\r
+   if (cptr->alpha < 0     ) cptr->alpha+= pi * 2;\r
+\r
+SKIPROT:   \r
+\r
+//========== movement ==============================//\r
+   cptr->lookx = (float)f_cos(cptr->alpha);\r
+   cptr->lookz = (float)f_sin(cptr->alpha);\r
+\r
+   float curspeed = 0;\r
+   if (cptr->Phase == BRO_RUN ) curspeed = 0.768*2;   \r
+   if (cptr->Phase == BRO_WALK) curspeed = 0.168*2;   \r
+      \r
+   if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;\r
+\r
+//========== process speed =============//\r
+   curspeed*=cptr->scale;\r
+   if (curspeed>cptr->vspeed) DeltaFunc(cptr->vspeed, curspeed, TimeDt / 1024.f);    \r
+                         else DeltaFunc(cptr->vspeed, curspeed, TimeDt / 256.f);    \r
+      \r
+   MoveCharacter(cptr, cptr->lookx * cptr->vspeed * TimeDt,\r
+                          cptr->lookz * cptr->vspeed * TimeDt, TRUE, TRUE);      \r
+\r
+   ThinkY_Beta_Gamma(cptr, 128, 64, 0.6f, 0.3f);         \r
+   if (cptr->Phase==BRO_WALK) cptr->tggamma+= cptr->rspeed / 12.0f;\r
+                         else cptr->tggamma+= cptr->rspeed / 8.0f;   \r
+   DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 2048.f);\r
+}\r
+\r
+\r
+\r
+\r
+\r
+\r
+void AnimateBear(TCharacter *cptr)\r
+{\r
+   NewPhase = FALSE;\r
+   int _Phase = cptr->Phase;\r
+   int _FTime = cptr->FTime;\r
+   float _tgalpha = cptr->tgalpha;\r
+   if (cptr->AfraidTime) cptr->AfraidTime = max(0, cptr->AfraidTime - TimeDt);\r
+   if (cptr->State==2) { NewPhase=TRUE; cptr->State=1; }\r
+\r
+TBEGIN:\r
+   float targetx = cptr->tgx;\r
+   float targetz = cptr->tgz;\r
+   float targetdx = targetx - cptr->pos.x;\r
+   float targetdz = targetz - cptr->pos.z;\r
+\r
+   float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );       \r
+\r
+   //float playerdx = PlayerX - cptr->pos.x;\r
+   //float playerdz = PlayerZ - cptr->pos.z;\r
+\r
+   float playerdx = PlayerX - cptr->pos.x - cptr->lookx * 300 * cptr->scale;\r
+   float playerdz = PlayerZ - cptr->pos.z - cptr->lookz * 300 * cptr->scale;\r
+\r
+   float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );    \r
+   \r
+\r
+   //=========== run away =================//\r
+   \r
+   if (cptr->State) {\r
+    if (pdist < 6000) cptr->AfraidTime = 8000;\r
+\r
+       if (!cptr->AfraidTime) {\r
+               cptr->State = 0; \r
+               SetNewTargetPlace(cptr, 8048.f);\r
+               goto TBEGIN; \r
+       }\r
+\r
+       if (pdist > 256*20+OptAgres/8) {\r
+         nv.x = playerdx; nv.z = playerdz; nv.y = 0;\r
+         NormVector(nv, 2048.f);\r
+      cptr->tgx = cptr->pos.x - nv.x;\r
+      cptr->tgz = cptr->pos.z - nv.z;\r
+         cptr->tgtime = 0;\r
+       } else {\r
+               cptr->tgx = PlayerX;\r
+        cptr->tgz = PlayerZ;                                   \r
+               cptr->tgtime = 0;\r
+       }\r
+   }\r
+\r
+   if (MyHealth)\r
+   if (pdist<300) \r
+        if (fabs(PlayerY - cptr->pos.y - 160) < 256) {                                                 \r
+          cptr->State = 0;                              \r
+          AddDeadBody(cptr, HUNT_EAT);    \r
+        }\r
+\r
+   //======== exploring area ===============//\r
+   if (!cptr->State) {\r
+        cptr->AfraidTime = 0;   \r
+        \r
+        if (tdist<456) {          \r
+       SetNewTargetPlace(cptr, 8048.f);\r
+          goto TBEGIN; }               \r
+   } \r
+   \r
+   \r
+//============================================//   \r
+   if (pdist<2048) cptr->NoFindCnt = 0;\r
+   if (cptr->NoFindCnt) cptr->NoFindCnt--;\r
+   else {\r
+    cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);   \r
+    if (cptr->AfraidTime) { \r
+               cptr->tgalpha += (float)f_sin(RealTime/1024.f) / 3.f;\r
+               if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;\r
+        if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;\r
+       }\r
+   }\r
+   \r
+\r
+   LookForAWay(cptr, TRUE, TRUE);\r
+   if (cptr->NoWayCnt>8) { cptr->NoWayCnt=0; cptr->NoFindCnt = 48 + rRand(80); }\r
+\r
+   if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;\r
+   if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;\r
+  \r
+//===============================================//\r
+\r
+   ProcessPrevPhase(cptr);   \r
+\r
+//======== select new phase =======================//\r
+   cptr->FTime+=TimeDt;\r
+   \r
+   if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {       \r
+       cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;\r
+       NewPhase = TRUE; }\r
+              \r
+   if (NewPhase) \r
+          if (!cptr->State) {\r
+                  if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) {\r
+                        if (rRand(128) > 64 && cptr->Phase == BRO_IDLE3) \r
+                             cptr->Phase = BRO_WALK;\r
+                        else cptr->Phase = BRO_IDLE1 + rRand(2);\r
+                        goto ENDPSELECT;\r
+                  }               \r
+                  if (rRand(128) > 124) cptr->Phase=BRO_IDLE1; else cptr->Phase=BRO_WALK; \r
+          } else\r
+          if (cptr->AfraidTime) cptr->Phase = BRO_RUN; \r
+                           else cptr->Phase = BRO_WALK;        \r
+      \r
+ENDPSELECT:\r
+\r
+//====== process phase changing ===========//\r
+   if ( (_Phase != cptr->Phase) || NewPhase)\r
+        ActivateCharacterFx(cptr);        \r
+   \r
+   if (_Phase != cptr->Phase) {         \r
+    if (_Phase<=1 && cptr->Phase<=1)\r
+        cptr->FTime = _FTime * cptr->pinfo->Animation[cptr->Phase].AniTime / cptr->pinfo->Animation[_Phase].AniTime + 64;\r
+    else if (!NewPhase) cptr->FTime = 0;\r
+\r
+    if (cptr->PPMorphTime>128) {\r
+     cptr->PrevPhase = _Phase;\r
+     cptr->PrevPFTime  = _FTime;\r
+     cptr->PPMorphTime = 0; }\r
+   }\r
+  \r
+   cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;   \r
+\r
+      \r
+   \r
+   //========== rotation to tgalpha ===================//\r
+   \r
+   float rspd, currspeed, tgbend;\r
+   float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);   \r
+   float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;\r
+\r
+\r
+   if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) goto SKIPROT;\r
+   if (drspd > 0.02)\r
+    if (cptr->tgalpha > cptr->alpha) currspeed = 0.2f + drspd*1.0f;\r
+                                else currspeed =-0.2f - drspd*1.0f;\r
+     else currspeed = 0;\r
+   \r
+   if (cptr->AfraidTime) currspeed*=1.5;\r
+   if (dalpha > pi) currspeed*=-1;\r
+   if ((cptr->State & csONWATER) || cptr->Phase==BRO_WALK) currspeed/=1.4f;\r
+      \r
+   DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 400.f);\r
+\r
+   tgbend = drspd/3.5f;\r
+   if (tgbend>pi/2.f) tgbend = pi/2.f;\r
+\r
+   tgbend*= SGN(currspeed);\r
+   if (fabs(tgbend) > fabs(cptr->bend)) DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1600.f);\r
+                                   else DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1200.f);\r
+\r
+   \r
+   rspd=cptr->rspeed * TimeDt / 612.f;\r
+   if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;\r
+                      else cptr->alpha+=rspd;\r
+   \r
+\r
+   if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;\r
+   if (cptr->alpha < 0     ) cptr->alpha+= pi * 2;\r
+\r
+SKIPROT:   \r
+\r
+//========== movement ==============================//\r
+   cptr->lookx = (float)f_cos(cptr->alpha);\r
+   cptr->lookz = (float)f_sin(cptr->alpha);\r
+\r
+   float curspeed = 0;\r
+   if (cptr->Phase == BRO_RUN ) curspeed = 0.896*2;   \r
+   if (cptr->Phase == BRO_WALK) curspeed = 0.240*2;   \r
+      \r
+   if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;\r
+\r
+//========== process speed =============//\r
+   curspeed*=cptr->scale;\r
+   if (curspeed>cptr->vspeed) DeltaFunc(cptr->vspeed, curspeed, TimeDt / 1024.f);    \r
+                         else DeltaFunc(cptr->vspeed, curspeed, TimeDt / 256.f);    \r
+      \r
+   MoveCharacter(cptr, cptr->lookx * cptr->vspeed * TimeDt,\r
+                          cptr->lookz * cptr->vspeed * TimeDt, TRUE, TRUE);      \r
+\r
+   ThinkY_Beta_Gamma(cptr, 128, 64, 0.6f, 0.3f);         \r
+   if (cptr->Phase==BRO_WALK) cptr->tggamma+= cptr->rspeed / 12.0f;\r
+                         else cptr->tggamma+= cptr->rspeed / 8.0f;   \r
+   DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 2048.f);\r
+}\r
+\r
+\r
+\r
+\r
+void AnimateWolf(TCharacter *cptr)\r
+{\r
+   NewPhase = FALSE;\r
+   int _Phase = cptr->Phase;\r
+   int _FTime = cptr->FTime;\r
+   float _tgalpha = cptr->tgalpha;\r
+   if (cptr->AfraidTime) cptr->AfraidTime = max(0, cptr->AfraidTime - TimeDt);\r
+   if (cptr->State==2) { NewPhase=TRUE; cptr->State=1; }\r
+\r
+TBEGIN:\r
+   float targetx = cptr->tgx;\r
+   float targetz = cptr->tgz;\r
+   float targetdx = targetx - cptr->pos.x;\r
+   float targetdz = targetz - cptr->pos.z;\r
+\r
+   float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );       \r
+\r
+   //float playerdx = PlayerX - cptr->pos.x;\r
+   //float playerdz = PlayerZ - cptr->pos.z;\r
+\r
+   float playerdx = PlayerX - cptr->pos.x - cptr->lookx * 300 * cptr->scale;\r
+   float playerdz = PlayerZ - cptr->pos.z - cptr->lookz * 300 * cptr->scale;\r
+\r
+   float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );    \r
+   \r
+\r
+   //=========== run away =================//\r
+   \r
+   if (!MyHealth) cptr->State = 0;\r
+   if (cptr->State) {                          \r
+          if (pdist > ctViewR*140+OptAgres/8) {\r
+                       nv.x = playerdx; nv.z = playerdz; nv.y = 0;\r
+               NormVector(nv, 2048.f);\r
+            cptr->tgx = cptr->pos.x - nv.x;\r
+            cptr->tgz = cptr->pos.z - nv.z;\r
+                       cptr->tgtime = 0;\r
+                       cptr->AfraidTime-=TimeDt;\r
+                       if (cptr->AfraidTime<=0) {\r
+                        cptr->AfraidTime=0; cptr->State = 0;                    \r
+                       }                       \r
+          } else {\r
+            cptr->tgx = PlayerX;\r
+            cptr->tgz = PlayerZ;                       \r
+                       cptr->tgtime = 0;\r
+          }\r
+   }\r
+\r
+\r
+   if (MyHealth)\r
+   if (pdist<300) \r
+        if (fabs(PlayerY - cptr->pos.y - 160) < 256) {                                                 \r
+          cptr->State = 0;                              \r
+          AddDeadBody(cptr, HUNT_EAT);    \r
+        }\r
+\r
+   //======== exploring area ===============//\r
+   if (!cptr->State) {\r
+        cptr->AfraidTime = 0;\r
+        if (tdist<456) {          \r
+       SetNewTargetPlace(cptr, 8048.f);\r
+          goto TBEGIN; }               \r
+   }\r
+   \r
+   \r
+//============================================//   \r
+   if (pdist<2048) cptr->NoFindCnt = 0;\r
+   if (cptr->NoFindCnt) cptr->NoFindCnt--;\r
+   else {\r
+    cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);   \r
+    if (cptr->AfraidTime) \r
+      if (pdist>12*256) { \r
+               cptr->tgalpha += (float)f_sin(RealTime/1024.f) / 3.f;\r
+               if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;\r
+        if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;\r
+       }\r
+   }\r
+   \r
+\r
+   LookForAWay(cptr, TRUE, TRUE);\r
+   if (cptr->NoWayCnt>8) { cptr->NoWayCnt=0; cptr->NoFindCnt = 48 + rRand(80); }\r
+\r
+   if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;\r
+   if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;\r
+  \r
+//===============================================//\r
+\r
+   ProcessPrevPhase(cptr);   \r
+\r
+//======== select new phase =======================//\r
+   cptr->FTime+=TimeDt;\r
+   \r
+   if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {       \r
+       cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;\r
+       NewPhase = TRUE; }\r
+              \r
+   if (NewPhase) \r
+          if (!cptr->State) {\r
+                  if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) {\r
+                        if (rRand(128) > 64) \r
+                             cptr->Phase = BRO_WALK;\r
+                        else \r
+                  cptr->Phase = BRO_IDLE1 + rRand(2);\r
+                        goto ENDPSELECT;\r
+                  }               \r
+                  if (rRand(128) > 124) cptr->Phase=BRO_IDLE1 + rRand(2); else cptr->Phase=BRO_WALK; \r
+          } else\r
+          if (cptr->AfraidTime) cptr->Phase = BRO_RUN; \r
+                           else cptr->Phase = BRO_WALK;        \r
+      \r
+ENDPSELECT:\r
+\r
+//====== process phase changing ===========//\r
+   if ( (_Phase != cptr->Phase) || NewPhase)\r
+        ActivateCharacterFx(cptr);        \r
+   \r
+   if (_Phase != cptr->Phase) {         \r
+    if (_Phase<=1 && cptr->Phase<=1)\r
+        cptr->FTime = _FTime * cptr->pinfo->Animation[cptr->Phase].AniTime / cptr->pinfo->Animation[_Phase].AniTime + 64;\r
+    else if (!NewPhase) cptr->FTime = 0;\r
+\r
+    if (cptr->PPMorphTime>128) {\r
+     cptr->PrevPhase = _Phase;\r
+     cptr->PrevPFTime  = _FTime;\r
+     cptr->PPMorphTime = 0; }\r
+   }\r
+  \r
+   cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;   \r
+\r
+      \r
+   \r
+   //========== rotation to tgalpha ===================//\r
+   \r
+   float rspd, currspeed, tgbend;\r
+   float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);   \r
+   float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;\r
+\r
+\r
+   if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) goto SKIPROT;\r
+   if (drspd > 0.02)\r
+    if (cptr->tgalpha > cptr->alpha) currspeed = 0.4f + drspd*1.5f;\r
+                                else currspeed =-0.4f - drspd*1.5f;\r
+     else currspeed = 0;\r
+   \r
+   if (cptr->AfraidTime) currspeed*=1.5;\r
+   if (dalpha > pi) currspeed*=-1;\r
+   if ((cptr->State & csONWATER) || cptr->Phase==BRO_WALK) currspeed/=1.4f;\r
+      \r
+   DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 400.f);\r
+\r
+   tgbend = drspd/3.5f;\r
+   if (tgbend>pi/2.f) tgbend = pi/2.f;\r
+\r
+   tgbend*= SGN(currspeed);\r
+   if (fabs(tgbend) > fabs(cptr->bend)) DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1600.f);\r
+                                   else DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1200.f);\r
+\r
+   \r
+   rspd=cptr->rspeed * TimeDt / 612.f;\r
+   if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;\r
+                      else cptr->alpha+=rspd;\r
+   \r
+\r
+   if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;\r
+   if (cptr->alpha < 0     ) cptr->alpha+= pi * 2;\r
+\r
+SKIPROT:   \r
+\r
+//========== movement ==============================//\r
+   cptr->lookx = (float)f_cos(cptr->alpha);\r
+   cptr->lookz = (float)f_sin(cptr->alpha);\r
+\r
+   float curspeed = 0;\r
+   if (cptr->Phase == BRO_RUN ) curspeed = 1.024*2;   \r
+   if (cptr->Phase == BRO_WALK) curspeed = 0.160*2;   \r
+      \r
+   if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;\r
+\r
+//========== process speed =============//\r
+   curspeed*=cptr->scale;\r
+   if (curspeed>cptr->vspeed) DeltaFunc(cptr->vspeed, curspeed, TimeDt / 1024.f);    \r
+                         else DeltaFunc(cptr->vspeed, curspeed, TimeDt / 256.f);    \r
+      \r
+   MoveCharacter(cptr, cptr->lookx * cptr->vspeed * TimeDt,\r
+                          cptr->lookz * cptr->vspeed * TimeDt, TRUE, TRUE);      \r
+\r
+   ThinkY_Beta_Gamma(cptr, 128, 64, 0.6f, 0.3f);         \r
+   if (cptr->Phase==BRO_WALK) cptr->tggamma+= cptr->rspeed / 12.0f;\r
+                         else cptr->tggamma+= cptr->rspeed / 8.0f;   \r
+   DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 2048.f);\r
+}\r
+\r
+\r
+\r
+\r
+void AnimateHog(TCharacter *cptr)\r
+{\r
+   NewPhase = FALSE;\r
+   int _Phase = cptr->Phase;\r
+   int _FTime = cptr->FTime;\r
+   float _tgalpha = cptr->tgalpha;\r
+   if (cptr->AfraidTime) cptr->AfraidTime = max(0, cptr->AfraidTime - TimeDt);\r
+   if (cptr->State==2) { NewPhase=TRUE; cptr->State=1; }\r
+\r
+TBEGIN:\r
+   float targetx = cptr->tgx;\r
+   float targetz = cptr->tgz;\r
+   float targetdx = targetx - cptr->pos.x;\r
+   float targetdz = targetz - cptr->pos.z;\r
+\r
+   float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );       \r
+\r
+   //float playerdx = PlayerX - cptr->pos.x;\r
+   //float playerdz = PlayerZ - cptr->pos.z;\r
+\r
+   float playerdx = PlayerX - cptr->pos.x - cptr->lookx * 300 * cptr->scale;\r
+   float playerdz = PlayerZ - cptr->pos.z - cptr->lookz * 300 * cptr->scale;\r
+\r
+   float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );    \r
+   \r
+\r
+   //=========== run away =================//\r
+   \r
+   if (cptr->State) {    \r
+    if (pdist < 6000) cptr->AfraidTime = 8000;\r
+\r
+       if (!cptr->AfraidTime) {\r
+               cptr->State = 0; \r
+               SetNewTargetPlace(cptr, 8048.f);\r
+               goto TBEGIN; \r
+       }\r
+\r
+       if (pdist > 256*20+OptAgres/8) {\r
+         nv.x = playerdx; nv.z = playerdz; nv.y = 0;\r
+         NormVector(nv, 2048.f);\r
+      cptr->tgx = cptr->pos.x - nv.x;\r
+      cptr->tgz = cptr->pos.z - nv.z;\r
+         cptr->tgtime = 0;\r
+       } else {\r
+               cptr->tgx = PlayerX;\r
+        cptr->tgz = PlayerZ;                                   \r
+               cptr->tgtime = 0;\r
+       }\r
+   }\r
+\r
+   if (MyHealth)\r
+   if (pdist<300) \r
+        if (fabs(PlayerY - cptr->pos.y - 160) < 256) {                                                 \r
+          cptr->State = 0;                              \r
+          AddDeadBody(cptr, HUNT_EAT);    \r
+        }\r
+\r
+   //======== exploring area ===============//\r
+   if (!cptr->State) {\r
+        cptr->AfraidTime = 0;   \r
+        \r
+        if (tdist<456) {          \r
+       SetNewTargetPlace(cptr, 8048.f);\r
+          goto TBEGIN; }               \r
+   } \r
+   \r
+   \r
+//============================================//   \r
+   if (pdist<2048) cptr->NoFindCnt = 0;\r
+   if (cptr->NoFindCnt) cptr->NoFindCnt--;\r
+   else {\r
+    cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);   \r
+    if (cptr->AfraidTime) \r
+      if (pdist>12*256) { \r
+               cptr->tgalpha += (float)f_sin(RealTime/1024.f) / 3.f;\r
+               if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;\r
+        if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;\r
+       }\r
+   }\r
+   \r
+\r
+   LookForAWay(cptr, TRUE, TRUE);\r
+   if (cptr->NoWayCnt>8) { cptr->NoWayCnt=0; cptr->NoFindCnt = 48 + rRand(80); }\r
+\r
+   if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;\r
+   if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;\r
+  \r
+//===============================================//\r
+\r
+   ProcessPrevPhase(cptr);   \r
+\r
+//======== select new phase =======================//\r
+   cptr->FTime+=TimeDt;\r
+   \r
+   if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {       \r
+       cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;\r
+       NewPhase = TRUE; }\r
+              \r
+   if (NewPhase) \r
+          if (!cptr->State) {\r
+                  if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) {\r
+                        if (rRand(128) > 64 && cptr->Phase == BRO_IDLE3) \r
+                             cptr->Phase = BRO_WALK;\r
+                        else cptr->Phase = BRO_IDLE1 + rRand(2);\r
+                        goto ENDPSELECT;\r
+                  }               \r
+                  if (rRand(128) > 124) cptr->Phase=BRO_IDLE1; else cptr->Phase=BRO_WALK; \r
+          } else\r
+          if (cptr->AfraidTime) cptr->Phase = BRO_RUN; \r
+                           else cptr->Phase = BRO_WALK;        \r
+      \r
+ENDPSELECT:\r
+\r
+//====== process phase changing ===========//\r
+   if ( (_Phase != cptr->Phase) || NewPhase)\r
+        ActivateCharacterFx(cptr);        \r
+   \r
+   if (_Phase != cptr->Phase) {         \r
+    if (_Phase<=1 && cptr->Phase<=1)\r
+        cptr->FTime = _FTime * cptr->pinfo->Animation[cptr->Phase].AniTime / cptr->pinfo->Animation[_Phase].AniTime + 64;\r
+    else if (!NewPhase) cptr->FTime = 0;\r
+\r
+    if (cptr->PPMorphTime>128) {\r
+     cptr->PrevPhase = _Phase;\r
+     cptr->PrevPFTime  = _FTime;\r
+     cptr->PPMorphTime = 0; }\r
+   }\r
+  \r
+   cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;   \r
+\r
+      \r
+   \r
+   //========== rotation to tgalpha ===================//\r
+   \r
+   float rspd, currspeed, tgbend;\r
+   float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);   \r
+   float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;\r
+\r
+\r
+   if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) goto SKIPROT;\r
+   if (drspd > 0.02)\r
+    if (cptr->tgalpha > cptr->alpha) currspeed = 0.3f + drspd*1.4f;\r
+                                else currspeed =-0.3f - drspd*1.4f;\r
+     else currspeed = 0;\r
+   \r
+   if (cptr->AfraidTime) currspeed*=1.5;\r
+   if (dalpha > pi) currspeed*=-1;\r
+   if ((cptr->State & csONWATER) || cptr->Phase==BRO_WALK) currspeed/=1.4f;\r
+      \r
+   DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 400.f);\r
+\r
+   tgbend = drspd/3.5f;\r
+   if (tgbend>pi/2.f) tgbend = pi/2.f;\r
+\r
+   tgbend*= SGN(currspeed);\r
+   if (fabs(tgbend) > fabs(cptr->bend)) DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1600.f);\r
+                                   else DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1200.f);\r
+\r
+   \r
+   rspd=cptr->rspeed * TimeDt / 612.f;\r
+   if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;\r
+                      else cptr->alpha+=rspd;\r
+   \r
+\r
+   if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;\r
+   if (cptr->alpha < 0     ) cptr->alpha+= pi * 2;\r
+\r
+SKIPROT:   \r
+\r
+//========== movement ==============================//\r
+   cptr->lookx = (float)f_cos(cptr->alpha);\r
+   cptr->lookz = (float)f_sin(cptr->alpha);\r
+\r
+   float curspeed = 0;\r
+   if (cptr->Phase == BRO_RUN ) curspeed = 0.576*2;   \r
+   if (cptr->Phase == BRO_WALK) curspeed = 0.112*2;   \r
+      \r
+   if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;\r
+\r
+//========== process speed =============//\r
+   curspeed*=cptr->scale;\r
+   if (curspeed>cptr->vspeed) DeltaFunc(cptr->vspeed, curspeed, TimeDt / 1024.f);    \r
+                         else DeltaFunc(cptr->vspeed, curspeed, TimeDt / 256.f);    \r
+      \r
+   MoveCharacter(cptr, cptr->lookx * cptr->vspeed * TimeDt,\r
+                          cptr->lookz * cptr->vspeed * TimeDt, TRUE, TRUE);      \r
+\r
+   ThinkY_Beta_Gamma(cptr, 128, 64, 0.6f, 0.3f);         \r
+   if (cptr->Phase==BRO_WALK) cptr->tggamma+= cptr->rspeed / 12.0f;\r
+                         else cptr->tggamma+= cptr->rspeed / 8.0f;   \r
+   DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 2048.f);\r
+}\r
+\r
+\r
+\r
+\r
+void AnimateRhino(TCharacter *cptr)\r
+{\r
+   NewPhase = FALSE;\r
+   int _Phase = cptr->Phase;\r
+   int _FTime = cptr->FTime;\r
+   float _tgalpha = cptr->tgalpha;\r
+   if (cptr->AfraidTime) cptr->AfraidTime = max(0, cptr->AfraidTime - TimeDt);\r
+   if (cptr->State==2) { NewPhase=TRUE; cptr->State=1; }\r
+\r
+TBEGIN:\r
+   float targetx = cptr->tgx;\r
+   float targetz = cptr->tgz;\r
+   float targetdx = targetx - cptr->pos.x;\r
+   float targetdz = targetz - cptr->pos.z;\r
+\r
+   float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );       \r
+\r
+   //float playerdx = PlayerX - cptr->pos.x;\r
+   //float playerdz = PlayerZ - cptr->pos.z;\r
+\r
+   float playerdx = PlayerX - cptr->pos.x - cptr->lookx * 300 * cptr->scale;\r
+   float playerdz = PlayerZ - cptr->pos.z - cptr->lookz * 300 * cptr->scale;\r
+\r
+   float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );    \r
+   \r
+\r
+   //=========== run away =================//\r
+   \r
+   if (cptr->State) {    \r
+    if (pdist < 6000) cptr->AfraidTime = 8000;\r
+\r
+       if (!cptr->AfraidTime) {\r
+               cptr->State = 0; \r
+               SetNewTargetPlace(cptr, 8048.f);\r
+               goto TBEGIN; \r
+       }\r
+\r
+       if (pdist > 256*18+OptAgres/8) {\r
+         nv.x = playerdx; nv.z = playerdz; nv.y = 0;\r
+         NormVector(nv, 2048.f);\r
+      cptr->tgx = cptr->pos.x - nv.x;\r
+      cptr->tgz = cptr->pos.z - nv.z;\r
+         cptr->tgtime = 0;\r
+       } else {\r
+               cptr->tgx = PlayerX;\r
+        cptr->tgz = PlayerZ;                                   \r
+               cptr->tgtime = 0;\r
+       }\r
+   }\r
+\r
+   if (MyHealth)\r
+   if (pdist<300) \r
+        if (fabs(PlayerY - cptr->pos.y - 160) < 256) {                                                 \r
+          cptr->State = 0;                              \r
+          AddDeadBody(cptr, HUNT_EAT);    \r
+        }\r
+\r
+   //======== exploring area ===============//\r
+   if (!cptr->State) {\r
+        cptr->AfraidTime = 0;   \r
+        \r
+        if (tdist<456) {          \r
+       SetNewTargetPlace(cptr, 8048.f);\r
+          goto TBEGIN; }               \r
+   } \r
+   \r
+   \r
+//============================================//   \r
+   if (pdist<2048) cptr->NoFindCnt = 0;\r
+   if (cptr->NoFindCnt) cptr->NoFindCnt--;\r
+   else {\r
+    cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);   \r
+    if (cptr->AfraidTime) \r
+       if (pdist>12*256) { \r
+               cptr->tgalpha += (float)f_sin(RealTime/1024.f) / 3.f;\r
+               if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;\r
+        if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;\r
+       }\r
+   }\r
+   \r
+\r
+   LookForAWay(cptr, TRUE, TRUE);\r
+   if (cptr->NoWayCnt>8) { cptr->NoWayCnt=0; cptr->NoFindCnt = 48 + rRand(80); }\r
+\r
+   if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;\r
+   if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;\r
+  \r
+//===============================================//\r
+\r
+   ProcessPrevPhase(cptr);   \r
+\r
+//======== select new phase =======================//\r
+   cptr->FTime+=TimeDt;\r
+   \r
+   if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {       \r
+       cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;\r
+       NewPhase = TRUE; }\r
+              \r
+   if (NewPhase) \r
+          if (!cptr->State) {\r
+                  if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) {\r
+                        if (rRand(128) > 64 && cptr->Phase == BRO_IDLE3) \r
+                             cptr->Phase = BRO_WALK;\r
+                        else cptr->Phase = BRO_IDLE1 + rRand(2);\r
+                        goto ENDPSELECT;\r
+                  }               \r
+                  if (rRand(128) > 124) cptr->Phase=BRO_IDLE1; else cptr->Phase=BRO_WALK; \r
+          } else\r
+          if (cptr->AfraidTime) cptr->Phase = BRO_RUN; \r
+                           else cptr->Phase = BRO_WALK;        \r
+      \r
+ENDPSELECT:\r
+\r
+//====== process phase changing ===========//\r
+   if ( (_Phase != cptr->Phase) || NewPhase)\r
+        ActivateCharacterFx(cptr);        \r
+   \r
+   if (_Phase != cptr->Phase) {         \r
+    if (_Phase<=1 && cptr->Phase<=1)\r
+        cptr->FTime = _FTime * cptr->pinfo->Animation[cptr->Phase].AniTime / cptr->pinfo->Animation[_Phase].AniTime + 64;\r
+    else if (!NewPhase) cptr->FTime = 0;\r
+\r
+    if (cptr->PPMorphTime>128) {\r
+     cptr->PrevPhase = _Phase;\r
+     cptr->PrevPFTime  = _FTime;\r
+     cptr->PPMorphTime = 0; }\r
+   }\r
+  \r
+   cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;   \r
+\r
+      \r
+   \r
+   //========== rotation to tgalpha ===================//\r
+   \r
+   float rspd, currspeed, tgbend;\r
+   float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);   \r
+   float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;\r
+\r
+\r
+   if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) goto SKIPROT;\r
+   if (drspd > 0.02)\r
+    if (cptr->tgalpha > cptr->alpha) currspeed = 0.3f + drspd*1.2f;\r
+                                else currspeed =-0.3f - drspd*1.2f;\r
+     else currspeed = 0;\r
+   \r
+   if (cptr->AfraidTime) currspeed*=1.5;\r
+   if (dalpha > pi) currspeed*=-1;\r
+   if ((cptr->State & csONWATER) || cptr->Phase==BRO_WALK) currspeed/=1.4f;\r
+      \r
+   DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 400.f);\r
+\r
+   tgbend = drspd/3.5f;\r
+   if (tgbend>pi/2.f) tgbend = pi/2.f;\r
+\r
+   tgbend*= SGN(currspeed);\r
+   if (fabs(tgbend) > fabs(cptr->bend)) DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1600.f);\r
+                                   else DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1200.f);\r
+\r
+   \r
+   rspd=cptr->rspeed * TimeDt / 612.f;\r
+   if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;\r
+                      else cptr->alpha+=rspd;\r
+   \r
+\r
+   if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;\r
+   if (cptr->alpha < 0     ) cptr->alpha+= pi * 2;\r
+\r
+SKIPROT:   \r
+\r
+//========== movement ==============================//\r
+   cptr->lookx = (float)f_cos(cptr->alpha);\r
+   cptr->lookz = (float)f_sin(cptr->alpha);\r
+\r
+   float curspeed = 0;\r
+   if (cptr->Phase == BRO_RUN ) curspeed = 0.576*2;   \r
+   if (cptr->Phase == BRO_WALK) curspeed = 0.168*2;   \r
+      \r
+   if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;\r
+\r
+//========== process speed =============//\r
+   curspeed*=cptr->scale;\r
+   if (curspeed>cptr->vspeed) DeltaFunc(cptr->vspeed, curspeed, TimeDt / 1024.f);    \r
+                         else DeltaFunc(cptr->vspeed, curspeed, TimeDt / 256.f);    \r
+      \r
+   MoveCharacter(cptr, cptr->lookx * cptr->vspeed * TimeDt,\r
+                          cptr->lookz * cptr->vspeed * TimeDt, TRUE, TRUE);      \r
+\r
+   ThinkY_Beta_Gamma(cptr, 128, 64, 0.6f, 0.3f);         \r
+   if (cptr->Phase==BRO_WALK) cptr->tggamma+= cptr->rspeed / 12.0f;\r
+                         else cptr->tggamma+= cptr->rspeed / 8.0f;   \r
+   DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 2048.f);\r
+}\r
+\r
+\r
+\r
+\r
+\r
+void AnimateSmilo(TCharacter *cptr)\r
+{\r
+   NewPhase = FALSE;\r
+   int _Phase = cptr->Phase;\r
+   int _FTime = cptr->FTime;\r
+   float _tgalpha = cptr->tgalpha;\r
+   if (cptr->AfraidTime) cptr->AfraidTime = max(0, cptr->AfraidTime - TimeDt);\r
+   if (cptr->State==2) { NewPhase=TRUE; cptr->State=1; }\r
+\r
+TBEGIN:\r
+   float targetx = cptr->tgx;\r
+   float targetz = cptr->tgz;\r
+   float targetdx = targetx - cptr->pos.x;\r
+   float targetdz = targetz - cptr->pos.z;\r
+\r
+   float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );       \r
+\r
+   //float playerdx = PlayerX - cptr->pos.x;\r
+   //float playerdz = PlayerZ - cptr->pos.z;\r
+\r
+   float playerdx = PlayerX - cptr->pos.x - cptr->lookx * 300 * cptr->scale;\r
+   float playerdz = PlayerZ - cptr->pos.z - cptr->lookz * 300 * cptr->scale;\r
+\r
+   float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );    \r
+   \r
+\r
+   //=========== run away =================//\r
+   \r
+   if (cptr->State) {    \r
+    if (pdist < 6000) cptr->AfraidTime = 8000;\r
+\r
+       if (!cptr->AfraidTime) {\r
+               cptr->State = 0; \r
+               SetNewTargetPlace(cptr, 8048.f);\r
+               goto TBEGIN; \r
+       }\r
+\r
+       if (pdist > 256*16+OptAgres/8) {\r
+         nv.x = playerdx; nv.z = playerdz; nv.y = 0;\r
+         NormVector(nv, 2048.f);\r
+      cptr->tgx = cptr->pos.x - nv.x;\r
+      cptr->tgz = cptr->pos.z - nv.z;\r
+         cptr->tgtime = 0;\r
+       } else {\r
+               cptr->tgx = PlayerX;\r
+        cptr->tgz = PlayerZ;                                   \r
+               cptr->tgtime = 0;\r
+       }\r
+   }\r
+\r
+   if (MyHealth)\r
+   if (pdist<300) \r
+        if (fabs(PlayerY - cptr->pos.y - 160) < 256) {                                                 \r
+          cptr->State = 0;                              \r
+          AddDeadBody(cptr, HUNT_EAT);    \r
+        }\r
+\r
+   //======== exploring area ===============//\r
+   if (!cptr->State) {\r
+        cptr->AfraidTime = 0;   \r
+        \r
+        if (tdist<456) {          \r
+       SetNewTargetPlace(cptr, 8048.f);\r
+          goto TBEGIN; }               \r
+   } \r
+   \r
+   \r
+//============================================//   \r
+   if (pdist<2048) cptr->NoFindCnt = 0;   \r
+   if (cptr->NoFindCnt) cptr->NoFindCnt--;\r
+   else {\r
+    cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);   \r
+    if (cptr->AfraidTime) \r
+       if (pdist>12*256) { \r
+               cptr->tgalpha += (float)f_sin(RealTime/1024.f) / 3.f;\r
+               if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;\r
+        if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;\r
+       }\r
+   }\r
+   \r
+\r
+   LookForAWay(cptr, TRUE, TRUE);\r
+   if (cptr->NoWayCnt>8) { cptr->NoWayCnt=0; cptr->NoFindCnt = 48 + rRand(80); }\r
+\r
+   if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;\r
+   if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;\r
+  \r
+//===============================================//\r
+\r
+   ProcessPrevPhase(cptr);   \r
+\r
+//======== select new phase =======================//\r
+   cptr->FTime+=TimeDt;\r
+   \r
+   if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {       \r
+       cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;\r
+       NewPhase = TRUE; }\r
+              \r
+   if (NewPhase) \r
+          if (!cptr->State) {\r
+                  if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) {\r
+                        cptr->Phase = BRO_WALK;\r
+                        goto ENDPSELECT;\r
+                  }\r
+                  if (rRand(128) > 124) cptr->Phase=BRO_IDLE1 + rRand(2); else cptr->Phase=BRO_WALK; \r
+          } else\r
+          if (cptr->AfraidTime) cptr->Phase = BRO_RUN; \r
+                           else cptr->Phase = BRO_WALK;        \r
+      \r
+ENDPSELECT:\r
+\r
+//====== process phase changing ===========//\r
+   if ( (_Phase != cptr->Phase) || NewPhase)\r
+        ActivateCharacterFx(cptr);        \r
+   \r
+   if (_Phase != cptr->Phase) {         \r
+    if (_Phase<=1 && cptr->Phase<=1)\r
+        cptr->FTime = _FTime * cptr->pinfo->Animation[cptr->Phase].AniTime / cptr->pinfo->Animation[_Phase].AniTime + 64;\r
+    else if (!NewPhase) cptr->FTime = 0;\r
+\r
+    if (cptr->PPMorphTime>128) {\r
+     cptr->PrevPhase = _Phase;\r
+     cptr->PrevPFTime  = _FTime;\r
+     cptr->PPMorphTime = 0; }\r
+   }\r
+  \r
+   cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;   \r
+\r
+      \r
+   \r
+   //========== rotation to tgalpha ===================//\r
+   \r
+   float rspd, currspeed, tgbend;\r
+   float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);   \r
+   float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;\r
+\r
+\r
+   if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) goto SKIPROT;\r
+   if (drspd > 0.02)\r
+    if (cptr->tgalpha > cptr->alpha) currspeed = 0.3f + drspd*1.5f;\r
+                                else currspeed =-0.3f - drspd*1.5f;\r
+     else currspeed = 0;\r
+   \r
+   if (cptr->AfraidTime) currspeed*=1.5;\r
+   if (dalpha > pi) currspeed*=-1;\r
+   if ((cptr->State & csONWATER) || cptr->Phase==BRO_WALK) currspeed/=1.4f;\r
+      \r
+   DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 400.f);\r
+\r
+   tgbend = drspd/3.5f;\r
+   if (tgbend>pi/2.f) tgbend = pi/2.f;\r
+\r
+   tgbend*= SGN(currspeed);\r
+   if (fabs(tgbend) > fabs(cptr->bend)) DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1600.f);\r
+                                   else DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1200.f);\r
+\r
+   \r
+   rspd=cptr->rspeed * TimeDt / 612.f;\r
+   if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;\r
+                      else cptr->alpha+=rspd;\r
+   \r
+\r
+   if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;\r
+   if (cptr->alpha < 0     ) cptr->alpha+= pi * 2;\r
+\r
+SKIPROT:   \r
+\r
+//========== movement ==============================//\r
+   cptr->lookx = (float)f_cos(cptr->alpha);\r
+   cptr->lookz = (float)f_sin(cptr->alpha);\r
+\r
+   float curspeed = 0;\r
+   if (cptr->Phase == BRO_RUN ) curspeed = 1.024*2;   \r
+   if (cptr->Phase == BRO_WALK) curspeed = 0.320*2;   \r
+      \r
+   if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;\r
+\r
+//========== process speed =============//\r
+   curspeed*=cptr->scale;\r
+   if (curspeed>cptr->vspeed) DeltaFunc(cptr->vspeed, curspeed, TimeDt / 1024.f);    \r
+                         else DeltaFunc(cptr->vspeed, curspeed, TimeDt / 256.f);    \r
+      \r
+   MoveCharacter(cptr, cptr->lookx * cptr->vspeed * TimeDt,\r
+                          cptr->lookz * cptr->vspeed * TimeDt, TRUE, TRUE);      \r
+\r
+   ThinkY_Beta_Gamma(cptr, 128, 64, 0.6f, 0.3f);         \r
+   if (cptr->Phase==BRO_WALK) cptr->tggamma+= cptr->rspeed / 12.0f;\r
+                         else cptr->tggamma+= cptr->rspeed / 8.0f;   \r
+   DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 2048.f);\r
+}\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+void AnimateDeer(TCharacter *cptr)\r
+{\r
+   NewPhase = FALSE;\r
+   int _Phase = cptr->Phase;\r
+   int _FTime = cptr->FTime;\r
+   float _tgalpha = cptr->tgalpha;\r
+   if (cptr->AfraidTime) cptr->AfraidTime = max(0, cptr->AfraidTime - TimeDt);\r
+   if (cptr->State==2) { NewPhase=TRUE; cptr->State=1; }\r
+\r
+TBEGIN:\r
+   float targetx = cptr->tgx;\r
+   float targetz = cptr->tgz;\r
+   float targetdx = targetx - cptr->pos.x;\r
+   float targetdz = targetz - cptr->pos.z;\r
+\r
+   float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );       \r
+\r
+   float playerdx = PlayerX - cptr->pos.x;\r
+   float playerdz = PlayerZ - cptr->pos.z;\r
+   float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );    \r
+   \r
+\r
+   //=========== run away =================//\r
+   \r
+   if (cptr->State) {    \r
+    \r
+       if (!cptr->AfraidTime) {\r
+               cptr->State = 0; \r
+               SetNewTargetPlace(cptr, 8048.f);\r
+               goto TBEGIN; \r
+       }\r
+\r
+       nv.x = playerdx; nv.z = playerdz; nv.y = 0;\r
+       NormVector(nv, 2048.f);\r
+    cptr->tgx = cptr->pos.x - nv.x;\r
+    cptr->tgz = cptr->pos.z - nv.z;\r
+       cptr->tgtime = 0;\r
+   }\r
+\r
+\r
+   //======== exploring area ===============//\r
+   if (!cptr->State) {\r
+        cptr->AfraidTime = 0;\r
+        if (pdist<1024.f) { \r
+                cptr->State = 1; \r
+                cptr->AfraidTime = (6 + rRand(8)) * 1024;\r
+                cptr->Phase = DER_RUN;\r
+                goto TBEGIN;  }\r
+        \r
+\r
+        if (tdist<456) {      \r
+       SetNewTargetPlace(cptr, 8048.f);\r
+          goto TBEGIN; }               \r
+   } \r
+   \r
+   \r
+//============================================//   \r
+   if (pdist<2048) cptr->NoFindCnt = 0;   \r
+   if (cptr->NoFindCnt) cptr->NoFindCnt--;\r
+   else {\r
+    cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);   \r
+    if (cptr->AfraidTime) { \r
+               cptr->tgalpha += (float)f_sin(RealTime/1024.f) / 3.f;\r
+               if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;\r
+        if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;\r
+       }\r
+   }\r
+   \r
+\r
+   LookForAWay(cptr, TRUE, TRUE);\r
+   if (cptr->NoWayCnt>12) { cptr->NoWayCnt=0; cptr->NoFindCnt = 32 + rRand(60); }\r
+\r
+   if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;\r
+   if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;\r
+  \r
+//===============================================//\r
+\r
+   ProcessPrevPhase(cptr);   \r
+\r
+//======== select new phase =======================//\r
+   cptr->FTime+=TimeDt;\r
+   \r
+   if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {       \r
+       cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;\r
+       NewPhase = TRUE; }\r
+              \r
+   if (NewPhase) \r
+          if (!cptr->State) {\r
+                  if (cptr->Phase == DER_IDLE1 || cptr->Phase == DER_IDLE2) {\r
+                        if (rRand(128) > 64 && cptr->Phase == DER_IDLE2) \r
+                             cptr->Phase = DER_WALK;\r
+                        else cptr->Phase = DER_IDLE1 + rRand(1);\r
+                        goto ENDPSELECT;\r
+                  }               \r
+                  if (rRand(128) > 120) cptr->Phase=DER_IDLE1; else cptr->Phase=DER_WALK; \r
+          } else\r
+          if (cptr->AfraidTime) cptr->Phase = DER_RUN; \r
+                           else cptr->Phase = DER_WALK;        \r
+      \r
+ENDPSELECT:\r
+\r
+//====== process phase changing ===========//\r
+   if ( (_Phase != cptr->Phase) || NewPhase)\r
+        ActivateCharacterFx(cptr);        \r
+   \r
+   if (_Phase != cptr->Phase) {         \r
+    if (_Phase<=2 && cptr->Phase<=2)\r
+        cptr->FTime = _FTime * cptr->pinfo->Animation[cptr->Phase].AniTime / cptr->pinfo->Animation[_Phase].AniTime + 64;\r
+    else if (!NewPhase) cptr->FTime = 0;\r
+\r
+    if (cptr->PPMorphTime>128) {\r
+     cptr->PrevPhase = _Phase;\r
+     cptr->PrevPFTime  = _FTime;\r
+     cptr->PPMorphTime = 0; }\r
+   }\r
+  \r
+   cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;   \r
+\r
+      \r
+   \r
+   //========== rotation to tgalpha ===================//\r
+   \r
+   float rspd, currspeed, tgbend;\r
+   float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);   \r
+   float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;\r
+\r
+\r
+   if (cptr->Phase == DER_IDLE1 || cptr->Phase == DER_IDLE2) goto SKIPROT;\r
+   if (drspd > 0.02)\r
+    if (cptr->tgalpha > cptr->alpha) currspeed = 0.2f + drspd*1.0f;\r
+                                else currspeed =-0.2f - drspd*1.0f;\r
+     else currspeed = 0;\r
+   \r
+   if (cptr->AfraidTime) currspeed*=1.5;\r
+   if (dalpha > pi) currspeed*=-1;\r
+   if ((cptr->State & csONWATER) || cptr->Phase==DER_WALK) currspeed/=1.4f;\r
+      \r
+   DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 400.f);\r
+\r
+   tgbend = drspd/2.f;\r
+   if (tgbend>pi/3.f) tgbend = pi/3.f;\r
+\r
+   tgbend*= SGN(currspeed);\r
+   DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 2000.f);\r
+   \r
+\r
+   \r
+   rspd=cptr->rspeed * TimeDt / 612.f;\r
+   if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;\r
+                      else cptr->alpha+=rspd;\r
+   \r
+\r
+   if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;\r
+   if (cptr->alpha < 0     ) cptr->alpha+= pi * 2;\r
+\r
+SKIPROT:   \r
+\r
+//========== movement ==============================//\r
+   cptr->lookx = (float)f_cos(cptr->alpha);\r
+   cptr->lookz = (float)f_sin(cptr->alpha);\r
+\r
+   float curspeed = 0;\r
+   if (cptr->Phase == DER_RUN ) curspeed = 0.768*2;   \r
+   if (cptr->Phase == DER_WALK) curspeed = 0.160*2;   \r
+      \r
+   if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;\r
+\r
+//========== process speed =============//\r
+   curspeed*=cptr->scale;\r
+   if (curspeed>cptr->vspeed) DeltaFunc(cptr->vspeed, curspeed, TimeDt / 1024.f);    \r
+                         else DeltaFunc(cptr->vspeed, curspeed, TimeDt / 256.f);    \r
+      \r
+   MoveCharacter(cptr, cptr->lookx * cptr->vspeed * TimeDt,\r
+                          cptr->lookz * cptr->vspeed * TimeDt, TRUE, TRUE);      \r
+\r
+   ThinkY_Beta_Gamma(cptr, 128, 64, 0.6f, 0.4f);         \r
+   if (cptr->Phase==DER_WALK) cptr->tggamma+= cptr->rspeed / 16.0f;\r
+                         else cptr->tggamma+= cptr->rspeed / 10.0f;   \r
+   DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 2048.f);\r
+}\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+void AnimateMamm(TCharacter *cptr)\r
+{\r
+   NewPhase = FALSE;\r
+   int _Phase = cptr->Phase;\r
+   int _FTime = cptr->FTime;\r
+   float _tgalpha = cptr->tgalpha;\r
+   if (cptr->AfraidTime) cptr->AfraidTime = max(0, cptr->AfraidTime - TimeDt);\r
+   if (cptr->State==2) { NewPhase=TRUE; cptr->State=1; }\r
+\r
+TBEGIN:\r
+   float targetx = cptr->tgx;\r
+   float targetz = cptr->tgz;\r
+   float targetdx = targetx - cptr->pos.x;\r
+   float targetdz = targetz - cptr->pos.z;\r
+\r
+   float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );       \r
+\r
+   float playerdx = PlayerX - cptr->pos.x;\r
+   float playerdz = PlayerZ - cptr->pos.z;\r
+   float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );    \r
+   \r
+\r
+   //=========== run away =================//\r
+   \r
+   if (cptr->State) {    \r
+    \r
+       if (!cptr->AfraidTime) {\r
+               cptr->State = 0; \r
+               SetNewTargetPlace(cptr, 8048.f);\r
+               goto TBEGIN; \r
+       }\r
+\r
+       nv.x = playerdx; nv.z = playerdz; nv.y = 0;\r
+       NormVector(nv, 2048.f);\r
+    cptr->tgx = cptr->pos.x - nv.x;\r
+    cptr->tgz = cptr->pos.z - nv.z;\r
+       cptr->tgtime = 0;\r
+   }\r
+\r
+\r
+   //======== exploring area ===============//\r
+   if (!cptr->State) {\r
+        cptr->AfraidTime = 0;\r
+        if (pdist<1024.f) { \r
+                cptr->State = 1; \r
+                cptr->AfraidTime = (6 + rRand(8)) * 1024;\r
+                cptr->Phase = MAM_RUN;\r
+                goto TBEGIN;  }\r
+        \r
+\r
+        if (tdist<456) {      \r
+       SetNewTargetPlace(cptr, 8048.f);\r
+          goto TBEGIN; }               \r
+   } \r
+   \r
+   \r
+//============================================//   \r
+   if (pdist<3048) cptr->NoFindCnt = 0;\r
+   if (cptr->NoFindCnt) cptr->NoFindCnt--;\r
+   else {\r
+    cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);   \r
+    if (cptr->AfraidTime) { \r
+               cptr->tgalpha += (float)f_sin(RealTime/1024.f) / 3.f;\r
+               if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;\r
+        if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;\r
+       }\r
+   }\r
+   \r
+\r
+   LookForAWay(cptr, TRUE, TRUE);\r
+   if (cptr->NoWayCnt>12) { cptr->NoWayCnt=0; cptr->NoFindCnt = 32 + rRand(60); }\r
+\r
+   if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;\r
+   if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;\r
+  \r
+//===============================================//\r
+\r
+   ProcessPrevPhase(cptr);   \r
+\r
+//======== select new phase =======================//\r
+   cptr->FTime+=TimeDt;\r
+   \r
+   if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {       \r
+       cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;\r
+       NewPhase = TRUE; }\r
+              \r
+   if (NewPhase) \r
+          if (!cptr->State) {\r
+                  if (cptr->Phase == MAM_IDLE1 || cptr->Phase == MAM_IDLE2) {\r
+                        if (rRand(128) > 64 && cptr->Phase == MAM_IDLE2) \r
+                             cptr->Phase = MAM_WALK;\r
+                        else cptr->Phase = MAM_IDLE1 + rRand(1);\r
+                        goto ENDPSELECT;\r
+                  }               \r
+                  if (rRand(128) > 120) cptr->Phase=MAM_IDLE1; else cptr->Phase=MAM_WALK; \r
+          } else\r
+          if (cptr->AfraidTime) cptr->Phase = MAM_RUN; \r
+                           else cptr->Phase = MAM_WALK;        \r
+      \r
+ENDPSELECT:\r
+\r
+//====== process phase changing ===========//\r
+   if ( (_Phase != cptr->Phase) || NewPhase)\r
+        ActivateCharacterFx(cptr);        \r
+   \r
+   if (_Phase != cptr->Phase) {         \r
+    if (_Phase<=2 && cptr->Phase<=2)\r
+        cptr->FTime = _FTime * cptr->pinfo->Animation[cptr->Phase].AniTime / cptr->pinfo->Animation[_Phase].AniTime + 64;\r
+    else if (!NewPhase) cptr->FTime = 0;\r
+\r
+    if (cptr->PPMorphTime>128) {\r
+     cptr->PrevPhase = _Phase;\r
+     cptr->PrevPFTime  = _FTime;\r
+     cptr->PPMorphTime = 0; }\r
+   }\r
+  \r
+   cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;   \r
+\r
+      \r
+   \r
+   //========== rotation to tgalpha ===================//\r
+   \r
+   float rspd, currspeed, tgbend;\r
+   float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);   \r
+   float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;\r
+\r
+\r
+   if (cptr->Phase == MAM_IDLE1 || cptr->Phase == MAM_IDLE2) goto SKIPROT;\r
+   if (drspd > 0.02)\r
+    if (cptr->tgalpha > cptr->alpha) currspeed = 0.2f + drspd*1.0f;\r
+                                else currspeed =-0.2f - drspd*1.0f;\r
+     else currspeed = 0;\r
+   \r
+   if (cptr->AfraidTime) currspeed*=1.5;\r
+   if (dalpha > pi) currspeed*=-1;\r
+   if ((cptr->State & csONWATER) || cptr->Phase==MAM_WALK) currspeed/=1.4f;\r
+      \r
+   DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 400.f);\r
+\r
+   tgbend = drspd/2.f;\r
+   if (tgbend>pi/3.f) tgbend = pi/3.f;\r
+\r
+   tgbend*= SGN(currspeed);\r
+   DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 2000.f);\r
+   \r
+\r
+   \r
+   rspd=cptr->rspeed * TimeDt / 612.f;\r
+   if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;\r
+                      else cptr->alpha+=rspd;\r
+   \r
+\r
+   if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;\r
+   if (cptr->alpha < 0     ) cptr->alpha+= pi * 2;\r
+\r
+SKIPROT:   \r
+\r
+//========== movement ==============================//\r
+   cptr->lookx = (float)f_cos(cptr->alpha);\r
+   cptr->lookz = (float)f_sin(cptr->alpha);\r
+\r
+   float curspeed = 0;\r
+   if (cptr->Phase == MAM_RUN ) curspeed = 0.640*2;   \r
+   if (cptr->Phase == MAM_WALK) curspeed = 0.320*2;   \r
+      \r
+   if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;\r
+\r
+//========== process speed =============//\r
+   curspeed*=cptr->scale;\r
+   if (curspeed>cptr->vspeed) DeltaFunc(cptr->vspeed, curspeed, TimeDt / 1024.f);    \r
+                         else DeltaFunc(cptr->vspeed, curspeed, TimeDt / 256.f);    \r
+      \r
+   MoveCharacter(cptr, cptr->lookx * cptr->vspeed * TimeDt,\r
+                          cptr->lookz * cptr->vspeed * TimeDt, TRUE, TRUE);      \r
+\r
+   ThinkY_Beta_Gamma(cptr, 128, 64, 0.6f, 0.4f);         \r
+   if (cptr->Phase==MAM_WALK) cptr->tggamma+= cptr->rspeed / 16.0f;\r
+                         else cptr->tggamma+= cptr->rspeed / 10.0f;   \r
+   DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 2048.f);\r
+}\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+void AnimateDimor(TCharacter *cptr)\r
+{\r
+   NewPhase = FALSE;\r
+   int _Phase = cptr->Phase;\r
+   int _FTime = cptr->FTime;\r
+   float _tgalpha = cptr->tgalpha;\r
+      \r
+\r
+TBEGIN:\r
+   float targetx = cptr->tgx;\r
+   float targetz = cptr->tgz;\r
+   float targetdx = targetx - cptr->pos.x;\r
+   float targetdz = targetz - cptr->pos.z;\r
+\r
+   float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );       \r
+\r
+   float playerdx = PlayerX - cptr->pos.x;\r
+   float playerdz = PlayerZ - cptr->pos.z;\r
+   float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );    \r
+   \r
+\r
+   //=========== run away =================//   \r
+\r
+   if (pdist>(ctViewR+20)*256)\r
+          if (ReplaceCharacterForward(cptr)) goto TBEGIN;\r
+\r
+\r
+   //======== exploring area ===============//   \r
+        if (tdist<1024) {      \r
+       SetNewTargetPlace(cptr, 4048.f);\r
+          goto TBEGIN; }               \r
+      \r
+   \r
+//============================================//        \r
+\r
+   \r
+   cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);      \r
+   if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;\r
+   if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;\r
+  \r
+//===============================================//\r
+\r
+   ProcessPrevPhase(cptr);   \r
+\r
+//======== select new phase =======================//\r
+   cptr->FTime+=TimeDt;\r
+   \r
+   if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {       \r
+       cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;\r
+       NewPhase = TRUE; }   \r
+              \r
+   if (NewPhase) {\r
+          if (cptr->Phase == DIM_FLY) \r
+                  if (cptr->pos.y > GetLandH(cptr->pos.x, cptr->pos.z) + 2800) \r
+                          cptr->Phase = DIM_FLYP;\r
+                  else ;\r
+                          else\r
+          if (cptr->Phase == DIM_FLYP) \r
+                  if (cptr->pos.y < GetLandH(cptr->pos.x, cptr->pos.z) + 1800) \r
+                          cptr->Phase = DIM_FLY;\r
+   }\r
+      \r
+\r
+\r
+\r
+//====== process phase changing ===========//\r
+   if ( (_Phase != cptr->Phase) || NewPhase)\r
+        if ( (rand() & 1023) > 980 )\r
+          ActivateCharacterFx(cptr);      \r
+   \r
+   if (_Phase != cptr->Phase) {\r
+    if (!NewPhase) cptr->FTime = 0;   \r
+    if (cptr->PPMorphTime>128) {\r
+     cptr->PrevPhase = _Phase;\r
+     cptr->PrevPFTime  = _FTime;\r
+     cptr->PPMorphTime = 0; }\r
+   }\r
+   \r
+  \r
+   cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;   \r
+      \r
+   \r
+   //========== rotation to tgalpha ===================//\r
+   \r
+   float rspd, currspeed, tgbend;\r
+   float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);   \r
+   float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;\r
+\r
+   \r
+   if (drspd > 0.02)\r
+    if (cptr->tgalpha > cptr->alpha) currspeed = 0.6f + drspd*1.2f;\r
+                                else currspeed =-0.6f - drspd*1.2f;\r
+     else currspeed = 0;\r
+      \r
+   if (dalpha > pi) currspeed*=-1;         \r
+   DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 460.f);\r
+\r
+   tgbend = drspd/2.f;\r
+   if (tgbend>pi/2) tgbend = pi/2;\r
+\r
+   tgbend*= SGN(currspeed);\r
+   if (fabs(tgbend) > fabs(cptr->bend)) DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 800.f);\r
+                                   else DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 400.f);\r
+\r
+   \r
+   rspd=cptr->rspeed * TimeDt / 1024.f;\r
+   if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;\r
+                      else cptr->alpha+=rspd;\r
+   \r
+\r
+   if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;\r
+   if (cptr->alpha < 0     ) cptr->alpha+= pi * 2;\r
+\r
+//========== movement ==============================//\r
+   cptr->lookx = (float)f_cos(cptr->alpha);\r
+   cptr->lookz = (float)f_sin(cptr->alpha);\r
+\r
+   float curspeed = 0;\r
+   if (cptr->Phase == DIM_FLY ) curspeed = 1.5f;   \r
+   if (cptr->Phase == DIM_FLYP) curspeed = 1.3f;   \r
+      \r
+   if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;\r
+\r
+   if (cptr->Phase == DIM_FLY)\r
+    DeltaFunc(cptr->pos.y, GetLandH(cptr->pos.x, cptr->pos.z)+4048, TimeDt / 6.f);\r
+   else\r
+       DeltaFunc(cptr->pos.y, GetLandH(cptr->pos.x, cptr->pos.z), TimeDt / 16.f);\r
+   \r
+   \r
+   if (cptr->pos.y < GetLandH(cptr->pos.x, cptr->pos.z) + 236)\r
+          cptr->pos.y = GetLandH(cptr->pos.x, cptr->pos.z) + 256;\r
+   \r
+   \r
+\r
+//========== process speed =============//\r
+   curspeed*=cptr->scale;\r
+   DeltaFunc(cptr->vspeed, curspeed, TimeDt / 2024.f);    \r
+      \r
+   cptr->pos.x+= cptr->lookx * cptr->vspeed * TimeDt;\r
+   cptr->pos.z+= cptr->lookz * cptr->vspeed * TimeDt;                     \r
+   \r
+   cptr->tggamma = cptr->rspeed / 4.0f;\r
+   if (cptr->tggamma > pi / 6.f) cptr->tggamma = pi / 6.f;\r
+   if (cptr->tggamma <-pi / 6.f) cptr->tggamma =-pi / 6.f;\r
+   DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 2048.f);\r
+}\r
+\r
+\r
+\r
+\r
+\r
+void AnimateCharacters()\r
+{\r
+  //if (!RunMode) return;\r
+\r
+  TCharacter *cptr;\r
+  if (TrophyMode) return;\r
+\r
+  for (CurDino=0; CurDino<ChCount; CurDino++) {\r
+   cptr = &Characters[CurDino];   \r
+   if (cptr->StateF == 0xFF) continue;\r
+   cptr->tgtime+=TimeDt;\r
+\r
+   if (cptr->tgtime > 30*1000) SetNewTargetPlace(cptr, 2048);\r
+   if (cptr->Health)\r
+          if (cptr->BloodTTime) {\r
+                  cptr->BloodTTime-=TimeDt;\r
+                  if (cptr->BloodTTime<0) cptr->BloodTTime=0;\r
+\r
+                  float k = (20000.f + cptr->BloodTTime) / 90000.f;\r
+                  if (k>1.5) k = 1.5;\r
+                  cptr->BloodTime+=(int)((float)TimeDt * k);\r
+                  if (cptr->BloodTime>600) {\r
+                          cptr->BloodTime=rRand(228);\r
+                          AddBloodTrail(cptr);\r
+                          if (rRand(128) > 96) AddBloodTrail(cptr);\r
+                  }\r
+          }\r
+\r
+\r
+   switch (cptr->AI) {    \r
+       case AI_PIG    : if (cptr->Health) AnimatePig(cptr); else AnimatePigDead(cptr);\r
+                   break;      \r
+    case AI_ARCHEO : if (cptr->Health) AnimateDimor(cptr); else AnimateDimorDead(cptr);\r
+                   break;\r
+    case AI_BIGFOOT: \r
+                   break;      \r
+    case AI_POACHER: ;\r
+               break;\r
+\r
+\r
+    case AI_BRONT: if (cptr->Health) AnimateBron(cptr);    else AnimateBronDead(cptr);\r
+                   break; \r
+    case AI_HOG  : if (cptr->Health) AnimateHog(cptr);    else AnimateHogDead(cptr);\r
+                   break; \r
+    case AI_WOLF : if (cptr->Health) AnimateWolf(cptr);    else AnimateBronDead(cptr);\r
+            break;\r
+    case AI_RHINO: if (cptr->Health) AnimateRhino(cptr);   else AnimateRhinoDead(cptr);\r
+                   break; \r
+    case AI_DIATR: if (cptr->Health) AnimateDiatr(cptr);   else AnimateDiatrDead(cptr);\r
+                   break;\r
+    case AI_DEER : if (cptr->Health) AnimateDeer(cptr);   else AnimateDeerDead(cptr);\r
+                   break; \r
+    case AI_SMILO: if (cptr->Health) AnimateSmilo(cptr);   else AnimateSmiloDead(cptr);\r
+                   break; \r
+    case AI_MAMM : if (cptr->Health) AnimateMamm(cptr);   else AnimateDeerDead(cptr);\r
+                   break; \r
+    case AI_BEAR : if (cptr->Health) AnimateBear(cptr);   else AnimateBronDead(cptr);\r
+                   break; \r
+\r
+            /*\r
+    case AI_ANKY : if (cptr->Health) AnimateAnky(cptr);   else AnimateAnkyDead(cptr);\r
+                   break; \r
+    case AI_STEGO: if (cptr->Health) AnimateSteg(cptr);   else AnimateStegDead(cptr);\r
+                   break;\r
+\r
+    case AI_ALLO : if (cptr->Health) AnimateRaptor(cptr); else AnimateRaptorDead(cptr);\r
+                   break; \r
+       case AI_CHASM: if (cptr->Health) AnimateTric(cptr);   else AnimateTricDead(cptr);\r
+                   break;\r
+\r
+       case AI_VELO : if (cptr->Health) AnimateVelo(cptr);   else AnimateVeloDead(cptr);\r
+                   break;\r
+    case AI_SPINO: if (cptr->Health) AnimateSpin(cptr);   else AnimateSpinDead(cptr);\r
+                   break;\r
+       case AI_CERAT: if (cptr->Health) AnimateCera(cptr);   else AnimateCeraDead(cptr);\r
+                   break;    \r
+    case AI_TREX : if (cptr->Health) AnimateTRex(cptr);  else AnimateTRexDead(cptr);\r
+                   break;\r
+            */\r
+    case 0       : AnimateHuntDead(cptr); break;                               \r
+   }\r
+  }   \r
+}  \r
+\r
+\r
+\r
+\r
+void MakeNoise(Vector3d pos, float range)\r
+{  \r
+  for (int c=0; c<ChCount; c++) {\r
+       TCharacter *cptr = &Characters[c];\r
+       if (!cptr->Health) continue;\r
+       float l = VectorLength(SubVectors(cptr->pos, pos));\r
+       if (l>range) continue;\r
+\r
+\r
+       \r
+       cptr->AfraidTime = (int) (10.f + (range-l) / 256.f) * 1024;\r
+    cptr->State = 2;\r
+       cptr->NoFindCnt = 0;\r
+       \r
+  }\r
+}\r
+\r
+\r
+void CheckAfraid()\r
+{   \r
+   if (!MyHealth) return;\r
+   if (TrophyMode) return;\r
+\r
+   Vector3d ppos, plook, clook, wlook, rlook;\r
+   ppos = PlayerPos;\r
+\r
+   if (DEBUG || UNDERWATER || ObservMode) return;\r
+\r
+   plook.y = 0;\r
+   plook.x = (float) f_sin(CameraAlpha);\r
+   plook.z = (float)-f_cos(CameraAlpha);     \r
+\r
+   wlook = Wind.nv;\r
+   \r
+   float kR, kwind, klook, kstand;\r
+   \r
+   float kmask  = 1.0f;\r
+   float kskill = 1.0f;\r
+   float kscent = 1.0f;\r
+\r
+   if (CamoMode)  kmask *=1.5;\r
+   if (ScentMode) kscent*=1.5;   \r
+\r
+   for (int c=0; c<ChCount; c++) {\r
+        TCharacter *cptr = &Characters[c];\r
+        if (!cptr->Health) continue;\r
+        if (cptr->AI<10) continue;\r
+        if (cptr->AfraidTime || cptr->State==1) continue;\r
+\r
+        rlook = SubVectors(ppos, cptr->pos);\r
+        kR = VectorLength( rlook ) / 256.f / (32.f + ctViewR/2);\r
+        NormVector(rlook, 1.0f);\r
+\r
+        kR *= 2.5f / (float)(1.5+OptSens/128.f );\r
+        if (kR > 3.0f) continue;\r
+     \r
+        clook.x = cptr->lookx;\r
+        clook.y = 0;\r
+        clook.z = cptr->lookz;\r
+\r
+        MulVectorsScal(wlook, rlook, kwind); kwind*=Wind.speed / 10;\r
+        MulVectorsScal(clook, rlook, klook); klook*=-1.f;\r
+\r
+        if (HeadY > 180) kstand = 0.7f; else kstand = 1.2f;\r
+\r
+        //============= reasons ==============//\r
+\r
+        float kALook  = kR * ((klook+3.f) / 3.f) * kstand * kmask;\r
+        if (klook>0.3) kALook*= 2.0;\r
+        if (klook>0.8) kALook*= 2.0;\r
+        kALook/=DinoInfo[cptr->CType].LookK;\r
+        if (kALook < 1.0)\r
+         if (TraceLook(cptr->pos.x, cptr->pos.y+220, cptr->pos.z,\r
+                           PlayerX, PlayerY+HeadY/2.f, PlayerZ) ) kALook*=1.3f;\r
+     \r
+        if (kALook < 1.0)\r
+         if (TraceLook(cptr->pos.x, cptr->pos.y+220, cptr->pos.z,\r
+                           PlayerX, PlayerY+HeadY, PlayerZ) )   kALook = 2.0;\r
+        kALook *= (1.f + (float)ObjectsOnLook / 6.f);\r
+\r
+       /*\r
+         if (kR<1.0f) {\r
+                 char t[32];       \r
+          wsprintf(t,"%d", ObjectsOnLook);\r
+          AddMessage(t);\r
+          kALook = 20.f;\r
+         }\r
+         */ \r
+        \r
+        float kASmell = kR * ((kwind+2.0f) / 2.0F) * ((klook+3.f) / 3.f) * kscent;\r
+     if (kwind>0) kASmell*= 2.0;\r
+        kASmell/=DinoInfo[cptr->CType].SmellK;\r
+                        \r
+        float kRes = min (kALook, kASmell);\r
+\r
+     if (kRes < 1.0) {                         \r
+         /*\r
+        MessageBeep(0xFFFFFFFF);        \r
+               char t[128];\r
+               if (kALook<kASmell)\r
+                sprintf(t, "LOOK: KR: %f  Tr: %d  K: %f", kR, ObjectsOnLook, kALook);\r
+               else\r
+            sprintf(t, "SMELL: KR: %f  Tr: %d  K: %f", kR, ObjectsOnLook, kASmell);\r
+               AddMessage(t); \r
+        */\r
+\r
+               kRes = min (kRes, kR);\r
+               cptr->AfraidTime = (int)(1.0 / (kRes+0.1) * 10.f * 1000.f);\r
+               cptr->State = 2;\r
+               cptr->NoFindCnt = 0;\r
+        }\r
+   }\r
+}\r
+\r
+\r
+\r
+\r
+\r
+void PlaceTrophy()\r
+{\r
+       ChCount = 0;\r
+       \r
+       for (int c=0; c<24; c++) {\r
+        if (!TrophyRoom.Body[c].ctype) continue;\r
+     Characters[ChCount].CType = TrophyRoom.Body[c].ctype;\r
+                \r
+        if (c<6) Characters[ChCount].alpha = pi/2; else\r
+         if (c<12) Characters[ChCount].alpha = pi; else\r
+          if (c<18) Characters[ChCount].alpha = pi*3/2; else\r
+                      Characters[ChCount].alpha = 0;\r
+\r
+        ResetCharacter(&Characters[ChCount]);\r
+\r
+        Characters[ChCount].State = c;\r
+        Characters[ChCount].scale = TrophyRoom.Body[c].scale;\r
+        Characters[ChCount].pos.x = LandingList.list[c].x * 256.f + 128.f;\r
+        Characters[ChCount].pos.z = LandingList.list[c].y * 256.f + 128.f;\r
+        \r
+        Characters[ChCount].pos.y = GetLandH(Characters[ChCount].pos.x, \r
+                                                 Characters[ChCount].pos.z);\r
+        ChCount++;\r
+       }\r
+}\r
+\r
+\r
+\r
+void PlaceCharacters()\r
+{\r
+       int c, tr;\r
+       ChCount = 0;\r
+       PrintLog("Placing...");\r
+//return;\r
+       for (c=10; c<30; c++)\r
+               if ( (TargetDino & (1<<c))>0 ) { TargetCall=c; break; }\r
+           \r
+       \r
+    //======== lohs =========//\r
+\r
+   int MC = 5 + OptDens/80;\r
+   if (OptDayNight==2) MC/=2;\r
+   \r
+   tr = 0;\r
+\r
+   for (c=0; c<MC; c++) {\r
+     Characters[ChCount].CType = 1 + c % 2;\r
+replace1:\r
+        Characters[ChCount].pos.x = PlayerX + siRand(10040);\r
+     Characters[ChCount].pos.z = PlayerZ + siRand(10040);\r
+        Characters[ChCount].pos.y = GetLandH(Characters[ChCount].pos.x, \r
+                                                 Characters[ChCount].pos.z);\r
+        tr++;\r
+        if (tr>10240) break;\r
+\r
+        if (CheckPlaceCollisionP(Characters[ChCount].pos)) goto replace1;\r
+\r
+        ResetCharacter(&Characters[ChCount]);     \r
+\r
+        if (Characters[ChCount].AI==AI_ARCHEO)\r
+                Characters[ChCount].pos.y+=2048.f; \r
+\r
+     Characters[ChCount].tgx = Characters[ChCount].pos.x;\r
+     Characters[ChCount].tgz = Characters[ChCount].pos.z;\r
+        Characters[ChCount].tgtime = 0;\r
+\r
+        \r
+        ChCount++;\r
+   }\r
+\r
+   \r
+\r
+   int TC = 0;\r
+   int TDi[10];\r
+   TDi[0] = 10;\r
+   for (c=10; c<20; c++)\r
+          if (TargetDino & (1<<c)) TDi[TC++]=c;\r
+      \r
+   MC = 8 + OptDens/30 + rRand(6);\r
+   tr = 0;\r
+   \r
+   //======== main =========//\r
+   for (c=0; c<MC; c++) {               \r
+          \r
+        if ((c<4) || (!TargetDino)) Characters[ChCount].CType = AI_to_CIndex[10] + rRand(6); else\r
+     if (c<10) Characters[ChCount].CType = AI_to_CIndex[ TDi[c % (TC)] ];\r
+          else Characters[ChCount].CType = AI_to_CIndex[ TDi[rRand(TC-1)] ];\r
+     //Characters[ChCount].CType = AI_to_CIndex[ AI_BRONT+1];\r
+        //Characters[ChCount].CType = AI_to_CIndex[10] + 7;//rRand(3);     \r
+replace2:\r
+        Characters[ChCount].pos.x = 512*256 + siRand(50*256)*10;\r
+     Characters[ChCount].pos.z = 512*256 + siRand(50*256)*10;\r
+        Characters[ChCount].pos.y = GetLandH(Characters[ChCount].pos.x, \r
+                                                 Characters[ChCount].pos.z);\r
+        tr++;\r
+        if (tr>10240) break;\r
+\r
+        if ( fabs(Characters[ChCount].pos.x - PlayerX) + \r
+             fabs(Characters[ChCount].pos.z - PlayerZ) < 256 * 40 )\r
+                 goto replace2;                  \r
+        \r
+        if (CheckPlaceCollisionP(Characters[ChCount].pos)) goto replace2;\r
+\r
+     Characters[ChCount].tgx = Characters[ChCount].pos.x;\r
+     Characters[ChCount].tgz = Characters[ChCount].pos.z;\r
+        Characters[ChCount].tgtime = 0;\r
+\r
+        ResetCharacter(&Characters[ChCount]);     \r
+        ChCount++;\r
+   }\r
+\r
+   PrintLog("\n");\r
+   DemoPoint.DemoTime = 0;\r
+}\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+void CreateChMorphedModel(TCharacter *cptr)\r
+{   \r
+   TAni *aptr  = &cptr->pinfo->Animation[cptr->Phase];   \r
+   TAni *paptr = &cptr->pinfo->Animation[cptr->PrevPhase];   \r
+\r
+   int CurFrame, SplineD, PCurFrame, PSplineD;\r
+   float scale = cptr->scale;\r
+\r
+   CurFrame = ( (aptr->FramesCount-1) * cptr->FTime * 256) / aptr->AniTime;\r
+   SplineD = CurFrame & 0xFF;\r
+   CurFrame = (CurFrame>>8);\r
+\r
+\r
+   BOOL PMorph = (cptr->Phase != cptr->PrevPhase) && (cptr->PPMorphTime < PMORPHTIME) && (MORPHP);\r
+\r
+   if (PMorph) {\r
+      PCurFrame = ( (paptr->FramesCount-1) * cptr->PrevPFTime * 256) / paptr->AniTime;\r
+      PSplineD = PCurFrame & 0xFF;\r
+      PCurFrame = (PCurFrame>>8);      \r
+   }\r
+\r
+  \r
+\r
+   if (!MORPHA) { SplineD = 0; PSplineD = 0; }\r
+\r
+   float k1, k2, pk1, pk2, pmk1, pmk2;\r
+\r
+   k2 = (float)(SplineD) / 256.f;\r
+   k1 = 1.0f - k2;\r
+   k1/=8.f; k2/=8.f;\r
+\r
+   if (PMorph) {\r
+     pk2 = (float)(PSplineD) / 256.f;\r
+     pk1 = 1.0f - pk2;\r
+     pk1/=8.f; pk2/=8.f;\r
+     pmk1 = (float)cptr->PPMorphTime / PMORPHTIME;\r
+     pmk2 = 1.f - pmk1;\r
+   }\r
+\r
+   int VCount = cptr->pinfo->mptr->VCount;\r
+   short int* adptr  =  aptr->aniData + CurFrame*VCount*3;\r
+   short int* padptr = paptr->aniData + PCurFrame*VCount*3;\r
+\r
+   float sb = (float)f_sin(cptr->beta) * scale;\r
+   float cb = (float)f_cos(cptr->beta) * scale;\r
+   float sg = (float)f_sin(cptr->gamma);\r
+   float cg = (float)f_cos(cptr->gamma);\r
+\r
+   for (int v=0; v<VCount; v++) {\r
+    float x = *(adptr+v*3+0) * k1 + *(adptr+(v+VCount)*3+0) * k2;\r
+    float y = *(adptr+v*3+1) * k1 + *(adptr+(v+VCount)*3+1) * k2;\r
+    float z = - (*(adptr+v*3+2) * k1 + *(adptr+(v+VCount)*3+2) * k2);\r
+\r
+    if (PMorph) {\r
+      float px = *(padptr+v*3+0) * pk1 + *(padptr+(v+VCount)*3+0) * pk2;\r
+      float py = *(padptr+v*3+1) * pk1 + *(padptr+(v+VCount)*3+1) * pk2;\r
+      float pz = - (*(padptr+v*3+2) * pk1 + *(padptr+(v+VCount)*3+2) * pk2);\r
+\r
+      x = x*pmk1 + px* pmk2;\r
+      y = y*pmk1 + py* pmk2;\r
+      z = z*pmk1 + pz* pmk2;\r
+    }\r
+    \r
+\r
+    float zz = z;\r
+    float xx = cg * x - sg * y;\r
+    float yy = cg * y + sg * x;\r
+\r
+\r
+    //float fi = (z / 400) * (cptr->bend / 1.5f);\r
+    float fi;\r
+    if (z>0) {\r
+        fi = z / 240.f; \r
+        if (fi>1.f) fi=1.f;\r
+    } else {\r
+        fi = z / 380.f;\r
+        if (fi<-1.f) fi=-1.f;\r
+    }\r
+    \r
+    fi*=cptr->bend;\r
+    \r
+       float bendc = (float)f_cos(fi);\r
+    float bends = (float)f_sin(fi);\r
+    \r
+    float bx = bendc * xx - bends * zz;\r
+    float bz = bendc * zz + bends * xx;\r
+    zz = bz;\r
+    xx = bx;\r
+    \r
+    cptr->pinfo->mptr->gVertex[v].x = xx * scale;\r
+    cptr->pinfo->mptr->gVertex[v].y = cb * yy - sb * zz;\r
+    cptr->pinfo->mptr->gVertex[v].z = cb * zz + sb * yy;\r
+   }   \r
+}\r
+\r
+\r
+\r
+void CreateMorphedModel(TModel* mptr, TAni *aptr, int FTime, float scale)\r
+{\r
+  int CurFrame = ((aptr->FramesCount-1) * FTime * 256) / aptr->AniTime;\r
+\r
+  int SplineD = CurFrame & 0xFF;\r
+  CurFrame = (CurFrame>>8);\r
+\r
+  float k2 = (float)(SplineD) / 256.f;\r
+  float k1 = 1.0f - k2;\r
+  k1*=scale/8.f; \r
+  k2*=scale/8.f;\r
\r
+  int VCount = mptr->VCount;\r
+  short int* adptr = &(aptr->aniData[CurFrame*VCount*3]);\r
+  for (int v=0; v<VCount; v++) {\r
+   mptr->gVertex[v].x = *(adptr+v*3+0) * k1 + *(adptr+(v+VCount)*3+0) * k2;\r
+   mptr->gVertex[v].y = *(adptr+v*3+1) * k1 + *(adptr+(v+VCount)*3+1) * k2;\r
+   mptr->gVertex[v].z =- *(adptr+v*3+2) * k1 - *(adptr+(v+VCount)*3+2) * k2;\r
+  }\r
+}\r
+\r
+\r
+\r
+\r
+void CreateMorphedObject(TModel* mptr, TVTL &vtl, int FTime)\r
+{\r
+  int CurFrame = ((vtl.FramesCount-1) * FTime * 256) / vtl.AniTime;\r
+\r
+  int SplineD = CurFrame & 0xFF;\r
+  CurFrame = (CurFrame>>8);\r
+\r
+  float k2 = (float)(SplineD) / 256.f;\r
+  float k1 = 1.0f - k2;\r
+  k1/=8.f; k2/=8.f;\r
\r
+  int VCount = mptr->VCount;\r
+  short int* adptr = &(vtl.aniData[CurFrame*VCount*3]);\r
+  for (int v=0; v<VCount; v++) {\r
+   mptr->gVertex[v].x = *(adptr+v*3+0) * k1 + *(adptr+(v+VCount)*3+0) * k2;\r
+   mptr->gVertex[v].y = *(adptr+v*3+1) * k1 + *(adptr+(v+VCount)*3+1) * k2;\r
+   mptr->gVertex[v].z =- *(adptr+v*3+2) * k1 - *(adptr+(v+VCount)*3+2) * k2;\r
+  }\r
+}
\ No newline at end of file
diff --git a/Game.cpp b/Game.cpp
new file mode 100644 (file)
index 0000000..c9ddbe0
--- /dev/null
+++ b/Game.cpp
@@ -0,0 +1,1731 @@
+#include "Hunt.h"\r
+\r
+bool ShowFaces = true;\r
+\r
+void UploadGeometry()\r
+{\r
+       int x,y,xx,yy;\r
+    byte temp;\r
+    \r
+       AudioFCount = 0;\r
+\r
+       int MaxView = 20;\r
+    int HalfView = (int)(MaxView/2)+1;    \r
+\r
+       for (x = 0; x < MaxView; x++)\r
+     for (y = 0; y < MaxView; y++)\r
+        {\r
+         xx = (x - HalfView)*2; \r
+         yy = (y - HalfView)*2;\r
+         data[AudioFCount].x1 = (CCX+xx) * 256 - CameraX; \r
+         data[AudioFCount].y1 = HMap[CCY+yy][CCX+xx] * ctHScale - CameraY; \r
+         data[AudioFCount].z1 = (CCY+yy) * 256 - CameraZ; \r
+\r
+         xx = ((x+1) - HalfView)*2; \r
+         yy = (y - HalfView)*2;\r
+         data[AudioFCount].x2 = (CCX+xx) * 256 - CameraX; \r
+         data[AudioFCount].y2 = HMap[CCY+yy][CCX+xx] * ctHScale - CameraY; \r
+         data[AudioFCount].z2 = (CCY+yy) * 256 - CameraZ; \r
+\r
+         xx = ((x+1) - HalfView)*2; \r
+         yy = ((y+1) - HalfView)*2;\r
+         data[AudioFCount].x3 = (CCX+xx) * 256 - CameraX; \r
+         data[AudioFCount].y3 = HMap[CCY+yy][CCX+xx] * ctHScale - CameraY; \r
+         data[AudioFCount].z3 = (CCY+yy) * 256 - CameraZ; \r
+\r
+         xx = (x - HalfView)*2; \r
+         yy = ((y+1) - HalfView)*2;\r
+         data[AudioFCount].x4 = (CCX+xx) * 256 - CameraX; \r
+         data[AudioFCount].y4 = HMap[CCY+yy][CCX+xx] * ctHScale - CameraY; \r
+         data[AudioFCount].z4 = (CCY+yy) * 256 - CameraZ; \r
+\r
+         AudioFCount++;\r
+        }\r
+\r
+        if (ShowFaces) \r
+        {   wsprintf(logt,"Audio_UpdateGeometry: %i faces uploaded\n", AudioFCount); PrintLog(logt);\r
+\r
+                ShowFaces = false;}\r
+}\r
+\r
+\r
+void SetupRes()\r
+{\r
+       if (!HARD3D)\r
+               if (OptRes>5) OptRes=5;\r
+    if (OptRes==0) { WinW = 320; WinH=240; }\r
+       if (OptRes==1) { WinW = 400; WinH=300; }\r
+       if (OptRes==2) { WinW = 512; WinH=384; }\r
+       if (OptRes==3) { WinW = 640; WinH=480; }\r
+       if (OptRes==4) { WinW = 800; WinH=600; }\r
+       if (OptRes==5) { WinW =1024; WinH=768; }                \r
+       if (OptRes==6) { WinW =1280; WinH=1024; }\r
+       if (OptRes==7) { WinW =1600; WinH=1200; }       \r
+}\r
+\r
+\r
+float GetLandOH(int x, int y)\r
+{\r
+  return (float)(HMapO[y][x]) * ctHScale;\r
+}\r
+\r
+\r
+float GetLandOUH(int x, int y)\r
+{\r
+  if (FMap[y][x] & fmReverse)\r
+   return (float)((int)(HMap[y][x+1]+HMap[y+1][x])/2.f)*ctHScale;             \r
+                else\r
+   return (float)((int)(HMap[y][x]+HMap[y+1][x+1])/2.f)*ctHScale;\r
+}\r
+\r
+\r
+\r
+float GetLandUpH(float x, float y)\r
+{ \r
+       \r
+   int CX = (int)x / 256;\r
+   int CY = (int)y / 256;\r
+\r
+   if (!(FMap[CY][CX] & fmWaterA)) return GetLandH(x,y);\r
+   \r
+   return (float)(WaterList[ WMap[CY][CX] ].wlevel * ctHScale);\r
+\r
+}\r
+\r
+\r
+float GetLandH(float x, float y)\r
+{ \r
+   int CX = (int)x / 256;\r
+   int CY = (int)y / 256;\r
+   \r
+   int dx = (int)x % 256;\r
+   int dy = (int)y % 256; \r
+\r
+   int h1 = HMap[CY][CX];\r
+   int h2 = HMap[CY][CX+1];\r
+   int h3 = HMap[CY+1][CX+1];\r
+   int h4 = HMap[CY+1][CX];\r
+\r
+\r
+   if (FMap[CY][CX] & fmReverse) {\r
+     if (256-dx>dy) h3 = h2+h4-h1;\r
+               else h1 = h2+h4-h3;\r
+   } else {\r
+     if (dx>dy) h4 = h1+h3-h2;\r
+           else h2 = h1+h3-h4;\r
+   }\r
+\r
+   float h = (float)\r
+          (h1   * (256-dx) + h2 * dx) * (256-dy) +\r
+          (h4   * (256-dx) + h3 * dx) * dy;\r
+\r
+   return  (h / 256.f / 256.f) * ctHScale;           \r
+}\r
+\r
+\r
+\r
+float GetLandLt(float x, float y)\r
+{ \r
+   int CX = (int)x / 256;\r
+   int CY = (int)y / 256;\r
+   \r
+   int dx = (int)x % 256;\r
+   int dy = (int)y % 256; \r
+\r
+   int h1 = LMap[CY][CX];\r
+   int h2 = LMap[CY][CX+1];\r
+   int h3 = LMap[CY+1][CX+1];\r
+   int h4 = LMap[CY+1][CX]; \r
+\r
+   float h = (float)\r
+          (h1   * (256-dx) + h2 * dx) * (256-dy) +\r
+          (h4   * (256-dx) + h3 * dx) * dy;\r
+\r
+   return  (h / 256.f / 256.f);\r
+}\r
+\r
+\r
+\r
+float GetLandLt2(float x, float y)\r
+{ \r
+   int CX = ((int)x / 512)*2 - CCX;\r
+   int CY = ((int)y / 512)*2 - CCY;\r
+   \r
+   int dx = (int)x % 512;\r
+   int dy = (int)y % 512; \r
+\r
+   int h1 = VMap[CY+128][CX+128].Light;\r
+   int h2 = VMap[CY+128][CX+2+128].Light;\r
+   int h3 = VMap[CY+2+128][CX+2+128].Light;\r
+   int h4 = VMap[CY+2+128][CX+128].Light; \r
+\r
+   float h = (float)\r
+          (h1   * (512-dx) + h2 * dx) * (512-dy) +\r
+          (h4   * (512-dx) + h3 * dx) * dy;\r
+\r
+   return  (h / 512.f / 512.f);\r
+}\r
+\r
+\r
+\r
+void CalcModelGroundLight(TModel *mptr, float x0, float z0, int FI)\r
+{\r
+       float ca = (float)f_cos(FI * pi / 2);\r
+       float sa = (float)f_sin(FI * pi / 2);\r
+       for (int v=0; v<mptr->VCount; v++) {\r
+               float x = mptr->gVertex[v].x * ca + mptr->gVertex[v].z * sa + x0;\r
+               float z = mptr->gVertex[v].z * ca - mptr->gVertex[v].x * sa + z0;\r
+        mptr->VLight[0][v] = GetLandLt2(x, z) - 128;           \r
+       }\r
+}\r
+\r
+\r
+BOOL PointOnBound(float &H, float px, float py, float cx, float cy, float oy, TBound *bound, int angle)\r
+{\r
+       px-=cx;\r
+       py-=cy; \r
+       \r
+       float ca = (float) f_cos(angle*pi / 2.f);\r
+       float sa = (float) f_sin(angle*pi / 2.f);       \r
+\r
+       BOOL _on = FALSE;\r
+       H=-10000;\r
+\r
+       for (int o=0; o<8; o++) {\r
+               \r
+               if (bound[o].a<0) continue;\r
+               if (bound[o].y2 + oy > PlayerY + 128) continue;        \r
+               \r
+        float a,b;\r
+           float ccx = bound[o].cx*ca + bound[o].cy*sa;\r
+           float ccy = bound[o].cy*ca - bound[o].cx*sa;\r
+\r
+           if (angle & 1) {\r
+         a = bound[o].b;\r
+            b = bound[o].a;\r
+               } else {\r
+            a = bound[o].a;\r
+            b = bound[o].b;\r
+               }\r
+\r
+           if ( ( fabs(px - ccx) < a) &&  (fabs(py - ccy) < b) ) \r
+               {\r
+                     _on=TRUE;                   \r
+                         if (H < bound[o].y2) H = bound[o].y2;                   \r
+               }\r
+       }\r
+\r
+       return _on;\r
+}\r
+\r
+\r
+\r
+BOOL PointUnBound(float &H, float px, float py, float cx, float cy, float oy, TBound *bound, int angle)\r
+{\r
+       px-=cx;\r
+       py-=cy; \r
+       \r
+       float ca = (float) f_cos(angle*pi / 2.f);\r
+       float sa = (float) f_sin(angle*pi / 2.f);       \r
+\r
+       BOOL _on = FALSE;\r
+       H=+10000;\r
+\r
+       for (int o=0; o<8; o++) {\r
+               \r
+               if (bound[o].a<0) continue;\r
+               if (bound[o].y1 + oy < PlayerY + 128) continue;        \r
+               \r
+        float a,b;\r
+           float ccx = bound[o].cx*ca + bound[o].cy*sa;\r
+           float ccy = bound[o].cy*ca - bound[o].cx*sa;\r
+\r
+           if (angle & 1) {\r
+         a = bound[o].b;\r
+            b = bound[o].a;\r
+               } else {\r
+            a = bound[o].a;\r
+            b = bound[o].b;\r
+               }\r
+\r
+           if ( ( fabs(px - ccx) < a) &&  (fabs(py - ccy) < b) ) \r
+               {\r
+                     _on=TRUE;                   \r
+                         if (H > bound[o].y1) H = bound[o].y1;\r
+               }\r
+       }\r
+\r
+       return _on;\r
+}\r
+\r
+\r
+\r
+\r
+\r
+float GetLandCeilH(float CameraX, float CameraZ)\r
+{\r
+  float h,hh;\r
+  \r
+   h = GetLandH(CameraX, CameraZ) + 20480;\r
+\r
+   int ccx = (int)CameraX / 256;\r
+   int ccz = (int)CameraZ / 256;\r
+\r
+   for (int z=-4; z<=4; z++)\r
+    for (int x=-4; x<=4; x++) \r
+      if (OMap[ccz+z][ccx+x]!=255) {\r
+        int ob = OMap[ccz+z][ccx+x];\r
+               \r
+        float CR = (float)MObjects[ob].info.Radius - 1.f;\r
+                \r
+        float oz = (ccz+z) * 256.f + 128.f;\r
+        float ox = (ccx+x) * 256.f + 128.f;\r
+\r
+               float LandY = GetLandOH(ccx+x, ccz+z);\r
+\r
+               if (!(MObjects[ob].info.flags & ofBOUND)) {\r
+         if (MObjects[ob].info.YLo + LandY > h) continue;\r
+         if (MObjects[ob].info.YLo + LandY < PlayerY+100) continue;         \r
+               }\r
+\r
+        float r = CR+1;\r
+\r
+               if (MObjects[ob].info.flags & ofBOUND)\r
+               {\r
+                       float hh;\r
+                       if (PointUnBound(hh, CameraX, CameraZ, ox, oz, LandY, MObjects[ob].bound, ((FMap[ccz+z][ccx+x] >> 2) & 3)  ) )\r
+                               if (h > LandY + hh) h = LandY + hh;\r
+               } else {\r
+                if (MObjects[ob].info.flags & ofCIRCLE)\r
+                  r = (float) sqrt( (ox-CameraX)*(ox-CameraX) + (oz-CameraZ)*(oz-CameraZ) );\r
+                else\r
+                  r = (float) max( fabs(ox-CameraX) , fabs(oz-CameraZ) );\r
+                \r
+                if (r<CR) h = MObjects[ob].info.YLo + LandY;\r
+               }\r
+        \r
+   }\r
+  return h;\r
+}\r
+\r
+\r
+\r
+float GetLandQH(float CameraX, float CameraZ)\r
+{\r
+  float h,hh;\r
+  \r
+   h = GetLandH(CameraX, CameraZ);\r
+   hh = GetLandH(CameraX-90.f, CameraZ-90.f); if (hh>h) h=hh;\r
+   hh = GetLandH(CameraX+90.f, CameraZ-90.f); if (hh>h) h=hh;\r
+   hh = GetLandH(CameraX-90.f, CameraZ+90.f); if (hh>h) h=hh; \r
+   hh = GetLandH(CameraX+90.f, CameraZ+90.f); if (hh>h) h=hh;\r
+\r
+   hh = GetLandH(CameraX+128.f, CameraZ); if (hh>h) h=hh;\r
+   hh = GetLandH(CameraX-128.f, CameraZ); if (hh>h) h=hh;\r
+   hh = GetLandH(CameraX, CameraZ+128.f); if (hh>h) h=hh;\r
+   hh = GetLandH(CameraX, CameraZ-128.f); if (hh>h) h=hh;\r
+\r
+   int ccx = (int)CameraX / 256;\r
+   int ccz = (int)CameraZ / 256;\r
+\r
+   for (int z=-4; z<=4; z++)\r
+    for (int x=-4; x<=4; x++) \r
+      if (OMap[ccz+z][ccx+x]!=255) {\r
+        int ob = OMap[ccz+z][ccx+x];\r
+               \r
+        float CR = (float)MObjects[ob].info.Radius - 1.f;\r
+                \r
+        float oz = (ccz+z) * 256.f + 128.f;\r
+        float ox = (ccx+x) * 256.f + 128.f;\r
+\r
+               float LandY = GetLandOH(ccx+x, ccz+z);\r
+\r
+               if (!(MObjects[ob].info.flags & ofBOUND)) {\r
+         if (MObjects[ob].info.YHi + LandY < h) continue;\r
+         if (MObjects[ob].info.YHi + LandY > PlayerY+128) continue;\r
+         //if (MObjects[ob].info.YLo + LandY > PlayerY+256) continue;\r
+               }\r
+\r
+        float r = CR+1;\r
+\r
+               if (MObjects[ob].info.flags & ofBOUND)\r
+               {\r
+                       float hh;\r
+                       if (PointOnBound(hh, CameraX, CameraZ, ox, oz, LandY, MObjects[ob].bound, ((FMap[ccz+z][ccx+x] >> 2) & 3)  ) )\r
+                               if (h < LandY + hh) h = LandY + hh;\r
+               } else {\r
+                if (MObjects[ob].info.flags & ofCIRCLE)\r
+                  r = (float) sqrt( (ox-CameraX)*(ox-CameraX) + (oz-CameraZ)*(oz-CameraZ) );\r
+                else\r
+                  r = (float) max( fabs(ox-CameraX) , fabs(oz-CameraZ) );\r
+                \r
+                if (r<CR) h = MObjects[ob].info.YHi + LandY;\r
+               }\r
+        \r
+   }\r
+  return h;\r
+}\r
+\r
+\r
+float GetLandHObj(float CameraX, float CameraZ)\r
+{\r
+   float h;   \r
+\r
+   h = 0;\r
+\r
+   int ccx = (int)CameraX / 256;\r
+   int ccz = (int)CameraZ / 256;\r
+\r
+   for (int z=-3; z<=3; z++)\r
+    for (int x=-3; x<=3; x++) \r
+      if (OMap[ccz+z][ccx+x]!=255) {\r
+        int ob = OMap[ccz+z][ccx+x];\r
+        float CR = (float)MObjects[ob].info.Radius - 1.f;\r
+        \r
+        float oz = (ccz+z) * 256.f + 128.f;\r
+        float ox = (ccx+x) * 256.f + 128.f;\r
+\r
+        if (MObjects[ob].info.YHi + GetLandOH(ccx+x, ccz+z) < h) continue;\r
+        if (MObjects[ob].info.YLo + GetLandOH(ccx+x, ccz+z) > PlayerY+256) continue;\r
+        float r;\r
+               if (MObjects[ob].info.flags & ofCIRCLE)                 \r
+                 r = (float) sqrt( (ox-CameraX)*(ox-CameraX) + (oz-CameraZ)*(oz-CameraZ) );\r
+               else\r
+                 r = (float) max( fabs(ox-CameraX) , fabs(oz-CameraZ) );\r
+\r
+        if (r<CR) \r
+            h = MObjects[ob].info.YHi + GetLandOH(ccx+x, ccz+z);\r
+   }\r
+\r
+  return h;\r
+}\r
+\r
+\r
+float GetLandQHNoObj(float CameraX, float CameraZ)\r
+{\r
+  float h,hh;\r
+  \r
+   h = GetLandH(CameraX, CameraZ);\r
+   hh = GetLandH(CameraX-90.f, CameraZ-90.f); if (hh>h) h=hh;\r
+   hh = GetLandH(CameraX+90.f, CameraZ-90.f); if (hh>h) h=hh;\r
+   hh = GetLandH(CameraX-90.f, CameraZ+90.f); if (hh>h) h=hh; \r
+   hh = GetLandH(CameraX+90.f, CameraZ+90.f); if (hh>h) h=hh;\r
+\r
+   hh = GetLandH(CameraX+128.f, CameraZ); if (hh>h) h=hh;\r
+   hh = GetLandH(CameraX-128.f, CameraZ); if (hh>h) h=hh;\r
+   hh = GetLandH(CameraX, CameraZ+128.f); if (hh>h) h=hh;\r
+   hh = GetLandH(CameraX, CameraZ-128.f); if (hh>h) h=hh;\r
+   \r
+   return h;\r
+}\r
+\r
+\r
+void ProcessCommandLine()\r
+{\r
+  for (int a=0; a<__argc; a++) {\r
+     LPSTR s = __argv[a];\r
+     if (strstr(s,"x=")) { PlayerX = (float)atof(&s[2])*256.f; LockLanding = TRUE; }\r
+     if (strstr(s,"y=")) { PlayerZ = (float)atof(&s[2])*256.f; LockLanding = TRUE; }          \r
+        if (strstr(s,"reg=")) TrophyRoom.RegNumber = atoi(&s[4]); \r
+     if (strstr(s,"prj=")) strcpy(ProjectName, (s+4)); \r
+        if (strstr(s,"din=")) TargetDino = (atoi(&s[4])*1024);\r
+        if (strstr(s,"wep=")) WeaponPres = atoi(&s[4]);         \r
+        if (strstr(s,"dtm=")) OptDayNight  = atoi(&s[4]);\r
+\r
+        if (strstr(s,"-debug"))   DEBUG = TRUE;\r
+        if (strstr(s,"-double"))  DoubleAmmo = TRUE;\r
+        if (strstr(s,"-radar"))   RadarMode = TRUE;\r
+        if (strstr(s,"-tranq")) Tranq = TRUE;\r
+        if (strstr(s,"-observ")) ObservMode = TRUE;\r
+  } \r
+}\r
+\r
+\r
+\r
+\r
+void AddWCircle(float x, float z, float scale)\r
+{\r
+   WCircles[WCCount].pos.x = x;\r
+   WCircles[WCCount].pos.z = z;\r
+   WCircles[WCCount].pos.y = GetLandUpH(x, z);\r
+   WCircles[WCCount].FTime = 0;   \r
+   WCircles[WCCount].scale = scale;\r
+   WCCount++;\r
+}\r
+\r
+\r
+void AddShipTask(int cindex)\r
+{\r
+  TCharacter *cptr = &Characters[cindex];\r
+\r
+  BOOL TROPHYON  = (GetLandUpH(cptr->pos.x, cptr->pos.z) - GetLandH(cptr->pos.x, cptr->pos.z) < 100) && \r
+                      (!Tranq);\r
+\r
+  if (TROPHYON) {\r
+     ShipTask.clist[ShipTask.tcount] = cindex;\r
+     ShipTask.tcount++;\r
+        AddVoicev(ShipModel.SoundFX[3].length,\r
+                      ShipModel.SoundFX[3].lpData, 256);\r
+  }\r
+\r
+  //===== trophy =======//\r
+  SYSTEMTIME st;\r
+  GetLocalTime(&st);\r
+  int t=0;\r
+  for (t=0; t<23; t++)\r
+         if (!TrophyRoom.Body[t].ctype) break;\r
+\r
+  float score = (float)DinoInfo[Characters[cindex].CType].BaseScore;\r
+\r
+  if (TrophyRoom.Last.success>1)\r
+         score*=(1.f + TrophyRoom.Last.success / 10.f);\r
+\r
+  if (!(TargetDino & (1<<Characters[cindex].AI)) ) score/=2.f;\r
+\r
+  if (Tranq    ) score *= 1.25f;\r
+  if (RadarMode) score *= 0.70f;\r
+  if (ScentMode) score *= 0.80f;\r
+  if (CamoMode ) score *= 0.85f;\r
+  TrophyRoom.Score+=(int)score;\r
+\r
+\r
+  if (!Tranq) {\r
+   TrophyTime = 20 * 1000;  \r
+   TrophyBody = t;  \r
+   TrophyRoom.Body[t].ctype  = Characters[cindex].CType;\r
+   TrophyRoom.Body[t].scale  = Characters[cindex].scale;\r
+   TrophyRoom.Body[t].weapon = CurrentWeapon;\r
+   TrophyRoom.Body[t].score  = (int)score;\r
+   TrophyRoom.Body[t].phase  = (RealTime & 3);\r
+   TrophyRoom.Body[t].time = (st.wHour<<10) + st.wMinute;\r
+   TrophyRoom.Body[t].date = (st.wYear<<20) + (st.wMonth<<10) + st.wDay;\r
+   TrophyRoom.Body[t].range = VectorLength( SubVectors(Characters[cindex].pos, PlayerPos) ) / 64.f;\r
+   PrintLog("Trophy added: ");\r
+   PrintLog(DinoInfo[Characters[cindex].CType].Name);\r
+   PrintLog("\n");\r
+  }  \r
+}\r
+\r
+\r
+\r
+void InitShip(int cindex)\r
+{\r
+       TCharacter *cptr = &Characters[cindex];\r
+\r
+       Ship.DeltaY = 2048.f + DinoInfo[cptr->CType].ShDelta * cptr->scale;\r
+\r
+       Ship.pos.x = PlayerX - 90*256; \r
+       if (Ship.pos.x < 256) Ship.pos.x = PlayerX + 90*256; \r
+       Ship.pos.z = PlayerZ - 90*256;\r
+       if (Ship.pos.z < 256) Ship.pos.z = PlayerZ + 90*256; \r
+       Ship.pos.y = GetLandUpH(Ship.pos.x, Ship.pos.z)  + Ship.DeltaY + 1024;\r
+\r
+       Ship.tgpos.x = cptr->pos.x;\r
+       Ship.tgpos.z = cptr->pos.z;\r
+    Ship.tgpos.y = GetLandUpH(Ship.tgpos.x, Ship.tgpos.z)  + Ship.DeltaY;\r
+       Ship.State = 0;\r
+\r
+       Ship.retpos = Ship.pos;\r
+       Ship.cindex = cindex;\r
+       Ship.FTime = 0;\r
+}\r
+\r
+\r
+\r
+void HideWeapon()\r
+{\r
+  TWeapon *wptr = &Weapon;\r
+  if (UNDERWATER && !wptr->state) return;\r
+  if (ObservMode || TrophyMode) return;\r
+  \r
+  if (wptr->state == 0) {   \r
+         if (!ShotsLeft[CurrentWeapon]) return;\r
+         if (WeapInfo[CurrentWeapon].Optic) OPTICMODE = TRUE;\r
+      AddVoicev(wptr->chinfo[CurrentWeapon].SoundFX[0].length,\r
+                wptr->chinfo[CurrentWeapon].SoundFX[0].lpData, 256);\r
+      wptr->FTime = 0;\r
+      wptr->state = 1;\r
+         BINMODE = FALSE;\r
+         MapMode = FALSE;\r
+         wptr->shakel = 0.2f;\r
+      return;\r
+  }\r
+\r
+  if (wptr->state!=2 || wptr->FTime!=0) return;\r
+  AddVoicev(wptr->chinfo[CurrentWeapon].SoundFX[2].length,\r
+            wptr->chinfo[CurrentWeapon].SoundFX[2].lpData, 256);\r
+  wptr->state = 3;\r
+  wptr->FTime = 0;\r
+  OPTICMODE = FALSE;\r
+  return ;\r
+}\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+void InitGameInfo()\r
+{\r
+       for (int c=0; c<32; c++) {\r
+               DinoInfo[c].Scale0 = 800;\r
+               DinoInfo[c].ScaleA = 600;\r
+               DinoInfo[c].ShDelta = 0;\r
+       }\r
+/*\r
+    WeapInfo[0].Name = "Shotgun";\r
+       WeapInfo[0].Power = 1.5f;\r
+       WeapInfo[0].Prec  = 1.1f;\r
+       WeapInfo[0].Loud  = 0.3f;\r
+       WeapInfo[0].Rate  = 1.6f;\r
+       WeapInfo[0].Shots = 6;\r
+\r
+       WeapInfo[1].Name = "X-Bow";\r
+       WeapInfo[1].Power = 1.1f;\r
+       WeapInfo[1].Prec  = 0.7f;\r
+       WeapInfo[1].Loud  = 1.9f;\r
+       WeapInfo[1].Rate  = 1.2f;\r
+       WeapInfo[1].Shots = 8;\r
+\r
+    WeapInfo[2].Name = "Sniper Rifle";\r
+       WeapInfo[2].Power = 1.0f;\r
+       WeapInfo[2].Prec  = 1.8f;\r
+       WeapInfo[2].Loud  = 0.6f;\r
+       WeapInfo[2].Rate  = 1.0f;\r
+       WeapInfo[2].Shots = 6;\r
+\r
+\r
+       \r
+       \r
+       DinoInfo[ 0].Name = "Moschops";\r
+       DinoInfo[ 0].Health0 = 2;\r
+       DinoInfo[ 0].Mass = 0.15f;\r
+\r
+    DinoInfo[ 1].Name = "Galimimus";\r
+       DinoInfo[ 1].Health0 = 2;\r
+       DinoInfo[ 1].Mass = 0.1f;\r
+\r
+       DinoInfo[ 2].Name = "Dimorphodon";\r
+    DinoInfo[ 2].Health0 = 1;\r
+       DinoInfo[ 2].Mass = 0.05f;\r
+\r
+       DinoInfo[ 3].Name = "Dimetrodon";\r
+    DinoInfo[ 3].Health0 = 2;\r
+       DinoInfo[ 3].Mass = 0.22f;      \r
+\r
+\r
+       DinoInfo[ 5].Name = "Parasaurolophus";\r
+       DinoInfo[ 5].Mass = 1.5f;\r
+       DinoInfo[ 5].Length = 5.8f;\r
+       DinoInfo[ 5].Radius = 320.f;\r
+       DinoInfo[ 5].Health0 = 5;\r
+       DinoInfo[ 5].BaseScore = 6;\r
+       DinoInfo[ 5].SmellK = 0.8f; DinoInfo[ 4].HearK = 1.f; DinoInfo[ 4].LookK = 0.4f;\r
+       DinoInfo[ 5].ShDelta = 48;\r
+\r
+       DinoInfo[ 6].Name = "Pachycephalosaurus";\r
+       DinoInfo[ 6].Mass = 0.8f;\r
+       DinoInfo[ 6].Length = 4.5f;\r
+       DinoInfo[ 6].Radius = 280.f;\r
+       DinoInfo[ 6].Health0 = 4;\r
+       DinoInfo[ 6].BaseScore = 8;\r
+       DinoInfo[ 6].SmellK = 0.4f; DinoInfo[ 5].HearK = 0.8f; DinoInfo[ 5].LookK = 0.6f;\r
+       DinoInfo[ 6].ShDelta = 36;\r
+\r
+       DinoInfo[ 7].Name = "Stegosaurus";\r
+    DinoInfo[ 7].Mass = 7.f;\r
+       DinoInfo[ 7].Length = 7.f;\r
+       DinoInfo[ 7].Radius = 480.f;\r
+       DinoInfo[ 7].Health0 = 5;\r
+       DinoInfo[ 7].BaseScore = 7;\r
+       DinoInfo[ 7].SmellK = 0.4f; DinoInfo[ 6].HearK = 0.8f; DinoInfo[ 6].LookK = 0.6f;\r
+       DinoInfo[ 7].ShDelta = 128;\r
+\r
+       DinoInfo[ 8].Name = "Allosaurus";\r
+       DinoInfo[ 8].Mass = 0.5;\r
+       DinoInfo[ 8].Length = 4.2f;\r
+       DinoInfo[ 8].Radius = 256.f;\r
+       DinoInfo[ 8].Health0 = 3;\r
+       DinoInfo[ 8].BaseScore = 12;\r
+       DinoInfo[ 8].Scale0 = 1000;\r
+       DinoInfo[ 8].ScaleA = 600;\r
+       DinoInfo[ 8].SmellK = 1.0f; DinoInfo[ 7].HearK = 0.3f; DinoInfo[ 7].LookK = 0.5f;\r
+       DinoInfo[ 8].ShDelta = 32;\r
+       DinoInfo[ 8].DangerCall = TRUE;\r
+\r
+       DinoInfo[ 9].Name = "Chasmosaurus";\r
+       DinoInfo[ 9].Mass = 3.f;\r
+       DinoInfo[ 9].Length = 5.0f;\r
+       DinoInfo[ 9].Radius = 400.f;    \r
+       DinoInfo[ 9].Health0 = 8;\r
+       DinoInfo[ 9].BaseScore = 9;\r
+       DinoInfo[ 9].SmellK = 0.6f; DinoInfo[ 8].HearK = 0.5f; DinoInfo[ 8].LookK = 0.4f;\r
+       //DinoInfo[ 8].ShDelta = 148;\r
+       DinoInfo[ 9].ShDelta = 108;\r
+\r
+       DinoInfo[10].Name = "Velociraptor";\r
+       DinoInfo[10].Mass = 0.3f;\r
+       DinoInfo[10].Length = 4.0f;\r
+       DinoInfo[10].Radius = 256.f;\r
+       DinoInfo[10].Health0 = 3;\r
+       DinoInfo[10].BaseScore = 16;\r
+       DinoInfo[10].ScaleA = 400;\r
+       DinoInfo[10].SmellK = 1.0f; DinoInfo[ 9].HearK = 0.5f; DinoInfo[ 9].LookK = 0.4f;\r
+       DinoInfo[10].ShDelta =-24;\r
+       DinoInfo[10].DangerCall = TRUE;\r
+\r
+       DinoInfo[11].Name = "T-Rex";\r
+    DinoInfo[11].Mass = 6.f;\r
+       DinoInfo[11].Length = 12.f;\r
+       DinoInfo[11].Radius = 400.f;\r
+       DinoInfo[11].Health0 = 1024;\r
+       DinoInfo[11].BaseScore = 20;\r
+       DinoInfo[11].SmellK = 0.85f; DinoInfo[10].HearK = 0.8f; DinoInfo[10].LookK = 0.8f;\r
+       DinoInfo[11].ShDelta = 168;\r
+       DinoInfo[11].DangerCall = TRUE;\r
+\r
+       DinoInfo[ 4].Name = "Brahiosaurus";\r
+    DinoInfo[ 4].Mass = 9.f;\r
+       DinoInfo[ 4].Length = 12.f;\r
+       DinoInfo[ 4].Radius = 400.f;\r
+       DinoInfo[ 4].Health0 = 1024;\r
+       DinoInfo[ 4].BaseScore = 0;\r
+       DinoInfo[ 4].SmellK = 0.85f; DinoInfo[16].HearK = 0.8f; DinoInfo[16].LookK = 0.8f;\r
+       DinoInfo[ 4].ShDelta = 168;\r
+       DinoInfo[ 4].DangerCall = FALSE;\r
+*/\r
+       LoadResourcesScript();\r
+}\r
+\r
+\r
+\r
+\r
+void InitEngine()\r
+{\r
+    //DEBUG        = TRUE;\r
+\r
+       WATERANI     = TRUE;\r
+       NODARKBACK   = TRUE;\r
+    LoDetailSky  = TRUE;\r
+    CORRECTION   = TRUE;\r
+       FOGON        = TRUE;\r
+       FOGENABLE    = TRUE;\r
+    Clouds       = TRUE;   \r
+    SKY          = TRUE;\r
+    GOURAUD      = TRUE;   \r
+    MODELS       = TRUE;\r
+    TIMER        = DEBUG;\r
+    BITMAPP      = FALSE;\r
+    MIPMAP       = TRUE;\r
+    NOCLIP       = FALSE;\r
+    CLIP3D       = TRUE;\r
+\r
+    \r
+    SLOW         = FALSE;\r
+       LOWRESTX     = FALSE;\r
+    MORPHP       = TRUE;\r
+    MORPHA       = TRUE;\r
+\r
+       _GameState = 0;\r
+\r
+       RadarMode    = FALSE;\r
+\r
+       fnt_BIG = CreateFont(\r
+        23, 10, 0, 0,\r
+        600, 0,0,0,\r
+#ifdef __rus\r
+               RUSSIAN_CHARSET,                \r
+#else\r
+        ANSI_CHARSET,\r
+#endif                         \r
+        OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, NULL);     \r
+\r
+\r
+\r
+\r
+    fnt_Small = CreateFont(\r
+        14, 5, 0, 0,\r
+        100, 0,0,0,\r
+#ifdef __rus\r
+               RUSSIAN_CHARSET,                \r
+#else\r
+        ANSI_CHARSET,\r
+#endif                 \r
+        OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, NULL);     \r
+\r
+\r
+    fnt_Midd  = CreateFont(\r
+        16, 7, 0, 0,\r
+        550, 0,0,0,\r
+#ifdef __rus\r
+               RUSSIAN_CHARSET,                \r
+#else\r
+        ANSI_CHARSET,\r
+#endif                 \r
+        OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, NULL);     \r
+\r
+\r
+    Heap = HeapCreate( 0, 60000000, 64000000 );\r
+    if( Heap == NULL ) {\r
+      MessageBox(hwndMain,"Error creating heap.","Error",IDOK);     \r
+      return; }\r
+\r
+    Textures[255] = (TEXTURE*) _HeapAlloc(Heap, 0, sizeof(TEXTURE));\r
+\r
+    WaterR = 10;\r
+    WaterG = 38;\r
+    WaterB = 46;\r
+    WaterA = 10;\r
+       TargetDino = 1<<10;\r
+       TargetCall = 10;\r
+       WeaponPres = 1;\r
+    MessageList.timeleft = 0;\r
+\r
+       InitGameInfo();    \r
+               \r
+    CreateVideoDIB();\r
+    CreateFadeTab();   \r
+    CreateDivTable();\r
+    InitClips();\r
+   \r
+    TrophyRoom.RegNumber=0;\r
+       \r
+    PlayerX = (ctMapSize / 3) * 256;\r
+       PlayerZ = (ctMapSize / 3) * 256;    \r
+\r
+    ProcessCommandLine();\r
+       \r
+\r
+    switch (OptDayNight) {\r
+   case 0:\r
+          SunShadowK = 0.7f;\r
+          Sun3dPos.x = - 4048;\r
+       Sun3dPos.y = + 2048;\r
+       Sun3dPos.z = - 4048;\r
+          break;\r
+   case 1:\r
+          SunShadowK = 0.5f;\r
+          Sun3dPos.x = - 2048;\r
+       Sun3dPos.y = + 4048;\r
+       Sun3dPos.z = - 2048;\r
+          break;\r
+   case 2:\r
+          SunShadowK = -0.7f;\r
+          Sun3dPos.x = + 3048;\r
+       Sun3dPos.y = + 3048;\r
+       Sun3dPos.z = + 3048;\r
+          break;\r
+   }\r
+\r
+       LoadTrophy();\r
+       \r
+       ProcessCommandLine();    \r
+\r
+       \r
+       \r
+    \r
+    //ctViewR  = 72;\r
+       //ctViewR1 = 28;\r
+       //ctViewRM = 24;\r
+       ctViewR  = 42 + (int)(OptViewR / 8)*2;\r
+       ctViewR1 = 28;\r
+       ctViewRM = 24;\r
+       \r
+    Soft_Persp_K = 1.5f;\r
+    HeadY = 220;\r
+\r
+       FogsList[0].fogRGB = 0x000000;\r
+       FogsList[0].YBegin = 0;\r
+       FogsList[0].Transp = 000;\r
+       FogsList[0].FLimit = 000;\r
+\r
+       FogsList[127].fogRGB = 0x00504000;\r
+    FogsList[127].Mortal = FALSE;\r
+       FogsList[127].Transp = 460;\r
+       FogsList[127].FLimit = 200;\r
+\r
+       FillMemory( FogsMap, sizeof(FogsMap), 0);\r
+       PrintLog("Init Engine: Ok.\n");\r
+}\r
+\r
+\r
+\r
+\r
+\r
+void ShutDownEngine()\r
+{\r
+   ReleaseDC(hwndMain,hdcMain);   \r
+}\r
+\r
+\r
+\r
+void ProcessSyncro()\r
+{\r
+   RealTime = timeGetTime();\r
+   srand( (unsigned) RealTime );\r
+   if (SLOW) RealTime/=4;\r
+   TimeDt = RealTime - PrevTime;\r
+   if (TimeDt<0) TimeDt = 10;\r
+   if (TimeDt>10000) TimeDt = 10;\r
+   if (TimeDt>1000) TimeDt = 1000;\r
+   PrevTime = RealTime;\r
+   Takt++;\r
+   if (!PAUSE)\r
+    if (MyHealth) MyHealth+=TimeDt*4;\r
+   if (MyHealth>MAX_HEALTH) MyHealth = MAX_HEALTH;   \r
+}\r
+\r
+\r
+\r
+\r
+\r
+\r
+void AddBloodTrail(TCharacter *cptr)\r
+{\r
+       if (BloodTrail.Count>508) {\r
+         memcpy(&BloodTrail.Trail[0], &BloodTrail.Trail[1], 510*sizeof(TBloodP));\r
+         BloodTrail.Count--;\r
+       }\r
+    BloodTrail.Trail[BloodTrail.Count].LTime = 210000;\r
+    BloodTrail.Trail[BloodTrail.Count].pos = cptr->pos;\r
+       BloodTrail.Trail[BloodTrail.Count].pos.x+=siRand(32);\r
+       BloodTrail.Trail[BloodTrail.Count].pos.z+=siRand(32);\r
+       BloodTrail.Trail[BloodTrail.Count].pos.y = \r
+               GetLandH(BloodTrail.Trail[BloodTrail.Count].pos.x,\r
+                        BloodTrail.Trail[BloodTrail.Count].pos.z)+4;\r
+       BloodTrail.Count++;\r
+}\r
+\r
+\r
+\r
+\r
+\r
+void MakeCall()\r
+{\r
+   if (!TargetDino) return;\r
+   if (UNDERWATER) return;\r
+   if (ObservMode || TrophyMode) return;\r
+   if (CallLockTime) return;\r
+   \r
+   CallLockTime=1024*3;\r
+   \r
+   NextCall+=(RealTime % 2)+1;\r
+   NextCall%=3;\r
+\r
+   AddVoicev(fxCall[TargetCall-10][NextCall].length,  \r
+                fxCall[TargetCall-10][NextCall].lpData, 256);\r
+\r
+   float dmin = 512*256;\r
+   int ai = -1;\r
+\r
+   for (int c=0; c<ChCount; c++) {\r
+        TCharacter *cptr = &Characters[c];\r
+\r
+        if (DinoInfo[AI_to_CIndex[TargetCall] ].DangerCall)\r
+                if (cptr->AI<10) {\r
+                        cptr->State=2;\r
+                        cptr->AfraidTime = (10 + rRand(5)) * 1024; \r
+                }\r
+\r
+        if (cptr->AI!=TargetCall) continue;\r
+        if (cptr->AfraidTime) continue;\r
+        if (cptr->State) continue;\r
+\r
+        float d = VectorLength(SubVectors(PlayerPos, cptr->pos));\r
+        if (d < ctViewR * 400) {\r
+         if (rRand(128) > 32)\r
+           if (d<dmin) { dmin = d; ai = c; }\r
+         cptr->tgx = PlayerX + siRand(1800);\r
+         cptr->tgz = PlayerZ + siRand(1800);\r
+        }\r
+   }\r
+\r
+   if (ai!=-1) {\r
+          answpos = SubVectors(Characters[ai].pos, PlayerPos);\r
+       answpos.x/=-3.f; answpos.y/=-3.f; answpos.z/=-3.f;\r
+       answpos = SubVectors(PlayerPos, answpos);\r
+          answtime = 2000 + rRand(2000);          \r
+          answcall = TargetCall;\r
+   }\r
+                     \r
+}\r
+\r
+\r
+\r
+DWORD ColorSum(DWORD C1, DWORD C2) \r
+{\r
+       DWORD R,G,B;\r
+       R = min(255, ((C1>> 0) & 0xFF) + ((C2>> 0) & 0xFF));\r
+       G = min(255, ((C1>> 8) & 0xFF) + ((C2>> 8) & 0xFF));\r
+       B = min(255, ((C1>>16) & 0xFF) + ((C2>>16) & 0xFF));\r
+       return R + (G<<8) + (B<<16);\r
+}\r
+\r
+\r
+#define partBlood   1\r
+#define partWater   2\r
+#define partGround  3\r
+#define partBubble  4\r
+\r
+void AddElements(float x, float y, float z, int etype, int cnt)\r
+{\r
+       if (ElCount > 30) {\r
+               memcpy(&Elements[0], &Elements[1], (ElCount-1) * sizeof(TElements));\r
+               ElCount--;\r
+       }\r
+\r
+       Elements[ElCount].EDone  = 0;\r
+       Elements[ElCount].Type = etype;\r
+       Elements[ElCount].ECount = min(30, cnt);\r
+       int c;\r
+\r
+       switch (etype) {\r
+       case partBlood:         \r
+#ifdef _d3d\r
+               Elements[ElCount].RGBA = 0xE0600000;\r
+           Elements[ElCount].RGBA2= 0x20300000;            \r
+#else\r
+               Elements[ElCount].RGBA = 0xE0000060;\r
+           Elements[ElCount].RGBA2= 0x20000030;                \r
+#endif\r
+               break;\r
+\r
+       case partGround:                \r
+#ifdef _d3d\r
+           Elements[ElCount].RGBA = 0xF0F09E55;\r
+           Elements[ElCount].RGBA2= 0x10F09E55;\r
+#else\r
+           Elements[ElCount].RGBA = 0xF0559EF0;\r
+           Elements[ElCount].RGBA2= 0x10559EF0;\r
+#endif\r
+               break;\r
+\r
+\r
+    case partBubble:           \r
+               c = WaterList[ WMap[ (int)z / 256][ (int)x / 256] ].fogRGB;\r
+#ifdef _d3d\r
+               c = ColorSum( ((c & 0xFEFEFE)>>1) , 0x152020);\r
+#else\r
+               c = ColorSum( ((c & 0xFEFEFE)>>1) , 0x202015);\r
+#endif\r
+               Elements[ElCount].RGBA = 0x70000000 + (ColorSum(c, ColorSum(c,c)));\r
+           Elements[ElCount].RGBA2= 0x40000000 + (ColorSum(c, c));             \r
+               break;\r
+\r
+    case partWater:\r
+               c = WaterList[ WMap[ (int)z / 256][ (int)x / 256] ].fogRGB;\r
+#ifdef _d3d\r
+               c = ColorSum( ((c & 0xFEFEFE)>>1) , 0x152020);\r
+#else\r
+               c = ColorSum( ((c & 0xFEFEFE)>>1) , 0x202015);\r
+#endif                 \r
+               Elements[ElCount].RGBA  = 0xB0000000 + ( ColorSum(c, ColorSum(c,c)) );\r
+               Elements[ElCount].RGBA2 = 0x40000000 + (c);             \r
+               break;\r
+       }\r
+                       \r
+       Elements[ElCount].RGBA  = conv_xGx(Elements[ElCount].RGBA);\r
+    Elements[ElCount].RGBA2 = conv_xGx(Elements[ElCount].RGBA2);       \r
+               \r
+       float al = siRand(128) / 128.f * pi / 4.f;\r
+       float ss = f_sin(al);\r
+       float cc = f_cos(al);\r
+\r
+       for (int e=0; e<Elements[ElCount].ECount; e++) {\r
+               Elements[ElCount].EList[e].pos.x = x;\r
+               Elements[ElCount].EList[e].pos.y = y;\r
+               Elements[ElCount].EList[e].pos.z = z;\r
+               Elements[ElCount].EList[e].R = 6 + rRand(5);\r
+               Elements[ElCount].EList[e].Flags = 0;\r
+               float v;\r
+\r
+               switch (etype) {\r
+              case partBlood:\r
+                               v = e * 6 + rRand(96) + 220;\r
+                               Elements[ElCount].EList[e].speed.x =ss*ca*v + siRand(32);\r
+                               Elements[ElCount].EList[e].speed.y =cc * (v * 3);\r
+                               Elements[ElCount].EList[e].speed.z =ss*sa*v + siRand(32);               \r
+                               break;\r
+                  case partGround:\r
+                           Elements[ElCount].EList[e].speed.x =siRand(52)-sa*64;\r
+                               Elements[ElCount].EList[e].speed.y =rRand(100) + 600 + e * 20;\r
+                               Elements[ElCount].EList[e].speed.z =siRand(52)+ca*64;\r
+                               break;\r
+                  case partWater:\r
+                           Elements[ElCount].EList[e].speed.x =siRand(32);\r
+                               Elements[ElCount].EList[e].speed.y =rRand(80) + 400 +  e * 40;\r
+                               Elements[ElCount].EList[e].speed.z =siRand(32);         \r
+                               break;\r
+                  case partBubble:\r
+                           Elements[ElCount].EList[e].speed.x =siRand(40);\r
+                               Elements[ElCount].EList[e].speed.y =rRand(140) + 20;\r
+                               Elements[ElCount].EList[e].speed.z =siRand(40);         \r
+                               break;\r
+               }\r
+       }\r
+\r
+       ElCount++;\r
+}\r
+\r
+\r
+void MakeShot(float ax, float ay, float az,\r
+              float bx, float by, float bz)\r
+{\r
+  int sres;  \r
+  if (!WeapInfo[CurrentWeapon].Fall)\r
+   sres = TraceShot(ax, ay, az, bx, by, bz);\r
+  else {\r
+        Vector3d dl;\r
+        float dy = 40.f * ctViewR / 36.f;\r
+        dl.x = (bx-ax) / 3;\r
+        dl.y = (by-ay) / 3;\r
+        dl.z = (bz-az) / 3;\r
+        bx = ax + dl.x;\r
+        by = ay + dl.y - dy / 2;\r
+        bz = az + dl.z;\r
+        sres = TraceShot(ax, ay, az, bx, by, bz);\r
+        if (sres!=-1) goto ENDTRACE;\r
+        ax = bx; ay = by; az = bz;\r
+\r
+        bx = ax + dl.x;\r
+        by = ay + dl.y - dy * 3;\r
+        bz = az + dl.z;\r
+        sres = TraceShot(ax, ay, az, bx, by, bz);\r
+        if (sres!=-1) goto ENDTRACE;\r
+        ax = bx; ay = by; az = bz;\r
+\r
+        bx = ax + dl.x;\r
+        by = ay + dl.y - dy * 5;\r
+        bz = az + dl.z;\r
+        sres = TraceShot(ax, ay, az, bx, by, bz);\r
+        if (sres!=-1) goto ENDTRACE;\r
+        ax = bx; ay = by; az = bz;\r
+  }\r
+\r
+ENDTRACE:\r
+  if (sres==-1) return;  \r
+\r
+  int mort = (sres & 0xFF00) && (Characters[ShotDino].Health);\r
+  sres &= 0xFF;\r
+\r
+  if (sres == tresGround) \r
+         AddElements(bx, by, bz, partGround, 6 + WeapInfo[CurrentWeapon].Power*4);\r
+  if (sres == tresModel) \r
+         AddElements(bx, by, bz, partGround, 6 + WeapInfo[CurrentWeapon].Power*4);  \r
+\r
+    \r
+  if (sres == tresWater) {\r
+         AddElements(bx, by, bz, partWater, 4 + WeapInfo[CurrentWeapon].Power*3);  \r
+         //AddElements(bx, GetLandH(bx, bz), bz, partBubble);  \r
+         AddWCircle(bx, bz, 1.2);\r
+         AddWCircle(bx, bz, 1.2);\r
+  }\r
+\r
+  \r
+  if (sres!=tresChar) return;\r
+  AddElements(bx, by, bz, partBlood, 4 + WeapInfo[CurrentWeapon].Power*4);  \r
+  if (!Characters[ShotDino].Health) return;\r
+\r
+//======= character damage =========//\r
+  \r
+\r
+  if (mort) Characters[ShotDino].Health = 0; \r
+       else Characters[ShotDino].Health-=WeapInfo[CurrentWeapon].Power;\r
+  if (Characters[ShotDino].Health<0) Characters[ShotDino].Health=0;\r
+\r
+    \r
+   if (!Characters[ShotDino].Health) {          \r
+          if (Characters[ShotDino].AI>=10) {\r
+          TrophyRoom.Last.success++;\r
+          AddShipTask(ShotDino);          \r
+          }       \r
+\r
+        if (Characters[ShotDino].AI<10) \r
+            Characters_AddSecondaryOne(Characters[ShotDino].CType);\r
+        \r
+       }\r
+       else {\r
+        Characters[ShotDino].AfraidTime = 60*1000;\r
+        if (Characters[ShotDino].State==0)\r
+        Characters[ShotDino].State = 2;         \r
+        \r
+        Characters[ShotDino].BloodTTime+=90000;\r
+          \r
+       }   \r
+   \r
+}\r
+\r
+\r
+void RemoveCharacter(int index)\r
+{\r
+  if (index==-1) return;\r
+  memcpy( &Characters[index], &Characters[index+1], (255 - index) * sizeof(TCharacter) );\r
+  ChCount--;\r
+   \r
+  if (DemoPoint.CIndex > index) DemoPoint.CIndex--;\r
+\r
+  for (int c=0; c<ShipTask.tcount; c++) \r
+        if (ShipTask.clist[c]>index) ShipTask.clist[c]--;\r
+}\r
+\r
+\r
+void AnimateShip()\r
+{\r
+  if (Ship.State==-1) {\r
+         SetAmbient3d(0,0, 0,0,0);\r
+         if (!ShipTask.tcount) return; \r
+         InitShip(ShipTask.clist[0]);\r
+         memcpy(&ShipTask.clist[0], &ShipTask.clist[1], 250*4);\r
+         ShipTask.tcount--;\r
+         return;\r
+  }\r
+\r
+  SetAmbient3d(ShipModel.SoundFX[0].length, \r
+                  ShipModel.SoundFX[0].lpData, \r
+                          Ship.pos.x, Ship.pos.y, Ship.pos.z);\r
+\r
+  int _TimeDt = TimeDt;\r
+\r
+//====== get up/down time acceleration ===========//\r
+  if (Ship.FTime) {\r
+       int am = ShipModel.Animation[0].AniTime;\r
+       if (Ship.FTime < 500) _TimeDt = TimeDt * (Ship.FTime + 48) / 548;\r
+    if (am-Ship.FTime < 500) _TimeDt = TimeDt * (am-Ship.FTime + 48) / 548;\r
+       if (_TimeDt<2) _TimeDt=2;\r
+  }\r
+//===================================\r
+\r
+  float L  = VectorLength( SubVectors(Ship.tgpos, Ship.pos) );  \r
+  float L2 = sqrt ( (Ship.tgpos.x - Ship.pos.x) * (Ship.tgpos.x - Ship.pos.x) +\r
+                       (Ship.tgpos.x - Ship.pos.x) * (Ship.tgpos.x - Ship.pos.x) );\r
+\r
+  Ship.pos.y+=0.3f*(float)f_cos(RealTime / 256.f);\r
+\r
+  \r
+\r
+  Ship.tgalpha    = FindVectorAlpha(Ship.tgpos.x - Ship.pos.x, Ship.tgpos.z - Ship.pos.z);\r
+  float currspeed;\r
+  float dalpha = (float)fabs(Ship.tgalpha - Ship.alpha); \r
+  float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd; \r
+\r
+\r
+//====== fly more away if I near =============//\r
+  if (Ship.State)\r
+   if (Ship.speed>1)\r
+   if (L<4000)\r
+       if (VectorLength(SubVectors(PlayerPos, Ship.pos))<(ctViewR+2)*256) {\r
+               Ship.tgpos.x += (float)f_cos(Ship.alpha) * 256*6.f;\r
+               Ship.tgpos.z += (float)f_sin(Ship.alpha) * 256*6.f;\r
+               Ship.tgpos.y = GetLandUpH(Ship.tgpos.x, Ship.tgpos.z) + Ship.DeltaY;            \r
+        Ship.tgpos.y = max(Ship.tgpos.y, GetLandUpH(Ship.pos.x, Ship.pos.z) + Ship.DeltaY);\r
+       }\r
+//==============================//\r
+\r
+\r
+\r
+//========= animate down ==========//\r
+  if (Ship.State==3) {\r
+       Ship.FTime+=_TimeDt;\r
+       if (Ship.FTime>=ShipModel.Animation[0].AniTime) {\r
+         Ship.FTime=ShipModel.Animation[0].AniTime-1;\r
+      Ship.State=2;\r
+         AddVoicev(ShipModel.SoundFX[4].length,\r
+                      ShipModel.SoundFX[4].lpData, 256);\r
+         AddVoice3d(ShipModel.SoundFX[1].length, ShipModel.SoundFX[1].lpData,\r
+                       Ship.pos.x, Ship.pos.y, Ship.pos.z);   \r
+       }\r
+       return;\r
+  }\r
+\r
+  \r
+//========= get body on board ==========//\r
+  if (Ship.State) {\r
+         if (Ship.cindex!=-1) {\r
+           DeltaFunc(Characters[Ship.cindex].pos.y, Ship.pos.y-650 - (Ship.DeltaY-2048), _TimeDt / 3.f);\r
+           DeltaFunc(Characters[Ship.cindex].beta,  0, TimeDt / 4048.f);\r
+           DeltaFunc(Characters[Ship.cindex].gamma, 0, TimeDt / 4048.f);\r
+         }\r
+       \r
+       if (Ship.State==2) {\r
+         Ship.FTime-=_TimeDt;\r
+         if (Ship.FTime<0) Ship.FTime=0;\r
+\r
+         if (Ship.FTime==0)\r
+                 if (fabs(Characters[Ship.cindex].pos.y - (Ship.pos.y-650 - (Ship.DeltaY-2048))) < 1.f) {\r
+                     Ship.State = 1;                     \r
+                         AddVoicev(ShipModel.SoundFX[5].length,\r
+                              ShipModel.SoundFX[5].lpData, 256);\r
+                         AddVoice3d(ShipModel.SoundFX[2].length, ShipModel.SoundFX[2].lpData,\r
+                       Ship.pos.x, Ship.pos.y, Ship.pos.z);   \r
+                 }\r
+      return;\r
+       }\r
+  }\r
+//=====================================//\r
+\r
+  \r
+//====== speed ===============//  \r
+  float vspeed = 1.f + L / 128.f;\r
+  if (vspeed > 24) vspeed = 24;\r
+  if (Ship.State) vspeed = 24;\r
+  if (fabs(dalpha) > 0.4) vspeed = 0.f;\r
+  float _s = Ship.speed;\r
+  if (vspeed>Ship.speed) DeltaFunc(Ship.speed, vspeed, TimeDt / 200.f);\r
+                    else Ship.speed = vspeed;\r
+\r
+  if (Ship.speed>0 && _s==0) \r
+         AddVoice3d(ShipModel.SoundFX[2].length, ShipModel.SoundFX[2].lpData,\r
+                       Ship.pos.x, Ship.pos.y, Ship.pos.z);   \r
+\r
+//====== fly ===========//\r
+  float l = TimeDt * Ship.speed / 16.f;   \r
+  \r
+  if (fabs(dalpha) < 0.4)\r
+  if (l<L) {\r
+   if (l>L2) l = L2 * 0.5f;\r
+   if (L2<0.1) l = 0;\r
+   Ship.pos.x += (float)f_cos(Ship.alpha)*l;\r
+   Ship.pos.z += (float)f_sin(Ship.alpha)*l;\r
+  } else {   \r
+   if (Ship.State) {\r
+        Ship.State = -1;\r
+        RemoveCharacter(Ship.cindex);\r
+        return;\r
+   } else {\r
+        Ship.pos = Ship.tgpos;\r
+        Ship.State = 3;\r
+        Ship.FTime = 1;\r
+        Ship.tgpos = Ship.retpos;\r
+        Ship.tgpos.y = GetLandUpH(Ship.tgpos.x, Ship.tgpos.z) + Ship.DeltaY;           \r
+     Ship.tgpos.y = max(Ship.tgpos.y, GetLandUpH(Ship.pos.x, Ship.pos.z) + Ship.DeltaY);\r
+        Characters[Ship.cindex].StateF = 0xFF;  \r
+        AddVoice3d(ShipModel.SoundFX[1].length, ShipModel.SoundFX[1].lpData,\r
+                       Ship.pos.x, Ship.pos.y, Ship.pos.z);   \r
+   }\r
+  }\r
+\r
+//======= y movement ============//\r
+  float h = GetLandUpH(Ship.pos.x, Ship.pos.z);\r
+  DeltaFunc(Ship.pos.y, Ship.tgpos.y, TimeDt / 4.f);\r
+  if (Ship.pos.y < h + 1024) {\r
+         if (Ship.State)\r
+               if (Ship.cindex!=-1) \r
+             Characters[Ship.cindex].pos.y+= h + 1024 - Ship.pos.y;\r
+         Ship.pos.y = h + 1024;\r
+  }\r
+  \r
+  \r
+\r
+//======= rotation ============//\r
+  \r
+  if (Ship.tgalpha > Ship.alpha) currspeed = 0.1f + (float)fabs(drspd)/2.f;\r
+                            else currspeed =-0.1f - (float)fabs(drspd)/2.f;     \r
+                                                        \r
+  if (fabs(dalpha) > pi) currspeed=-currspeed;\r
+  \r
+         \r
+  DeltaFunc(Ship.rspeed, currspeed, (float)TimeDt / 420.f);\r
+  \r
+  float rspd=Ship.rspeed * TimeDt / 1024.f;\r
+  if (fabs(drspd) < fabs(rspd)) { Ship.alpha = Ship.tgalpha; Ship.rspeed/=2; }\r
+  else {\r
+       Ship.alpha+=rspd;\r
+       if (Ship.State) \r
+        if (Ship.cindex!=-1)\r
+               Characters[Ship.cindex].alpha+=rspd;\r
+  }\r
+\r
+  if (Ship.alpha<0) Ship.alpha+=pi*2;\r
+  if (Ship.alpha>pi*2) Ship.alpha-=pi*2;\r
+\r
+//======== move body ===========//\r
+  if (Ship.State) {\r
+         if (Ship.cindex!=-1) {\r
+          Characters[Ship.cindex].pos.x = Ship.pos.x;\r
+          Characters[Ship.cindex].pos.z = Ship.pos.z;\r
+         }\r
+        if (L>1000) Ship.tgpos.y+=TimeDt / 12.f;\r
+  } else {\r
+    Ship.tgpos.x = Characters[Ship.cindex].pos.x;\r
+       Ship.tgpos.z = Characters[Ship.cindex].pos.z;\r
+       Ship.tgpos.y = GetLandUpH(Ship.tgpos.x, Ship.tgpos.z) + Ship.DeltaY;            \r
+    Ship.tgpos.y = max(Ship.tgpos.y, GetLandUpH(Ship.pos.x, Ship.pos.z) + Ship.DeltaY);\r
+  }\r
+\r
+  \r
+  \r
+}\r
+\r
+\r
+\r
+void ProcessTrophy()\r
+{\r
+       TrophyBody = -1;\r
+\r
+       for (int c=0; c<ChCount; c++) {\r
+               Vector3d p = Characters[c].pos;\r
+               p.x+=Characters[c].lookx * 256*2.5f;\r
+               p.z+=Characters[c].lookz * 256*2.5f;\r
+\r
+               if (VectorLength( SubVectors(p, PlayerPos) ) < 148)\r
+                       TrophyBody = c;\r
+       }\r
+\r
+       if (TrophyBody==-1) return;\r
+\r
+       TrophyBody = Characters[TrophyBody].State;\r
+}\r
+\r
+\r
+\r
+void RespawnSnow(int s, BOOL rand)\r
+{\r
+  Snow[s].pos.x = PlayerX + siRand(12*256);\r
+  Snow[s].pos.z = PlayerZ + siRand(12*256);\r
+  Snow[s].hl = GetLandUpH(Snow[s].pos.x, Snow[s].pos.z);\r
+  Snow[s].ftime = 0;\r
+  if (rand) Snow[s].pos.y = Snow[s].hl + 256+rRand(12*256);\r
+       else Snow[s].pos.y = Snow[s].hl + (8+rRand(5))*256;\r
+}\r
+\r
+\r
+\r
+\r
+void AnimateElements()\r
+{      \r
+for (int eg=0; eg<ElCount; eg++) {     \r
+\r
+       if  (Elements[eg].Type == partGround)    {\r
+               int a1 = Elements[eg].RGBA >> 24; a1-=TimeDt/4; if (a1<0) a1=0; Elements[eg].RGBA = (Elements[eg].RGBA  & 0x00FFFFFF) + (a1<<24);\r
+               int a2 = Elements[eg].RGBA2>> 24; a2-=TimeDt/4; if (a2<0) a2=0; Elements[eg].RGBA2= (Elements[eg].RGBA2 & 0x00FFFFFF) + (a2<<24);\r
+               if (a1 == 0 && a2==0) Elements[eg].ECount = 0;\r
+       }\r
+\r
+       if  (Elements[eg].Type == partWater)\r
+         if (Elements[eg].EDone == Elements[eg].ECount)\r
+                Elements[eg].ECount = 0;\r
+\r
+       if  (Elements[eg].Type == partBubble)\r
+         if (Elements[eg].EDone == Elements[eg].ECount)\r
+                Elements[eg].ECount = 0;\r
+   \r
+       if  (Elements[eg].Type == partBlood)\r
+        if ((Takt & 3)==0)\r
+         if (Elements[eg].EDone == Elements[eg].ECount) {\r
+               int a1 = Elements[eg].RGBA >> 24; a1--; if (a1<0) a1=0; Elements[eg].RGBA = (Elements[eg].RGBA  & 0x00FFFFFF) + (a1<<24);\r
+               int a2 = Elements[eg].RGBA2>> 24; a2--; if (a2<0) a2=0; Elements[eg].RGBA2= (Elements[eg].RGBA2 & 0x00FFFFFF) + (a2<<24);\r
+               if (a1 == 0 && a2==0) Elements[eg].ECount = 0;          \r
+       }\r
+\r
+\r
+\r
+//====== remove finished process =========//\r
+       if (!Elements[eg].ECount) {\r
+               memcpy(&Elements[eg], &Elements[eg+1], (ElCount+1-eg) * sizeof(TElements));\r
+               ElCount--;\r
+               eg--;\r
+               continue;\r
+       }\r
+\r
+\r
+       for (int e=0; e<Elements[eg].ECount; e++) {\r
+          if (Elements[eg].EList[e].Flags) continue;                   \r
+       Elements[eg].EList[e].pos.x+=Elements[eg].EList[e].speed.x * TimeDt / 1000.f;\r
+          Elements[eg].EList[e].pos.y+=Elements[eg].EList[e].speed.y * TimeDt / 1000.f;\r
+          Elements[eg].EList[e].pos.z+=Elements[eg].EList[e].speed.z * TimeDt / 1000.f;\r
+\r
+          float h;        \r
+          h = GetLandUpH(Elements[eg].EList[e].pos.x, Elements[eg].EList[e].pos.z);\r
+          BOOL OnWater = GetLandH(Elements[eg].EList[e].pos.x, Elements[eg].EList[e].pos.z) < h;\r
+\r
+          switch (Elements[eg].Type) {\r
+          case partBubble:        \r
+            Elements[eg].EList[e].speed.y += 2.0 * 256 * TimeDt / 1000.f;\r
+                if (Elements[eg].EList[e].speed.y > 824) Elements[eg].EList[e].speed.y = 824;\r
+                if (Elements[eg].EList[e].pos.y > h) {           \r
+             AddWCircle(Elements[eg].EList[e].pos.x, Elements[eg].EList[e].pos.z, 0.6);\r
+                 Elements[eg].EDone++;\r
+                 Elements[eg].EList[e].Flags = 1;                \r
+                 if (OnWater) Elements[eg].EList[e].pos.y-= 10240;               \r
+                }\r
+                 break;\r
+          \r
+          default:        \r
+               Elements[eg].EList[e].speed.y -= 9.8 * 256 * TimeDt / 1000.f;      \r
+           if (Elements[eg].EList[e].pos.y < h) {                \r
+             if (OnWater) AddWCircle(Elements[eg].EList[e].pos.x, Elements[eg].EList[e].pos.z, 0.6);\r
+                 Elements[eg].EDone++;\r
+                 Elements[eg].EList[e].Flags = 1;                \r
+                 if (OnWater) Elements[eg].EList[e].pos.y-= 10240;\r
+                         else Elements[eg].EList[e].pos.y = h + 4;\r
+               }\r
+             break;\r
+               \r
+               } //== switch ==//\r
+\r
+                } // for(e) //\r
+          } // for(eg) //\r
+\r
+     for (int b=0; b<BloodTrail.Count; b++) {\r
+       BloodTrail.Trail[b].LTime-=TimeDt;\r
+          if (BloodTrail.Trail[b].LTime<=0) {\r
+                  memcpy(&BloodTrail.Trail[b], &BloodTrail.Trail[b+1], (511-b)*sizeof(TBloodP));\r
+                  BloodTrail.Count--;\r
+                  b--;\r
+          }\r
+        }\r
+\r
+        if (!SNOW) return;     \r
+        while (SnCount<2000) {\r
+                RespawnSnow(SnCount, TRUE);\r
+                SnCount++;\r
+        }\r
+\r
+     nv = Wind.nv;\r
+        NormVector(nv, (4+Wind.speed)*4*TimeDt/1000);\r
+\r
+        for (int s=0; s<SnCount; s++) {\r
+        \r
+          if ( (fabs(Snow[s].pos.x - PlayerX) > 14*256) ||\r
+                   (fabs(Snow[s].pos.z - PlayerZ) > 14*256) ) {\r
+                  Snow[s].pos.x = PlayerX + siRand(12*256);\r
+           Snow[s].pos.z = PlayerZ + siRand(12*256);\r
+                  Snow[s].pos.y = Snow[s].pos.y - Snow[s].hl;\r
+           Snow[s].hl = GetLandUpH(Snow[s].pos.x, Snow[s].pos.z);\r
+                  Snow[s].pos.y+=Snow[s].hl;\r
+          }\r
+\r
+          if (!Snow[s].ftime) {\r
+            float v = ( ((RealTime + s * 23) % 800) - 400) * TimeDt / 16000;\r
+            Snow[s].pos.x+=ca*v;\r
+            Snow[s].pos.z+=sa*v;\r
+          \r
+            Snow[s].pos = AddVectors(Snow[s].pos, nv);    \r
+            Snow[s].hl = GetLandUpH(Snow[s].pos.x, Snow[s].pos.z);\r
+                Snow[s].pos.y-=TimeDt*192/1000.f;  \r
+                if (Snow[s].pos.y < Snow[s].hl+8) {\r
+                        Snow[s].pos.y = Snow[s].hl+8;\r
+                        Snow[s].ftime = 1;\r
+                }\r
+          } else {\r
+                  Snow[s].ftime+=TimeDt;\r
+                  Snow[s].pos.y-=TimeDt*3/1000.f; \r
+                  if (Snow[s].ftime>2000)  RespawnSnow(s, FALSE);\r
+          }\r
+\r
+        }\r
+}\r
+\r
+\r
+void AnimateProcesses()\r
+{\r
+  AnimateElements();\r
+\r
+  if ((Takt & 63)==0)  {\r
+   float al2 = CameraAlpha + siRand(60) * pi / 180.f;\r
+   float c2 = f_cos(al2);\r
+   float s2 = f_sin(al2);\r
+   float l = 1024 + rRand(3120);\r
+   float xx = CameraX + s2 * l;\r
+   float zz = CameraZ - c2 * l;\r
+   if (GetLandUpH(xx,zz) > GetLandH(xx,zz)+256) \r
+         AddElements(xx, GetLandH(xx,zz), zz, 4, 6 + rRand(6));\r
+  }\r
+\r
+  if (Takt & 1) {\r
+   Wind.alpha+=siRand(16) / 4096.f;\r
+   Wind.speed+=siRand(400) / 6400.f;\r
+  }\r
+\r
+  if (Wind.speed< 4.f) Wind.speed=4.f;\r
+  if (Wind.speed>18.f) Wind.speed=18.f;\r
+\r
+  Wind.nv.x = (float) f_sin(Wind.alpha);\r
+  Wind.nv.z = (float)-f_cos(Wind.alpha);\r
+  Wind.nv.y = 0.f;\r
+\r
+\r
+  if (answtime) {\r
+         answtime-=TimeDt;\r
+         if (answtime<=0) {\r
+                 answtime = 0;\r
+                 int r = rRand(128) % 3;\r
+                 AddVoice3d(fxCall[answcall-10][r].length,  fxCall[answcall-10][r].lpData,\r
+                         answpos.x, answpos.y, answpos.z);                               \r
+         }\r
+  }\r
+\r
+\r
+\r
+  if (CallLockTime) {\r
+         CallLockTime-=TimeDt;\r
+         if (CallLockTime<0) CallLockTime=0;\r
+  }\r
+\r
+  CheckAfraid();\r
+  AnimateShip();\r
+  if (TrophyMode)\r
+      ProcessTrophy();\r
+         \r
+  for (int w=0; w<WCCount; w++) {\r
+         if (WCircles[w].scale > 1)\r
+        WCircles[w].FTime+=(int)(TimeDt*3 / WCircles[w].scale);\r
+         else\r
+               WCircles[w].FTime+=TimeDt*3;\r
+     if (WCircles[w].FTime >= 2000) {         \r
+       memcpy(&WCircles[w], &WCircles[w+1], sizeof(TWCircle) * (WCCount+1-w) );\r
+       w--;\r
+       WCCount--;\r
+     }\r
+  }\r
+\r
+\r
+\r
+  if (ExitTime) {\r
+       ExitTime-=TimeDt;\r
+       if (ExitTime<=0) {              \r
+        TrophyRoom.Total.time   +=TrophyRoom.Last.time;\r
+           TrophyRoom.Total.smade  +=TrophyRoom.Last.smade;\r
+               TrophyRoom.Total.success+=TrophyRoom.Last.success;\r
+               TrophyRoom.Total.path   +=TrophyRoom.Last.path;         \r
+                                 \r
+           if (MyHealth) SaveTrophy();\r
+                                else LoadTrophy();                             \r
+        DoHalt("");\r
+       }\r
+  }\r
+}\r
+\r
+\r
+\r
+void RemoveCurrentTrophy()\r
+{      \r
+    int p = 0;\r
+       if (!TrophyMode) return;\r
+       if (!TrophyRoom.Body[TrophyBody].ctype) return;\r
+\r
+       PrintLog("Trophy removed: ");\r
+       PrintLog(DinoInfo[TrophyRoom.Body[TrophyBody].ctype].Name);\r
+       PrintLog("\n");\r
+\r
+       for (int c=0; c<TrophyBody; c++)\r
+               if (TrophyRoom.Body[c].ctype) p++;\r
+\r
+\r
+       TrophyRoom.Body[TrophyBody].ctype = 0;\r
+\r
+       if (TrophyMode) {\r
+         memcpy(&Characters[p],  \r
+                &Characters[p+1], \r
+                    (250-p) * sizeof(TCharacter) );\r
+         ChCount--;\r
+       }\r
+\r
+       TrophyTime = 0;\r
+       TrophyBody = -1;\r
+}\r
+\r
+\r
+void LoadTrophy()\r
+{\r
+    int pr = TrophyRoom.RegNumber;\r
+       FillMemory(&TrophyRoom, sizeof(TrophyRoom), 0);\r
+       TrophyRoom.RegNumber = pr;\r
+       DWORD l;\r
+       char fname[128];\r
+       int rn = TrophyRoom.RegNumber;\r
+       wsprintf(fname, "trophy0%d.sav", TrophyRoom.RegNumber);\r
+       HANDLE hfile = CreateFile(fname, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);\r
+       if (hfile==INVALID_HANDLE_VALUE) {\r
+               PrintLog("===> Error loading trophy!\n");\r
+               return;\r
+       }\r
+       ReadFile(hfile, &TrophyRoom, sizeof(TrophyRoom), &l, NULL);\r
+\r
+       ReadFile(hfile, &OptAgres, 4, &l, NULL);\r
+       ReadFile(hfile, &OptDens , 4, &l, NULL);\r
+       ReadFile(hfile, &OptSens , 4, &l, NULL);\r
+\r
+       ReadFile(hfile, &OptRes, 4, &l, NULL);\r
+       ReadFile(hfile, &FOGENABLE, 4, &l, NULL);\r
+       ReadFile(hfile, &OptText , 4, &l, NULL);\r
+       ReadFile(hfile, &OptViewR, 4, &l, NULL);\r
+       ReadFile(hfile, &SHADOWS3D, 4, &l, NULL);\r
+       ReadFile(hfile, &OptMsSens, 4, &l, NULL);\r
+       ReadFile(hfile, &OptBrightness, 4, &l, NULL);\r
+\r
+\r
+       ReadFile(hfile, &KeyMap, sizeof(KeyMap), &l, NULL);\r
+       ReadFile(hfile, &REVERSEMS, 4, &l, NULL);\r
+\r
+       ReadFile(hfile, &ScentMode, 4, &l, NULL);\r
+       ReadFile(hfile, &CamoMode, 4, &l, NULL);\r
+       ReadFile(hfile, &RadarMode, 4, &l, NULL);\r
+       ReadFile(hfile, &Tranq    , 4, &l, NULL);\r
+       ReadFile(hfile, &OPT_ALPHA_COLORKEY, 4, &l, NULL);\r
+\r
+       ReadFile(hfile, &OptSys  , 4, &l, NULL);\r
+       ReadFile(hfile, &OptSound , 4, &l, NULL);\r
+       ReadFile(hfile, &OptRender, 4, &l, NULL);\r
+       \r
+\r
+       SetupRes();\r
+\r
+       CloseHandle(hfile);      \r
+       TrophyRoom.RegNumber = rn;\r
+       PrintLog("Trophy Loaded.\n");\r
+//     TrophyRoom.Score = 299;\r
+}\r
+\r
+\r
+\r
+\r
+void SaveTrophy()\r
+{\r
+       DWORD l;\r
+       char fname[128];\r
+       wsprintf(fname, "trophy0%d.sav", TrophyRoom.RegNumber);\r
+\r
+       int r = TrophyRoom.Rank;\r
+       TrophyRoom.Rank = 0;\r
+       if (TrophyRoom.Score >= 100) TrophyRoom.Rank = 1;\r
+       if (TrophyRoom.Score >= 300) TrophyRoom.Rank = 2;\r
+\r
+    \r
+    HANDLE hfile = CreateFile(fname, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);\r
+       if (hfile == INVALID_HANDLE_VALUE) {\r
+               PrintLog("==>> Error saving trophy!\n");\r
+               return;\r
+       }\r
+       WriteFile(hfile, &TrophyRoom, sizeof(TrophyRoom), &l, NULL);\r
+\r
+    WriteFile(hfile, &OptAgres, 4, &l, NULL);\r
+       WriteFile(hfile, &OptDens , 4, &l, NULL);\r
+       WriteFile(hfile, &OptSens , 4, &l, NULL);\r
+\r
+       WriteFile(hfile, &OptRes, 4, &l, NULL);\r
+       WriteFile(hfile, &FOGENABLE, 4, &l, NULL);\r
+       WriteFile(hfile, &OptText , 4, &l, NULL);\r
+       WriteFile(hfile, &OptViewR, 4, &l, NULL);\r
+       WriteFile(hfile, &SHADOWS3D, 4, &l, NULL);\r
+       WriteFile(hfile, &OptMsSens, 4, &l, NULL);\r
+       WriteFile(hfile, &OptBrightness, 4, &l, NULL);\r
+\r
+       WriteFile(hfile, &KeyMap, sizeof(KeyMap), &l, NULL);\r
+       WriteFile(hfile, &REVERSEMS, 4, &l, NULL);      \r
+\r
+       WriteFile(hfile, &ScentMode, 4, &l, NULL);\r
+       WriteFile(hfile, &CamoMode , 4, &l, NULL);\r
+       WriteFile(hfile, &RadarMode, 4, &l, NULL);\r
+       WriteFile(hfile, &Tranq    , 4, &l, NULL);\r
+       WriteFile(hfile, &OPT_ALPHA_COLORKEY, 4, &l, NULL);\r
+\r
+       WriteFile(hfile, &OptSys   , 4, &l, NULL);\r
+       WriteFile(hfile, &OptSound , 4, &l, NULL);\r
+       WriteFile(hfile, &OptRender, 4, &l, NULL);\r
+       CloseHandle(hfile);\r
+       PrintLog("Trophy Saved.\n");\r
+}\r
+\r
diff --git a/Hunt.h b/Hunt.h
new file mode 100644 (file)
index 0000000..3a3a4fb
--- /dev/null
+++ b/Hunt.h
@@ -0,0 +1,1114 @@
+#include "math.h"\r
+#include "windows.h"\r
+#include "winuser.h"\r
+\r
+#include "resource.h"\r
+\r
+#include "ddraw.h"\r
+\r
+#ifdef _d3d\r
+#include <d3d.h>\r
+#endif\r
+\r
+#define ctHScale  64\r
+#define PMORPHTIME 256\r
+#define HiColor(R,G,B) ( ((R)<<10) + ((G)<<5) + (B) )\r
+\r
+\r
+#define TCMAX ((128<<16)-62024)\r
+#define TCMIN ((000<<16)+62024)\r
+\r
+\r
+#ifdef _MAIN_\r
+ #define _EXTORNOT \r
+#else\r
+ #define _EXTORNOT extern\r
+#endif\r
+\r
+#define pi 3.1415926535f\r
+#define ctMapSize 1024\r
+\r
+\r
+\r
+\r
+typedef struct tagMessageList {\r
+   int timeleft;\r
+   char mtext[256];\r
+} TMessageList;\r
+\r
+typedef struct tagTRGB {\r
+     BYTE B;\r
+     BYTE G;\r
+     BYTE R;\r
+} TRGB;\r
+\r
+typedef struct _Animation {\r
+  char aniName[32];\r
+  int aniKPS, FramesCount, AniTime;\r
+  short int* aniData;\r
+} TAni;\r
+\r
+typedef struct _VTLdata {  \r
+  int aniKPS, FramesCount, AniTime;\r
+  short int* aniData;\r
+} TVTL;\r
+\r
+typedef struct _SoundFX {\r
+  int  length;\r
+  short int* lpData;\r
+} TSFX;\r
+\r
+\r
+\r
+typedef struct _TRD {\r
+  int  RNumber, RVolume, RFreq;\r
+  WORD REnvir, Flags;\r
+} TRD;\r
+\r
+typedef struct _TAmbient {\r
+  TSFX sfx;\r
+  TRD  rdata[16];\r
+  int  RSFXCount;\r
+  int  AVolume;\r
+  int  RndTime;\r
+} TAmbient;\r
+\r
+\r
+typedef struct TagTEXTURE  {\r
+  WORD DataA[128*128];\r
+  WORD DataB[64*64];\r
+  WORD DataC[32*32];\r
+  WORD DataD[16*16];\r
+  WORD SDataC[2][32*32];\r
+  int mR, mG, mB;\r
+} TEXTURE;\r
+\r
+\r
+\r
+typedef struct _TPicture {\r
+   int W,H;\r
+   WORD* lpImage;\r
+} TPicture;\r
+\r
+\r
+typedef struct TagVector3d {\r
+ float x,y,z;\r
+} Vector3d;\r
+\r
+typedef struct TagPoint3di {\r
+ int x,y,z;\r
+} TPoint3di;\r
+\r
+typedef struct TagVector2di {\r
+ int x,y;\r
+} Vector2di;\r
+\r
+typedef struct TagVector2df {\r
+ float x,y;\r
+} Vector2df;\r
+\r
+\r
+typedef struct TagScrPoint {\r
+#ifdef _soft\r
+ int   x,y, tx,ty;\r
+#else\r
+ float x,y, tx,ty;\r
+#endif\r
+\r
+ int Light, z, r2, r3;\r
+} ScrPoint;\r
+\r
+typedef struct TagMScrPoint {\r
+ int x,y, tx,ty;        \r
+} MScrPoint;\r
+\r
+typedef struct tagClipPlane {\r
+   Vector3d v1,v2,nv;   \r
+} CLIPPLANE;\r
+\r
+\r
+\r
+\r
+\r
+typedef struct TagEPoint {  \r
+  Vector3d v;\r
+  WORD DFlags;\r
+  short int ALPHA;\r
+#ifdef _d3d\r
+  float  scrx, scry;\r
+#else \r
+  int  scrx, scry;\r
+#endif\r
+  int Light;\r
+  float Fog;\r
+} EPoint;\r
+\r
+\r
+typedef struct TagClipPoint {\r
+  EPoint ev;\r
+  float tx, ty;\r
+} ClipPoint;\r
+\r
+\r
+//================= MODEL ========================\r
+typedef struct _Point3d {\r
+       float x; \r
+       float y; \r
+       float z;\r
+       short owner; \r
+       short hide;\r
+} TPoint3d;\r
+\r
+\r
+\r
+typedef struct _Face {\r
+   int v1, v2, v3;   \r
+#ifdef _soft\r
+   int   tax, tbx, tcx, tay, tby, tcy;\r
+#else\r
+   float tax, tbx, tcx, tay, tby, tcy;\r
+#endif\r
+   WORD Flags,DMask;\r
+   int Distant, Next, group;\r
+   char reserv[12];  \r
+} TFace;\r
+\r
+\r
+typedef struct _Facef {\r
+   int v1, v2, v3;   \r
+   float tax, tbx, tcx, tay, tby, tcy;\r
+   WORD Flags,DMask;\r
+   int Distant, Next, group;\r
+   char reserv[12];  \r
+} TFacef;\r
+\r
+\r
+\r
+typedef struct _Obj {\r
+   char OName [32];\r
+   float ox; \r
+   float oy;\r
+   float oz;\r
+   short owner; \r
+   short hide;\r
+} TObj;\r
+\r
+\r
+typedef struct TagMODEL {\r
+    int VCount, FCount, TextureSize, TextureHeight;\r
+    TPoint3d gVertex[1024];    \r
+       union {\r
+     TFace    gFace  [1024];\r
+        TFacef   gFacef [1024];\r
+       };\r
+    WORD     *lpTexture, *lpTexture2, *lpTexture3;\r
+#ifdef _d3d\r
+       int      VLight[4][1024];\r
+#else\r
+       float    VLight[4][1024];\r
+#endif\r
+} TModel;\r
+\r
+\r
+//=========== END MODEL ==============================//\r
+\r
+\r
+typedef struct _ObjInfo {\r
+   int  Radius;\r
+   int  YLo, YHi;\r
+   int  linelenght, lintensity;\r
+   int  circlerad, cintensity;\r
+   int  flags;\r
+   int  GrRad;\r
+   int  DefLight;\r
+   int  LastAniTime;   \r
+   float BoundR;\r
+   BYTE res[16];\r
+} TObjInfo;\r
+\r
+typedef struct _TBMPModel {\r
+    Vector3d  gVertex[4];\r
+       WORD     *lpTexture;\r
+} TBMPModel;\r
+\r
+typedef struct _TBound {       \r
+       float cx, cy, a, b,  y1, y2;\r
+} TBound;\r
+\r
+typedef struct TagObject {\r
+   TObjInfo info;   \r
+   TBound   bound[8];\r
+   TBMPModel bmpmodel;\r
+   TModel  *model;\r
+   TVTL    vtl;   \r
+} TObject;\r
+\r
+\r
+typedef struct _TCharacterInfo {\r
+  char ModelName[32];\r
+  int AniCount,SfxCount;\r
+  TModel* mptr;\r
+  TAni Animation[64];\r
+  TSFX SoundFX[64];\r
+  int  Anifx[64];\r
+} TCharacterInfo;\r
+\r
+typedef struct _TWeapon {\r
+  TCharacterInfo chinfo[10];\r
+  TPicture       BulletPic[10];\r
+  Vector3d       normals[1024];\r
+  int state, FTime;\r
+  float shakel;  \r
+} TWeapon;\r
+\r
+\r
+\r
+typedef struct _TWCircle {\r
+    Vector3d pos;\r
+       float scale;\r
+       int FTime;    \r
+} TWCircle;\r
+\r
+\r
+typedef struct _TSnowElement {\r
+    Vector3d pos;\r
+       float hl, ftime;\r
+} TSnowElement;\r
+\r
+\r
+\r
+\r
+typedef struct _TCharacter  {\r
+  int CType, AI;\r
+  TCharacterInfo *pinfo;\r
+  int StateF;\r
+  int State;\r
+  int NoWayCnt, NoFindCnt, AfraidTime, tgtime;\r
+  int PPMorphTime, PrevPhase,PrevPFTime, Phase, FTime;\r
+  \r
+  float vspeed, rspeed, bend, scale;\r
+  int Slide; \r
+  float slidex, slidez;\r
+  float tgx, tgz;\r
+\r
+  Vector3d pos, rpos;\r
+  float tgalpha, alpha, beta, \r
+        tggamma,gamma, \r
+        lookx, lookz;\r
+  int Health, BloodTime, BloodTTime;\r
+} TCharacter;\r
+\r
+\r
+\r
+typedef struct tagPlayer {  \r
+  BOOL Active;\r
+  unsigned int IPaddr;\r
+  Vector3d pos;\r
+  float alpha, beta, vspeed;\r
+  int kbState;\r
+  char NickName[16];\r
+} TPlayer;\r
+\r
+\r
+typedef struct _TDemoPoint {\r
+  Vector3d pos;\r
+  int DemoTime, CIndex;\r
+} TDemoPoint;\r
+\r
+typedef struct tagLevelDef {  \r
+    char FileName[64];\r
+    char MapName[128];\r
+    DWORD DinosAvail;\r
+    WORD *lpMapImage;\r
+} TLevelDef;\r
+\r
+\r
+typedef struct tagShipTask {\r
+  int tcount;\r
+  int clist[255];\r
+} TShipTask;\r
+\r
+typedef struct tagShip {  \r
+  Vector3d pos, rpos, tgpos, retpos;\r
+  float alpha, tgalpha, speed, rspeed, DeltaY;\r
+  int State, cindex, FTime;\r
+} TShip;\r
+\r
+\r
+typedef struct tagLandingList {\r
+  int PCount;\r
+  Vector2di list[64];\r
+} TLandingList;\r
+\r
+\r
+typedef struct _TPlayerR {\r
+       char PName[128];\r
+       int  RegNumber;\r
+       int  Score, Rank;\r
+} TPlayerR;\r
+\r
+typedef struct _TTrophyItem {\r
+  int ctype, weapon, phase,\r
+         height, weight, score,\r
+         date, time;\r
+  float scale, range;\r
+  int r1, r2, r3, r4;\r
+} TTrophyItem;\r
+\r
+\r
+typedef struct _TStats {\r
+       int smade, success;\r
+       float path, time;\r
+} TStats;\r
+\r
+\r
+typedef struct _TTrophyRoom {\r
+  char PlayerName[128];\r
+  int  RegNumber;\r
+  int  Score, Rank;\r
+\r
+  TStats Last, Total;\r
+    \r
+  TTrophyItem Body[24];\r
+} TTrophyRoom;\r
+\r
+\r
+\r
+typedef struct _TDinoInfo {\r
+       char Name[48], FName[48], PName[48];    \r
+       int Health0, AI;\r
+       BOOL DangerCall;\r
+       float Mass, Length, Radius, \r
+                 SmellK, HearK, LookK,\r
+                 ShDelta;\r
+       int   Scale0, ScaleA, BaseScore;\r
+       TPicture CallIcon;\r
+} TDinoInfo;\r
+\r
+\r
+typedef struct _TWeapInfo {\r
+       char Name[48], FName[48], BFName[48];\r
+       float Power, Prec, Loud, Rate;\r
+       int Shots, Optic, Fall, TraceC, Reload;\r
+} TWeapInfo;\r
+\r
+\r
+typedef struct _TFogEntity {\r
+  int fogRGB;\r
+  float YBegin;\r
+  BOOL  Mortal;\r
+  float Transp, FLimit; \r
+} TFogEntity;\r
+\r
+\r
+typedef struct _TWaterEntity {\r
+  int tindex, wlevel;\r
+  float transp;\r
+  int fogRGB;\r
+} TWaterEntity;\r
+\r
+\r
+typedef struct _TWind {\r
+   float alpha;\r
+   float speed;\r
+   Vector3d nv;\r
+} TWind;\r
+\r
+\r
+\r
+\r
+typedef struct _TElement {\r
+   Vector3d pos, speed;\r
+   int     Flags;\r
+   float   R;\r
+} TElement;\r
+\r
+typedef struct _TElements {\r
+       int Type, ECount, EDone, LifeTime;\r
+       int Param1, Param2, Param3;\r
+       DWORD RGBA, RGBA2;\r
+    Vector3d pos;\r
+    TElement EList[32];\r
+} TElements;\r
+\r
+\r
+typedef struct _TBloodP {\r
+       int LTime;\r
+       Vector3d pos;\r
+} TBloodP;\r
+\r
+typedef struct _TBTrail {\r
+       int Count;\r
+    TBloodP Trail[512];\r
+} TBTrail;\r
+\r
+\r
+//============= functions ==========================//\r
+\r
+void HLineTxB( void );\r
+void HLineTxC( void );\r
+void HLineTxGOURAUD( void );\r
+\r
+\r
+void HLineTxModel25( void );\r
+void HLineTxModel75( void );\r
+void HLineTxModel50( void );\r
+\r
+void HLineTxModel3( void );\r
+void HLineTxModel2( void );\r
+void HLineTxModel( void );\r
+\r
+void HLineTDGlass75( void );\r
+void HLineTDGlass50( void );\r
+void HLineTDGlass25( void );\r
+void HLineTBGlass25( void );\r
+\r
+\r
+void SetVideoMode(int, int);\r
+\r
+void CreateDivTable();\r
+void DrawTexturedFace();\r
+int GetTextW(HDC, LPSTR);\r
+void wait_mouse_release();\r
+\r
+//============================== render =================================//\r
+void ShowControlElements();\r
+void InsertModelList(TModel* mptr, float x0, float y0, float z0, int light, float al, float bt);\r
+void RenderGround();\r
+void RenderWater();\r
+void RenderElements();\r
+void CreateChRenderList();\r
+void RenderModelsList();\r
+void ProcessMap  (int x, int y, int r);\r
+void ProcessMap2 (int x, int y, int r);\r
+void ProcessMapW (int x, int y, int r);\r
+void ProcessMapW2(int x, int y, int r);\r
+\r
+void DrawTPlane(BOOL);\r
+void DrawTPlaneClip(BOOL);\r
+void ClearVideoBuf();\r
+void DrawTrophyText(int, int);\r
+void DrawHMap();\r
+void RenderCharacter(int);\r
+void RenderShip();\r
+void RenderPlayer(int);\r
+void RenderSkyPlane();\r
+void RenderHealthBar();\r
+void Render_Cross(int, int);\r
+void Render_LifeInfo(int);\r
+\r
+void RenderModelClipEnvMap(TModel*, float, float, float, float, float);\r
+void RenderModelClipPhongMap(TModel*, float, float, float, float, float);\r
+\r
+void RenderModel         (TModel*, float, float, float, int, int, float, float);\r
+void RenderBMPModel      (TBMPModel*, float, float, float, int);\r
+void RenderModelClipWater(TModel*, float, float, float, int, int, float, float);\r
+void RenderModelClip     (TModel*, float, float, float, int, int, float, float);\r
+void RenderNearModel     (TModel*, float, float, float, int, float, float);\r
+void DrawPicture         (int x, int y, TPicture &pic);\r
+\r
+void InitClips();\r
+void InitDirectDraw();\r
+void WaitRetrace();\r
+\r
+//============= Characters =======================\r
+void Characters_AddSecondaryOne(int ctype);\r
+void AddDeadBody(TCharacter *cptr, int);\r
+void PlaceCharacters();\r
+void PlaceTrophy();\r
+void AnimateCharacters();\r
+void MakeNoise(Vector3d, float);\r
+void CheckAfraid();\r
+void CreateChMorphedModel(TCharacter* cptr);\r
+void CreateMorphedObject(TModel* mptr, TVTL &vtl, int FTime);\r
+void CreateMorphedModel(TModel* mptr, TAni *aptr, int FTime, float scale);\r
+\r
+//=============================== Math ==================================//\r
+\r
+void CalcLights  (TModel* mptr);\r
+void CalcModelGroundLight(TModel *mptr, float x0, float z0, int FI);\r
+void CalcNormals (TModel* mptr, Vector3d *nvs);\r
+void CalcGouraud (TModel* mptr, Vector3d *nvs);\r
+\r
+void CalcPhongMapping(TModel* mptr, Vector3d *nv);\r
+void CalcEnvMapping(TModel* mptr, Vector3d *nv);\r
+\r
+void CalcBoundBox(TModel* mptr, TBound *bound);\r
+void  NormVector(Vector3d&, float); \r
+float SGN(float);\r
+void  DeltaFunc(float &a, float b, float d);\r
+void  MulVectorsScal(Vector3d&, Vector3d&, float&);\r
+void  MulVectorsVect(Vector3d&, Vector3d&, Vector3d&);\r
+Vector3d SubVectors( Vector3d&, Vector3d& );\r
+Vector3d AddVectors( Vector3d&, Vector3d& );\r
+Vector3d RotateVector(Vector3d&);\r
+float VectorLength(Vector3d);\r
+int   siRand(int);\r
+int   rRand(int);\r
+void  CalcHitPoint(CLIPPLANE&, Vector3d&, Vector3d&, Vector3d&);\r
+void  ClipVector(CLIPPLANE& C, int vn);\r
+float FindVectorAlpha(float, float);\r
+float AngleDifference(float a, float b);\r
+\r
+int   TraceShot(float ax, float ay, float az,\r
+                float &bx, float &by, float &bz);\r
+int   TraceLook(float ax, float ay, float az,\r
+                float bx, float by, float bz);\r
+\r
+\r
+void CheckCollision(float&, float&);\r
+float CalcFogLevel(Vector3d v);\r
+//=================================================================//\r
+void AddMessage(LPSTR mt);\r
+void CreateTMap();\r
+\r
+\r
+void LoadSky();\r
+void LoadSkyMap();\r
+void LoadTexture(TEXTURE*&);\r
+void LoadWav(char* FName, TSFX &sfx);\r
+\r
+\r
+void ApplyAlphaFlags(WORD*, int);\r
+WORD conv_565(WORD c);\r
+int  conv_xGx(int);\r
+void conv_pic(TPicture &pic);\r
+void LoadPicture(TPicture &pic, LPSTR pname);\r
+void LoadPictureTGA(TPicture &pic, LPSTR pname);\r
+void LoadCharacterInfo(TCharacterInfo&, char*);\r
+void LoadModelEx(TModel* &mptr, char* FName);\r
+void LoadModel(TModel*&);\r
+void LoadResources();\r
+void ReInitGame();\r
+\r
+\r
+void SaveScreenShot();\r
+void CreateWaterTab();\r
+void CreateFadeTab();\r
+void CreateVideoDIB();\r
+void RenderLightMap();\r
+\r
+void MulVectorsVect(Vector3d& v1, Vector3d& v2, Vector3d& r );\r
+void MulVectorsScal(Vector3d& v1,Vector3d& v2, float& r);\r
+Vector3d SubVectors( Vector3d& v1, Vector3d& v2 );\r
+void NormVector(Vector3d& v, float Scale);\r
+\r
+LPVOID _HeapAlloc(HANDLE hHeap, DWORD dwFlags, DWORD dwBytes);\r
+BOOL _HeapFree(HANDLE hHeap, DWORD  dwFlags, LPVOID lpMem);\r
+\r
+//============ game ===========================//\r
+float GetLandCeilH(float, float);\r
+float GetLandH(float, float);\r
+float GetLandOH(int, int);\r
+float GetLandLt(float, float);\r
+float GetLandUpH(float, float);\r
+float GetLandQH(float, float);\r
+float GetLandQHNoObj(float, float);\r
+float GetLandHObj(float, float);\r
+\r
+void LoadResourcesScript();\r
+void InitEngine();\r
+void ShutDownEngine();\r
+void ProcessSyncro();\r
+void AddShipTask(int);\r
+void LoadTrophy();\r
+//void LoadPlayersInfo();\r
+void SaveTrophy();\r
+void RemoveCurrentTrophy();\r
+void MakeCall();\r
+void MakeShot(float ax, float ay, float az,\r
+              float bx, float by, float bz);\r
+\r
+void AddBloodTrail(TCharacter *cptr);\r
+void AddElements(float, float, float, int, int);\r
+void AddWCircle(float, float, float);\r
+void AnimateProcesses();\r
+void DoHalt(LPSTR);\r
+\r
+_EXTORNOT   char logt[128];\r
+void CreateLog();\r
+void PrintLog(LPSTR l);\r
+void CloseLog();\r
+\r
+_EXTORNOT   float BackViewR;\r
+_EXTORNOT   int   BackViewRR;\r
+_EXTORNOT   int   UnderWaterT;\r
+_EXTORNOT   int   TotalC, TotalW;\r
+\r
+\r
+//========== common ==================//\r
+_EXTORNOT   HWND    hwndMain;\r
+_EXTORNOT   HINSTANCE  hInst;\r
+_EXTORNOT   HANDLE  Heap;\r
+_EXTORNOT   HDC     hdcMain, hdcCMain;\r
+_EXTORNOT   BOOL    blActive;\r
+_EXTORNOT   BYTE    KeyboardState[256];\r
+_EXTORNOT   int     KeyFlags, _shotcounter;\r
+\r
+_EXTORNOT   TMessageList MessageList;\r
+_EXTORNOT   char    ProjectName[128];\r
+_EXTORNOT   int     _GameState;\r
+_EXTORNOT   TSFX    fxCall[10][3], fxScream[4];\r
+_EXTORNOT   TSFX    fxUnderwater, fxWaterIn, fxWaterOut, fxJump, fxStep[3], fxStepW[3];\r
+//========== map =====================//\r
+_EXTORNOT   byte HMap[ctMapSize][ctMapSize];\r
+_EXTORNOT   byte WMap[ctMapSize][ctMapSize];\r
+_EXTORNOT   byte HMapO[ctMapSize][ctMapSize];\r
+_EXTORNOT   WORD FMap[ctMapSize][ctMapSize];\r
+_EXTORNOT   byte LMap[ctMapSize][ctMapSize];\r
+_EXTORNOT   WORD TMap1[ctMapSize][ctMapSize];\r
+_EXTORNOT   WORD TMap2[ctMapSize][ctMapSize];\r
+_EXTORNOT   byte OMap[ctMapSize][ctMapSize];\r
+\r
+_EXTORNOT   byte FogsMap[512][512];\r
+_EXTORNOT   byte AmbMap[512][512];