/* =========================================================================== 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 // ////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////// // ARX_Interactive ////////////////////////////////////////////////////////////////////////////////////// // // Description: // ARX Interactive Objects Management // // Updates: (date) (person) (update) // // Code: Cyril Meynier // // Copyright (c) 1999 ARKANE Studios SA. All rights reserved ////////////////////////////////////////////////////////////////////////////////////// #ifndef ARX_INTERACTIVE_H #define ARX_INTERACTIVE_H //#include "Danae.h" #include "EERIEpoly.h" #include //----------------------------------------------------------------------------- #define MAX_LINKS 12 typedef struct { long init; long nbmax; INTERACTIVE_OBJ ** iobj; char * lock; } INTERACTIVE_OBJECTS; typedef struct { INTERACTIVE_OBJ * io; long show; } INVENTORY_SLOT; typedef struct { INTERACTIVE_OBJ * io; long sizex; long sizey; INVENTORY_SLOT slot[20][20]; } INVENTORY_DATA; typedef struct { short exist; short selected; _TCHAR UName[64]; char name[64]; long link[MAX_LINKS]; char lnames[MAX_LINKS][64]; EERIE_3D pos; EERIE_S2D bboxmin; EERIE_S2D bboxmax; } ARX_NODE; typedef struct { long init; long nbmax; ARX_NODE * nodes; } ARX_NODES; //----------------------------------------------------------------------------- #define INVENTORY_X 16 #define INVENTORY_Y 3 #define EQUIP_RIGHTHAND 1 #define EQUIP_LEFTHAND 2 #define EQUIP_SECONDARY 3 #define EQUIP_SHIELD 4 #define TARGET_PATH -3 #define TARGET_NONE -2 #define TARGET_PLAYER 0 //-1 #define TARGET_NODE 50000 #define NO_IDENT 1 #define NO_MESH 2 #define NO_ON_LOAD 4 #define IO_IMMEDIATELOAD 8 #define RENDER_INTER_FLAG_DUMMY_DRAW 1 #define FLAG_NOCONFIRM 1 #define FLAG_DONTKILLDIR 2 //----------------------------------------------------------------------------- extern ARX_NODES nodes; extern INVENTORY_DATA * SecondaryInventory; extern INVENTORY_DATA * TSecondaryInventory; extern INTERACTIVE_OBJECTS inter; extern INTERACTIVE_OBJ * DRAGINTER; extern INTERACTIVE_OBJ * CURRENTINTER; extern INTERACTIVE_OBJ * ioSteal; extern INVENTORY_SLOT inventory[3][INVENTORY_X][INVENTORY_Y]; extern long InventoryY; extern long NbIOSelected; //----------------------------------------------------------------------------- void ARX_INTERACTIVE_UnfreezeAll(); void ARX_INTERACTIVE_TWEAK_Icon(INTERACTIVE_OBJ * io, char * s1); void ARX_INTERACTIVE_DestroyDynamicInfo(INTERACTIVE_OBJ * io); void ARX_INTERACTIVE_HideGore(INTERACTIVE_OBJ * io, long flag = 0); void ARX_INTERACTIVE_DeleteByIndex(long i, long flag = 0); BOOL ARX_INTERACTIVE_Attach(long n_source, long n_target, char * ap_source, char * ap_target); void ARX_INTERACTIVE_Detach(long n_source, long n_target); void ARX_INTERACTIVE_Show_Hide_1st(INTERACTIVE_OBJ * io, long state); void ARX_INTERACTIVE_RemoveGoreOnIO(INTERACTIVE_OBJ * io); bool ARX_INTERACTIVE_ConvertToValidPosForIO(INTERACTIVE_OBJ * io, EERIE_3D * target); void ARX_INTERACTIVE_TeleportBehindTarget(INTERACTIVE_OBJ * io); BOOL ARX_INTERACTIVE_CheckCollision(EERIE_3DOBJ * obj, long kk, long source = -1); void ARX_INTERACTIVE_DestroyIO(INTERACTIVE_OBJ * ioo); void ARX_INTERACTIVE_MEMO_TWEAK(INTERACTIVE_OBJ * io, long type, char * param1, char * param2); void ARX_INTERACTIVE_MEMO_TWEAK_CLEAR(INTERACTIVE_OBJ * io); void ARX_INTERACTIVE_APPLY_TWEAK_INFO(INTERACTIVE_OBJ * io); void ARX_INTERACTIVE_USEMESH(INTERACTIVE_OBJ * io, char * temp); void ARX_INTERACTIVE_Teleport(INTERACTIVE_OBJ * io, EERIE_3D * target, long flags = 0); bool IsEquipedByPlayer(INTERACTIVE_OBJ * io); void CleanScriptLoadedIO(); void PrepareIOTreatZone(long flag = 0); void LinkObjToMe(INTERACTIVE_OBJ * io, INTERACTIVE_OBJ * io2, char * attach); void PutInFrontOfPlayer(INTERACTIVE_OBJ * io, long flag = 0); BOOL CanBePutInInventory(INTERACTIVE_OBJ * io); void SetShield(char * temp); void MakeTemporaryIOIdent(INTERACTIVE_OBJ * io); INTERACTIVE_OBJ * GetInventoryObj(); long ValidIONum(long num); long ValidIOAddress(INTERACTIVE_OBJ * io); BOOL GetItemWorldPosition(INTERACTIVE_OBJ * io, EERIE_3D * pos); BOOL GetItemWorldPositionSound(INTERACTIVE_OBJ * io, EERIE_3D * pos); long GetTargetByNameTarget(char * name); void RestoreInitialIOStatusOfIO(INTERACTIVE_OBJ * io); void SetWeapon_Back(INTERACTIVE_OBJ * io); void ReloadAllScripts(); BOOL ForceNPC_Above_Ground(INTERACTIVE_OBJ * io); // BEGIN NODES DATA **************************************************** void InitNodes(long nb); void ClearNode(long i, long spec); void ClearNodes(); long GetFreeNode(); void UnselectAllNodes(); void SelectNode(long i); void MakeNodeName(long i); void EditNodeName(long i); void TranslateSelectedNodes(EERIE_3D * trans); void ClearSelectedNodes(); BOOL ExistNodeName(char * name); void LinkNodeToNode(long i, long j); void UnLinkNodeFromNode(long i, long j); long CountNodes(); void RestoreNodeNumbers(); long GetNumNodeByName(char * name); void ReleaseNode(); // END NODES DATA ****************************************************** void RestoreInitialIOStatus(); long GetInterNum(INTERACTIVE_OBJ * io); // io from 0 TO 10000 INTERACTIVE_OBJ * GetInventoryObj_INVENTORYUSE(EERIE_S2D * pos); void CheckForInventoryReplaceMe(INTERACTIVE_OBJ * io, INTERACTIVE_OBJ * old); void SelectIO(INTERACTIVE_OBJ * io); void UnSelectIO(INTERACTIVE_OBJ * io); void RotateSelectedIO(EERIE_3D * op); void TranslateSelectedIO(EERIE_3D * op); void GroundSnapSelectedIO(); void DeleteSelectedIO(); void ResetSelectedIORot(); long GetNumberInterWithOutScriptLoadForLevel(long level); long IsCollidingAnyFIXInter(float x, float y, float z, EERIE_3D * size); BOOL InSecondaryInventoryPos(EERIE_S2D * pos); BOOL InPlayerInventoryPos(EERIE_S2D * pos); BOOL CanBePutInSecondaryInventory(INVENTORY_DATA * id, INTERACTIVE_OBJ * io, long * xx, long * yy); void FreeAllInter(); void SetRightHand(char * temp); void SetLeftHand(char * temp); void UnlinkAllLinkedObjects(); void LinkObjectToObject(EERIE_3DOBJ * inter, EERIE_3DOBJ * tolink, char * actiontext, char * actiontext2); void UnLinkObjectFromObject(EERIE_3DOBJ * inter, EERIE_3DOBJ * tolink); BOOL IsCollidingInter(INTERACTIVE_OBJ * io, EERIE_3D * pos); long IsCollidingAnyInter(float x, float y, float z, EERIE_3D * size); INTERACTIVE_OBJ * AddInteractive(LPDIRECT3DDEVICE7 pd3dDevice, char * file, long id, long flags = 0); INTERACTIVE_OBJ * AddFix(LPDIRECT3DDEVICE7 pd3dDevice, char * file, long flags = 0); INTERACTIVE_OBJ * AddNPC(LPDIRECT3DDEVICE7 pd3dDevice, char * file, long flags = 0); INTERACTIVE_OBJ * AddItem(LPDIRECT3DDEVICE7 pd3dDevice, char * file, long flags = 0); INTERACTIVE_OBJ * AddCamera(LPDIRECT3DDEVICE7 pd3dDevice, char * file); INTERACTIVE_OBJ * AddMarker(LPDIRECT3DDEVICE7 pd3dDevice, char * file); void InitInter(long nb); INTERACTIVE_OBJ * CreateFreeInter(long num = -1); void ReleaseInter(INTERACTIVE_OBJ * io); void ExecuteObjectAction(INTERACTIVE_OBJ * io); void AddRandomObj(LPDIRECT3DDEVICE7 pd3dDevice); void UpdateCameras(); void PlayObjectSound(INTERACTIVE_OBJ * io); INTERACTIVE_OBJ * InterClick(EERIE_S2D * pos, long flag = 0); void RenderInter(LPDIRECT3DDEVICE7 pd3dDevice, float from, float to, long flags = 0); INTERACTIVE_OBJ * FlyingOverObject(EERIE_S2D * pos, long flag = 0); void MakeIOIdent(INTERACTIVE_OBJ * io); void SelectIO(INTERACTIVE_OBJ * io); void ForcePlayerLookAtIO(INTERACTIVE_OBJ * io); void SetWeapon_On(INTERACTIVE_OBJ * io); void Prepare_SetWeapon(INTERACTIVE_OBJ * io, char * temp); void ComputeVVPos(INTERACTIVE_OBJ * io); void SetYlsideDeath(INTERACTIVE_OBJ * io); void GetMaterialString(char * origin, char * dest); INTERACTIVE_OBJ * CloneIOItem(INTERACTIVE_OBJ * src); void CleanInventory(); void SendInventoryObjectCommand(char * _lpszText, long _lCommand); BOOL PutInInventory(); char * GetInventoryName(); BOOL TakeFromInventory(EERIE_S2D * pos); INTERACTIVE_OBJ * GetFromInventory(EERIE_S2D * pos); BOOL IsFlyingOverInventory(EERIE_S2D * pos); void ForcePlayerInventoryObjectLevel(long level); BOOL IsInPlayerInventory(INTERACTIVE_OBJ * io); BOOL IsInSecondaryInventory(INTERACTIVE_OBJ * io); BOOL InInventoryPos(EERIE_S2D * pos); void ReplaceInAllInventories(INTERACTIVE_OBJ * io, INTERACTIVE_OBJ * ioo); void RemoveFromAllInventories(INTERACTIVE_OBJ * io); INTERACTIVE_OBJ * ARX_INVENTORY_GetTorchLowestDurability(); void ARX_INVENTORY_IdentifyAll(); void ARX_INVENTORY_OpenClose(INTERACTIVE_OBJ *); void ARX_INVENTORY_TakeAllFromSecondaryInventory(); //*********************************************************************************************** // Retreives IO Number with its address //----------------------------------------------------------------------------------------------- // VERIFIED (Cyril 2001/10/16) //*********************************************************************************************** __inline long GetInterNum(INTERACTIVE_OBJ * io) { if (io == NULL) return -1; for (long i = 0; i < inter.nbmax; i++) if (inter.iobj[i] == io) return i; return -1; } float ARX_INTERACTIVE_GetArmorClass(INTERACTIVE_OBJ * io); float ARX_INTERACTIVE_fGetPrice(INTERACTIVE_OBJ * io, INTERACTIVE_OBJ * shop); long ARX_INTERACTIVE_GetPrice(INTERACTIVE_OBJ * io, INTERACTIVE_OBJ * shop); void IO_UnlinkAllLinkedObjects(INTERACTIVE_OBJ * io); void IO_Drop_Item(INTERACTIVE_OBJ * io_src, INTERACTIVE_OBJ * io); typedef struct { long num; INTERACTIVE_OBJ * io; long ioflags; long show; } TREATZONE_IO; extern TREATZONE_IO * treatio; extern long TREATZONE_CUR; extern long TREATZONE_MAX; void TREATZONE_Clear(); void TREATZONE_Release(); void TREATZONE_AddIO(INTERACTIVE_OBJ * io, long num, long flag = 0); void TREATZONE_RemoveIO(INTERACTIVE_OBJ * io); BOOL IsSameObject(INTERACTIVE_OBJ * io, INTERACTIVE_OBJ * ioo); void ARX_INTERACTIVE_ClearAllDynData(); BOOL HaveCommonGroup(INTERACTIVE_OBJ * io, INTERACTIVE_OBJ * ioo); void ShowIOPath(INTERACTIVE_OBJ * io); void UpdateIOInvisibility(INTERACTIVE_OBJ * io); void CheckSetAnimOutOfTreatZone(INTERACTIVE_OBJ * io, long num); void RestoreIOInitPos(INTERACTIVE_OBJ * io); void RestoreAllIOInitPos(); void ARX_HALO_SetToNative(INTERACTIVE_OBJ * io); void ARX_INTERACTIVE_ForceIOLeaveZone(INTERACTIVE_OBJ * io, long flags = 0); void ARX_INTERACTIVE_ActivatePhysics(long t); void ResetVVPos(INTERACTIVE_OBJ * io); #endif