X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_game.pas;h=c09158d4428909d9041a06e6ea7b2b505f0f56ad;hb=dc9a52bb70e79e18ad014ce777029bb8ee1d85c4;hp=369f5ac58f4adb8068bed26d2afe20260d85981b;hpb=243b29c59bbb6ff7ddb1f5822dc3de1be593660a;p=d2df-sdl.git diff --git a/src/game/g_game.pas b/src/game/g_game.pas index 369f5ac..c09158d 100644 --- a/src/game/g_game.pas +++ b/src/game/g_game.pas @@ -327,7 +327,7 @@ uses g_playermodel, g_gfx, g_options, g_weapons, Math, g_triggers, MAPDEF, g_monsters, e_sound, CONFIG, BinEditor, g_language, g_net, SDL, - ENet, e_fixedbuffer, g_netmsg, g_netmaster, GL, GLExt, + ENet, e_msg, g_netmsg, g_netmaster, GL, GLExt, utils, sfs; @@ -1439,6 +1439,24 @@ var a: Byte; w: Word; i, b: Integer; + + function sendMonsPos (monidx: Integer; mon: TMonster): Boolean; + begin + result := false; // don't stop + if (mon.MonsterType = MONSTER_BARREL) then + begin + if (mon.GameVelX <> 0) or (mon.GameVelY <> 0) then MH_SEND_MonsterPos(mon.UID); + end + else + if (mon.MonsterState <> MONSTATE_SLEEP) then + begin + if (mon.MonsterState <> MONSTATE_DEAD) or (mon.GameVelX <> 0) or (mon.GameVelY <> 0) then + begin + MH_SEND_MonsterPos(mon.UID); + end; + end; + end; + begin g_ResetDynlights(); // Ïîðà âûêëþ÷àòü èãðó: @@ -1808,22 +1826,7 @@ begin if gPlayers[I] <> nil then MH_SEND_PlayerPos(True, gPlayers[I].UID); - if gMonsters <> nil then - for I := 0 to High(gMonsters) do - if gMonsters[I] <> nil then - begin - if (gMonsters[I].MonsterType = MONSTER_BARREL) then - begin - if (gMonsters[I].GameVelX <> 0) or (gMonsters[I].GameVelY <> 0) then - MH_SEND_MonsterPos(gMonsters[I].UID); - end - else - if (gMonsters[I].MonsterState <> MONSTATE_SLEEP) then - if (gMonsters[I].MonsterState <> MONSTATE_DEAD) or - (gMonsters[I].GameVelX <> 0) or - (gMonsters[I].GameVelY <> 0) then - MH_SEND_MonsterPos(gMonsters[I].UID); - end; + g_Mons_ForEach(sendMonsPos); NetTimeToReliable := 0; NetTimeToUpdate := NetUpdateRate; @@ -1835,22 +1838,7 @@ begin if gPlayers[I] <> nil then MH_SEND_PlayerPos(False, gPlayers[I].UID); - if gMonsters <> nil then - for I := 0 to High(gMonsters) do - if gMonsters[I] <> nil then - begin - if (gMonsters[I].MonsterType = MONSTER_BARREL) then - begin - if (gMonsters[I].GameVelX <> 0) or (gMonsters[I].GameVelY <> 0) then - MH_SEND_MonsterPos(gMonsters[I].UID); - end - else - if (gMonsters[I].MonsterState <> MONSTATE_SLEEP) then - if (gMonsters[I].MonsterState <> MONSTATE_DEAD) or - (gMonsters[I].GameVelX <> 0) or - (gMonsters[I].GameVelY <> 0) then - MH_SEND_MonsterPos(gMonsters[I].UID); - end; + g_Mons_ForEach(sendMonsPos); NetTimeToUpdate := 0; end; @@ -2453,6 +2441,28 @@ end; procedure DrawMinimap(p: TPlayer; RenderRect: e_graphics.TRect); var a, aX, aY, aX2, aY2, Scale, ScaleSz: Integer; + + function monDraw (monidx: Integer; mon: TMonster): Boolean; + begin + result := false; // don't stop + with mon do + begin + if Live then + begin + // Ëåâûé âåðõíèé óãîë + aX := Obj.X div ScaleSz + 1; + aY := Obj.Y div ScaleSz + 1; + // Ðàçìåðû + aX2 := max(Obj.Rect.Width div ScaleSz, 1); + aY2 := max(Obj.Rect.Height div ScaleSz, 1); + // Ïðàâûé íèæíèé óãîë + aX2 := aX + aX2 - 1; + aY2 := aY + aY2 - 1; + e_DrawFillQuad(aX, aY, aX2, aY2, 255, 255, 0, 0); + end; + end; + end; + begin if (gMapInfo.Width > RenderRect.Right - RenderRect.Left) or (gMapInfo.Height > RenderRect.Bottom - RenderRect.Top) then @@ -2621,25 +2631,8 @@ begin end; end; end; - if gMonsters <> nil then - begin - // Ðèñóåì ìîíñòðîâ: - for a := 0 to High(gMonsters) do - if gMonsters[a] <> nil then with gMonsters[a] do - if Live then begin - // Ëåâûé âåðõíèé óãîë: - aX := Obj.X div ScaleSz + 1; - aY := Obj.Y div ScaleSz + 1; - // Ðàçìåðû: - aX2 := max(Obj.Rect.Width div ScaleSz, 1); - aY2 := max(Obj.Rect.Height div ScaleSz, 1); - // Ïðàâûé íèæíèé óãîë: - aX2 := aX + aX2 - 1; - aY2 := aY + aY2 - 1; - - e_DrawFillQuad(aX, aY, aX2, aY2, 255, 255, 0, 0); - end; - end; + // Ðèñóåì ìîíñòðîâ + g_Mons_ForEach(monDraw); end; end; @@ -3747,6 +3740,7 @@ var State: Byte; OuterLoop: Boolean; newResPath: string; + InMsg: TMsg; begin g_Game_Free(); @@ -3794,27 +3788,28 @@ begin if (NetEvent.kind = ENET_EVENT_TYPE_RECEIVE) then begin Ptr := NetEvent.packet^.data; - e_Raw_Seek(0); + if not InMsg.Init(Ptr, NetEvent.packet^.dataLength, True) then + continue; - MID := e_Raw_Read_Byte(Ptr); + MID := InMsg.ReadByte(); if (MID = NET_MSG_INFO) and (State = 0) then begin - NetMyID := e_Raw_Read_Byte(Ptr); - NetPlrUID1 := e_Raw_Read_Word(Ptr); + NetMyID := InMsg.ReadByte(); + NetPlrUID1 := InMsg.ReadWord(); - WadName := e_Raw_Read_String(Ptr); - Map := e_Raw_Read_String(Ptr); + WadName := InMsg.ReadString(); + Map := InMsg.ReadString(); - gWADHash := e_Raw_Read_MD5(Ptr); + gWADHash := InMsg.ReadMD5(); - gGameSettings.GameMode := e_Raw_Read_Byte(Ptr); + gGameSettings.GameMode := InMsg.ReadByte(); gSwitchGameMode := gGameSettings.GameMode; - gGameSettings.GoalLimit := e_Raw_Read_Word(Ptr); - gGameSettings.TimeLimit := e_Raw_Read_Word(Ptr); - gGameSettings.MaxLives := e_Raw_Read_Byte(Ptr); - gGameSettings.Options := e_Raw_Read_LongWord(Ptr); - T := e_Raw_Read_LongWord(Ptr); + gGameSettings.GoalLimit := InMsg.ReadWord(); + gGameSettings.TimeLimit := InMsg.ReadWord(); + gGameSettings.MaxLives := InMsg.ReadByte(); + gGameSettings.Options := InMsg.ReadLongWord(); + T := InMsg.ReadLongWord(); newResPath := g_Res_SearchSameWAD(MapsDir, WadName, gWADHash); if newResPath = '' then @@ -4175,6 +4170,13 @@ end; procedure g_Game_RestartRound(NoMapRestart: Boolean = False); var i, n, nb, nr: Integer; + + function monRespawn (monidx: Integer; mon: TMonster): Boolean; + begin + result := false; // don't stop + if not mon.FNoRespawn then mon.Respawn(); + end; + begin if not g_Game_IsServer then Exit; if gLMSRespawn = LMS_RESPAWN_NONE then Exit; @@ -4241,25 +4243,10 @@ begin gPlayer2 := g_Player_Get(gLMSPID2); end; - for i := Low(gItems) to High(gItems) do - begin - if gItems[i].Respawnable then - begin - gItems[i].QuietRespawn := True; - gItems[i].RespawnTime := 0; - end - else - begin - g_Items_Remove(i); - if g_Game_IsNet then MH_SEND_ItemDestroy(True, i); - end; - end; + g_Items_RestartRound(); - for i := Low(gMonsters) to High(gMonsters) do - begin - if (gMonsters[i] <> nil) and not gMonsters[i].FNoRespawn then - gMonsters[i].Respawn; - end; + + g_Mons_ForEach(monRespawn); gLMSSoftSpawn := False; end; @@ -5015,6 +5002,7 @@ var a, b: Integer; cmd: string; //pt: TPoint; + mon: TMonster; begin // Êîìàíäû îòëàäî÷íîãî ðåæèìà: if gDebugMode then @@ -5092,12 +5080,14 @@ begin else begin with gPlayer1.Obj do - b := g_Monsters_Create(a, + begin + mon := g_Monsters_Create(a, X + Rect.X + (Rect.Width div 2), Y + Rect.Y + Rect.Height, gPlayer1.Direction, True); - if (Length(P) > 2) and (b >= 0) then - gMonsters[b].MonsterBehaviour := Min(Max(StrToIntDef(P[2], BH_NORMAL), BH_NORMAL), BH_GOOD); + end; + if (Length(P) > 2) and (mon <> nil) then + mon.MonsterBehaviour := Min(Max(StrToIntDef(P[2], BH_NORMAL), BH_NORMAL), BH_GOOD); end; end; end @@ -6869,8 +6859,8 @@ begin gDefaultMegawadStart := s; end; - s := LowerCase(Find_Param_Value(pars, '-dbg-mainwad-restore')); - if (s <> '') then + if (Find_Param_Value(pars, '--dbg-mainwad-restore') <> '') or + (Find_Param_Value(pars, '--dbg-mainwad-default') <> '') then begin gDefaultMegawadStart := DF_Default_Megawad_Start; end;