New Lua map format: map presentation.

This commit is contained in:
feber 2004-10-24 06:49:11 +00:00
parent 383a47e6e9
commit 699dd2ff15
19 changed files with 306 additions and 213 deletions

View file

@ -34,9 +34,10 @@
<ul>
<p><li>2.2 Released<p>
<ul>
<li>New Lua map format: map presentation (from François Beerten).
<li>Fixed bug #1048426: [Bos] Segfault with a map. Bug with die sequence for unit without corpse (from Joris Dauphin).
<li>Fixed crash where cursors were not initialized to 0, introduced in recent cleaups (from Russell Smith).
<li>Removed Speed attribute for UnitType(its only effect was to show the value). (from Joris Dauphin)
<li>Fixed crash where cursors were not initialized to 0, introduced in recent cleanups (from Russell Smith).
<li>Removed Speed attribute for UnitType (its only effect was to show the value). (from Joris Dauphin)
<li>Fixed bug #1043210: [editor] several units on the same tiles (from Russell Smith).
<li>Make InfoPanel more configurable. (from Joris Dauphin).
<li>Added support for transparent UI graphics, allowing for non-rectangular map areas (from Jimmy Salmon).

View file

@ -134,8 +134,6 @@
<dd></dd>
<dt><a href="research.html#CheckDependency">CheckDependency</a></dt>
<dd></dd>
<dt><a href="mappresentation.html#CreateMap">CreateMap</a></dt>
<dd></dd>
<dt><a href="game.html#CreateUnit">CreateUnit</a></dt>
<dd></dd>
<dt><a href="game.html#Credits">Credits</a></dt>
@ -212,6 +210,10 @@
<dd></dd>
<dt><a href="research.html#DefineModifier">DefineModifier</a></dt>
<dd></dd>
<dt><a href="ui.html#DefinePanel">DefinePanel</a></dt>
<dd></dd>
<dt><a href="mappresentation.html#DefinePlayerTypes">DefinePlayerTypes</a></dt>
<dd></dd>
<dt><a href="game.html#DefineRaceNames">DefineRaceNames</a></dt>
<dd></dd>
<dt><a href="game.html#DefineRanks">DefineRanks</a></dt>
@ -320,6 +322,8 @@
<dd></dd>
<dt><a href="game.html#Player">Player</a></dt>
<dd></dd>
<dt><a href="mappresentation.html#PresentMap">PresentMap</a></dt>
<dd></dd>
<dt><a href="ui.html#ProcessMenu">ProcessMenu</a></dt>
<dd></dd>
<dt><a href="game.html#RemoveObjective">RemoveObjective</a></dt>

View file

@ -36,13 +36,14 @@
<p><b>(C) Copyright 1998-2004 by The Stratagus Project. Distributed under the
<a href="../gpl.html">"GNU General Public License"</a></b>
<hr>
<a href="../index.html">Stratagus</a>
<a href="../faq.html">FAQ</a>
<a href="magic.html">PREV</a>
<a href="../index.html">Stratagus</a>
<a href="../faq.html">FAQ</a>
<a href="magic.html">PREV</a>
<a href="mapsetup.html">NEXT</a>
<a href="index.html">LUA Index</a>
<hr>
<a href="#PresentMap">PresentMap</a>
<a href="#DefinePlayerTypes">DefinePlayerTypes</a>
<a href="#SetMapMiniImage">SetMapMiniImage</a>
<a href="#DefineMapSetup">DefineMapSetup</a>
<a href="#GetMapOption">GetMapOption</a>
@ -64,16 +65,14 @@ the needed tilesets and the whole map are loaded into the engine.</li>
This page documents map presentation functions.
<p>
Note: This is for the new map format. Not implented yet.
Note: This is for the new map format. Not implented yet.
<h2>Functions</h2>
<a name="CreateMap"></a>
<h3>PresentMap(name, description, numplayers, mapwidth, mapheight)</h3>
<a name="PresentMap"></a>
<h3>PresentMap(description, numplayers, mapwidth, mapheight)</h3>
<dl>
<dt>Name</dt>
<dd>Name of the map as displayed to the user.</dd>
<dt>Description</dt>
<dd>A textual description of the map that can be displayed to the user.</dd>
<dt>numplayers</dt>
@ -82,16 +81,10 @@ Note: This is for the new map format. Not implented yet.
<dd>The sizes of the map.</dd>
</dl>
<p>
Note: This is for the new map format. Not implented yet.
<h4>Example</h4>
<pre>
PresentMap("Doom World",
"As you enter hell, you encounter the home of Doom monster. " +
"Be careful for the worst of them all: John Carmack.",
4, 64, 64)
PresentMap("Doom World", 4, 64, 64)
</pre>
<a name="SetMapMiniImage"></a>
@ -106,7 +99,7 @@ Path to the file with the graphic.
</dd></dl>
<p>
Note: This is for the new map format. Not implented yet.
Note: This is for the new map format. Not implented yet.
<h4>Example</h4>
@ -114,15 +107,30 @@ Note: This is for the new map format. Not implented yet.
SetMiniImage("doomworld/doomworld.png")
</pre>
<a name="DefinePlayerTypes"></a>
<h3>DefinePlayerType(player1, player2, ...)</h3>
Define the number of players and their type on the map. Possible values for player type are:
<ul>
<li>"neutral"</li>
<li>"nobody"</li>
<li>"computer"</li>
<li>"person"</li>
<li>"rescue-passive"</li>
<li>"rescue-active"</li>
</ul>
<h4>Example</h4>
<pre>
DefinePlayerTypes("person", "person")
</pre>
<a name="DefineMapSetup"></a>
<h3>DefineMapSetup(luafile)</h3>
Define the map setup file that will be loaded if the player starts a game with this map.
<p>
Note: This is for the new map format. Not implented yet.
<h4>Example</h4>
<pre>
@ -139,7 +147,7 @@ A map can define configuration options. A player can modify those
options just before starting a game. For example: the tileset to use, your race, game type,
number of opponents or the amount of resources on the map.
<p>
Note: This is for the new map format. Not implented yet.
Note: This is for the new map format. Not implented yet.
<h4>Example</h4>

View file

