Files
source/Laptop/PostalService.h
T
Wanne 826340978a - Bugfix: If user changes shipping destination location in "ShippingDestinations.xml", Bobby Ray was still under construction if the "original" shipping destination was not under players control.
This occured because of hardcoded DRASSEN AIRPORT COORDINATES (BOBBYR_SHIPPING_DEST_SECTOR_X, BOBBYR_SHIPPING_DEST_SECTOR_Y, BOBBYR_SHIPPING_DEST_SECTOR_Z)

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@3102 3b4a5df2-a311-0410-b5c6-a8a6f20db521
2009-07-11 12:01:26 +00:00

257 lines
8.6 KiB
C++

#ifndef __POSTAL_SERVICE_H
#define __POSTAL_SERVICE_H
#include "SaveLoadMap.h"
#include "Structure Wrap.h"
#include "Tactical Save.h"
#include "laptopsave.h"
#include "postalservice.h"
#include "isometric utils.h"
#include "debug.h"
#include "game event hook.h"
#include "game events.h"
#include <list>
#include <string>
#include <iostream>
using namespace std;
#define MAX_DEST_NAME_LENGTH 32
#define MAX_DELIVERYMETHOD_DESC_LENGTH 32
#define MAX_DESTINATIONS 255
#define MAX_SHIPMENTS 255
//////////////////////////////////////////////
class CPostalService;
typedef CPostalService& RefToCPostalService;
typedef CPostalService* PCPostalService;
//////////////////////////////////////////////
typedef struct
{
UINT16 usID;
UINT32 uiIndex; // uiIndex is used as an ID number in external game data
UINT8 ubMapY;
UINT8 ubMapX;
UINT8 ubMapZ;
INT16 sGridNo;
wstring wstrName;
} DestinationStruct;
typedef DestinationStruct& RefToDestinationStruct;
typedef DestinationStruct* PDestinationStruct;
typedef list<DestinationStruct> DestinationList;
typedef list<DestinationStruct>& RefToDestinationList;
typedef DestinationList::const_iterator& RefToDestinationListIterator;
inline RefToDestinationStruct DESTINATION(RefToDestinationListIterator dli)
{
return ( (RefToDestinationStruct) *dli );
}
inline BOOLEAN DESTINATION_ID_GREATER(RefToDestinationStruct d1, RefToDestinationStruct d2)
{
return (d1.usID > d2.usID);
}
#define DESTINATION_LIST_DESCENDING DESTINATION_ID_GREATER
inline BOOLEAN DESTINATION_ID_LOWER(RefToDestinationStruct d1, RefToDestinationStruct d2)
{
return (d1.usID < d2.usID);
}
#define DESTINATION_LIST_ASCENDING DESTINATION_ID_LOWER
inline BOOLEAN DESTINATION_ID_EQUAL(RefToDestinationStruct d1, RefToDestinationStruct d2)
{
return (d1.usID == d2.usID);
}
//////////////////////////////////////////////////////////////
typedef struct
{
UINT8 ubParentDeliveryMethodIndex;
UINT16 usDestinationFee;
INT8 bDaysAhead;
}DestinationDeliveryInfoStruct;
typedef DestinationDeliveryInfoStruct& RefToDestinationDeliveryInfoStruct;
typedef DestinationDeliveryInfoStruct* PDestinationDeliveryInfoStruct;
typedef vector<DestinationDeliveryInfoStruct> DestinationDeliveryInfoTable;
typedef DestinationDeliveryInfoTable* PDestinationDeliveryInfoTable;
typedef DestinationDeliveryInfoTable& RefToDestinationDeliveryInfoTable;
typedef DestinationDeliveryInfoTable::iterator DestinationDeliveryInfoTableIterator;
typedef DestinationDeliveryInfoTableIterator& RefToDestinationDeliveryInfoTableIterator;
typedef struct
{
wstring wstrDescription;
PDestinationDeliveryInfoTable pDestinationDeliveryInfos;
} DeliveryMethodStruct;
typedef DeliveryMethodStruct& RefToDeliveryMethodStruct;
typedef DeliveryMethodStruct* PDeliveryMethodStruct;
typedef vector<DeliveryMethodStruct> DeliveryMethodTable;
typedef DeliveryMethodTable& RefToDeliveryMethodTable;
/////////////////////////////////////////////////////////////
typedef struct
{
UINT16 usItemIndex;
UINT8 ubNumber;
INT8 bItemQuality;
} ShipmentPackageStruct;
typedef ShipmentPackageStruct& RefToShipmentPackageStruct;
typedef ShipmentPackageStruct* PShipmentPackageStruct;
typedef vector<ShipmentPackageStruct> ShipmentPackageList;
typedef ShipmentPackageList& RefToShipmentPackageList;
typedef ShipmentPackageList::iterator& RefToShipmentPackageListIterator;
typedef enum
{
SHIPMENT_STATIONARY=0,
SHIPMENT_INTRANSIT,
SHIPMENT_CANCEL_DELIVERY
} SHIPMENT_STATUS;
typedef struct
{
UINT16 usID;
SHIPMENT_STATUS ShipmentStatus;
ShipmentPackageList ShipmentPackages;
PDestinationStruct pDestination;
PDestinationDeliveryInfoStruct pDestinationDeliveryInfo;
INT16 sSenderID; // For now, two senders exist: Bobby Ray(0) and John Kulba(1)
INT16 sReceiverID; // Unused for now, but reserved for future projects
UINT32 uiOrderDate;
} ShipmentStruct;
typedef ShipmentStruct& RefToShipmentStruct;
typedef ShipmentStruct* PShipmentStruct;
typedef list<ShipmentStruct> ShipmentList;
typedef ShipmentList* PShipmentList;
typedef ShipmentList& RefToShipmentList;
typedef ShipmentList::iterator ShipmentListIterator;
typedef ShipmentListIterator& RefToShipmentListIterator;
typedef struct
{
UINT32 uiNumberOfShipments;
UINT32 uiShipmentDataSize;
UINT32 uiPackageDataSize;
}ShipmentListSaveFileDataHeaderStruct;
typedef ShipmentListSaveFileDataHeaderStruct* PShipmentListSaveFileDataHeaderStruct;
typedef struct
{
UINT16 usID;
SHIPMENT_STATUS ShipmentStatus;
UINT32 uiNumberOfPackages;
UINT16 usDestinationID;
UINT8 ubDeliveryMethodIndex;
INT16 sSenderID;
INT16 sReceiverID;
UINT32 uiOrderDate;
} ShipmentSaveFileDataStruct;
typedef ShipmentSaveFileDataStruct* PShipmentSaveFileDataStruct;
inline BOOLEAN SHIPMENT_ID_LOWER(RefToShipmentStruct s1, RefToShipmentStruct s2)
{
return (s1.usID < s2.usID);
}
#define SHIPMENT_LIST_ASCENDING SHIPMENT_ID_LOWER
inline RefToShipmentStruct SHIPMENT(RefToShipmentListIterator sli)
{
return ( (RefToShipmentStruct) *sli );
}
////////////////////////////////////////////////////////////////
class CShipmentManipulator
{
friend CPostalService;
public:
INT16 GetSenderID(void);
RefToDestinationStruct GetDestination(void) const;
void ContinueCallbackChain(BOOLEAN fContinue);
void CancelDelivery(void);
CShipmentManipulator(PCPostalService Owner, PShipmentStruct Shipment);
private:
PCPostalService _PostalService;
PShipmentStruct _Shipment;
BOOLEAN _fContinueCallbackChain;
};
typedef CShipmentManipulator& RefToCShipmentManipulator;
typedef CShipmentManipulator* PCShipmentManipulator;
typedef void (*PtrToDeliveryCallbackFunc)(RefToCShipmentManipulator ShipmentManipulator);
typedef struct
{
INT16 sSenderID;
PtrToDeliveryCallbackFunc DeliveryCallbackFunc;
} DeliveryCallbackDataStruct;
typedef DeliveryCallbackDataStruct& RefToDeliveryCallbackDataStruct;
typedef vector<DeliveryCallbackDataStruct> DeliveryCallbackDataList;
typedef DeliveryCallbackDataList& RefToDeliveryCallbackDataList;
typedef DeliveryCallbackDataList::iterator DeliveryCallbackDataListIterator;
typedef DeliveryCallbackDataListIterator& RefToDeliveryCallbackDataListIterator;
////////////////////////////////////////////////////////////////
class CPostalService
{
friend BOOLEAN ExecuteStrategicEvent( STRATEGICEVENT *pEvent );
friend CShipmentManipulator;
public:
// Shipment management
UINT16 CreateNewShipment(UINT16 usDestinationID, UINT8 ubDeliveryMethodIndex, INT16 sSenderID);
BOOLEAN AddPackageToShipment(UINT16 usShipmentID, UINT16 usItemIndex, UINT8 ubNumber, INT8 bItemQuality);
BOOLEAN SendShipment(UINT16 usShipmentID);
BOOLEAN DeliverShipment(UINT16 usShipmentID);
BOOLEAN DeliverShipmentForMultiplayer(UINT16 usShipmentID);
BOOLEAN RegisterDeliveryCallback(INT16 sSenderID, PtrToDeliveryCallbackFunc DeliveryCallbackFunc);
// Interfaces
BOOLEAN LoadShipmentListFromSaveGameFile(HWFILE hFile);
BOOLEAN SaveShipmentListToSaveGameFile(HWFILE hFile);
// Shipment utility functions
UINT16 GetShipmentCount(SHIPMENT_STATUS TargetedShipmentStatus);
RefToShipmentList LookupShipmentList(void) const;
// Destination management
UINT16 AddDestination(UINT32 uiIndex, UINT8 ubMapX, UINT8 ubMapY, UINT8 ubMapZ, INT16 sGridNo, STR16 pszName );
UINT16 RemoveDestination(UINT16 usDestinationID);
RefToDestinationStruct GetDestination(UINT16 usDestinationID) const;
RefToDestinationList LookupDestinationList(void) const;
// WANNE:
BOOLEAN IsSectorAShipmentSector(UINT8 ubMapX, UINT8 ubMapY, UINT8 ubMapZ);
// Delivery method management
UINT8 AddDeliveryMethod(STR16 pszDescription);
UINT16 SetDestinationDeliveryInfo(UINT8 ubDeliveryMethodIndex, UINT32 uiDestinationIndex, UINT16 usDestinationFee, INT8 bDaysAhead);
UINT16 GetDestinationFee(UINT8 ubDeliveryMethodIndex, UINT16 usDestinationID);
RefToDeliveryMethodStruct GetDeliveryMethod(UINT8 ubDeliveryMethodIndex) const;
void Clear();
CPostalService();
private:
ShipmentList _Shipments;
vector<BOOLEAN> _UsedShipmentIDList;
DeliveryCallbackDataList _DeliveryCallbacks;
static OBJECTTYPE tempObject;
// All instances share the same set of destinations...
static DestinationList _Destinations;
static vector<BOOLEAN> _UsedDestinationIDList;
RefToDestinationStruct _GetDestination(UINT16 usDestinationID);
// ...but they may have different delivery methods available so these are managed individually
DeliveryMethodTable _DeliveryMethods;
RefToDestinationDeliveryInfoStruct _GetDestinationDeliveryInfo(UINT8 ubDeliveryMethodIndex, UINT16 usDestinationID);
protected:
};
#endif