src/ai/api/ai_group.cpp
author truebrain
Mon, 30 Jun 2008 12:15:10 +0000
branchnoai
changeset 11097 6967c52c78c5
parent 11057 188a9ca6d8de
permissions -rw-r--r--
(svn r13654) [NoAI] -Change [API CHANGE]: moved AISetting::SetCommandDelay to AIController::SetCommandDelay, as it was silly to have it in a seperate class, while it was part of the controller.
/* $Id$ */

/** @file ai_group.cpp Implementation of AIGroup. */

#include "ai_group.hpp"
#include "ai_vehicle.hpp"
#include "ai_engine.hpp"
#include "../../openttd.h"
#include "../../player_func.h"
#include "../../group.h"
#include "../../string_func.h"
#include "../../strings_func.h"
#include "../../core/alloc_func.hpp"
#include "../../command_func.h"
#include "../../autoreplace_func.h"
#include "table/strings.h"

/* static */ bool AIGroup::IsValidGroup(GroupID group_id)
{
	return ::IsValidGroupID(group_id) && ::GetGroup(group_id)->owner == _current_player;
}

/* static */ AIGroup::GroupID AIGroup::CreateGroup(AIVehicle::VehicleType vehicle_type)
{
	/* Reset the internal NewGroupID in case we are in TestMode */
	AIObject::SetNewGroupID(0);

	bool ret = AIObject::DoCommand(0, (::VehicleType)vehicle_type, 0, CMD_CREATE_GROUP);
	return ret ? (GroupID)AIObject::GetNewGroupID() : INVALID_GROUP;
}

/* static */ bool AIGroup::DeleteGroup(GroupID group_id)
{
	EnforcePrecondition(false, IsValidGroup(group_id));

	return AIObject::DoCommand(0, group_id, 0, CMD_DELETE_GROUP);
}

/* static */ AIVehicle::VehicleType AIGroup::GetVehicleType(GroupID group_id)
{
	if (!IsValidGroup(group_id)) return AIVehicle::VEHICLE_INVALID;

	return (AIVehicle::VehicleType)((::VehicleType)::GetGroup(group_id)->vehicle_type);
}

/* static */ bool AIGroup::SetName(GroupID group_id, const char *name)
{
	EnforcePrecondition(false, IsValidGroup(group_id));
	EnforcePrecondition(false, !::StrEmpty(name));

	_cmd_text = name;
	return AIObject::DoCommand(0, group_id, 0, CMD_RENAME_GROUP);
}

/* static */ char *AIGroup::GetName(GroupID group_id)
{
	if (!IsValidGroup(group_id)) return NULL;

	static const int len = 64;
	char *group_name = MallocT<char>(len);

	::SetDParam(0, group_id);
	::GetString(group_name, STR_GROUP_NAME, &group_name[len - 1]);
	return group_name;
}

/* static */ bool AIGroup::EnableAutoReplaceProtection(GroupID group_id, bool enable)
{
	EnforcePrecondition(false, IsValidGroup(group_id));

	return AIObject::DoCommand(0, group_id, enable ? 1 : 0, CMD_SET_GROUP_REPLACE_PROTECTION);
}

/* static */ bool AIGroup::GetAutoReplaceProtection(GroupID group_id)
{
	if (!IsValidGroup(group_id)) return false;

	return ::GetGroup(group_id)->replace_protection;
}

/* static */ int32 AIGroup::GetNumEngines(GroupID group_id, EngineID engine_id)
{
	if (!IsValidGroup(group_id) && group_id != DEFAULT_GROUP && group_id != ALL_GROUP) return -1;

	return GetGroupNumEngines(_current_player, group_id, engine_id);
}

/* static */ bool AIGroup::MoveVehicle(GroupID group_id, VehicleID vehicle_id)
{
	EnforcePrecondition(false, IsValidGroup(group_id) || group_id == DEFAULT_GROUP);
	EnforcePrecondition(false, AIVehicle::IsValidVehicle(vehicle_id));

	return AIObject::DoCommand(0, group_id, vehicle_id, CMD_ADD_VEHICLE_GROUP);
}

/* static */ bool AIGroup::SetAutoReplace(GroupID group_id, EngineID engine_id_old, EngineID engine_id_new)
{
	EnforcePrecondition(false, IsValidGroup(group_id) || group_id == ALL_GROUP);
	EnforcePrecondition(false, AIEngine::IsValidEngine(engine_id_new));

	return AIObject::DoCommand(0, 3 | (group_id << 16), (engine_id_new << 16) | engine_id_old, CMD_SET_AUTOREPLACE);
}

/* static */ EngineID AIGroup::GetEngineReplacement(GroupID group_id, EngineID engine_id)
{
	if (!IsValidGroup(group_id) && group_id != ALL_GROUP) return ::INVALID_ENGINE;

	return ::EngineReplacementForPlayer(GetPlayer(_current_player), engine_id, group_id);
}

/* static */ bool AIGroup::StopAutoReplace(GroupID group_id, EngineID engine_id)
{
	EnforcePrecondition(false, IsValidGroup(group_id) || group_id == ALL_GROUP);

	return AIObject::DoCommand(0, 3 | (group_id << 16), (::INVALID_ENGINE << 16) | engine_id, CMD_SET_AUTOREPLACE);
}