diff --git a/src/game/g_weapons.pas b/src/game/g_weapons.pas
index 2e2521b72f9956912574ac8a2eba69f71fe2ede4..81db80314333fb159b8396ad7bafabf84fa22700 100644 (file)
--- a/src/game/g_weapons.pas
+++ b/src/game/g_weapons.pas
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*)
-{$MODE DELPHI}
+{$INCLUDE ../shared/a_modes.inc}
unit g_weapons;
interface
procedure g_Weapon_SaveState(var Mem: TBinMemoryWriter);
procedure g_Weapon_LoadState(var Mem: TBinMemoryReader);
+procedure g_Weapon_AddDynLights();
+
const
WEAPON_KASTET = 0;
WEAPON_SAW = 1;
Animation := nil;
TextureID := 0;
g_Frames_Get(TextureID, 'FRAMES_FLAME');
- Stopped := 0;
end;
end;
Shots[find_id].Obj.Accel.X := 0;
Shots[find_id].Obj.Accel.Y := 0;
Shots[find_id].SpawnerUID := Spawner;
+ if (ShotType = WEAPON_FLAMETHROWER) and (XV = 0) and (YV = 0) then
+ Shots[find_id].Stopped := 255
+ else
+ Shots[find_id].Stopped := 0;
Result := find_id;
end;
Shots[i].Obj.Vel.Y := (yd*s) div a;
Shots[i].Obj.Accel.X := 0;
Shots[i].Obj.Accel.Y := 0;
+ Shots[i].Stopped := 0;
if Shots[i].ShotType in [WEAPON_ROCKETLAUNCHER, WEAPON_BFG] then
Shots[i].Timeout := 900 // ~25 sec
else
if ChkTeam then
if HitPlayer(gPlayers[i], d, obj^.Vel.X, obj^.Vel.Y, SpawnerUID, t) then
begin
- gPlayers[i].Push((obj^.Vel.X+obj^.Accel.X)*IfThen(t = HIT_BFG, 8, 1) div 4,
- (obj^.Vel.Y+obj^.Accel.Y)*IfThen(t = HIT_BFG, 8, 1) div 4);
+ if t <> HIT_FLAME then
+ gPlayers[i].Push((obj^.Vel.X+obj^.Accel.X)*IfThen(t = HIT_BFG, 8, 1) div 4,
+ (obj^.Vel.Y+obj^.Accel.Y)*IfThen(t = HIT_BFG, 8, 1) div 4);
if t = HIT_BFG then
g_Game_DelayEvent(DE_BFGHIT, 1000, SpawnerUID);
Result := True;
if (gMonsters[i] <> nil) and gMonsters[i].Live and g_Obj_Collide(obj, @gMonsters[i].Obj) then
if HitMonster(gMonsters[i], d, obj^.Vel.X, obj^.Vel.Y, SpawnerUID, t) then
begin
- gMonsters[i].Push((obj^.Vel.X+obj^.Accel.X)*IfThen(t = HIT_BFG, 8, 1) div 4,
- (obj^.Vel.Y+obj^.Accel.Y)*IfThen(t = HIT_BFG, 8, 1) div 4);
+ if t <> HIT_FLAME then
+ gMonsters[i].Push((obj^.Vel.X+obj^.Accel.X)*IfThen(t = HIT_BFG, 8, 1) div 4,
+ (obj^.Vel.Y+obj^.Accel.Y)*IfThen(t = HIT_BFG, 8, 1) div 4);
Result := True;
break;
end;
procedure g_Weapon_flame(x, y, xd, yd: Integer; SpawnerUID: Word; WID: Integer = -1;
Silent: Boolean = False);
var
- find_id, FramesID: DWORD;
+ find_id: DWORD;
dx, dy: Integer;
begin
if WID < 0 then
Animation := nil;
TextureID := 0;
g_Frames_Get(TextureID, 'FRAMES_FLAME');
- Stopped := 0;
end;
Shots[find_id].SpawnerUID := SpawnerUID;
o: TObj;
spl: Boolean;
Loud: Boolean;
+ tcx, tcy: Integer;
begin
if Shots = nil then
Exit;
oldvx := Obj.Vel.X;
oldvy := Obj.Vel.Y;
// Àêòèâèðîâàòü òðèããåðû ïî ïóòè (êðîìå óæå àêòèâèðîâàííûõ):
- if g_Game_IsServer then
+ if (Stopped = 0) and g_Game_IsServer then
t := g_Triggers_PressR(Obj.X, Obj.Y, Obj.Rect.Width, Obj.Rect.Height,
SpawnerUID, ACTIVATE_SHOT, triggers)
else
(ShotType <> WEAPON_BSP_FIRE) and
(ShotType <> WEAPON_FLAMETHROWER);
- st := g_Obj_Move(@Obj, False, spl);
+ if Stopped = 0 then
+ st := g_Obj_Move(@Obj, False, spl)
+ else
+ st := 0;
if WordBool(st and MOVE_FALLOUT) or (Obj.X < -1000) or
(Obj.X > gMapInfo.Width+1000) or (Obj.Y < -1000) then
Anim := TAnimation.Create(TextureID, False, 8);
Anim.Blending := False;
g_GFX_OnceAnim((Obj.X+32)-58, (Obj.Y+8)-36, Anim);
+ g_DynLightExplosion((Obj.X+32), (Obj.Y+8), 64, 1, 0, 0);
Anim.Free();
end;
end
Anim := TAnimation.Create(TextureID, False, 6);
Anim.Blending := False;
g_GFX_OnceAnim(cx-64, cy-64, Anim);
+ g_DynLightExplosion(cx, cy, 64, 1, 0, 0);
Anim.Free();
end;
end;
Anim.Blending := False;
g_GFX_OnceAnim(cx-16, cy-16, Anim);
Anim.Free();
+ g_DynLightExplosion(cx, cy, 32, 0, 0.5, 0.5);
end;
g_Sound_PlayExAt('SOUND_WEAPON_EXPLODEPLASMA', Obj.X, Obj.Y);
begin
Anim := TAnimation.Create(_id, False, 3);
Anim.Alpha := 0;
- g_GFX_OnceAnim(cx-4+Random(8)-(Anim.Width div 2),
- cy-4+Random(8)-(Anim.Height div 2),
+ tcx := Random(8);
+ tcy := Random(8);
+ g_GFX_OnceAnim(cx-4+tcx-(Anim.Width div 2),
+ cy-4+tcy-(Anim.Height div 2),
Anim, ONCEANIM_SMOKE);
Anim.Free();
end;
Anim := TAnimation.Create(TextureID, False, 2 + Random(2));
Anim.Alpha := 0;
case Stopped of
- 0: g_GFX_OnceAnim(cx-4+Random(8)-(Anim.Width div 2),
- cy-4+Random(8)-(Anim.Height div 2),
- Anim, ONCEANIM_SMOKE);
- MOVE_HITWALL: g_GFX_OnceAnim(cx-4+Random(8)-(Anim.Width div 2),
- cy-12+Random(24)-(Anim.Height div 2),
- Anim, ONCEANIM_SMOKE);
- MOVE_HITLAND: g_GFX_OnceAnim(cx-12+Random(24)-(Anim.Width div 2),
- cy-10+Random(8)-(Anim.Height div 2),
- Anim, ONCEANIM_SMOKE);
- MOVE_HITCEIL: g_GFX_OnceAnim(cx-12+Random(24)-(Anim.Width div 2),
- cy+6+Random(8)-(Anim.Height div 2),
- Anim, ONCEANIM_SMOKE);
+ MOVE_HITWALL: begin tcx := cx-4+Random(8); tcy := cy-12+Random(24); end;
+ MOVE_HITLAND: begin tcx := cx-12+Random(24); tcy := cy-10+Random(8); end;
+ MOVE_HITCEIL: begin tcx := cx-12+Random(24); tcy := cy+6+Random(8); end;
+ else begin tcx := cx-4+Random(8); tcy := cy-4+Random(8); end;
end;
+ g_GFX_OnceAnim(tcx-(Anim.Width div 2), tcy-(Anim.Height div 2), Anim, ONCEANIM_SMOKE);
Anim.Free();
+ //g_DynLightExplosion(tcx, tcy, 1, 1, 0.8, 0.3);
end;
end;
Anim.Blending := False;
g_GFX_OnceAnim(cx-64, cy-64, Anim);
Anim.Free();
+ g_DynLightExplosion(cx, cy, 96, 0, 1, 0);
end;
g_Sound_PlayExAt('SOUND_WEAPON_EXPLODEBFG', Obj.X, Obj.Y);
end;
end;
+
+procedure g_Weapon_AddDynLights();
+var
+ i: Integer;
+begin
+ if Shots = nil then Exit;
+ for i := 0 to High(Shots) do
+ begin
+ if Shots[i].ShotType = 0 then continue;
+ if (Shots[i].ShotType = WEAPON_ROCKETLAUNCHER) or
+ (Shots[i].ShotType = WEAPON_BARON_FIRE) or
+ (Shots[i].ShotType = WEAPON_MANCUB_FIRE) or
+ (Shots[i].ShotType = WEAPON_SKEL_FIRE) or
+ (Shots[i].ShotType = WEAPON_IMP_FIRE) or
+ (Shots[i].ShotType = WEAPON_CACO_FIRE) or
+ (Shots[i].ShotType = WEAPON_MANCUB_FIRE) or
+ (Shots[i].ShotType = WEAPON_BSP_FIRE) or
+ (Shots[i].ShotType = WEAPON_PLASMA) or
+ (Shots[i].ShotType = WEAPON_BFG) or
+ (Shots[i].ShotType = WEAPON_FLAMETHROWER) or
+ false then
+ begin
+ if (Shots[i].ShotType = WEAPON_PLASMA) then
+ g_AddDynLight(Shots[i].Obj.X+(Shots[i].Obj.Rect.Width div 2), Shots[i].Obj.Y+(Shots[i].Obj.Rect.Height div 2), 128, 0, 0.3, 1, 0.4)
+ else if (Shots[i].ShotType = WEAPON_BFG) then
+ g_AddDynLight(Shots[i].Obj.X+(Shots[i].Obj.Rect.Width div 2), Shots[i].Obj.Y+(Shots[i].Obj.Rect.Height div 2), 128, 0, 1, 0, 0.5)
+ else if (Shots[i].ShotType = WEAPON_FLAMETHROWER) then
+ g_AddDynLight(Shots[i].Obj.X+(Shots[i].Obj.Rect.Width div 2), Shots[i].Obj.Y+(Shots[i].Obj.Rect.Height div 2), 42, 1, 0.8, 0, 0.4)
+ else
+ g_AddDynLight(Shots[i].Obj.X+(Shots[i].Obj.Rect.Width div 2), Shots[i].Obj.Y+(Shots[i].Obj.Rect.Height div 2), 128, 1, 0, 0, 0.4);
+ end;
+ end;
+end;
+
end.