mirror of
https://github.com/1dot13/source.git
synced 2026-07-22 13:40:22 +02:00
git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@7297 3b4a5df2-a311-0410-b5c6-a8a6f20db521
323 lines
7.4 KiB
C++
323 lines
7.4 KiB
C++
#ifndef __DYNAMICDIALOGUEWIDGET_H
|
|
#define __DYNAMICDIALOGUEWIDGET_H
|
|
|
|
/**
|
|
* @file
|
|
* @author Flugente (bears-pit.com)
|
|
* @brief This file contains declarations of classes and functions used for dynamic dialogue
|
|
*/
|
|
|
|
// Flugente: stuff
|
|
#include "Morale.h"
|
|
#include "DropDown.h"
|
|
#include "DynamicDialogue.h"
|
|
|
|
#define MYBOX_TEXT_MAXWIDTH 200
|
|
#define MYBOX_FACE_OFFSET 53
|
|
|
|
/*
|
|
* A class for dynamic dialogue boxes
|
|
* These boxes consist of a box with a merc's face in it, and text right next to it
|
|
*/
|
|
class DDBox : public WidgetBase
|
|
{
|
|
public:
|
|
DDBox( UINT8 aID );
|
|
|
|
/*
|
|
* Create a Dropdown with upper left coordinates
|
|
*/
|
|
void Create( UINT16 sX, UINT16 sY );
|
|
|
|
/*
|
|
* Destroy Dropdown, for example once a website isn't displayed anymore
|
|
*/
|
|
void Destroy( );
|
|
|
|
/*
|
|
* Display DropDownBase. Use this when refreshing
|
|
*/
|
|
void Display( );
|
|
|
|
void Refresh( );
|
|
|
|
// we need to redo these functions, as the position can change dynamically
|
|
virtual UINT16 GetY( );
|
|
virtual UINT16 GetY_Text( );
|
|
|
|
/*
|
|
* Set help text decribing what can be selected
|
|
*/
|
|
void SetText( STR16 aText )
|
|
{
|
|
swprintf( mText, L"" );
|
|
wcscat( mText, aText );
|
|
}
|
|
|
|
/*
|
|
* Get width of entire DropDownBase
|
|
*/
|
|
UINT16 GetTotalWidth( ) { return musWidth; }
|
|
|
|
/*
|
|
* Get right x coordinate
|
|
*/
|
|
UINT16 GetLastX( ) { return GetX( ) + GetTotalWidth( ); }
|
|
|
|
BOOLEAN IsInit( ) { return mfInit; }
|
|
|
|
/*
|
|
* Are we displayed?
|
|
*/
|
|
BOOLEAN IsDisplayed( ) { return mfDisplayed; }
|
|
|
|
void SetEndTime( UINT32 aVal ) { musEndTime = aVal; }
|
|
UINT32 GetEndTime( ) { return musEndTime; }
|
|
|
|
void SetStartTime( UINT32 aVal ) { musCreationTime = aVal; }
|
|
UINT32 GetStartTime( ) { return musCreationTime; }
|
|
|
|
UINT8 GetID( ) { return musID; }
|
|
|
|
void SetEvent( DynamicOpinionSpeechEvent& aEvent ) { mEvent = aEvent; }
|
|
|
|
void ResetCreationTime( );
|
|
|
|
private:
|
|
// declare but don't define
|
|
DDBox( DDBox const& );
|
|
void operator=(DDBox const&);
|
|
|
|
/*
|
|
* Initialise variables. Called after each creationm which allows moving a dropdown
|
|
*/
|
|
void Init( UINT16 sX, UINT16 sY );
|
|
|
|
void DrawTopEntry( );
|
|
|
|
private:
|
|
UINT16 musHeight;
|
|
UINT16 musWidth;
|
|
|
|
UINT16 musFontHeight;
|
|
|
|
BOOLEAN mfInit;
|
|
BOOLEAN mfDisplayed;
|
|
BOOLEAN mfFaceImageExists;
|
|
|
|
CHAR16 mText[500];
|
|
|
|
UINT32 musCreationTime;
|
|
UINT32 musEndTime;
|
|
|
|
UINT8 musID;
|
|
|
|
UINT32 musFaceImage;
|
|
|
|
DynamicOpinionSpeechEvent mEvent;
|
|
};
|
|
|
|
BOOLEAN InitMyBoxes( );
|
|
|
|
DDBox* GetDDBox( UINT8 aID );
|
|
BOOLEAN RemoveDDBox( UINT8 aID );
|
|
|
|
void RefreshBoxes( );
|
|
void DelayBoxDestruction( UINT32 aVal );
|
|
void DelayBoxDestructionBy( UINT32 aVal );
|
|
|
|
|
|
class IMPDialogueChooseBox : public WidgetBase
|
|
{
|
|
public:
|
|
IMPDialogueChooseBox( );
|
|
|
|
/*
|
|
* Create a Dropdown with upper left coordinates
|
|
*/
|
|
void Create( UINT16 sX, UINT16 sY );
|
|
|
|
/*
|
|
* Destroy Dropdown, for example once a website isn't displayed anymore
|
|
*/
|
|
void Destroy( );
|
|
|
|
/*
|
|
* Display DropDownBase. Use this when refreshing
|
|
*/
|
|
void Display( );
|
|
|
|
void Refresh( );
|
|
|
|
// internal callback types
|
|
enum {
|
|
DROPDOWN_REGION,
|
|
};
|
|
|
|
/*
|
|
* Set the content of a dropdown. Each entry consists of an INT16 key, by which you can later identify which entry was selected, and a STR16 that will be displayed.
|
|
* There can be multiple instances of the same key or name.
|
|
*/
|
|
void SetEntries( std::vector<std::pair<INT16, STR16> >& arEntryVec ) { mEntryVector = arEntryVec; }
|
|
|
|
/*
|
|
* Set help text decribing what can be selected
|
|
*/
|
|
void SetText( STR16 aText )
|
|
{
|
|
swprintf( mText, L"" );
|
|
wcscat( mText, aText );
|
|
}
|
|
|
|
/*
|
|
* Set help text decribing what can be selected
|
|
*/
|
|
void SetHelpText( STR16 aText ) { swprintf( mHelpText, L"" ); wcscat( mHelpText, aText ); }
|
|
|
|
/*
|
|
* Get key of selected entry
|
|
*/
|
|
INT16 GetSelectedEntryKey( ) { return mEntryVector[mSelectedEntry].first; }
|
|
|
|
/*
|
|
* Get width of entire DropDownBase
|
|
*/
|
|
UINT16 GetTotalWidth( ) { return musWidth; }
|
|
|
|
/*
|
|
* Get right x coordinate
|
|
*/
|
|
UINT16 GetLastX( ) { return GetX( ) + GetTotalWidth( ); }
|
|
|
|
BOOLEAN IsInit( ) { return mfInit; }
|
|
|
|
/*
|
|
* Are we displayed?
|
|
*/
|
|
BOOLEAN IsDisplayed( ) { return mfDisplayed; }
|
|
|
|
/*
|
|
* Do we have data to display?
|
|
*/
|
|
BOOLEAN HasEntries( ) { return !mEntryVector.empty( ); }
|
|
|
|
void SelectDropDownRegionCallBack( MOUSE_REGION * pRegion, INT32 iReason );
|
|
|
|
/*
|
|
* This function is implemented again in DropDownTemplate
|
|
*/
|
|
virtual MOUSE_CALLBACK CallBackWrapper( void* pt2Object, UINT8 arg, void( *pt2Function )(MOUSE_REGION * pRegion, INT32 iReason) ) {
|
|
return Dummyfunc;
|
|
}
|
|
|
|
void SetEndTime( UINT32 aVal ) { musEndTime = aVal; }
|
|
UINT32 GetEndTime( ) { return musEndTime; }
|
|
|
|
void SetStartTime( UINT32 aVal ) { musCreationTime = aVal; }
|
|
UINT32 GetStartTime( ) { return musCreationTime; }
|
|
|
|
void SetEvent( DynamicOpinionSpeechEvent& aEvent ) { mEvent = aEvent; }
|
|
|
|
void ResetCreationTime( );
|
|
|
|
UINT32 GetTimeLeft( ) { return musEndTime - musCreationTime; }
|
|
|
|
private:
|
|
// declare but don't define
|
|
IMPDialogueChooseBox( IMPDialogueChooseBox const& );
|
|
void operator=(IMPDialogueChooseBox const&);
|
|
|
|
/*
|
|
* Initialise variables. Called after each creationm which allows moving a dropdown
|
|
*/
|
|
void Init( UINT16 sX, UINT16 sY );
|
|
|
|
/*
|
|
* This dummy is needed internally and does nothing when called
|
|
*/
|
|
static void Dummyfunc( MOUSE_REGION * pRegion, INT32 iReason ) {}
|
|
|
|
/*
|
|
* Stuff to do once the time is up
|
|
*/
|
|
void TimeOut( );
|
|
|
|
void DrawTopEntry( );
|
|
|
|
private:
|
|
UINT16 musHeight;
|
|
UINT16 musWidth;
|
|
|
|
UINT16 musFontHeight;
|
|
|
|
BOOLEAN mfInit;
|
|
BOOLEAN mfDisplayed;
|
|
|
|
BOOLEAN mfMouseRegionsCreated;
|
|
|
|
// a mouse region for every possible choice
|
|
MOUSE_REGION mChoiceRegion[DOST_CHOICE_MAX];
|
|
BOOLEAN mChoiceRegionDefined[DOST_CHOICE_MAX];
|
|
|
|
std::vector<std::pair<INT16, STR16> > mEntryVector;
|
|
|
|
CHAR16 mHelpText[200];
|
|
|
|
UINT8 mSelectedEntry; // keeps track of the currently selected city
|
|
|
|
CHAR16 mText[500];
|
|
|
|
UINT32 musCreationTime;
|
|
UINT32 musEndTime;
|
|
|
|
DynamicOpinionSpeechEvent mEvent;
|
|
};
|
|
|
|
class IMPDialogueChooseBox_Static : public IMPDialogueChooseBox
|
|
{
|
|
public:
|
|
static IMPDialogueChooseBox_Static& getInstance( )
|
|
{
|
|
static IMPDialogueChooseBox_Static instance; // Guaranteed to be destroyed.
|
|
|
|
// Instantiated on first use.
|
|
return instance;
|
|
}
|
|
|
|
static void SelectRegionDropDown_DropDown( MOUSE_REGION * pRegion, INT32 iReason ) { return static_cast<IMPDialogueChooseBox*>(mpSelf)->SelectDropDownRegionCallBack( pRegion, iReason ); }
|
|
|
|
MOUSE_CALLBACK
|
|
CallBackWrapper( void* pt2Object, UINT8 arg, void( *pt2Function )(MOUSE_REGION * pRegion, INT32 iReason) )
|
|
{
|
|
mpSelf = pt2Object;
|
|
|
|
switch ( arg )
|
|
{
|
|
case DROPDOWN_REGION:
|
|
return &SelectRegionDropDown_DropDown;
|
|
break;
|
|
}
|
|
|
|
return *pt2Function;
|
|
}
|
|
|
|
private:
|
|
static void* mpSelf;
|
|
|
|
private:
|
|
IMPDialogueChooseBox_Static( ) {}; // private constructor, so we cannot create more instances
|
|
|
|
// declare but don't define
|
|
IMPDialogueChooseBox_Static( IMPDialogueChooseBox_Static const& );
|
|
void operator=(IMPDialogueChooseBox_Static const&);
|
|
};
|
|
|
|
// are there still dynamic dialogue boxes active? We use this to check wether we can start new dialogue
|
|
BOOLEAN DynamicDialogueBoxesActive( );
|
|
|
|
// used fo example when we load a game - dialogue has to start anew, so all boxes must be wiped
|
|
void DestroyAllDynamicDialogueBoxes( );
|
|
|
|
|
|
#endif
|