src/group_cmd.cpp
author truebrain
Mon, 30 Jun 2008 21:31:23 +0000
branchnoai
changeset 11111 1b984dab8cec
parent 11057 188a9ca6d8de
permissions -rw-r--r--
(svn r13669) [NoAI] -Fix: allow clients only to join non-AI controlled companies in multiplayer
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
     1
/* $Id$ */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
     2
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
     3
/** @file group_cmd.cpp Handling of the engine groups */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
     4
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
     5
#include "stdafx.h"
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
     6
#include "openttd.h"
9631
8a2d1c2ceb88 (svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents: 9629
diff changeset
     7
#include "variables.h"
9723
eee46cb39750 (svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents: 9722
diff changeset
     8
#include "command_func.h"
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
     9
#include "saveload.h"
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    10
#include "debug.h"
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    11
#include "group.h"
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    12
#include "train.h"
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    13
#include "aircraft.h"
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    14
#include "vehicle_gui.h"
9723
eee46cb39750 (svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents: 9722
diff changeset
    15
#include "strings_func.h"
eee46cb39750 (svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents: 9722
diff changeset
    16
#include "functions.h"
eee46cb39750 (svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents: 9722
diff changeset
    17
#include "window_func.h"
eee46cb39750 (svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents: 9722
diff changeset
    18
#include "vehicle_func.h"
eee46cb39750 (svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents: 9722
diff changeset
    19
#include "autoreplace_base.h"
eee46cb39750 (svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents: 9722
diff changeset
    20
#include "autoreplace_func.h"
eee46cb39750 (svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents: 9722
diff changeset
    21
#include "string_func.h"
9724
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
    22
#include "player_func.h"
9837
c9ec4f82e0d0 (svn r12503) [NoAI] -Sync: with trunk r12461:12501.
rubidium
parents: 9800
diff changeset
    23
#include "order_func.h"
10142
56ee7da4ad56 (svn r12673) [NoAI] -Sync: with trunk r12596:12672. Note that due to the order rewrite AIOrder.ChangeOrder does currently not work as expected.
rubidium
parents: 9837
diff changeset
    24
#include "oldpool_func.h"
10455
22c441f5adf9 (svn r12997) [NoAI] -Sync: with trunk r12895:12996.
rubidium
parents: 10355
diff changeset
    25
#include "core/alloc_func.hpp"
9724
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
    26
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
    27
#include "table/strings.h"
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    28
11057
188a9ca6d8de (svn r13614) [NoAI] -Add: AIGroup which allows an AI to manage its vehicle in the context of groups.
rubidium
parents: 10455
diff changeset
    29
GroupID _new_group_id;
188a9ca6d8de (svn r13614) [NoAI] -Add: AIGroup which allows an AI to manage its vehicle in the context of groups.
rubidium
parents: 10455
diff changeset
    30
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    31
/**
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    32
 * Update the num engines of a groupID. Decrease the old one and increase the new one
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    33
 * @note called in SetTrainGroupID and UpdateTrainGroupID
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    34
 * @param i     EngineID we have to update
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    35
 * @param old_g index of the old group
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    36
 * @param new_g index of the new group
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    37
 */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    38
static inline void UpdateNumEngineGroup(EngineID i, GroupID old_g, GroupID new_g)
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    39
{
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    40
	if (old_g != new_g) {
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    41
		/* Decrease the num engines of EngineID i of the old group if it's not the default one */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    42
		if (!IsDefaultGroupID(old_g) && IsValidGroupID(old_g)) GetGroup(old_g)->num_engines[i]--;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    43
10249
58810805030e (svn r12781) [NoAI] -Sync: with trunk r12711:12780.
rubidium
parents: 10142
diff changeset
    44
		/* Increase the num engines of EngineID i of the new group if it's not the default one */
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    45
		if (!IsDefaultGroupID(new_g) && IsValidGroupID(new_g)) GetGroup(new_g)->num_engines[i]++;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    46
	}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    47
}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    48
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    49
9694
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9641
diff changeset
    50
DEFINE_OLD_POOL_GENERIC(Group, Group)
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9641
diff changeset
    51
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9641
diff changeset
    52
9724
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
    53
Group::Group(PlayerID owner)
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    54
{
9724
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
    55
	this->owner = owner;
10455
22c441f5adf9 (svn r12997) [NoAI] -Sync: with trunk r12895:12996.
rubidium
parents: 10355
diff changeset
    56
	this->num_engines = CallocT<uint16>(GetEnginePoolSize());
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    57
}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    58
9694
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9641
diff changeset
    59
Group::~Group()
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    60
{
9724
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
    61
	free(this->name);
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
    62
	this->owner = INVALID_PLAYER;
10455
22c441f5adf9 (svn r12997) [NoAI] -Sync: with trunk r12895:12996.
rubidium
parents: 10355
diff changeset
    63
	free(this->num_engines);
9694
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9641
diff changeset
    64
}
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    65
9694
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9641
diff changeset
    66
bool Group::IsValid() const
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9641
diff changeset
    67
{
9724
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
    68
	return this->owner != INVALID_PLAYER;
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    69
}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    70
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    71
void InitializeGroup(void)
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    72
{
9694
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9641
diff changeset
    73
	_Group_pool.CleanPool();
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9641
diff changeset
    74
	_Group_pool.AddBlockToPool();
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    75
}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    76
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    77
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    78
/**
9641
855e32c08c9b (svn r10533) [NoAI] -Sync with trunk r10460:r10532.
truelight
parents: 9631
diff changeset
    79
 * Create a new vehicle group.
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    80
 * @param tile unused
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    81
 * @param p1   vehicle type
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    82
 * @param p2   unused
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    83
 */
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9625
diff changeset
    84
CommandCost CmdCreateGroup(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    85
{
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    86
	VehicleType vt = (VehicleType)p1;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    87
	if (!IsPlayerBuildableVehicleType(vt)) return CMD_ERROR;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    88
10355
ee4b5f7a5bf2 (svn r12896) [NoAI] -Sync: with trunk r12824:r12895.
rubidium
parents: 10249
diff changeset
    89
	if (!Group::CanAllocateItem()) return CMD_ERROR;
9694
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9641
diff changeset
    90
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    91
	if (flags & DC_EXEC) {
10355
ee4b5f7a5bf2 (svn r12896) [NoAI] -Sync: with trunk r12824:r12895.
rubidium
parents: 10249
diff changeset
    92
		Group *g = new Group(_current_player);
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    93
		g->replace_protection = false;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    94
		g->vehicle_type = vt;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    95
11057
188a9ca6d8de (svn r13614) [NoAI] -Add: AIGroup which allows an AI to manage its vehicle in the context of groups.
rubidium
parents: 10455
diff changeset
    96
		_new_group_id = g->index;
188a9ca6d8de (svn r13614) [NoAI] -Add: AIGroup which allows an AI to manage its vehicle in the context of groups.
rubidium
parents: 10455
diff changeset
    97
10355
ee4b5f7a5bf2 (svn r12896) [NoAI] -Sync: with trunk r12824:r12895.
rubidium
parents: 10249
diff changeset
    98
		InvalidateWindowData(GetWindowClassForVehicleType(vt), (vt << 11) | VLW_GROUP_LIST | _current_player);
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    99
	}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   100
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9625
diff changeset
   101
	return CommandCost();
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   102
}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   103
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   104
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   105
/**
9641
855e32c08c9b (svn r10533) [NoAI] -Sync with trunk r10460:r10532.
truelight
parents: 9631
diff changeset
   106
 * Add all vehicles in the given group to the default group and then deletes the group.
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   107
 * @param tile unused
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   108
 * @param p1   index of array group
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   109
 *      - p1 bit 0-15 : GroupID
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   110
 * @param p2   unused
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   111
 */
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9625
diff changeset
   112
CommandCost CmdDeleteGroup(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   113
{
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   114
	if (!IsValidGroupID(p1)) return CMD_ERROR;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   115
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   116
	Group *g = GetGroup(p1);
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   117
	if (g->owner != _current_player) return CMD_ERROR;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   118
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   119
	if (flags & DC_EXEC) {
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   120
		Vehicle *v;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   121
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   122
		/* Add all vehicles belong to the group to the default group */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   123
		FOR_ALL_VEHICLES(v) {
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   124
			if (v->group_id == g->index && v->type == g->vehicle_type) v->group_id = DEFAULT_GROUP;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   125
		}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   126
9800
ab08ca2a2018 (svn r12306) [NoAI] -Sync with trunk r12209:12304
glx
parents: 9724
diff changeset
   127
		/* Update backupped orders if needed */
ab08ca2a2018 (svn r12306) [NoAI] -Sync with trunk r12209:12304
glx
parents: 9724
diff changeset
   128
		if (_backup_orders_data.group == g->index) _backup_orders_data.group = DEFAULT_GROUP;
ab08ca2a2018 (svn r12306) [NoAI] -Sync with trunk r12209:12304
glx
parents: 9724
diff changeset
   129
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   130
		/* If we set an autoreplace for the group we delete, remove it. */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   131
		if (_current_player < MAX_PLAYERS) {
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   132
			Player *p;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   133
			EngineRenew *er;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   134
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   135
			p = GetPlayer(_current_player);
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   136
			FOR_ALL_ENGINE_RENEWS(er) {
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   137
				if (er->group_id == g->index) RemoveEngineReplacementForPlayer(p, er->from, g->index, flags);
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   138
			}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   139
		}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   140
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   141
		VehicleType vt = g->vehicle_type;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   142
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   143
		/* Delete the Replace Vehicle Windows */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   144
		DeleteWindowById(WC_REPLACE_VEHICLE, g->vehicle_type);
9694
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9641
diff changeset
   145
		delete g;
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   146
10355
ee4b5f7a5bf2 (svn r12896) [NoAI] -Sync: with trunk r12824:r12895.
rubidium
parents: 10249
diff changeset
   147
		InvalidateWindowData(GetWindowClassForVehicleType(vt), (vt << 11) | VLW_GROUP_LIST | _current_player);
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   148
	}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   149
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9625
diff changeset
   150
	return CommandCost();
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   151
}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   152
9631
8a2d1c2ceb88 (svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents: 9629
diff changeset
   153
static bool IsUniqueGroupName(const char *name)
8a2d1c2ceb88 (svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents: 9629
diff changeset
   154
{
8a2d1c2ceb88 (svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents: 9629
diff changeset
   155
	const Group *g;
8a2d1c2ceb88 (svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents: 9629
diff changeset
   156
	char buf[512];
8a2d1c2ceb88 (svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents: 9629
diff changeset
   157
8a2d1c2ceb88 (svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents: 9629
diff changeset
   158
	FOR_ALL_GROUPS(g) {
8a2d1c2ceb88 (svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents: 9629
diff changeset
   159
		SetDParam(0, g->index);
8a2d1c2ceb88 (svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents: 9629
diff changeset
   160
		GetString(buf, STR_GROUP_NAME, lastof(buf));
8a2d1c2ceb88 (svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents: 9629
diff changeset
   161
		if (strcmp(buf, name) == 0) return false;
8a2d1c2ceb88 (svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents: 9629
diff changeset
   162
	}
8a2d1c2ceb88 (svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents: 9629
diff changeset
   163
8a2d1c2ceb88 (svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents: 9629
diff changeset
   164
	return true;
8a2d1c2ceb88 (svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents: 9629
diff changeset
   165
}
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   166
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   167
/**
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   168
 * Rename a group
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   169
 * @param tile unused
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   170
 * @param p1   index of array group
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   171
 *   - p1 bit 0-15 : GroupID
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   172
 * @param p2   unused
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   173
 */
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9625
diff changeset
   174
CommandCost CmdRenameGroup(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   175
{
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   176
	if (!IsValidGroupID(p1) || StrEmpty(_cmd_text)) return CMD_ERROR;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   177
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   178
	Group *g = GetGroup(p1);
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   179
	if (g->owner != _current_player) return CMD_ERROR;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   180
9631
8a2d1c2ceb88 (svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents: 9629
diff changeset
   181
	if (!IsUniqueGroupName(_cmd_text)) return_cmd_error(STR_NAME_MUST_BE_UNIQUE);
8a2d1c2ceb88 (svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents: 9629
diff changeset
   182
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   183
	if (flags & DC_EXEC) {
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   184
		/* Delete the old name */
9724
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   185
		free(g->name);
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   186
		/* Assign the new one */
9724
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   187
		g->name = strdup(_cmd_text);
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   188
10355
ee4b5f7a5bf2 (svn r12896) [NoAI] -Sync: with trunk r12824:r12895.
rubidium
parents: 10249
diff changeset
   189
		InvalidateWindowData(GetWindowClassForVehicleType(g->vehicle_type), (g->vehicle_type << 11) | VLW_GROUP_LIST | _current_player);
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   190
	}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   191
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9625
diff changeset
   192
	return CommandCost();
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   193
}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   194
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   195
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   196
/**
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   197
 * Add a vehicle to a group
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   198
 * @param tile unused
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   199
 * @param p1   index of array group
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   200
 *   - p1 bit 0-15 : GroupID
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   201
 * @param p2   vehicle to add to a group
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   202
 *   - p2 bit 0-15 : VehicleID
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   203
 */
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9625
diff changeset
   204
CommandCost CmdAddVehicleGroup(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   205
{
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   206
	GroupID new_g = p1;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   207
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   208
	if (!IsValidVehicleID(p2) || (!IsValidGroupID(new_g) && !IsDefaultGroupID(new_g))) return CMD_ERROR;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   209
9701
d1ac22c62f64 (svn r11036) [NoAI] -Sync: with trunk r10774:11035.
rubidium
parents: 9694
diff changeset
   210
	Vehicle *v = GetVehicle(p2);
d1ac22c62f64 (svn r11036) [NoAI] -Sync: with trunk r10774:11035.
rubidium
parents: 9694
diff changeset
   211
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   212
	if (IsValidGroupID(new_g)) {
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   213
		Group *g = GetGroup(new_g);
9701
d1ac22c62f64 (svn r11036) [NoAI] -Sync: with trunk r10774:11035.
rubidium
parents: 9694
diff changeset
   214
		if (g->owner != _current_player || g->vehicle_type != v->type) return CMD_ERROR;
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   215
	}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   216
9625
3301b1b3889c (svn r10016) [NoAI] -Sync with trunk r9914:r10015.
rubidium
parents: 9624
diff changeset
   217
	if (v->owner != _current_player || !v->IsPrimaryVehicle()) return CMD_ERROR;
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   218
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   219
	if (flags & DC_EXEC) {
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   220
		DecreaseGroupNumVehicle(v->group_id);
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   221
		IncreaseGroupNumVehicle(new_g);
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   222
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   223
		switch (v->type) {
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   224
			default: NOT_REACHED();
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   225
			case VEH_TRAIN:
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   226
				SetTrainGroupID(v, new_g);
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   227
				break;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   228
			case VEH_ROAD:
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   229
			case VEH_SHIP:
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   230
			case VEH_AIRCRAFT:
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   231
				if (IsEngineCountable(v)) UpdateNumEngineGroup(v->engine_type, v->group_id, new_g);
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   232
				v->group_id = new_g;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   233
				break;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   234
		}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   235
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   236
		/* Update the Replace Vehicle Windows */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   237
		InvalidateWindow(WC_REPLACE_VEHICLE, v->type);
10355
ee4b5f7a5bf2 (svn r12896) [NoAI] -Sync: with trunk r12824:r12895.
rubidium
parents: 10249
diff changeset
   238
		InvalidateWindowData(GetWindowClassForVehicleType(v->type), (v->type << 11) | VLW_GROUP_LIST | _current_player);
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   239
	}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   240
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9625
diff changeset
   241
	return CommandCost();
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   242
}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   243
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   244
/**
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   245
 * Add all shared vehicles of all vehicles from a group
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   246
 * @param tile unused
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   247
 * @param p1   index of group array
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   248
 *  - p1 bit 0-15 : GroupID
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   249
 * @param p2   type of vehicles
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   250
 */
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9625
diff changeset
   251
CommandCost CmdAddSharedVehicleGroup(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   252
{
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   253
	VehicleType type = (VehicleType)p2;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   254
	if (!IsValidGroupID(p1) || !IsPlayerBuildableVehicleType(type)) return CMD_ERROR;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   255
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   256
	if (flags & DC_EXEC) {
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   257
		Vehicle *v;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   258
		VehicleType type = (VehicleType)p2;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   259
		GroupID id_g = p1;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   260
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   261
		/* Find the first front engine which belong to the group id_g
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   262
		 * then add all shared vehicles of this front engine to the group id_g */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   263
		FOR_ALL_VEHICLES(v) {
9625
3301b1b3889c (svn r10016) [NoAI] -Sync with trunk r9914:r10015.
rubidium
parents: 9624
diff changeset
   264
			if (v->type == type && v->IsPrimaryVehicle()) {
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   265
				if (v->group_id != id_g) continue;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   266
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   267
				/* For each shared vehicles add it to the group */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   268
				for (Vehicle *v2 = GetFirstVehicleFromSharedList(v); v2 != NULL; v2 = v2->next_shared) {
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   269
					if (v2->group_id != id_g) CmdAddVehicleGroup(tile, flags, id_g, v2->index);
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   270
				}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   271
			}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   272
		}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   273
10355
ee4b5f7a5bf2 (svn r12896) [NoAI] -Sync: with trunk r12824:r12895.
rubidium
parents: 10249
diff changeset
   274
		InvalidateWindowData(GetWindowClassForVehicleType(type), (type << 11) | VLW_GROUP_LIST | _current_player);
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   275
	}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   276
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9625
diff changeset
   277
	return CommandCost();
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   278
}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   279
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   280
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   281
/**
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   282
 * Remove all vehicles from a group
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   283
 * @param tile unused
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   284
 * @param p1   index of group array
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   285
 * - p1 bit 0-15 : GroupID
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   286
 * @param p2   type of vehicles
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   287
 */
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9625
diff changeset
   288
CommandCost CmdRemoveAllVehiclesGroup(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   289
{
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   290
	VehicleType type = (VehicleType)p2;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   291
	if (!IsValidGroupID(p1) || !IsPlayerBuildableVehicleType(type)) return CMD_ERROR;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   292
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   293
	Group *g = GetGroup(p1);
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   294
	if (g->owner != _current_player) return CMD_ERROR;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   295
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   296
	if (flags & DC_EXEC) {
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   297
		GroupID old_g = p1;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   298
		Vehicle *v;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   299
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   300
		/* Find each Vehicle that belongs to the group old_g and add it to the default group */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   301
		FOR_ALL_VEHICLES(v) {
9625
3301b1b3889c (svn r10016) [NoAI] -Sync with trunk r9914:r10015.
rubidium
parents: 9624
diff changeset
   302
			if (v->type == type && v->IsPrimaryVehicle()) {
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   303
				if (v->group_id != old_g) continue;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   304
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   305
				/* Add The Vehicle to the default group */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   306
				CmdAddVehicleGroup(tile, flags, DEFAULT_GROUP, v->index);
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   307
			}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   308
		}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   309
10355
ee4b5f7a5bf2 (svn r12896) [NoAI] -Sync: with trunk r12824:r12895.
rubidium
parents: 10249
diff changeset
   310
		InvalidateWindowData(GetWindowClassForVehicleType(type), (type << 11) | VLW_GROUP_LIST | _current_player);
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   311
	}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   312
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9625
diff changeset
   313
	return CommandCost();
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   314
}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   315
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   316
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   317
/**
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   318
 * (Un)set global replace protection from a group
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   319
 * @param tile unused
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   320
 * @param p1   index of group array
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   321
 * - p1 bit 0-15 : GroupID
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   322
 * @param p2
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   323
 * - p2 bit 0    : 1 to set or 0 to clear protection.
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   324
 */
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9625
diff changeset
   325
CommandCost CmdSetGroupReplaceProtection(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   326
{
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   327
	if (!IsValidGroupID(p1)) return CMD_ERROR;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   328
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   329
	Group *g = GetGroup(p1);
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   330
	if (g->owner != _current_player) return CMD_ERROR;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   331
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   332
	if (flags & DC_EXEC) {
9722
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9703
diff changeset
   333
		g->replace_protection = HasBit(p2, 0);
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   334
10355
ee4b5f7a5bf2 (svn r12896) [NoAI] -Sync: with trunk r12824:r12895.
rubidium
parents: 10249
diff changeset
   335
		InvalidateWindowData(GetWindowClassForVehicleType(g->vehicle_type), (g->vehicle_type << 11) | VLW_GROUP_LIST | _current_player);
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   336
	}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   337
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9625
diff changeset
   338
	return CommandCost();
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   339
}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   340
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   341
/**
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   342
 * Decrease the num_vehicle variable before delete an front engine from a group
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   343
 * @note Called in CmdSellRailWagon and DeleteLasWagon,
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   344
 * @param v     FrontEngine of the train we want to remove.
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   345
 */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   346
void RemoveVehicleFromGroup(const Vehicle *v)
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   347
{
9703
d2a6acdbd665 (svn r11146) [NoAI] -Sync: with trunk r11035:11045.
rubidium
parents: 9701
diff changeset
   348
	if (!v->IsValid() || !v->IsPrimaryVehicle()) return;
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   349
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   350
	if (!IsDefaultGroupID(v->group_id)) DecreaseGroupNumVehicle(v->group_id);
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   351
}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   352
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   353
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   354
/**
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   355
 * Affect the groupID of a train to new_g.
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   356
 * @note called in CmdAddVehicleGroup and CmdMoveRailVehicle
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   357
 * @param v     First vehicle of the chain.
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   358
 * @param new_g index of array group
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   359
 */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   360
void SetTrainGroupID(Vehicle *v, GroupID new_g)
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   361
{
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   362
	if (!IsValidGroupID(new_g) && !IsDefaultGroupID(new_g)) return;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   363
9694
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9641
diff changeset
   364
	assert(v->IsValid() && v->type == VEH_TRAIN && IsFrontEngine(v));
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   365
9701
d1ac22c62f64 (svn r11036) [NoAI] -Sync: with trunk r10774:11035.
rubidium
parents: 9694
diff changeset
   366
	for (Vehicle *u = v; u != NULL; u = u->Next()) {
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   367
		if (IsEngineCountable(u)) UpdateNumEngineGroup(u->engine_type, u->group_id, new_g);
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   368
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   369
		u->group_id = new_g;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   370
	}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   371
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   372
	/* Update the Replace Vehicle Windows */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   373
	InvalidateWindow(WC_REPLACE_VEHICLE, VEH_TRAIN);
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   374
}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   375
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   376
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   377
/**
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   378
 * Recalculates the groupID of a train. Should be called each time a vehicle is added
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   379
 * to/removed from the chain,.
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   380
 * @note this needs to be called too for 'wagon chains' (in the depot, without an engine)
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   381
 * @note Called in CmdBuildRailVehicle, CmdBuildRailWagon, CmdMoveRailVehicle, CmdSellRailWagon
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   382
 * @param v First vehicle of the chain.
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   383
 */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   384
void UpdateTrainGroupID(Vehicle *v)
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   385
{
9694
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9641
diff changeset
   386
	assert(v->IsValid() && v->type == VEH_TRAIN && (IsFrontEngine(v) || IsFreeWagon(v)));
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   387
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   388
	GroupID new_g = IsFrontEngine(v) ? v->group_id : (GroupID)DEFAULT_GROUP;
9701
d1ac22c62f64 (svn r11036) [NoAI] -Sync: with trunk r10774:11035.
rubidium
parents: 9694
diff changeset
   389
	for (Vehicle *u = v; u != NULL; u = u->Next()) {
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   390
		if (IsEngineCountable(u)) UpdateNumEngineGroup(u->engine_type, u->group_id, new_g);
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   391
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   392
		u->group_id = new_g;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   393
	}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   394
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   395
	/* Update the Replace Vehicle Windows */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   396
	InvalidateWindow(WC_REPLACE_VEHICLE, VEH_TRAIN);
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   397
}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   398
9724
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   399
uint GetGroupNumEngines(PlayerID p, GroupID id_g, EngineID id_e)
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   400
{
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   401
	if (IsValidGroupID(id_g)) return GetGroup(id_g)->num_engines[id_e];
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   402
9724
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   403
	uint num = GetPlayer(p)->num_engines[id_e];
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   404
	if (!IsDefaultGroupID(id_g)) return num;
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   405
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   406
	const Group *g;
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   407
	FOR_ALL_GROUPS(g) {
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   408
		if (g->owner == p) num -= g->num_engines[id_e];
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   409
	}
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   410
	return num;
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   411
}
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   412
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   413
void RemoveAllGroupsForPlayer(const PlayerID p)
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   414
{
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   415
	Group *g;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   416
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   417
	FOR_ALL_GROUPS(g) {
9724
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   418
		if (p == g->owner) delete g;
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   419
	}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   420
}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   421
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   422
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   423
static const SaveLoad _group_desc[] = {
9724
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   424
  SLE_CONDVAR(Group, name,           SLE_NAME,    0, 83),
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   425
  SLE_CONDSTR(Group, name,           SLE_STR, 0, 84, SL_MAX_VERSION),
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   426
  SLE_VAR(Group, num_vehicle,        SLE_UINT16),
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   427
  SLE_VAR(Group, owner,              SLE_UINT8),
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   428
  SLE_VAR(Group, vehicle_type,       SLE_UINT8),
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   429
  SLE_VAR(Group, replace_protection, SLE_BOOL),
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   430
  SLE_END()
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   431
};
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   432
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   433
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   434
static void Save_GROUP(void)
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   435
{
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   436
	Group *g;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   437
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   438
	FOR_ALL_GROUPS(g) {
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   439
		SlSetArrayIndex(g->index);
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   440
		SlObject(g, _group_desc);
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   441
	}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   442
}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   443
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   444
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   445
static void Load_GROUP(void)
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   446
{
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   447
	int index;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   448
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   449
	while ((index = SlIterateArray()) != -1) {
9694
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9641
diff changeset
   450
		Group *g = new (index) Group();
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   451
		SlObject(g, _group_desc);
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   452
	}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   453
}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   454
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   455
extern const ChunkHandler _group_chunk_handlers[] = {
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   456
	{ 'GRPS', Save_GROUP, Load_GROUP, CH_ARRAY | CH_LAST},
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   457
};