Commited patch from cybermind:
Added support for more game sound parts
This commit is contained in:
parent
ae9a692728
commit
55beb59fcb
19 changed files with 362 additions and 81 deletions
src
action
editor
include
pathfinder
sound
stratagus
tolua
ui
unit
video
|
@ -100,6 +100,11 @@ void HandleActionResearch(CUnit *unit)
|
|||
|
||||
unit->Player->Notify(NotifyGreen, unit->X, unit->Y,
|
||||
_("%s: complete"), unit->Type->Name.c_str());
|
||||
if (unit->Player == ThisPlayer) {
|
||||
if (GameSounds.ResearchComplete[unit->Player->Race].Sound)
|
||||
PlayGameSound(GameSounds.ResearchComplete[unit->Player->Race].Sound,
|
||||
MaxSampleVolume);
|
||||
}
|
||||
if (unit->Player->AiEnabled) {
|
||||
AiResearchComplete(unit, upgrade);
|
||||
}
|
||||
|
|
|
@ -1387,7 +1387,7 @@ static void EditorCallbackButtonDown(unsigned button)
|
|||
if (!UnitPlacedThisPress && CursorBuilding) {
|
||||
if (CanBuildUnitType(NULL, CursorBuilding,
|
||||
tileX, tileY, 1)) {
|
||||
PlayGameSound(GameSounds.PlacementSuccess.Sound,
|
||||
PlayGameSound(GameSounds.PlacementSuccess[ThisPlayer->Race].Sound,
|
||||
MaxSampleVolume);
|
||||
EditorPlaceUnit(tileX, tileY,
|
||||
CursorBuilding, Players + Editor.SelectedPlayer);
|
||||
|
@ -1395,7 +1395,7 @@ static void EditorCallbackButtonDown(unsigned button)
|
|||
UI.StatusLine.Clear();
|
||||
} else {
|
||||
UI.StatusLine.Set(_("Unit can't be placed here."));
|
||||
PlayGameSound(GameSounds.PlacementError.Sound,
|
||||
PlayGameSound(GameSounds.PlacementError[ThisPlayer->Race].Sound,
|
||||
MaxSampleVolume);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -92,7 +92,7 @@ class CServerSetup {
|
|||
public:
|
||||
unsigned char *Serialize() const;
|
||||
void Deserialize(const unsigned char *p);
|
||||
static size_t Size() { return 1+1+1+1+1+1+1+1+ 1*PlayerMax + 1*PlayerMax + 1*PlayerMax + 4*PlayerMax; }
|
||||
static size_t Size() { return 4+4+4+4+4+4+4+4+ 4*PlayerMax + 4*PlayerMax + 4*PlayerMax + 4*PlayerMax; }
|
||||
void Clear() {
|
||||
ResourcesOption = UnitsOption = FogOfWar = RevealMap =
|
||||
GameTypeOption = Difficulty = MapRichness = 0;
|
||||
|
@ -101,18 +101,18 @@ public:
|
|||
memset(LastFrame, 0, sizeof(LastFrame));
|
||||
}
|
||||
|
||||
Uint8 ResourcesOption; /// Resources option
|
||||
Uint8 UnitsOption; /// Unit # option
|
||||
Uint8 FogOfWar; /// Fog of war option
|
||||
Uint8 RevealMap; /// Reveal all the map
|
||||
Uint8 TilesetSelection; /// Tileset select option
|
||||
Uint8 GameTypeOption; /// Game type option
|
||||
Uint8 Difficulty; /// Difficulty option
|
||||
Uint8 MapRichness; /// Map richness option
|
||||
Uint8 CompOpt[PlayerMax]; /// Free slot option selection {"Available", "Computer", "Closed" }
|
||||
Uint8 Ready[PlayerMax]; /// Client ready state
|
||||
Uint8 Race[PlayerMax]; /// Client race selection
|
||||
Uint32 LastFrame[PlayerMax]; /// Last message received
|
||||
Uint32 ResourcesOption; /// Resources option
|
||||
Uint32 UnitsOption; /// Unit # option
|
||||
Uint32 FogOfWar; /// Fog of war option
|
||||
Uint32 RevealMap; /// Reveal all the map
|
||||
Uint32 TilesetSelection; /// Tileset select option
|
||||
Uint32 GameTypeOption; /// Game type option
|
||||
Uint32 Difficulty; /// Difficulty option
|
||||
Uint32 MapRichness; /// Map richness option
|
||||
Uint32 CompOpt[PlayerMax]; /// Free slot option selection {"Available", "Computer", "Closed" }
|
||||
Uint32 Ready[PlayerMax]; /// Client ready state
|
||||
Uint32 Race[PlayerMax]; /// Client race selection
|
||||
Uint32 LastFrame[PlayerMax]; /// Last message received
|
||||
// Fill in here...
|
||||
};
|
||||
|
||||
|
|
|
@ -65,14 +65,18 @@ class LuaActionListener;
|
|||
class GameSound
|
||||
{
|
||||
public:
|
||||
SoundConfig PlacementError; /// used by ui
|
||||
SoundConfig PlacementSuccess; /// used by ui
|
||||
SoundConfig Click; /// used by ui
|
||||
SoundConfig Docking; /// ship reaches coast
|
||||
SoundConfig BuildingConstruction; /// building under construction
|
||||
SoundConfig WorkComplete[MAX_RACES]; /// building ready
|
||||
SoundConfig Rescue[MAX_RACES]; /// rescue units
|
||||
SoundConfig ChatMessage; /// chat message
|
||||
SoundConfig PlacementError[MAX_RACES]; /// used by ui
|
||||
SoundConfig PlacementSuccess[MAX_RACES]; /// used by ui
|
||||
SoundConfig Click; /// used by ui
|
||||
SoundConfig Docking; /// ship reaches coast
|
||||
SoundConfig BuildingConstruction[MAX_RACES]; /// building under construction
|
||||
SoundConfig WorkComplete[MAX_RACES]; /// building ready
|
||||
SoundConfig Rescue[MAX_RACES]; /// rescue units
|
||||
SoundConfig ChatMessage; /// chat message
|
||||
SoundConfig ResearchComplete[MAX_RACES]; /// research complete message
|
||||
SoundConfig NotEnough1[MAX_RACES]; /// not enough minerals message
|
||||
SoundConfig NotEnough2[MAX_RACES]; /// not enough ore message
|
||||
SoundConfig NotEnoughFood[MAX_RACES]; /// not enough food message
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -471,7 +471,8 @@ enum UnitVoiceGroup {
|
|||
VoiceBuilding, /// only for building under construction
|
||||
VoiceDocking, /// only for transport reaching coast
|
||||
VoiceRepairing, /// repairing
|
||||
VoiceHarvesting /// harvesting
|
||||
VoiceHarvesting, /// harvesting
|
||||
VoiceAttack /// Attack command
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -70,6 +70,7 @@ class CUnitSound {
|
|||
public:
|
||||
SoundConfig Selected; /// selected by user
|
||||
SoundConfig Acknowledgement; /// acknowledge of use command
|
||||
SoundConfig Attack; /// attack confirm command
|
||||
SoundConfig Ready; /// unit training... ready
|
||||
SoundConfig Repair; /// unit repairing
|
||||
SoundConfig Harvest[MaxCosts]; /// unit harvesting
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
|
||||
#ifndef __unix
|
||||
#undef NOUSER
|
||||
#define _WIN32_WINNT 0x0400
|
||||
#include <winsock2.h>
|
||||
#include <windows.h>
|
||||
#elif defined(__hpux)
|
||||
|
|
|
@ -208,6 +208,8 @@ int UnitReachable(const CUnit *src, const CUnit *dst, int range)
|
|||
//
|
||||
// Find a path to the goal.
|
||||
//
|
||||
if (src->Type->Building)
|
||||
return 0;
|
||||
depth = PlaceReachable(src, dst->X, dst->Y,
|
||||
dst->Type->TileWidth, dst->Type->TileHeight, 0, range);
|
||||
if (depth <= 0) {
|
||||
|
|
|
@ -252,17 +252,49 @@ static int CclDefineGameSounds(lua_State *l)
|
|||
}
|
||||
GameSounds.Click.Sound = (CSound *)data->Data;
|
||||
} else if (!strcmp(value, "placement-error")) {
|
||||
if (!lua_isuserdata(l, j + 1) ||
|
||||
(data = (LuaUserData *)lua_touserdata(l, j + 1))->Type != LuaSoundType) {
|
||||
if (!lua_istable(l, j + 1) || lua_objlen(l, j + 1) != 2) {
|
||||
LuaError(l, "incorrect argument");
|
||||
}
|
||||
lua_rawgeti(l, j + 1, 1);
|
||||
value = LuaToString(l, -1);
|
||||
lua_pop(l, 1);
|
||||
for (i = 0; i < PlayerRaces.Count; ++i) {
|
||||
if (!strcmp(PlayerRaces.Name[i].c_str(), value)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i == PlayerRaces.Count) {
|
||||
LuaError(l, "Unknown race: %s" _C_ value);
|
||||
}
|
||||
lua_rawgeti(l, j + 1, 2);
|
||||
if (!lua_isuserdata(l, -1) ||
|
||||
(data = (LuaUserData *)lua_touserdata(l, -1))->Type != LuaSoundType) {
|
||||
LuaError(l, "Sound id expected");
|
||||
}
|
||||
GameSounds.PlacementError.Sound = (CSound *)data->Data;
|
||||
lua_pop(l, 1);
|
||||
GameSounds.PlacementError[i].Sound = (CSound *)data->Data;
|
||||
} else if (!strcmp(value, "placement-success")) {
|
||||
if (!lua_isuserdata(l, j + 1) ||
|
||||
(data = (LuaUserData *)lua_touserdata(l, j + 1))->Type != LuaSoundType) {
|
||||
if (!lua_istable(l, j + 1) || lua_objlen(l, j + 1) != 2) {
|
||||
LuaError(l, "incorrect argument");
|
||||
}
|
||||
lua_rawgeti(l, j + 1, 1);
|
||||
value = LuaToString(l, -1);
|
||||
lua_pop(l, 1);
|
||||
for (i = 0; i < PlayerRaces.Count; ++i) {
|
||||
if (!strcmp(PlayerRaces.Name[i].c_str(), value)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i == PlayerRaces.Count) {
|
||||
LuaError(l, "Unknown race: %s" _C_ value);
|
||||
}
|
||||
lua_rawgeti(l, j + 1, 2);
|
||||
if (!lua_isuserdata(l, -1) ||
|
||||
(data = (LuaUserData *)lua_touserdata(l, -1))->Type != LuaSoundType) {
|
||||
LuaError(l, "Sound id expected");
|
||||
}
|
||||
GameSounds.PlacementSuccess.Sound = (CSound *)data->Data;
|
||||
lua_pop(l, 1);
|
||||
GameSounds.PlacementSuccess[i].Sound = (CSound *)data->Data;
|
||||
} else if (!strcmp(value, "work-complete")) {
|
||||
if (!lua_istable(l, j + 1) || lua_objlen(l, j + 1) != 2) {
|
||||
LuaError(l, "incorrect argument");
|
||||
|
@ -285,6 +317,94 @@ static int CclDefineGameSounds(lua_State *l)
|
|||
}
|
||||
lua_pop(l, 1);
|
||||
GameSounds.WorkComplete[i].Sound = (CSound *)data->Data;
|
||||
} else if (!strcmp(value, "research-complete")) {
|
||||
if (!lua_istable(l, j + 1) || lua_objlen(l, j + 1) != 2) {
|
||||
LuaError(l, "incorrect argument");
|
||||
}
|
||||
lua_rawgeti(l, j + 1, 1);
|
||||
value = LuaToString(l, -1);
|
||||
lua_pop(l, 1);
|
||||
for (i = 0; i < PlayerRaces.Count; ++i) {
|
||||
if (!strcmp(PlayerRaces.Name[i].c_str(), value)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i == PlayerRaces.Count) {
|
||||
LuaError(l, "Unknown race: %s" _C_ value);
|
||||
}
|
||||
lua_rawgeti(l, j + 1, 2);
|
||||
if (!lua_isuserdata(l, -1) ||
|
||||
(data = (LuaUserData *)lua_touserdata(l, -1))->Type != LuaSoundType) {
|
||||
LuaError(l, "Sound id expected");
|
||||
}
|
||||
lua_pop(l, 1);
|
||||
GameSounds.ResearchComplete[i].Sound = (CSound *)data->Data;
|
||||
} else if (!strcmp(value, "not-enough-min")) {
|
||||
if (!lua_istable(l, j + 1) || lua_objlen(l, j + 1) != 2) {
|
||||
LuaError(l, "incorrect argument");
|
||||
}
|
||||
lua_rawgeti(l, j + 1, 1);
|
||||
value = LuaToString(l, -1);
|
||||
lua_pop(l, 1);
|
||||
for (i = 0; i < PlayerRaces.Count; ++i) {
|
||||
if (!strcmp(PlayerRaces.Name[i].c_str(), value)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i == PlayerRaces.Count) {
|
||||
LuaError(l, "Unknown race: %s" _C_ value);
|
||||
}
|
||||
lua_rawgeti(l, j + 1, 2);
|
||||
if (!lua_isuserdata(l, -1) ||
|
||||
(data = (LuaUserData *)lua_touserdata(l, -1))->Type != LuaSoundType) {
|
||||
LuaError(l, "Sound id expected");
|
||||
}
|
||||
lua_pop(l, 1);
|
||||
GameSounds.NotEnough1[i].Sound = (CSound *)data->Data;
|
||||
} else if (!strcmp(value, "not-enough-ore")) {
|
||||
if (!lua_istable(l, j + 1) || lua_objlen(l, j + 1) != 2) {
|
||||
LuaError(l, "incorrect argument");
|
||||
}
|
||||
lua_rawgeti(l, j + 1, 1);
|
||||
value = LuaToString(l, -1);
|
||||
lua_pop(l, 1);
|
||||
for (i = 0; i < PlayerRaces.Count; ++i) {
|
||||
if (!strcmp(PlayerRaces.Name[i].c_str(), value)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i == PlayerRaces.Count) {
|
||||
LuaError(l, "Unknown race: %s" _C_ value);
|
||||
}
|
||||
lua_rawgeti(l, j + 1, 2);
|
||||
if (!lua_isuserdata(l, -1) ||
|
||||
(data = (LuaUserData *)lua_touserdata(l, -1))->Type != LuaSoundType) {
|
||||
LuaError(l, "Sound id expected");
|
||||
}
|
||||
lua_pop(l, 1);
|
||||
GameSounds.NotEnough2[i].Sound = (CSound *)data->Data;
|
||||
}else if (!strcmp(value, "not-enough-food")) {
|
||||
if (!lua_istable(l, j + 1) || lua_objlen(l, j + 1) != 2) {
|
||||
LuaError(l, "incorrect argument");
|
||||
}
|
||||
lua_rawgeti(l, j + 1, 1);
|
||||
value = LuaToString(l, -1);
|
||||
lua_pop(l, 1);
|
||||
for (i = 0; i < PlayerRaces.Count; ++i) {
|
||||
if (!strcmp(PlayerRaces.Name[i].c_str(), value)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i == PlayerRaces.Count) {
|
||||
LuaError(l, "Unknown race: %s" _C_ value);
|
||||
}
|
||||
lua_rawgeti(l, j + 1, 2);
|
||||
if (!lua_isuserdata(l, -1) ||
|
||||
(data = (LuaUserData *)lua_touserdata(l, -1))->Type != LuaSoundType) {
|
||||
LuaError(l, "Sound id expected");
|
||||
}
|
||||
lua_pop(l, 1);
|
||||
GameSounds.NotEnoughFood[i].Sound = (CSound *)data->Data;
|
||||
} else if (!strcmp(value, "rescue")) {
|
||||
if (!lua_istable(l, j + 1) || lua_objlen(l, j + 1) != 2) {
|
||||
LuaError(l, "incorrect argument");
|
||||
|
|
|
@ -63,28 +63,8 @@
|
|||
|
||||
/**
|
||||
** Various sounds used in game.
|
||||
**
|
||||
** FIXME: @todo support more races. Must remove static config.
|
||||
*/
|
||||
GameSound GameSounds
|
||||
#ifndef laterUSE_CCL
|
||||
// FIXME: Removing this crashes?
|
||||
={
|
||||
SoundConfig("placement error"),
|
||||
SoundConfig("placement success"),
|
||||
SoundConfig("click"),
|
||||
SoundConfig("transport docking"),
|
||||
SoundConfig("building construction"),
|
||||
{ SoundConfig("basic human voices work complete"),
|
||||
SoundConfig("basic orc voices work complete"),
|
||||
},
|
||||
{ SoundConfig("rescue (human) UNUSED"),
|
||||
SoundConfig("rescue (orc) UNUSED"),
|
||||
},
|
||||
SoundConfig("click"),
|
||||
}
|
||||
#endif
|
||||
;
|
||||
GameSound GameSounds;
|
||||
|
||||
/**
|
||||
** Selection handling
|
||||
|
@ -187,6 +167,8 @@ static CSound *ChooseUnitVoiceSound(const CUnit *unit, UnitVoiceGroup voice)
|
|||
switch (voice) {
|
||||
case VoiceAcknowledging:
|
||||
return unit->Type->Sound.Acknowledgement.Sound;
|
||||
case VoiceAttack:
|
||||
return unit->Type->Sound.Attack.Sound;
|
||||
case VoiceReady:
|
||||
return unit->Type->Sound.Ready.Sound;
|
||||
case VoiceSelected:
|
||||
|
@ -198,7 +180,7 @@ static CSound *ChooseUnitVoiceSound(const CUnit *unit, UnitVoiceGroup voice)
|
|||
case VoiceWorkCompleted:
|
||||
return GameSounds.WorkComplete[ThisPlayer->Race].Sound;
|
||||
case VoiceBuilding:
|
||||
return GameSounds.BuildingConstruction.Sound;
|
||||
return GameSounds.BuildingConstruction[ThisPlayer->Race].Sound;
|
||||
case VoiceDocking:
|
||||
return GameSounds.Docking.Sound;
|
||||
case VoiceRepairing:
|
||||
|
@ -503,14 +485,22 @@ void InitSoundClient(void)
|
|||
}
|
||||
// let's map game sounds, look if already setup in ccl.
|
||||
|
||||
if (!GameSounds.PlacementError.Sound) {
|
||||
GameSounds.PlacementError.Sound =
|
||||
SoundForName(GameSounds.PlacementError.Name);
|
||||
for (unsigned int i = 0; i < PlayerRaces.Count; ++i) {
|
||||
if (!GameSounds.PlacementError[i].Sound &&
|
||||
!GameSounds.PlacementError[i].Name.empty()) {
|
||||
GameSounds.PlacementError[i].Sound =
|
||||
SoundForName(GameSounds.PlacementError[i].Name);
|
||||
}
|
||||
}
|
||||
if (!GameSounds.PlacementSuccess.Sound) {
|
||||
GameSounds.PlacementSuccess.Sound =
|
||||
SoundForName(GameSounds.PlacementSuccess.Name);
|
||||
|
||||
for (unsigned int i = 0; i < PlayerRaces.Count; ++i) {
|
||||
if (!GameSounds.PlacementSuccess[i].Sound &&
|
||||
!GameSounds.PlacementSuccess[i].Name.empty()) {
|
||||
GameSounds.PlacementSuccess[i].Sound =
|
||||
SoundForName(GameSounds.PlacementSuccess[i].Name);
|
||||
}
|
||||
}
|
||||
|
||||
if (!GameSounds.Click.Sound) {
|
||||
GameSounds.Click.Sound = SoundForName(GameSounds.Click.Name);
|
||||
}
|
||||
|
@ -518,9 +508,13 @@ void InitSoundClient(void)
|
|||
GameSounds.Docking.Sound =
|
||||
SoundForName(GameSounds.Docking.Name);
|
||||
}
|
||||
if (!GameSounds.BuildingConstruction.Sound) {
|
||||
GameSounds.BuildingConstruction.Sound =
|
||||
SoundForName(GameSounds.BuildingConstruction.Name);
|
||||
|
||||
for (unsigned int i = 0; i < PlayerRaces.Count; ++i) {
|
||||
if (!GameSounds.BuildingConstruction[i].Sound &&
|
||||
!GameSounds.BuildingConstruction[i].Name.empty()) {
|
||||
GameSounds.BuildingConstruction[i].Sound =
|
||||
SoundForName(GameSounds.BuildingConstruction[i].Name);
|
||||
}
|
||||
}
|
||||
for (unsigned int i = 0; i < PlayerRaces.Count; ++i) {
|
||||
if (!GameSounds.WorkComplete[i].Sound &&
|
||||
|
@ -529,6 +523,34 @@ void InitSoundClient(void)
|
|||
SoundForName(GameSounds.WorkComplete[i].Name);
|
||||
}
|
||||
}
|
||||
for (unsigned int i = 0; i < PlayerRaces.Count; ++i) {
|
||||
if (!GameSounds.ResearchComplete[i].Sound &&
|
||||
!GameSounds.ResearchComplete[i].Name.empty()) {
|
||||
GameSounds.ResearchComplete[i].Sound =
|
||||
SoundForName(GameSounds.ResearchComplete[i].Name);
|
||||
}
|
||||
}
|
||||
for (unsigned int i = 0; i < PlayerRaces.Count; ++i) {
|
||||
if (!GameSounds.NotEnough1[i].Sound &&
|
||||
!GameSounds.NotEnough1[i].Name.empty()) {
|
||||
GameSounds.NotEnough1[i].Sound =
|
||||
SoundForName(GameSounds.NotEnough1[i].Name);
|
||||
}
|
||||
}
|
||||
for (unsigned int i = 0; i < PlayerRaces.Count; ++i) {
|
||||
if (!GameSounds.NotEnough2[i].Sound &&
|
||||
!GameSounds.NotEnough2[i].Name.empty()) {
|
||||
GameSounds.NotEnough2[i].Sound =
|
||||
SoundForName(GameSounds.NotEnough2[i].Name);
|
||||
}
|
||||
}
|
||||
for (unsigned int i = 0; i < PlayerRaces.Count; ++i) {
|
||||
if (!GameSounds.NotEnoughFood[i].Sound &&
|
||||
!GameSounds.NotEnoughFood[i].Name.empty()) {
|
||||
GameSounds.NotEnoughFood[i].Sound =
|
||||
SoundForName(GameSounds.NotEnoughFood[i].Name);
|
||||
}
|
||||
}
|
||||
for (unsigned int i = 0; i < PlayerRaces.Count; ++i) {
|
||||
if (!GameSounds.Rescue[i].Sound && !GameSounds.Rescue[i].Name.empty()) {
|
||||
GameSounds.Rescue[i].Sound =
|
||||
|
|
|
@ -145,6 +145,10 @@ void MapUnitSounds(void)
|
|||
INFINITE_SOUND_RANGE);
|
||||
*/
|
||||
}
|
||||
if (!type->Sound.Attack.Name.empty()) {
|
||||
type->Sound.Attack.Sound =
|
||||
SoundForName(type->Sound.Attack.Name);
|
||||
}
|
||||
if (!type->Sound.Ready.Name.empty()) {
|
||||
type->Sound.Ready.Sound =
|
||||
SoundForName(type->Sound.Ready.Name);
|
||||
|
|
|
@ -636,6 +636,14 @@ int CPlayer::CheckCosts(const int *costs) const
|
|||
DefaultResourceNames[i].c_str(), DefaultActions[i].c_str(), DefaultResourceNames[i].c_str());
|
||||
|
||||
err |= 1 << i;
|
||||
if (i==1)
|
||||
if (GameSounds.NotEnough1[this->Race].Sound)
|
||||
PlayGameSound(GameSounds.NotEnough1[this->Race].Sound,
|
||||
MaxSampleVolume);
|
||||
if (i==2)
|
||||
if (GameSounds.NotEnough2[this->Race].Sound)
|
||||
PlayGameSound(GameSounds.NotEnough2[this->Race].Sound,
|
||||
MaxSampleVolume);
|
||||
}
|
||||
}
|
||||
return err;
|
||||
|
|
|
@ -16,14 +16,14 @@ void NetworkServerResyncClients(void);
|
|||
void NetworkDetachFromServer(void);
|
||||
|
||||
class CServerSetup {
|
||||
unsigned char ResourcesOption;
|
||||
unsigned char UnitsOption;
|
||||
unsigned char FogOfWar;
|
||||
unsigned char RevealMap;
|
||||
unsigned char TilesetSelection;
|
||||
unsigned char GameTypeOption;
|
||||
unsigned char Difficulty;
|
||||
unsigned char MapRichness;
|
||||
unsigned int ResourcesOption;
|
||||
unsigned int UnitsOption;
|
||||
unsigned int FogOfWar;
|
||||
unsigned int RevealMap;
|
||||
unsigned int TilesetSelection;
|
||||
unsigned int GameTypeOption;
|
||||
unsigned int Difficulty;
|
||||
unsigned int MapRichness;
|
||||
unsigned CompOpt[PlayerMax];
|
||||
unsigned Ready[PlayerMax];
|
||||
unsigned Race[PlayerMax];
|
||||
|
|
|
@ -1040,7 +1040,7 @@ void CButtonPanel::DoClicked(int button)
|
|||
int autocast = 0;
|
||||
|
||||
if (!SpellTypeTable[spellId]->AutoCast) {
|
||||
PlayGameSound(GameSounds.PlacementError.Sound,
|
||||
PlayGameSound(GameSounds.PlacementError[ThisPlayer->Race].Sound,
|
||||
MaxSampleVolume);
|
||||
break;
|
||||
}
|
||||
|
@ -1202,7 +1202,10 @@ void CButtonPanel::DoClicked(int button)
|
|||
!(KeyModifiers & ModifierShift));
|
||||
UI.StatusLine.Clear();
|
||||
ClearCosts();
|
||||
}
|
||||
} else if (Selected[0]->Player->CheckLimits(type) == -3)
|
||||
if (GameSounds.NotEnoughFood[Selected[0]->Player->Race].Sound)
|
||||
PlayGameSound(GameSounds.NotEnoughFood[Selected[0]->Player->Race].Sound,
|
||||
MaxSampleVolume);
|
||||
break;
|
||||
|
||||
case ButtonUpgradeTo:
|
||||
|
|
106
src/ui/mouse.cpp
106
src/ui/mouse.cpp
|
@ -186,10 +186,6 @@ void DoRightButton(int sx, int sy)
|
|||
continue;
|
||||
}
|
||||
Assert(unit);
|
||||
if (!acknowledged) {
|
||||
PlayUnitSound(unit, VoiceAcknowledging);
|
||||
acknowledged = 1;
|
||||
}
|
||||
type = unit->Type;
|
||||
action = type->MouseAction;
|
||||
|
||||
|
@ -198,6 +194,10 @@ void DoRightButton(int sx, int sy)
|
|||
//
|
||||
if ((KeyModifiers & ModifierControl) && dest) {
|
||||
dest->Blink = 4;
|
||||
if (!acknowledged) {
|
||||
PlayUnitSound(unit, VoiceAcknowledging);
|
||||
acknowledged = 1;
|
||||
}
|
||||
SendCommandFollow(unit, dest, flush);
|
||||
continue;
|
||||
}
|
||||
|
@ -212,12 +212,20 @@ void DoRightButton(int sx, int sy)
|
|||
if (dest->CanMove() && CanTransport(dest, unit)) {
|
||||
DebugPrint("Send command follow\n");
|
||||
// is flush value correct ?
|
||||
if (!acknowledged) {
|
||||
PlayUnitSound(unit, VoiceAcknowledging);
|
||||
acknowledged = 1;
|
||||
}
|
||||
SendCommandFollow(dest, unit, 0);
|
||||
}
|
||||
// FIXME : manage correctly production units.
|
||||
if (!unit->CanMove() || CanTransport(dest, unit)) {
|
||||
dest->Blink = 4;
|
||||
DebugPrint("Board transporter\n");
|
||||
if (!acknowledged) {
|
||||
PlayUnitSound(unit, VoiceAcknowledging);
|
||||
acknowledged = 1;
|
||||
}
|
||||
SendCommandBoard(unit, -1, -1, dest, flush);
|
||||
continue;
|
||||
}
|
||||
|
@ -229,6 +237,10 @@ void DoRightButton(int sx, int sy)
|
|||
if (unit->CanMove()) {
|
||||
DebugPrint("Send command follow\n");
|
||||
// is flush value correct ?
|
||||
if (!acknowledged) {
|
||||
PlayUnitSound(unit, VoiceAcknowledging);
|
||||
acknowledged = 1;
|
||||
}
|
||||
SendCommandFollow(unit, dest, 0);
|
||||
} else if (!dest->CanMove()) {
|
||||
DebugPrint("Want to transport but no unit can move\n");
|
||||
|
@ -236,6 +248,10 @@ void DoRightButton(int sx, int sy)
|
|||
}
|
||||
dest->Blink = 4;
|
||||
DebugPrint("Board transporter\n");
|
||||
if (!acknowledged) {
|
||||
PlayUnitSound(unit, VoiceAcknowledging);
|
||||
acknowledged = 1;
|
||||
}
|
||||
SendCommandBoard(dest, -1, -1, unit, flush);
|
||||
continue;
|
||||
}
|
||||
|
@ -251,6 +267,10 @@ void DoRightButton(int sx, int sy)
|
|||
dest->Variable[HP_INDEX].Value < dest->Variable[HP_INDEX].Max &&
|
||||
(dest->Player == unit->Player || unit->IsAllied(dest))) {
|
||||
dest->Blink = 4;
|
||||
if (!acknowledged) {
|
||||
PlayUnitSound(unit, VoiceAcknowledging);
|
||||
acknowledged = 1;
|
||||
}
|
||||
SendCommandRepair(unit, x, y, dest, flush);
|
||||
continue;
|
||||
}
|
||||
|
@ -262,6 +282,10 @@ void DoRightButton(int sx, int sy)
|
|||
dest->Type->CanStore[unit->CurrentResource] &&
|
||||
dest->Player == unit->Player) {
|
||||
dest->Blink = 4;
|
||||
if (!acknowledged) {
|
||||
PlayUnitSound(unit, VoiceAcknowledging);
|
||||
acknowledged = 1;
|
||||
}
|
||||
SendCommandReturnGoods(unit, dest, flush);
|
||||
continue;
|
||||
}
|
||||
|
@ -273,6 +297,10 @@ void DoRightButton(int sx, int sy)
|
|||
(dest->Player == unit->Player ||
|
||||
(dest->Player->Index == PlayerNumNeutral))) {
|
||||
dest->Blink = 4;
|
||||
if (!acknowledged) {
|
||||
PlayUnitSound(unit, VoiceAcknowledging);
|
||||
acknowledged = 1;
|
||||
}
|
||||
SendCommandResource(unit, dest, flush);
|
||||
continue;
|
||||
}
|
||||
|
@ -285,6 +313,10 @@ void DoRightButton(int sx, int sy)
|
|||
Map.ForestOnMap(x, y) &&
|
||||
((unit->CurrentResource != res) ||
|
||||
(unit->ResourcesHeld < type->ResInfo[res]->ResourceCapacity))) {
|
||||
if (!acknowledged) {
|
||||
PlayUnitSound(unit, VoiceAcknowledging);
|
||||
acknowledged = 1;
|
||||
}
|
||||
SendCommandResourceLoc(unit, x, y, flush);
|
||||
break;
|
||||
}
|
||||
|
@ -298,10 +330,18 @@ void DoRightButton(int sx, int sy)
|
|||
if (UnitUnderCursor != NULL && dest != NULL && dest != unit &&
|
||||
(dest->Player == unit->Player || unit->IsAllied(dest))) {
|
||||
dest->Blink = 4;
|
||||
if (!acknowledged) {
|
||||
PlayUnitSound(unit, VoiceAcknowledging);
|
||||
acknowledged = 1;
|
||||
}
|
||||
SendCommandFollow(unit, dest, flush);
|
||||
continue;
|
||||
}
|
||||
// Move
|
||||
if (!acknowledged) {
|
||||
PlayUnitSound(unit, VoiceAcknowledging);
|
||||
acknowledged = 1;
|
||||
}
|
||||
SendCommandMove(unit, x, y, flush);
|
||||
continue;
|
||||
}
|
||||
|
@ -313,6 +353,10 @@ void DoRightButton(int sx, int sy)
|
|||
if (dest != NULL && unit->CurrentAction() != UnitActionBuilt) {
|
||||
if (unit->IsEnemy(dest)) {
|
||||
dest->Blink = 4;
|
||||
if (!acknowledged) {
|
||||
PlayUnitSound(unit, VoiceAttack);
|
||||
acknowledged = 1;
|
||||
}
|
||||
if (action == MouseActionSpellCast) {
|
||||
// This is for demolition squads and such
|
||||
Assert(unit->Type->CanCastSpell);
|
||||
|
@ -331,6 +375,10 @@ void DoRightButton(int sx, int sy)
|
|||
if ((dest->Player == unit->Player || unit->IsAllied(dest)) &&
|
||||
dest != unit) {
|
||||
dest->Blink = 4;
|
||||
if (!acknowledged) {
|
||||
PlayUnitSound(unit, VoiceAcknowledging);
|
||||
acknowledged = 1;
|
||||
}
|
||||
SendCommandFollow(unit, dest, flush);
|
||||
continue;
|
||||
}
|
||||
|
@ -351,14 +399,30 @@ void DoRightButton(int sx, int sy)
|
|||
if ((KeyModifiers & ModifierControl)) {
|
||||
if (RightButtonAttacks) {
|
||||
SendCommandMove(unit, x, y, flush);
|
||||
if (!acknowledged) {
|
||||
PlayUnitSound(unit, VoiceAcknowledging);
|
||||
acknowledged = 1;
|
||||
}
|
||||
} else {
|
||||
if (!acknowledged) {
|
||||
PlayUnitSound(unit, VoiceAttack);
|
||||
acknowledged = 1;
|
||||
}
|
||||
SendCommandAttack(unit, x, y, NoUnitP, flush);
|
||||
}
|
||||
} else {
|
||||
if (RightButtonAttacks) {
|
||||
if (!acknowledged) {
|
||||
PlayUnitSound(unit, VoiceAttack);
|
||||
acknowledged = 1;
|
||||
}
|
||||
SendCommandAttack(unit, x, y, NoUnitP, flush);
|
||||
} else {
|
||||
// Note: move is correct here, right default is move
|
||||
if (!acknowledged) {
|
||||
PlayUnitSound(unit, VoiceAcknowledging);
|
||||
acknowledged = 1;
|
||||
}
|
||||
SendCommandMove(unit, x, y, flush);
|
||||
}
|
||||
}
|
||||
|
@ -371,6 +435,10 @@ void DoRightButton(int sx, int sy)
|
|||
(dest && dest != unit) &&
|
||||
(dest->Player == unit->Player || unit->IsAllied(dest))) {
|
||||
dest->Blink = 4;
|
||||
if (!acknowledged) {
|
||||
PlayUnitSound(unit, VoiceAcknowledging);
|
||||
acknowledged = 1;
|
||||
}
|
||||
SendCommandFollow(unit, dest, flush);
|
||||
continue;
|
||||
}
|
||||
|
@ -383,6 +451,10 @@ void DoRightButton(int sx, int sy)
|
|||
dest->Player == unit->Player) {
|
||||
dest->Blink = 4;
|
||||
SendCommandReturnGoods(dest, unit, flush);
|
||||
if (!acknowledged) {
|
||||
PlayUnitSound(unit, VoiceAcknowledging);
|
||||
acknowledged = 1;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
// tell to go and harvest from a building
|
||||
|
@ -403,15 +475,27 @@ void DoRightButton(int sx, int sy)
|
|||
if (dest != NULL && dest->Type->GivesResource && dest->Type->CanHarvest &&
|
||||
(dest->Player == unit->Player || dest->Player->Index == PlayerNumNeutral)) {
|
||||
dest->Blink = 4;
|
||||
if (!acknowledged) {
|
||||
PlayUnitSound(unit, VoiceAcknowledging);
|
||||
acknowledged = 1;
|
||||
}
|
||||
SendCommandResource(unit, dest, flush);
|
||||
continue;
|
||||
}
|
||||
// FIXME: support harvesting more types of terrain.
|
||||
if (Map.IsFieldExplored(unit->Player, x, y) && Map.ForestOnMap(x, y)) {
|
||||
if (!acknowledged) {
|
||||
PlayUnitSound(unit, VoiceAcknowledging);
|
||||
acknowledged = 1;
|
||||
}
|
||||
SendCommandResourceLoc(unit, x, y, flush);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!acknowledged) {
|
||||
PlayUnitSound(unit, VoiceAcknowledging);
|
||||
acknowledged = 1;
|
||||
}
|
||||
|
||||
SendCommandMove(unit, x, y, flush);
|
||||
}
|
||||
|
@ -1246,7 +1330,15 @@ static void SendCommand(int sx, int sy)
|
|||
if (ret) {
|
||||
// Acknowledge the command with first selected unit.
|
||||
for (int i = 0; i < NumSelected; ++i) {
|
||||
if (Selected[i]->Type->Sound.Acknowledgement.Sound) {
|
||||
if (ret==ButtonAttack || ret==ButtonAttackGround || ret==ButtonSpellCast) {
|
||||
if (Selected[i]->Type->Sound.Attack.Sound) {
|
||||
PlayUnitSound(Selected[i], VoiceAttack);
|
||||
break;
|
||||
} else if (Selected[i]->Type->Sound.Acknowledgement.Sound) {
|
||||
PlayUnitSound(Selected[i], VoiceAcknowledging);
|
||||
break;
|
||||
}
|
||||
} else if (Selected[i]->Type->Sound.Acknowledgement.Sound) {
|
||||
PlayUnitSound(Selected[i], VoiceAcknowledging);
|
||||
break;
|
||||
}
|
||||
|
@ -1502,7 +1594,7 @@ void UIHandleButtonDown(unsigned button)
|
|||
// 0 Test build, don't really build
|
||||
if (CanBuildUnitType(Selected[0], CursorBuilding, x, y, 0) &&
|
||||
(explored || ReplayRevealMap)) {
|
||||
PlayGameSound(GameSounds.PlacementSuccess.Sound,
|
||||
PlayGameSound(GameSounds.PlacementSuccess[ThisPlayer->Race].Sound,
|
||||
MaxSampleVolume);
|
||||
for (int i = 0; i < NumSelected; ++i) {
|
||||
SendCommandBuildBuilding(Selected[i], x, y, CursorBuilding,
|
||||
|
@ -1512,7 +1604,7 @@ void UIHandleButtonDown(unsigned button)
|
|||
CancelBuildingMode();
|
||||
}
|
||||
} else {
|
||||
PlayGameSound(GameSounds.PlacementError.Sound,
|
||||
PlayGameSound(GameSounds.PlacementError[ThisPlayer->Race].Sound,
|
||||
MaxSampleVolume);
|
||||
}
|
||||
} else {
|
||||
|
|
|
@ -954,6 +954,10 @@ static int CclDefineUnitType(lua_State *l)
|
|||
lua_rawgeti(l, -1, k + 1);
|
||||
type->Sound.Acknowledgement.Name = LuaToString(l, -1);
|
||||
lua_pop(l, 1);
|
||||
} else if (!strcmp(value, "attack")) {
|
||||
lua_rawgeti(l, -1, k + 1);
|
||||
type->Sound.Attack.Name = LuaToString(l, -1);
|
||||
lua_pop(l, 1);
|
||||
} else if (!strcmp(value, "ready")) {
|
||||
lua_rawgeti(l, -1, k + 1);
|
||||
type->Sound.Ready.Name = LuaToString(l, -1);
|
||||
|
|
|
@ -3142,6 +3142,7 @@ void HitUnit(CUnit *attacker, CUnit *target, int damage)
|
|||
}
|
||||
|
||||
/* Target Reaction on Hit */
|
||||
if (target->Player->AiEnabled){
|
||||
switch(target->CurrentAction()) {
|
||||
case UnitActionTrain:
|
||||
case UnitActionUpgradeTo:
|
||||
|
@ -3158,12 +3159,12 @@ void HitUnit(CUnit *attacker, CUnit *target, int damage)
|
|||
//
|
||||
return;
|
||||
case UnitActionResource:
|
||||
if (target->SubAction >= 65/* SUB_STOP_GATHERING */)
|
||||
if (target->SubAction >= 65)
|
||||
{
|
||||
//Normal return to depot
|
||||
return;
|
||||
}
|
||||
if (target->SubAction > 55 /* SUB_START_GATHERING */ &&
|
||||
if (target->SubAction > 55 &&
|
||||
target->ResourcesHeld > 0) {
|
||||
//escape to Depot with this what you have;
|
||||
target->Data.ResWorker.DoneHarvesting = 1;
|
||||
|
@ -3184,11 +3185,12 @@ void HitUnit(CUnit *attacker, CUnit *target, int damage)
|
|||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Attack units in range (which or the attacker?)
|
||||
//
|
||||
if (attacker && target->IsAgressive()) {
|
||||
if (attacker && target->IsAgressive() && target->CanMove()) {
|
||||
if (RevealAttacker && CanTarget(target->Type, attacker->Type)) {
|
||||
// Reveal Unit that is attacking
|
||||
goal = attacker;
|
||||
|
@ -3200,6 +3202,8 @@ void HitUnit(CUnit *attacker, CUnit *target, int damage)
|
|||
goal = AttackUnitsInReactRange(target);
|
||||
}
|
||||
}
|
||||
if (target->CurrentAction()!=UnitActionStill && !target->Player->AiEnabled)
|
||||
return;
|
||||
if (goal) {
|
||||
if (target->SavedOrder.Action == UnitActionStill) {
|
||||
// FIXME: should rewrite command handling
|
||||
|
|
|
@ -232,6 +232,12 @@ static void DrawBuildingCursor(void)
|
|||
DrawShadow(CursorBuilding, CursorBuilding->StillFrame, x, y);
|
||||
DrawUnitType(CursorBuilding, CursorBuilding->Sprite, ThisPlayer->Index,
|
||||
CursorBuilding->StillFrame, x, y);
|
||||
if (CursorBuilding->CanAttack && CursorBuilding->Stats->Variables[ATTACKRANGE_INDEX].Value>0){
|
||||
Video.DrawCircleClip(ColorRed,
|
||||
x + CursorBuilding->TileWidth * TileSizeX / 2,
|
||||
y + CursorBuilding->TileHeight * TileSizeY / 2,
|
||||
(CursorBuilding->Stats->Variables[ATTACKRANGE_INDEX].Max + (CursorBuilding->TileWidth - 1)) * TileSizeX + 1);
|
||||
}
|
||||
|
||||
//
|
||||
// Draw the allow overlay
|
||||
|
|
|
@ -48,13 +48,16 @@
|
|||
#include <string.h>
|
||||
|
||||
#include <limits.h>
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#include <sys/time.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include "SDL.h"
|
||||
|
||||
#ifdef USE_GLES
|
||||
#include "SDL_gles.h"
|
||||
#include "GLES/gl.h"
|
||||
|
@ -69,6 +72,7 @@
|
|||
#ifdef USE_WIN32
|
||||
#include "net_lowlevel.h"
|
||||
#include "SDL_syswm.h"
|
||||
#include <shellapi.h>
|
||||
#endif
|
||||
|
||||
#ifdef USE_MAEMO
|
||||
|
|
Loading…
Add table
Reference in a new issue