#include "Base.h"
#include "AIMessage.h"
namespace gameplay
{
AIMessage::AIMessage()
: _id(0), _deliveryTime(0), _parameters(NULL), _parameterCount(0), _messageType(MESSAGE_TYPE_CUSTOM), _next(NULL)
{
}
AIMessage::~AIMessage()
{
SAFE_DELETE_ARRAY(_parameters);
}
AIMessage* AIMessage::create(unsigned int id, const char* sender, const char* receiver, unsigned int parameterCount)
{
AIMessage* message = new AIMessage();
message->_id = id;
message->_sender = sender;
message->_receiver = receiver;
message->_parameterCount = parameterCount;
if (parameterCount > 0)
message->_parameters = new AIMessage::Parameter[parameterCount];
return message;
}
void AIMessage::destroy(AIMessage* message)
{
SAFE_DELETE(message);
}
unsigned int AIMessage::getId() const
{
return _id;
}
const char* AIMessage::getSender() const
{
return _sender.c_str();
}
const char* AIMessage::getReceiver() const
{
return _receiver.c_str();
}
double AIMessage::getDeliveryTime() const
{
return _deliveryTime;
}
int AIMessage::getInt(unsigned int index) const
{
GP_ASSERT(index < _parameterCount);
GP_ASSERT(_parameters[index].type == AIMessage::INTEGER);
return _parameters[index].intValue;
}
void AIMessage::setInt(unsigned int index, int value)
{
GP_ASSERT(index < _parameterCount);
clearParameter(index);
_parameters[index].intValue = value;
_parameters[index].type = AIMessage::INTEGER;
}
long AIMessage::getLong(unsigned int index) const
{
GP_ASSERT(index < _parameterCount);
GP_ASSERT(_parameters[index].type == AIMessage::LONG);
return _parameters[index].longValue;
}
void AIMessage::setLong(unsigned int index, long value)
{
GP_ASSERT(index < _parameterCount);
clearParameter(index);
_parameters[index].longValue = value;
_parameters[index].type = AIMessage::LONG;
}
float AIMessage::getFloat(unsigned int index) const
{
GP_ASSERT(index < _parameterCount);
GP_ASSERT(_parameters[index].type == AIMessage::FLOAT);
return _parameters[index].floatValue;
}
void AIMessage::setFloat(unsigned int index, float value)
{
GP_ASSERT(index < _parameterCount);
clearParameter(index);
_parameters[index].floatValue = value;
_parameters[index].type = AIMessage::FLOAT;
}
double AIMessage::getDouble(unsigned int index) const
{
GP_ASSERT(index < _parameterCount);
GP_ASSERT(_parameters[index].type == AIMessage::DOUBLE);
return _parameters[index].doubleValue;
}
void AIMessage::setDouble(unsigned int index, double value)
{
GP_ASSERT(index < _parameterCount);
clearParameter(index);
_parameters[index].doubleValue = value;
_parameters[index].type = AIMessage::DOUBLE;
}
bool AIMessage::getBoolean(unsigned int index) const
{
GP_ASSERT(index < _parameterCount);
GP_ASSERT(_parameters[index].type == AIMessage::BOOLEAN);
return _parameters[index].boolValue;
}
void AIMessage::setBoolean(unsigned int index, bool value)
{
GP_ASSERT(index < _parameterCount);
clearParameter(index);
_parameters[index].boolValue = value;
_parameters[index].type = AIMessage::BOOLEAN;
}
const char* AIMessage::getString(unsigned int index) const
{
GP_ASSERT(index < _parameterCount);
GP_ASSERT(_parameters[index].type == AIMessage::STRING);
return _parameters[index].stringValue;
}
void AIMessage::setString(unsigned int index, const char* value)
{
GP_ASSERT(index < _parameterCount);
GP_ASSERT(value);
clearParameter(index);
// Copy the string into our parameter
size_t len = strlen(value);
char* buffer = new char[len + 1];
strcpy(buffer, value);
_parameters[index].stringValue = buffer;
_parameters[index].type = AIMessage::STRING;
}
unsigned int AIMessage::getParameterCount() const
{
return _parameterCount;
}
AIMessage::ParameterType AIMessage::getParameterType(unsigned int index) const
{
GP_ASSERT(index < _parameterCount);
return _parameters[index].type;
}
void AIMessage::clearParameter(unsigned int index)
{
GP_ASSERT(index < _parameterCount);
_parameters[index].clear();
}
AIMessage::Parameter::Parameter()
: type(UNDEFINED)
{
}
AIMessage::Parameter::~Parameter()
{
clear();
}
void AIMessage::Parameter::clear()
{
switch (type)
{
case AIMessage::STRING:
SAFE_DELETE_ARRAY(stringValue);
break;
}
type = AIMessage::UNDEFINED;
}
}