mirror of
https://github.com/1dot13/source.git
synced 2026-07-22 13:40:22 +02:00
Every midnight snitches will give you a report about their collegues' opinions. Information includes: - merc whining about high death rate, - merc whining about player reputation, - merc whining about his low morale, - merc whining about some other merc (unliked, not only hated), - merc planning to quit (leave without renewing contract, only AIM mercs) next day, - merc whining about player inactivity, - merc whining about player owing them money (you can only owe money to MERC mercs). List of snitches (trait 22) Beth Bud Buzz Carp Ears Gary Hurl Lance Leon Weasel see: http://www.bears-pit.com/board/ubbthreads.php/topics/329412/Snitches_+_Externalised_morale.html git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@6723 3b4a5df2-a311-0410-b5c6-a8a6f20db521
300 lines
11 KiB
C
300 lines
11 KiB
C
#ifndef __TALKING_H_
|
|
#define __TALKING_H_
|
|
#define NO_EXPRESSION 0
|
|
#define BLINKING 1
|
|
#define ANGRY 2
|
|
#define SURPRISED 3
|
|
|
|
#include "soldier control.h"
|
|
#include "soldier profile type.h"
|
|
|
|
// Defines
|
|
#define NUM_FACE_SLOTS 50
|
|
|
|
struct audio_gap
|
|
{
|
|
UINT32 uiStart;
|
|
UINT32 uiEnd;
|
|
struct audio_gap *pNext;
|
|
};
|
|
|
|
typedef struct
|
|
{
|
|
BOOLEAN gCamoface;
|
|
BOOLEAN gUrbanCamoface;
|
|
BOOLEAN gDesertCamoface;
|
|
BOOLEAN gSnowCamoface;
|
|
} CAMO_FACE;
|
|
|
|
extern CAMO_FACE gCamoFace[NUM_PROFILES];
|
|
|
|
|
|
typedef struct
|
|
{
|
|
INT8 bEyesX;
|
|
INT8 bEyesY;
|
|
INT8 bMouthX;
|
|
INT8 bMouthY;
|
|
UINT16 uiIndex; // add
|
|
UINT16 FaceIndex; //add
|
|
|
|
} RPC_SMALL_FACE_VALUES;
|
|
|
|
extern RPC_SMALL_FACE_VALUES gRPCSmallFaceValues[200];
|
|
extern UINT8 gubRPCSmallFaceProfileNum[200];
|
|
|
|
#define MAX_FACE_GERA_CHARS 500
|
|
|
|
typedef struct
|
|
{
|
|
UINT16 Type;
|
|
UINT32 uiIndex;
|
|
CHAR8 szFile[MAX_FACE_GERA_CHARS];
|
|
|
|
} FACE_GEAR_VALUES;
|
|
|
|
extern FACE_GEAR_VALUES zNewFaceGear[MAXITEMS];
|
|
extern FACE_GEAR_VALUES zNewFaceGearIMP[MAXITEMS];
|
|
|
|
#define FACE_AUTO_DISPLAY_BUFFER 0xFFFFF000
|
|
#define FACE_AUTO_RESTORE_BUFFER 0xFFFFFF00
|
|
#define FACE_NO_RESTORE_BUFFER 0xFFFFFFF0
|
|
|
|
// FLAGS....
|
|
#define FACE_DESTROY_OVERLAY 0x00000000 // A face may contain a video overlay
|
|
#define FACE_BIGFACE 0x00000001 // A BIGFACE instead of small face
|
|
#define FACE_POTENTIAL_KEYWAIT 0x00000002 // If the option is set, will not stop face until key pressed
|
|
#define FACE_PCTRIGGER_NPC 0x00000004 // This face has to trigger an NPC after being done
|
|
#define FACE_INACTIVE_HANDLED_ELSEWHERE 0x00000008 // This face has been setup and any disable should be done
|
|
// Externally
|
|
#define FACE_TRIGGER_PREBATTLE_INT 0x00000010
|
|
#define FACE_SHOW_WHITE_HILIGHT 0x00000020 // Show highlight around face
|
|
#define FACE_FORCE_SMALL 0x00000040 // force to small face
|
|
#define FACE_MODAL 0x00000080 // make game modal
|
|
#define FACE_MAKEACTIVE_ONCE_DONE 0x00000100
|
|
#define FACE_SHOW_MOVING_HILIGHT 0x00000200
|
|
#define FACE_REDRAW_WHOLE_FACE_NEXT_FRAME 0x00000400 // Redraw the complete face next frame
|
|
|
|
#define FACE_DRAW_TEXT_OVER 2
|
|
#define FACE_ERASE_TEXT_OVER 1
|
|
#define FACE_NO_TEXT_OVER 0
|
|
|
|
|
|
// duration for talking
|
|
#define FINAL_TALKING_DURATION 2000
|
|
|
|
typedef struct audio_gap AUDIO_GAP;
|
|
|
|
typedef struct
|
|
{
|
|
// This is a structure that will contain data about the gaps in a particular
|
|
// wave file
|
|
|
|
UINT32 size; /* the number of entries in the list of AUDIO_GAPs itself*/
|
|
UINT32 current_time;
|
|
// Pointer to head and current entry of gap list
|
|
AUDIO_GAP *pHead;
|
|
AUDIO_GAP *pCurrent;
|
|
|
|
BOOLEAN audio_gap_active;
|
|
|
|
} AudioGapList;
|
|
|
|
|
|
typedef struct
|
|
{
|
|
UINT32 uiFlags; // Basic flags
|
|
INT32 iID;
|
|
BOOLEAN fAllocated; //Allocated or not
|
|
BOOLEAN fTalking; //Set to true if face is talking ( can be sitting for user input to esc )
|
|
BOOLEAN fAnimatingTalking; // Set if the face is animating right now
|
|
BOOLEAN fDisabled; // Not active
|
|
BOOLEAN fValidSpeech;
|
|
BOOLEAN fStartFrame; // Flag for the first start frame
|
|
BOOLEAN fInvalidAnim;
|
|
|
|
UINT32 uiTalkingDuration; // A delay based on text length for how long to talk if no speech
|
|
UINT32 uiTalkingTimer; // A timer to handle delay when no speech file
|
|
UINT32 uiTalkingFromVeryBeginningTimer;// Timer from very beginning of talking...
|
|
|
|
BOOLEAN fFinishTalking; // A flag to indicate we want to delay after speech done
|
|
|
|
INT32 iVideoOverlay; // Value for video overlay ( not used too much )
|
|
|
|
UINT32 uiSoundID; // Sound ID if one being played
|
|
|
|
UINT32 uiSound1ID; // anv: snitch
|
|
UINT32 uiSound2ID;
|
|
UINT32 uiSound3ID;
|
|
|
|
UINT8 ubSoldierID; // SoldierID if one specified
|
|
UINT8 ubCharacterNum; // Profile ID num
|
|
|
|
UINT16 usFaceX; // X location to render face
|
|
UINT16 usFaceY; // Y location to render face
|
|
UINT16 usFaceWidth;
|
|
UINT16 usFaceHeight;
|
|
UINT32 uiAutoDisplayBuffer; // Display buffer for face
|
|
UINT32 uiAutoRestoreBuffer; // Restore buffer
|
|
BOOLEAN fAutoRestoreBuffer; // Flag to indicate our own restorebuffer or not
|
|
BOOLEAN fAutoDisplayBuffer; // Flag to indicate our own display buffer or not
|
|
BOOLEAN fDisplayTextOver; // Boolean indicating to display text on face
|
|
BOOLEAN fOldDisplayTextOver; // OLD Boolean indicating to display text on face
|
|
BOOLEAN fCanHandleInactiveNow;
|
|
wchar_t zDisplayText[ 30 ]; // String of text that can be displayed
|
|
|
|
UINT16 usEyesX;
|
|
UINT16 usEyesY;
|
|
UINT16 usEyesOffsetX;
|
|
UINT16 usEyesOffsetY;
|
|
|
|
UINT16 usEyesWidth;
|
|
UINT16 usEyesHeight;
|
|
|
|
UINT16 usMouthX;
|
|
UINT16 usMouthY;
|
|
UINT16 usMouthOffsetX;
|
|
UINT16 usMouthOffsetY;
|
|
UINT16 usMouthWidth;
|
|
UINT16 usMouthHeight;
|
|
|
|
UINT16 sEyeFrame;
|
|
INT8 ubEyeWait;
|
|
UINT32 uiEyelast;
|
|
UINT32 uiEyeDelay;
|
|
UINT32 uiBlinkFrequency;
|
|
UINT32 uiExpressionFrequency;
|
|
UINT32 uiStopOverlayTimer;
|
|
|
|
UINT8 ubExpression;
|
|
|
|
INT8 bOldSoldierLife;
|
|
INT16 bOldActionPoints;
|
|
BOOLEAN fOldHandleUIHatch;
|
|
BOOLEAN fOldShowHighlight;
|
|
INT8 bOldAssignment;
|
|
INT8 ubOldServiceCount;
|
|
UINT8 ubOldServicePartner;
|
|
BOOLEAN fOldShowMoveHilight;
|
|
|
|
UINT16 sMouthFrame;
|
|
UINT32 uiMouthlast;
|
|
UINT32 uiMouthDelay;
|
|
|
|
UINT32 uiLastBlink;
|
|
UINT32 uiLastExpression;
|
|
|
|
UINT32 uiVideoObject;
|
|
|
|
UINT32 uiUserData1;
|
|
UINT32 uiUserData2;
|
|
|
|
BOOLEAN fCompatibleItems;
|
|
BOOLEAN fOldCompatibleItems;
|
|
BOOLEAN bOldStealthMode;
|
|
INT8 bOldOppCnt;
|
|
|
|
AudioGapList GapList;
|
|
|
|
} FACETYPE;
|
|
|
|
// GLOBAL FOR FACES LISTING
|
|
extern FACETYPE gFacesData[ NUM_FACE_SLOTS ];
|
|
|
|
// FACE HANDLING
|
|
//
|
|
// Faces are done like this: Call
|
|
INT32 InitFace( UINT8 usMercProfileID, UINT8 ubSoldierID, UINT32 uiInitFlags );
|
|
// The first parameter is the profile ID and the second is the soldier ID ( which for most cases
|
|
// will be NOBODY if the face is not created from a SOLDIERTYPE )
|
|
// This function allocates a slot in the table for the face, loads it's STI file, sets some
|
|
// values for X,Y locations of eyes from the profile. Does not mkae the face visible or anything like that
|
|
|
|
// INternal init face, called if you don;t want to give a profile ID ( send NO_PROFILE ) for ID
|
|
INT32 InternalInitFace( UINT8 usMercProfileID, UINT8 ubSoldierID, UINT32 uiInitFlags, INT32 iFaceFileID, UINT32 uiBlinkFrequency, UINT32 uiExpressionFrequency );
|
|
|
|
|
|
// Removes the face from the internal table, deletes any memory allocated if any.
|
|
void DeleteFace( INT32 iFaceIndex );
|
|
|
|
// IF you want to setup the face for automatic eye blinking, mouth movement, you need to call
|
|
void SetAutoFaceActive( UINT32 uiDisplayBuffer, UINT32 uiRestoreBuffer, INT32 iFaceIndex , UINT16 usFaceX, UINT16 usFaceY );
|
|
// The first paramter is the display buffer you wish the face to be rendered on. The second is the
|
|
// Internal savebuffer which is used to facilitate the rendering of only things which have changed when
|
|
// blinking. IF the value of FACE_AUTO_RESTORE_BUFFER is given, the system will allocate it's own memory for
|
|
// a saved buffer and will delete it when finished with it. This function also takes an XY location
|
|
|
|
// Same as above, yet used mostly internally. Is compatible with the fact that a soldier profile ID is not required...
|
|
void InternalSetAutoFaceActive( UINT32 uiDisplayBuffer, UINT32 uiRestoreBuffer, INT32 iFaceIndex , UINT16 usFaceX, UINT16 usFaceY, UINT16 usEyesX, UINT16 usEyesY, UINT16 usMouthX, UINT16 usMouthY );
|
|
|
|
|
|
// To begin rendering of the face sprite, call this function once:
|
|
BOOLEAN RenderAutoFace( INT32 iFaceIndex );
|
|
// This will draw the face into it's saved buffer and then display it on the display buffer. If the display
|
|
// buffer given is FRAME_BUFFER, the regions will automatically be dirtied, so no calls to InvalidateRegion()
|
|
// should be nessesary.
|
|
|
|
// If you want to setup the face to talking, ( most times this call is done in JA2 by other functions, not
|
|
//directly), you call
|
|
BOOLEAN SetFaceTalking( INT32 iFaceIndex, CHAR8 *zSoundFile, STR16 zTextString, UINT32 usRate, UINT32 ubVolume, UINT32 ubLoops, UINT32 uiPan );
|
|
// This function will setup appropriate face data and begin the speech process. It can fail if the sound
|
|
//cannot be played for any reason.
|
|
|
|
BOOLEAN SetFaceTalkingMultipleSounds( INT32 iFaceIndex, CHAR8 zSoundFiles[][64], UINT8 ubMaxSoundsCount, STR16 zTextString, UINT32 usRate, UINT32 ubVolume, UINT32 ubLoops, UINT32 uiPan );
|
|
|
|
// Set some face talking flags without need to play sound
|
|
BOOLEAN ExternSetFaceTalking( INT32 iFaceIndex, UINT32 uiSoundID );
|
|
|
|
// Once this is done, this function must be called overy gameloop that you want to handle the sprite:
|
|
void HandleAutoFaces( );
|
|
// This will handle all faces set to be auto mamaged by SetAutoFaceActive(). What is does is determines
|
|
// the best mouth and eye graphic to use. It then renders only the rects nessessary into the display buffer.
|
|
|
|
// If you need to shutoff the face from talking, use the function
|
|
void ShutupaYoFace( INT32 iFaceIndex );
|
|
void InternalShutupaYoFace( INT32 iFaceIndex, BOOLEAN fForce );
|
|
|
|
// This can be used to times when you need process the user hitting <ESC> to cancel the speech, etc. It will
|
|
// shutoff any playing sound sample
|
|
|
|
// If you still want the face in moemory but want to stop if from being displayed, or handled call
|
|
void SetAutoFaceInActive( INT32 iFaceIndex );
|
|
|
|
BOOLEAN SetCamoFace(SOLDIERTYPE * pSoldier);
|
|
|
|
// To set all currently allocated faces to either active or incactive, call these
|
|
void SetAllAutoFacesInactive( );
|
|
|
|
// To render an allocated face but one that is indipendent of it's active status, ant does not
|
|
// require eye blinking or mouth movements, call
|
|
BOOLEAN ExternRenderFace( UINT32 uiBuffer, INT32 iFaceIndex, INT16 sX, INT16 sY );
|
|
|
|
// FUnctions usually not needed for most uses, but give a finer control over rendering if needed
|
|
void BlinkAutoFace( INT32 iFaceIndex );
|
|
void MouthAutoFace( INT32 iFaceIndex );
|
|
void HandleTalkingAutoFace( INT32 iFaceIndex );
|
|
void HandleTalkingAutoFaces( );
|
|
|
|
|
|
|
|
|
|
// Same Functions but taking soldier ID first to get profile ID
|
|
INT32 InitSoldierFace( SOLDIERTYPE *pSoldier );
|
|
void DeleteSoldierFace( SOLDIERTYPE *pSoldier );
|
|
void SetAutoFaceActiveFromSoldier( UINT32 uiDisplayBuffer, UINT32 uiRestoreBuffer, UINT8 ubSoldierID , UINT16 usFaceX, UINT16 usFaceY );
|
|
void SetAutoFaceInActiveFromSoldier( UINT8 ubSoldierID );
|
|
BOOLEAN RenderAutoFaceFromSoldier( UINT8 ubSoldierID );
|
|
BOOLEAN ExternRenderFaceFromSoldier( UINT32 uiBuffer, UINT8 ubSoldierID, INT16 sX, INT16 sY );
|
|
|
|
|
|
|
|
//legion2 Jazz
|
|
extern void FacesSmalllegion ();
|
|
extern void RecountFaces(void);
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|