X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_monsters.pas;h=78ae1a409ab05f1c629a6fb5d3cbdd9d63b79a3e;hb=16342bee09fa001d05697571124e48a93cd35f2c;hp=e3b99d263a6a3fa08f82f279563fa7f14c53fb98;hpb=c9fc9bdd334338e3f77750416c57fa55c5665fc0;p=d2df-sdl.git diff --git a/src/game/g_monsters.pas b/src/game/g_monsters.pas index e3b99d2..78ae1a4 100644 --- a/src/game/g_monsters.pas +++ b/src/game/g_monsters.pas @@ -81,10 +81,12 @@ type tx, ty: Integer; FStartID: Integer; FObj: TObj; - FBloodRed: Byte; - FBloodGreen: Byte; - FBloodBlue: Byte; - FBloodKind: Byte; + {$IFDEF ENABLE_GFX} + FBloodRed: Byte; + FBloodGreen: Byte; + FBloodBlue: Byte; + FBloodKind: Byte; + {$ENDIF} FShellTimer: Integer; FShellType: Byte; FFirePainTime: Integer; @@ -521,9 +523,18 @@ var implementation uses - e_log, g_sound, g_gfx, g_player, g_game, r_textures, r_animations, r_gfx, + {$IFDEF ENABLE_MENU} + g_menu, + {$ENDIF} + {$IFDEF ENABLE_GFX} + g_gfx, + {$ENDIF} + {$IFDEF ENABLE_GIBS} + g_gibs, + {$ENDIF} + e_log, g_sound, g_player, g_game, g_weapons, g_triggers, g_items, g_options, - g_console, g_map, Math, g_menu, wadreader, + g_console, g_map, Math, wadreader, g_language, g_netmsg, idpool, utils, xstreams; @@ -1630,6 +1641,7 @@ begin mplatCheckFrameId := 0; mNeedSend := false; +{$IFDEF ENABLE_GFX} if FMonsterType in [MONSTER_ROBO, MONSTER_BARREL] then FBloodKind := BLOOD_SPARKS else @@ -1652,6 +1664,7 @@ begin FBloodGreen := 0; FBloodBlue := 0; end; +{$ENDIF} SetLength(FAnim, Length(ANIMTABLE)); for a := ANIM_SLEEP to ANIM_PAIN do @@ -1660,7 +1673,7 @@ begin FAnim[a, TDirection.D_LEFT] := TAnimationState.Create(ANIMTABLE[a].loop, MONSTER_ANIMTABLE[MonsterType].AnimSpeed[a], MONSTER_ANIMTABLE[MonsterType].AnimCount[a]); end; if MonsterType = MONSTER_VILE then - vilefire := TAnimationState.Create(True, 2, 0); // !!! len + vilefire := TAnimationState.Create(True, 2, 8); end; function TMonster.Damage(aDamage: Word; VelX, VelY: Integer; SpawnerUID: Word; t: Byte): Boolean; @@ -1885,6 +1898,7 @@ end; procedure TMonster.MakeBloodSimple(Count: Word); begin +{$IFDEF ENABLE_GFX} g_GFX_Blood(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2)+8, FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2), Count div 2, 3, -1, 16, (FObj.Rect.Height*2 div 3), @@ -1893,14 +1907,17 @@ begin FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2), Count div 2, -3, -1, 16, (FObj.Rect.Height*2) div 3, FBloodRed, FBloodGreen, FBloodBlue, FBloodKind); +{$ENDIF} end; procedure TMonster.MakeBloodVector(Count: Word; VelX, VelY: Integer); begin +{$IFDEF ENABLE_GFX} g_GFX_Blood(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2), FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2), Count, VelX, VelY, 16, (FObj.Rect.Height*2) div 3, FBloodRed, FBloodGreen, FBloodBlue, FBloodKind); +{$ENDIF} end; procedure TMonster.Push(vx, vy: Integer); @@ -1984,12 +2001,13 @@ begin if not silent then begin g_Sound_PlayExAt('SOUND_GAME_TELEPORT', Obj.X, Obj.Y); - r_GFX_OnceAnim( +{$IFDEF ENABLE_GFX} + g_GFX_QueueEffect( R_GFX_TELEPORT, FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2)-32, FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2)-32 ); - +{$ENDIF} if g_Game_IsServer and g_Game_IsNet then MH_SEND_Effect(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2)-32, FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2)-32, 1, @@ -2019,12 +2037,13 @@ begin // Эффект телепорта в точке назначения: if not silent then begin - r_GFX_OnceAnim( +{$IFDEF ENABLE_GFX} + g_GFX_QueueEffect( R_GFX_TELEPORT, FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2)-32, FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2)-32 ); - +{$ENDIF} if g_Game_IsServer and g_Game_IsNet then MH_SEND_Effect(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2)-32, FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2)-32, 0, @@ -2154,15 +2173,43 @@ begin if WordBool(st and MOVE_INWATER) and (Random(32) = 0) then case FMonsterType of MONSTER_FISH: - if Random(4) = 0 then - g_GFX_Bubbles(FObj.X+FObj.Rect.X + Random(FObj.Rect.Width), - FObj.Y+FObj.Rect.Y + Random(4), 1, 0, 0); + begin + {$IFDEF ENABLE_GFX} + if Random(4) = 0 then + begin + g_GFX_Bubbles( + FObj.X + FObj.Rect.X + Random(FObj.Rect.Width), + FObj.Y + FObj.Rect.Y + Random(4), + 1, + 0, + 0 + ); + end; + {$ENDIF} + end; MONSTER_ROBO, MONSTER_BARREL: - g_GFX_Bubbles(FObj.X+FObj.Rect.X + Random(FObj.Rect.Width), - FObj.Y+FObj.Rect.Y + Random(4), 1, 0, 0); - else begin - g_GFX_Bubbles(FObj.X+FObj.Rect.X + Random(FObj.Rect.Width-4), - FObj.Y+FObj.Rect.Y + Random(4), 5, 4, 4); + begin + {$IFDEF ENABLE_GFX} + g_GFX_Bubbles( + FObj.X + FObj.Rect.X + Random(FObj.Rect.Width), + FObj.Y + FObj.Rect.Y + Random(4), + 1, + 0, + 0 + ); + {$ENDIF} + end; + else + begin + {$IFDEF ENABLE_GFX} + g_GFX_Bubbles( + FObj.X + FObj.Rect.X + Random(FObj.Rect.Width - 4), + FObj.Y+FObj.Rect.Y + Random(4), + 5, + 4, + 4 + ); + {$ENDIF} if Random(2) = 0 then g_Sound_PlayExAt('SOUND_GAME_BUBBLE1', FObj.X, FObj.Y) else @@ -2479,29 +2526,31 @@ begin end else // "Наземные" монстры begin - // Возможно, пинаем куски: - if (FObj.Vel.X <> 0) and (gGibs <> nil) then - begin - b := Abs(FObj.Vel.X); - if b > 1 then b := b * (Random(8 div b) + 1); - for a := 0 to High(gGibs) do + {$IFDEF ENABLE_GIBS} + // Возможно, пинаем куски: + if (FObj.Vel.X <> 0) and (gGibs <> nil) then begin - if gGibs[a].alive and - g_Obj_Collide(FObj.X+FObj.Rect.X, FObj.Y+FObj.Rect.Y+FObj.Rect.Height-4, - FObj.Rect.Width, 8, @gGibs[a].Obj) and (Random(3) = 0) then + b := Abs(FObj.Vel.X); + if b > 1 then b := b * (Random(8 div b) + 1); + for a := 0 to High(gGibs) do begin - // Пинаем куски - if FObj.Vel.X < 0 then + if gGibs[a].alive and + g_Obj_Collide(FObj.X+FObj.Rect.X, FObj.Y+FObj.Rect.Y+FObj.Rect.Height-4, + FObj.Rect.Width, 8, @gGibs[a].Obj) and (Random(3) = 0) then begin - g_Obj_PushA(@gGibs[a].Obj, b, Random(61)+120); // налево - end - else - begin - g_Obj_PushA(@gGibs[a].Obj, b, Random(61)); // направо + // Пинаем куски + if FObj.Vel.X < 0 then + begin + g_Obj_PushA(@gGibs[a].Obj, b, Random(61)+120); // налево + end + else + begin + g_Obj_PushA(@gGibs[a].Obj, b, Random(61)); // направо + end; end; end; end; - end; + {$ENDIF} // Боссы могут пинать трупы: if (FMonsterType in [MONSTER_CYBER, MONSTER_SPIDER, MONSTER_ROBO]) and (FObj.Vel.X <> 0) and (gCorpses <> nil) then @@ -3115,15 +3164,43 @@ begin if WordBool(st and MOVE_INWATER) and (Random(32) = 0) then case FMonsterType of MONSTER_FISH: - if Random(4) = 0 then - g_GFX_Bubbles(FObj.X+FObj.Rect.X + Random(FObj.Rect.Width), - FObj.Y+FObj.Rect.Y + Random(4), 1, 0, 0); + begin + {$IFDEF ENABLE_GFX} + if Random(4) = 0 then + begin + g_GFX_Bubbles( + FObj.X + FObj.Rect.X + Random(FObj.Rect.Width), + FObj.Y + FObj.Rect.Y + Random(4), + 1, + 0, + 0 + ); + end; + {$ENDIF} + end; MONSTER_ROBO, MONSTER_BARREL: - g_GFX_Bubbles(FObj.X+FObj.Rect.X + Random(FObj.Rect.Width), - FObj.Y+FObj.Rect.Y + Random(4), 1, 0, 0); - else begin - g_GFX_Bubbles(FObj.X+FObj.Rect.X + Random(FObj.Rect.Width-4), - FObj.Y+FObj.Rect.Y + Random(4), 5, 4, 4); + begin + {$IFDEF ENABLE_GFX} + g_GFX_Bubbles( + FObj.X + FObj.Rect.X + Random(FObj.Rect.Width), + FObj.Y + FObj.Rect.Y + Random(4), + 1, + 0, + 0 + ); + {$ENDIF} + end; + else + begin + {$IFDEF ENABLE_GFX} + g_GFX_Bubbles( + FObj.X + FObj.Rect.X + Random(FObj.Rect.Width - 4), + FObj.Y + FObj.Rect.Y + Random(4), + 5, + 4, + 4 + ); + {$ENDIF} if Random(2) = 0 then g_Sound_PlayExAt('SOUND_GAME_BUBBLE1', FObj.X, FObj.Y) else @@ -3328,30 +3405,32 @@ begin end else // "Наземные" монстры begin - // Возможно, пинаем куски: - if (FObj.Vel.X <> 0) and (gGibs <> nil) then - begin - b := Abs(FObj.Vel.X); - if b > 1 then b := b * (Random(8 div b) + 1); - for a := 0 to High(gGibs) do + {$IFDEF ENBALE_GIBS} + // Возможно, пинаем куски: + if (FObj.Vel.X <> 0) and (gGibs <> nil) then begin - if gGibs[a].alive and - g_Obj_Collide(FObj.X+FObj.Rect.X, FObj.Y+FObj.Rect.Y+FObj.Rect.Height-4, - FObj.Rect.Width, 8, @gGibs[a].Obj) and (Random(3) = 0) then + b := Abs(FObj.Vel.X); + if b > 1 then b := b * (Random(8 div b) + 1); + for a := 0 to High(gGibs) do begin - // Пинаем куски - if FObj.Vel.X < 0 then - begin - g_Obj_PushA(@gGibs[a].Obj, b, Random(61)+120); // налево - end - else + if gGibs[a].alive and + g_Obj_Collide(FObj.X+FObj.Rect.X, FObj.Y+FObj.Rect.Y+FObj.Rect.Height-4, + FObj.Rect.Width, 8, @gGibs[a].Obj) and (Random(3) = 0) then begin - g_Obj_PushA(@gGibs[a].Obj, b, Random(61)); // направо + // Пинаем куски + if FObj.Vel.X < 0 then + begin + g_Obj_PushA(@gGibs[a].Obj, b, Random(61)+120); // налево + end + else + begin + g_Obj_PushA(@gGibs[a].Obj, b, Random(61)); // направо + end; + positionChanged(); // this updates spatial accelerators end; - positionChanged(); // this updates spatial accelerators end; end; - end; + {$ENDIF} // Боссы могут пинать трупы: if (FMonsterType in [MONSTER_CYBER, MONSTER_SPIDER, MONSTER_ROBO]) and (FObj.Vel.X <> 0) and (gCorpses <> nil) then @@ -4137,7 +4216,7 @@ begin anim := (vilefire <> nil); utils.writeBool(st, anim); // Если есть - сохраняем: - if anim then vilefire.SaveState(st); + if anim then vilefire.SaveState(st, 0, False); // Анимации for i := ANIM_SLEEP to ANIM_PAIN do begin @@ -4145,12 +4224,12 @@ begin anim := (FAnim[i, TDirection.D_LEFT] <> nil); utils.writeBool(st, anim); // Если есть - сохраняем - if anim then FAnim[i, TDirection.D_LEFT].SaveState(st); + if anim then FAnim[i, TDirection.D_LEFT].SaveState(st, 0, False); // Есть ли правая анимация anim := (FAnim[i, TDirection.D_RIGHT] <> nil); utils.writeBool(st, anim); // Если есть - сохраняем - if anim then FAnim[i, TDirection.D_RIGHT].SaveState(st); + if anim then FAnim[i, TDirection.D_RIGHT].SaveState(st, 0, False); end; end; @@ -4158,8 +4237,8 @@ end; procedure TMonster.LoadState (st: TStream); var i: Integer; - b: Byte; - anim: Boolean; + b, alpha: Byte; + anim, blending: Boolean; begin assert(st <> nil); @@ -4219,7 +4298,7 @@ begin if anim then begin Assert(vilefire <> nil, 'TMonster.LoadState: no vilefire anim'); - vilefire.LoadState(st); + vilefire.LoadState(st, alpha, blending); end; // Анимации for i := ANIM_SLEEP to ANIM_PAIN do @@ -4230,7 +4309,7 @@ begin if anim then begin Assert(FAnim[i, TDirection.D_LEFT] <> nil, 'TMonster.LoadState: no '+IntToStr(i)+'_left anim'); - FAnim[i, TDirection.D_LEFT].LoadState(st); + FAnim[i, TDirection.D_LEFT].LoadState(st, alpha, blending); end; // Есть ли правая анимация anim := utils.readBool(st); @@ -4238,7 +4317,7 @@ begin if anim then begin Assert(FAnim[i, TDirection.D_RIGHT] <> nil, 'TMonster.LoadState: no '+IntToStr(i)+'_right anim'); - FAnim[i, TDirection.D_RIGHT].LoadState(st); + FAnim[i, TDirection.D_RIGHT].LoadState(st, alpha, blending); end; end; end; @@ -4284,17 +4363,20 @@ begin end; procedure TMonster.OnFireFlame(Times: DWORD = 1); - var i: DWORD; x, y: Integer; + {$IFDEF ENABLE_GFX} + var i: DWORD; x, y: Integer; + {$ENDIF} begin - if (Random(10) = 1) and (Times = 1) then - Exit; - - for i := 1 to Times do - begin - x := Obj.X + Obj.Rect.X + Random(Obj.Rect.Width + Times * 2) - (R_GFX_FLAME_WIDTH div 2); - y := Obj.Y + 8 + Random(8 + Times * 2) + IfThen(FState = MONSTATE_DEAD, 16, 0); - r_GFX_OnceAnim(R_GFX_FLAME, x, y); - end; + {$IFDEF ENABLE_GFX} + if (Random(10) = 1) and (Times = 1) then + Exit; + for i := 1 to Times do + begin + x := Obj.X + Obj.Rect.X + Random(Obj.Rect.Width + Times * 2) - (R_GFX_FLAME_WIDTH div 2); + y := Obj.Y + 8 + Random(8 + Times * 2) + IfThen(FState = MONSTATE_DEAD, 16, 0); + g_GFX_QueueEffect(R_GFX_FLAME, x, y); + end; + {$ENDIF} end;