Made SHIFT-CTRL select useful, but not correct.

This commit is contained in:
johns 2002-03-08 23:32:57 +00:00
parent 138db18bc7
commit 86c826f5c5
3 changed files with 96 additions and 19 deletions
src

View file

@ -915,6 +915,8 @@ extern void UnSelectUnit(Unit* unit);
extern int ToggleSelectUnit(Unit* unit);
/// Select units from the same type (if selectable by rectangle)
extern int SelectUnitsByType(Unit* base);
/// Toggle units from the same type (if selectable by rectangle)
extern int ToggleUnitsByType(Unit* base);
/// Select the units belonging to a particular group
extern int SelectGroup(int group_number);
/// Select the unit from the same group as the one in parameter

View file

@ -10,12 +10,11 @@
//
/**@name selection.c - The units' selection. */
//
// (c) Copyright 1999-2001 by Patrice Fortier
// (c) Copyright 1999-2002 by Patrice Fortier, Lutz Sammer
//
// FreeCraft is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published
// by the Free Software Foundation; either version 2 of the License,
// or (at your option) any later version.
// by the Free Software Foundation; only version 2 of the License.
//
// FreeCraft is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -110,26 +109,26 @@ global void ChangeSelectedUnits(Unit** units,int count)
** @return false if NumSelected == MaxSelectable or
** unit is already selected, true otherwise.
*/
global int SelectUnit(Unit* unit)
global int SelectUnit(Unit * unit)
{
if ( unit->Revealer ) { // Revealers cannot be selected
if (unit->Revealer) { // Revealers cannot be selected
DebugLevel0Fn("Selecting revealer?\n");
return 0;
}
if( NumSelected == MaxSelectable ) {
return 0;
if (NumSelected == MaxSelectable) {
return 0;
}
if( unit->Selected ) {
return 0;
if (unit->Selected) {
return 0;
}
Selected[NumSelected++]=unit;
unit->Selected=1;
if( NumSelected>1 ) {
Selected[0]->LastGroup=unit->LastGroup=GroupId;
};
Selected[NumSelected++] = unit;
unit->Selected = 1;
if (NumSelected > 1) {
Selected[0]->LastGroup = unit->LastGroup = GroupId;
}
CheckUnitToBeDrawn(unit);
return 1;
}
@ -276,6 +275,75 @@ global int SelectUnitsByType(Unit* base)
return NumSelected;
}
/**
** Toggle units from a particular type and belonging to the local player.
**
** The base is included in the selection and defines
** the type of the other units to be selected.
**
** @param base Toggle all units of same type.
** @return Number of units found, 0 means selection unchanged
**
** @todo
** FIXME: toggle not written
**
** FIXME: should always select the nearest 9 units to the base!
*/
global int ToggleUnitsByType(Unit* base)
{
Unit* unit;
Unit* table[UnitMax];
const UnitType* type;
int r;
int i;
type = base->Type;
DebugLevel2Fn(" %s FIXME: toggle not written.\n", base->Type->Ident);
// select all visible units.
// StephanR: should be (MapX,MapY,MapX+MapWidth-1,MapY+MapHeight-1) ???
r = SelectUnits(MapX - 1, MapY - 1, MapX + MapWidth + 1,
MapY + MapHeight + 1, table);
// if unit is a cadaver or hidden (not on map)
// no unit can be selected.
if (base->Removed || base->Orders[0].Action == UnitActionDie) {
return 0;
}
// if unit isn't belonging to the player, or is a static unit
// (like a building), only 1 unit can be selected at the same time.
if (base->Player != ThisPlayer || !type->SelectableByRectangle) {
return 0;
}
if (!SelectUnit(base)) { // Add base to selection
return 0;
}
//
// Search for other visible units of the same type
//
// FIXME: peon/peasant with gold/wood & co are considered from
// different type... idem for tankers
for (i = 0; i < r; ++i) {
unit = table[i];
if (unit->Player != ThisPlayer || unit->Type != type) {
continue;
}
if (UnitUnusable(unit)) { // guess SelectUnits doesn't check this
continue;
}
if (unit == base) { // no need to have the same unit twice
continue;
}
if (!SelectUnit(unit)) { // add unit to selection
return NumSelected;
}
}
return NumSelected;
}
/**
** Change selected units to units from group #group_number
** Doesn't change the selection if the group has no unit.

View file

@ -10,12 +10,11 @@
//
/**@name mouse.c - The mouse handling. */
//
// (c) Copyright 1998-2001 by Lutz Sammer
// (c) Copyright 1998-2002 by Lutz Sammer
//
// FreeCraft is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published
// by the Free Software Foundation; either version 2 of the License,
// or (at your option) any later version.
// by the Free Software Foundation; only version 2 of the License.
//
// FreeCraft is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -1052,7 +1051,11 @@ local void DoSelectionButtons(unsigned num,unsigned button __attribute__((unused
if( (KeyModifiers&ModifierControl)
|| (MouseButtons&(LeftButton<<MouseDoubleShift)) ) {
SelectUnitsByType(unit);
if( KeyModifiers&ModifierShift ) {
ToggleUnitsByType(unit);
} else {
SelectUnitsByType(unit);
}
} else if( KeyModifiers&ModifierAlt ) {
SelectGroupFromUnit(unit);
} else if( KeyModifiers&ModifierShift ) {
@ -1418,7 +1421,11 @@ global void UIHandleButtonUp(unsigned button)
// FIXME: Not nice coded, button number hardcoded!
if( (KeyModifiers&ModifierControl)
|| (button&(1<<MouseDoubleShift))) {
num=SelectUnitsByType(unit);
if( KeyModifiers&ModifierShift ) {
num=ToggleUnitsByType(unit);
} else {
num=SelectUnitsByType(unit);
}
} else if( (KeyModifiers&ModifierAlt) && unit->LastGroup ) {
num=SelectGroupFromUnit(unit);