diff --git a/src/game/g_map.pas b/src/game/g_map.pas
index 35e8d46a6078d31326c79dc63af187ad03e74d17..08ebadeb2929d4b429c62c9a7794173bfb0995cc 100644 (file)
--- a/src/game/g_map.pas
+++ b/src/game/g_map.pas
*
* 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
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
+ * the Free Software Foundation, version 3 of the License ONLY.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
GridTagLift = 1 shl 8; // gLifts
GridTagBlockMon = 1 shl 9; // gBlockMon
+ GridTagSolid = (GridTagWall or GridTagDoor);
GridTagObstacle = (GridTagStep or GridTagWall or GridTagDoor);
GridTagLiquid = (GridTagAcid1 or GridTagAcid2 or GridTagWater);
Math, g_monsters, g_saveload, g_language, g_netmsg,
sfs, xstreams, hashtable, wadreader,
ImagingTypes, Imaging, ImagingUtility,
- ImagingGif, ImagingNetworkGraphics;
+ ImagingGif, ImagingNetworkGraphics,
+ g_res_downloader;
const
FLAGRECT: TRectWH = (X:15; Y:12; Width:33; Height:52);
begin
// stop if the lift of the right type
result :=
- ((WordBool(PanelType and PANEL_LIFTUP) and (pan.LiftType = 0)) or
- (WordBool(PanelType and PANEL_LIFTDOWN) and (pan.LiftType = 1)) or
- (WordBool(PanelType and PANEL_LIFTLEFT) and (pan.LiftType = 2)) or
- (WordBool(PanelType and PANEL_LIFTRIGHT) and (pan.LiftType = 3)));
+ ((WordBool(PanelType and PANEL_LIFTUP) and (pan.LiftType = LIFTTYPE_UP)) or
+ (WordBool(PanelType and PANEL_LIFTDOWN) and (pan.LiftType = LIFTTYPE_DOWN)) or
+ (WordBool(PanelType and PANEL_LIFTLEFT) and (pan.LiftType = LIFTTYPE_LEFT)) or
+ (WordBool(PanelType and PANEL_LIFTRIGHT) and (pan.LiftType = LIFTTYPE_RIGHT)));
exit;
end;
result := true; // otherwise, stop anyway, 'cause `forEachAtPoint()` is guaranteed to call this only for correct panels
end;
+function GetReplacementWad (WadName: AnsiString): AnsiString;
+begin
+ if (length(WadName) = 0) then
+ begin
+ result := '';
+ end
+ else
+ begin
+ result := g_Res_FindReplacementWad(WadName);
+ if (result <> WadName) then
+ begin
+ //e_LogWritefln('GetReplacementWad: old=%s; new=%s', [WadName, result]);
+ end
+ else
+ begin
+ result := GameDir+'/wads/'+result;
+ end;
+ end;
+end;
+
function CreateTexture(RecName: AnsiString; Map: string; log: Boolean): Integer;
var
WAD: TWADFile;
end;
// Çàãðóæàåì ðåñóðñ òåêñòóðû â ïàìÿòü èç WAD'à:
- WADName := g_ExtractWadName(RecName);
+ WADName := GetReplacementWad(g_ExtractWadName(RecName));
+ if WADName = '' then WADName := Map; //WADName := GameDir+'/wads/'+WADName else
WAD := TWADFile.Create();
-
- if WADName <> '' then WADName := GameDir+'/wads/'+WADName else WADName := Map;
-
WAD.ReadFile(WADName);
//txname := RecName;
end;
// ×èòàåì WAD-ðåñóðñ àíèì.òåêñòóðû èç WAD'à â ïàìÿòü:
- WADName := g_ExtractWadName(RecName);
+ WADName := GetReplacementWad(g_ExtractWadName(RecName));
+ if WADName = '' then WADName := Map; //WADName := GameDir+'/wads/'+WADName else
WAD := TWADFile.Create();
try
- if WADName <> '' then WADName := GameDir+'/wads/'+WADName else WADName := Map;
+ //if WADName <> '' then WADName := GameDir+'/wads/'+WADName else WADName := Map;
WAD.ReadFile(WADName);
end;
// ýòî ïòèöà? ýòî ñàìîë¸ò?
- if (TextureWAD[0] = 'D') and (TextureWAD[1] = 'F') and
- (TextureWAD[2] = 'W') and (TextureWAD[3] = 'A') and (TextureWAD[4] = 'D') then
+ if isWadData(TextureWAD, ResLength) then
begin
// íåò, ýòî ñóïåðìåí!
if not WAD.ReadMemory(TextureWAD, ResLength) then
procedure addResToExternalResList(res: string);
begin
- res := extractWadName(res);
- if (res <> '') and (gExternalResources.IndexOf(res) = -1) then
+ //e_LogWritefln('DBG: ***trying external resource %s', [res]);
+ res := toLowerCase1251(extractWadName(res));
+ // ignore "standart.wad"
+ if (res <> '') {and (res <> 'standart.wad')} and (gExternalResources.IndexOf(res) = -1) then
+ begin
+ //e_LogWritefln('DBG: added external resource %s', [res]);
gExternalResources.Add(res);
+ end;
end;
procedure generateExternalResourcesList({mapReader: TMapReader_1}map: TDynRecord);
ntn := CreateTexture(rec.Resource, FileName, True);
if (ntn < 0) then g_SimpleError(Format(_lc[I_GAME_ERROR_TEXTURE_SIMPLE], [rec.Resource]));
end;
- if (ntn < 0) then ntn := CreateNullTexture(rec.Resource);
+ if (ntn < 0) then
+ begin
+ ntn := CreateNullTexture(rec.Resource);
+ end
+ else
+ begin
+ addResToExternalResList(rec.Resource);
+ end;
rec.tagInt := ntn; // remember texture number
end;
finally
sfsGCEnable(); // enable releasing unused volumes
//mapReader.Free();
- e_ClearInputBuffer(); // why not?
+ e_UnpressAllKeys; // why not?
if not mapOk then
begin
gCurrentMap.Free();
a, d, j: Integer;
m: Word;
s: String;
+ b: Byte;
procedure UpdatePanelArray(var panels: TPanelArray);
var
s := _lc[I_PLAYER_FLAG_BLUE];
g_Game_Message(Format(_lc[I_MESSAGE_FLAG_RETURN], [AnsiUpperCase(s)]), 144);
+ if (((gPlayer1 <> nil) and (((gPlayer1.Team = TEAM_RED) and (a = FLAG_RED)) or ((gPlayer1.Team = TEAM_BLUE) and (a = FLAG_BLUE))))
+ or ((gPlayer2 <> nil) and (((gPlayer2.Team = TEAM_RED) and (a = FLAG_RED)) or ((gPlayer2.Team = TEAM_BLUE) and (a = FLAG_BLUE))))) then
+ b := 0
+ else
+ b := 1;
+
+ if not sound_ret_flag[b].IsPlaying() then
+ sound_ret_flag[b].Play();
+
if g_Game_IsNet then
MH_SEND_FlagEvent(FLAG_STATE_RETURNED, a, 0);
Continue;
h := High(gLifts);
for a := 0 to h do
- if ((WordBool(PanelType and (PANEL_LIFTUP)) and (gLifts[a].LiftType = 0)) or
- (WordBool(PanelType and (PANEL_LIFTDOWN)) and (gLifts[a].LiftType = 1)) or
- (WordBool(PanelType and (PANEL_LIFTLEFT)) and (gLifts[a].LiftType = 2)) or
- (WordBool(PanelType and (PANEL_LIFTRIGHT)) and (gLifts[a].LiftType = 3))) and
+ if ((WordBool(PanelType and (PANEL_LIFTUP)) and (gLifts[a].LiftType = LIFTTYPE_UP)) or
+ (WordBool(PanelType and (PANEL_LIFTDOWN)) and (gLifts[a].LiftType = LIFTTYPE_DOWN)) or
+ (WordBool(PanelType and (PANEL_LIFTLEFT)) and (gLifts[a].LiftType = LIFTTYPE_LEFT)) or
+ (WordBool(PanelType and (PANEL_LIFTRIGHT)) and (gLifts[a].LiftType = LIFTTYPE_RIGHT))) and
g_Collide(X, Y, Width, Height,
gLifts[a].X, gLifts[a].Y,
gLifts[a].Width, gLifts[a].Height) then
if ((tag and GridTagLift) <> 0) then
begin
result :=
- ((WordBool(PanelType and PANEL_LIFTUP) and (pan.LiftType = 0)) or
- (WordBool(PanelType and PANEL_LIFTDOWN) and (pan.LiftType = 1)) or
- (WordBool(PanelType and PANEL_LIFTLEFT) and (pan.LiftType = 2)) or
- (WordBool(PanelType and PANEL_LIFTRIGHT) and (pan.LiftType = 3))) {and
+ ((WordBool(PanelType and PANEL_LIFTUP) and (pan.LiftType = LIFTTYPE_UP)) or
+ (WordBool(PanelType and PANEL_LIFTDOWN) and (pan.LiftType = LIFTTYPE_DOWN)) or
+ (WordBool(PanelType and PANEL_LIFTLEFT) and (pan.LiftType = LIFTTYPE_LEFT)) or
+ (WordBool(PanelType and PANEL_LIFTRIGHT) and (pan.LiftType = LIFTTYPE_RIGHT))) {and
g_Collide(X, Y, Width, Height, pan.X, pan.Y, pan.Width, pan.Height)};
exit;
end;
if ((pan.tag and GridTagLift) <> 0) then
begin
result :=
- ((WordBool(PanelType and PANEL_LIFTUP) and (pan.LiftType = 0)) or
- (WordBool(PanelType and PANEL_LIFTDOWN) and (pan.LiftType = 1)) or
- (WordBool(PanelType and PANEL_LIFTLEFT) and (pan.LiftType = 2)) or
- (WordBool(PanelType and PANEL_LIFTRIGHT) and (pan.LiftType = 3))) {and
+ ((WordBool(PanelType and PANEL_LIFTUP) and (pan.LiftType = LIFTTYPE_UP)) or
+ (WordBool(PanelType and PANEL_LIFTDOWN) and (pan.LiftType = LIFTTYPE_DOWN)) or
+ (WordBool(PanelType and PANEL_LIFTLEFT) and (pan.LiftType = LIFTTYPE_LEFT)) or
+ (WordBool(PanelType and PANEL_LIFTRIGHT) and (pan.LiftType = LIFTTYPE_RIGHT))) {and
g_Collide(X, Y, Width, Height, pan.X, pan.Y, pan.Width, pan.Height)};
end
else if ((pan.tag and GridTagBlockMon) <> 0) then
//TODO: make separate lift tags, and change tag here
case LiftType of
- 0: g_Mark(X, Y, Width, Height, MARK_LIFTUP);
- 1: g_Mark(X, Y, Width, Height, MARK_LIFTDOWN);
- 2: g_Mark(X, Y, Width, Height, MARK_LIFTLEFT);
- 3: g_Mark(X, Y, Width, Height, MARK_LIFTRIGHT);
+ LIFTTYPE_UP: g_Mark(X, Y, Width, Height, MARK_LIFTUP);
+ LIFTTYPE_DOWN: g_Mark(X, Y, Width, Height, MARK_LIFTDOWN);
+ LIFTTYPE_LEFT: g_Mark(X, Y, Width, Height, MARK_LIFTLEFT);
+ LIFTTYPE_RIGHT: g_Mark(X, Y, Width, Height, MARK_LIFTRIGHT);
end;
//if g_Game_IsServer and g_Game_IsNet then MH_SEND_PanelState(pguid);