@ -533,14 +533,14 @@ static void DrawUnitIcons(void)
if (i == PlayerMax / 2) {
y += 20;
}
if (i == CursorPlayer && TheMap.Info->PlayerType[i] != PlayerNobody) {
if (i == CursorPlayer && TheMap.Info.PlayerType[i] != PlayerNobody) {
VideoDrawRectangle(ColorWhite, x + i % 8 * 20, y, 20, 20);
}
VideoDrawRectangle(
i == CursorPlayer && TheMap.Info->PlayerType[i] != PlayerNobody ?
i == CursorPlayer && TheMap.Info.PlayerType[i] != PlayerNobody ?
ColorWhite : ColorGray,
x + i % 8 * 20, y, 19, 19);
if (TheMap.Info->PlayerType[i] != PlayerNobody) {
if (TheMap.Info.PlayerType[i] != PlayerNobody) {
VideoFillRectangle(Players[i].Color, x + 1 + i % 8 * 20, y + 1,
17, 17);
}
@ -555,10 +555,10 @@ static void DrawUnitIcons(void)
y += 18 * 1 + 4;
if (SelectedPlayer != -1) {
i = sprintf(buf,"Plyr %d %s ", SelectedPlayer,
PlayerRaces.Name[TheMap. Info->PlayerSide[SelectedPlayer]]);
PlayerRaces.Name[TheMap. Info.PlayerSide[SelectedPlayer]]);
// Players[SelectedPlayer].RaceName);
switch (TheMap.Info->PlayerType[SelectedPlayer]) {
switch (TheMap.Info.PlayerType[SelectedPlayer]) {
case PlayerNeutral:
strcat(buf, "Neutral");
break;
@ -1134,7 +1134,7 @@ static void EditorCallbackButtonDown(unsigned button __attribute__ ((unused)))
}
// Cursor on player icons
if (CursorPlayer != -1) {
if (TheMap.Info->PlayerType[CursorPlayer] != PlayerNobody) {
if (TheMap.Info.PlayerType[CursorPlayer] != PlayerNobody) {
SelectedPlayer = CursorPlayer;
ThisPlayer = Players + SelectedPlayer;
}
@ -1588,7 +1588,7 @@ static void EditorCallbackMouse(int x, int y)
by += 20;
}
if (bx < x && x < bx + 20 && by < y && y < by + 20) {
if (TheMap.Info->PlayerType[i] != PlayerNobody) {
if (TheMap.Info.PlayerType[i] != PlayerNobody) {
sprintf(buf,"Select player #%d",i);
SetStatusLine(buf);
} else {
@ -1819,35 +1819,35 @@ static void CreateEditor(void)
//
// Inititialize TheMap / Players.
//
TheMap.Info->MapTerrainName =
strdup(Tilesets[TheMap.Info->MapTerrain]->Ident);
TheMap.Info.MapTerrainName =
strdup(Tilesets[TheMap.Info.MapTerrain]->Ident);
InitPlayers();
for (i = 0; i < PlayerMax; ++i) {
int j;
if (i == PlayerNumNeutral) {
CreatePlayer(PlayerNeutral);
TheMap.Info->PlayerType[i] = PlayerNeutral;
TheMap.Info->PlayerSide[i] = Players[i].Race = PlayerRaceNeutral;
TheMap.Info.PlayerType[i] = PlayerNeutral;
TheMap.Info.PlayerSide[i] = Players[i].Race = PlayerRaceNeutral;
} else {
CreatePlayer(PlayerNobody);
TheMap.Info->PlayerType[i] = PlayerNobody;
TheMap.Info.PlayerType[i] = PlayerNobody;
}
for (j = 1; j < MaxCosts; ++j) {
TheMap.Info->PlayerResources[i][j] = Players[i].Resources[j];
TheMap.Info.PlayerResources[i][j] = Players[i].Resources[j];
}
}
strncpy(TheMap.Description, TheMap.Info->Description, 32);
TheMap.Width = TheMap.Info->MapWidth;
TheMap.Height = TheMap.Info->MapHeight;
strncpy(TheMap.Description, TheMap.Info.Description, 32);
TheMap.Width = TheMap.Info.MapWidth;
TheMap.Height = TheMap.Info.MapHeight;
TheMap.Fields = calloc(TheMap.Width * TheMap.Height, sizeof(MapField));
TheMap.Visible[0] = calloc(TheMap.Width * TheMap.Height / 8, 1);
InitUnitCache();
TheMap.Terrain = TheMap.Info->MapTerrain;
TheMap.TerrainName = strdup(Tilesets[TheMap.Info->MapTerrain]->Ident);
TheMap.Tileset = Tilesets[TheMap.Info->MapTerrain];
TheMap.Terrain = TheMap.Info.MapTerrain;
TheMap.TerrainName = strdup(Tilesets[TheMap.Info.MapTerrain]->Ident);
TheMap.Tileset = Tilesets[TheMap.Info.MapTerrain];
LoadTileset();
for (i = 0; i < TheMap.Width * TheMap.Height; ++i) {
@ -1870,14 +1870,14 @@ static void CreateEditor(void)
// Place the start points, which the loader discarded.
//
for (i = 0; i < PlayerMax; ++i) {
if (TheMap.Info->PlayerType[i] != PlayerNobody) {
if (TheMap.Info.PlayerType[i] != PlayerNobody) {
// Set SelectedPlayer to a valid player
if (SelectedPlayer == 15) {
SelectedPlayer = i;
}
#if 0
// FIXME: must support more races
switch (TheMap.Info->PlayerSide[i]) {
switch (TheMap.Info.PlayerSide[i]) {
case PlayerRaceHuman:
MakeUnitAndPlace(Players[i].StartX, Players[i].StartY,
UnitTypeByWcNum(WC_StartLocationHuman),

View file

@ -168,7 +168,8 @@ void PlayCampaign(const char* name)
SkipCurrentChapter = 1;
GameResult = GameNoResult;
strcpy(CurrentMapPath, filename);
FreeMapInfo(&TheMap.Info);
sprintf(CurrentMapPath, "%s/%s", StratagusLibPath, filename);
}
/**

View file

@ -122,7 +122,7 @@ static void LoadStratagusMap(const char* mapname,
fprintf(stderr, "%s: invalid Stratagus map\n", mapname);
ExitFatal(-1);
}
TheMap.Info->Filename = strdup(mapname);
TheMap.Info.Filename = strdup(mapname);
}
/**
@ -133,7 +133,7 @@ static void LoadStratagusMap(const char* mapname,
*/
static void LoadMap(const char* filename, WorldMap* map)
{
const char* tmp;
char* tmp;
tmp = strrchr(filename, '.');
if (tmp) {
@ -149,6 +149,15 @@ static void LoadMap(const char* filename, WorldMap* map)
}
}
#endif
if (!strcmp(tmp, ".smp")) {
if (!TheMap.Info.Filename) {
// The map info hasn't been loaded yet => do it now
LuaLoadFile(filename);
}
Assert(TheMap.Info.Filename);
LoadStratagusMap(TheMap.Info.Filename, map);
return;
}
if (!strcmp(tmp, ".cm")
#ifdef USE_ZLIB
|| !strcmp(tmp, ".cm.gz")
@ -164,8 +173,11 @@ static void LoadMap(const char* filename, WorldMap* map)
// ARI: This bombs out, if no pud, so will be safe.
if (strcasestr(filename, ".pud")) {
LoadPud(filename, map);
map->Info->Filename = strdup(filename);
map->Info.Filename = strdup(filename);
return;
}
printf("Unrecognized map format\n");
}
/*----------------------------------------------------------------------------

View file

@ -257,7 +257,7 @@ void SaveGame(const char* filename)
StratagusMajorVersion, StratagusMinorVersion, StratagusPatchLevel);
CLprintf(file, " SyncHash = %d, \n", SyncHash);
CLprintf(file, " SyncRandSeed = %d, \n", SyncRandSeed);
CLprintf(file, " SaveFile = \"%s\"\n", TheMap.Info->Filename);
CLprintf(file, " SaveFile = \"%s\"\n", CurrentMapPath);
CLprintf(file, "\n--- \"preview\", \"%s.pam\",\n", filename);
CLprintf(file, "} )\n\n");

View file

@ -291,8 +291,8 @@ typedef struct _world_map_ {
char Description[32];///< map description short
MapInfo* Info; ///< descriptive information
// TODO: (MapInfo* Info DUPLICATES!)
MapInfo Info; ///< descriptive information
// TODO: (remove MapInfo Info DUPLICATES!)
} WorldMap;
/*----------------------------------------------------------------------------

View file

@ -299,7 +299,6 @@ extern Menu* CurrentMenu; ///< Current menu
extern struct _graphic_* MenuButtonGraphics[];///< Menu button graphics
extern struct _graphic_* MenuButtonG; ///< Current menu button graphics
extern struct _map_info_* MenuMapInfo; ///< MapInfo of map used in gui menus
extern char MenuMapFullPath[1024]; ///< Full path to currently selected map
extern int nKeyStrokeHelps; ///< Number of loaded keystroke helps

View file

@ -93,7 +93,7 @@ struct _world_map_;
----------------------------------------------------------------------------*/
/// Return info for pud
extern MapInfo* GetPudInfo(const char* pud);
extern MapInfo* GetPudInfo(const char* pud, MapInfo* info);
/// Load a pud file
extern void LoadPud(const char* pud, struct _world_map_* map);

View file

@ -10,7 +10,7 @@
//
/**@name map.c - The map. */
//
// (c) Copyright 1998-2004 by Lutz Sammer and Vladi Shabanski
// (c) Copyright 1998-2004 by Lutz Sammer, Vladi Shabanski and François Beerten
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@ -414,7 +414,7 @@ void FreeMapInfo(MapInfo* info)
if (info->Filename) {
free(info->Filename);
}
free(info);
memset(info, 0, sizeof(MapInfo));
}
}
@ -429,7 +429,7 @@ void CleanMap(void)
// Tileset freed by Tileset?
FreeMapInfo(TheMap.Info);
FreeMapInfo(&TheMap.Info);
memset(&TheMap, 0, sizeof(TheMap));
FlagRevealMap = 0;
ReplayRevealMap = 0;

View file

@ -85,7 +85,7 @@ void SaveMap(CLFile* file)
CLprintf(file, " \"size\", {%d, %d},\n", TheMap.Width, TheMap.Height);
CLprintf(file, " \"%s\",\n", TheMap.NoFogOfWar ? "no-fog-of-war" : "fog-of-war");
CLprintf(file, " \"filename\", \"%s\",\n", TheMap.Info->Filename);
CLprintf(file, " \"filename\", \"%s\",\n", TheMap.Info.Filename);
CLprintf(file, " \"map-fields\", {\n");
for (h = 0; h < TheMap.Height; ++h) {

View file

@ -71,10 +71,6 @@ static int CclStratagusMap(lua_State* l)
// Parse the list: (still everything could be changed!)
//
if (!TheMap.Info) {
TheMap.Info = calloc(1, sizeof(MapInfo));
}
args = lua_gettop(l);
for (j = 0; j < args; ++j) {
value = LuaToString(l, j + 1);
@ -89,11 +85,11 @@ static int CclStratagusMap(lua_State* l)
fprintf(stderr, "Warning not saved with this version.\n");
}
} else if (!strcmp(value, "uid")) {
TheMap.Info->MapUID = LuaToNumber(l, j + 1);
TheMap.Info.MapUID = LuaToNumber(l, j + 1);
} else if (!strcmp(value, "description")) {
value = LuaToString(l, j + 1);
strncpy(TheMap.Description, value, sizeof(TheMap.Description));
TheMap.Info->Description = strdup(value);
TheMap.Info.Description = strdup(value);
} else if (!strcmp(value, "the-map")) {
if (!lua_istable(l, j + 1)) {
LuaError(l, "incorrect argument");
@ -154,7 +150,7 @@ static int CclStratagusMap(lua_State* l)
--k;
} else if (!strcmp(value, "filename")) {
lua_rawgeti(l, j + 1, k + 1);
TheMap.Info->Filename = strdup(LuaToString(l, -1));
TheMap.Info.Filename = strdup(LuaToString(l, -1));
lua_pop(l, 1);
} else if (!strcmp(value, "map-fields")) {
int i;
@ -445,6 +441,43 @@ static int CclSetFogOfWarGraphics(lua_State* l)
return 0;
}
/**
** Define the type of each player available for the map
**
** @param l Lua state.
*/
static int CclDefinePlayerTypes(lua_State* l)
{
const char* type;
int numplayers;
int i;
numplayers = lua_gettop(l); /* Number of players == number of arguments */
if (numplayers < 2) {
LuaError(l, "Not enough players");
}
for (i = 0; i < numplayers; i++) {
type = LuaToString(l, i + 1);
if (!strcmp(type, "neutral")) {
TheMap.Info.PlayerType[i] = PlayerNeutral;
} else if (!strcmp(type, "nobody")) {
TheMap.Info.PlayerType[i] = PlayerNobody;
} else if (!strcmp(type, "computer")) {
TheMap.Info.PlayerType[i] = PlayerComputer;
} else if (!strcmp(type, "person")) {
TheMap.Info.PlayerType[i] = PlayerPerson;
} else if (!strcmp(type, "rescue-passive")) {
TheMap.Info.PlayerType[i] = PlayerRescuePassive;
} else if (!strcmp(type, "rescue-active")) {
TheMap.Info.PlayerType[i] = PlayerRescueActive;
} else {
LuaError(l, "Unsupported tag: %s" _C_ type);
}
}
return 0;
}
/**
** Register CCL features for map.
*/
@ -463,6 +496,8 @@ void MapCclRegister(void)
lua_register(Lua, "SetFogOfWarOpacity", CclSetFogOfWarOpacity);
lua_register(Lua, "SetForestRegeneration",CclSetForestRegeneration);
lua_register(Lua, "DefinePlayerTypes", CclDefinePlayerTypes);
}
//@}

View file

@ -195,7 +195,7 @@ static FullReplay* StartReplay(void)
replay->Date = strdup(s);
replay->Map = strdup(TheMap.Description);
replay->MapId = (signed int)TheMap.Info->MapUID;
replay->MapId = (signed int)TheMap.Info.MapUID;
replay->MapPath = strdup(CurrentMapPath);
replay->Resource = GameSettings.Resources;
replay->NumUnits = GameSettings.NumUnits;

View file

@ -353,7 +353,7 @@ void NetworkServerStartGame(void)
// Make a list of the available player slots.
for (h = i = 0; i < PlayerMax; ++i) {
if (MenuMapInfo->PlayerType[i] == PlayerPerson) {
if (TheMap.Info.PlayerType[i] == PlayerPerson) {
rev[i] = h;
num[h++] = i;
DebugPrint("Slot %d is available for an interactive player (%d)\n" _C_
@ -363,7 +363,7 @@ void NetworkServerStartGame(void)
// Make a list of the available computer slots.
n = h;
for (i = 0; i < PlayerMax; ++i) {
if (MenuMapInfo->PlayerType[i] == PlayerComputer) {
if (TheMap.Info.PlayerType[i] == PlayerComputer) {
rev[i] = n++;
DebugPrint("Slot %d is available for an ai computer player (%d)\n" _C_
i _C_ rev[i]);
@ -371,8 +371,8 @@ void NetworkServerStartGame(void)
}
// Make a list of the remaining slots.
for (i = 0; i < PlayerMax; ++i) {
if (MenuMapInfo->PlayerType[i] != PlayerPerson &&
MenuMapInfo->PlayerType[i] != PlayerComputer) {
if (TheMap.Info.PlayerType[i] != PlayerPerson &&
TheMap.Info.PlayerType[i] != PlayerComputer) {
rev[i] = n++;
// PlayerNobody - not available to anything..
}
@ -435,7 +435,7 @@ void NetworkServerStartGame(void)
j = h;
if (NoRandomPlacementMultiplayer == 1) {
for (i = 0; i < PlayerMax; ++i) {
if (MenuMapInfo->PlayerType[i] != PlayerComputer) {
if (TheMap.Info.PlayerType[i] != PlayerComputer) {
org[i] = Hosts[i].PlyNr;
}
}
@ -506,7 +506,7 @@ void NetworkServerStartGame(void)
message.Type = MessageInitReply;
message.SubType = ICMConfig;
message.HostsCount = NetPlayers;
message.MapUID = htonl(MenuMapInfo->MapUID);
message.MapUID = htonl(TheMap.Info.MapUID);
for (i = 0; i < NetPlayers; ++i) {
message.u.Hosts[i].Host = Hosts[i].Host;
message.u.Hosts[i].Port = Hosts[i].Port;
@ -519,7 +519,7 @@ void NetworkServerStartGame(void)
statemsg.SubType = ICMState;
statemsg.HostsCount = NetPlayers;
statemsg.u.State = ServerSetupState;
statemsg.MapUID = htonl(MenuMapInfo->MapUID);
statemsg.MapUID = htonl(TheMap.Info.MapUID);
msg = (InitMessage*)buf;
DebugPrint("Ready, sending InitConfig to %d host(s)\n" _C_ HostsCount);
@ -705,7 +705,7 @@ changed:
message.Type = MessageInitHello;
message.SubType = ICMState;
message.u.State = LocalSetupState;
message.MapUID = htonl(MenuMapInfo->MapUID);
message.MapUID = htonl(TheMap.Info.MapUID);
NetworkSendRateLimitedClientMessage(&message, 450);
} else {
NetLocalState = ccs_unreachable;
@ -725,10 +725,10 @@ changed:
}
break;
case ccs_mapinfo:
if (NetStateMsgCnt < 20 && MenuMapInfo != NULL) { // 20 retries
if (NetStateMsgCnt < 20) { // 20 retries
message.Type = MessageInitHello;
message.SubType = ICMMap; // ICMMapAck..
message.MapUID = htonl(MenuMapInfo->MapUID);
message.MapUID = htonl(TheMap.Info.MapUID);
NetworkSendRateLimitedClientMessage(&message, 650);
} else {
NetLocalState = ccs_unreachable;
@ -739,11 +739,7 @@ changed:
if (NetStateMsgCnt < 20) { // 20 retries
message.Type = MessageInitHello;
message.SubType = ICMMapUidMismatch;
if (MenuMapInfo) {
message.MapUID = htonl(MenuMapInfo->MapUID); // MAP Uid doesn't match
} else {
message.MapUID = 0L; // Map not found
}
message.MapUID = htonl(TheMap.Info.MapUID); // MAP Uid doesn't match
NetworkSendRateLimitedClientMessage(&message, 650);
} else {
NetLocalState = ccs_unreachable;
@ -813,7 +809,7 @@ void NetworkProcessServerRequest(void)
unsigned long fcd;
InitMessage message;
if (MenuMapInfo == NULL) {
if (GameRunning) {
return;
// Game already started...
}
@ -965,10 +961,10 @@ static void ClientParseConnected(const InitMessage* msg)
NetLocalState = ccs_badmap;
break;
}
if (ntohl(msg->MapUID) != MenuMapInfo->MapUID) {
if (ntohl(msg->MapUID) != TheMap.Info.MapUID) {
NetLocalState = ccs_badmap;
fprintf(stderr, "Stratagus maps do not match (0x%08x) <-> (0x%08x)\n",
(unsigned int)MenuMapInfo->MapUID,
(unsigned int)TheMap.Info.MapUID,
(unsigned int)ntohl(msg->MapUID));
break;
}
@ -1343,7 +1339,7 @@ static void ServerParseWaiting(const int h)
message.SubType = ICMMap; // Send Map info to the client
pathlen = strlen(StratagusLibPath) + 1;
memcpy(message.u.MapPath, MenuMapFullPath + pathlen, 256);
message.MapUID = htonl(MenuMapInfo->MapUID);
message.MapUID = htonl(TheMap.Info.MapUID);
n = NetworkSendICMessage(NetLastHost, NetLastPort, &message);
DebugPrint("Sending InitReply Message Map: (%d) to %d.%d.%d.%d:%d\n" _C_
n _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort));
@ -1377,7 +1373,7 @@ static void ServerParseWaiting(const int h)
message.Type = MessageInitReply;
message.SubType = ICMState; // Send new state info to the client
message.u.State = ServerSetupState;
message.MapUID = htonl(MenuMapInfo->MapUID);
message.MapUID = htonl(TheMap.Info.MapUID);
n = NetworkSendICMessage(NetLastHost, NetLastPort, &message);
DebugPrint("Sending InitReply Message State: (%d) to %d.%d.%d.%d:%d\n" _C_
n _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort));
@ -1418,7 +1414,7 @@ static void ServerParseMap(const int h)
message.Type = MessageInitReply;
message.SubType = ICMState; // Send State info to the client
message.u.State = ServerSetupState;
message.MapUID = htonl(MenuMapInfo->MapUID);
message.MapUID = htonl(TheMap.Info.MapUID);
n = NetworkSendICMessage(NetLastHost, NetLastPort, &message);
DebugPrint("Sending InitReply Message State: (%d) to %d.%d.%d.%d:%d\n" _C_
n _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort));
@ -1475,7 +1471,7 @@ static void ServerParseState(const int h, const InitMessage* msg)
message.Type = MessageInitReply;
message.SubType = ICMState; // Send new state info to the client
message.u.State = ServerSetupState;
message.MapUID = htonl(MenuMapInfo->MapUID);
message.MapUID = htonl(TheMap.Info.MapUID);
n = NetworkSendICMessage(NetLastHost, NetLastPort, &message);
DebugPrint("Sending InitReply Message State: (%d) to %d.%d.%d.%d:%d\n" _C_
n _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort));

View file

@ -353,13 +353,12 @@ static int PudReadByte(CLFile* input)
/**
** Get the info for a pud.
*/
MapInfo* GetPudInfo(const char* pud)
MapInfo* GetPudInfo(const char* pud, MapInfo* info)
{
CLFile* input;
uint32_t length;
char header[5];
char buf[1024];
MapInfo* info;
unsigned short temp_short;
// FIXME: Reuse the temporary alloca buffer...
@ -387,10 +386,7 @@ MapInfo* GetPudInfo(const char* pud)
return NULL;
}
info=calloc(1, sizeof(MapInfo)); // clears with 0
if (!info) {
return NULL;
}
memset(info, 0, sizeof(MapInfo)); // clears with 0
info->Filename = strdup(pud);
@ -813,9 +809,7 @@ void LoadPud(const char* pud,WorldMap* map)
strcat(pudfull, "/");
strcat(pudfull, pud);
if (!map->Info) {
map->Info = GetPudInfo(pudfull);
}
GetPudInfo(pudfull, &map->Info);
if( !(input=CLopen(pudfull,CL_OPEN_READ)) ) {
fprintf(stderr,"Try ./path/name\n");
fprintf(stderr,"pud: CLopen(%s): %s\n", pud, strerror(errno));
@ -1577,10 +1571,10 @@ int SavePud(const char* pud,const WorldMap* map)
buf[0x9]=0x00;
buf[0xA]=0x0A;
buf[0xB]=0xFF;
buf[0xC]=map->Info->MapUID >> 0;
buf[0xD]=map->Info->MapUID >> 8;
buf[0xE]=map->Info->MapUID >> 16;
buf[0xF]=map->Info->MapUID >> 24;
buf[0xC]=map->Info.MapUID >> 0;
buf[0xD]=map->Info.MapUID >> 8;
buf[0xE]=map->Info.MapUID >> 16;
buf[0xF]=map->Info.MapUID >> 24;
gzwrite(f,buf,16);
PudWriteHeader(f,"VER ",2);
@ -1590,18 +1584,18 @@ int SavePud(const char* pud,const WorldMap* map)
PudWriteHeader(f,"DESC",32);
memset(buf,0,32);
strncpy(buf,map->Info->Description,32);
strncpy(buf,map->Info.Description,32);
gzwrite(f,buf,32);
PudWriteHeader(f,"OWNR",16);
for( i=0; i<16; ++i ) {
buf[i]=map->Info->PlayerType[i];
buf[i]=map->Info.PlayerType[i];
}
gzwrite(f,buf,16);
PudWriteHeader(f,"ERAX",2);
buf[0]=map->Info->MapTerrain >> 0;
buf[1]=map->Info->MapTerrain >> 8;
buf[0]=map->Info.MapTerrain >> 0;
buf[1]=map->Info.MapTerrain >> 8;
gzwrite(f,buf,2);
PudWriteHeader(f,"DIM ",4);
@ -1633,34 +1627,34 @@ int SavePud(const char* pud,const WorldMap* map)
PudWriteHeader(f,"SIDE",16);
for( i=0; i<16; ++i ) {
buf[i]=map->Info->PlayerSide[i];
buf[i]=map->Info.PlayerSide[i];
}
gzwrite(f,buf,16);
PudWriteHeader(f,"SGLD",32);
for( i=0; i<16; ++i ) {
buf[i*2+0]=map->Info->PlayerResources[i][GoldCost] >> 0;
buf[i*2+1]=map->Info->PlayerResources[i][GoldCost] >> 8;
buf[i*2+0]=map->Info.PlayerResources[i][GoldCost] >> 0;
buf[i*2+1]=map->Info.PlayerResources[i][GoldCost] >> 8;
}
gzwrite(f,buf,32);
PudWriteHeader(f,"SLBR",32);
for( i=0; i<16; ++i ) {
buf[i*2+0]=map->Info->PlayerResources[i][WoodCost] >> 0;
buf[i*2+1]=map->Info->PlayerResources[i][WoodCost] >> 8;
buf[i*2+0]=map->Info.PlayerResources[i][WoodCost] >> 0;
buf[i*2+1]=map->Info.PlayerResources[i][WoodCost] >> 8;
}
gzwrite(f,buf,32);
PudWriteHeader(f,"SOIL",32);
for( i=0; i<16; ++i ) {
buf[i*2+0]=map->Info->PlayerResources[i][OilCost] >> 0;
buf[i*2+1]=map->Info->PlayerResources[i][OilCost] >> 8;
buf[i*2+0]=map->Info.PlayerResources[i][OilCost] >> 0;
buf[i*2+1]=map->Info.PlayerResources[i][OilCost] >> 8;
}
gzwrite(f,buf,32);
PudWriteHeader(f,"AIPL",16);
for( i=0; i<16; ++i ) {
buf[i]=map->Info->PlayerAi[i];
buf[i]=map->Info.PlayerAi[i];
}
gzwrite(f,buf,16);

View file

@ -669,8 +669,7 @@ void MenuLoop(char* filename, WorldMap* map)
// - FIXME: not the ideal place for this..
//
DebugPrint("Freeing map info, wrong place\n");
FreeMapInfo(map->Info);
map->Info = NULL;
FreeMapInfo(&map->Info);
//
// No filename given, choose with the menus
@ -730,6 +729,7 @@ void MenuLoop(char* filename, WorldMap* map)
//
// Create the game.
//
DebugPrint("Creating game with map: %s\n" _C_ filename);
CreateGame(filename, map);
SetStatusLine(NameLine);
@ -750,7 +750,9 @@ void MenuLoop(char* filename, WorldMap* map)
PreMenuSetup();
filename = NextChapter();
DebugPrint("Next chapter %s\n" _C_ filename);
sprintf(CurrentMapPath, "%s/%s", StratagusLibPath, filename);
filename = CurrentMapPath;
DebugPrint("Next chapter %s\n" _C_ CurrentMapPath);
}
}

View file

@ -428,7 +428,6 @@ static char ScenSelectPath[1024]; ///< Scenario selector path
static char ScenSelectDisplayPath[1024]; ///< Displayed selector path
static char ScenSelectFileName[128]; ///< Scenario selector name
MapInfo *MenuMapInfo; ///< Selected map info
char MenuMapFullPath[1024]; ///< Selected map path+name
static char *SaveDir; ///< Save game directory
@ -2485,9 +2484,6 @@ static void GetInfoFromSelectPath(void)
{
int i;
FreeMapInfo(MenuMapInfo);
MenuMapInfo = NULL;
if (ScenSelectPath[0]) {
i = strlen(ScenSelectPath);
strcat(ScenSelectPath, "/");
@ -2496,10 +2492,10 @@ static void GetInfoFromSelectPath(void)
}
strcat(ScenSelectPath, ScenSelectFileName); // Final map name with path
if (strcasestr(ScenSelectFileName, ".pud")) {
MenuMapInfo = GetPudInfo(ScenSelectPath);
GetPudInfo(ScenSelectPath, &TheMap.Info);
strcpy(MenuMapFullPath, ScenSelectPath);
} else {
// FIXME: GetCmInfo();
} else if(strcasestr(ScenSelectFileName, ".smp")) {
LuaLoadFile(ScenSelectPath);
}
ScenSelectPath[i] = '\0'; // Remove appended part
}
@ -2519,21 +2515,15 @@ static void ScenSelectMenu(void)
GetInfoFromSelectPath();
menu = FindMenu("menu-custom-game");
// FIXME: This check is only needed until GetCmInfo works
if (!MenuMapInfo) {
menu->Items[12].D.Pulldown.noptions = PlayerMax-1;
for (n = j = 0; j < PlayerMax; ++j) {
t = TheMap.Info.PlayerType[j];
if (t == PlayerPerson || t == PlayerComputer) {
n++;
}
}
menu->Items[12].D.Pulldown.noptions = n;
if (menu->Items[12].D.Pulldown.curopt >= n) {
menu->Items[12].D.Pulldown.curopt = 0;
} else {
for (n = j = 0; j < PlayerMax; ++j) {
t = MenuMapInfo->PlayerType[j];
if (t == PlayerPerson || t == PlayerComputer) {
n++;
}
}
menu->Items[12].D.Pulldown.noptions = n;
if (menu->Items[12].D.Pulldown.curopt >= n) {
menu->Items[12].D.Pulldown.curopt = 0;
}
}
}
@ -3008,6 +2998,28 @@ static void MultiPlayerInternetGame(void)
}
}
/**
** Allocate and deep copy a MapInfo structure
*/
static MapInfo* DuplicateMapInfo(MapInfo *orig)
{
MapInfo* dest;
dest = malloc(sizeof(MapInfo));
memcpy(dest, orig, sizeof(MapInfo));
if (orig->Description) {
dest->Description = strdup(orig->Description);
}
if (dest->MapTerrainName) {
dest->MapTerrainName = strdup(orig->MapTerrainName);
}
if (dest->Filename) {
dest->Filename = strdup(orig->Filename);
}
return dest;
}
/**
** Free map info data
*/
@ -3018,6 +3030,7 @@ static void FreeMapInfos(FileList *fl, int n)
for (i = 0; i < n; i++) {
if (fl[i].type && fl[i].xdata) {
FreeMapInfo(fl[i].xdata);
free(fl[i].xdata);
fl[i].xdata = NULL;
}
free(fl[i].name);
@ -3092,7 +3105,7 @@ static int ScenSelectRDFilter(char *pathbuf, FileList *fl)
curopt = menu->Items[6].D.Pulldown.curopt;
if (curopt == 0) {
suf[0] = ".cm";
suf[0] = ".smp";
suf[1] = NULL;
} else if (curopt == 1) {
suf[0] = ".pud";
@ -3141,20 +3154,22 @@ static int ScenSelectRDFilter(char *pathbuf, FileList *fl)
#endif
if (*cp == 0) {
if (curopt == 0) {
// info = GetCmInfo(pathbuf);
info = NULL;
fl->type = 1;
fl->name = strdup(np);
fl->xdata = info;
FreeMapInfo(&TheMap.Info);
LuaLoadFile(pathbuf);
fl->xdata = DuplicateMapInfo(&TheMap.Info);
return 1;
} else if (curopt == 1) {
info = GetPudInfo(pathbuf);
FreeMapInfo(&TheMap.Info);
info = GetPudInfo(pathbuf, &TheMap.Info);
if (info) {
sz = szl[menu->Items[8].D.Pulldown.curopt];
if (sz < 0 || (info->MapWidth == sz && info->MapHeight == sz)) {
fl->type = 1;
fl->name = strdup(np);
fl->xdata = info;
fl->xdata = DuplicateMapInfo(info);
return 1;
} else {
FreeMapInfo(info);
@ -3474,8 +3489,6 @@ static void ScenSelectCancel(void)
*/
static void GameCancel(void)
{
FreeMapInfo(MenuMapInfo);
MenuMapInfo = NULL;
EndMenu();
}
@ -3487,9 +3500,6 @@ static void CustomGameStart(void)
int i;
char *p;
FreeMapInfo(MenuMapInfo);
MenuMapInfo = NULL;
if (ScenSelectPath[0]) {
strcat(ScenSelectPath, "/");
strcat(ScenSelectPath, ScenSelectFileName); // Final map name with path
@ -3551,21 +3561,15 @@ static void GameSetupInit(Menuitem* mi __attribute__ ((unused)))
GetInfoFromSelectPath();
menu = FindMenu("menu-custom-game");
// FIXME: This check is only needed until GetCmInfo works
if (!MenuMapInfo) {
menu->Items[12].D.Pulldown.noptions = PlayerMax-1;
for (n = j = 0; j < PlayerMax; ++j) {
t = TheMap.Info.PlayerType[j];
if (t == PlayerPerson || t == PlayerComputer) {
n++;
}
}
menu->Items[12].D.Pulldown.noptions = n;
if (menu->Items[12].D.Pulldown.curopt >= n) {
menu->Items[12].D.Pulldown.curopt = 0;
} else {
for (n = j = 0; j < PlayerMax; ++j) {
t = MenuMapInfo->PlayerType[j];
if (t == PlayerPerson || t == PlayerComputer) {
n++;
}
}
menu->Items[12].D.Pulldown.noptions = n;
if (menu->Items[12].D.Pulldown.curopt >= n) {
menu->Items[12].D.Pulldown.curopt = 0;
}
}
}
@ -3584,13 +3588,12 @@ static void GameDrawFunc(Menuitem* mi __attribute__((unused)))
l = VideoTextLength(GameFont, "Scenario:");
VideoDrawText(TheUI.Offset640X + 16, TheUI.Offset480Y + 360, GameFont, "Scenario:");
VideoDrawText(TheUI.Offset640X + 16, TheUI.Offset480Y + 360 + 24 , GameFont, ScenSelectFileName);
if (MenuMapInfo) {
if (MenuMapInfo->Description) {
VideoDrawText(TheUI.Offset640X + 16 + l + 8, TheUI.Offset480Y + 360, GameFont, MenuMapInfo->Description);
}
sprintf(buffer, " (%d x %d)", MenuMapInfo->MapWidth, MenuMapInfo->MapHeight);
VideoDrawText(TheUI.Offset640X + 16 + l + 8 + VideoTextLength(GameFont, ScenSelectFileName), TheUI.Offset480Y + 360 + 24, GameFont, buffer);
if (TheMap.Info.Description) {
VideoDrawText(TheUI.Offset640X + 16 + l + 8, TheUI.Offset480Y + 360, GameFont, TheMap.Info.Description);
}
sprintf(buffer, " (%d x %d)", TheMap.Info.MapWidth, TheMap.Info.MapHeight);
VideoDrawText(TheUI.Offset640X + 16 + l + 8 + VideoTextLength(GameFont, ScenSelectFileName), TheUI.Offset480Y + 360 + 24, GameFont, buffer);
#if 0
for (n = j = 0; j < PlayerMax; j++) {
if (info->PlayerType[j] == PlayerPerson) {
@ -3803,8 +3806,6 @@ static void NetworkGamePrepareGameSettings(void)
int x;
int v;
Assert(MenuMapInfo);
DebugPrint("NetPlayers = %d\n" _C_ NetPlayers);
GameSettings.NetGameType=SettingsMultiPlayerGame;
@ -3825,10 +3826,10 @@ static void NetworkGamePrepareGameSettings(void)
// Make a list of the available player slots.
for (c = h = i = 0; i < PlayerMax; i++) {
if (MenuMapInfo->PlayerType[i] == PlayerPerson) {
if (TheMap.Info.PlayerType[i] == PlayerPerson) {
num[h++] = i;
}
if (MenuMapInfo->PlayerType[i] == PlayerComputer) {
if (TheMap.Info.PlayerType[i] == PlayerComputer) {
comp[c++] = i; // available computer player slots
}
}
@ -3902,10 +3903,10 @@ static void MultiGamePlayerSelectorsUpdate(int initial)
// Calculate available slots from pudinfo
for (c = h = i = 0; i < PlayerMax; i++) {
if (MenuMapInfo->PlayerType[i] == PlayerPerson) {
if (TheMap.Info.PlayerType[i] == PlayerPerson) {
h++; // available interactive player slots
}
if (MenuMapInfo->PlayerType[i] == PlayerComputer) {
if (TheMap.Info.PlayerType[i] == PlayerComputer) {
c++; // available computer player slots
}
}
@ -4039,10 +4040,10 @@ static void MultiClientUpdate(int initial)
// Calculate available slots from pudinfo
for (c = h = i = 0; i < PlayerMax; i++) {
if (MenuMapInfo->PlayerType[i] == PlayerPerson) {
if (TheMap.Info.PlayerType[i] == PlayerPerson) {
h++; // available interactive player slots
}
if (MenuMapInfo->PlayerType[i] == PlayerComputer) {
if (TheMap.Info.PlayerType[i] == PlayerComputer) {
c++; // available computer player slots
}
}
@ -4134,7 +4135,7 @@ static void MultiGameSetupInit(Menuitem* mi)
memset(&ServerSetupState, 0, sizeof(ServerSetup));
// Calculate available slots from pudinfo
for (h = i = 0; i < PlayerMax; i++) {
if (MenuMapInfo->PlayerType[i] == PlayerPerson) {
if (TheMap.Info.PlayerType[i] == PlayerPerson) {
h++; // available interactive player slots
}
}
@ -4369,9 +4370,6 @@ int NetClientSelectScenario(void)
{
char *cp;
FreeMapInfo(MenuMapInfo);
MenuMapInfo = NULL;
cp = strrchr(MenuMapFullPath, '/');
if (cp) {
strcpy(ScenSelectFileName, cp + 1);
@ -4383,12 +4381,13 @@ int NetClientSelectScenario(void)
ScenSelectPath[0] = 0;
}
FreeMapInfo(&TheMap.Info);
if (strcasestr(ScenSelectFileName, ".pud")) {
MenuMapInfo = GetPudInfo(MenuMapFullPath);
GetPudInfo(MenuMapFullPath, &TheMap.Info);
} else {
// FIXME: GetCmInfo();
LuaLoadFile(MenuMapFullPath);
}
return MenuMapInfo == NULL;
return 1;
}
/**
@ -4520,12 +4519,11 @@ static void EditorNewMap(void)
return;
}
TheMap.Info = calloc(1, sizeof(MapInfo));
description[strlen(description) - 3] = '\0';
TheMap.Info->Description = strdup(description);
TheMap.Info->MapTerrain = menu->Items[7].D.Pulldown.curopt;
TheMap.Info->MapWidth = atoi(width);
TheMap.Info->MapHeight = atoi(height);
TheMap.Info.Description = strdup(description);
TheMap.Info.MapTerrain = menu->Items[7].D.Pulldown.curopt;
TheMap.Info.MapWidth = atoi(width);
TheMap.Info.MapHeight = atoi(height);
VideoClearScreen();
@ -4761,13 +4759,21 @@ static int EditorMainLoadRDFilter(char *pathbuf, FileList *fl)
#endif
if (*cp == 0) {
if (strcasestr(np, ".pud")) {
info = GetPudInfo(pathbuf);
info = GetPudInfo(pathbuf, &TheMap.Info);
if (info) {
fl->type = 1;
fl->name = strdup(np);
fl->xdata = info;
fl->xdata = DuplicateMapInfo(info);
return 1;
}
} else {
info = NULL;
fl->type = 1;
fl->name = strdup(np);
FreeMapInfo(&TheMap.Info);
LuaLoadFile(pathbuf);
fl->xdata = DuplicateMapInfo(&TheMap.Info);
return 1;
}
}
}
@ -5074,7 +5080,7 @@ static void EditorMapPropertiesMenu(void)
menu = FindMenu("menu-editor-map-properties");
menu->Items[2].D.Input.buffer = description;
strcpy(description, TheMap.Info->Description);
strcpy(description, TheMap.Info.Description);
strcat(description, "~!_");
menu->Items[2].D.Input.nch = strlen(description) - 3;
menu->Items[2].D.Input.maxch = 31;
@ -5114,19 +5120,19 @@ static void EditorMapPropertiesOk(void)
description = menu->Items[2].D.Input.buffer;
description[strlen(description)-3] = '\0';
free(TheMap.Info->Description);
TheMap.Info->Description = strdup(description);
free(TheMap.Info.Description);
TheMap.Info.Description = strdup(description);
// Change the terrain
old = TheMap.Info->MapTerrain;
old = TheMap.Info.MapTerrain;
if (old != menu->Items[6].D.Pulldown.curopt) {
TheMap.Info->MapTerrain = menu->Items[6].D.Pulldown.curopt;
free(TheMap.Info->MapTerrainName);
TheMap.Info->MapTerrainName = strdup(TilesetWcNames[TheMap.Info->MapTerrain]);
TheMap.Terrain = TheMap.Info->MapTerrain;
TheMap.Info.MapTerrain = menu->Items[6].D.Pulldown.curopt;
free(TheMap.Info.MapTerrainName);
TheMap.Info.MapTerrainName = strdup(TilesetWcNames[TheMap.Info.MapTerrain]);
TheMap.Terrain = TheMap.Info.MapTerrain;
free(TheMap.TerrainName);
TheMap.TerrainName = strdup(TilesetWcNames[TheMap.Info->MapTerrain]);
TheMap.Tileset = Tilesets[TheMap.Info->MapTerrain];
TheMap.TerrainName = strdup(TilesetWcNames[TheMap.Info.MapTerrain]);
TheMap.Tileset = Tilesets[TheMap.Info.MapTerrain];
LoadTileset();
ChangeTilesetPud(old, &TheMap);
@ -5244,12 +5250,12 @@ static void EditorPlayerPropertiesMenu(void)
#define OIL_POSITION 106
for (i = 0; i < PlayerMax; ++i) {
menu->Items[RACE_POSITION + i].D.Pulldown.defopt = TheMap.Info->PlayerSide[i];
menu->Items[TYPE_POSITION + i].D.Pulldown.defopt = PlayerTypesFcToMenu[TheMap.Info->PlayerType[i]];
menu->Items[AI_POSITION + i].D.Pulldown.defopt = PlayerAiFcToMenu(TheMap.Info->PlayerAi[i]);
sprintf(gold[i], "%d~!_", TheMap.Info->PlayerResources[i][GoldCost]);
sprintf(lumber[i], "%d~!_", TheMap.Info->PlayerResources[i][WoodCost]);
sprintf(oil[i], "%d~!_", TheMap.Info->PlayerResources[i][OilCost]);
menu->Items[RACE_POSITION + i].D.Pulldown.defopt = TheMap.Info.PlayerSide[i];
menu->Items[TYPE_POSITION + i].D.Pulldown.defopt = PlayerTypesFcToMenu[TheMap.Info.PlayerType[i]];
menu->Items[AI_POSITION + i].D.Pulldown.defopt = PlayerAiFcToMenu(TheMap.Info.PlayerAi[i]);
sprintf(gold[i], "%d~!_", TheMap.Info.PlayerResources[i][GoldCost]);
sprintf(lumber[i], "%d~!_", TheMap.Info.PlayerResources[i][WoodCost]);
sprintf(oil[i], "%d~!_", TheMap.Info.PlayerResources[i][OilCost]);
menu->Items[GOLD_POSITION + i].D.Input.buffer = gold[i];
menu->Items[GOLD_POSITION + i].D.Input.nch = strlen(gold[i]) - 3;
menu->Items[GOLD_POSITION + i].D.Input.maxch = 7;
@ -5264,12 +5270,12 @@ static void EditorPlayerPropertiesMenu(void)
ProcessMenu("menu-editor-player-properties", 1);
for (i = 0; i < PlayerMax; ++i) {
TheMap.Info->PlayerSide[i] = menu->Items[RACE_POSITION + i].D.Pulldown.curopt;
TheMap.Info->PlayerType[i] = PlayerTypesMenuToFc[menu->Items[TYPE_POSITION + i].D.Pulldown.curopt];
TheMap.Info->PlayerAi[i] = PlayerAiMenuToFc(menu->Items[AI_POSITION + i].D.Pulldown.curopt);
TheMap.Info->PlayerResources[i][GoldCost] = atoi(gold[i]);
TheMap.Info->PlayerResources[i][WoodCost] = atoi(lumber[i]);
TheMap.Info->PlayerResources[i][OilCost] = atoi(oil[i]);
TheMap.Info.PlayerSide[i] = menu->Items[RACE_POSITION + i].D.Pulldown.curopt;
TheMap.Info.PlayerType[i] = PlayerTypesMenuToFc[menu->Items[TYPE_POSITION + i].D.Pulldown.curopt];
TheMap.Info.PlayerAi[i] = PlayerAiMenuToFc(menu->Items[AI_POSITION + i].D.Pulldown.curopt);
TheMap.Info.PlayerResources[i][GoldCost] = atoi(gold[i]);
TheMap.Info.PlayerResources[i][WoodCost] = atoi(lumber[i]);
TheMap.Info.PlayerResources[i][OilCost] = atoi(oil[i]);
}
}
@ -6414,7 +6420,7 @@ static void ChangeGameServer(void)
freespots = 0;
players = 0;
for (i = 0; i < PlayerMax - 1; ++i) {
if (MenuMapInfo->PlayerType[i] == PlayerPerson) {
if (TheMap.Info.PlayerType[i] == PlayerPerson) {
++players;
}
if (ServerSetupState.CompOpt[i] == 0) {

View file

@ -4437,6 +4437,38 @@ static int CclSetGroupKeys(lua_State* l)
return 0;
}
/**
** Set basic map caracteristics.
**
** @param l Lua state.
*/
static int CclPresentMap(lua_State* l)
{
if (lua_gettop(l) != 4) {
LuaError(l, "incorrect argument");
}
TheMap.Info.Description = strdup(LuaToString(l, 1));
// Number of players in LuaToNumber(l, 3); // Not used yet.
TheMap.Info.MapWidth = LuaToNumber(l, 3);
TheMap.Info.MapHeight = LuaToNumber(l, 4);
return 0;
}
/**
** Define the lua file that will be build the map
**
** @param l Lua state.
*/
static int CclDefineMapSetup(lua_State* l)
{
if (lua_gettop(l) != 1) {
LuaError(l, "incorrect argument");
}
TheMap.Info.Filename = strdup(LuaToString(l, 1));
return 0;
}
/**
** Add a keystroke help
**
@ -4523,6 +4555,9 @@ void UserInterfaceCclRegister(void)
lua_register(Lua, "DefineMenu", CclDefineMenu);
lua_register(Lua, "DefineMenuGraphics", CclDefineMenuGraphics);
lua_register(Lua, "PresentMap", CclPresentMap);
lua_register(Lua, "DefineMapSetup", CclDefineMapSetup);
//
// Color cycling
//