X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_map.pas;h=08ebadeb2929d4b429c62c9a7794173bfb0995cc;hb=bec8cdb3ed10342622663c441db86cbd7bb63885;hp=c4e818fe319d289a38fe4f908cc609d89e085811;hpb=785fe3df9d3c82df346034780156cb63bae43ff7;p=d2df-sdl.git diff --git a/src/game/g_map.pas b/src/game/g_map.pas index c4e818f..08ebade 100644 --- a/src/game/g_map.pas +++ b/src/game/g_map.pas @@ -2,8 +2,7 @@ * * 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 @@ -196,6 +195,7 @@ const 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); @@ -252,13 +252,15 @@ var implementation uses + {$INCLUDE ../nogl/noGLuses.inc} e_input, g_main, e_log, e_texture, g_items, g_gfx, g_console, - GL, GLExt, g_weapons, g_game, g_sound, e_sound, CONFIG, + g_weapons, g_game, g_sound, e_sound, CONFIG, g_options, g_triggers, g_player, 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); @@ -434,17 +436,19 @@ end; // ////////////////////////////////////////////////////////////////////////// // var NNF_PureName: String; // Èìÿ òåêñòóðû áåç öèôð â êîíöå + NNF_PureExt: String; // extension postfix NNF_FirstNum: Integer; // ×èñëî ó íà÷àëüíîé òåêñòóðû NNF_CurrentNum: Integer; // Ñëåäóþùåå ÷èñëî ó òåêñòóðû function g_Texture_NumNameFindStart(name: String): Boolean; var - i: Integer; + i, j: Integer; begin Result := False; NNF_PureName := ''; + NNF_PureExt := ''; NNF_FirstNum := -1; NNF_CurrentNum := -1; @@ -457,8 +461,11 @@ begin end else begin + j := i + 1; + while (j <= Length(name)) and (name[j] <> '.') do inc(j); NNF_PureName := Copy(name, 1, i); - Delete(name, 1, i); + NNF_PureExt := Copy(name, j); + name := Copy(name, i + 1, j - i - 1); Break; end; end; @@ -482,7 +489,7 @@ begin Exit; end; - newName := NNF_PureName + IntToStr(NNF_CurrentNum); + newName := NNF_PureName + IntToStr(NNF_CurrentNum) + NNF_PureExt; if NNF_CurrentNum < NNF_FirstNum then Result := NNF_NAME_BEFORE @@ -540,9 +547,9 @@ var procedure g_Map_ProfilersBegin (); begin if (profMapCollision = nil) then profMapCollision := TProfiler.Create('COLSOLID', g_profile_history_size); - profMapCollision.mainBegin(g_profile_collision); + if (profMapCollision <> nil) then profMapCollision.mainBegin(g_profile_collision); // create sections - if g_profile_collision then + if g_profile_collision and (profMapCollision <> nil) then begin profMapCollision.sectionBegin('*solids'); profMapCollision.sectionEnd(); @@ -600,10 +607,10 @@ begin 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 @@ -893,6 +900,26 @@ begin 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; @@ -951,12 +978,10 @@ begin 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; @@ -1039,11 +1064,12 @@ begin 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); @@ -1077,8 +1103,7 @@ begin 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 @@ -1443,9 +1468,14 @@ end; 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); @@ -1829,7 +1859,14 @@ begin 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; @@ -2254,7 +2291,7 @@ begin finally sfsGCEnable(); // enable releasing unused volumes //mapReader.Free(); - e_ClearInputBuffer(); // why not? + e_UnpressAllKeys; // why not? if not mapOk then begin gCurrentMap.Free(); @@ -2508,6 +2545,7 @@ var a, d, j: Integer; m: Word; s: String; + b: Byte; procedure UpdatePanelArray(var panels: TPanelArray); var @@ -2558,6 +2596,15 @@ begin 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; @@ -2742,10 +2789,10 @@ begin 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 @@ -2821,10 +2868,10 @@ const 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; @@ -2870,10 +2917,10 @@ begin 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 @@ -3035,10 +3082,10 @@ begin //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);