/*
===========================================================================
ARX FATALIS GPL Source Code
Copyright (C) 1999-2010 Arkane Studios SA, a ZeniMax Media company.
This file is part of the Arx Fatalis GPL Source Code ('Arx Fatalis Source Code').
Arx Fatalis Source Code is free software: you can redistribute it and/or modify it under the terms of the GNU General Public
License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
Arx Fatalis Source Code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with Arx Fatalis Source Code. If not, see
.
In addition, the Arx Fatalis Source Code is also subject to certain additional terms. You should have received a copy of these
additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Arx
Fatalis Source Code. If not, please request a copy in writing from Arkane Studios at the address below.
If you have questions concerning this license or the applicable additional terms, you may contact in writing Arkane Studios, c/o
ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
===========================================================================
*/
//////////////////////////////////////////////////////////////////////////////////////
// @@ @@@ @@@ @@ @@@@@ //
// @@@ @@@@@@ @@@ @@ @@@@ @@@ @@@ //
// @@@ @@@@@@@ @@@ @@@@ @@@@ @@ @@@@ //
// @@@ @@ @@@@ @@@ @@@@@ @@@@@@ @@@ @@@ //
// @@@@@ @@ @@@@ @@@ @@@@@ @@@@@@@ @@@ @ @@@ //
// @@@@@ @@ @@@@ @@@@@@@@ @@@@ @@@ @@@@@ @@ @@@@@@@ //
// @@ @@@ @@ @@@@ @@@@@@@ @@@ @@@ @@@@@@ @@ @@@@ //
// @@@ @@@ @@@ @@@@ @@@@@ @@@@@@@@@ @@@@@@@ @@@ @@@@ //
// @@@ @@@@ @@@@@@@ @@@@@@ @@@ @@@@ @@@ @@@ @@@ @@@@ //
// @@@@@@@@ @@@@@ @@@@@@@@@@ @@@ @@@ @@@ @@@ @@@ @@@@@ //
// @@@ @@@@ @@@@ @@@ @@@@@@@ @@@ @@@ @@@@ @@@ @@@@ @@@@@ //
//@@@ @@@@ @@@@@ @@@ @@@@@@ @@ @@@ @@@@ @@@@@@@ @@@@@ @@@@@ //
//@@@ @@@@@ @@@@@ @@@@ @@@ @@ @@ @@@@ @@@@@@@ @@@@@@@@@ //
//@@@ @@@@ @@@@@@@ @@@@ @@ @@ @@@@ @@@@@ @@@@@ //
//@@@ @@@@ @@@@@@@ @@@@ @@ @@ @@@@ @@@@@ @@ //
//@@@ @@@ @@@ @@@@@ @@ @@@ //
// @@@ @@@ @@ @@ STUDIOS //
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
// DANAE.CPP
//////////////////////////////////////////////////////////////////////////////////////
//
// Description:
// Danae Application Main File
//
// Updates: (date) (person) (update)
//
// Code: Cyril Meynier
//
// Copyright (c) 1999-2001 ARKANE Studios SA. All rights reserved
//////////////////////////////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------
// Included files
//-----------------------------------------------------------------------------
#include
#include
#include
#include
#include "danae.h"
#include "danaedlg.h"
#include "../danae/Danae_resource.h"
#include "DANAE_VERSION.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "EERIELinkedObj.h"
#include
#include
#include
#include
#include
#include
#include
#include "ARX_FTL.h"
#include
#include
#include
#include
#include
#include
#include "ARX_Loc.h"
#include
#include "ARX_Menu2.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "arx_missile.h"
#include "arx_cedric.h"
#include "ARX_HWTransform.h"
#include "ARX_MenuPublic.h"
#include "ARX_SnapShot.h"
#ifdef ARX_STEAM
#include "../steam/steam.h"
#pragma comment(lib,"steam.lib")
#endif
#define _CRTDBG_MAP_ALLOC
#include
void DemoFileCheck();
bool ARX_IsSteam()
{
#ifdef ARX_STEAM
return true;
#else
return false;
#endif
}
//-----------------------------------------------------------------------------
#define MAX_EXPLO 24
#define FFH_S_OK 1
#define FFH_GOTO_FINISH 2
extern INTERACTIVE_OBJ * CURPATHFINDIO;
//-----------------------------------------------------------------------------
HRESULT DANAEFinalCleanup();
void ClearGame();
void ShowInfoText(long COR);
//-----------------------------------------------------------------------------
extern long LAST_PORTALS_COUNT;
extern CARXTextManager *pTextManage;
extern float FORCE_TIME_RESTORE;
extern CDirectInput *pGetInfoDirectInput;
extern CMenuConfig *pMenuConfig;
extern CMenuState *pMenu;
extern SNAPSHOTINFO snapshotdata;
extern short uw_mode;
extern long SPECIAL_DRAGINTER_RENDER;
extern HWND PRECALC;
extern HWND CDP_LIGHTOptions;
extern HWND CDP_FogOptions;
extern EERIE_LIGHT *PDL[MAX_DYNLIGHTS];
extern INTERACTIVE_OBJ * CURRENT_TORCH;
extern EERIE_3D loddpos;
extern EERIE_3DOBJ * fogobj;
extern bool bGameNotFirstLaunch;
extern bool bSkipVideoIntro;
extern char SCRIPT_SEARCH_TEXT[256];
extern char ShowText[65536];
extern char ShowText2[65536];
extern float Full_Jump_Height;
extern float MAX_ALLOWED_PER_SECOND;
extern float InventoryX;
extern float PROGRESS_BAR_COUNT;
extern float PROGRESS_BAR_TOTAL;
extern float vdist;
extern float FLOATTEST;
extern float _MAX_CLIP_DIST;
extern float BIGLIGHTPOWER;
extern long LastSelectedIONum;
extern long FistParticles;
extern long INTER_DRAW;
extern long INTER_COMPUTE;
extern long USEINTERNORM;
extern long NEED_ANCHORS;
extern long FAKE_DIR;
extern long DONT_WANT_PLAYER_INZONE;
extern long DeadTime;
extern long INTREATZONECOUNT;
extern long TOTPDL;
extern float ARXTotalPausedTime;
extern long accepted;
extern long COLLIDED_CLIMB_POLY;
extern long LOOKING_FOR_SPELL_TARGET;
extern long PATHFINDER_WAIT;
extern long LAST_ROOM;
extern long TRUE_PLAYER_MOUSELOOK_ON;
extern unsigned char * grps;
extern long LastSelectedIONum;
extern long NOCHECKSUM;
extern unsigned long ROTATE_START;
extern float ARXTimeMenu;
extern float ARXOldTimeMenu;
extern long REFUSE_GAME_RETURN;
extern long PLAYER_MOUSELOOK_ON;
extern long FRAME_COUNT;
extern bool bFadeInOut;
extern bool bFade; //active le fade
extern long LastEERIEMouseButton;
extern long PLAYER_PARALYSED;
extern float fZFogEnd;
extern float fZFogStart;
extern bool bOLD_CLIPP;
extern bool bForceGDI;
extern bool bSoftRender;
extern bool bGMergeVertex;
extern float OLD_PROGRESS_BAR_COUNT;
extern E_ARX_STATE_MOUSE eMouseState;
void DanaeRestoreFullScreen();
extern long FORCE_FRONT_DRAW;
extern bool bUSE_D3DFOG_INTER;
extern EERIE_3DOBJ * ssol;
extern long ssol_count;
extern EERIE_3DOBJ * slight;
extern long slight_count;
extern EERIE_3DOBJ * srune;
extern long srune_count;
extern EERIE_3DOBJ * smotte;
extern long smotte_count;
extern EERIE_3DOBJ * stite;
extern long stite_count;
extern EERIE_3DOBJ * smissile;
extern long smissile_count;
extern EERIE_3DOBJ * spapi;
extern long spapi_count;
extern EERIE_3DOBJ * sfirewave;
extern long sfirewave_count;
extern EERIE_3DOBJ * svoodoo;
extern long svoodoo_count;
//-----------------------------------------------------------------------------
extern INTERACTIVE_OBJ * FlyingOverIO;
extern unsigned long ulBKGColor;
long LAST_LOCK_SUCCESSFULL=0;
extern D3DMATRIX ProjectionMatrix;
extern CMY_DYNAMIC_VERTEXBUFFER *pDynamicVertexBufferBump; // Duplicate pDynamicVertexBuffer for BUMP mapping.
extern CMY_DYNAMIC_VERTEXBUFFER *pDynamicVertexBuffer_TLVERTEX; // VB using TLVERTEX format.
extern CMY_DYNAMIC_VERTEXBUFFER *pDynamicVertexBuffer_D3DVERTEX3_T; // VB using D3DVERTEX3_T format.
extern CMY_DYNAMIC_VERTEXBUFFER * pDynamicVertexBuffer;
extern CMY_DYNAMIC_VERTEXBUFFER * pDynamicVertexBufferTransform;
extern char pStringMod[];
//-----------------------------------------------------------------------------
// Our Main Danae Application.& Instance
DANAE danaeApp;
HINSTANCE hInstance;
//-----------------------------------------------------------------------------
EERIE_3D LASTCAMPOS,LASTCAMANGLE;
EERIE_3D PUSH_PLAYER_FORCE;
CINEMATIQUE *ControlCinematique=NULL; // 2D Cinematic Controller
CParticleManager *pParticleManager = NULL;
INTERACTIVE_OBJ *lastCAMERACONTROLLER=NULL;
TextureContainer * ombrignon = NULL;
TextureContainer * teleportae = NULL;
TextureContainer * Flying_Eye = NULL;
TextureContainer * scursor[8]; // Animated Hand Cursor TC
TextureContainer * pTCCrossHair; // Animated Hand Cursor TC
TextureContainer * iconequip[5];
TextureContainer * GoldCoinsTC[MAX_GOLD_COINS_VISUALS]; // Gold Coins Icons
TextureContainer * ChangeLevel = NULL;
TextureContainer * Movable = NULL; // TextureContainer for Movable Items (Red Cross)
TextureContainer * explo[MAX_EXPLO]; // TextureContainer for animated explosion bitmaps (24 frames)
TextureContainer * blood_splat = NULL; // TextureContainer for blood splat particles
TextureContainer * tflare = NULL;
TextureContainer * npc_fight=NULL;
TextureContainer * npc_follow=NULL;
TextureContainer * npc_stop=NULL;
TextureContainer * sphere_particle=NULL;
TextureContainer * inventory_font=NULL;
TextureContainer * enviro=NULL;
TextureContainer * specular=NULL;
TextureContainer * lightsource_tc=NULL;
TextureContainer * stealth_gauge_tc=NULL;
TextureContainer * arx_logo_tc=NULL;
TextureContainer * TC_fire2=NULL;
TextureContainer * TC_fire=NULL;
TextureContainer * TC_smoke=NULL;
TextureContainer * TC_missile=NULL;
TextureContainer * Z_map=NULL;
TextureContainer * Boom=NULL;
TextureContainer * zbtex=NULL;
TextureContainer * mecanism_tc=NULL;
TextureContainer * arrow_left_tc=NULL;
EERIE_MULTI3DSCENE * mse=NULL;
long NEED_TEST_TEXT=0;
SPELL_ICON spellicons[SPELL_COUNT];
bool bGToggleCombatModeWithKey;
EERIE_S2D DANAEMouse;
EERIE_3D moveto;
EERIE_3D Mscenepos;
EERIE_3D lastteleport;
EERIE_3D e3dPosBump;
EERIE_3DOBJ * GoldCoinsObj[MAX_GOLD_COINS_VISUALS];// 3D Objects For Gold Coins
EERIE_3DOBJ * arrowobj=NULL; // 3D Object for arrows
EERIE_3DOBJ * cameraobj=NULL; // Camera 3D Object // NEEDTO: Remove for Final
EERIE_3DOBJ * markerobj=NULL; // Marker 3D Object // NEEDTO: Remove for Final
EERIE_3DOBJ * nodeobj=NULL; // Node 3D Object // NEEDTO: Remove for Final
EERIE_3DOBJ * eyeballobj=NULL; // EyeBall 3D Object // NEEDTO: Load dynamically
EERIE_3DOBJ * cabal=NULL; // Cabalistic 3D Object // NEEDTO: Load dynamically
EERIE_BACKGROUND DefaultBkg;
EERIE_CAMERA TCAM[32];
EERIE_CAMERA subj,map,bookcam,raycam,conversationcamera;
EERIE_CAMERA DynLightCam;
INTERACTIVE_OBJ * CAMERACONTROLLER=NULL;
_TCHAR WILLADDSPEECH[256];
EERIE_S2D STARTDRAG;
INTERACTIVE_OBJ * COMBINE=NULL;
HWND MESH_REDUCTION_WINDOW=NULL;
QUAKE_FX_STRUCT QuakeFx;
bool bALLOW_BUMP = false;
char * GTE_TITLE;
char * GTE_TEXT;
char LAST_FAILED_SEQUENCE[128]="None";
// START - Information for Player Teleport between/in Levels-------------------------------------
char TELEPORT_TO_LEVEL[64];
char TELEPORT_TO_POSITION[64];
long TELEPORT_TO_ANGLE;
long TELEPORT_TO_CONFIRM=1;
// END - Information for Player Teleport between/in Levels---------------------------------------
char LastLoadedDLF[256];
char ItemToBeAdded[1024];
char WILL_LAUNCH_CINE[256];
char LOCAL_SAVENAME[64];
char _CURRENTLOAD_[256];
char LastLoadedScene[256];
char LAST_LAUNCHED_CINE[256];
float BASE_FOCAL=350.f;
float PLAYER_ARMS_FOCAL = 350.f;
float METALdecal=0.f;
float currentbeta=0.f;
float STRIKE_AIMTIME=0.f;
float SLID_VALUE=0.f;
float _framedelay;
float TIMEFACTOR=1.f;
float LASTfps2=0;
float fps2=0;
float fps2min=0;
long LASTfpscount=0;
long Bilinear=1;
long DEBUG1ST=0;
long DEBUGSYS=0;
long MAPUPDATE=0;
long EXTERNALVIEW=0;
long LASTEXTERNALVIEW=1;
long EXTERNALVIEWING=0;
long lSLID_VALUE=0;
long _NB_=0;
long POINTINTERPOLATION=1;
long LOAD_N_DONT_ERASE=0;
long NO_TIME_INIT=0;
long DANAESIZX=640;
long DANAESIZY=480;
long DANAECENTERX;
long DANAECENTERY;
long CurrFightPos=0;
long NO_PLAYER_POSITION_RESET=0;
long CURRENT_BASE_FOCAL=310;
long GTE_SIZE;
long CINE_PRELOAD=0;
long FOKMOD=0;
long PLAY_LOADED_CINEMATIC=0;
long PauseScript=0;
long A_FLARES=1;
long ADDED_IO_NOT_SAVED=0;
long WILL_RELOAD_ALL_TEXTURES=0; // Set To 1 if Textures are to be reloaded from disk and restored.
long CHANGE_LEVEL_PROC_RESULT=-1;
float BOW_FOCAL=0;
long PlayerWeaponBlocked=-1;
long SHOW_TORCH=0;
float FrameDiff=0;
long CEDRIC_VERSION=0;
long CYRIL_VERSION=0;
float GLOBAL_LIGHT_FACTOR=0.85f;
//-----------------------------------------------------------------------------
// Don't touch FINAL_COMMERCIAL_DEMO anymore
// Comment #define REAL_DEMO for non-demo Version
// UNcomment #define REAL_DEMO for demo Version
#ifdef REAL_DEMO
long FINAL_COMMERCIAL_DEMO =1;
#else
long FINAL_COMMERCIAL_DEMO =0;
#endif
float GLOBAL_NPC_MIPMAP_BIAS =-2.2f;
float GLOBAL_MIPMAP_BIAS = 0;
float IN_FRONT_DIVIDER = 0.75f;
float IN_FRONT_DIVIDER_FEET =0.998f;
float IN_FRONT_DIVIDER_ITEMS =0.7505f;
long GLOBAL_FORCE_PLAYER_IN_FRONT =1;
long USE_NEW_SKILLS=1;
long ARX_SOUND_INIT=1;
long GORE_MODE=0;
long USE_LIGHT_OPTIM =1;
long GLOBAL_FORCE_MINI_TEXTURE=0;
long FINAL_COMMERCIAL_GAME = 1; // <-------------- fullgame
long GERMAN_VERSION = 0;
long FRENCH_VERSION = 0;
long CHINESE_VERSION = 0;
long EAST_EUROPE = 0;
long ALLOW_CHEATS =1;
long FOR_EXTERNAL_PEOPLE =0;
long USE_OLD_MOUSE_SYSTEM=1;
long NO_TEXT_AT_ALL = 0;
long ARX_DEMO = 0;
long LAST_CONVERSATION = 0;
long FAST_SPLASHES = 0;
long FORCE_SHOW_FPS = 0;
long FINAL_RELEASE = 0;
long AUTO_FULL_SCREEN = 0;
long SHOW_INGAME_MINIMAP= 1;
long DEBUG_FRUSTRUM = 0;
long USE_D3DFOG = 1;
long GAME_EDITOR = 1;
long NEED_EDITOR = 1;
long USE_CEDRIC_ANIM = 1;
extern long NEED_BENCH;
//-------------------------------------------------------------------------------
long STRIKE_TIME = 0;
long STOP_KEYBOARD_INPUT= 0;
long REQUEST_SPEECH_SKIP= 0;
long CURRENTLEVEL = -1;
long NOBUILDMAP = 0;
long TRUEFIGHT = 0;
long DONT_ERASE_PLAYER = 0;
float LastFrameTicks = 0;
long SPLASH_THINGS_STAGE= 0;
long STARTED_A_GAME = 0;
long INTRO_NOT_LOADED = 1;
long SnapShotMode = 0;
long ARX_CONVERSATION_MODE=-1;
long ARX_CONVERSATION_LASTIS=-1;
long BOOKBUTTON = 0;
long LASTBOOKBUTTON = 0;
long TSU_LIGHTING = 0; // must be 0 at start !
long FASTmse = 0;
long LASTMOULINEX =-1;
long PROCESS_ALL_THEO = 1;
long PROCESS_LEVELS = 1;
long PROCESS_NO_POPUP = 0;
long PROCESS_ONLY_ONE_LEVEL=-1;
long DONT_CHANGE_WORKINGDIR=0;
//-----------------------------------------------------------------------------
// EDITOR FLAGS/Vars
//-----------------------------------------------------------------------------
// Flag used to Launch Moulinex
long MOULINEX=0;
long KILL_AT_MOULINEX_END=0;
long HIPOLY=0; // Are We Using Poly-Spawning Ray-Casted Shadows ?
long NODIRCREATION=0; // No IO Directory Creation ?
long LOADEDD=0; // Is a Level Loaded ?
long WILLLOADLEVEL=0; // Is a LoadLevel command waiting ?
long WILLSAVELEVEL=0; // Is a SaveLevel command waiting ?
long EDITMODE=0; // EditMode (1) or GameMode (0) ?
long EDITION=EDITION_IO; // Sub-EditMode
long USE_COLLISIONS=1;
long ARX_CONVERSATION=0;
long CHANGE_LEVEL_ICON=-1;
long ARX_MOUSE_OVER=0;
//-----------------------------------------------------------------------------
// DEBUG FLAGS/Vars
//-----------------------------------------------------------------------------
long DEBUGCODE=0; // Debug Code to Console
long DEBUGNPCMOVE=0; // Debug NPC Movements
long LaunchDemo=0;
long FirstFrame=1;
short Cross=0;
unsigned long WILLADDSPEECHTIME=0;
unsigned long AimTime;
unsigned char ARX_FLARES_Block=1;
float LastFrameTime=0;
float FrameTime=0;
unsigned long PlayerWeaponBlockTime=0;
unsigned long FRAMETICKS=0;
unsigned long SPLASH_START=0;
//-----------------------------------------------------------------------------
long LAST_FVAL=0;
float LAST_ZVAL=0;
extern float sp_max_start;
EERIE_RGB FADECOLOR;
long DURING_LOCK=0;
long START_NEW_QUEST=0;
long LAST_WEAPON_TYPE=-1;
long FADEDURATION=0;
long FADEDIR=0;
unsigned long FADESTART=0;
float Original_framedelay=0.f;
float PULSATE;
float PULSS;
long EXITING=0;
//-----------------------------------------------------------------------------
// Toolbar Buttons Def
//-----------------------------------------------------------------------------
TBBUTTON tbButtons [] =
{
{0, DANAE_B001, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
{1, DANAE_B002, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 1},
{0, 0, TBSTATE_ENABLED | TBSTATE_WRAP , TBSTYLE_SEP, 0L, 0},
{8, DANAE_B009, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 8},
{12, DANAE_B013, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 12},
{0, 0, TBSTATE_ENABLED , TBSTYLE_SEP, 0L, 0},
{13, DANAE_B003, TBSTATE_ENABLED, TBSTYLE_CHECK, 0L, 13},
{16, DANAE_B005, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 16},
{0, 0, TBSTATE_ENABLED , TBSTYLE_SEP, 0L, 0},
{5, DANAE_B006, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 5},
{14, DANAE_B004, TBSTATE_ENABLED, TBSTYLE_CHECK, 0L, 14},
{2, DANAE_B007, TBSTATE_ENABLED, TBSTYLE_CHECK, 0L, 2},
{3, DANAE_B008, TBSTATE_ENABLED, TBSTYLE_CHECK, 0L, 3},
{17, DANAE_B010, TBSTATE_ENABLED, TBSTYLE_CHECK, 0L, 17},
{18, DANAE_B011, TBSTATE_ENABLED, TBSTYLE_CHECK, 0L, 18},
{11, DANAE_B014, TBSTATE_ENABLED, TBSTYLE_CHECK, 0L, 11}, // Particles Button
{0, 0, TBSTATE_ENABLED , TBSTYLE_SEP, 0L, 0},
{19, DANAE_B012, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 19},
{0, 0, TBSTATE_ENABLED , TBSTYLE_SEP, 0L, 0},
{20, DANAE_B015, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 20},
{0, 0, TBSTATE_ENABLED , TBSTYLE_SEP, 0L, 0},
{21, DANAE_B016, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 21},
{0, 0, TBSTATE_ENABLED , TBSTYLE_SEP, 0L, 0},
};
//-----------------------------------------------------------------------------
void LoadSysTextures();
HRESULT DANAEFinalCleanup();
void ShowFPS();
void ShowTestText();
void ManageNONCombatModeAnimations();
void LaunchMoulinex();
//-----------------------------------------------------------------------------
bool GetARXInstallPath(char * dest)
{
char text[256];
GetCurrentDirectory( 256, text );
if (text[0]==0) return false;
long len=strlen(text);
if (text[len]!='\\') strcat(text,"\\");
strcpy(dest,text);
return true;
}
// Sends ON GAME_READY msg to all IOs
void SendGameReadyMsg()
{
SendMsgToAllIO(SM_GAME_READY,"");
}
void DANAE_KillCinematic()
{
if ( (ControlCinematique)
&& (ControlCinematique->projectload) )
{
ControlCinematique->projectload=FALSE;
ControlCinematique->OneTimeSceneReInit();
ControlCinematique->DeleteDeviceObjects();
PLAY_LOADED_CINEMATIC=0;
CINE_PRELOAD=0;
}
}
// START - DANAE Registery Funcs ****************************************************************
//-----------------------------------------------------------------------------------------------
HKEY DanaeKey= NULL;
#define DANAEKEY_KEY TEXT("Software\\Arkane_Studios\\DANAE")
//-----------------------------------------------------------------------------------------------
void Danae_Registry_Open()
{
if (!FINAL_RELEASE)
{
RegCreateKeyEx( HKEY_CURRENT_USER, DANAEKEY_KEY, 0, NULL,
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
&DanaeKey, NULL );
}
}
//-----------------------------------------------------------------------------------------------
void Danae_Registry_Close()
{
if (!FINAL_RELEASE)
{
RegCloseKey(DanaeKey);
DanaeKey=NULL;
}
}
//-----------------------------------------------------------------------------------------------
void Danae_Registry_WriteValue(char * string,DWORD value)
{
if (!FINAL_RELEASE)
{
if (DanaeKey==NULL) Danae_Registry_Open();
if (DanaeKey!=NULL)
{
WriteRegKeyValue( DanaeKey, string, value);
Danae_Registry_Close();
}
}
}
//-----------------------------------------------------------------------------------------------
void Danae_Registry_Write(char * string,char * text)
{
if (!FINAL_RELEASE)
{
if (DanaeKey==NULL) Danae_Registry_Open();
if (DanaeKey!=NULL)
{
WriteRegKey( DanaeKey, string, text);
Danae_Registry_Close();
}
}
}
//-----------------------------------------------------------------------------------------------
void Danae_Registry_Read(char * string,char * text,char *defaultstr,long maxsize)
{
if (!FINAL_RELEASE)
{
if (DanaeKey==NULL) Danae_Registry_Open();
if (DanaeKey!=NULL)
{
ReadRegKey( DanaeKey, string, text,maxsize,defaultstr);
Danae_Registry_Close();
}
else
{
if ((defaultstr) && (defaultstr[0]!=0))
{
memcpy(text,defaultstr,__min(maxsize+1,(long)strlen(defaultstr)+1));
text[__min(maxsize,(long)strlen(defaultstr))]=0;
}
else text[0]=0;
}
}
}
//-----------------------------------------------------------------------------------------------
void Danae_Registry_ReadValue(char * string,long * value,long defaultvalue)
{
if (!FINAL_RELEASE)
{
if (DanaeKey==NULL) Danae_Registry_Open();
if (DanaeKey!=NULL)
{
ReadRegKeyValue( DanaeKey, string, value, defaultvalue);
Danae_Registry_Close();
}
else *value = defaultvalue;
}
}
// END - DANAE Registery Funcs ******************************************************************
//-----------------------------------------------------------------------------------------------
void DanaeSwitchFullScreen()
{
if (danaeApp.m_pDeviceInfo->bWindowed) // switching to fullscreen
{
KillInterTreeView();
}
if(pMenuConfig)
{
int nb=danaeApp.m_pDeviceInfo->dwNumModes;
for(int i=0;iiBpp );
if( danaeApp.m_pDeviceInfo->pddsdModes[i].ddpfPixelFormat.dwRGBBitCount == ARX_CAST_UINT( pMenuConfig->iBpp ) )
{
ARX_CHECK_NOT_NEG( pMenuConfig->iWidth );
ARX_CHECK_NOT_NEG( pMenuConfig->iHeight );
if( ( danaeApp.m_pDeviceInfo->pddsdModes[i].dwWidth == ARX_CAST_UINT( pMenuConfig->iWidth ) ) &&
( danaeApp.m_pDeviceInfo->pddsdModes[i].dwHeight == ARX_CAST_UINT( pMenuConfig->iHeight ) ) )
{
danaeApp.m_pDeviceInfo->ddsdFullscreenMode=danaeApp.m_pDeviceInfo->pddsdModes[i];
danaeApp.m_pDeviceInfo->dwCurrentMode=i;
break;
}
}
}
pMenuConfig->iNewBpp=pMenuConfig->iBpp=danaeApp.m_pFramework->bitdepth=danaeApp.m_pDeviceInfo->ddsdFullscreenMode.ddpfPixelFormat.dwRGBBitCount;
pMenuConfig->iNewHeight=pMenuConfig->iHeight=danaeApp.m_pFramework->m_dwRenderHeight=danaeApp.m_pDeviceInfo->ddsdFullscreenMode.dwHeight;
pMenuConfig->iNewWidth=pMenuConfig->iWidth=danaeApp.m_pFramework->m_dwRenderWidth=danaeApp.m_pDeviceInfo->ddsdFullscreenMode.dwWidth;
}
if(pMenu)
{
pMenu->bReInitAll=true;
}
ARX_Text_Close();
danaeApp.SwitchFullScreen();
if( (danaeApp.m_pFramework->m_bIsFullscreen)&&
(pMenuConfig) )
{
ARXMenu_Options_Video_SetGamma(pMenuConfig->iGamma);
}
GDevice=danaeApp.m_pFramework->GetD3DDevice();
DANAESIZX=danaeApp.m_pFramework->m_dwRenderWidth;
DANAESIZY=danaeApp.m_pFramework->m_dwRenderHeight;
if (danaeApp.m_pDeviceInfo->bWindowed)
DANAESIZY-=danaeApp.m_pFramework->Ystart;
DANAECENTERX=DANAESIZX>>1;
DANAECENTERY=DANAESIZY>>1;
Xratio=DANAESIZX*DIV640;
Yratio=DANAESIZY*DIV480;
ARX_Text_Init();
extern float fInterfaceRatio;
fInterfaceRatio = 1;
LoadScreen(GDevice);
}
//-----------------------------------------------------------------------------------------------
void DanaeRestoreFullScreen()
{
if( pMenuConfig
&& pMenuConfig->bNoReturnToWindows )
{
pMenuConfig->bNoReturnToWindows=false;
return;
}
danaeApp.m_pDeviceInfo->bWindowed=!danaeApp.m_pDeviceInfo->bWindowed;
danaeApp.SwitchFullScreen();
if( (danaeApp.m_pFramework->m_bIsFullscreen)
&& (pMenuConfig) )
{
ARXMenu_Options_Video_SetGamma(pMenuConfig->iGamma);
}
GDevice=danaeApp.m_pFramework->GetD3DDevice();
DANAESIZX=danaeApp.m_pFramework->m_dwRenderWidth;
DANAESIZY=danaeApp.m_pFramework->m_dwRenderHeight;
DANAECENTERX=DANAESIZX>>1;
DANAECENTERY=DANAESIZY>>1;
Xratio=DANAESIZX*DIV640;
Yratio=DANAESIZY*DIV480;
ARX_Text_Init();
LoadScreen(GDevice);
}
//-----------------------------------------------------------------------------------------------
extern void InitTileLights();
//-----------------------------------------------------------------------------
void InitializeDanae()
{
InitTileLights();
snapshotdata.bits=16;
strcpy(snapshotdata.filenames,"snap");
strcpy(snapshotdata.path,"c:\\");
snapshotdata.imgsec=25;
snapshotdata.xsize=640;
snapshotdata.ysize=480;
snapshotdata.flag=1;
char temp[512];
char temp2[512];
EERIEMathPrecalc();
ARX_MISSILES_ClearAll();
ARX_SPELLS_Init();
ARX_SPELLS_ClearAllSymbolDraw();
ARX_PARTICLES_ClearAll();
ARX_BOOMS_ClearAll();
ARX_MAGICAL_FLARES_FirstInit();
strcpy(LastLoadedScene,"");
strcpy(temp2,"Graph\\Levels\\Level");
switch (Project.demo)
{
case NOLEVEL:
temp2[0] = 0;
break;
case LEVELDEMO:
strcat(temp2, "Demo\\");
break;
case LEVELDEMO2:
strcat(temp2, "Demo2\\");
break;
case LEVELDEMO3:
strcat(temp2, "Demo3\\");
break;
case LEVELDEMO4:
strcat(temp2, "Demo4\\");
break;
case LEVEL0:
strcat(temp2, "0\\");
break;
case LEVEL1:
strcat(temp2, "1\\");
break;
case LEVEL2:
strcat(temp2, "2\\");
break;
case LEVEL3:
strcat(temp2, "3\\");
break;
case LEVEL4:
strcat(temp2, "4\\");
break;
case LEVEL5:
strcat(temp2, "5\\");
break;
case LEVEL6:
strcat(temp2, "6\\");
break;
case LEVEL7:
strcat(temp2, "7\\");
break;
case LEVEL8:
strcat(temp2, "8\\");
break;
case LEVEL9:
strcat(temp2, "9\\");
break;
case LEVEL10:
strcat(temp2, "10\\");
break;
case LEVEL11:
strcat(temp2, "11\\");
break;
case LEVEL12:
strcat(temp2, "12\\");
break;
case LEVEL13:
strcat(temp2, "13\\");
break;
case LEVEL14:
strcat(temp2, "14\\");
break;
case LEVEL15:
strcat(temp2, "15\\");
break;
case LEVEL16:
strcat(temp2, "16\\");
break;
case LEVEL17:
strcat(temp2, "17\\");
break;
case LEVEL18:
strcat(temp2, "18\\");
break;
case LEVEL19:
strcat(temp2, "19\\");
break;
case LEVEL20:
strcat(temp2, "20\\");
break;
case LEVEL21:
strcat(temp2, "21\\");
break;
case LEVEL22:
strcat(temp2, "22\\");
break;
case LEVEL23:
strcat(temp2, "23\\");
break;
case LEVEL24:
strcat(temp2, "24\\");
break;
case LEVEL25:
strcat(temp2, "25\\");
break;
case LEVEL26:
strcat(temp2, "26\\");
break;
case LEVEL27:
strcat(temp2, "27\\");
break;
default:
temp2[0] = 0;
}
memset(&DefaultBkg,0,sizeof(EERIE_BACKGROUND));
ACTIVEBKG=&DefaultBkg;
InitBkg(ACTIVEBKG,MAX_BKGX,MAX_BKGZ,BKG_SIZX,BKG_SIZZ);
InitNodes(1);
player.size.y=subj.size.y=-PLAYER_BASE_HEIGHT;
player.size.x=subj.size.x=PLAYER_BASE_RADIUS;
player.size.z=subj.size.z=PLAYER_BASE_RADIUS;
player.desiredangle.a=player.angle.a=subj.angle.a=3.f;
player.desiredangle.b=player.angle.b=subj.angle.b=268.f;
player.desiredangle.g=player.angle.g=subj.angle.g=0.f;
subj.pos.x=900.f;
subj.pos.y=PLAYER_BASE_HEIGHT;
subj.pos.z=4340.f;
subj.clip.left=0;
subj.clip.top=0;
subj.clip.right=640;
subj.clip.bottom=480;
subj.clipz0=0.f;
subj.clipz1=2.999f;
subj.centerx=subj.clip.right/2;
subj.centery=subj.clip.bottom/2;
subj.AddX=320.f;
subj.AddY=240.f;
subj.focal=BASE_FOCAL;
subj.Zdiv=3000.f;
subj.Zmul=1.f/subj.Zdiv;
subj.clip3D=60;
subj.type=CAM_SUBJVIEW;
subj.bkgcolor=0x00000000;
SetActiveCamera(&subj);
SetCameraDepth(2100.f);
memcpy(&bookcam,&subj,sizeof(EERIE_CAMERA));
memcpy(&raycam,&subj,sizeof(EERIE_CAMERA));
memcpy(&conversationcamera,&subj,sizeof(EERIE_CAMERA));
memcpy(&DynLightCam,&subj,sizeof(EERIE_CAMERA));
raycam.centerx=320;
raycam.centery=320;
raycam.AddX=320.f;
raycam.AddY=320.f;
bookcam.angle.a=0.f;
bookcam.angle.b=0.f;
bookcam.angle.g=0.f;
bookcam.pos.x = 0.f;
bookcam.pos.y=0.f;
bookcam.pos.z=0.f;
bookcam.focal=BASE_FOCAL;
map.pos.x=1500.f;
map.pos.y=-6000.f;
map.pos.z=1500.f;
map.angle.a=90.f;
map.angle.b=0.f;
map.angle.g=0.f;
map.clip.left=0;
map.clip.top=0;
map.clip.right=640;
map.clip.bottom=480;
map.clipz0=0.001f;
map.clipz1=0.999f;
map.centerx=(map.clip.right-map.clip.left)/2;
map.centery=(map.clip.bottom-map.clip.top)/2;
map.AddX=320.f;
map.AddY=240.f;
map.focal=400.f;
map.Zdiv=3000.f;
map.Zmul=1.f/map.Zdiv;
map.clip3D=1000;
map.type=CAM_TOPVIEW;
map.bkgcolor=0x001F1F55;
SetActiveCamera(&map);
SetCameraDepth(10000.f);
danaeApp.MustRefresh=TRUE;
for (long i=0;i<32;i++)
memcpy(&TCAM[i],&subj,sizeof(EERIE_CAMERA));
ACTIVEBKG->ambient.r = 0.09f;
ACTIVEBKG->ambient.g = 0.09f;
ACTIVEBKG->ambient.b = 0.09f;
ACTIVEBKG->ambient255.r=ACTIVEBKG->ambient.r*255.f;
ACTIVEBKG->ambient255.g=ACTIVEBKG->ambient.g*255.f;
ACTIVEBKG->ambient255.b=ACTIVEBKG->ambient.b*255.f;
ARX_Text_Init();
LoadSysTextures();
CreateInterfaceTextureContainers();
if (MOULINEX)
{
}
else if (LaunchDemo)
{
if ((FINAL_RELEASE)
&& (pMenuConfig->bFullScreen || AUTO_FULL_SCREEN )
)
{
DanaeSwitchFullScreen();
}
LaunchDemo=0;
SPLASH_THINGS_STAGE=11;
}
else if (temp2[0]!=0)
{
char ftemp[256];
strcpy(ftemp,temp2);
MakeDir(temp,temp2);
if (FastSceneLoad(ftemp))
{
FASTmse=1;
goto suite;
}
ARX_SOUND_PlayCinematic("Editor_Humiliation.wav");
mse=PAK_MultiSceneToEerie(temp);
suite:
;
EERIEPOLY_Compute_PolyIn();
strcpy(LastLoadedScene,temp2);
}
if ((GAME_EDITOR) && (!MOULINEX))
LaunchInteractiveObjectsApp( danaeApp.m_hWnd);
}
void Dbg_str(char * txt)
{
}
__forceinline void LaunchCDROMCheck(long param)
{
return;
if (param==0)
{
// Randomize Check 5% chance per call.
if (rnd()<0.95f)
return;
}
//Place CDROM Checking code here...
}
//*************************************************************************************
// DANAEApp EntryPoint
//*************************************************************************************
int HandlerMemory(size_t stSize)
{
if( danaeApp.m_hWnd)
{
ShowWindow(danaeApp.m_hWnd,SW_MINIMIZE|SW_HIDE);
}
MessageBox(NULL,"Fatal memory error!!!","Arx fatalis",MB_ICONERROR);
exit(-1);
}
//-----------------------------------------------------------------------------
HMODULE hSteamLibrary = NULL;
#ifdef ARX_STEAM
typedef int (STEAM_CALL *SteamStartupFn)( unsigned int uUsingMask, TSteamError *pError );
typedef int (STEAM_CALL *SteamCleanupFn)( TSteamError *pError );
typedef int (STEAM_CALL *SteamGetAppPurchaseCountryFn)( unsigned int uAppId, char *szCountryBuf, unsigned int uBufSize, int * pPurchaseTime, TSteamError *pError );
typedef int (STEAM_CALL *SteamIsSubscribedFn)( unsigned int uSubscriptionId, int *pbIsSubscribed, int *pbIsSubscriptionPending, TSteamError *pError );
SteamStartupFn pSteamStartup = NULL;
SteamCleanupFn pSteamCleanup = NULL;
SteamGetAppPurchaseCountryFn pSteamGetAppPurchaseCountry = NULL;
SteamIsSubscribedFn pSteamIsSubscribed = NULL;
bool InitSteam()
{
hSteamLibrary = LoadLibrary( "steam.dll" );
if( hSteamLibrary )
{
pSteamStartup = (SteamStartupFn)GetProcAddress( hSteamLibrary, "SteamStartup" );
pSteamCleanup = (SteamCleanupFn)GetProcAddress( hSteamLibrary, "SteamCleanup" );
pSteamGetAppPurchaseCountry = (SteamGetAppPurchaseCountryFn)GetProcAddress( hSteamLibrary, "SteamGetAppPurchaseCountry" );
pSteamIsSubscribed = (SteamIsSubscribedFn)GetProcAddress( hSteamLibrary, "SteamIsSubscribed" );
if(
(!pSteamStartup)||
(!pSteamCleanup)||
(!pSteamGetAppPurchaseCountry)||
(!pSteamIsSubscribed)
)
{
exit(0);
}
TSteamError Error;
SteamStartEngine( &Error );
if( !pSteamStartup( STEAM_USING_LOGGING|STEAM_USING_ACCOUNT|STEAM_USING_USERID, &Error ) )
{
exit(0);
}
}
return hSteamLibrary? true : false;
}
//-----------------------------------------------------------------------------
bool ReleaseSteam()
{
if( hSteamLibrary )
{
if( pSteamCleanup )
{
TSteamError Error;
pSteamCleanup(&Error);
}
FreeLibrary( hSteamLibrary );
}
return true;
}
//-----------------------------------------------------------------------------
bool IsDemo()
{
TSteamError steamError;
int isSubscribed = 0, isPending = 1;
int retVal;
retVal = SteamIsAppSubscribed( 1700, &isSubscribed, &isPending, &steamError ); // ARKANE : modified for MM on steam
if ( retVal && steamError.eSteamError == eSteamErrorNone )
{
if ( !isSubscribed ) // if they don't own HL2 this must be the demo!
{
return true;
}
}
return false;
}
#endif
//-----------------------------------------------------------------------------
bool IsNoGore( void )
{
#ifdef ARX_STEAM
char szCountry[128];
int iPurchaseTime;
bool bReducedGore = false;
TSteamError steamError;
memset( szCountry, 0, 128 );
iPurchaseTime = 0;
int bIsSubscribed1 = false;
int bIsSubscribed2 = false;
int bIsPending = false;
pSteamGetAppPurchaseCountry( 1700, szCountry, 128, &iPurchaseTime, &steamError );
if( !stricmp( szCountry, "de" ) )
{
return true;
}
return false;
#else
return GERMAN_VERSION? true : false;
#endif
}
//-----------------------------------------------------------------------------
INT WINAPI WinMain( HINSTANCE _hInstance, HINSTANCE, LPSTR strCmdLine, INT )
{
#ifdef _DEBUG
ARX_LOG_INIT();
#endif // _DEBUG
#ifdef ARX_STEAM
InitSteam();
if( IsDemo() )
{
FINAL_COMMERCIAL_DEMO = 1;
}
#endif
_set_new_mode(1); //memory handler activated for malloc too
_set_new_handler(HandlerMemory);
ARX_MINIMAP_Reset();
int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); // Get current flag
flag |= _CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF;// Turn on leak-checking bit
_CrtSetDbgFlag(flag); // Set flag to the new value
_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);
_CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDOUT);
_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT);
long i;
hInstance = _hInstance;
if (FINAL_COMMERCIAL_GAME)
{
ARX_SOUND_INIT=1;
FOR_EXTERNAL_PEOPLE=1;
ARX_DEMO=0;
}
else if (FINAL_COMMERCIAL_DEMO)
{
ARX_SOUND_INIT=1;
FOR_EXTERNAL_PEOPLE=1;
ARX_DEMO=1;
}
if (FOR_EXTERNAL_PEOPLE)
{
ARX_SOUND_INIT = 1;
ALLOW_CHEATS = 0;
CEDRIC_VERSION = 0;
NO_TEXT_AT_ALL = 1;
if (!FINAL_COMMERCIAL_DEMO)
ARX_DEMO = 0;
FAST_SPLASHES = 0;
FORCE_SHOW_FPS = 0;
FINAL_RELEASE = 1;
#ifdef _DEBUG
AUTO_FULL_SCREEN = 0;
#endif
DEBUG_FRUSTRUM = 0;
USE_D3DFOG = 1; // <-------------------- FOG
GAME_EDITOR = 0;
NEED_EDITOR = 0;
TRUEFIGHT = 0;
}
else if (CEDRIC_VERSION)
{
ARX_DEMO=0;
FAST_SPLASHES=1;
FORCE_SHOW_FPS=1;
FINAL_RELEASE=1; // 1 with pack or 0 without pack
AUTO_FULL_SCREEN=0;
USE_D3DFOG=1;
}
CalcFPS(true);
HERMES_Memory_Security_On(32000);
ARX_MAPMARKER_Init();
for (i=0;i<8;i++) scursor[i]=NULL;
ARX_DAMAGES_SCREEN_SPLATS_Init();
ARX_SPELLS_CancelSpellTarget();
for (i=0;iCreationToolBar = IDR_DANAETOOLS;
danaeApp.ToolBar->Bitmap = IDB_DANAETB;
danaeApp.ToolBar->Buttons=tbButtons;
danaeApp.ToolBar->ToolBarNb=23;
danaeApp.ToolBar->Type=EERIE_TOOLBAR_TOP;
danaeApp.ToolBar->String=NULL;
}
else
{
danaeApp.CreationFlags= WCF_NOSTDPOPUP;
if (GAME_EDITOR) danaeApp.CreationFlags|= WCF_ACCEPTFILES;
}
Dbg_str("Application Creation");
g_pD3DApp = &danaeApp;
if( FAILED( danaeApp.Create( hInstance, strCmdLine ) ) )
return 0;
Dbg_str("Application Creation Success");
ShowWindow(danaeApp.m_hWnd, SW_HIDE);
MAIN_PROGRAM_HANDLE=danaeApp.m_hWnd;
danaeApp.m_pFramework->bitdepth=Project.bits;
if ((!MOULINEX) && (!FINAL_RELEASE))
{
char texx[64];
strcpy(texx,"GaiaMessages");
GaiaWM=RegisterWindowMessage(texx);
}
Dbg_str("Sound Init");
if ( (Project.soundmode != 0)
&& ARX_SOUND_INIT )
ARX_SOUND_Init(MAIN_PROGRAM_HANDLE);
Dbg_str("Sound Init Success");
Dbg_str("DInput Init");
ARX_INPUT_Init_Game_Impulses();
pGetInfoDirectInput = new CDirectInput();
char szPath[256];
sprintf( szPath, "%s\\cfg.ini", Project.workingdir );
if( !FileExist( szPath ) )
{
sprintf(szPath, "%s\\cfg_default.ini", Project.workingdir );
}
pMenuConfig=new CMenuConfig(szPath);
pMenuConfig->ReadAll();
Dbg_str("DInput Init Success");
if (pMenuConfig->bEAX)
{
ARXMenu_Options_Audio_SetEAX(true);
}
ARX_MINIMAP_FirstInit();
ForceSendConsole("DANAE Runnning",1,0,(HWND)danaeApp.m_hWnd);
i = 10;
Dbg_str("AInput Init");
while (!ARX_INPUT_Init(hInstance,danaeApp.m_hWnd))
{
Sleep(30);
i--;
if (i==0)
{
ShowPopup("Unable To Initialize ARX INPUT, Leaving...");
ARX_INPUT_Release();
if (MAIN_PROGRAM_HANDLE!=NULL)
SendMessage(MAIN_PROGRAM_HANDLE,WM_CLOSE,0,0);
exit(0);
}
SetActiveWindow(danaeApp.m_hWnd);
SetWindowPos(danaeApp.m_hWnd,HWND_TOP,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE);
}
Dbg_str("AInput Init Success");
//read from cfg file
if (strlen(Project.localisationpath)==0)
{
strcpy(Project.localisationpath,"english");
}
ShowWindow(danaeApp.m_hWnd, SW_SHOW);
//-------------------------------------------------------------------------
char tex[512];
if (GAME_EDITOR)
sprintf(tex,"DANAE Project - %s",Project.workingdir);
else
sprintf(tex,"ARX Fatalis");
if (MOULINEX)
sprintf(tex,"MOULINEX - %s",Project.workingdir);
SetWindowTitle(danaeApp.m_hWnd,tex);
Project.interfacergb.r = 0.46f;
Project.interfacergb.g = 0.46f;
Project.interfacergb.b = 1.f;
Project.torch.r=1.f;
Project.torch.g = 0.8f;
Project.torch.b = 0.66666f;
Dbg_str("InitializeDanae");
InitializeDanae();
Dbg_str("InitializeDanae Success");
Dbg_str("DanaeApp RUN");
danaeApp.m_bReady = TRUE;
char fic[256];
sprintf(fic,"%sGraph\\Obj3D\\Interactive\\Player\\G.ASL",Project.workingdir);
LaunchCDROMCheck(0);
HRESULT hr=danaeApp.Run();
#ifdef ARX_STEAM
ReleaseSteam();
#endif
#ifdef _DEBUG
ARX_LOG_CLEAN();
#endif // _DEBUG
return hr;
}
//*************************************************************************************
// DANAE()
// Application constructor. Sets attributes for the app.
//*************************************************************************************
DANAE::DANAE() : CD3DApplication()
{
m_strWindowTitle = TEXT("ARX Fatalis");
m_bAppUseZBuffer = TRUE;
m_bAppUseStereo = FALSE;
m_bShowStats = TRUE;
m_fnConfirmDevice = NULL;
m_hWnd=NULL;
}
//-----------------------------------------------------------------------------
bool DANAE::DANAEStartRender()
{
return m_pFramework->StartRender();
}
//-----------------------------------------------------------------------------
bool DANAE::DANAEEndRender()
{
return m_pFramework->EndRender();
}
//-----------------------------------------------------------------------------
TextureContainer * _GetTexture_NoRefinement(char * text)
{
return (GetTextureFile_NoRefinement(text));
}
//*************************************************************************************
// INTERACTIVE_OBJ * FlyingOverObject(EERIE_S2D * pos)
//-------------------------------------------------------------------------------------
// FUNCTION/RESULT:
// Returns IO under cursor, be it in inventories or in scene
// Returns NULL if no IO under cursor
//*************************************************************************************
INTERACTIVE_OBJ * FlyingOverObject(EERIE_S2D * pos,long flag)
{
if ((flag & 1) && danaeApp.Lock())
{
INTERACTIVE_OBJ * io=GetFromInventory(pos);
if (io)
{
danaeApp.Unlock();
return io;
}
if (InInventoryPos(pos))
{
danaeApp.Unlock();
return NULL;
}
if ((io=InterClick(pos,flag))!=NULL)
{
danaeApp.Unlock();
return io;
}
danaeApp.Unlock();
return NULL;
}
else
{
INTERACTIVE_OBJ * io=GetFromInventory(pos);
if (io)
return io;
if (InInventoryPos(pos))
return NULL;
if ((io=InterClick(pos,flag))!=NULL)
return io;
return NULL;
}
}
extern long cur_rf;
extern unsigned long FALLING_TIME;
extern long ARX_NPC_ApplyCuts(INTERACTIVE_OBJ * io);
//*************************************************************************************
void LoadSysTextures()
{
char temp[256];
long i;
for (i=1;i<10;i++)
{
sprintf(temp,"Graph\\Particles\\shine%d.bmp",i);
flaretc.shine[i]=_GetTexture_NoRefinement(temp);
}
memset(spellicons, 0, sizeof(SPELL_ICON) * SPELL_COUNT);
for (i=0;iname, _T("system_spell_name_magic_sight"));
ARX_Allocate_Text(current->description, _T("system_spell_description_magic_sight"));
current->level=1;
current->spellid=SPELL_MAGIC_SIGHT;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_magic_sight.bmp");
current->symbols[0]=RUNE_MEGA;
current->symbols[1]=RUNE_VISTA;
// Magic_Missile Level 1
current=&spellicons[SPELL_MAGIC_MISSILE];
ARX_Allocate_Text(current->name, _T("system_spell_name_magic_projectile"));
ARX_Allocate_Text(current->description, _T("system_spell_description_magic_projectile"));
current->level=1;
current->spellid=SPELL_MAGIC_MISSILE;
current->bDuration = false;
current->bAudibleAtStart = true;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_magic_missile.bmp");
current->symbols[0]=RUNE_AAM;
current->symbols[1]=RUNE_TAAR;
// Ignit Level 1
current=&spellicons[SPELL_IGNIT];
ARX_Allocate_Text(current->name,_T("system_spell_name_ignit"));
ARX_Allocate_Text(current->description,_T("system_spell_description_ignit"));
current->level=1;
current->spellid=SPELL_IGNIT;
current->bDuration = false;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_ignite.bmp");
current->symbols[0]=RUNE_AAM;
current->symbols[1]=RUNE_YOK;
// Douse Level 1
current=&spellicons[SPELL_DOUSE];
ARX_Allocate_Text(current->name,_T("system_spell_name_douse"));
ARX_Allocate_Text(current->description,_T("system_spell_description_douse"));
current->level=1;
current->spellid=SPELL_DOUSE;
current->bDuration = false;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_douse.bmp");
current->symbols[0]=RUNE_NHI;
current->symbols[1]=RUNE_YOK;
// Activate_Portal Level 1
current=&spellicons[SPELL_ACTIVATE_PORTAL];
ARX_Allocate_Text(current->name,_T("system_spell_name_activate_portal"));
ARX_Allocate_Text(current->description,_T("system_spell_description_activate_portal"));
current->level=1;
current->spellid=SPELL_ACTIVATE_PORTAL;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_activate_portal.bmp");
current->symbols[0]=RUNE_MEGA;
current->symbols[1]=RUNE_SPACIUM;
current->bSecret = true;
// Heal Level 2
current=&spellicons[SPELL_HEAL];
ARX_Allocate_Text(current->name,_T("system_spell_name_heal"));
ARX_Allocate_Text(current->description,_T("system_spell_description_heal"));
current->level=2;
current->spellid=SPELL_HEAL;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_heal.bmp");
current->symbols[0]=RUNE_MEGA;
current->symbols[1]=RUNE_VITAE;
// Detect_trap Level 2
current=&spellicons[SPELL_DETECT_TRAP];
ARX_Allocate_Text(current->name,_T("system_spell_name_detect_trap"));
ARX_Allocate_Text(current->description,_T("system_spell_description_detect_trap"));
current->level=2;
current->spellid=SPELL_DETECT_TRAP;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_detect_trap.bmp");
current->symbols[0]=RUNE_MORTE;
current->symbols[1]=RUNE_COSUM;
current->symbols[2]=RUNE_VISTA;
// Armor Level 2
current=&spellicons[SPELL_ARMOR];
ARX_Allocate_Text(current->name,_T("system_spell_name_armor"));
ARX_Allocate_Text(current->description,_T("system_spell_description_armor"));
current->level=2;
current->spellid=SPELL_ARMOR;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_armor.bmp");
current->symbols[0]=RUNE_MEGA;
current->symbols[1]=RUNE_KAOM;
// Lower Armor Level 2
current=&spellicons[SPELL_LOWER_ARMOR];
ARX_Allocate_Text(current->name,_T("system_spell_name_lower_armor"));
ARX_Allocate_Text(current->description,_T("system_spell_description_lower_armor"));
current->level=2;
current->spellid=SPELL_LOWER_ARMOR;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_lower_armor.bmp");
current->symbols[0]=RUNE_RHAA;
current->symbols[1]=RUNE_KAOM;
// Harm Level 2
current=&spellicons[SPELL_HARM];
ARX_Allocate_Text(current->name,_T("system_spell_name_harm"));
ARX_Allocate_Text(current->description,_T("system_spell_description_harm"));
current->level=2;
current->spellid=SPELL_HARM;
current->bAudibleAtStart = true;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_harm.bmp");
current->symbols[0]=RUNE_RHAA;
current->symbols[1]=RUNE_VITAE;
current->bSecret = true;
// Speed Level 3
current=&spellicons[SPELL_SPEED];
ARX_Allocate_Text(current->name,_T("system_spell_name_speed"));
ARX_Allocate_Text(current->description,_T("system_spell_description_speed"));
current->level=3;
current->spellid=SPELL_SPEED;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_speed.bmp");
current->symbols[0]=RUNE_MEGA;
current->symbols[1]=RUNE_MOVIS;
// Reveal Level 3
current=&spellicons[SPELL_DISPELL_ILLUSION];
ARX_Allocate_Text(current->name,_T("system_spell_name_reveal"));
ARX_Allocate_Text(current->description,_T("system_spell_description_reveal"));
current->level=3;
current->spellid=SPELL_DISPELL_ILLUSION;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_reveal.bmp");
current->symbols[0]=RUNE_NHI;
current->symbols[1]=RUNE_STREGUM;
current->symbols[2]=RUNE_VISTA;
// Fireball Level 3
current=&spellicons[SPELL_FIREBALL];
ARX_Allocate_Text(current->name,_T("system_spell_name_fireball"));
ARX_Allocate_Text(current->description,_T("system_spell_description_fireball"));
current->level=3;
current->spellid=SPELL_FIREBALL;
current->bDuration = false;
current->bAudibleAtStart = true;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_fireball.bmp");
current->symbols[0]=RUNE_AAM;
current->symbols[1]=RUNE_YOK;
current->symbols[2]=RUNE_TAAR;
// Create Food Level 3
current=&spellicons[SPELL_CREATE_FOOD];
ARX_Allocate_Text(current->name,_T("system_spell_name_create_food"));
ARX_Allocate_Text(current->description,_T("system_spell_description_create_food"));
current->level=3;
current->spellid=SPELL_CREATE_FOOD;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_create_food.bmp");
current->symbols[0]=RUNE_AAM;
current->symbols[1]=RUNE_VITAE;
current->symbols[2]=RUNE_COSUM;
// Ice Projectile Level 3
current=&spellicons[SPELL_ICE_PROJECTILE];
ARX_Allocate_Text(current->name,_T("system_spell_name_ice_projectile"));
ARX_Allocate_Text(current->description,_T("system_spell_description_ice_projectile"));
current->level=3;
current->spellid=SPELL_ICE_PROJECTILE;
current->bDuration = false;
current->bAudibleAtStart = true;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_iceball.bmp");
current->symbols[0]=RUNE_AAM;
current->symbols[1]=RUNE_FRIDD;
current->symbols[2]=RUNE_TAAR;
current->bSecret = true;
// Bless Level 4
current=&spellicons[SPELL_BLESS];
ARX_Allocate_Text(current->name,_T("system_spell_name_sanctify"));
ARX_Allocate_Text(current->description,_T("system_spell_description_sanctify"));
current->level=4;
current->spellid=SPELL_BLESS;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_bless.bmp");
current->symbols[0]=RUNE_MEGA;
current->symbols[1]=RUNE_STREGUM;
current->symbols[2]=RUNE_VITAE;
// Dispel_Field Level 4
current=&spellicons[SPELL_DISPELL_FIELD];
ARX_Allocate_Text(current->name,_T("system_spell_name_dispell_field"));
ARX_Allocate_Text(current->description,_T("system_spell_description_dispell_field"));
current->level=4;
current->spellid=SPELL_DISPELL_FIELD;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_dispell_field.bmp");
current->symbols[0]=RUNE_NHI;
current->symbols[1]=RUNE_SPACIUM;
// Cold Protection Level 4
current=&spellicons[SPELL_COLD_PROTECTION];
ARX_Allocate_Text(current->name,_T("system_spell_name_cold_protection"));
ARX_Allocate_Text(current->description,_T("system_spell_description_cold_protection"));
current->level=4;
current->spellid=SPELL_COLD_PROTECTION;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_protection_cold.bmp");
current->symbols[0]=RUNE_FRIDD;
current->symbols[1]=RUNE_KAOM;
current->bSecret = true;
// Fire Protection Level 4
current=&spellicons[SPELL_FIRE_PROTECTION];
ARX_Allocate_Text(current->name,_T("system_spell_name_fire_protection"));
ARX_Allocate_Text(current->description,_T("system_spell_description_fire_protection"));
current->level=4;
current->spellid=SPELL_FIRE_PROTECTION;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_protection_fire.bmp");
current->symbols[0]=RUNE_YOK;
current->symbols[1]=RUNE_KAOM;
// Telekinesis Level 4
current=&spellicons[SPELL_TELEKINESIS];
ARX_Allocate_Text(current->name,_T("system_spell_name_telekinesis"));
ARX_Allocate_Text(current->description,_T("system_spell_description_telekinesis"));
current->level=4;
current->spellid=SPELL_TELEKINESIS;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_telekinesis.bmp");
current->symbols[0]=RUNE_SPACIUM;
current->symbols[1]=RUNE_COMUNICATUM;
// Curse Level 4
current=&spellicons[SPELL_CURSE];
ARX_Allocate_Text(current->name,_T("system_spell_name_curse"));
ARX_Allocate_Text(current->description,_T("system_spell_description_curse"));
current->level=4;
current->spellid=SPELL_CURSE;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_curse.bmp");
current->symbols[0]=RUNE_RHAA;
current->symbols[1]=RUNE_STREGUM;
current->symbols[2]=RUNE_VITAE;
current->bSecret = true;
// Rune of Guarding Level 5
current=&spellicons[SPELL_RUNE_OF_GUARDING];
ARX_Allocate_Text(current->name,_T("system_spell_name_rune_guarding"));
ARX_Allocate_Text(current->description,_T("system_spell_description_rune_guarding"));
current->level=5;
current->spellid=SPELL_RUNE_OF_GUARDING;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_rune_guarding.bmp");
current->symbols[0]=RUNE_AAM;
current->symbols[1]=RUNE_MORTE;
current->symbols[2]=RUNE_COSUM;
// Levitate Level 5
current=&spellicons[SPELL_LEVITATE];
ARX_Allocate_Text(current->name,_T("system_spell_name_levitate"));
ARX_Allocate_Text(current->description,_T("system_spell_description_levitate"));
current->level=5;
current->spellid=SPELL_LEVITATE;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_levitate.bmp");
current->symbols[0]=RUNE_MEGA;
current->symbols[1]=RUNE_SPACIUM;
current->symbols[2]=RUNE_MOVIS;
// Cure Poison Level 5
current=&spellicons[SPELL_CURE_POISON];
ARX_Allocate_Text(current->name,_T("system_spell_name_cure_poison"));
ARX_Allocate_Text(current->description,_T("system_spell_description_cure_poison"));
current->level=5;
current->spellid=SPELL_CURE_POISON;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_cure_poison.bmp");
current->symbols[0]=RUNE_NHI;
current->symbols[1]=RUNE_CETRIUS;
// Repel Undead Level 5
current=&spellicons[SPELL_REPEL_UNDEAD];
ARX_Allocate_Text(current->name,_T("system_spell_name_repel_undead"));
ARX_Allocate_Text(current->description,_T("system_spell_description_repel_undead"));
current->level=5;
current->spellid=SPELL_REPEL_UNDEAD;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_repel_undead.bmp");
current->symbols[0]=RUNE_MORTE;
current->symbols[1]=RUNE_KAOM;
// Poison Projection Level 5
current=&spellicons[SPELL_POISON_PROJECTILE];
ARX_Allocate_Text(current->name,_T("system_spell_name_poison_projection"));
ARX_Allocate_Text(current->description,_T("system_spell_description_poison_projection"));
current->level=5;
current->spellid=SPELL_POISON_PROJECTILE;
current->bDuration = false;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_poison_projection.bmp");
current->symbols[0]=RUNE_AAM;
current->symbols[1]=RUNE_CETRIUS;
current->symbols[2]=RUNE_TAAR;
current->bSecret = true;
// Raise Dead Level 6
current=&spellicons[SPELL_RISE_DEAD];
ARX_Allocate_Text(current->name,_T("system_spell_name_raise_dead"));
ARX_Allocate_Text(current->description,_T("system_spell_description_raise_dead"));
current->level=6;
current->spellid=SPELL_RISE_DEAD;
current->bAudibleAtStart = true;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_raise_dead.bmp");
current->symbols[0]=RUNE_AAM;
current->symbols[1]=RUNE_MORTE;
current->symbols[2]=RUNE_VITAE;
// Paralyse Dead Level 6
current=&spellicons[SPELL_PARALYSE];
ARX_Allocate_Text(current->name,_T("system_spell_name_paralyse"));
ARX_Allocate_Text(current->description,_T("system_spell_description_paralyse"));
current->level=6;
current->spellid=SPELL_PARALYSE;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_paralyse.bmp");
current->symbols[0]=RUNE_NHI;
current->symbols[1]=RUNE_MOVIS;
// Create Field Dead Level 6
current=&spellicons[SPELL_CREATE_FIELD];
ARX_Allocate_Text(current->name,_T("system_spell_name_create_field"));
ARX_Allocate_Text(current->description,_T("system_spell_description_create_field"));
current->level=6;
current->spellid=SPELL_CREATE_FIELD;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_create_field.bmp");
current->symbols[0]=RUNE_AAM;
current->symbols[1]=RUNE_KAOM;
current->symbols[2]=RUNE_SPACIUM;
// Disarm Trap Level 6
current=&spellicons[SPELL_DISARM_TRAP];
ARX_Allocate_Text(current->name,_T("system_spell_name_disarm_trap"));
ARX_Allocate_Text(current->description,_T("system_spell_description_disarm_trap"));
current->level=6;
current->spellid=SPELL_DISARM_TRAP;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_disarm_trap.bmp");
current->symbols[0]=RUNE_NHI;
current->symbols[1]=RUNE_MORTE;
current->symbols[2]=RUNE_COSUM;
// Slow_Down Level 6 // SECRET SPELL
current=&spellicons[SPELL_SLOW_DOWN];
ARX_Allocate_Text(current->name,_T("system_spell_name_slowdown"));
ARX_Allocate_Text(current->description,_T("system_spell_description_slowdown"));
current->level=6;
current->spellid=SPELL_SLOW_DOWN;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_slow_down.bmp");
current->symbols[0]=RUNE_RHAA;
current->symbols[1]=RUNE_MOVIS;
current->bSecret = true;
// Flying Eye Level 7
current=&spellicons[SPELL_FLYING_EYE];
ARX_Allocate_Text(current->name,_T("system_spell_name_flying_eye"));
ARX_Allocate_Text(current->description,_T("system_spell_description_flying_eye"));
current->level=7;
current->spellid=SPELL_FLYING_EYE;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_flying_eye.bmp");
current->symbols[0]=RUNE_VISTA;
current->symbols[1]=RUNE_MOVIS;
// Fire Field Eye Level 7
current=&spellicons[SPELL_FIRE_FIELD];
ARX_Allocate_Text(current->name,_T("system_spell_name_fire_field"));
ARX_Allocate_Text(current->description,_T("system_spell_description_fire_field"));
current->level=7;
current->spellid=SPELL_FIRE_FIELD;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_create_fire_field.bmp");
current->symbols[0]=RUNE_AAM;
current->symbols[1]=RUNE_YOK;
current->symbols[2]=RUNE_SPACIUM;
// Ice Field Level 7
current=&spellicons[SPELL_ICE_FIELD];
ARX_Allocate_Text(current->name,_T("system_spell_name_ice_field"));
ARX_Allocate_Text(current->description,_T("system_spell_description_ice_field"));
current->level=7;
current->spellid=SPELL_ICE_FIELD;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_create_cold_field.bmp");
current->symbols[0]=RUNE_AAM;
current->symbols[1]=RUNE_FRIDD;
current->symbols[2]=RUNE_SPACIUM;
current->bSecret = true;
// Lightning Strike Level 7
current=&spellicons[SPELL_LIGHTNING_STRIKE];
ARX_Allocate_Text(current->name,_T("system_spell_name_lightning_strike"));
ARX_Allocate_Text(current->description,_T("system_spell_description_lightning_strike"));
current->level=7;
current->spellid=SPELL_LIGHTNING_STRIKE;
current->bDuration = false;
current->bAudibleAtStart = true;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_lightning_strike.bmp");
current->symbols[0]=RUNE_AAM;
current->symbols[1]=RUNE_FOLGORA;
current->symbols[2]=RUNE_TAAR;
// Confusion Level 7
current=&spellicons[SPELL_CONFUSE];
ARX_Allocate_Text(current->name,_T("system_spell_name_confuse"));
ARX_Allocate_Text(current->description,_T("system_spell_description_confuse"));
current->level=7;
current->spellid=SPELL_CONFUSE;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_confuse.bmp");
current->symbols[0]=RUNE_RHAA;
current->symbols[1]=RUNE_VISTA;
// Invisibility Level 8
current=&spellicons[SPELL_INVISIBILITY];
ARX_Allocate_Text(current->name,_T("system_spell_name_invisibility"));
ARX_Allocate_Text(current->description,_T("system_spell_description_invisibility"));
current->level=8;
current->spellid=SPELL_INVISIBILITY;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_invisibility.bmp");
current->symbols[0]=RUNE_NHI;
current->symbols[1]=RUNE_VISTA;
// Mana Drain Level 8
current=&spellicons[SPELL_MANA_DRAIN];
ARX_Allocate_Text(current->name,_T("system_spell_name_mana_drain"));
ARX_Allocate_Text(current->description,_T("system_spell_description_mana_drain"));
current->level=8;
current->spellid=SPELL_MANA_DRAIN;
current->bAudibleAtStart = true;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_drain_mana.bmp");
current->symbols[0]=RUNE_STREGUM;
current->symbols[1]=RUNE_MOVIS;
// Explosion Level 8
current=&spellicons[SPELL_EXPLOSION];
ARX_Allocate_Text(current->name,_T("system_spell_name_explosion"));
ARX_Allocate_Text(current->description,_T("system_spell_description_explosion"));
current->level=8;
current->spellid=SPELL_EXPLOSION;
current->bDuration = false;
current->bAudibleAtStart = true;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_explosion.bmp");
current->symbols[0]=RUNE_AAM;
current->symbols[1]=RUNE_MEGA;
current->symbols[2]=RUNE_MORTE;
// Enchant Weapon Level 8
current=&spellicons[SPELL_ENCHANT_WEAPON];
ARX_Allocate_Text(current->name,_T("system_spell_name_enchant_weapon"));
ARX_Allocate_Text(current->description,_T("system_spell_description_enchant_weapon"));
current->level=8;
current->spellid=SPELL_ENCHANT_WEAPON;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_enchant_weapon.bmp");
current->symbols[0]=RUNE_MEGA;
current->symbols[1]=RUNE_STREGUM;
current->symbols[2]=RUNE_COSUM;
// Life Drain Level 8 // SECRET SPELL
current=&spellicons[SPELL_LIFE_DRAIN];
ARX_Allocate_Text(current->name,_T("system_spell_name_life_drain"));
ARX_Allocate_Text(current->description,_T("system_spell_description_life_drain"));
current->level=8;
current->spellid=SPELL_LIFE_DRAIN;
current->bAudibleAtStart = true;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_drain_life.bmp");
current->symbols[0]=RUNE_VITAE;
current->symbols[1]=RUNE_MOVIS;
current->bSecret = true;
// Summon Creature Level 9
current=&spellicons[SPELL_SUMMON_CREATURE];
ARX_Allocate_Text(current->name,_T("system_spell_name_summon_creature"));
ARX_Allocate_Text(current->description,_T("system_spell_description_summon_creature"));
current->level=9;
current->spellid=SPELL_SUMMON_CREATURE;
current->bAudibleAtStart = true;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_summon_creature.bmp");
current->symbols[0]=RUNE_AAM;
current->symbols[1]=RUNE_VITAE;
current->symbols[2]=RUNE_TERA;
// FAKE Summon Creature Level 9
current=&spellicons[SPELL_FAKE_SUMMON];
ARX_Allocate_Text(current->name,_T("system_spell_name_summon_creature"));
ARX_Allocate_Text(current->description,_T("system_spell_description_summon_creature"));
current->level=9;
current->spellid=SPELL_FAKE_SUMMON;
current->bAudibleAtStart = true;
current->bSecret = true;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_summon_creature.bmp");
current->symbols[0]=RUNE_AAM;
current->symbols[1]=RUNE_VITAE;
current->symbols[2]=RUNE_TERA;
// Negate Magic Level 9
current=&spellicons[SPELL_NEGATE_MAGIC];
ARX_Allocate_Text(current->name,_T("system_spell_name_negate_magic"));
ARX_Allocate_Text(current->description,_T("system_spell_description_negate_magic"));
current->level=9;
current->spellid=SPELL_NEGATE_MAGIC;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_negate_magic.bmp");
current->symbols[0]=RUNE_NHI;
current->symbols[1]=RUNE_STREGUM;
current->symbols[2]=RUNE_SPACIUM;
// Incinerate Level 9
current=&spellicons[SPELL_INCINERATE];
ARX_Allocate_Text(current->name,_T("system_spell_name_incinerate"));
ARX_Allocate_Text(current->description,_T("system_spell_description_incinerate"));
current->level=9;
current->spellid=SPELL_INCINERATE;
current->bDuration = false;
current->bAudibleAtStart = true;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_incinerate.bmp");
current->symbols[0]=RUNE_AAM;
current->symbols[1]=RUNE_MEGA;
current->symbols[2]=RUNE_YOK;
// Mass paralyse Creature Level 9
current=&spellicons[SPELL_MASS_PARALYSE];
ARX_Allocate_Text(current->name,_T("system_spell_name_mass_paralyse"));
ARX_Allocate_Text(current->description,_T("system_spell_description_mass_paralyse"));
current->level=9;
current->spellid=SPELL_MASS_PARALYSE;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_mass_paralyse.bmp");
current->symbols[0]=RUNE_MEGA;
current->symbols[1]=RUNE_NHI;
current->symbols[2]=RUNE_MOVIS;
// Mass Lightning Strike Level 10
current=&spellicons[SPELL_MASS_LIGHTNING_STRIKE];
ARX_Allocate_Text(current->name,_T("system_spell_name_mass_lightning_strike"));
ARX_Allocate_Text(current->description,_T("system_spell_description_mass_lightning_strike"));
current->level=10;
current->spellid=SPELL_MASS_LIGHTNING_STRIKE;
current->bDuration = false;
current->bAudibleAtStart = true;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_mass_lighting_strike.bmp");
current->symbols[0]=RUNE_AAM;
current->symbols[1]=RUNE_FOLGORA;
current->symbols[2]=RUNE_SPACIUM;
// Control Target Level 10
current=&spellicons[SPELL_CONTROL_TARGET];
ARX_Allocate_Text(current->name,_T("system_spell_name_control_target"));
ARX_Allocate_Text(current->description,_T("system_spell_description_control_target"));
current->level=10;
current->spellid=SPELL_CONTROL_TARGET;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_control_target.bmp");
current->symbols[0]=RUNE_MOVIS;
current->symbols[1]=RUNE_COMUNICATUM;
// Freeze time Level 10
current=&spellicons[SPELL_FREEZE_TIME];
ARX_Allocate_Text(current->name,_T("system_spell_name_freeze_time"));
ARX_Allocate_Text(current->description,_T("system_spell_description_freeze_time"));
current->level=10;
current->spellid=SPELL_FREEZE_TIME;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_freeze_time.bmp");
current->symbols[0] = RUNE_RHAA;
current->symbols[1]=RUNE_TEMPUS;
// Mass incinerate Level 10
current=&spellicons[SPELL_MASS_INCINERATE];
ARX_Allocate_Text(current->name,_T("system_spell_name_mass_incinerate"));
ARX_Allocate_Text(current->description,_T("system_spell_description_mass_incinerate"));
current->level=10;
current->spellid=SPELL_MASS_INCINERATE;
current->bDuration = false;
current->bAudibleAtStart = true;
current->tc=_GetTexture_NoRefinement("Graph\\Interface\\Icons\\Spell_mass_incinerate.bmp");
current->symbols[0]=RUNE_MEGA;
current->symbols[1]=RUNE_AAM;
current->symbols[2]=RUNE_MEGA;
current->symbols[3]=RUNE_YOK;
Flying_Eye= _GetTexture_NoRefinement("Graph\\particles\\Flying_Eye_Fx.bmp");
specular= _GetTexture_NoRefinement("Graph\\particles\\specular.bmp");
enviro= _GetTexture_NoRefinement("Graph\\particles\\enviro.bmp");
sphere_particle= _GetTexture_NoRefinement("Graph\\particles\\sphere.bmp");
inventory_font= _GetTexture_NoRefinement("Graph\\interface\\font\\font10x10_inventory.bmp");
npc_fight= _GetTexture_NoRefinement("Graph\\interface\\icons\\follower_attack.bmp");
npc_follow= _GetTexture_NoRefinement("Graph\\interface\\icons\\follower_follow.bmp");
npc_stop= _GetTexture_NoRefinement("Graph\\interface\\icons\\follower_stop.bmp");
flaretc.lumignon= _GetTexture_NoRefinement("Graph\\Particles\\lumignon.bmp");
flaretc.lumignon2= _GetTexture_NoRefinement("Graph\\Particles\\lumignon2.bmp");
flaretc.plasm= _GetTexture_NoRefinement("Graph\\Particles\\plasm.bmp");
tflare= _GetTexture_NoRefinement("Graph\\Particles\\flare.bmp");
ombrignon= _GetTexture_NoRefinement("Graph\\particles\\ombrignon.bmp");
teleportae= _GetTexture_NoRefinement("Graph\\particles\\teleportae.bmp");
TC_fire= _GetTexture_NoRefinement("Graph\\particles\\fire.bmp");
TC_fire2= _GetTexture_NoRefinement("Graph\\particles\\fire2.bmp");
TC_smoke= _GetTexture_NoRefinement("Graph\\particles\\smoke.bmp");
zbtex= _GetTexture_NoRefinement("Graph\\particles\\zbtex.bmp");
TC_missile= _GetTexture_NoRefinement("Graph\\particles\\missile.bmp");
Z_map= _GetTexture_NoRefinement("Graph\\interface\\misc\\z-map.bmp");
Boom= _GetTexture_NoRefinement("Graph\\Particles\\boom.bmp");
lightsource_tc= _GetTexture_NoRefinement("Graph\\Particles\\light.bmp");
stealth_gauge_tc= _GetTexture_NoRefinement("Graph\\interface\\Icons\\Stealth_Gauge.bmp");
arx_logo_tc= _GetTexture_NoRefinement("Graph\\interface\\Icons\\Arx_logo_32.bmp");
iconequip[0]= _GetTexture_NoRefinement("Graph\\interface\\Icons\\equipment_sword.bmp");
iconequip[1]= _GetTexture_NoRefinement("Graph\\interface\\Icons\\equipment_shield.bmp");
iconequip[2]= _GetTexture_NoRefinement("Graph\\interface\\Icons\\equipment_helm.bmp");
iconequip[3]= _GetTexture_NoRefinement("Graph\\interface\\Icons\\equipment_chest.bmp");
iconequip[4]= _GetTexture_NoRefinement("Graph\\interface\\Icons\\equipment_leggings.bmp");
mecanism_tc= _GetTexture_NoRefinement("Graph\\interface\\Cursors\\Mecanism.bmp");
arrow_left_tc= _GetTexture_NoRefinement("Graph\\interface\\Icons\\Arrow_left.bmp");
for (i=0;ipos.x;
ePos.y = ACTIVECAM->pos.y;
ePos.z = ACTIVECAM->pos.z;
}
DANAE_KillCinematic();
char temp1[256];
char temp2[256];
sprintf(temp1,"%sGraph\\interface\\illustrations\\",Project.workingdir);
strcpy(temp2,temp1);
strcat(temp2,WILL_LAUNCH_CINE);
if (PAK_FileExist(temp2))
{
ControlCinematique->OneTimeSceneReInit();
if (LoadProject(ControlCinematique,temp1,WILL_LAUNCH_CINE))
{
if (CINE_PRELOAD) PLAY_LOADED_CINEMATIC=0;
else
{
PLAY_LOADED_CINEMATIC=1;
ARX_TIME_Pause();
}
strcpy(LAST_LAUNCHED_CINE,WILL_LAUNCH_CINE);
}
}
WILL_LAUNCH_CINE[0]=0;
}
void PlayerLaunchArrow_Test(float aimratio,float poisonous,EERIE_3D * pos,EERIE_3D * angle)
{
EERIE_3D position;
EERIE_3D vect;
EERIE_3D dvect,upvect;
EERIEMATRIX mat;
EERIE_QUAT quat;
float anglea;
float angleb;
float velocity;
position.x=pos->x;
position.y=pos->y;
position.z=pos->z;
anglea=DEG2RAD(angle->a);
angleb=DEG2RAD(angle->b);
vect.x=-EEsin(angleb)*EEcos(anglea);
vect.y= EEsin(anglea);
vect.z= EEcos(angleb)*EEcos(anglea);
Vector_Init(&upvect,0,0,-1);
VRotateX(&upvect,anglea);
VRotateY(&upvect,angleb);
Vector_Init(&upvect,0,-1,0);
VRotateX(&upvect,anglea);
VRotateY(&upvect,angleb);
MatrixSetByVectors(&mat,&dvect,&upvect);
QuatFromMatrix(quat,mat);
velocity=(aimratio+0.3f);
if (velocity<0.9f) velocity=0.9f;
EERIE_3D vv,v1,v2;
Vector_Init(&vv,0,0,1);
float aa=angle->a;
float ab=90-angle->b;
Vector_RotateZ(&v1,&vv,aa);
VRotateY(&v1,ab);
Vector_Init(&vv,0,-1,0);
Vector_RotateZ(&v2,&vv,aa);
VRotateY(&v2,ab);
EERIEMATRIX tmat;
MatrixSetByVectors(&tmat,&v1,&v2);
QuatFromMatrix(quat,tmat);
float wd=(float)ARX_EQUIPMENT_Apply(
inter.iobj[0],IO_EQUIPITEM_ELEMENT_Damages,1);
float weapon_damages=wd;
float damages=
weapon_damages
*(1.f+
(float)(player.Full_Skill_Projectile + player.Full_Attribute_Dexterity )*DIV50);
ARX_THROWN_OBJECT_Throw(ATO_TYPE_ARROW,
0, //source
&position,
&vect,
&upvect,
&quat,
velocity,
damages,
poisonous); //damages
}
extern long sp_max;
void PlayerLaunchArrow(float aimratio,float poisonous)
{
EERIE_3D position;
EERIE_3D vect;
EERIE_3D dvect,upvect;
EERIEMATRIX mat;
EERIE_QUAT quat;
float anglea;
float angleb;
float velocity;
if ((sp_max) && (poisonous<3.f))
poisonous=3.f;
position.x=player.pos.x;
position.y=player.pos.y+40.f;
position.z=player.pos.z;
if (inter.iobj[0]->obj->fastaccess.left_attach>=0)
{
Vector_Copy(&position,&inter.iobj[0]->obj->vertexlist3[inter.iobj[0]->obj->fastaccess.left_attach].v);
}
anglea=DEG2RAD(player.angle.a);
angleb=DEG2RAD(player.angle.b);
vect.x=-EEsin(angleb)*EEcos(anglea);
vect.y= EEsin(anglea);
vect.z= EEcos(angleb)*EEcos(anglea);
Vector_Init(&upvect,0,0,-1);
VRotateX(&upvect,anglea);
VRotateY(&upvect,angleb);
Vector_Init(&upvect,0,-1,0);
VRotateX(&upvect,anglea);
VRotateY(&upvect,angleb);
MatrixSetByVectors(&mat,&dvect,&upvect);
QuatFromMatrix(quat,mat);
velocity=(aimratio+0.3f);
if (velocity<0.9f) velocity=0.9f;
EERIE_3D vv,v1,v2;
Vector_Init(&vv,0,0,1);
float aa=player.angle.a;
float ab=90-player.angle.b;
Vector_RotateZ(&v1,&vv,aa);
VRotateY(&v1,ab);
Vector_Init(&vv,0,-1,0);
Vector_RotateZ(&v2,&vv,aa);
VRotateY(&v2,ab);
EERIEMATRIX tmat;
MatrixSetByVectors(&tmat,&v1,&v2);
QuatFromMatrix(quat,tmat);
float wd=(float)ARX_EQUIPMENT_Apply(
inter.iobj[0],IO_EQUIPITEM_ELEMENT_Damages,1);
float weapon_damages=wd;
float damages=
weapon_damages
*(1.f+
(float)(player.Full_Skill_Projectile + player.Full_Attribute_Dexterity )*DIV50);
ARX_THROWN_OBJECT_Throw(ATO_TYPE_ARROW,
0, //source
&position,
&vect,
&upvect,
&quat,
velocity,
damages,
poisonous); //damages
if (sp_max)
{
EERIE_3D angle;
EERIE_3D pos;
pos.x=player.pos.x;
pos.y=player.pos.y+40.f;
pos.z=player.pos.z;
angle.a=player.angle.a;
angle.b=player.angle.b+8;
angle.g=player.angle.g;
PlayerLaunchArrow_Test(aimratio,poisonous,&pos,&angle);
angle.a=player.angle.a;
angle.b=player.angle.b-8;
PlayerLaunchArrow_Test(aimratio,poisonous,&pos,&angle);
angle.a=player.angle.a;
angle.b=player.angle.b+4.f;
PlayerLaunchArrow_Test(aimratio,poisonous,&pos,&angle);
angle.a=player.angle.a;
angle.b=player.angle.b-4.f;
PlayerLaunchArrow_Test(aimratio,poisonous,&pos,&angle);
}
}
extern void ARX_POLYSPLAT_Add(EERIE_3D * poss,long type,EERIE_RGB * col,float size,long flags);
//*************************************************************************************
// FrameMove()
// Called once per frame.
//*************************************************************************************
HRESULT DANAE::FrameMove( FLOAT fTimeKey )
{
// To disable for demo
if ( !FINAL_COMMERCIAL_DEMO
&& !FINAL_COMMERCIAL_GAME
)
{
if (this->kbd.inkey[INKEY_F4])
{
this->kbd.inkey[INKEY_F4]=0;
ARX_TIME_Pause();
DialogBox( (HINSTANCE)GetWindowLong( this->m_hWnd, GWL_HINSTANCE ),
MAKEINTRESOURCE(IDD_LEVEL_SELECTOR), this->m_hWnd, ChangeLevelProc );
if (CHANGE_LEVEL_PROC_RESULT!=-1)
{
char levelnum[256];
char levelname[256];
GetLevelNameByNum(CHANGE_LEVEL_PROC_RESULT,levelnum);
sprintf(levelname,"LEVEL%s",levelnum);
char leveltarget[256];
strcpy(leveltarget,"no");
ARX_CHECK_LONG( player.angle.b );
ARX_CHANGELEVEL_Change( levelname, leveltarget, ARX_CLEAN_WARN_CAST_LONG( player.angle.b ), 0 );
}
ARX_TIME_UnPause();
}
// To Remove For Final Release !!!
if (ALLOW_CHEATS || GAME_EDITOR)
{
if (this->kbd.inkey[INKEY_F2])
{
this->kbd.inkey[INKEY_F2]=0;
ARX_TIME_Pause();
Pause(TRUE);
DialogBox( (HINSTANCE)GetWindowLong( this->m_hWnd, GWL_HINSTANCE ),
MAKEINTRESOURCE(IDD_OPTIONS), this->m_hWnd, OptionsProc );
EERIE_LIGHT_ChangeLighting();
Pause(FALSE);
ARX_TIME_UnPause();
}
else if (this->kbd.inkey[INKEY_F3])
{
this->kbd.inkey[INKEY_F3]=0;
ARX_TIME_Pause();
Pause(TRUE);
DialogBox( (HINSTANCE)GetWindowLong( this->m_hWnd, GWL_HINSTANCE ),
MAKEINTRESOURCE(IDD_OPTIONS2), this->m_hWnd, OptionsProc_2 );
Pause(FALSE);
ARX_TIME_UnPause();
}
else if (this->kbd.inkey[INKEY_O])
{
this->kbd.inkey[INKEY_O]=0;
ARX_SOUND_Reinit();
}
}
}
if (WILL_LAUNCH_CINE[0]) // Checks if a cinematic is waiting to be played...
{
LaunchWaitingCine();
}
return S_OK;
}
extern unsigned long LAST_JUMP_ENDTIME;
//*************************************************************************************
// Switches from/to Game Mode/Editor Mode
//*************************************************************************************
void SetEditMode(long ed, const bool stop_sound)
{
LAST_JUMP_ENDTIME=0;
if (!DONT_ERASE_PLAYER)
player.life=0.1f;
DeadTime=0;
ARX_GAME_Reset(1);
EERIEMouseButton=0;
if (ed)
{
EDITMODE=1;
if( ((danaeApp.m_pFramework)&&
(danaeApp.m_pFramework->m_bIsFullscreen))||
(FINAL_COMMERCIAL_GAME) )
{
USE_OLD_MOUSE_SYSTEM=0;
}
else
{
USE_OLD_MOUSE_SYSTEM=1;
}
}
else
{
EDITMODE=0;
USE_OLD_MOUSE_SYSTEM=0;
}
for (long i=0;ishow == SHOW_FLAG_HIDDEN) inter.iobj[i]->show = SHOW_FLAG_IN_SCENE;
else if (inter.iobj[i]->show == SHOW_FLAG_KILLED) inter.iobj[i]->show = SHOW_FLAG_IN_SCENE;
}
}
RestoreAllLightsInitialStatus();
if (stop_sound) ARX_SOUND_MixerStop(ARX_SOUND_MixerGame);
RestoreInitialIOStatus();
if (ed)
{
ARX_PATH_ComputeAllBoundingBoxes();
ARX_TIME_Pause();
}
else
{
ARX_SCRIPT_ResetAll(1);
EERIE_ANIMMANAGER_PurgeUnused();
}
if (!DONT_ERASE_PLAYER)
{
if ( (!FINAL_RELEASE)
&& (!FINAL_COMMERCIAL_GAME)
&& (!FINAL_COMMERCIAL_DEMO))
ARX_PLAYER_MakePowerfullHero();
else
ARX_PLAYER_MakeFreshHero();
}
}
//-----------------------------------------------------------------------------
void DANAE_ReleaseAllDatasDynamic()
{
if(ssol)
{
ReleaseEERIE3DObj(ssol);
ssol=NULL;
ssol_count=0;
}
if(slight)
{
ReleaseEERIE3DObj(slight);
slight=NULL;
slight_count=0;
}
if(srune)
{
ReleaseEERIE3DObj(srune);
srune=NULL;
srune_count=0;
}
if(smotte)
{
ReleaseEERIE3DObj(smotte);
smotte=NULL;
smotte_count=0;
}
if(stite)
{
ReleaseEERIE3DObj(stite);
stite=NULL;
stite_count=0;
}
if(smissile)
{
ReleaseEERIE3DObj(smissile);
smissile=NULL;
smissile_count=0;
}
if(spapi)
{
ReleaseEERIE3DObj(spapi);
spapi=NULL;
spapi_count=0;
}
if(sfirewave)
{
ReleaseEERIE3DObj(sfirewave);
sfirewave=NULL;
sfirewave_count=0;
}
if(svoodoo)
{
ReleaseEERIE3DObj(svoodoo);
svoodoo=NULL;
svoodoo_count=0;
}
}
//-----------------------------------------------------------------------------
void ReleaseDanaeBeforeRun()
{
if(necklace.lacet)
{
ReleaseEERIE3DObj(necklace.lacet);
necklace.lacet=NULL;
}
for (long i=0; i<20; i++)
{
if(necklace.runes[i])
{
ReleaseEERIE3DObj(necklace.runes[i]);
necklace.runes[i]=NULL;
}
if (necklace.pTexTab[i])
{
necklace.pTexTab[i]=NULL;
}
}
if(eyeballobj)
{
ReleaseEERIE3DObj(eyeballobj);
eyeballobj=NULL;
}
if(cabal)
{
ReleaseEERIE3DObj(cabal);
cabal=NULL;
}
if(nodeobj)
{
ReleaseEERIE3DObj(nodeobj);
nodeobj=NULL;
}
if(fogobj)
{
ReleaseEERIE3DObj(fogobj);
fogobj=NULL;
}
if(cameraobj)
{
ReleaseEERIE3DObj(cameraobj);
cameraobj=NULL;
}
if(markerobj)
{
ReleaseEERIE3DObj(markerobj);
markerobj=NULL;
}
if(arrowobj)
{
ReleaseEERIE3DObj(arrowobj);
arrowobj=NULL;
}
for (int i=0;iGetD3DDevice(), danaeApp.m_pFramework->m_dwRenderWidth, danaeApp.m_pFramework->m_dwRenderHeight);
memset(&necklace,0,sizeof(ARX_NECKLACE));
long old=GLOBAL_EERIETEXTUREFLAG_LOADSCENE_RELEASE;
GLOBAL_EERIETEXTUREFLAG_LOADSCENE_RELEASE=-1;
necklace.lacet= _LoadTheObj("Graph\\Interface\\book\\runes\\lacet.teo","..\\..\\..\\Obj3D\\textures\\");
necklace.runes[RUNE_AAM]= _LoadTheObj("Graph\\Interface\\book\\runes\\runes_aam.teo","..\\..\\..\\Obj3D\\textures\\");
necklace.runes[RUNE_CETRIUS]= _LoadTheObj("Graph\\Interface\\book\\runes\\runes_citrius.teo","..\\..\\..\\Obj3D\\textures\\");
necklace.runes[RUNE_COMUNICATUM]= _LoadTheObj("Graph\\Interface\\book\\runes\\runes_comunicatum.teo","..\\..\\..\\Obj3D\\textures\\");
necklace.runes[RUNE_COSUM]= _LoadTheObj("Graph\\Interface\\book\\runes\\runes_cosum.teo","..\\..\\..\\Obj3D\\textures\\");
necklace.runes[RUNE_FOLGORA]= _LoadTheObj("Graph\\Interface\\book\\runes\\runes_folgora.teo","..\\..\\..\\Obj3D\\textures\\");
necklace.runes[RUNE_FRIDD]= _LoadTheObj("Graph\\Interface\\book\\runes\\runes_fridd.teo","..\\..\\..\\Obj3D\\textures\\");
necklace.runes[RUNE_KAOM]= _LoadTheObj("Graph\\Interface\\book\\runes\\runes_kaom.teo","..\\..\\..\\Obj3D\\textures\\");
necklace.runes[RUNE_MEGA]= _LoadTheObj("Graph\\Interface\\book\\runes\\runes_mega.teo","..\\..\\..\\Obj3D\\textures\\");
necklace.runes[RUNE_MORTE]= _LoadTheObj("Graph\\Interface\\book\\runes\\runes_morte.teo","..\\..\\..\\Obj3D\\textures\\");
necklace.runes[RUNE_MOVIS]= _LoadTheObj("Graph\\Interface\\book\\runes\\runes_movis.teo","..\\..\\..\\Obj3D\\textures\\");
necklace.runes[RUNE_NHI]= _LoadTheObj("Graph\\Interface\\book\\runes\\runes_nhi.teo","..\\..\\..\\Obj3D\\textures\\");
necklace.runes[RUNE_RHAA]= _LoadTheObj("Graph\\Interface\\book\\runes\\runes_rhaa.teo","..\\..\\..\\Obj3D\\textures\\");
necklace.runes[RUNE_SPACIUM]= _LoadTheObj("Graph\\Interface\\book\\runes\\runes_spacium.teo","..\\..\\..\\Obj3D\\textures\\");
necklace.runes[RUNE_STREGUM]= _LoadTheObj("Graph\\Interface\\book\\runes\\runes_stregum.teo","..\\..\\..\\Obj3D\\textures\\");
necklace.runes[RUNE_TAAR]= _LoadTheObj("Graph\\Interface\\book\\runes\\runes_taar.teo","..\\..\\..\\Obj3D\\textures\\");
necklace.runes[RUNE_TEMPUS]= _LoadTheObj("Graph\\Interface\\book\\runes\\runes_tempus.teo","..\\..\\..\\Obj3D\\textures\\");
necklace.runes[RUNE_TERA]= _LoadTheObj("Graph\\Interface\\book\\runes\\runes_tera.teo","..\\..\\..\\Obj3D\\textures\\");
necklace.runes[RUNE_VISTA]= _LoadTheObj("Graph\\Interface\\book\\runes\\runes_vista.teo","..\\..\\..\\Obj3D\\textures\\");
necklace.runes[RUNE_VITAE]= _LoadTheObj("Graph\\Interface\\book\\runes\\runes_vitae.teo","..\\..\\..\\Obj3D\\textures\\");
necklace.runes[RUNE_YOK]= _LoadTheObj("Graph\\Interface\\book\\runes\\runes_yok.teo","..\\..\\..\\Obj3D\\textures\\");
necklace.pTexTab[RUNE_AAM] = MakeTCFromFile_NoRefinement("\\Graph\\Obj3D\\Interactive\\Items\\Magic\\Rune_aam\\rune_Aam[icon].BMP");
necklace.pTexTab[RUNE_CETRIUS] = MakeTCFromFile_NoRefinement("\\Graph\\Obj3D\\Interactive\\Items\\Magic\\Rune_aam\\rune_cetrius[icon].BMP");
necklace.pTexTab[RUNE_COMUNICATUM] = MakeTCFromFile_NoRefinement("\\Graph\\Obj3D\\Interactive\\Items\\Magic\\Rune_aam\\rune_comunicatum[icon].BMP");
necklace.pTexTab[RUNE_COSUM] = MakeTCFromFile_NoRefinement("\\Graph\\Obj3D\\Interactive\\Items\\Magic\\Rune_aam\\rune_cosum[icon].BMP");
necklace.pTexTab[RUNE_FOLGORA] = MakeTCFromFile_NoRefinement("\\Graph\\Obj3D\\Interactive\\Items\\Magic\\Rune_aam\\rune_folgora[icon].BMP");
necklace.pTexTab[RUNE_FRIDD] = MakeTCFromFile_NoRefinement("\\Graph\\Obj3D\\Interactive\\Items\\Magic\\Rune_aam\\rune_fridd[icon].BMP");
necklace.pTexTab[RUNE_KAOM] = MakeTCFromFile_NoRefinement("\\Graph\\Obj3D\\Interactive\\Items\\Magic\\Rune_aam\\rune_kaom[icon].BMP");
necklace.pTexTab[RUNE_MEGA] = MakeTCFromFile_NoRefinement("\\Graph\\Obj3D\\Interactive\\Items\\Magic\\Rune_aam\\rune_mega[icon].BMP");
necklace.pTexTab[RUNE_MORTE] = MakeTCFromFile_NoRefinement("\\Graph\\Obj3D\\Interactive\\Items\\Magic\\Rune_aam\\rune_morte[icon].BMP");
necklace.pTexTab[RUNE_MOVIS] = MakeTCFromFile_NoRefinement("\\Graph\\Obj3D\\Interactive\\Items\\Magic\\Rune_aam\\rune_movis[icon].BMP");
necklace.pTexTab[RUNE_NHI] = MakeTCFromFile_NoRefinement("\\Graph\\Obj3D\\Interactive\\Items\\Magic\\Rune_aam\\rune_nhi[icon].BMP");
necklace.pTexTab[RUNE_RHAA] = MakeTCFromFile_NoRefinement("\\Graph\\Obj3D\\Interactive\\Items\\Magic\\Rune_aam\\rune_rhaa[icon].BMP");
necklace.pTexTab[RUNE_SPACIUM] = MakeTCFromFile_NoRefinement("\\Graph\\Obj3D\\Interactive\\Items\\Magic\\Rune_aam\\rune_spacium[icon].BMP");
necklace.pTexTab[RUNE_STREGUM] = MakeTCFromFile_NoRefinement("\\Graph\\Obj3D\\Interactive\\Items\\Magic\\Rune_aam\\rune_stregum[icon].BMP");
necklace.pTexTab[RUNE_TAAR] = MakeTCFromFile_NoRefinement("\\Graph\\Obj3D\\Interactive\\Items\\Magic\\Rune_aam\\rune_taar[icon].BMP");
necklace.pTexTab[RUNE_TEMPUS] = MakeTCFromFile_NoRefinement("\\Graph\\Obj3D\\Interactive\\Items\\Magic\\Rune_aam\\rune_tempus[icon].BMP");
necklace.pTexTab[RUNE_TERA] = MakeTCFromFile_NoRefinement("\\Graph\\Obj3D\\Interactive\\Items\\Magic\\Rune_aam\\rune_tera[icon].BMP");
necklace.pTexTab[RUNE_VISTA] = MakeTCFromFile_NoRefinement("\\Graph\\Obj3D\\Interactive\\Items\\Magic\\Rune_aam\\rune_vista[icon].BMP");
necklace.pTexTab[RUNE_VITAE] = MakeTCFromFile_NoRefinement("\\Graph\\Obj3D\\Interactive\\Items\\Magic\\Rune_aam\\rune_vitae[icon].BMP");
necklace.pTexTab[RUNE_YOK] = MakeTCFromFile_NoRefinement("\\Graph\\Obj3D\\Interactive\\Items\\Magic\\Rune_aam\\rune_yok[icon].BMP");
for (i = 0; iCreateHalo(GDevice);
}
EERIE_3DOBJ * _fogobj;
_fogobj= _LoadTheObj("Editor\\Obj3D\\fog_generator.teo","node_TEO MAPS\\");
ARX_FOGS_Set_Object(_fogobj);
eyeballobj= _LoadTheObj("Editor\\Obj3D\\eyeball.teo","eyeball_TEO MAPS\\");
cabal= _LoadTheObj("Editor\\Obj3D\\cabal.teo","cabal_TEO MAPS\\");
nodeobj= _LoadTheObj("Editor\\Obj3D\\node.teo","node_TEO MAPS\\");
cameraobj= _LoadTheObj("Graph\\Obj3D\\Interactive\\System\\Camera\\Camera.teo","..\\..\\..\\textures\\");
markerobj= _LoadTheObj("Graph\\Obj3D\\Interactive\\System\\Marker\\Marker.teo","..\\..\\..\\textures\\");
arrowobj= _LoadTheObj("Graph\\Obj3D\\Interactive\\Items\\Weapons\\arrow\\arrow.teo","..\\..\\..\\..\\textures\\");
for (i=0;iSetTextureStageState( 0, D3DTSS_MIPFILTER, D3DTFP_POINT );
}
else
{
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_MIPFILTER, D3DTFP_LINEAR );
}
switch (mode)
{
case 1:
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_MINFILTER, D3DTFN_LINEAR );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_MAGFILTER, D3DTFG_LINEAR );
break;
case 2:
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_MINFILTER, D3DTFN_ANISOTROPIC );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_MAGFILTER, D3DTFG_ANISOTROPIC );
break;
default:
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_MINFILTER, D3DTFN_POINT );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_MAGFILTER, D3DTFG_POINT );
break;
}
float val=-0.3f;
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_MIPMAPLODBIAS, *((LPDWORD) (&val)) );
}
long NO_GMOD_RESET=0;
//*************************************************************************************
LPTHREAD_START_ROUTINE FirstFrameProc(char *pipo)
{
if (pParticleManager == NULL)
{
pParticleManager = new CParticleManager();
}
if (!NO_GMOD_RESET)
ARX_GLOBALMODS_Reset();
NO_GMOD_RESET=0;
STARTDRAG.x=0;
STARTDRAG.y=0;
DANAEMouse.x=0;
DANAEMouse.y=0;
bookclick.x=-1;
bookclick.y=-1;
if (!LOAD_N_DONT_ERASE) ARX_TIME_Init();
strcpy(ItemToBeAdded,"");
ARX_BOOMS_ClearAllPolyBooms();
ARX_DAMAGES_Reset();
ARX_MISSILES_ClearAll();
ARX_SPELLS_ClearAll();
ARX_SPELLS_ClearAllSymbolDraw();
ARX_PARTICLES_ClearAll();
if (!LOAD_N_DONT_ERASE)
{
CleanScriptLoadedIO();
RestoreInitialIOStatus();
DRAGINTER=NULL;
}
ARX_SPELLS_ResetRecognition();
if (DEBUGCODE)
ForceSendConsole("...NEXT...",1,0,(HWND)1);
FirstTimeThings(danaeApp.m_hWnd,NULL);
if (!LOAD_N_DONT_ERASE)
{
CleanInventory();
ARX_SCRIPT_Timer_ClearAll();
UnlinkAllLinkedObjects();
ARX_SCRIPT_ResetAll(0);
}
SecondaryInventory=NULL;
TSecondaryInventory=NULL;
ARX_FOGS_Render(1);
if (!LOAD_N_DONT_ERASE)
{
ARX_TIME_Init();
if (!DONT_ERASE_PLAYER) ARX_PLAYER_InitPlayer();
SLID_VALUE=0.f;
}
if (!LOAD_N_DONT_ERASE)
{
player.life=player.maxlife;
player.mana=player.maxmana;
if (!DONT_ERASE_PLAYER)
{
if ( (!FINAL_RELEASE)
&& (!FINAL_COMMERCIAL_GAME)
&& (!FINAL_COMMERCIAL_DEMO))
ARX_PLAYER_MakePowerfullHero();
else
ARX_PLAYER_MakeFreshHero();
}
}
InitSnapShot(NULL,"snapshot");
return 0;
}
EERIE_3D LastValidPlayerPos;
EERIE_3D WILL_RESTORE_PLAYER_POSITION;
long WILL_RESTORE_PLAYER_POSITION_FLAG=0;
extern long FLAG_ALLOW_CLOTHES;
//*************************************************************************************
long FirstFrameHandling(LPDIRECT3DDEVICE7 m_pd3dDevice)
{
EERIE_3D trans;
FirstFrame=-1;
ARX_PARTICLES_FirstInit();
ARX_SPELLS_Init(m_pd3dDevice);
ARX_FOGS_TimeReset();
PROGRESS_BAR_COUNT+=2.f;
LoadLevelScreen();
FirstFrameProc(NULL);
if (FASTmse)
{
FASTmse=0;
if (LOADEDD)
{
trans.x=Mscenepos.x;
trans.y=Mscenepos.y;
trans.z=Mscenepos.z;
player.pos.x = loddpos.x+trans.x;
player.pos.y = loddpos.y+trans.y;
player.pos.z = loddpos.z+trans.z;
}
else
{
player.pos.y +=PLAYER_BASE_HEIGHT;
}
PROGRESS_BAR_COUNT+=4.f;
LoadLevelScreen();
}
else if (mse)
{
Mscenepos.x=-mse->cub.xmin-(mse->cub.xmax-mse->cub.xmin)*DIV2+((float)ACTIVEBKG->Xsize*(float)ACTIVEBKG->Xdiv)*DIV2;
Mscenepos.z=-mse->cub.zmin-(mse->cub.zmax-mse->cub.zmin)*DIV2+((float)ACTIVEBKG->Zsize*(float)ACTIVEBKG->Zdiv)*DIV2;
float t1=(float)(long)(mse->point0.x/BKG_SIZX);
float t2=(float)(long)(mse->point0.z/BKG_SIZZ);
t1=mse->point0.x-t1*BKG_SIZX;
t2=mse->point0.z-t2*BKG_SIZZ;
Mscenepos.x=(float)((long)(Mscenepos.x/BKG_SIZX))*BKG_SIZX+(float)BKG_SIZX*DIV2;
Mscenepos.z=(float)((long)(Mscenepos.z/BKG_SIZZ))*BKG_SIZZ+(float)BKG_SIZZ*DIV2;
mse->pos.x=Mscenepos.x=Mscenepos.x+BKG_SIZX-t1;
mse->pos.z=Mscenepos.z=Mscenepos.z+BKG_SIZZ-t2;
Mscenepos.y=mse->pos.y=-mse->cub.ymin-100.f-mse->point0.y;
if (!NO_PLAYER_POSITION_RESET)
{
player.pos.x = mse->pos.x+mse->point0.x;
player.pos.z = mse->pos.z+mse->point0.z;
player.pos.y = mse->pos.y+mse->point0.y;
}
EERIERemovePrecalcLights();
PROGRESS_BAR_COUNT+=1.f;
LoadLevelScreen();
SceneAddMultiScnToBackground(mse);
PROGRESS_BAR_COUNT+=2.f;
LoadLevelScreen();
trans.x=mse->pos.x;
trans.y=mse->pos.y;
trans.z=mse->pos.z;
ReleaseMultiScene(mse);
mse=NULL;
if (!NO_PLAYER_POSITION_RESET)
{
if (LOADEDD)
{
player.pos.x = loddpos.x+trans.x;
player.pos.y = loddpos.y+trans.y;
player.pos.z = loddpos.z+trans.z;
}
else player.pos.y +=PLAYER_BASE_HEIGHT;
}
NO_PLAYER_POSITION_RESET=0;
PROGRESS_BAR_COUNT+=1.f;
LoadLevelScreen();
}
else
{
PROGRESS_BAR_COUNT+=4.f;
LoadLevelScreen();
}
if (CURRENT_TORCH)
{
ARX_SOUND_PlaySFX(SND_TORCH_LOOP, NULL, 1.0F, ARX_SOUND_PLAY_LOOPED);
SHOW_TORCH=1;
}
else
{
SHOW_TORCH=0;
}
_NB_++;
Kam=&subj;
map.pos.x = lastteleport.x=subj.pos.x=moveto.x=player.pos.x;
lastteleport.y=subj.pos.y=moveto.y=player.pos.y;
map.pos.z = lastteleport.z=subj.pos.z=moveto.z=player.pos.z;
lastteleport.y+=PLAYER_BASE_HEIGHT;
subj.angle.a=player.angle.a;
subj.angle.b=player.angle.b;
subj.angle.g=player.angle.g;
RestoreLastLoadedLightning();
PROGRESS_BAR_COUNT+=1.f;
LoadLevelScreen();
if (!LOAD_N_DONT_ERASE)
SetEditMode(0);
PROGRESS_BAR_COUNT+=1.f;
LoadLevelScreen();
LOAD_N_DONT_ERASE=0;
DONT_ERASE_PLAYER=0;
D3DTextr_TESTRestoreAllTextures( m_pd3dDevice );
PROGRESS_BAR_COUNT+=1.f;
LoadLevelScreen();
FirstFrame=0;
FRAME_COUNT=0;
PrepareIOTreatZone(1);
CURRENTLEVEL=GetLevelNumByName(LastLoadedScene);
if ((CURRENTLEVEL>=0) && !(NOBUILDMAP) && GAME_EDITOR)
{
if (CURRENT_LOADMODE!=LOAD_TRUEFILE)
iCreateMap=0;
else if (NeedMapCreation())
iCreateMap=1;
else
iCreateMap=0;
}
else iCreateMap=0;
if (!NO_TIME_INIT)
ARX_TIME_Init();
LastFrameTime=FrameTime;
PROGRESS_BAR_COUNT+=1.f;
LoadLevelScreen();
if (ITC.presentation)
{
D3DTextr_KillTexture(ITC.presentation);
ITC.presentation=NULL;
}
if (DONT_WANT_PLAYER_INZONE)
{
player.inzone=NULL;
DONT_WANT_PLAYER_INZONE=0;
}
if (MOULINEX)
{
LaunchMoulinex();
}
PROGRESS_BAR_COUNT+=1.f;
LoadLevelScreen();
player.desiredangle.a=player.angle.a=0.f;
ARX_PLAYER_RectifyPosition();
if (inter.iobj[0])
inter.iobj[0]->_npcdata->vvpos=-99999;
SendGameReadyMsg();
PLAYER_MOUSELOOK_ON=0;
player.Interface&=~INTER_NOTE;
if (NO_TIME_INIT)
{
ARX_TIME_Force_Time_Restore(FORCE_TIME_RESTORE);
LastFrameTime=FrameTime=FORCE_TIME_RESTORE;
}
else
{
ARX_TIME_UnPause();
}
long t=GetTargetByNameTarget("SEAT_STOOL1_0012");
if (ValidIONum(t))
{
inter.iobj[t]->ioflags|=IO_FORCEDRAW;
}
if (WILL_RESTORE_PLAYER_POSITION_FLAG)
{
Vector_Copy(&player.pos,&WILL_RESTORE_PLAYER_POSITION);
Vector_Copy(&inter.iobj[0]->pos,&WILL_RESTORE_PLAYER_POSITION);
inter.iobj[0]->pos.y+=170.f;
INTERACTIVE_OBJ * io=inter.iobj[0];
for (long i=0;iobj->nbvertex;i++)
{
io->obj->vertexlist3[i].v.x=io->obj->vertexlist[i].v.x+inter.iobj[0]->pos.x;
io->obj->vertexlist3[i].v.y=io->obj->vertexlist[i].v.y+inter.iobj[0]->pos.y;
io->obj->vertexlist3[i].v.z=io->obj->vertexlist[i].v.z+inter.iobj[0]->pos.z;
}
WILL_RESTORE_PLAYER_POSITION_FLAG=0;
}
if (!FLAG_ALLOW_CLOTHES)
{
for (long i=0;iobj) )
inter.iobj[i]->obj->cdata=NULL;
}
}
for (long ni=0;niioflags & IO_NPC)
&& (inter.iobj[ni]->_npcdata->cuts) )
ARX_NPC_ApplyCuts(inter.iobj[ni]);
}
ResetVVPos(inter.iobj[0]);
PROGRESS_BAR_COUNT+=1.f;
LoadLevelScreen();
LoadLevelScreen(NULL, -2);
if ( (!CheckInPolyPrecis(player.pos.x,player.pos.y,player.pos.z))
&& (LastValidPlayerPos.x!=0.f)
&& (LastValidPlayerPos.y!=0.f)
&& (LastValidPlayerPos.z!=0.f) )
{
player.pos.x=LastValidPlayerPos.x;
player.pos.y=LastValidPlayerPos.y;
player.pos.z=LastValidPlayerPos.z;
}
LastValidPlayerPos.x=player.pos.x;
LastValidPlayerPos.y=player.pos.y;
LastValidPlayerPos.z=player.pos.z;
return FFH_GOTO_FINISH;
}
//*************************************************************************************
void ManageNONCombatModeAnimations()
{
INTERACTIVE_OBJ * io=inter.iobj[0];
if (!io) return;
ANIM_USE * useanim3=&io->animlayer[3];
ANIM_HANDLE ** alist=io->anims;
// FIRST SHIELD Management !
if ( (player.Current_Movement & PLAYER_LEAN_LEFT)
|| (player.Current_Movement & PLAYER_LEAN_RIGHT) )
{
}
else if ((player.equiped[EQUIP_SLOT_SHIELD] != 0) && !BLOCK_PLAYER_CONTROLS)
{
if ( (useanim3->cur_anim==NULL) ||
( (useanim3->cur_anim!=alist[ANIM_SHIELD_CYCLE])
&& (useanim3->cur_anim!=alist[ANIM_SHIELD_HIT])
&& (useanim3->cur_anim!=alist[ANIM_SHIELD_START]) ) )
{
AcquireLastAnim(io);
ANIM_Set(useanim3,alist[ANIM_SHIELD_START]);
}
else if ((useanim3->cur_anim==alist[ANIM_SHIELD_START])
&& (useanim3->flags & EA_ANIMEND))
{
AcquireLastAnim(io);
ANIM_Set(useanim3,alist[ANIM_SHIELD_CYCLE]);
useanim3->flags|=EA_LOOP;
}
}
else
{
if (useanim3->cur_anim==alist[ANIM_SHIELD_CYCLE])
{
AcquireLastAnim(io);
ANIM_Set(useanim3,alist[ANIM_SHIELD_END]);
}
else if ((useanim3->cur_anim==alist[ANIM_SHIELD_END])
&& (useanim3->flags & EA_ANIMEND))
{
useanim3->cur_anim=NULL;
}
}
}
long Player_Arrow_Count()
{
long count=0;
if (player.bag)
for (int iNbBag=0; iNbBagfilename),"Arrows"))
{
if ( io->durability >= 1.f )
{
ARX_CHECK_LONG( io->durability );
count += ARX_CLEAN_WARN_CAST_LONG( io->durability );
}
}
}
}
return count;
}
INTERACTIVE_OBJ * Player_Arrow_Count_Decrease()
{
INTERACTIVE_OBJ * io = NULL;
if (player.bag)
for (int iNbBag=0; iNbBagfilename),"Arrows"))
{
if (ioo->durability >= 1.f)
{
if (!io)
io = ioo;
else if (io->durability > ioo->durability)
io = ioo;
}
}
}
}
return io;
}
float GLOBAL_SLOWDOWN=1.f;
bool StrikeAimtime()
{
ARX_PLAYER_Remove_Invisibility();
STRIKE_AIMTIME=(float)ARXTime-(float)AimTime;
STRIKE_AIMTIME=STRIKE_AIMTIME*(1.f+(1.f-GLOBAL_SLOWDOWN));
if (STRIKE_AIMTIME>player.Full_AimTime)
STRIKE_AIMTIME=1.f;
else
STRIKE_AIMTIME=(float)STRIKE_AIMTIME/(float)player.Full_AimTime;
if (STRIKE_AIMTIME<0.1f) STRIKE_AIMTIME=0.1f;
if (STRIKE_AIMTIME>0.8f)
return true;
return false;
}
void ManageCombatModeAnimations()
{
STRIKE_TIME=0;
INTERACTIVE_OBJ * io=inter.iobj[0];
if (!io) return;
ANIM_USE * useanim=&io->animlayer[1];
ANIM_HANDLE ** alist=io->anims;
long j;
long weapontype=ARX_EQUIPMENT_GetPlayerWeaponType();
if ((weapontype==WEAPON_BARE) && (LAST_WEAPON_TYPE!=weapontype))
{
if (useanim->cur_anim!=alist[ANIM_BARE_WAIT])
{
AcquireLastAnim(io);
ANIM_Set(useanim,alist[ANIM_BARE_WAIT]);
AimTime=0;
}
}
switch (weapontype)
{
case WEAPON_BARE: // BARE HANDS PLAYER MANAGEMENT
if (useanim->cur_anim==alist[ANIM_BARE_WAIT])
{
AimTime=0;
if (EERIEMouseButton & 1)
{
AcquireLastAnim(io);
ANIM_Set(useanim,alist[ANIM_BARE_STRIKE_LEFT_START+CurrFightPos*3]);
io->aflags&=~IO_NPC_AFLAG_HIT_CLEAR;
}
}
// Now go for strike cycle...
for (j=0;j<4;j++)
{
if ( (useanim->cur_anim==alist[ANIM_BARE_STRIKE_LEFT_START+j*3])
&& (useanim->flags & EA_ANIMEND) )
{
AcquireLastAnim(io);
ANIM_Set(useanim,alist[ANIM_BARE_STRIKE_LEFT_CYCLE+j*3]);
AimTime = ARXTimeUL();
useanim->flags|=EA_LOOP;
}
else if ( (useanim->cur_anim==alist[ANIM_BARE_STRIKE_LEFT_CYCLE+j*3])
&& !(EERIEMouseButton & 1) )
{
AcquireLastAnim(io);
ANIM_Set(useanim,alist[ANIM_BARE_STRIKE_LEFT+j*3]);
if (StrikeAimtime())
{
char str[128];
str[0]=0;
if (io->strikespeech)
strcpy(str,io->strikespeech);
if (player.equiped[EQUIP_SLOT_WEAPON]!=0)
{
if (inter.iobj[player.equiped[EQUIP_SLOT_WEAPON]]->strikespeech)
strcpy(str,inter.iobj[player.equiped[EQUIP_SLOT_WEAPON]]->strikespeech);
}
if (str[0]!=0)
{
ARX_SPEECH_AddSpeech(io,str,PARAM_LOCALISED,ANIM_TALK_NEUTRAL,ARX_SPEECH_FLAG_NOTEXT);
}
}
SendIOScriptEvent(io,SM_STRIKE,"BARE");
PlayerWeaponBlocked=-1;
CurrFightPos=0;
AimTime=0;
}
else if (useanim->cur_anim==alist[ANIM_BARE_STRIKE_LEFT+j*3])
{
if (useanim->flags & EA_ANIMEND)
{
AcquireLastAnim(io);
ANIM_Set(useanim,alist[ANIM_BARE_WAIT]);
useanim->flags|=EA_LOOP;
CurrFightPos=0;
AimTime = ARXTimeUL();
PlayerWeaponBlocked=-1;
}
else if ((useanim->ctime > useanim->cur_anim->anims[useanim->altidx_cur]->anim_time * 0.2f)
&& (useanim->ctime < useanim->cur_anim->anims[useanim->altidx_cur]->anim_time*0.8f)
&& (PlayerWeaponBlocked==-1) )
{
if (useanim->cur_anim==alist[ANIM_BARE_STRIKE_LEFT])
{
STRIKE_TIME=1;
long id = io->obj->fastaccess.left_attach;
if (id!=-1)
{
EERIE_SPHERE sphere;
sphere.origin.x=io->obj->vertexlist3[id].v.x;
sphere.origin.y=io->obj->vertexlist3[id].v.y;
sphere.origin.z=io->obj->vertexlist3[id].v.z;
sphere.radius=25.f;
if (FistParticles & 2) sphere.radius*=2.f;
long num;
if (CheckAnythingInSphere(&sphere,0,0,&num))
{
float dmgs=(player.Full_damages+1)*STRIKE_AIMTIME;
if (FistParticles & 2) dmgs*=1.5f;
if (ARX_DAMAGES_TryToDoDamage(&io->obj->vertexlist3[id].v,dmgs,40,0))
{
if (FistParticles & 2)
ARX_SOUND_PlaySFX(SND_SPELL_LIGHTNING_START, &io->obj->vertexlist3[id].v);
PlayerWeaponBlocked=useanim->ctime;
PlayerWeaponBlockTime = ARXTimeUL();
}
{
ARX_PARTICLES_Spawn_Spark(&sphere.origin, dmgs, 2);
if (ValidIONum(num))
{
ARX_SOUND_PlayCollision(inter.iobj[num]->material,MATERIAL_FLESH, 1.f, 1.f, &sphere.origin, NULL);
}
}
}
}
}
else // Strike Right
{
STRIKE_TIME=1;
long id = io->obj->fastaccess.primary_attach;
if (id!=-1)
{
EERIE_SPHERE sphere;
sphere.origin.x=io->obj->vertexlist3[id].v.x;
sphere.origin.y=io->obj->vertexlist3[id].v.y;
sphere.origin.z=io->obj->vertexlist3[id].v.z;
sphere.radius=25.f;
if (FistParticles & 2) sphere.radius*=2.f;
long num;
if (CheckAnythingInSphere(&sphere,0,0,&num))
{
float dmgs=(player.Full_damages+1)*STRIKE_AIMTIME;
if (FistParticles & 2) dmgs*=1.5f;
if (ARX_DAMAGES_TryToDoDamage(&io->obj->vertexlist3[id].v,dmgs,40,0))
{
if (FistParticles & 2)
ARX_SOUND_PlaySFX(SND_SPELL_LIGHTNING_START, &io->obj->vertexlist3[id].v);
PlayerWeaponBlocked=useanim->ctime;
PlayerWeaponBlockTime = ARXTimeUL();
}
{
ARX_PARTICLES_Spawn_Spark(&sphere.origin, dmgs, 2);
if (ValidIONum(num))
{
ARX_SOUND_PlayCollision(inter.iobj[num]->material,MATERIAL_FLESH, 1.f, 1.f, &sphere.origin, NULL);
}
}
}
}
}
}
}
}
break;
case WEAPON_DAGGER: // DAGGER PLAYER MANAGEMENT
// Waiting and receiving Strike Impulse
if (useanim->cur_anim==alist[ANIM_DAGGER_WAIT])
{
AimTime = 0;
if (EERIEMouseButton & 1)
{
AcquireLastAnim(io);
ANIM_Set(useanim,alist[ANIM_DAGGER_STRIKE_LEFT_START+CurrFightPos*3]);
io->aflags&=~IO_NPC_AFLAG_HIT_CLEAR;
}
}
// Now go for strike cycle...
for (j=0;j<4;j++)
{
if ((useanim->cur_anim==alist[ANIM_DAGGER_STRIKE_LEFT_START+j*3])&& (useanim->flags & EA_ANIMEND))
{
AcquireLastAnim(io);
ANIM_Set(useanim,alist[ANIM_DAGGER_STRIKE_LEFT_CYCLE+j*3]);
AimTime = ARXTimeUL();
useanim->flags|=EA_LOOP;
}
else if ((useanim->cur_anim==alist[ANIM_DAGGER_STRIKE_LEFT_CYCLE+j*3])
&& !(EERIEMouseButton & 1))
{
AcquireLastAnim(io);
ANIM_Set(useanim,alist[ANIM_DAGGER_STRIKE_LEFT+j*3]);
if (StrikeAimtime())
{
char str[128];
str[0]=0;
if (io->strikespeech)
strcpy(str,io->strikespeech);
if (player.equiped[EQUIP_SLOT_WEAPON]!=0)
{
if (inter.iobj[player.equiped[EQUIP_SLOT_WEAPON]]->strikespeech)
strcpy(str,inter.iobj[player.equiped[EQUIP_SLOT_WEAPON]]->strikespeech);
}
if (str[0]!=0)
{
ARX_SPEECH_AddSpeech(io,str,PARAM_LOCALISED,ANIM_TALK_NEUTRAL,ARX_SPEECH_FLAG_NOTEXT);
}
}
SendIOScriptEvent(io,SM_STRIKE,"DAGGER");
CurrFightPos=0;
AimTime=0;
}
else if (useanim->cur_anim==alist[ANIM_DAGGER_STRIKE_LEFT+j*3])
{
if ( (useanim->ctime > useanim->cur_anim->anims[useanim->altidx_cur]->anim_time*0.3f)
&& (useanim->ctime < useanim->cur_anim->anims[useanim->altidx_cur]->anim_time*0.7f))
{
STRIKE_TIME=1;
if ((PlayerWeaponBlocked==-1)
&& (ARX_EQUIPMENT_Strike_Check(io,inter.iobj[player.equiped[EQUIP_SLOT_WEAPON]],STRIKE_AIMTIME,0)))
{
PlayerWeaponBlocked=useanim->ctime;
PlayerWeaponBlockTime = ARXTimeUL();
}
}
if (useanim->flags & EA_ANIMEND)
{
AcquireLastAnim(io);
ANIM_Set(useanim,alist[ANIM_DAGGER_WAIT]);
useanim->flags&=~(EA_PAUSED | EA_REVERSE);
useanim->flags|=EA_LOOP;
CurrFightPos=0;
AimTime = ARXTimeUL();
PlayerWeaponBlocked=-1;
}
if ((PlayerWeaponBlocked!=-1)
&& (useanim->ctimecur_anim->anims[useanim->altidx_cur]->anim_time*0.9f))
ARX_EQUIPMENT_Strike_Check(io,inter.iobj[player.equiped[EQUIP_SLOT_WEAPON]],STRIKE_AIMTIME,1);
}
}
break;
case WEAPON_1H: // 1HANDED PLAYER MANAGEMENT
// Waiting and Received Strike Impulse
if (useanim->cur_anim==alist[ANIM_1H_WAIT])
{
AimTime = 0;
if (EERIEMouseButton & 1)
{
AcquireLastAnim(io);
ANIM_Set(useanim,alist[ANIM_1H_STRIKE_LEFT_START+CurrFightPos*3]);
io->aflags&=~IO_NPC_AFLAG_HIT_CLEAR;
}
}
// Now go for strike cycle...
for (j=0;j<4;j++)
{
if ((useanim->cur_anim==alist[ANIM_1H_STRIKE_LEFT_START+j*3])&& (useanim->flags & EA_ANIMEND))
{
AcquireLastAnim(io);
ANIM_Set(useanim,alist[ANIM_1H_STRIKE_LEFT_CYCLE+j*3]);
AimTime = ARXTimeUL();
useanim->flags|=EA_LOOP;
}
else if ((useanim->cur_anim==alist[ANIM_1H_STRIKE_LEFT_CYCLE+j*3])
&& !(EERIEMouseButton & 1))
{
AcquireLastAnim(io);
ANIM_Set(useanim,alist[ANIM_1H_STRIKE_LEFT+j*3]);
if (StrikeAimtime())
{
char str[128];
str[0]=0;
if (io->strikespeech)
strcpy(str,io->strikespeech);
if (player.equiped[EQUIP_SLOT_WEAPON]!=0)
{
if (inter.iobj[player.equiped[EQUIP_SLOT_WEAPON]]->strikespeech)
strcpy(str,inter.iobj[player.equiped[EQUIP_SLOT_WEAPON]]->strikespeech);
}
if (str[0]!=0)
{
ARX_SPEECH_AddSpeech(io,str,PARAM_LOCALISED,ANIM_TALK_NEUTRAL,ARX_SPEECH_FLAG_NOTEXT);
}
}
SendIOScriptEvent(io,SM_STRIKE,"1H");
CurrFightPos=0;
AimTime=0;
}
else if (useanim->cur_anim==alist[ANIM_1H_STRIKE_LEFT+j*3])
{
if ((useanim->ctime > useanim->cur_anim->anims[useanim->altidx_cur]->anim_time*0.3f)
&& (useanim->ctime < useanim->cur_anim->anims[useanim->altidx_cur]->anim_time*0.7f))
{
STRIKE_TIME=1;
if ((PlayerWeaponBlocked==-1)
&& (ARX_EQUIPMENT_Strike_Check(io,inter.iobj[player.equiped[EQUIP_SLOT_WEAPON]],STRIKE_AIMTIME,0)) )
{
PlayerWeaponBlocked=useanim->ctime;
PlayerWeaponBlockTime = ARXTimeUL();
}
}
if (useanim->flags & EA_ANIMEND)
{
AcquireLastAnim(io);
ANIM_Set(useanim,alist[ANIM_1H_WAIT]);
useanim->flags&=~(EA_PAUSED | EA_REVERSE);
useanim->flags|=EA_LOOP;
CurrFightPos=0;
AimTime=0;
PlayerWeaponBlocked=-1;
}
if ((PlayerWeaponBlocked!=-1)
&& (useanim->ctimecur_anim->anims[useanim->altidx_cur]->anim_time*0.9f))
ARX_EQUIPMENT_Strike_Check(io,inter.iobj[player.equiped[EQUIP_SLOT_WEAPON]],STRIKE_AIMTIME,1);
}
}
break;
case WEAPON_2H: // 2HANDED PLAYER MANAGEMENT
// Waiting and Receiving Strike Impulse
if (useanim->cur_anim==alist[ANIM_2H_WAIT])
{
AimTime = 0;
if (EERIEMouseButton & 1)
{
AcquireLastAnim(io);
ANIM_Set(useanim,alist[ANIM_2H_STRIKE_LEFT_START+CurrFightPos*3]);
io->aflags&=~IO_NPC_AFLAG_HIT_CLEAR;
}
}
// Now go for strike cycle...
for (j=0;j<4;j++)
{
if ( (useanim->cur_anim==alist[ANIM_2H_STRIKE_LEFT_START+j*3])
&& (useanim->flags & EA_ANIMEND))
{
AcquireLastAnim(io);
ANIM_Set(useanim,alist[ANIM_2H_STRIKE_LEFT_CYCLE+j*3]);
AimTime = ARXTimeUL();
useanim->flags|=EA_LOOP;
}
else if ( (useanim->cur_anim==alist[ANIM_2H_STRIKE_LEFT_CYCLE+j*3])
&& !(EERIEMouseButton & 1) )
{
AcquireLastAnim(io);
ANIM_Set(useanim,alist[ANIM_2H_STRIKE_LEFT+j*3]);
if (StrikeAimtime())
{
char str[128];
str[0]=0;
if (io->strikespeech)
strcpy(str,io->strikespeech);
if (player.equiped[EQUIP_SLOT_WEAPON]!=0)
{
if (inter.iobj[player.equiped[EQUIP_SLOT_WEAPON]]->strikespeech)
strcpy(str,inter.iobj[player.equiped[EQUIP_SLOT_WEAPON]]->strikespeech);
}
if (str[0]!=0)
{
ARX_SPEECH_AddSpeech(io,str,PARAM_LOCALISED,ANIM_TALK_NEUTRAL,ARX_SPEECH_FLAG_NOTEXT);
}
}
SendIOScriptEvent(io,SM_STRIKE,"2H");
CurrFightPos=0;
AimTime=0;
}
else if (useanim->cur_anim==alist[ANIM_2H_STRIKE_LEFT+j*3])
{
if ((useanim->ctime > useanim->cur_anim->anims[useanim->altidx_cur]->anim_time*0.3f)
&& (useanim->ctime < useanim->cur_anim->anims[useanim->altidx_cur]->anim_time*0.7f))
{
STRIKE_TIME=1;
if ((PlayerWeaponBlocked==-1)
&& (ARX_EQUIPMENT_Strike_Check(io,inter.iobj[player.equiped[EQUIP_SLOT_WEAPON]],STRIKE_AIMTIME,0)) )
{
PlayerWeaponBlocked=useanim->ctime;
PlayerWeaponBlockTime = ARXTimeUL();
}
}
if (useanim->flags & EA_ANIMEND)
{
AcquireLastAnim(io);
ANIM_Set(useanim,alist[ANIM_2H_WAIT]);
useanim->flags&=~(EA_PAUSED | EA_REVERSE);
useanim->flags|=EA_LOOP;
CurrFightPos=0;
AimTime=0;
PlayerWeaponBlocked=-1;
}
if ((PlayerWeaponBlocked!=-1)
&& (useanim->ctimecur_anim->anims[useanim->altidx_cur]->anim_time*0.9f))
ARX_EQUIPMENT_Strike_Check(io,inter.iobj[player.equiped[EQUIP_SLOT_WEAPON]],STRIKE_AIMTIME,1);
}
}
break;
case WEAPON_BOW: // MISSILE PLAYER MANAGEMENT
if ((useanim->cur_anim == alist[ANIM_MISSILE_STRIKE_CYCLE]))
{
if (GLOBAL_SLOWDOWN!=1.f)
BOW_FOCAL+=Original_framedelay;
else
BOW_FOCAL += _framedelay;
if (BOW_FOCAL>710) BOW_FOCAL=710;
}
// Waiting and Receiving Strike Impulse
if (useanim->cur_anim==alist[ANIM_MISSILE_WAIT])
{
AimTime = ARXTimeUL();
if ((EERIEMouseButton & 1) && (Player_Arrow_Count()>0))
{
AcquireLastAnim(io);
ANIM_Set(useanim,alist[ANIM_MISSILE_STRIKE_PART_1]);
io->aflags&=~IO_NPC_AFLAG_HIT_CLEAR;
}
}
if ((useanim->cur_anim==alist[ANIM_MISSILE_STRIKE_PART_1])&& (useanim->flags & EA_ANIMEND))
{
AimTime = 0;
AcquireLastAnim(io);
ANIM_Set(useanim,alist[ANIM_MISSILE_STRIKE_PART_2]);
EERIE_LINKEDOBJ_LinkObjectToObject(io->obj, arrowobj, "LEFT_ATTACH", "ATTACH", NULL);
}
// Now go for strike cycle...
if ((useanim->cur_anim==alist[ANIM_MISSILE_STRIKE_PART_2])&& (useanim->flags & EA_ANIMEND))
{
AcquireLastAnim(io);
ANIM_Set(useanim,alist[ANIM_MISSILE_STRIKE_CYCLE]);
AimTime = ARXTimeUL();
useanim->flags|=EA_LOOP;
}
else if ((useanim->cur_anim==alist[ANIM_MISSILE_STRIKE_CYCLE])
&& !(EERIEMouseButton & 1))
{
EERIE_LINKEDOBJ_UnLinkObjectFromObject(io->obj, arrowobj);
AcquireLastAnim(io);
ANIM_Set(useanim,alist[ANIM_MISSILE_STRIKE]);
SendIOScriptEvent(io,SM_STRIKE,"BOW");
StrikeAimtime();
STRIKE_AIMTIME=(float)(BOW_FOCAL)/710.f;
INTERACTIVE_OBJ * ioo=Player_Arrow_Count_Decrease();
float poisonous=0.f;
if (ioo)
{
if (ioo->poisonous_count>0)
{
poisonous=ioo->poisonous;
ioo->poisonous_count--;
if (ioo->poisonous_count<=0)
ioo->poisonous=0;
}
else poisonous=ioo->poisonous;
ARX_DAMAGES_DurabilityLoss(ioo,1.f);
if (ValidIOAddress(ioo))
{
if (ioo->durability<=0.f)
ARX_INTERACTIVE_DestroyIO(ioo);
}
}
PlayerLaunchArrow(STRIKE_AIMTIME,poisonous);
AimTime=0;
}
else if (useanim->cur_anim==alist[ANIM_MISSILE_STRIKE])
{
BOW_FOCAL-=Original_framedelay;
if (BOW_FOCAL<0) BOW_FOCAL=0;
if (useanim->flags & EA_ANIMEND)
{
BOW_FOCAL=0;
AcquireLastAnim(io);
ANIM_Set(useanim,alist[ANIM_MISSILE_WAIT]);
useanim->flags|=EA_LOOP;
AimTime=0;
PlayerWeaponBlocked=-1;
EERIE_LINKEDOBJ_UnLinkObjectFromObject(io->obj, arrowobj);
}
}
break;
}
LAST_WEAPON_TYPE=weapontype;
}
void ManageCombatModeAnimationsEND()
{
INTERACTIVE_OBJ * io=inter.iobj[0];
ANIM_USE * useanim=&io->animlayer[1];
ANIM_USE * useanim3=&io->animlayer[3];
ANIM_HANDLE ** alist=io->anims;
if ( (useanim->cur_anim)
&&( (useanim->cur_anim==alist[ANIM_BARE_READY])
|| (useanim->cur_anim==alist[ANIM_DAGGER_READY_PART_2])
|| (useanim->cur_anim==alist[ANIM_DAGGER_READY_PART_1])
|| (useanim->cur_anim==alist[ANIM_1H_READY_PART_2])
|| (useanim->cur_anim==alist[ANIM_1H_READY_PART_1])
|| (useanim->cur_anim==alist[ANIM_2H_READY_PART_2])
|| (useanim->cur_anim==alist[ANIM_2H_READY_PART_1])
|| (useanim->cur_anim==alist[ANIM_MISSILE_READY_PART_1])
|| (useanim->cur_anim==alist[ANIM_MISSILE_READY_PART_2]) )
)
AimTime = ARXTimeUL();
if (useanim->flags & EA_ANIMEND)
{
long weapontype=ARX_EQUIPMENT_GetPlayerWeaponType();
if (useanim->cur_anim &&
( (useanim->cur_anim==io->anims[ANIM_BARE_UNREADY])
|| (useanim->cur_anim==io->anims[ANIM_DAGGER_UNREADY_PART_2])
|| (useanim->cur_anim==io->anims[ANIM_1H_UNREADY_PART_2])
|| (useanim->cur_anim==io->anims[ANIM_2H_UNREADY_PART_2])
|| (useanim->cur_anim==io->anims[ANIM_MISSILE_UNREADY_PART_2]) ) )
{
io->_npcdata->ex_rotate->flags|=EXTRA_ROTATE_REALISTIC;
AcquireLastAnim(io);
useanim->cur_anim=NULL;
}
switch (weapontype)
{
case WEAPON_BARE:
// Is Weapon Ready ? In this case go to Fight Wait anim
if (useanim->cur_anim==alist[ANIM_BARE_READY])
{
AcquireLastAnim(io);
if (player.Interface & INTER_NO_STRIKE)
{
player.Interface&=~INTER_NO_STRIKE;
ANIM_Set(useanim,alist[ANIM_BARE_WAIT]);
useanim->flags|=EA_LOOP;
}
else
ANIM_Set(useanim,alist[ANIM_BARE_STRIKE_LEFT_START+CurrFightPos*3]);
AimTime = ARXTimeUL();
io->aflags&=~IO_NPC_AFLAG_HIT_CLEAR;
}
break;
case WEAPON_DAGGER:
// DAGGER ANIMS end
if (alist[ANIM_DAGGER_READY_PART_1])
{
if (useanim->cur_anim==alist[ANIM_DAGGER_READY_PART_1])
{
AcquireLastAnim(io);
ARX_EQUIPMENT_AttachPlayerWeaponToHand();
ANIM_Set(useanim,alist[ANIM_DAGGER_READY_PART_2]);
}
else if (useanim->cur_anim==alist[ANIM_DAGGER_READY_PART_2])
{
AcquireLastAnim(io);
if (player.Interface & INTER_NO_STRIKE)
{
player.Interface&=~INTER_NO_STRIKE;
ANIM_Set(useanim,alist[ANIM_DAGGER_WAIT]);
useanim->flags|=EA_LOOP;
}
else
ANIM_Set(useanim,alist[ANIM_DAGGER_STRIKE_LEFT_START+CurrFightPos*3]);
AimTime = ARXTimeUL();
io->aflags&=~IO_NPC_AFLAG_HIT_CLEAR;
}
else if (useanim->cur_anim==alist[ANIM_DAGGER_UNREADY_PART_1])
{
AcquireLastAnim(io);
ARX_EQUIPMENT_AttachPlayerWeaponToBack();
ANIM_Set(useanim,alist[ANIM_DAGGER_UNREADY_PART_2]);
}
}
break;
case WEAPON_1H: // 1H ANIMS end
if (alist[ANIM_1H_READY_PART_1]!=NULL)
{
if (useanim->cur_anim==alist[ANIM_1H_READY_PART_1])
{
AcquireLastAnim(io);
ARX_EQUIPMENT_AttachPlayerWeaponToHand();
ANIM_Set(useanim,alist[ANIM_1H_READY_PART_2]);
}
else if (useanim->cur_anim==alist[ANIM_1H_READY_PART_2])
{
AcquireLastAnim(io);
if (player.Interface & INTER_NO_STRIKE)
{
player.Interface&=~INTER_NO_STRIKE;
ANIM_Set(useanim,alist[ANIM_1H_WAIT]);
useanim->flags|=EA_LOOP;
}
else
ANIM_Set(useanim,alist[ANIM_1H_STRIKE_LEFT_START+CurrFightPos*3]);
AimTime = ARXTimeUL();
io->aflags&=~IO_NPC_AFLAG_HIT_CLEAR;
}
else if (useanim->cur_anim==alist[ANIM_1H_UNREADY_PART_1])
{
AcquireLastAnim(io);
ARX_EQUIPMENT_AttachPlayerWeaponToBack();
ANIM_Set(useanim,alist[ANIM_1H_UNREADY_PART_2]);
}
}
break;
case WEAPON_2H: // 2H ANIMS end
if (alist[ANIM_2H_READY_PART_1])
{
if (useanim->cur_anim==alist[ANIM_2H_READY_PART_1])
{
AcquireLastAnim(io);
ARX_EQUIPMENT_AttachPlayerWeaponToHand();
ANIM_Set(useanim,alist[ANIM_2H_READY_PART_2]);
}
else if (useanim->cur_anim==alist[ANIM_2H_READY_PART_2])
{
AcquireLastAnim(io);
if (player.Interface & INTER_NO_STRIKE)
{
player.Interface&=~INTER_NO_STRIKE;
ANIM_Set(useanim,alist[ANIM_2H_WAIT]);
useanim->flags|=EA_LOOP;
}
else
ANIM_Set(useanim,alist[ANIM_2H_STRIKE_LEFT_START+CurrFightPos*3]);
AimTime = ARXTimeUL();
io->aflags&=~IO_NPC_AFLAG_HIT_CLEAR;
}
else if (useanim->cur_anim==alist[ANIM_2H_UNREADY_PART_1])
{
AcquireLastAnim(io);
ARX_EQUIPMENT_AttachPlayerWeaponToBack();
ANIM_Set(useanim,alist[ANIM_2H_UNREADY_PART_2]);
}
}
break;
case WEAPON_BOW:// MISSILE Weapon ANIMS end
if (alist[ANIM_MISSILE_READY_PART_1])
{
if (useanim->cur_anim==alist[ANIM_MISSILE_READY_PART_1])
{
AcquireLastAnim(io);
ARX_EQUIPMENT_AttachPlayerWeaponToHand();
ANIM_Set(useanim,alist[ANIM_MISSILE_READY_PART_2]);
}
else if (useanim->cur_anim==alist[ANIM_MISSILE_READY_PART_2])
{
if (Player_Arrow_Count()>0)
{
AcquireLastAnim(io);
if (player.Interface & INTER_NO_STRIKE)
{
player.Interface&=~INTER_NO_STRIKE;
ANIM_Set(useanim,alist[ANIM_MISSILE_WAIT]);
useanim->flags|=EA_LOOP;
}
else
ANIM_Set(useanim,alist[ANIM_MISSILE_STRIKE_PART_1]);
io->aflags&=~IO_NPC_AFLAG_HIT_CLEAR;
}
else
{
AcquireLastAnim(io);
ANIM_Set(useanim,alist[ANIM_MISSILE_WAIT]);
}
EERIE_LINKEDOBJ_UnLinkObjectFromObject(io->obj, arrowobj);
}
else if (useanim->cur_anim==alist[ANIM_MISSILE_STRIKE_PART_1])
{
ANIM_Set(useanim,alist[ANIM_MISSILE_STRIKE_PART_2]);
}
else if (useanim->cur_anim==alist[ANIM_MISSILE_STRIKE_PART_2])
{
ANIM_Set(useanim,alist[ANIM_MISSILE_STRIKE_CYCLE]);
}
else if (useanim->cur_anim==alist[ANIM_MISSILE_UNREADY_PART_1])
{
AcquireLastAnim(io);
ARX_EQUIPMENT_AttachPlayerWeaponToBack();
ANIM_Set(useanim,alist[ANIM_MISSILE_UNREADY_PART_2]);
}
}
break;
}
// Spell casting anims
if ((alist[ANIM_CAST]) && (useanim->cur_anim==alist[ANIM_CAST]))
{
AcquireLastAnim(io);
if (alist[ANIM_CAST_END])
ANIM_Set(useanim,alist[ANIM_CAST_END]);
}
else if ((alist[ANIM_CAST_END]) && (useanim->cur_anim==alist[ANIM_CAST_END]))
{
AcquireLastAnim(io);
useanim->cur_anim=NULL;
player.doingmagic=0;
if (WILLRETURNTOCOMBATMODE)
{
player.Interface|=INTER_COMBATMODE;
player.Interface|=INTER_NO_STRIKE;
ARX_EQUIPMENT_LaunchPlayerReadyWeapon();
WILLRETURNTOCOMBATMODE=0;
}
}
}
// Is the shield off ?
if (useanim3->flags & EA_ANIMEND)
{
if ((io->anims[ANIM_SHIELD_END]) && (useanim3->cur_anim==io->anims[ANIM_SHIELD_END]))
{
AcquireLastAnim(io);
useanim3->cur_anim=NULL;
}
}
}
float LAST_FADEVALUE=1.f;
void ManageFade(LPDIRECT3DDEVICE7 m_pd3dDevice)
{
float tim=((float)ARX_TIME_Get()-(float)FADESTART);
if (tim<=0.f) return;
float Visibility=tim/(float)FADEDURATION;
if (FADEDIR>0) Visibility=1.f-Visibility;
if (Visibility>1.f) Visibility=1.f;
if (Visibility<0.f)
{
Visibility = 0.f;
FADEDIR = 0;
return;
}
LAST_FADEVALUE=Visibility;
m_pd3dDevice->SetRenderState( D3DRENDERSTATE_SRCBLEND, D3DBLEND_ZERO );
m_pd3dDevice->SetRenderState( D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCCOLOR );
SETZWRITE(m_pd3dDevice, FALSE );
SETALPHABLEND(m_pd3dDevice,TRUE);
EERIEDrawBitmap(m_pd3dDevice,0.f,0.f,(float)DANAESIZX,(float)DANAESIZY,0.0001f,
NULL,_EERIERGB(Visibility));
m_pd3dDevice->SetRenderState( D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE);
m_pd3dDevice->SetRenderState( D3DRENDERSTATE_DESTBLEND, D3DBLEND_ONE);
float col=Visibility;
EERIEDrawBitmap(m_pd3dDevice,0.f,0.f,(float)DANAESIZX,(float)DANAESIZY,0.0001f,
NULL,EERIERGB(col*FADECOLOR.r,col*FADECOLOR.g,col*FADECOLOR.b));
SETALPHABLEND(m_pd3dDevice,FALSE);
SETZWRITE(m_pd3dDevice, TRUE );
}
extern long cur_mr;
TextureContainer * Mr_tc=NULL;
void CheckMr()
{
if (cur_mr==3)
{
if (GDevice && Mr_tc && TextureContainer_Exist(Mr_tc))
{
if (!Mr_tc->m_pddsSurface)
Mr_tc->Restore(GDevice);
EERIEDrawBitmap(GDevice,DANAESIZX-(128.f*Xratio),0.f,(float)128*Xratio,(float)128*Yratio,0.0001f,
Mr_tc,_EERIERGB(0.5f+PULSATE*DIV10));
}
else
{
Mr_tc=MakeTCFromFile_NoRefinement("graph\\particles\\(Fx)_Mr.bmp");
}
}
}
void DrawImproveVisionInterface(LPDIRECT3DDEVICE7 m_pd3dDevice)
{
if (ombrignon->m_pddsSurface)
{
float mod = 0.6f + PULSATE * 0.35f;
EERIEDrawBitmap(m_pd3dDevice,0.f,0.f,(float)DANAESIZX,(float)DANAESIZY,0.0001f,
ombrignon,EERIERGB((0.5f+PULSATE*DIV10)*mod,0.f,0.f));
}
}
float MagicSightFader=0.f;
void DrawMagicSightInterface(LPDIRECT3DDEVICE7 m_pd3dDevice)
{
if (eyeball.exist==1) return;
if (Flying_Eye && Flying_Eye->m_pddsSurface)
{
m_pd3dDevice->SetRenderState( D3DRENDERSTATE_SRCBLEND, D3DBLEND_ZERO );
m_pd3dDevice->SetRenderState( D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCCOLOR );
float col=(0.75f+PULSATE*DIV20);
if (col>1.f) col=1.f;
if (eyeball.exist<0)
{
col=(float)(-eyeball.exist)*DIV100;
}
else if (eyeball.exist>2)
{
col = 1.f - eyeball.size.x;
}
EERIEDrawBitmap(m_pd3dDevice,0.f,0.f,(float)DANAESIZX,(float)DANAESIZY,0.0001f,
Flying_Eye,_EERIERGB(col));
if (MagicSightFader>0.f)
{
col=MagicSightFader;
EERIEDrawBitmap(m_pd3dDevice,0.f,0.f,(float)DANAESIZX,(float)DANAESIZY,0.0001f,
NULL,_EERIERGB(col));
MagicSightFader-=Original_framedelay*DIV400;
if (MagicSightFader<0.f)
MagicSightFader=0.f;
}
m_pd3dDevice->SetRenderState( D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE);
m_pd3dDevice->SetRenderState( D3DRENDERSTATE_DESTBLEND, D3DBLEND_ONE);
}
}
//*************************************************************************************
void RenderAllNodes(LPDIRECT3DDEVICE7 m_pd3dDevice)
{
EERIE_3D angle;
float xx,yy;
long j;
Vector_Init(&angle);
SETALPHABLEND(m_pd3dDevice,FALSE);
for (long i=0;ivertexlist[nodeobj->origin].vert.sz>0.f) && (nodeobj->vertexlist[nodeobj->origin].vert.sz<0.9f))
{
xx=nodeobj->vertexlist[nodeobj->origin].vert.sx-40.f;
yy=nodeobj->vertexlist[nodeobj->origin].vert.sy-40.f;
ARX_TEXT_Draw(m_pd3dDevice, InBookFont, xx, yy, 0, 0, nodes.nodes[i].UName, EERIECOLOR_YELLOW); //font
}
if (nodes.nodes[i].selected)
{
EERIEDraw2DLine(m_pd3dDevice, nodes.nodes[i].bboxmin.x,nodes.nodes[i].bboxmin.y,nodes.nodes[i].bboxmax.x,nodes.nodes[i].bboxmin.y,0.01f, EERIECOLOR_YELLOW);
EERIEDraw2DLine(m_pd3dDevice, nodes.nodes[i].bboxmax.x,nodes.nodes[i].bboxmin.y,nodes.nodes[i].bboxmax.x,nodes.nodes[i].bboxmax.y,0.01f, EERIECOLOR_YELLOW);
EERIEDraw2DLine(m_pd3dDevice, nodes.nodes[i].bboxmax.x,nodes.nodes[i].bboxmax.y,nodes.nodes[i].bboxmin.x,nodes.nodes[i].bboxmax.y,0.01f, EERIECOLOR_YELLOW);
EERIEDraw2DLine(m_pd3dDevice, nodes.nodes[i].bboxmin.x,nodes.nodes[i].bboxmax.y,nodes.nodes[i].bboxmin.x,nodes.nodes[i].bboxmin.y,0.01f, EERIECOLOR_YELLOW);
}
for (j=0;j0.f)
{
QuakeFx.intensity+=intensity;
QuakeFx.duration+=(unsigned long)duration;
QuakeFx.frequency+=period;
QuakeFx.frequency*=DIV2;
QuakeFx.flags|=flags;
if (flags & 1)
ARX_SOUND_PlaySFX(SND_QUAKE, NULL, 1.0F - 0.5F * QuakeFx.intensity);
}
else
{
QuakeFx.intensity=intensity;
ARX_CHECK_ULONG(FrameTime);
QuakeFx.start = ARX_CLEAN_WARN_CAST_ULONG(FrameTime);
QuakeFx.duration=(unsigned long)duration;
QuakeFx.frequency=period;
QuakeFx.flags=flags;
if (flags & 1)
ARX_SOUND_PlaySFX(SND_QUAKE, NULL, 1.0F - 0.5F * QuakeFx.intensity);
}
if (!(flags & 1))
{
if (QuakeFx.duration>1500) QuakeFx.duration=1500;
if (QuakeFx.intensity>220) QuakeFx.intensity=220;
}
}
void ManageQuakeFX()
{
if (QuakeFx.intensity>0.f)
{
float tim=(float)FrameTime-(float)QuakeFx.start;
if (tim >= QuakeFx.duration)
{
QuakeFx.intensity=0.f;
return;
}
float itmod=1.f-(tim/QuakeFx.duration);
float periodicity=EEsin((float)FrameTime*QuakeFx.frequency*DIV100);
if ((periodicity>0.5f) && (QuakeFx.flags & 1))
ARX_SOUND_PlaySFX(SND_QUAKE, NULL, 1.0F - 0.5F * QuakeFx.intensity);
float truepower=periodicity*QuakeFx.intensity*itmod*DIV100;
float halfpower=truepower*DIV2;
ACTIVECAM->pos.x+=rnd()*truepower-halfpower;
ACTIVECAM->pos.y+=rnd()*truepower-halfpower;
ACTIVECAM->pos.z+=rnd()*truepower-halfpower;
ACTIVECAM->angle.a+=rnd()*truepower-halfpower;
ACTIVECAM->angle.g+=rnd()*truepower-halfpower;
ACTIVECAM->angle.b+=rnd()*truepower-halfpower;
}
}
void ProcessAllTheo(char * path)
{
long idx;
char pathh[512];
struct _finddata_t fd;
sprintf(pathh,"%s*.*",path);
if ((idx=_findfirst(pathh,&fd))!=-1)
{
do
{
if (strcmp(fd.name,".") && strcmp(fd.name,".."))
{
if (fd.attrib & _A_SUBDIR)
{
char path2[512];
sprintf(path2,"%s%s\\",path,fd.name);
ProcessAllTheo(path2);
}
else
{
char ext[256];
strcpy(ext,GetExt(fd.name));
if (!stricmp(ext,".teo"))
{
char path2[512];
char texpath[512];
sprintf(path2,"%s%s",path,fd.name);
sprintf(texpath,"%sGraph\\Obj3D\\Textures\\",Project.workingdir);
EERIE_3DOBJ * temp;
char tx[1024];
sprintf(tx,"Moulinex %s (%s - %s)",fd.name,path2,texpath);
ForceSendConsole(tx,1,0,NULL);
_ShowText(tx);
if (strstr(path2,"\\NPC\\"))
temp=TheoToEerie_Fast(texpath,path2,TTE_NPC,GDevice);
else
temp=TheoToEerie_Fast(texpath,path2,0,GDevice);
if (temp)
{
ReleaseEERIE3DObj(temp);
ReleaseAllTCWithFlag(0);
}
}
}
}
}
while (!(_findnext(idx, &fd)));
_findclose(idx);
}
}
void LaunchMoulinex()
{
char tx[256];
if (PROCESS_ALL_THEO)
{
sprintf(tx,"Moulinex THEO convertALL START________________");
ForceSendConsole(tx,1,0,NULL);
_ShowText(tx);
ProcessAllTheo(Project.workingdir);
sprintf(tx,"Moulinex THEO convertALL END__________________");
ForceSendConsole(tx,1,0,NULL);
_ShowText(tx);
PROCESS_ALL_THEO=0;
if (KILL_AT_MOULINEX_END)
{
DANAEFinalCleanup();
exit(0);
}
}
if (PROCESS_ONLY_ONE_LEVEL!=-1)
{
PROCESS_LEVELS=1;
}
if (PROCESS_LEVELS==0)
{
MOULINEX=0;
LASTMOULINEX=-1;
if (KILL_AT_MOULINEX_END)
{
DANAEFinalCleanup();
exit(0);
}
else ShowPopup("Moulinex Successfull");
return;
}
long lvl=MOULINEX-1;
if (PROCESS_ONLY_ONE_LEVEL!=-1)
lvl=PROCESS_ONLY_ONE_LEVEL;
sprintf(tx,"Moulinex Lvl %d",lvl);
ForceSendConsole(tx,1,0,NULL);
_ShowText(tx);
if (LASTMOULINEX!=-1)
{
char saveto[256];
long lastlvl;
if (PROCESS_ONLY_ONE_LEVEL!=-1)
lastlvl=PROCESS_ONLY_ONE_LEVEL;
else
lastlvl=MOULINEX-2;
GetLevelNameByNum(lastlvl,tx);
sprintf(saveto,"%s\\Graph\\Levels\\Level%s\\level%s.dlf",Project.workingdir,tx,tx);
if (FileExist(saveto))
{
long oldmode=ModeLight;
ModeLight=MODE_NORMALS | MODE_RAYLAUNCH | MODE_STATICLIGHT | MODE_DYNAMICLIGHT | MODE_DEPTHCUEING;
if (TSU_LIGHTING) ModeLight|=MODE_SMOOTH;
EERIERemovePrecalcLights();
EERIEPrecalcLights(0,0,999999,999999);
DanaeSaveLevel(saveto);
ModeLight=oldmode;
}
if (PROCESS_ONLY_ONE_LEVEL!=-1)
{
DANAEFinalCleanup();
exit(0);
}
}
if (MOULINEX>=32)
{
MOULINEX=0;
LASTMOULINEX=-1;
if (KILL_AT_MOULINEX_END)
{
DANAEFinalCleanup();
exit(0);
}
else ShowPopup("Moulinex Successfull");
return;
}
if (PROCESS_ONLY_ONE_LEVEL!=-1)
{
lvl=PROCESS_ONLY_ONE_LEVEL;
}
{
char loadfrom[256];
GetLevelNameByNum(lvl,tx);
if (stricmp(tx,"NONE"))
{
sprintf(loadfrom,"%s\\Graph\\Levels\\Level%s\\level%s.dlf",Project.workingdir,tx,tx);
if (FileExist(loadfrom))
{
if (CDP_LIGHTOptions!=NULL) SendMessage(CDP_LIGHTOptions,WM_CLOSE,0,0);
if (CDP_FogOptions!=NULL) SendMessage(CDP_FogOptions,WM_CLOSE,0,0);
CDP_LIGHTOptions=NULL;
CDP_FogOptions=NULL;
SetEditMode(1);
DanaeClearLevel();
DanaeLoadLevel(GDevice,loadfrom);
FORBID_SAVE=0;
FirstFrame=1;
}
}
}
if (PROCESS_ONLY_ONE_LEVEL!=-1)
LASTMOULINEX=PROCESS_ONLY_ONE_LEVEL;
else LASTMOULINEX=MOULINEX;
MOULINEX++;
}
void DANAE_StartNewQuest()
{
player.Interface = INTER_LIFE_MANA | INTER_MINIBACK | INTER_MINIBOOK;
PROGRESS_BAR_TOTAL = 108;
OLD_PROGRESS_BAR_COUNT=PROGRESS_BAR_COUNT=0;
LoadLevelScreen(GDevice,1);
char loadfrom[256];
sprintf(loadfrom,"%sGraph\\Levels\\Level1\\Level1.dlf",Project.workingdir);
DONT_ERASE_PLAYER=1;
DanaeClearAll();
PROGRESS_BAR_COUNT+=2.f;
LoadLevelScreen();
DanaeLoadLevel(GDevice,loadfrom);
FORBID_SAVE=0;
FirstFrame=1;
START_NEW_QUEST=0;
STARTED_A_GAME=1;
BLOCK_PLAYER_CONTROLS = 0;
FADEDURATION=0;
FADEDIR=0;
player.Interface = INTER_LIFE_MANA | INTER_MINIBACK | INTER_MINIBOOK;
}
BOOL DANAE_ManageSplashThings()
{
GDevice->SetTextureStageState(0,D3DTSS_ADDRESS,D3DTADDRESS_CLAMP);
SetFilteringMode(GDevice,Bilinear);
if (SPLASH_THINGS_STAGE>10)
{
if (EDITMODE || bGameNotFirstLaunch)
{
for (int i=0; i<256; i++)
{
pGetInfoDirectInput->iOneTouch[i] = 0;
}
pGetInfoDirectInput->GetInput();
for (int i=0; i<256; i++)
{
if (pGetInfoDirectInput->iOneTouch[i] > 0)
{
REFUSE_GAME_RETURN=1;
FORBID_SAVE=0;
FirstFrame=1;
SPLASH_THINGS_STAGE=0;
INTRO_NOT_LOADED=0;
ARXmenu.currentmode=AMCM_MAIN;
ARX_MENU_Launch(GDevice);
}
}
if (ARX_IMPULSE_Pressed(DIK_ESCAPE))
{
REFUSE_GAME_RETURN=1;
SPLASH_THINGS_STAGE = 14;
}
}
if (FAST_SPLASHES)
SPLASH_THINGS_STAGE=14;
if (SPLASH_THINGS_STAGE==11)
{
// Playing the videos in startupvids.txt
char startupvidsPath[256];
sprintf(startupvidsPath,"%smisc\\startupvids.txt",Project.workingdir);
if ((FileExist(startupvidsPath)) && (SPLASH_START == 0))
{
std::ifstream stStartupVids;
stStartupVids.open(startupvidsPath);
char vidToPlay[64];
char vidToPlayPath[256];
while(stStartupVids.good())
{
stStartupVids.getline(vidToPlay,64);
sprintf(vidToPlayPath,"%smisc\\%s",Project.workingdir,vidToPlay);
bSkipVideoIntro = false; // We need to reset this else we'll skip all vids w/ one key pressed
if (FileExist(vidToPlayPath))
{
LaunchAVI(danaeApp.m_hWnd,vidToPlayPath);
pGetInfoDirectInput->ResetAll(); // We need to reset all input else we'll skip all vids w/ one key pressed
}
}
if (bSkipVideoIntro)
{
REFUSE_GAME_RETURN=1;
FORBID_SAVE=0;
FirstFrame=1;
SPLASH_THINGS_STAGE=0;
INTRO_NOT_LOADED=0;
ARXmenu.currentmode=AMCM_MAIN;
ARX_MENU_Launch(GDevice);
}
SPLASH_START=0;
SPLASH_THINGS_STAGE++;
GDevice->SetTextureStageState(0,D3DTSS_ADDRESS,D3DTADDRESS_WRAP);
return TRUE;
}
if (SPLASH_START==0) //firsttime
SPLASH_START = ARX_TIME_GetUL();
ARX_INTERFACE_ShowFISHTANK(GDevice);
unsigned long tim = ARX_TIME_GetUL();
float pos=(float)tim-(float)SPLASH_START;
if (pos>3600)
{
SPLASH_START=0;
SPLASH_THINGS_STAGE++;
}
GDevice->SetTextureStageState(0,D3DTSS_ADDRESS,D3DTADDRESS_WRAP);
return TRUE;
}
if (SPLASH_THINGS_STAGE==12)
{
if (SPLASH_START==0) //firsttime
{
SPLASH_START = ARX_TIME_GetUL();
ARX_SOUND_PlayInterface(SND_PLAYER_HEART_BEAT);
}
ARX_INTERFACE_ShowARKANE(GDevice);
unsigned long tim = ARX_TIME_GetUL();
float pos=(float)tim-(float)SPLASH_START;
if (pos>3600)
{
SPLASH_START=0;
SPLASH_THINGS_STAGE++;
}
GDevice->SetTextureStageState(0,D3DTSS_ADDRESS,D3DTADDRESS_WRAP);
return TRUE;
}
if (SPLASH_THINGS_STAGE==13)
{
ARX_INTERFACE_KillFISHTANK();
ARX_INTERFACE_KillARKANE();
char loadfrom[256];
if (CEDRIC_VERSION)
{
sprintf(loadfrom,"%sGraph\\Levels\\LevelDemo2\\levelDemo2.dlf",Project.workingdir);
LoadLevelScreen(GDevice,29);
}
else
{
REFUSE_GAME_RETURN=1;
sprintf(loadfrom,"%sGraph\\Levels\\Level10\\level10.dlf",Project.workingdir);
OLD_PROGRESS_BAR_COUNT=PROGRESS_BAR_COUNT=0;
PROGRESS_BAR_TOTAL = 108;
LoadLevelScreen(GDevice,10);
}
DanaeLoadLevel(GDevice,loadfrom);
FORBID_SAVE=0;
FirstFrame=1;
SPLASH_THINGS_STAGE=0;
INTRO_NOT_LOADED=0;
if (bGameNotFirstLaunch == false)
bGameNotFirstLaunch = true;
GDevice->SetTextureStageState(0,D3DTSS_ADDRESS,D3DTADDRESS_WRAP);
return TRUE;
}
if (SPLASH_THINGS_STAGE > 13)
{
FORBID_SAVE=0;
FirstFrame=1;
SPLASH_THINGS_STAGE=0;
INTRO_NOT_LOADED=0;
if (bGameNotFirstLaunch == false)
bGameNotFirstLaunch = true;
GDevice->SetTextureStageState(0,D3DTSS_ADDRESS,D3DTADDRESS_WRAP);
return TRUE;
}
}
GDevice->SetTextureStageState(0,D3DTSS_ADDRESS,D3DTADDRESS_WRAP);
return FALSE;
}
//*************************************************************************************
// Manages Currently playing 2D cinematic
//*************************************************************************************
long DANAE_Manage_Cinematic()
{
float FrameTicks=ARX_TIME_Get( false );
if (PLAY_LOADED_CINEMATIC==1)
{
LastFrameTicks=FrameTicks;
PLAY_LOADED_CINEMATIC=2;
}
PlayTrack(ControlCinematique);
ControlCinematique->InitDeviceObjects();
danaeApp.m_pd3dDevice->SetRenderState( D3DRENDERSTATE_ALPHABLENDENABLE, TRUE);
if(ControlCinematique->Render(FrameTicks-LastFrameTicks)==E_FAIL)
return 1;
//fin de l'anim
if ((!ControlCinematique->key)
|| (pGetInfoDirectInput->IsVirtualKeyPressedNowUnPressed(DIK_ESCAPE))
|| (pGetInfoDirectInput->IsVirtualKeyPressedNowUnPressed(DIK_ESCAPE)))
{
ControlCinematique->projectload=FALSE;
StopSoundKeyFramer();
ControlCinematique->OneTimeSceneReInit();
ControlCinematique->DeleteDeviceObjects();
ARX_TIME_UnPause();
PLAY_LOADED_CINEMATIC=0;
bool bWasBlocked = false;
if (BLOCK_PLAYER_CONTROLS)
bWasBlocked = true;
// !! avant le cine end
if (ACTIVECAM)
{
ACTIVECAM->pos.x = ePos.x;
ACTIVECAM->pos.y = ePos.y;
ACTIVECAM->pos.z = ePos.z;
}
if (bWasBlocked)
BLOCK_PLAYER_CONTROLS=1;
ARX_SPEECH_Reset();
SendMsgToAllIO(SM_CINE_END,LAST_LAUNCHED_CINE);
}
LastFrameTicks=FrameTicks;
return 0;
}
void DanaeItemAdd()
{
INTERACTIVE_OBJ * tmp=AddInteractive(GDevice,ItemToBeAdded,0,IO_IMMEDIATELOAD);
if (tmp!=NULL)
{
ARX_INTERACTIVE_HideGore(tmp);
ADDED_IO_NOT_SAVED++;
tmp->EditorFlags |= EFLAG_NOTSAVED;
InterTreeViewItemAdd(tmp);
RestoreInitialIOStatusOfIO(tmp);
long num=GetInterNum(tmp);
if (ValidIONum(num))
{
if (inter.iobj[num] && inter.iobj[num]->script.data)
{
SendScriptEvent(&inter.iobj[num]->script,SM_INIT,"",inter.iobj[num],NULL);
}
if (inter.iobj[num] && inter.iobj[num]->over_script.data)
{
SendScriptEvent(&inter.iobj[num]->over_script,SM_INIT,"",inter.iobj[num],NULL);
}
if (inter.iobj[num] && inter.iobj[num]->script.data)
{
SendScriptEvent(&inter.iobj[num]->script,SM_INITEND,"",inter.iobj[num],NULL);
}
if (inter.iobj[num] && inter.iobj[num]->over_script.data)
{
SendScriptEvent(&inter.iobj[num]->over_script,SM_INITEND,"",inter.iobj[num],NULL);
}
}
}
ItemToBeAdded[0]=0;
}
void ReMappDanaeButton()
{
if(!pGetInfoDirectInput) return;
bool bNoAction=true;
int iButton=pMenuConfig->sakActionKey[CONTROLS_CUST_ACTION].iKey[0];
if(iButton!=-1)
{
if(pGetInfoDirectInput->GetMouseButtonDoubleClick(iButton&~0x80000000,300))
{
LastEERIEMouseButton=EERIEMouseButton;
EERIEMouseButton|=4;
EERIEMouseButton&=~1;
bNoAction=false;
}
}
if(bNoAction)
{
iButton=pMenuConfig->sakActionKey[CONTROLS_CUST_ACTION].iKey[1];
if(iButton!=-1)
{
if(pGetInfoDirectInput->GetMouseButtonDoubleClick(iButton&~0x80000000,300))
{
LastEERIEMouseButton=EERIEMouseButton;
EERIEMouseButton|=4;
EERIEMouseButton&=~1;
}
}
}
bNoAction=true;
iButton=pMenuConfig->sakActionKey[CONTROLS_CUST_ACTION].iKey[0];
if(iButton!=-1)
{
if( ((iButton&0x80000000)&&(pGetInfoDirectInput->GetMouseButtonNowPressed(iButton&~0x80000000)))||
((!(iButton&0x80000000))&&pGetInfoDirectInput->IsVirtualKeyPressedNowPressed(iButton)) )
{
LastEERIEMouseButton=EERIEMouseButton;
EERIEMouseButton|=1;
if (EERIEMouseButton&4) EERIEMouseButton&=~1;
bNoAction=false;
}
}
if(bNoAction)
{
iButton=pMenuConfig->sakActionKey[CONTROLS_CUST_ACTION].iKey[1];
if(iButton!=-1)
{
if( ((iButton&0x80000000)&&(pGetInfoDirectInput->GetMouseButtonNowPressed(iButton&~0x80000000)))||
((!(iButton&0x80000000))&&pGetInfoDirectInput->IsVirtualKeyPressedNowPressed(iButton)) )
{
LastEERIEMouseButton=EERIEMouseButton;
EERIEMouseButton|=1;
if (EERIEMouseButton&4) EERIEMouseButton&=~1;
}
}
}
bNoAction=true;
iButton=pMenuConfig->sakActionKey[CONTROLS_CUST_ACTION].iKey[0];
if(iButton!=-1)
{
if( ((iButton&0x80000000)&&(pGetInfoDirectInput->GetMouseButtonNowUnPressed(iButton&~0x80000000)))||
((!(iButton&0x80000000))&&pGetInfoDirectInput->IsVirtualKeyPressedNowPressed(iButton)) )
{
LastEERIEMouseButton=EERIEMouseButton;
EERIEMouseButton&=~1;
EERIEMouseButton&=~4;
bNoAction=false;
}
}
if(bNoAction)
{
iButton=pMenuConfig->sakActionKey[CONTROLS_CUST_ACTION].iKey[1];
if(iButton!=-1)
{
if( ((iButton&0x80000000)&&(pGetInfoDirectInput->GetMouseButtonNowUnPressed(iButton&~0x80000000)))||
((!(iButton&0x80000000))&&pGetInfoDirectInput->IsVirtualKeyPressedNowPressed(iButton)) )
{
LastEERIEMouseButton=EERIEMouseButton;
EERIEMouseButton&=~1;
EERIEMouseButton&=~4;
}
}
}
bNoAction=true;
iButton=pMenuConfig->sakActionKey[CONTROLS_CUST_MOUSELOOK].iKey[0];
if(iButton!=-1)
{
if( ((iButton&0x80000000)&&(pGetInfoDirectInput->GetMouseButtonNowPressed(iButton&~0x80000000)))||
((!(iButton&0x80000000))&&pGetInfoDirectInput->IsVirtualKeyPressedNowPressed(iButton)) )
{
EERIEMouseButton|=2;
bNoAction=false;
}
}
if(bNoAction)
{
iButton=pMenuConfig->sakActionKey[CONTROLS_CUST_MOUSELOOK].iKey[1];
if(iButton!=-1)
{
if( ((iButton&0x80000000)&&(pGetInfoDirectInput->GetMouseButtonNowPressed(iButton&~0x80000000)))||
((!(iButton&0x80000000))&&pGetInfoDirectInput->IsVirtualKeyPressedNowPressed(iButton)) )
{
EERIEMouseButton|=2;
}
}
}
bNoAction=true;
iButton=pMenuConfig->sakActionKey[CONTROLS_CUST_MOUSELOOK].iKey[0];
if(iButton!=-1)
{
if( ((iButton&0x80000000)&&(pGetInfoDirectInput->GetMouseButtonNowUnPressed(iButton&~0x80000000)))||
((!(iButton&0x80000000))&&pGetInfoDirectInput->IsVirtualKeyPressedNowUnPressed(iButton)) )
{
EERIEMouseButton&=~2;
bNoAction=false;
}
}
if(bNoAction)
{
iButton=pMenuConfig->sakActionKey[CONTROLS_CUST_MOUSELOOK].iKey[1];
if(iButton!=-1)
{
if( ((iButton&0x80000000)&&(pGetInfoDirectInput->GetMouseButtonNowUnPressed(iButton&~0x80000000)))||
((!(iButton&0x80000000))&&pGetInfoDirectInput->IsVirtualKeyPressedNowUnPressed(iButton)) )
{
EERIEMouseButton&=~2;
}
}
}
}
long NEED_SPECIAL_RENDEREND=0;
long INTERPOLATE_BETWEEN_BONES=1;
extern int iTimeToDrawD7;
extern long INTERTRANSPOLYSPOS;
extern long TRANSPOLYSPOS;
extern bool bRenderInterList;
unsigned long BENCH_STARTUP=0;
unsigned long BENCH_PLAYER=0;
unsigned long BENCH_RENDER=0;
unsigned long BENCH_PARTICLES=0;
unsigned long BENCH_SPEECH=0;
unsigned long BENCH_SCRIPT=0;
unsigned long oBENCH_STARTUP=0;
unsigned long oBENCH_PLAYER=0;
unsigned long oBENCH_RENDER=0;
unsigned long oBENCH_PARTICLES=0;
unsigned long oBENCH_SPEECH=0;
unsigned long oBENCH_SCRIPT=0;
extern unsigned long BENCH_PATHFINDER;
unsigned long oBENCH_PATHFINDER=0;
extern unsigned long BENCH_SOUND;
unsigned long oBENCH_SOUND=0;
long WILL_QUICKLOAD=0;
long WILL_QUICKSAVE=0;
void DemoFileCheck()
{
return;
if (!FINAL_COMMERCIAL_DEMO)
{
char fic[256];
sprintf(fic,"%sGraph\\Obj3D\\Interactive\\NPC\\Undead_Liche\\Undead_Liche.asl",Project.workingdir);
if (!PAK_FileExist(fic))
{
FINAL_COMMERCIAL_DEMO=1;
}
}
}
void CorrectValue(unsigned long * cur,unsigned long * dest)
{
if (*cur=*dest)
return;
if (*cur<*dest)
{
*cur = *dest;
return;
}
if (*cur>=1)
{
*cur-=1;
return;
}
*cur=0;
}
long iVPOS=0;
void ShowValue(unsigned long * cur,unsigned long * dest,char * str)
{
iVPOS+=1;
CorrectValue(cur,dest);
D3DCOLOR col;
EERIE_RGB rgb;
switch (iVPOS)
{
case 0:
rgb.r = 1;
rgb.g = 0;
rgb.b = 0;
break;
case 1:
rgb.r = 0;
rgb.g = 1;
rgb.b = 0;
break;
case 2:
rgb.r = 0;
rgb.g = 0;
rgb.b = 1;
break;
case 3:
rgb.r = 1;
rgb.g = 1;
rgb.b = 0;
break;
case 4:
rgb.r = 1;
rgb.g = 0;
rgb.b = 1;
break;
case 5:
rgb.r = 0;
rgb.g = 1;
rgb.b = 1;
break;
case 6:
rgb.r = 1;
rgb.g = 1;
rgb.b = 1;
break;
case 7:
rgb.r = 1;
rgb.g = 0.5f;
rgb.b = 0.5f;
break;
case 8:
rgb.r = 0.5;
rgb.g = 0.5f;
rgb.b = 1.f;
break;
default:
rgb.r = 0.5f;
rgb.g = 0.5f;
rgb.b = 0.5f;
break;
}
col=EERIERGB(rgb.r,rgb.g,rgb.b);
float width=(float)(*cur)*DIV500;
EERIEDrawBitmap(danaeApp.m_pd3dDevice, 0, ARX_CLEAN_WARN_CAST_FLOAT(iVPOS * 16), width, 8, 0.000091f, NULL, col);
danaeApp.OutputText(ARX_CLEAN_WARN_CAST_DWORD(width), iVPOS * 16 - 2, str);
}
extern DWORD RenderStartTicks;
extern long NEED_INTRO_LAUNCH;
//-----------------------------------------------------------------------------
HRESULT DANAE::Render()
{
FrameTime = ARX_TIME_Get();
if (GLOBAL_SLOWDOWN!=1.f)
{
float ft;
ft=FrameTime-LastFrameTime;
Original_framedelay=ft*TIMEFACTOR;
ft*=1.f-GLOBAL_SLOWDOWN;
float minus;
minus = ft;
ARXTotalPausedTime+=minus;
FrameTime = ARX_TIME_Get();
if (LastFrameTime>FrameTime)
{
LastFrameTime=FrameTime;
}
ft=FrameTime-LastFrameTime;
FrameDiff = ft;
float FD;
FD=FrameDiff;
// Under 10 FPS the whole game slows down to avoid unexpected results...
_framedelay=(float)FrameDiff;
}
else
{
FrameDiff = FrameTime-LastFrameTime;
float FD;
FD=FrameDiff;
// Under 10 FPS the whole game slows down to avoid unexpected results...
_framedelay=((float)(FrameDiff)*TIMEFACTOR);
FrameDiff = _framedelay;
Original_framedelay=_framedelay;
// Original_framedelay = 1000/25;
ARXTotalPausedTime+=FD-FrameDiff;
}
static float _AvgFrameDiff = 150.f;
if( FrameDiff > _AvgFrameDiff * 10.f )
{
FrameDiff = _AvgFrameDiff * 10.f;
}
else if ( FrameDiff > 15.f )
{
_AvgFrameDiff+= (FrameDiff - _AvgFrameDiff )*0.01f;
}
if (NEED_BENCH)
{
BENCH_STARTUP=0;
BENCH_PLAYER=0;
BENCH_RENDER=0;
BENCH_PARTICLES=0;
BENCH_SPEECH=0;
BENCH_SCRIPT=0;
}
StartBench();
RenderStartTicks = dwARX_TIME_Get();
if(bForceGDI)
{
HDC hDC;
if( SUCCEEDED( m_pddsRenderTarget->GetDC(&hDC) ) )
{
m_pddsRenderTarget->ReleaseDC(hDC);
}
}
if( (pGetInfoDirectInput)&&
(pGetInfoDirectInput->IsVirtualKeyPressedNowPressed(DIK_F12)))
{
bGMergeVertex=!bGMergeVertex;
EERIE_PORTAL_ReleaseOnlyVertexBuffer();
ComputePortalVertexBuffer();
}
ACTIVECAM = &subj;
if ( (!FINAL_COMMERCIAL_DEMO)
&& (!FINAL_COMMERCIAL_GAME)
&& (ARXmenu.currentmode==AMCM_OFF) )
{
if( (pGetInfoDirectInput)&&
(pGetInfoDirectInput->IsVirtualKeyPressedOneTouch(DIK_Y)) )
{
USE_OLD_MOUSE_SYSTEM=(USE_OLD_MOUSE_SYSTEM)?0:1;
if(!USE_OLD_MOUSE_SYSTEM)
{
current.depthcolor.r=0.f;
current.depthcolor.g=0.f;
current.depthcolor.b=1.f;
}
}
}
//BUMP
if(pMenuConfig->bBumpMapping)
{
e3dPosBump=player.pos;
}
// Sets our Global Device to Current Device
GDevice=m_pd3dDevice;
if (this->m_pFramework->m_bHasMoved)
{
DanaeRestoreFullScreen();
this->m_pFramework->m_bHasMoved=FALSE;
if(pMenu)
{
pMenu->bReInitAll=true;
}
DANAESIZX=danaeApp.m_pFramework->m_dwRenderWidth;
DANAESIZY=danaeApp.m_pFramework->m_dwRenderHeight;
if (danaeApp.m_pDeviceInfo->bWindowed)
DANAESIZY-=danaeApp.m_pFramework->Ystart;
DANAECENTERX=DANAESIZX>>1;
DANAECENTERY=DANAESIZY>>1;
Xratio=DANAESIZX*DIV640;
Yratio=DANAESIZY*DIV480;
}
// Get DirectInput Infos
if ((!USE_OLD_MOUSE_SYSTEM))
{
pGetInfoDirectInput->GetInput();
ReMappDanaeButton();
}
// Manages Splash Screens if needed
if (DANAE_ManageSplashThings())
goto norenderend;
// Clicked on New Quest ? (TODO:need certainly to be moved somewhere else...)
if (START_NEW_QUEST)
{
LaunchCDROMCheck(0);
DANAE_StartNewQuest();
}
// Update Various Player Infos for this frame.
if (FirstFrame==0)
ARX_PLAYER_Frame_Update();
// Checks for ESC key
if (pGetInfoDirectInput->IsVirtualKeyPressedNowUnPressed(DIK_ESCAPE))
{
if (ARXmenu.currentmode == AMCM_OFF)
{
if (CINEMASCOPE)
{
if (!FADEDIR) // Disabling ESC capture while fading in or out.
{
if (SendMsgToAllIO(SM_KEY_PRESSED,"")!=REFUSE)
{
REQUEST_SPEECH_SKIP=1;
}
}
}
else
{
//create a screenshot temporaire pour la sauvegarde
::SnapShot *pSnapShot=new ::SnapShot(NULL,"sct",true);
pSnapShot->GetSnapShotDim(160,100);
delete pSnapShot;
ARX_TIME_Pause();
ARXTimeMenu=ARXOldTimeMenu=ARX_TIME_Get();
ARX_MENU_Launch(m_pd3dDevice);
bFadeInOut=false; //fade out
bFade=true; //active le fade
pGetInfoDirectInput->iOneTouch[DIK_ESCAPE] = 0;
TRUE_PLAYER_MOUSELOOK_ON = 0;
ARX_PLAYER_PutPlayerInNormalStance(1);
}
}
}
// Project need to reload all textures ???
if (WILL_RELOAD_ALL_TEXTURES)
{
ReloadAllTextures(GDevice);
if(ControlCinematique)
{
ControlCinematique->m_pd3dDevice=GDevice;
ActiveAllTexture(ControlCinematique);
}
WILL_RELOAD_ALL_TEXTURES=0;
}
// Are we being teleported ?
if ((TELEPORT_TO_LEVEL[0]) && (CHANGE_LEVEL_ICON==200))
{
CHANGE_LEVEL_ICON=-1;
LaunchCDROMCheck(0);
ARX_CHANGELEVEL_Change(TELEPORT_TO_LEVEL, TELEPORT_TO_POSITION, TELEPORT_TO_ANGLE, 0);
memset(TELEPORT_TO_LEVEL,0,64);
memset(TELEPORT_TO_POSITION,0,64);
}
if (NEED_INTRO_LAUNCH)
{
SetEditMode(0);
BLOCK_PLAYER_CONTROLS=1;
ARX_INTERFACE_PlayerInterfaceModify(0,0);
ARX_Menu_Resources_Release();
ARXmenu.currentmode=AMCM_OFF;
ARX_TIME_UnPause();
SPLASH_THINGS_STAGE=14;
NEED_INTRO_LAUNCH=0;
char loadfrom[256];
REFUSE_GAME_RETURN=1;
sprintf(loadfrom,"%sGraph\\Levels\\Level10\\level10.dlf",Project.workingdir);
OLD_PROGRESS_BAR_COUNT=PROGRESS_BAR_COUNT=0;
PROGRESS_BAR_TOTAL = 108;
LoadLevelScreen(GDevice,10);
DanaeLoadLevel(GDevice,loadfrom);
FORBID_SAVE=0;
FirstFrame=1;
SPLASH_THINGS_STAGE=0;
INTRO_NOT_LOADED=0;
GDevice->SetTextureStageState(0,D3DTSS_ADDRESS,D3DTADDRESS_WRAP);
return FALSE;
}
// Little security Feature...
#ifdef ASKPASS
if ((rnd()>0.5f) && (!accepted)) exit(0);
#endif
// Sets Danae Screen size depending on windowed/full-screen state
DANAESIZX=this->m_pFramework->m_dwRenderWidth;
DANAESIZY=this->m_pFramework->m_dwRenderHeight;
if ((m_pDeviceInfo->bWindowed) && (!FINAL_RELEASE))
DANAESIZY-=this->m_pFramework->Ystart;
// Now computes screen center
//Setting long from long
subj.centerx = DANAECENTERX = DANAESIZX>>1;
subj.centery = DANAECENTERY = DANAESIZY>>1;
//Casting long to float
subj.posleft = subj.transform.xmod = ARX_CLEAN_WARN_CAST_FLOAT( DANAECENTERX );
subj.postop = subj.transform.ymod = ARX_CLEAN_WARN_CAST_FLOAT( DANAECENTERY );
// Computes X & Y screen ratios compared to a standard 640x480 screen
if (DANAESIZX == 640) Xratio = 1.f;
else Xratio = DANAESIZX * DIV640;
if (DANAESIZY == 480) Yratio = 1.f;
else Yratio = DANAESIZY * DIV480;
// Finally computes current focal
BASE_FOCAL=(float)CURRENT_BASE_FOCAL+(float)FOKMOD+(BOW_FOCAL*DIV4);
// SPECIFIC code for Snapshot MODE... to insure constant capture framerate
if ( (SnapShotMode)
&& (!ARXPausedTime) )
{
ARXTotalPausedTime+=ARXTime-(LastFrameTime+(1000/snapshotdata.imgsec));
}
PULSATE=EEsin(FrameTime*DIV800);
METALdecal=EEsin(FrameTime*DIV50)*DIV200;
PULSS=EEsin(FrameTime*DIV200)*DIVPI*DIV4+0.25f;
EERIEDrawnPolys=0;
// EditMode Specific code
if (EDITMODE)
{
TOTIOPDL=0;
BLOCK_PLAYER_CONTROLS=0;
}
if (FirstFrame==0) // Checks for Keyboard & Moulinex
{
ARX_MOUSE_OVER=0;
if (!EDITMODE && (ARXmenu.currentmode == AMCM_OFF)) // Playing Game
{
// Checks Clicks in Book Interface
if (ARX_INTERFACE_MouseInBook())
{
ARX_MOUSE_OVER|=ARX_MOUSE_OVER_BOOK;
LASTBOOKBUTTON=BOOKBUTTON;
BOOKBUTTON=EERIEMouseButton;
if ( ((EERIEMouseButton & 1) && !(LastMouseClick & 1) )
|| ((EERIEMouseButton & 2) && !(LastMouseClick & 2) ) )
{
bookclick.x=DANAEMouse.x;
bookclick.y=DANAEMouse.y;
}
}
else if (InSecondaryInventoryPos(&DANAEMouse))
ARX_MOUSE_OVER|=ARX_MOUSE_OVER_INVENTORY_2;
else if (InPlayerInventoryPos(&DANAEMouse))
ARX_MOUSE_OVER|=ARX_MOUSE_OVER_INVENTORY;
}
if ( (player.Interface & INTER_COMBATMODE)
|| (PLAYER_MOUSELOOK_ON) )
{
FlyingOverIO = NULL; // Avoid to check with those modes
}
else
{
if ((DRAGINTER == NULL) && (FRAME_COUNT<=0))
{
if (!BLOCK_PLAYER_CONTROLS && !TRUE_PLAYER_MOUSELOOK_ON && !(ARX_MOUSE_OVER & ARX_MOUSE_OVER_BOOK)
&& (eMouseState != MOUSE_IN_NOTE)
)
FlyingOverIO = FlyingOverObject(&DANAEMouse);
else
FlyingOverIO = NULL;
}
}
if ( (!PLAYER_PARALYSED)
|| (ARXmenu.currentmode != AMCM_OFF) )
{
if (!STOP_KEYBOARD_INPUT)
ManageKeyMouse();
else
{
STOP_KEYBOARD_INPUT++;
if (STOP_KEYBOARD_INPUT>2) STOP_KEYBOARD_INPUT=0;
}
}
if (MOULINEX)
LaunchMoulinex();
}
else // Manages our first frameS
{
ARX_TIME_Get();
long ffh=FirstFrameHandling( m_pd3dDevice);
if (ffh== FFH_S_OK) return S_OK;
if (ffh== FFH_GOTO_FINISH) goto norenderend;
}
if (CheckInPolyPrecis(player.pos.x,player.pos.y,player.pos.z))
{
LastValidPlayerPos.x=player.pos.x;
LastValidPlayerPos.y=player.pos.y;
LastValidPlayerPos.z=player.pos.z;
}
if ((!FINAL_RELEASE) && (ARXmenu.currentmode == AMCM_OFF))
{
if (this->kbd.inkey[INKEY_M])
{
USE_PORTALS++;
if (USE_PORTALS>4) USE_PORTALS=0;
if (USE_PORTALS==1) USE_PORTALS=2;
this->kbd.inkey[INKEY_M]=0;
}
if (this->kbd.inkey[INKEY_P])
{
if (INTERPOLATE_BETWEEN_BONES)
INTERPOLATE_BETWEEN_BONES=0;
else
INTERPOLATE_BETWEEN_BONES=1;
this->kbd.inkey[INKEY_P]=0;
}
}
// Updates Externalview
if (EXTERNALVIEWING) EXTERNALVIEW=1;
else EXTERNALVIEW=0;
GDevice->SetRenderState(D3DRENDERSTATE_FOGENABLE, false);
if (ARX_Menu_Render(m_pd3dDevice))
{
goto norenderend;
}
if (WILL_QUICKSAVE)
{
::SnapShot *pSnapShot=new ::SnapShot(NULL,"sct",true);
pSnapShot->GetSnapShotDim(160,100);
delete pSnapShot;
if (WILL_QUICKSAVE>=2)
{
LaunchCDROMCheck(0);
ARX_QuickSave();
WILL_QUICKSAVE=0;
}
else WILL_QUICKSAVE++;
}
if (WILL_QUICKLOAD)
{
WILL_QUICKLOAD=0;
LaunchCDROMCheck(0);
if (ARX_QuickLoad())
NEED_SPECIAL_RENDEREND=1;
}
if (NEED_SPECIAL_RENDEREND)
{
NEED_SPECIAL_RENDEREND=0;
goto norenderend;
}
GDevice->SetRenderState( D3DRENDERSTATE_FOGENABLE, true);
GDevice->SetTextureStageState(0,D3DTSS_ADDRESS,D3DTADDRESS_WRAP);
// Are we displaying a 2D cinematic ? Yes = manage it
if ( PLAY_LOADED_CINEMATIC
&& ControlCinematique
&& ControlCinematique->projectload)
{
if (DANAE_Manage_Cinematic()==1)
goto norenderend;
goto renderend;
}
BENCH_STARTUP=EndBench();
StartBench();
if (ARXmenu.currentmode == AMCM_OFF)
{
if (!PLAYER_PARALYSED)
{
if (ManageEditorControls()) goto finish;
}
if ((!BLOCK_PLAYER_CONTROLS) && (!PLAYER_PARALYSED))
{
ManagePlayerControls();
}
}
ARX_PLAYER_Manage_Movement();
ARX_PLAYER_Manage_Visual();
if (FRAME_COUNT<=0)
ARX_MINIMAP_ValidatePlayerPos();
BENCH_PLAYER=EndBench();
// SUBJECTIVE VIEW UPDATE START *********************************************************
{
// Clear screen & Z buffers
if (desired.flags & GMOD_DCOLOR)
{
long DCOLOR=EERIERGB(current.depthcolor.r,current.depthcolor.g,current.depthcolor.b);
m_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,DCOLOR, 1.0f, 0L );
}
else
{
subj.bkgcolor=ulBKGColor;
m_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,subj.bkgcolor, 1.0f, 0L );
}
//-------------------------------------------------------------------------------
// DRAW CINEMASCOPE 16/9
if (CINEMA_DECAL!=0.f)
{
D3DRECT rectz[2];
rectz[0].x1 = rectz[1].x1 = 0;
rectz[0].x2 = rectz[1].x2 = DANAESIZX;
rectz[0].y1 = 0;
ARX_CHECK_LONG( CINEMA_DECAL * Yratio );
long lMulResult = ARX_CLEAN_WARN_CAST_LONG( CINEMA_DECAL * Yratio );
rectz[0].y2 = lMulResult;
rectz[1].y1 = DANAESIZY - lMulResult;
rectz[1].y2 = DANAESIZY;
m_pd3dDevice->Clear( 2, rectz, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,0x00000000, 0.f, 0L );
}
//-------------------------------------------------------------------------------
if(!danaeApp.DANAEStartRender())
{
return E_FAIL;
}
SETZWRITE(m_pd3dDevice, TRUE );
SETALPHABLEND(m_pd3dDevice,FALSE);
if ( (inter.iobj[0]) && (inter.iobj[0]->animlayer[0].cur_anim) )
{
ManageNONCombatModeAnimations();
long old=USEINTERNORM;
USEINTERNORM=0;
float speedfactor;
speedfactor=inter.iobj[0]->basespeed+inter.iobj[0]->speed_modif;
if (cur_mr==3) speedfactor+=0.5f;
if (cur_rf==3) speedfactor+=1.5f;
if (speedfactor < 0) speedfactor = 0;
long tFrameDiff;
F2L(Original_framedelay,&tFrameDiff);
if ((player.Interface & INTER_COMBATMODE) && (STRIKE_TIME))// need some precision for weapon...
{
float restore=ACTIVECAM->use_focal;
if ((!EXTERNALVIEW) && (!BOW_FOCAL))
{
ACTIVECAM->use_focal=PLAYER_ARMS_FOCAL*Xratio;
}
float cur=0;
while ((curioflags & IO_FREEZESCRIPT)))
{
long step=__min(50,tFrameDiff);
if (inter.iobj[0]->ioflags & IO_FREEZESCRIPT) step=0;
float iCalc = step*speedfactor ;
ARX_CHECK_ULONG(iCalc);
EERIEDrawAnimQuat( m_pd3dDevice, inter.iobj[0]->obj,
&inter.iobj[0]->animlayer[0],
&inter.iobj[0]->angle,&inter.iobj[0]->pos,
ARX_CLEAN_WARN_CAST_ULONG(iCalc)
, inter.iobj[0], 0, 4);
if ((player.Interface & INTER_COMBATMODE) && (inter.iobj[0]->animlayer[1].cur_anim != NULL))
ManageCombatModeAnimations();
if (inter.iobj[0]->animlayer[1].cur_anim!=NULL)
ManageCombatModeAnimationsEND();
cur+=step*speedfactor;
}
ACTIVECAM->use_focal=restore;
}
else
{
float restore=ACTIVECAM->use_focal;
if ((!EXTERNALVIEW) && (!BOW_FOCAL))
{
ACTIVECAM->use_focal=PLAYER_ARMS_FOCAL*Xratio;
}
float val=(float)tFrameDiff*speedfactor;
ARX_CHECK_LONG(val);
if (inter.iobj[0]->ioflags & IO_FREEZESCRIPT) val=0;
EERIEDrawAnimQuat( m_pd3dDevice,
inter.iobj[0]->obj,
&inter.iobj[0]->animlayer[0],
&inter.iobj[0]->angle,
&inter.iobj[0]->pos,
ARX_CLEAN_WARN_CAST_ULONG(val),
inter.iobj[0],
0,4);
if ((player.Interface & INTER_COMBATMODE) && (inter.iobj[0]->animlayer[1].cur_anim != NULL))
ManageCombatModeAnimations();
if (inter.iobj[0]->animlayer[1].cur_anim!=NULL)
ManageCombatModeAnimationsEND();
ACTIVECAM->use_focal=restore;
}
USEINTERNORM=old;
}
INTERACTIVE_OBJ * io;
io=inter.iobj[0];
ANIM_USE * useanim;
useanim=&io->animlayer[1];
ANIM_HANDLE ** alist;
alist=io->anims;
if ( BOW_FOCAL
&& (useanim->cur_anim!=alist[ANIM_MISSILE_STRIKE_PART_1])
&& (useanim->cur_anim!=alist[ANIM_MISSILE_STRIKE_PART_2])
&& (useanim->cur_anim!=alist[ANIM_MISSILE_STRIKE_CYCLE]) )
{
BOW_FOCAL-=Original_framedelay;
if (BOW_FOCAL<0) BOW_FOCAL=0;
}
if (eyeball.exist == 2)
{
subj.d_pos.x=eyeball.pos.x;
subj.d_pos.y=eyeball.pos.y;
subj.d_pos.z=eyeball.pos.z;
subj.d_angle.a=eyeball.angle.a;
subj.d_angle.b=eyeball.angle.b;
subj.d_angle.g=eyeball.angle.g;
EXTERNALVIEW=1;
}
else if (EXTERNALVIEW)
{
float t=DEG2RAD(player.angle.b);
EERIE_3D tt;
for (long l=0;l<250;l+=10)
{
tt.x=player.pos.x+(float)EEsin(t)*(float)l;
tt.y=player.pos.y-50.f;
tt.z=player.pos.z-(float)EEcos(t)*(float)l;
EERIEPOLY * ep =EECheckInPoly(&tt);
if (ep)
{
subj.d_pos.x=tt.x;
subj.d_pos.y=tt.y;
subj.d_pos.z=tt.z;
}
else break;
}
subj.d_angle.a=player.angle.a+30.f;
subj.d_angle.b=player.angle.b;
subj.d_angle.g=player.angle.g;
EXTERNALVIEW=1;
}
else
{
subj.angle.a=player.angle.a;
subj.angle.b=player.angle.b;
subj.angle.g=player.angle.g;
EXTERNALVIEW=0;
long id;
if (inter.iobj[0])
{
id = inter.iobj[0]->obj->fastaccess.view_attach;
if (id!=-1)
{
subj.pos.x=inter.iobj[0]->obj->vertexlist3[id].v.x;
subj.pos.y=inter.iobj[0]->obj->vertexlist3[id].v.y;
subj.pos.z=inter.iobj[0]->obj->vertexlist3[id].v.z;
EERIE_3D vect;
vect.x=subj.pos.x-player.pos.x;
vect.y=0;
vect.z=subj.pos.z-player.pos.z;
float len=Vector_Magnitude(&vect);
if (len>46.f)
{
float div=46.f/len;
vect.x*=div;
vect.z*=div;
subj.pos.x=player.pos.x+vect.x;
subj.pos.z=player.pos.z+vect.z;
}
}
else
{
subj.pos.x=player.pos.x;
subj.pos.y=player.pos.y;
subj.pos.z=player.pos.z;
subj.pos.y+=PLAYER_BASE_HEIGHT;
}
}
}
if (EXTERNALVIEW)
{
subj.pos.x=(subj.pos.x+subj.d_pos.x)*DIV2;
subj.pos.y=(subj.pos.y+subj.d_pos.y)*DIV2;
subj.pos.z=(subj.pos.z+subj.d_pos.z)*DIV2;
subj.angle.a=InterpolateAngle(subj.angle.a,subj.d_angle.a,0.1f);
subj.angle.b=InterpolateAngle(subj.angle.b,subj.d_angle.b,0.1f);
subj.angle.g=InterpolateAngle(subj.angle.g,subj.d_angle.g,0.1f);
}
if ((ARX_CONVERSATION) && (main_conversation.actors_nb))
{
// Decides who speaks !!
if (main_conversation.current<0)
for (long j=0;j=0)
{
for (long k=0;k0.4f) conversationcamera.d_angle.a=(1.f-rnd()*2.f)*DIV30;
if (rnd()>0.4f) conversationcamera.d_angle.b=(1.f-rnd()*1.2f)*DIV5;
if (rnd()>0.4f) conversationcamera.d_angle.g=(1.f-rnd()*2.f)*DIV40;
if (rnd()>0.5f)
{
conversationcamera.size.a=MAKEANGLE(180.f+rnd()*20.f-10.f);
conversationcamera.size.g=0.f;
conversationcamera.d_angle.g=0.08f;
conversationcamera.d_angle.b=0.f;
conversationcamera.d_angle.a = 0.f;
conversationcamera.size.b=0.f;
}
}
else
{
conversationcamera.size.a+=conversationcamera.d_angle.a*FrameDiff;
conversationcamera.size.b+=conversationcamera.d_angle.b*FrameDiff;
conversationcamera.size.g+=conversationcamera.d_angle.g*FrameDiff;
}
EERIE_3D sourcepos,targetpos;
if (ApplySpeechPos(&conversationcamera,is))
{
targetpos.x=conversationcamera.d_pos.x;
targetpos.y=conversationcamera.d_pos.y;
targetpos.z=conversationcamera.d_pos.z;
sourcepos.x=conversationcamera.pos.x;
sourcepos.y=conversationcamera.pos.y;
sourcepos.z=conversationcamera.pos.z;
}
else
{
targetpos.x=player.pos.x;
targetpos.y=player.pos.y;
targetpos.z=player.pos.z;
float t=DEG2RAD(player.angle.b);
sourcepos.x=targetpos.x+(float)EEsin(t)*100.f;
sourcepos.y=targetpos.y;
sourcepos.z=targetpos.z-(float)EEcos(t)*100.f;
}
EERIE_3D vect,vec2;
vect.x=targetpos.x-sourcepos.x;
vect.y=targetpos.y-sourcepos.y;
vect.z=targetpos.z-sourcepos.z;
float mag=1.f/Vector_Magnitude(&vect);
vect.x*=mag;
vect.y*=mag;
vect.z*=mag;
float dist=250.f-conversationcamera.size.g;
if (dist<0.f) dist=(90.f-(dist*DIV20));
else if (dist<90.f) dist=90.f;
_YRotatePoint(&vect,&vec2,EEcos(DEG2RAD(conversationcamera.size.a)),EEsin(DEG2RAD(conversationcamera.size.a)));
sourcepos.x=targetpos.x-vec2.x*dist;
sourcepos.y=targetpos.y-vec2.y*dist;
sourcepos.z=targetpos.z-vec2.z*dist;
if (conversationcamera.size.b!=0.f)
sourcepos.y+=120.f-conversationcamera.size.b*DIV10;
conversationcamera.pos.x=sourcepos.x;
conversationcamera.pos.y=sourcepos.y;
conversationcamera.pos.z=sourcepos.z;
SetTargetCamera(&conversationcamera,targetpos.x,targetpos.y,targetpos.z);
subj.pos.x=conversationcamera.pos.x;
subj.pos.y=conversationcamera.pos.y;
subj.pos.z=conversationcamera.pos.z;
subj.angle.a=MAKEANGLE(-conversationcamera.angle.a);
subj.angle.b=MAKEANGLE(conversationcamera.angle.b-180.f);
subj.angle.g=0.f;
EXTERNALVIEW=1;
}
else
{
ARX_CONVERSATION_MODE=-1;
ARX_CONVERSATION_LASTIS=-1;
if (LAST_CONVERSATION)
{
AcquireLastAnim(inter.iobj[0]);
ANIM_Set(&inter.iobj[0]->animlayer[1],inter.iobj[0]->anims[ANIM_WAIT]);
inter.iobj[0]->animlayer[1].flags|=EA_LOOP;
}
}
////////////////////////
// Checks SCRIPT TIMERS.
if (FirstFrame==0)
ARX_SCRIPT_Timer_Check();
/////////////////////////////////////////////
// Now checks for speech controlled cinematic
{
long valid=-1;
for (long i=0;i0))
{
valid=i;
break;
}
}
if (valid>=0)
{
ARX_CINEMATIC_SPEECH * acs=&aspeech[valid].cine;
INTERACTIVE_OBJ * io=aspeech[valid].io;
float rtime=(float)(ARX_TIME_Get()-aspeech[valid].time_creation)/(float)aspeech[valid].duration;
if (rtime<0) rtime=0;
if (rtime>1) rtime=1;
float itime=1.f-rtime;
if ((rtime>=0.f) && (rtime<=1.f) && io)
{
float alpha,beta,distance,dist;
switch (acs->type)
{
case ARX_CINE_SPEECH_KEEP:
subj.pos.x=acs->pos1.x;
subj.pos.y=acs->pos1.y;
subj.pos.z=acs->pos1.z;
subj.angle.a=acs->pos2.a;
subj.angle.b=acs->pos2.b;
subj.angle.g=acs->pos2.g;
EXTERNALVIEW=1;
break;
case ARX_CINE_SPEECH_ZOOM:
//need to compute current values
alpha=acs->startangle.a*itime+acs->endangle.a*rtime;
beta=acs->startangle.b*itime+acs->endangle.b*rtime;
distance=acs->startpos*itime+acs->endpos*rtime;
EERIE_3D targetpos;
targetpos.x=acs->pos1.x;
targetpos.y=acs->pos1.y;
targetpos.z=acs->pos1.z;
conversationcamera.pos.x=-EEsin(DEG2RAD(MAKEANGLE(io->angle.b+beta)))*distance+targetpos.x;
conversationcamera.pos.y= EEsin(DEG2RAD(MAKEANGLE(io->angle.a+alpha)))*distance+targetpos.y;
conversationcamera.pos.z= EEcos(DEG2RAD(MAKEANGLE(io->angle.b+beta)))*distance+targetpos.z;
SetTargetCamera(&conversationcamera,targetpos.x,targetpos.y,targetpos.z);
subj.pos.x=conversationcamera.pos.x;
subj.pos.y=conversationcamera.pos.y;
subj.pos.z=conversationcamera.pos.z;
subj.angle.a=MAKEANGLE(-conversationcamera.angle.a);
subj.angle.b=MAKEANGLE(conversationcamera.angle.b-180.f);
subj.angle.g=0.f;
EXTERNALVIEW=1;
break;
case ARX_CINE_SPEECH_SIDE_LEFT:
case ARX_CINE_SPEECH_SIDE:
if (ValidIONum(acs->ionum))
{
EERIE_3D from,to,vect,vect2;
from.x=acs->pos1.x;
from.y=acs->pos1.y;
from.z=acs->pos1.z;
to.x=acs->pos2.x;
to.y=acs->pos2.y;
to.z=acs->pos2.z;
vect.x=to.x-from.x;
vect.y=to.y-from.y;
vect.z=to.z-from.z;
TRUEVector_Normalize(&vect);
if (acs->type==ARX_CINE_SPEECH_SIDE_LEFT)
{
Vector_RotateY(&vect2,&vect,-90);
}
else
{
Vector_RotateY(&vect2,&vect,90);
}
distance=acs->f0*itime+acs->f1*rtime;
vect2.x*=distance;
vect2.y*=distance;
vect2.z*=distance;
dist=TRUEEEDistance3D(&from,&to);
EERIE_3D tfrom,tto;
tfrom.x=from.x+vect.x*acs->startpos*DIV100*dist;
tfrom.y=from.y+vect.y*acs->startpos*DIV100*dist;
tfrom.z=from.z+vect.z*acs->startpos*DIV100*dist;
tto.x=from.x+vect.x*acs->endpos*DIV100*dist;
tto.y=from.y+vect.y*acs->endpos*DIV100*dist;
tto.z=from.z+vect.z*acs->endpos*DIV100*dist;
targetpos.x=tfrom.x*itime+tto.x*rtime;
targetpos.y=tfrom.y*itime+tto.y*rtime+acs->f2;
targetpos.z=tfrom.z*itime+tto.z*rtime;
conversationcamera.pos.x=targetpos.x+vect2.x;
conversationcamera.pos.y=targetpos.y+vect2.y+acs->f2;
conversationcamera.pos.z=targetpos.z+vect2.z;
SetTargetCamera(&conversationcamera,targetpos.x,targetpos.y,targetpos.z);
subj.pos.x=conversationcamera.pos.x;
subj.pos.y=conversationcamera.pos.y;
subj.pos.z=conversationcamera.pos.z;
subj.angle.a=MAKEANGLE(-conversationcamera.angle.a);
subj.angle.b=MAKEANGLE(conversationcamera.angle.b-180.f);
subj.angle.g=0.f;
EXTERNALVIEW=1;
}
break;
case ARX_CINE_SPEECH_CCCLISTENER_R:
case ARX_CINE_SPEECH_CCCLISTENER_L:
case ARX_CINE_SPEECH_CCCTALKER_R:
case ARX_CINE_SPEECH_CCCTALKER_L:
//need to compute current values
if (ValidIONum(acs->ionum))
{
INTERACTIVE_OBJ * ioo=inter.iobj[acs->ionum];
INTERACTIVE_OBJ * o1=io;
INTERACTIVE_OBJ * o2=ioo;
if ((acs->type==ARX_CINE_SPEECH_CCCLISTENER_L)
|| (acs->type==ARX_CINE_SPEECH_CCCLISTENER_R))
{
o1=ioo;
o2=io;
conversationcamera.pos.x=acs->pos2.x;
conversationcamera.pos.y=acs->pos2.y;
conversationcamera.pos.z=acs->pos2.z;
targetpos.x=acs->pos1.x;
targetpos.y=acs->pos1.y;
targetpos.z=acs->pos1.z;
}
else
{
conversationcamera.pos.x=acs->pos1.x;
conversationcamera.pos.y=acs->pos1.y;
conversationcamera.pos.z=acs->pos1.z;
targetpos.x=acs->pos2.x;
targetpos.y=acs->pos2.y;
targetpos.z=acs->pos2.z;
}
distance=(acs->startpos*itime+acs->endpos*rtime)*DIV100;
EERIE_3D vect,vect3;
vect.x=conversationcamera.pos.x-targetpos.x;
vect.y=conversationcamera.pos.y-targetpos.y;
vect.z=conversationcamera.pos.z-targetpos.z;
EERIE_3D vect2;
Vector_RotateY(&vect2,&vect,90);
TRUEVector_Normalize(&vect2);
Vector_Copy(&vect3,&vect);
TRUEVector_Normalize(&vect3);
vect.x=vect.x*(distance)+vect3.x*80.f;
vect.y=vect.y*(distance)+vect3.y*80.f;
vect.z=vect.z*(distance)+vect3.z*80.f;
vect2.x*=45.f;
vect2.y*=45.f;
vect2.z*=45.f;
if ((acs->type==ARX_CINE_SPEECH_CCCLISTENER_R)
|| (acs->type==ARX_CINE_SPEECH_CCCTALKER_R))
{
vect2.x=-vect2.x;
vect2.y=-vect2.y;
vect2.z=-vect2.z;
}
conversationcamera.pos.x=vect.x+targetpos.x+vect2.x;
conversationcamera.pos.y=vect.y+targetpos.y+vect2.y;
conversationcamera.pos.z=vect.z+targetpos.z+vect2.z;
SetTargetCamera(&conversationcamera,targetpos.x,targetpos.y,targetpos.z);
subj.pos.x=conversationcamera.pos.x;
subj.pos.y=conversationcamera.pos.y;
subj.pos.z=conversationcamera.pos.z;
subj.angle.a=MAKEANGLE(-conversationcamera.angle.a);
subj.angle.b=MAKEANGLE(conversationcamera.angle.b-180.f);
subj.angle.g=0.f;
EXTERNALVIEW=1;
}
break;
}
LASTCAMPOS.x=subj.pos.x;
LASTCAMPOS.y=subj.pos.y;
LASTCAMPOS.z=subj.pos.z;
LASTCAMANGLE.a=subj.angle.a;
LASTCAMANGLE.b=subj.angle.b;
LASTCAMANGLE.g=subj.angle.g;
}
}
}
if (player.life<=0)
{
DeadTime += ARX_CLEAN_WARN_CAST_LONG(FrameDiff);
float mdist = EEfabs(player.physics.cyl.height)-60;
DeadCameraDistance+=(float)FrameDiff*DIV80*((mdist-DeadCameraDistance)/mdist)*2.f;
if (DeadCameraDistance>mdist) DeadCameraDistance=mdist;
EERIE_3D targetpos;
targetpos.x = player.pos.x;
targetpos.y = player.pos.y;
targetpos.z = player.pos.z;
long id = inter.iobj[0]->obj->fastaccess.view_attach;
long id2 = GetActionPointIdx( inter.iobj[0]->obj, "Chest2Leggings" );
if (id!=-1)
{
targetpos.x = inter.iobj[0]->obj->vertexlist3[id].v.x;
targetpos.y = inter.iobj[0]->obj->vertexlist3[id].v.y;
targetpos.z = inter.iobj[0]->obj->vertexlist3[id].v.z;
}
conversationcamera.pos.x = targetpos.x;
conversationcamera.pos.y = targetpos.y - DeadCameraDistance;
conversationcamera.pos.z = targetpos.z;
if (id2!=-1)
{
conversationcamera.pos.x=inter.iobj[0]->obj->vertexlist3[id2].v.x;
conversationcamera.pos.y=inter.iobj[0]->obj->vertexlist3[id2].v.y-DeadCameraDistance;
conversationcamera.pos.z=inter.iobj[0]->obj->vertexlist3[id2].v.z;
}
SetTargetCamera(&conversationcamera,targetpos.x,targetpos.y,targetpos.z);
subj.pos.x=conversationcamera.pos.x;
subj.pos.y=conversationcamera.pos.y;
subj.pos.z=conversationcamera.pos.z;
subj.angle.a=MAKEANGLE(-conversationcamera.angle.a);
subj.angle.b=MAKEANGLE(conversationcamera.angle.b-180.f);
subj.angle.g = 0;
EXTERNALVIEW=1;
if (!GAME_EDITOR)
BLOCK_PLAYER_CONTROLS=1;
}
else
{
DeadCameraDistance=0;
}
/////////////////////////////////////
LAST_CONVERSATION=ARX_CONVERSATION;
if ((this->kbd.inkey[INKEY_SPACE]) && (CAMERACONTROLLER!=NULL))
{
CAMERACONTROLLER=NULL;
this->kbd.inkey[INKEY_SPACE]=0;
}
if (CAMERACONTROLLER!=NULL)
{
if (lastCAMERACONTROLLER!=CAMERACONTROLLER)
{
currentbeta=CAMERACONTROLLER->angle.b;
}
EERIE_3D targetpos;
targetpos.x=CAMERACONTROLLER->pos.x;
targetpos.y=CAMERACONTROLLER->pos.y+PLAYER_BASE_HEIGHT;
targetpos.z=CAMERACONTROLLER->pos.z;
float delta_angle = AngleDifference(currentbeta, CAMERACONTROLLER->angle.b);
float delta_angle_t = delta_angle * FrameDiff * DIV1000;
if (EEfabs(delta_angle_t) > EEfabs(delta_angle)) delta_angle_t = delta_angle;
currentbeta += delta_angle_t;
float t=DEG2RAD(MAKEANGLE(currentbeta));
conversationcamera.pos.x=targetpos.x+(float)EEsin(t)*160.f;
conversationcamera.pos.y=targetpos.y+40.f;
conversationcamera.pos.z=targetpos.z-(float)EEcos(t)*160.f;
SetTargetCamera(&conversationcamera,targetpos.x,targetpos.y,targetpos.z);
subj.pos.x=conversationcamera.pos.x;
subj.pos.y=conversationcamera.pos.y;
subj.pos.z=conversationcamera.pos.z;
subj.angle.a=MAKEANGLE(-conversationcamera.angle.a);
subj.angle.b=MAKEANGLE(conversationcamera.angle.b-180.f);
subj.angle.g=0.f;
EXTERNALVIEW=1;
}
lastCAMERACONTROLLER=CAMERACONTROLLER;
if ((USE_CINEMATICS_CAMERA) && (USE_CINEMATICS_PATH.path!=NULL))
{
EERIE_3D pos,pos2;
USE_CINEMATICS_PATH._curtime = ARX_TIME_Get();
USE_CINEMATICS_PATH._curtime+=50;
long pouet2=ARX_PATHS_Interpolate(&USE_CINEMATICS_PATH,&pos);
USE_CINEMATICS_PATH._curtime-=50;
long pouet=ARX_PATHS_Interpolate(&USE_CINEMATICS_PATH,&pos2);
if ((pouet!=-1) && (pouet2!=-1))
{
if (USE_CINEMATICS_CAMERA==2)
{
subj.pos.x=pos.x;
subj.pos.y=pos.y;
subj.pos.z=pos.z;
subj.d_angle.a=subj.angle.a;
subj.d_angle.b=subj.angle.b;
subj.d_angle.g=subj.angle.g;
pos2.x=(pos2.x+pos.x)*DIV2;
pos2.y=(pos2.y+pos.y)*DIV2;
pos2.z=(pos2.z+pos.z)*DIV2;
SetTargetCamera(&subj,pos2.x,pos2.y,pos2.z);
}
else DebugSphere(pos.x,pos.y,pos.z,2,50,0xFFFF0000);
if (USE_CINEMATICS_PATH.path->flags & ARX_USEPATH_FLAG_FINISHED)
{
USE_CINEMATICS_CAMERA=0;
USE_CINEMATICS_PATH.path=NULL;
}
}
else
{
USE_CINEMATICS_CAMERA=0;
USE_CINEMATICS_PATH.path=NULL;
}
}
UpdateCameras();
///////////////////////////////////////////
ARX_PLAYER_FrameCheck(Original_framedelay);
if (MasterCamera.exist)
{
if (MasterCamera.exist & 2)
{
MasterCamera.exist&=~2;
MasterCamera.exist|=1;
MasterCamera.io=MasterCamera.want_io;
MasterCamera.aup=MasterCamera.want_aup;
MasterCamera.cam=MasterCamera.want_cam;
}
if (MasterCamera.cam->focal<100.f) MasterCamera.cam->focal=350.f;
SetActiveCamera(MasterCamera.cam);
EXTERNALVIEW=1;
}
else
{
// Set active camera for this viewport
SetActiveCamera(&subj);
}
ARX_GLOBALMODS_Apply();
if (EDITMODE) GDevice->SetRenderState( D3DRENDERSTATE_FOGENABLE, false );
ManageQuakeFX();
// Prepare ActiveCamera
PrepareCamera(ACTIVECAM);
// Recenter Viewport depending on Resolution
// setting long from long
ACTIVECAM->centerx = DANAECENTERX;
ACTIVECAM->centery = DANAECENTERY;
// casting long to float
ACTIVECAM->posleft = ACTIVECAM->transform.xmod = ARX_CLEAN_WARN_CAST_FLOAT( DANAECENTERX );
ACTIVECAM->postop = ACTIVECAM->transform.ymod = ARX_CLEAN_WARN_CAST_FLOAT( DANAECENTERY );
// Set Listener Position
EERIE_3D front, up;
float t;
t=DEG2RAD(MAKEANGLE(ACTIVECAM->angle.b));
front.x=-EEsin(t);
front.y=0.f;
front.z=EEcos(t);
TRUEVector_Normalize(&front);
up.x=0.f;
up.y=1.f;
up.z=0.f;
ARX_SOUND_SetListener(&ACTIVECAM->pos, &front, &up);
// Reset Transparent Polys Idx
INTERTRANSPOLYSPOS=TRANSPOLYSPOS=0;
// Check For Hiding/unHiding Player Gore
if ((EXTERNALVIEW) || (player.life<=0))
{
ARX_INTERACTIVE_Show_Hide_1st(inter.iobj[0],0);
}
if (!EXTERNALVIEW)
{
ARX_INTERACTIVE_Show_Hide_1st(inter.iobj[0],1);
}
LASTEXTERNALVIEW=EXTERNALVIEW;
// NOW DRAW the player (Really...)
if ( (inter.iobj[0])
&& (inter.iobj[0]->animlayer[0].cur_anim) )
{
float restore=ACTIVECAM->use_focal;
if ((!EXTERNALVIEW) && (!BOW_FOCAL))
{
ACTIVECAM->use_focal=PLAYER_ARMS_FOCAL*Xratio;
}
SetFilteringMode(m_pd3dDevice,Bilinear);
if ((!EXTERNALVIEW) && GLOBAL_FORCE_PLAYER_IN_FRONT)
FORCE_FRONT_DRAW=1;
if (inter.iobj[0]->invisibility>0.9f) inter.iobj[0]->invisibility=0.9f;
EERIEDrawAnimQuat( m_pd3dDevice, inter.iobj[0]->obj,
&inter.iobj[0]->animlayer[0],
&inter.iobj[0]->angle,&inter.iobj[0]->pos, 0,inter.iobj[0],0,8);
ACTIVECAM->use_focal=restore;
FORCE_FRONT_DRAW=0;
}
// SUBJECTIVE VIEW UPDATE START *********************************************************
SetFilteringMode(m_pd3dDevice,Bilinear);
SETZWRITE(m_pd3dDevice, TRUE );
danaeApp.EnableZBuffer();
if (FirstFrame==0)
{
StartBench();
PrepareIOTreatZone();
ARX_PHYSICS_Apply();
if (FRAME_COUNT<=0)
PrecalcIOLighting(&ACTIVECAM->pos, ACTIVECAM->cdepth * 0.6f);
ACTIVECAM->fadecolor.r=current.depthcolor.r;
ACTIVECAM->fadecolor.g=current.depthcolor.g;
ACTIVECAM->fadecolor.b=current.depthcolor.b;
if (uw_mode)
{
float val=10.f;
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_MIPMAPLODBIAS, *((LPDWORD) (&val)) );
ARX_SCENE_Render(m_pd3dDevice,1);
val=-0.3f;
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_MIPMAPLODBIAS, *((LPDWORD) (&val)) );
}
else
{
ARX_SCENE_Render(m_pd3dDevice,1);
}
BENCH_RENDER=EndBench();
}
if (EDITION==EDITION_PATHWAYS)
{
ARX_PATHS_RedrawAll(m_pd3dDevice);
}
// Begin Particles ***************************************************************************
if (!(Project.hide & HIDE_PARTICLES))
{
StartBench();
if (pParticleManager)
{
pParticleManager->Update(ARX_CLEAN_WARN_CAST_LONG(FrameDiff));
pParticleManager->Render(m_pd3dDevice);
}
m_pd3dDevice->SetRenderState( D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE );
m_pd3dDevice->SetRenderState( D3DRENDERSTATE_DESTBLEND, D3DBLEND_ONE );
SETZWRITE(m_pd3dDevice, FALSE );
SETALPHABLEND(m_pd3dDevice,TRUE);
ARX_FOGS_Render(0);
bool bNoVB = false;
if( bSoftRender )
{
bNoVB = GET_FORCE_NO_VB();
SET_FORCE_NO_VB( true );
}
ARX_PARTICLES_Render(m_pd3dDevice,&subj);
UpdateObjFx(m_pd3dDevice,&subj);
if( bSoftRender ) SET_FORCE_NO_VB( bNoVB );
SETALPHABLEND(m_pd3dDevice,FALSE);
BENCH_PARTICLES=EndBench();
}
// End Particles ***************************************************************************
if (!EDITMODE) // Playing Game
{
// Checks Magic Flares Drawing
if (!PLAYER_PARALYSED)
{
if (EERIEMouseButton & 1)
{
if ((ARX_FLARES_Block==0) && (CurrSlotBASE_FOCAL+FOKMOD) subj.focal=BASE_FOCAL+FOKMOD;
}
else if (subj.focal>BASE_FOCAL+FOKMOD) subj.focal=BASE_FOCAL+FOKMOD;
}
if (eyeball.exist!=0)
{
DrawMagicSightInterface(danaeApp.m_pd3dDevice);
}
if (PLAYER_PARALYSED)
{
SETZWRITE(m_pd3dDevice, FALSE );
SETALPHABLEND(m_pd3dDevice,TRUE);
m_pd3dDevice->SetRenderState( D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE);
m_pd3dDevice->SetRenderState( D3DRENDERSTATE_DESTBLEND, D3DBLEND_ONE);
EERIEDrawBitmap(m_pd3dDevice,0.f,0.f,(float)DANAESIZX,(float)DANAESIZY,0.0001f,
NULL,EERIERGB(0.2f,0.2f,1.f));
SETALPHABLEND(m_pd3dDevice,FALSE);
SETZWRITE(m_pd3dDevice, TRUE );
}
if (FADEDIR)
{
ManageFade(danaeApp.m_pd3dDevice);
}
SETALPHABLEND(danaeApp.m_pd3dDevice,FALSE);
SETZWRITE(danaeApp.m_pd3dDevice, TRUE );
// Reset Last Key
danaeApp.kbd.lastkey=-1;
// Red screen fade for damages.
ARX_DAMAGE_Show_Hit_Blood(GDevice);
// Manage Notes/Books opened on screen
GDevice->SetRenderState( D3DRENDERSTATE_FOGENABLE, false);
ARX_INTERFACE_NoteManage();
finish:; //----------------------------------------------------------------
// Update spells
ARX_SPELLS_Update(m_pd3dDevice);
SETCULL(GDevice,D3DCULL_NONE);
GDevice->SetRenderState( D3DRENDERSTATE_FOGENABLE, true);
// Manage Death visual & Launch menu...
if (DeadTime>2000)
ARX_PLAYER_Manage_Death();
//-------------------------------------------------------------------------
// INTERFACE
// Remove the Alphablend State if needed : NO Z Clear
SETALPHABLEND(m_pd3dDevice,FALSE);
GDevice->SetRenderState(D3DRENDERSTATE_FOGENABLE, false);
// Draw game interface if needed
if (ARXmenu.currentmode == AMCM_OFF)
if (!(Project.hide & HIDE_INTERFACE) && !CINEMASCOPE)
{
SETTEXTUREWRAPMODE(GDevice,D3DTADDRESS_CLAMP);
DrawAllInterface();
DrawAllInterfaceFinish();
if ( (player.Interface & INTER_MAP )
&& (!(player.Interface & INTER_COMBATMODE))
&& flarenum
)
{
GDevice->SetRenderState( D3DRENDERSTATE_ZENABLE, false);
ARX_MAGICAL_FLARES_Draw(m_pd3dDevice,FRAMETICKS);
EnableZBuffer();
FRAMETICKS = ARXTimeUL();
}
}
SETTEXTUREWRAPMODE(GDevice,D3DTADDRESS_WRAP);
if(bRenderInterList)
{
SETALPHABLEND(GDevice,FALSE);
PopAllTriangleList(true);
SETALPHABLEND(GDevice,TRUE);
PopAllTriangleListTransparency();
SETALPHABLEND(GDevice,FALSE);
}
GDevice->SetRenderState(D3DRENDERSTATE_FOGENABLE, true);
this->GoFor2DFX();
GDevice->SetRenderState(D3DRENDERSTATE_FOGENABLE, false);
m_pd3dDevice->Clear( 0, NULL, D3DCLEAR_ZBUFFER,0, 1.0f, 0L );
// Speech Management
if (!EDITMODE)
{
StartBench();
ARX_SPEECH_Check(danaeApp.m_pd3dDevice);
ARX_SPEECH_Update(danaeApp.m_pd3dDevice);
BENCH_SPEECH=EndBench();
}
SETTEXTUREWRAPMODE(m_pd3dDevice,D3DTADDRESS_WRAP);
if(pTextManage && pTextManage->vText.size())
{
danaeApp.DANAEEndRender();
pTextManage->Update(FrameDiff);
pTextManage->Render();
danaeApp.DANAEStartRender();
}
if (SHOW_INGAME_MINIMAP && ((PLAY_LOADED_CINEMATIC == 0) && (!CINEMASCOPE) && (!BLOCK_PLAYER_CONTROLS) && (ARXmenu.currentmode == AMCM_OFF))
&& (!(player.Interface & INTER_MAP ) ))
{
long SHOWLEVEL = ARX_LEVELS_GetRealNum(CURRENTLEVEL);
if ((SHOWLEVEL>=0) && (SHOWLEVEL<32))
ARX_MINIMAP_Show(GDevice,SHOWLEVEL,1,1);
}
//-------------------------------------------------------------------------
// CURSOR Rendering
SETALPHABLEND(GDevice, false);
if (DRAGINTER)
{
ARX_INTERFACE_RenderCursor();
if(bRenderInterList)
{
SETALPHABLEND(GDevice,FALSE);
PopAllTriangleList(true);
SETALPHABLEND(GDevice,TRUE);
PopAllTriangleListTransparency();
SETALPHABLEND(GDevice,FALSE);
}
ARX_INTERFACE_HALO_Flush(m_pd3dDevice);
}
else
{
ARX_INTERFACE_HALO_Flush(m_pd3dDevice);
ARX_INTERFACE_RenderCursor();
}
GDevice->SetRenderState( D3DRENDERSTATE_FOGENABLE, true);
//----------------RENDEREND------------------------------------------------
renderend:
;
if (sp_max_start)
Manage_sp_max();
// Some Visual Debug/Info Text
CalcFPS();
if (!FINAL_COMMERCIAL_DEMO)
{
if ((NEED_TEST_TEXT) && (!FINAL_COMMERCIAL_DEMO))
{
danaeApp.DANAEEndRender();
ShowTestText();
danaeApp.DANAEStartRender();
}
if (!NO_TEXT_AT_ALL)
{
if (ViewMode & VIEWMODE_INFOTEXT)
{
ShowInfoText(0);
}
else if ((FORCE_SHOW_FPS) || CYRIL_VERSION)
{
ShowFPS();
}
}
if ((USE_PORTALS) && (NEED_TEST_TEXT) && (!FOR_EXTERNAL_PEOPLE))
{
char tex[250];
switch(USE_PORTALS)
{
case 1:
sprintf(tex,"2DPortals_ROOM: %d",LAST_ROOM);
break;
case 2:
sprintf(tex,"3DPortals_ROOM: %d - Vis %d",LAST_ROOM,LAST_PORTALS_COUNT);
break;
case 3:
sprintf(tex,"3DPortals_ROOM(Transform): %d - Vis %d",LAST_ROOM,LAST_PORTALS_COUNT);
break;
case 4:
sprintf(tex,"3DPortals_ROOM(TransformSC): %d - Vis %d",LAST_ROOM,LAST_PORTALS_COUNT);
break;
}
danaeApp.OutputText( 320, 240, tex );
if (bRenderInterList)
{
danaeApp.OutputText( 320, 257, "Seb" );
}
if(bGMergeVertex)
{
danaeApp.OutputText( 0, 284, "Portal MergeVertex" );
}
else
{
danaeApp.OutputText( 0, 284, "Portal Non MergeVertex" );
}
}
if((NEED_TEST_TEXT) && (!FOR_EXTERNAL_PEOPLE))
{
if(bOLD_CLIPP)
{
danaeApp.OutputText(0, 240, "New Clipp" );
}
else
{
danaeApp.OutputText(0,274,"New Clipp");
}
}
}
//----------------------------------------------------------------------------
// Begin 2D Pass for Lense Flares
if ((PLAY_LOADED_CINEMATIC == 0) && (!CINEMASCOPE) && (!BLOCK_PLAYER_CONTROLS) && (ARXmenu.currentmode == AMCM_OFF))
{
if (ARX_IMPULSE_NowPressed(CONTROLS_CUST_QUICKLOAD) && !WILL_QUICKLOAD)
{
WILL_QUICKLOAD=1;
}
if (ARX_IMPULSE_NowPressed(CONTROLS_CUST_QUICKSAVE) && !WILL_QUICKSAVE)
{
iTimeToDrawD7=2000;
WILL_QUICKSAVE=1;
}
ARX_DrawAfterQuickLoad();
}
danaeApp.DANAEEndRender();
//--------------NORENDEREND---------------------------------------------------
norenderend:
;
if(pGetInfoDirectInput->IsVirtualKeyPressedNowPressed(DIK_F10))
{
GetSnapShot();
}
if ((LaunchDemo) && (FirstFrame == 0))
{
NOCHECKSUM=1;
LaunchDemo=0;
LaunchDummyParticle();
}
}
StartBench();
if (ARXmenu.currentmode == AMCM_OFF)
{
ARX_SCRIPT_AllowInterScriptExec();
ARX_SCRIPT_EventStackExecute();
// Updates Damages Spheres
ARX_DAMAGES_UpdateAll();
ARX_MISSILES_Update();
if (FirstFrame==0)
ARX_PATH_UpdateAllZoneInOutInside();
}
BENCH_SCRIPT=EndBench();
LastFrameTime=FrameTime;
LastMouseClick=EERIEMouseButton;
if (DEBUGCODE) ForceSendConsole("RenderEnd_____________________________", 1, 0, (HWND)1);
DANAE_DEBUGGER_Update();
if (NEED_BENCH)
{
if(danaeApp.DANAEStartRender())
{
SETZWRITE(m_pd3dDevice, TRUE );
SETALPHABLEND(m_pd3dDevice,FALSE);
iVPOS=0;
ShowValue(&oBENCH_STARTUP,&BENCH_STARTUP,"Startup");
ShowValue(&oBENCH_PLAYER,&BENCH_PLAYER,"Player");
ShowValue(&oBENCH_RENDER,&BENCH_RENDER,"Render");
ShowValue(&oBENCH_PARTICLES,&BENCH_PARTICLES,"Particles");
ShowValue(&oBENCH_SPEECH,&BENCH_SPEECH,"Speech");
ShowValue(&oBENCH_SCRIPT,&BENCH_SCRIPT,"Script");
ShowValue(&oBENCH_PATHFINDER,&BENCH_PATHFINDER,"Pathfinder");
BENCH_PATHFINDER=0;
ShowValue(&oBENCH_SOUND,&BENCH_SOUND,"Sound Thread");
BENCH_SOUND=0;
danaeApp.DANAEEndRender();
}
}
return S_OK;
}
INTERACTIVE_OBJ * GetFirstInterAtPos(EERIE_S2D * pos,long flag=0, EERIE_3D* _pRef=NULL, INTERACTIVE_OBJ** _pTable = NULL, int* _pnNbInTable=NULL );
void DANAE::GoFor2DFX()
{
D3DTLVERTEX lv,ltvv;
GDevice=danaeApp.m_pd3dDevice;
long needed = 0;
for (long i=0;iextras & EXTRAS_FLARE)
{
if ((EEDistance3D(&ACTIVECAM->pos, &el->pos) < 2200))
{
needed=1;
break;
}
}
}
if (!needed) return;
{
INTERACTIVE_OBJ* pTableIO[256];
int nNbInTableIO = 0;
LAST_LOCK_SUCCESSFULL=1;
float temp_increase=_framedelay*DIV1000*4.f;
DURING_LOCK=1;
{
bool bComputeIO = false;
for (int i=0;ipos.x*ACTIVEBKG->Xmul);
long lPosz=(long)(float)(el->pos.z*ACTIVEBKG->Zmul);
if( (lPosx<0)||
(lPosx>=ACTIVEBKG->Xsize)||
(lPosz<0)||
(lPosz>=ACTIVEBKG->Zsize)||
(!ACTIVEBKG->fastdata[lPosx][lPosz].treat) )
{
el->treat=0;
continue;
}
if (el->extras & EXTRAS_FLARE)
{
lv.sx=el->pos.x;
lv.sy=el->pos.y;
lv.sz=el->pos.z;
specialEE_RTP(&lv,<vv);
el->temp-=temp_increase;
if (!(player.Interface & INTER_COMBATMODE)
&& (player.Interface & INTER_MAP))
continue;
LAST_ZVAL=ltvv.sz;
if ((ltvv.rhw > 0.f) &&
(ltvv.sx>0.f) &&
(ltvv.sy>(CINEMA_DECAL*Yratio)) &&
(ltvv.sxpos.x;
vector.y=lv.sy-ACTIVECAM->pos.y;
vector.z=lv.sz-ACTIVECAM->pos.z;
float fNorm = 50.f / sqrt(vector.x * vector.x + vector.y * vector.y + vector.z * vector.z);
vector.x*=fNorm;
vector.y*=fNorm;
vector.z*=fNorm;
D3DTLVERTEX ltvv2;
lv.sx-=vector.x;
lv.sy-=vector.y;
lv.sz-=vector.z;
specialEE_RTP(&lv,<vv2);
float fZFire=ltvv2.sz*(float)danaeApp.zbuffer_max;
float fZFar=ProjectionMatrix._33*(1.f/(ACTIVECAM->cdepth*fZFogEnd))+ProjectionMatrix._43;
EERIE_3D hit;
EERIEPOLY *tp=NULL;
EERIE_S2D ees2dlv;
EERIE_3D ee3dlv;
ee3dlv.x = lv.sx;
ee3dlv.y = lv.sy;
ee3dlv.z = lv.sz;
ARX_CHECK_SHORT(ltvv.sx) ;
ARX_CHECK_SHORT(ltvv.sy) ;
ees2dlv.x = ARX_CLEAN_WARN_CAST_SHORT(ltvv.sx) ;
ees2dlv.y = ARX_CLEAN_WARN_CAST_SHORT(ltvv.sy) ;
if( !bComputeIO )
{
GetFirstInterAtPos( &ees2dlv, 2, &ee3dlv, pTableIO, &nNbInTableIO );
bComputeIO = true;
}
if(
(ltvv.sz>fZFar)||
EERIELaunchRay3(&ACTIVECAM->pos,&ee3dlv,&hit,tp,1)||
GetFirstInterAtPos(&ees2dlv, 3, &ee3dlv, pTableIO, &nNbInTableIO )
)
{
el->temp-=temp_increase*2.f;
}
else
{
el->temp+=temp_increase*2.f;
}
LAST_ZVAL = fZFire;
ARX_CHECK_LONG( danaeApp.zbuffer_max );
LAST_FVAL = ARX_CLEAN_WARN_CAST_LONG( danaeApp.zbuffer_max );
}
if (el->temp<0.f) el->temp=0.f;
else if (el->temp>.8f) el->temp=.8f;
}
}
}
DURING_LOCK = 0;
// End 2D Pass ***************************************************************************
{
GDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE);
GDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ONE);
SETALPHABLEND(GDevice,TRUE);
SETZWRITE(GDevice, FALSE );
SETCULL(GDevice,D3DCULL_NONE);
GDevice->SetRenderState( D3DRENDERSTATE_ZENABLE, FALSE);
GDevice->SetRenderState(D3DRENDERSTATE_FOGCOLOR, 0);
for (int i=0;iexist) || (!el->treat)) continue;
if (el->extras & EXTRAS_FLARE)
{
if (el->temp>0.f)
{
lv.sx=el->pos.x;
lv.sy=el->pos.y;
lv.sz=el->pos.z;
lv.rhw=1.f;
specialEE_RT((D3DTLVERTEX *)&lv,(EERIE_3D *)<vv);
float v=el->temp;
if (FADEDIR)
{
v*=1.f-LAST_FADEVALUE;
}
float siz;
if (el->extras & EXTRAS_FIXFLARESIZE)
siz=el->ex_flaresize;
else
siz=-el->ex_flaresize;
EERIEDrawSprite(GDevice,&lv, siz ,tflare,EERIERGB(v*el->rgb.r,v*el->rgb.g,v*el->rgb.b),ltvv.sz);
}
}
}
GDevice->SetRenderState( D3DRENDERSTATE_ZENABLE, TRUE);
}
}
SETZWRITE(GDevice, TRUE );
}
void ShowTestText()
{
char tex[256];
if (FINAL_COMMERCIAL_GAME)
sprintf(tex,"Version : Final 1.00 - Build n%02.3f",DANAE_VERSION);
else
sprintf(tex,"Version : Demo 1.01 - Build n%02.3f",DANAE_VERSION);
danaeApp.OutputText( 0, 16, tex );
sprintf(tex,"Level : %s",LastLoadedScene);
danaeApp.OutputText( 0, 32, tex );
sprintf(tex,"Position : %5.0f %5.0f %5.0f",player.pos.x,player.pos.y,player.pos.z);
danaeApp.OutputText( 0, 48, tex );
sprintf(tex,"Last Failed Sequence : %s",LAST_FAILED_SEQUENCE);
danaeApp.OutputText( 0, 64, tex );
}
extern float CURRENT_PLAYER_COLOR;
extern int TSU_TEST_COLLISIONS;
extern long TSU_TEST;
long TSU_TEST_NB = 0;
long TSU_TEST_NB_LIGHT = 0;
void ShowInfoText(long COR)
{
unsigned long uGAT = ARXTimeUL() / 1000;
long GAT=(long)uGAT;
char tex[256];
float fpss2=1000.f/_framedelay;
LASTfpscount++;
float fps2v=__max(fpss2,LASTfps2);
float fps2vmin=__min(fpss2,LASTfps2);
if (LASTfpscount>49)
{
LASTfps2=0;
LASTfpscount=0;
fps2=fps2v;
fps2min=fps2vmin;
}
else
{
LASTfps2=fpss2;
}
sprintf(tex, "%d Prims %4.02f fps ( %3.02f - %3.02f ) [%3.0fms] INTER:%d/%d MIPMESH %d [%3.06f", EERIEDrawnPolys, FPS, fps2min, fps2, _framedelay, INTER_DRAW, INTER_COMPUTE, 0, vdist);
danaeApp.OutputText( 70, 32, tex );
float poss=-666.66f;
EERIEPOLY * ep=CheckInPolyPrecis(player.pos.x,player.pos.y,player.pos.z);
float tempo=0.f;
if ((ep) && (GetTruePolyY(ep,&player.pos,&tempo)))
poss=tempo;
sprintf(tex,"Position x:%7.0f y:%7.0f [%7.0f] z:%6.0f a%3.0f b%3.0f FOK %3.0f",player.pos.x,player.pos.y+player.size.y,poss,player.pos.z,player.angle.a,player.angle.b,ACTIVECAM->focal);
danaeApp.OutputText( 70, 48, tex );
sprintf(tex,"AnchorPos x:%6.0f y:%6.0f z:%6.0f TIME %ds Part %d - %d Lkey %d SSM %d",player.pos.x-Mscenepos.x,player.pos.y+player.size.y-Mscenepos.y,player.pos.z-Mscenepos.z
,GAT,ParticleCount,player.doingmagic,danaeApp.kbd.lastkey,SnapShotMode);
danaeApp.OutputText( 70, 64, tex );
if (player.onfirmground==0) danaeApp.OutputText( 200, 280, "OFFGRND" );
sprintf(tex,"Jump %f cinema %f %d %d - Pathfind %d(%s)",player.jumplastposition,CINEMA_DECAL,DANAEMouse.x,DANAEMouse.y,EERIE_PATHFINDER_Get_Queued_Number(), PATHFINDER_WORKING ? "Working" : "Idled");
danaeApp.OutputText( 70, 80, tex );
INTERACTIVE_OBJ * io=ARX_SCRIPT_Get_IO_Max_Events();
char temp[256];
if (io==NULL)
sprintf(tex,"Events %d (IOmax N/A) Timers %d",Event_Total_Count,ARX_SCRIPT_CountTimers());
else
{
strcpy(temp,GetName(io->filename));
sprintf(tex,"Events %d (IOmax %s_%04d %d) Timers %d",Event_Total_Count,temp,io->ident,io->stat_count,ARX_SCRIPT_CountTimers());
}
danaeApp.OutputText( 70, 94, tex );
io=ARX_SCRIPT_Get_IO_Max_Events_Sent();
if (io!=NULL)
{
strcpy(temp,GetName(io->filename));
sprintf(tex,"Max SENDER %s_%04d %d)",temp,io->ident,io->stat_sent);
danaeApp.OutputText( 70, 114, tex );
}
float slope=0.f;
ep=CheckInPoly(player.pos.x,player.pos.y-10.f,player.pos.z);
if (ep)
{
slope=ep->norm.y;
}
sprintf(tex,"Velocity %3.0f %3.0f %3.0f Slope %3.3f",player.physics.velocity.x,player.physics.velocity.y,player.physics.velocity.z,slope);
danaeApp.OutputText( 70, 128, tex );
sprintf(tex, "TSU_TEST %d - nblights %d - nb %d", TSU_TEST, TSU_TEST_NB_LIGHT, TSU_TEST_NB);
danaeApp.OutputText( 100, 208, tex );
TSU_TEST_NB = 0;
TSU_TEST_NB_LIGHT = 0;
long pos=DXI_GetKeyIDPressed(DXI_KEYBOARD1);
sprintf(tex,"%d",pos);
danaeApp.OutputText( 70, 99, tex );
int jx,jy,jz;
if (ARX_INPUT_GetSCIDAxis(&jx,&jy,&jz))
{
sprintf(tex,"%d %d %d",jx,jy,jz);
danaeApp.OutputText( 70, 299, tex );
}
if ((!EDITMODE) && (ValidIONum(LastSelectedIONum)))
{
io = inter.iobj[LastSelectedIONum];
if (io)
{
if (io==inter.iobj[0])
{
sprintf(tex,"%4.0f %4.0f %4.0f - %4.0f %4.0f %4.0f -- %3.0f %d/%d targ %d beh %d",io->pos.x,
io->pos.y,io->pos.z,io->move.x,
io->move.y,io->move.z,io->_npcdata->moveproblem,io->_npcdata->pathfind.listpos,io->_npcdata->pathfind.listnb,
io->_npcdata->pathfind.truetarget,io->_npcdata->behavior);
danaeApp.OutputText( 170, 420, tex );
sprintf(tex,"Life %4.0f/%4.0f Mana %4.0f/%4.0f Poisoned %3.1f Hunger %4.1f",player.life,player.maxlife,
player.mana,player.maxmana,player.poison,player.hunger);
danaeApp.OutputText( 170, 320, tex );
}
else
{
if (io->ioflags & IO_NPC)
{
sprintf(tex,"%4.0f %4.0f %4.0f - %4.0f %4.0f %4.0f -- %3.0f %d/%d targ %d beh %d",io->pos.x,
io->pos.y,io->pos.z,io->move.x,
io->move.y,io->move.z,io->_npcdata->moveproblem,io->_npcdata->pathfind.listpos,io->_npcdata->pathfind.listnb,
io->_npcdata->pathfind.truetarget,io->_npcdata->behavior);
danaeApp.OutputText( 170, 420, tex );
sprintf(tex,"Life %4.0f/%4.0f Mana %4.0f/%4.0f Poisoned %3.1f",io->_npcdata->life,io->_npcdata->maxlife,
io->_npcdata->mana,io->_npcdata->maxmana,io->_npcdata->poisonned);
danaeApp.OutputText( 170, 320, tex );
sprintf(tex,"AC %3.0f Absorb %3.0f",ARX_INTERACTIVE_GetArmorClass(io),io->_npcdata->absorb);
danaeApp.OutputText( 170, 335, tex );
if (io->_npcdata->pathfind.flags & PATHFIND_ALWAYS)
danaeApp.OutputText( 170, 360, "PF_ALWAYS" );
else
{
sprintf(tex,"PF_%d",io->_npcdata->pathfind.flags);
danaeApp.OutputText( 170, 360, tex);
}
}
if (io->ioflags & IO_FIX)
{
sprintf(tex,"Durability %4.0f/%4.0f Poisonous %3d count %d",io->durability,io->max_durability,io->poisonous,io->poisonous_count);
danaeApp.OutputText( 170, 320, tex );
}
if (io->ioflags & IO_ITEM)
{
sprintf(tex,"Durability %4.0f/%4.0f Poisonous %3d count %d",io->durability,io->max_durability,io->poisonous,io->poisonous_count);
danaeApp.OutputText( 170, 320, tex );
}
}
}
}
long zap=IsAnyPolyThere(player.pos.x,player.pos.z);
sprintf(tex,"POLY %d LASTLOCK %d",zap,LAST_LOCK_SUCCESSFULL);
danaeApp.OutputText( 270, 220, tex );
sprintf(tex,"COLOR %3.0f Stealth %3.0f",CURRENT_PLAYER_COLOR,GetPlayerStealth());
danaeApp.OutputText( 270, 200, tex );
ARX_SCRIPT_Init_Event_Stats();
}
//-----------------------------------------------------------------------------
extern long POLYIN;
extern long NOT_MOVED_AT_ALL;
extern long LAST_LLIGHT_COUNT;
extern long MCache_Number;
extern long MCache_GetSize();
extern float PLAYER_CLIMB_THRESHOLD, player_climb;
extern float TOTAL_CHRONO;
float LAST_FZPOS;
float LAST_FZSCREEN;
//-----------------------------------------------------------------------------
void ShowFPS()
{
char tex[256];
float fpss2=1000.f/_framedelay;
LASTfpscount++;
float fps2v=__max(fpss2,LASTfps2);
float fps2vmin=__min(fpss2,LASTfps2);
if (LASTfpscount>49)
{
LASTfps2=0;
LASTfpscount=0;
fps2=fps2v;
fps2min=fps2vmin;
}
else
{
LASTfps2=fpss2;
}
sprintf(tex,"%d Prims %4.02f fps ( %3.02f - %3.02f ) [%3.0fms] INTER:%d/%d INTREAT:%d"
, EERIEDrawnPolys, FPS, fps2min, fps2, _framedelay, INTER_DRAW, INTER_COMPUTE, INTREATZONECOUNT);
danaeApp.OutputText( 70, DANAESIZY-100+32, tex );
TOTAL_CHRONO=0;
sprintf(tex,"%4.0f MCache %d[%d] NOT %d FP %3.0f %3.0f Llights %d/%d TOTIOPDL %d TOTPDL %d"
,inter.iobj[0]->pos.y,MCache_Number,MCache_GetSize(),NOT_MOVED_AT_ALL,Original_framedelay,_framedelay,LAST_LLIGHT_COUNT,MAX_LLIGHTS,TOTIOPDL,TOTPDL);
if (LAST_LLIGHT_COUNT>MAX_LLIGHTS)
strcat(tex," EXCEEDING LIMIT !!!");
danaeApp.OutputText(70,DANAESIZY-170-144,tex);
sprintf(tex,"Pos %10.3f Screen %10.3f"
,LAST_FZPOS,LAST_FZSCREEN);
danaeApp.OutputText(320,200,tex);
}
void ARX_SetAntiAliasing()
{
if( (pMenuConfig)&&
(pMenuConfig->bAntiAliasing) )
{
D3DDEVICEDESC7 devicedesc7;
GDevice->GetCaps(&devicedesc7);
if(devicedesc7.dpcTriCaps.dwRasterCaps&D3DPRASTERCAPS_ANTIALIASSORTINDEPENDENT)
{
if( FAILED( GDevice->SetRenderState(D3DRENDERSTATE_ANTIALIAS,D3DANTIALIAS_SORTINDEPENDENT) ) )
{
}
}
else
{
if(devicedesc7.dpcTriCaps.dwRasterCaps&D3DPRASTERCAPS_ANTIALIASSORTDEPENDENT)
{
GDevice->SetRenderState(D3DRENDERSTATE_ANTIALIAS,D3DANTIALIAS_SORTDEPENDENT);
}
}
}
else
{
GDevice->SetRenderState(D3DRENDERSTATE_ANTIALIAS,D3DANTIALIAS_NONE);
}
}
HRESULT DANAE::InitDeviceObjects()
{
GDevice=m_pd3dDevice;
// Setup Base Material
D3DMATERIAL7 mtrl;
D3DUtil_InitMaterial( mtrl, 1.f, 0.f, 0.f );
m_pd3dDevice->SetMaterial( &mtrl );
// Enable texture perspective RenderState
m_pd3dDevice->SetRenderState( D3DRENDERSTATE_TEXTUREPERSPECTIVE , TRUE );
// Enable Z-buffering RenderState
EnableZBuffer();
// Setup Ambient Color RenderState
m_pd3dDevice->SetRenderState( D3DRENDERSTATE_AMBIENT, 0x0a0a0a0a );
// Restore All Textures RenderState
ReloadAllTextures(m_pd3dDevice);
ARX_PLAYER_Restore_Skin();
// Setup Dither Mode
m_pd3dDevice->SetRenderState( D3DRENDERSTATE_DITHERENABLE, FALSE );
// Setup Specular RenderState
m_pd3dDevice->SetRenderState( D3DRENDERSTATE_SPECULARENABLE, FALSE );
// Setup LastPixel RenderState
m_pd3dDevice->SetRenderState(D3DRENDERSTATE_LASTPIXEL, TRUE);
// Setup Clipping RenderState
m_pd3dDevice->SetRenderState( D3DRENDERSTATE_CLIPPING , TRUE);
// Disable Lighting RenderState
m_pd3dDevice->SetRenderState( D3DRENDERSTATE_LIGHTING , FALSE);
// Setup Texture Border RenderState
SETTEXTUREWRAPMODE(m_pd3dDevice, D3DTADDRESS_WRAP);
// Setup Color Key RenderState
m_pd3dDevice->SetRenderState(D3DRENDERSTATE_STENCILENABLE,false);
m_pd3dDevice->SetTextureStageState(1,D3DTSS_COLOROP,D3DTOP_DISABLE);
if (USE_D3DFOG)
{
m_pd3dDevice->SetRenderState( D3DRENDERSTATE_FOGCOLOR, D3DRGB(current.depthcolor.r,current.depthcolor.g,current.depthcolor.b));
float zval = 1.f;
m_pd3dDevice->SetRenderState( D3DRENDERSTATE_FOGTABLEMODE, D3DFOG_LINEAR );
m_pd3dDevice->SetRenderState( D3DRENDERSTATE_FOGTABLEDENSITY, *((LPDWORD) (&zval)));
m_pd3dDevice->SetRenderState( D3DRENDERSTATE_FOGVERTEXMODE, D3DFOG_NONE );
zval = 0.48f;
float zval2 = zval * 0.65f;
m_pd3dDevice->SetRenderState( D3DRENDERSTATE_FOGTABLESTART, *((LPDWORD) (&zval2)));
m_pd3dDevice->SetRenderState( D3DRENDERSTATE_FOGTABLEEND, *((LPDWORD) (&zval)));
m_pd3dDevice->SetRenderState( D3DRENDERSTATE_FOGENABLE, true);
}
SetZBias(m_pd3dDevice,0);
m_pd3dDevice->SetRenderState(D3DRENDERSTATE_ZFUNC, D3DCMP_LESSEQUAL);
m_pd3dDevice->SetRenderState(D3DRENDERSTATE_LOCALVIEWER,FALSE);
m_pd3dDevice->SetTextureStageState(1,D3DTSS_ADDRESS,D3DTADDRESS_WRAP);
m_pd3dDevice->SetTextureStageState(1,D3DTSS_MINFILTER,D3DTFN_LINEAR);
m_pd3dDevice->SetTextureStageState(1,D3DTSS_MAGFILTER,D3DTFN_LINEAR);
m_pd3dDevice->SetTextureStageState(2,D3DTSS_ADDRESS,D3DTADDRESS_WRAP);
m_pd3dDevice->SetTextureStageState(2,D3DTSS_MINFILTER,D3DTFN_LINEAR);
m_pd3dDevice->SetTextureStageState(2,D3DTSS_MAGFILTER,D3DTFN_LINEAR);
ComputePortalVertexBuffer();
pDynamicVertexBuffer = new CMY_DYNAMIC_VERTEXBUFFER(4000,FVF_D3DVERTEX3);
pDynamicVertexBufferBump = new CMY_DYNAMIC_VERTEXBUFFER(4000,FVF_D3DVERTEX3); // pDynamicVertexBuffer for BUMP mapping.
pDynamicVertexBufferTransform = new CMY_DYNAMIC_VERTEXBUFFER(4000, FVF_D3DVERTEX );
pDynamicVertexBuffer_TLVERTEX = new CMY_DYNAMIC_VERTEXBUFFER(4000, D3DFVF_TLVERTEX ); // VB using TLVERTEX format (creating).
pDynamicVertexBuffer_D3DVERTEX3_T = new CMY_DYNAMIC_VERTEXBUFFER(4000, FVF_D3DVERTEX3_T ); // using D3DVERTEX3_T format (creating).
if(pMenu)
{
pMenu->bReInitAll=true;
}
ARX_SetAntiAliasing();
m_pD3D->EvictManagedTextures();
return S_OK;
}
HRESULT DANAEFinalCleanup()
{
EERIE_PATHFINDER_Release();
ARX_INPUT_Release();
ARX_SOUND_Release();
KillInterTreeView();
return S_OK;
}
//*************************************************************************************
// FinalCleanup()
// Called before the app exits
//*************************************************************************************
HRESULT DANAE::FinalCleanup()
{
EERIE_PATHFINDER_Release();
ARX_INPUT_Release();
ARX_SOUND_Release();
KillInterTreeView();
return S_OK;
}
//*************************************************************************************
// DeleteDeviceObjects()
// Called when the app is exitting, or the device is being changed,
// this function deletes any device dependant objects.
//*************************************************************************************
HRESULT DANAE::DeleteDeviceObjects()
{
D3DTextr_InvalidateAllTextures();
if(pDynamicVertexBufferTransform)
{
delete pDynamicVertexBufferTransform;
pDynamicVertexBufferTransform=NULL;
}
if(pDynamicVertexBuffer_TLVERTEX)
{
delete pDynamicVertexBuffer_TLVERTEX;
pDynamicVertexBuffer_TLVERTEX=NULL;
}
if(pDynamicVertexBuffer)
{
delete pDynamicVertexBuffer;
pDynamicVertexBuffer=NULL;
}
if( pDynamicVertexBufferBump )
{
delete pDynamicVertexBufferBump;
pDynamicVertexBufferBump = NULL;
}
if( pDynamicVertexBuffer_D3DVERTEX3_T )
{
delete pDynamicVertexBuffer_D3DVERTEX3_T;
pDynamicVertexBuffer_D3DVERTEX3_T = NULL;
}
EERIE_PORTAL_ReleaseOnlyVertexBuffer();
return S_OK;
}
//*************************************************************************************
// MsgProc()
// Overrides StdMsgProc
//*************************************************************************************
LRESULT DANAE::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam,
LPARAM lParam )
{
switch (uMsg)
{
case WM_ACTIVATE:
if(wParam==WA_INACTIVE)
{
DXI_SleepAllDevices();
if (pGetInfoDirectInput)
{
pGetInfoDirectInput->bActive=false;
}
}
else
{
if(pGetInfoDirectInput)
{
pGetInfoDirectInput->ResetAll();
pGetInfoDirectInput->bActive=true;
}
DXI_SleepAllDevices();
DXI_RestoreAllDevices();
}
break;
case WM_SYSCOMMAND: // To avoid ScreenSaver Interference
if ((wParam & 0xFFF0)== SC_SCREENSAVE ||
(wParam & 0xFFF0)== SC_MONITORPOWER)
{
return 0;
}
break;
case WM_USER+12: // GAIA Specific Message
if ( !FINAL_COMMERCIAL_DEMO
&& !FINAL_COMMERCIAL_GAME
)
{
char texx[1024];
strcpy(texx,HERMES_GaiaCOM_Receive());
strcpy(ItemToBeAdded,texx);
}
break;
case WM_CLOSE:
if ( FINAL_COMMERCIAL_GAME
|| FINAL_COMMERCIAL_DEMO
|| OKBox("Do you REALLY want to quit ?","Danae WARNING"))
{
CheckIO_NOT_SAVED();
ADDED_IO_NOT_SAVED=0;
}
else
{
return FALSE;
}
break;
case WM_DROPFILES:
if ( !FINAL_COMMERCIAL_DEMO
&& !FINAL_COMMERCIAL_GAME
)
{
HANDLE hDrop;
long number;
char temp[512];
char texx[512];
hDrop = (HANDLE) wParam;
number=DragQueryFile((HDROP)hDrop,0,temp,512);
if (number > 0)
{
strcpy(texx,temp);
strcpy(temp,Project.workingdir);
MakeUpcase(temp);
MakeUpcase(texx);
if (!specialstrcmp(texx, temp))
{
strcpy(ItemToBeAdded,texx);
}
else
{
char warn[256];
sprintf(warn,"Warning: You CANNOT add an object not coming from Project Path (%s)",Project.workingdir);
ShowPopup(warn);
strcpy(ItemToBeAdded,"");
}
}
DragFinish((HDROP)hDrop);
SetFocus(hWnd);
SetActiveWindow(hWnd);
}
break;
case WM_COMMAND:
if ( !FINAL_COMMERCIAL_DEMO
&& !FINAL_COMMERCIAL_GAME
)
{
switch( LOWORD(wParam) )
{
case IDM_DLF_CHECK:
ARX_SAVELOAD_CheckDLFs();
break;
case IDM_ANYPOLY:
{
ARX_PLAYER_GotoAnyPoly();
}
break;
case IDM_MOULINEX:
if (OKBox("This Can Take a Loooooooooooooong Time... Sure ?","MOULINEX Confirm Box"))
{
MOULINEX=1;
}
break;
case DANAE_B016:
DANAE_DEBUGGER_Launch(danaeApp.m_hWnd);
break;
case DANAE_B015:
ARX_TIME_Pause();
Pause(TRUE);
DialogBox( (HINSTANCE)GetWindowLong( danaeApp.m_hWnd, GWL_HINSTANCE ),
MAKEINTRESOURCE(IDD_SEARCH), danaeApp.m_hWnd, ScriptSearchProc);
if (SCRIPT_SEARCH_TEXT[0])
ARX_SCRIPT_LaunchScriptSearch(SCRIPT_SEARCH_TEXT);
Pause(FALSE);
ARX_TIME_UnPause();
break;
case DANAE_B012:
LaunchSnapShotParamApp(this->m_hWnd);
break;
case DANAE_B014:
#ifndef NOEDITOR //////////////////
if (EDITION==EDITION_PARTICLES)
{
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B014,FALSE); //Particles
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B011,FALSE); //Pathways
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B010,FALSE); //Zones
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B004,FALSE); //Nodes
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B007,FALSE); //Lights
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B008,FALSE); //Fogs
EDITION=EDITION_IO;
}
else
{
EDITION=EDITION_PARTICLES;
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B011,FALSE); //Pathways
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B010,FALSE); //Zones
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B004,FALSE); //Nodes
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B007,FALSE); //Lights
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B008,FALSE); //Fogs
}
#endif //////////////////
break;
case DANAE_B011:
#ifndef NOEDITOR //////////////////
if (EDITION==EDITION_PATHWAYS)
{
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B014,FALSE); //Particles
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B011,FALSE); //Pathways
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B010,FALSE); //Zones
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B004,FALSE); //Nodes
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B007,FALSE); //Lights
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B008,FALSE); //Fogs
EDITION=EDITION_IO;
}
else
{
EDITION=EDITION_PATHWAYS;
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B014,FALSE); //Particles
//SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B011,FALSE); //Pathways
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B010,FALSE); //Zones
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B004,FALSE); //Nodes
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B007,FALSE); //Lights
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B008,FALSE); //Fogs
}
#endif //////////////////
break;
case DANAE_B010:
#ifndef NOEDITOR //////////////////
if (EDITION==EDITION_ZONES)
{
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B014,FALSE); //Particles
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B011,FALSE); //Pathways
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B010,FALSE); //Zones
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B004,FALSE); //Nodes
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B007,FALSE); //Lights
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B008,FALSE); //Fogs
EDITION=EDITION_IO;
}
else
{
EDITION=EDITION_ZONES;
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B014,FALSE); //Particles
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B011,FALSE); //Pathways
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B004,FALSE); //Nodes
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B007,FALSE); //Lights
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B008,FALSE); //Fogs
}
#endif //////////////////
break;
case DANAE_B007:
#ifndef NOEDITOR //////////////////
if (EDITION==EDITION_LIGHTS)
{
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B014,FALSE); //Particles
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B011,FALSE); //Zones
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B010,FALSE); //Zones
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B004,FALSE); //Nodes
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B007,FALSE); //Lights
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B008,FALSE); //Fogs
EDITION=EDITION_IO;
}
else
{
EDITION=EDITION_LIGHTS;
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B014,FALSE); //Particles
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B011,FALSE); //Zones
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B010,FALSE); //Zones
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B004,FALSE); //Nodes
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B008,FALSE); //Fogs
}
#endif //////////////////
break;
case DANAE_B006:
#ifndef NOEDITOR //////////////////
if (EDITMODE==1)
{
SetEditMode(0);
ARX_TIME_Get();
SendGameReadyMsg();
}
else
{
SetEditMode(1);
RestoreAllIOInitPos();
}
#endif //////////////////
#ifdef NOEDITOR //////////////////
if (EDITMODE==1) SetEditMode(0);
#endif //////////////////
break;
case DANAE_B003:
if (PauseScript==1) PauseScript=0;
else PauseScript=1;
break;
case DANAE_B004:
#ifndef NOEDITOR //////////////////
if (EDITION==EDITION_NODES)
{
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B014,FALSE); //Particles
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B011,FALSE); //Zones
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B010,FALSE); //Zones
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B004,FALSE); //Nodes
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B007,FALSE); //Lights
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B008,FALSE); //Fogs
EDITION=EDITION_IO;
}
else
{
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B014,FALSE); //Particles
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B011,FALSE); //Zones
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B010,FALSE); //Zones
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B007,FALSE); //Lights
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B008,FALSE); //Fogs
EDITION=EDITION_NODES;
}
#endif //////////////////
break;
case DANAE_B008:
#ifndef NOEDITOR //////////////////
if (EDITION == EDITION_FOGS)
{
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B014,FALSE); //Particles
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B011,FALSE); //Zones
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B010,FALSE); //Zones
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B004,FALSE); //Nodes
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B007,FALSE); //Lights
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B008,FALSE); //Fogs
EDITION=EDITION_IO;
}
else
{
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B014,FALSE); //Particles
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B011,FALSE); //Zones
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B010,FALSE); //Zones
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B004,FALSE); //Nodes
SendMessage(danaeApp.ToolBar->hWnd,TB_CHECKBUTTON ,DANAE_B007,FALSE); //Lights
EDITION=EDITION_FOGS;
}
#endif //////////////////
break;
case DANAE_MENU_SAVEPATH:
TextBox("Enter SavePath",LOCAL_SAVENAME,16);
strcpy(LOCAL_SAVENAME,GTE_TEXT);
Danae_Registry_Write("LOCAL_SAVENAME",LOCAL_SAVENAME);
ARX_CHANGELEVEL_MakePath();
break;
case DANAE_MENU_MESH_REDUCTION:
if (MESH_REDUCTION_WINDOW==NULL)
{
if (danaeApp.m_pFramework->m_bIsFullscreen)
{
ARX_TIME_Pause();
Pause(TRUE);
DialogBox( (HINSTANCE)GetWindowLong( danaeApp.m_hWnd, GWL_HINSTANCE ),
MAKEINTRESOURCE(IDD_MESHREDUCTION), danaeApp.m_hWnd, MeshReductionProc);
Pause(FALSE);
ARX_TIME_UnPause();
}
else
MESH_REDUCTION_WINDOW=(CreateDialogParam( (HINSTANCE)GetWindowLong( danaeApp.m_hWnd, GWL_HINSTANCE ),
MAKEINTRESOURCE(IDD_MESHREDUCTION), danaeApp.m_hWnd, MeshReductionProc,0 ));
}
break;
case DANAE_B009:
ARX_PARTICLES_ClearAll();
ARX_MISSILES_ClearAll();
ARX_SPELLS_ClearAll();
if (CDP_PATHWAYS_Options!=NULL) SendMessage(CDP_PATHWAYS_Options,WM_CLOSE,0,0);
if (CDP_LIGHTOptions!=NULL) SendMessage(CDP_LIGHTOptions,WM_CLOSE,0,0);
if (CDP_FogOptions!=NULL) SendMessage(CDP_FogOptions,WM_CLOSE,0,0);
CDP_LIGHTOptions=NULL;
CDP_FogOptions=NULL;
ARX_TIME_Pause();
DanaeSwitchFullScreen();
LaunchDummyParticle();
ARX_TIME_UnPause();
break;
case DANAE_B013:
ARX_TIME_Pause();
Pause(TRUE);
DialogBox( (HINSTANCE)GetWindowLong( hWnd, GWL_HINSTANCE ),
MAKEINTRESOURCE(IDD_OPTIONS), hWnd, OptionsProc );
EERIE_LIGHT_ChangeLighting();
Pause(FALSE);
ARX_TIME_UnPause();
break;
case DANAE_MENU_UNFREEZEALLINTER:
ARX_INTERACTIVE_UnfreezeAll();
break;
case DANAE_MENU_RESETSHADOWS:
ARX_TIME_Pause();
Pause(TRUE);
if (OKBox("Remove Casts Shadows Flag from all Lights ?","DANAE Confirm Box"))
{
for (long i=0;iextras |= EXTRAS_NOCASTED;
}
}
}
Pause(FALSE);
ARX_TIME_UnPause();
break;
case DANAE_MENU_RECALC:
if (PRECALC==NULL)
{
if (danaeApp.m_pFramework->m_bIsFullscreen)
{
ARX_TIME_Pause();
Pause(TRUE);
DialogBox( (HINSTANCE)GetWindowLong( danaeApp.m_hWnd, GWL_HINSTANCE ),
MAKEINTRESOURCE(IDD_PRECALC), danaeApp.m_hWnd, PrecalcProc);
Pause(FALSE);
ARX_TIME_UnPause();
}
else
PRECALC=(CreateDialogParam( (HINSTANCE)GetWindowLong( danaeApp.m_hWnd, GWL_HINSTANCE ),
MAKEINTRESOURCE(IDD_PRECALC), danaeApp.m_hWnd, PrecalcProc,0 ));
}
break;
case DANAE_MENU_LOCALLIST:
if (ValidIONum(LastSelectedIONum))
{
strcpy(ShowText,"");
if (inter.iobj[LastSelectedIONum]->script.data!=NULL)
MakeLocalText(&inter.iobj[LastSelectedIONum]->script,ShowText);
else if (inter.iobj[LastSelectedIONum]->over_script.data!=NULL)
MakeLocalText(&inter.iobj[LastSelectedIONum]->over_script,ShowText);
strcpy(ShowTextWindowtext,"Local Variables");
DialogBox(hInstance, (LPCTSTR)IDD_SHOWTEXT, NULL, (DLGPROC)ShowTextDlg);
}
else
ShowPopup("No Interactive Object Selected");
break;
case DANAE_MENU_MEMORY:
strcpy(ShowText,"");
unsigned long msize;
msize=MakeMemoryText(ShowText);
sprintf(ShowTextWindowtext,"Allocated Memory %u bytes %u Kb",msize,msize>>10);
CreateDialogParam( (HINSTANCE)GetWindowLong( this->m_hWnd, GWL_HINSTANCE ),
MAKEINTRESOURCE(IDD_SHOWTEXT), this->m_hWnd, (DLGPROC)ShowTextDlg,0 );
break;
case DANAE_MENU_GLOBALLIST:
strcpy(ShowText,"");
MakeGlobalText(ShowText);
strcpy(ShowTextWindowtext,"Global Variables");
DialogBox(hInstance, (LPCTSTR)IDD_SHOWTEXT, NULL, (DLGPROC)ShowTextDlg);
break;
case DANAE_MENU_INTEROBJLIST:
LaunchInteractiveObjectsApp(this->m_hWnd);
break;
case DANAE_MENU_LANGUAGE:
ARX_TIME_Pause();
Pause(TRUE);
DialogBox( (HINSTANCE)GetWindowLong( this->m_hWnd, GWL_HINSTANCE ),
MAKEINTRESOURCE(IDD_LANGUAGEDIALOG), this->m_hWnd, LanguageOptionsProc);
ARX_Localisation_Init();
Pause(FALSE);
ARX_TIME_UnPause();
break;
case DANAE_MENU_IMPORTSCN:
ARX_TIME_Pause();
Pause(TRUE);
ShowPopup("Unavailable Command");
Pause(FALSE);
ARX_TIME_UnPause();
break;
case DANAE_MENU_UPDATELOCALISATION:
ARX_TIME_Pause();
Pause(TRUE);
ARX_Localisation_Init();
Pause(FALSE);
ARX_TIME_UnPause();
break;
case DANAE_MENU_UPDATESOUNDS:
ARX_TIME_Pause();
Pause(TRUE);
ShowPopup("Unavailable Command");
Pause(FALSE);
ARX_TIME_UnPause();
break;
case DANAE_MENU_UPDATESCENE:
ARX_TIME_Pause();
Pause(TRUE);
ShowPopup("Unavailable Command");
Pause(FALSE);
ARX_TIME_UnPause();
break;
case DANAE_MENU_UPDATEALLSCRIPTS:
if (!EDITMODE)
ShowPopup("Command Only Available in EDITOR mode!!!");
else
{
ARX_TIME_Pause();
Pause(TRUE);
if (OKBox("Reload All Scripts ?","Confirm"))
ReloadAllScripts();
Pause(FALSE);
ARX_TIME_UnPause();
}
break;
case DANAE_MENU_UPDATEALLOBJECTS:
ARX_TIME_Pause();
Pause(TRUE);
ShowPopup("Unavailable Command");
Pause(FALSE);
ARX_TIME_UnPause();
break;
case DANAE_MENU_UPDATEALLTEXTURES:
ARX_TIME_Pause();
Pause(TRUE);
ReloadAllTextures(GDevice);
Pause(FALSE);
ARX_TIME_UnPause();
break;
case DANAE_MENU_UPDATEALLANIMS:
if (!EDITMODE)
ShowPopup("Command Only Available in EDITOR mode!!!");
else
{
ARX_TIME_Pause();
Pause(TRUE);
EERIE_ANIMMANAGER_ReloadAll();
Pause(FALSE);
ARX_TIME_UnPause();
}
break;
case DANAE_MENU_ANIMATIONSLIST:
long tr;
long memsize;
ARX_TIME_Pause();
Pause(TRUE);
tr=EERIE_ANIMMANAGER_Count(ShowText,&memsize);
sprintf(ShowTextWindowtext,"Animations %d %d Ko",tr,memsize>>10);
DialogBox(hInstance, (LPCTSTR)IDD_SHOWTEXTBIG, NULL, (DLGPROC)ShowTextDlg);
Pause(FALSE);
ARX_TIME_UnPause();
break;
case DANAE_MENU_TEXLIST:
long _tr;
long _memsize;
long _memmip;
ARX_TIME_Pause();
Pause(TRUE);
_tr=CountTextures(ShowText,&_memsize,&_memmip);
sprintf(ShowTextWindowtext,"Textures %d %d Ko MIPsize %d Ko",_tr,_memsize>>10,_memmip>>10);
DialogBox(hInstance, (LPCTSTR)IDD_SHOWTEXTBIG, NULL, (DLGPROC)ShowTextDlg);
Pause(FALSE);
ARX_TIME_UnPause();
break;
case DANAE_MENU_PROJECTPATH:
char tex[512];
HERMESFolderSelector(Project.workingdir,"Choose Working Folder");
sprintf(tex,"DANAE Project - %s",Project.workingdir);
Danae_Registry_Write("LastWorkingDir",Project.workingdir);
SetWindowTitle(hWnd,tex);
char tteexx[512];
strcpy(tteexx,Project.workingdir);
strcat(tteexx,"GRAPH\\LEVELS\\");
_chdir(tteexx);
break;
case DANAE_MENU_NEWLEVEL:
ARX_TIME_Pause();
Pause(TRUE);
if (OKBox("Do You Really Want to Start\na New Level ?","DANAE Confirm Box"))
DanaeClearLevel();
Pause(FALSE);
ARX_TIME_UnPause();
break;
case DANAE_MENU_PURGELEVEL:
if (OKBox("This Can Be REALLY Dangerous !!! Sure ?","Confirm"))
{
BIG_PURGE();
}
break;
case DANAE_MENU_FORCELOAD:
if (OKBox("This Can Be Dangerous... Sure ?","Confirm"))
{
FAKE_DIR=1;
WILLLOADLEVEL=1;
}
break;
case DANAE_MENU_LOADLEVEL:
WILLLOADLEVEL=1;
break;
case DANAE_MENU_SAVELEVEL:
ARX_TIME_Pause();
Pause(TRUE);
ShowPopup("Unavailable Command");
Pause(FALSE);
ARX_TIME_UnPause();
break;
case DANAE_MENU_SAVEAS:
WILLSAVELEVEL=1;
break;
case DANAE_MENU_EXIT:
if (OKBox("Do You Really\nWant to Quit DANAE ?","DANAE Confirm Box"))
SendMessage( hWnd, WM_CLOSE, 0, 0 );
break;
case DANAE_MENU_ABOUT:
ARX_TIME_Pause();
Pause(TRUE);
DialogBox( (HINSTANCE)GetWindowLong( hWnd, GWL_HINSTANCE ),
MAKEINTRESOURCE(IDD_DANAEABOUT), hWnd, AboutProc );
Pause(FALSE);
ARX_TIME_UnPause();
break;
case DANAE_MENU_OPTIONS:
ARX_TIME_Pause();
Pause(TRUE);
DialogBox( (HINSTANCE)GetWindowLong( hWnd, GWL_HINSTANCE ),
MAKEINTRESOURCE(IDD_OPTIONS), hWnd, OptionsProc );
Pause(FALSE);
ARX_TIME_UnPause();
break;
case DANAE_MENU_OPTIONS2:
ARX_TIME_Pause();
Pause(TRUE);
DialogBox( (HINSTANCE)GetWindowLong( this->m_hWnd, GWL_HINSTANCE ),
MAKEINTRESOURCE(IDD_OPTIONS2), this->m_hWnd, OptionsProc_2 );
Pause(FALSE);
ARX_TIME_UnPause();
break;
}
}
break;
}
return CD3DApplication::MsgProc( hWnd, uMsg, wParam, lParam );
}
void ReleaseSystemObjects()
{
if (hero)
{
ReleaseEERIE3DObj(hero);
hero=NULL;
}
if (inter.iobj[0])
{
inter.iobj[0]->obj = NULL;
ReleaseInter(inter.iobj[0]);
inter.iobj[0] = NULL;
if (inter.iobj)
{
free(inter.iobj);
inter.iobj = NULL;
}
}
if (eyeballobj)
{
ReleaseEERIE3DObj(eyeballobj);
eyeballobj=NULL;
}
if (cabal)
{
ReleaseEERIE3DObj(cabal);
cabal=NULL;
}
if (nodeobj)
{
ReleaseEERIE3DObj(nodeobj);
nodeobj=NULL;
}
if (fogobj)
{
ReleaseEERIE3DObj(fogobj);
fogobj=NULL;
}
if (cameraobj)
{
ReleaseEERIE3DObj(cameraobj);
cameraobj=NULL;
}
if (markerobj)
{
ReleaseEERIE3DObj(markerobj);
markerobj=NULL;
}
if (arrowobj)
{
ReleaseEERIE3DObj(arrowobj);
arrowobj=NULL;
}
for (long i=0;iSaveAll();
delete pMenuConfig;
pMenuConfig=NULL;
}
//dinput
if(pGetInfoDirectInput)
{
delete pGetInfoDirectInput;
pGetInfoDirectInput=NULL;
}
RoomDrawRelease();
EXITING=1;
TREATZONE_Release();
ClearTileLights();
//les textes et les textures
ClearSysTextures();
FreeSaveGameList();
if (pParticleManager)
{
delete pParticleManager;
pParticleManager = NULL;
}
//sound
ARX_SOUND_Release();
MCache_ClearAll();
//pathfinding
ARX_PATH_ReleaseAllPath();
ReleaseSystemObjects();
//eerie_background
ClearBackground(ACTIVEBKG);
//animations
EERIE_ANIMMANAGER_ClearAll();
//Scripts
if (svar)
{
for (long i=0; i