gh/sun_m.pas
2026-01-10 12:09:22 +05:00

99 lines
2.3 KiB
ObjectPascal

unit sun_m;
interface
uses creature_m;
procedure InitRandomSun(var s: creature);
procedure UpdateSunState(var cr: creature);
implementation
uses arena_m, Math, math_m;
const
SunSlowMovespeed = 1;
SunFastMovespeed = 2;
SunRageMovespeed = 4;
SunStartDX = SunSlowMovespeed;
SunStartDY = SunSlowMovespeed;
SunSymbol = 's';
MinToRageSwitch = 15;
MaxToRageSwitch = 25;
MinToNormSwitch = 5;
MaxToNormSwitch = 15;
procedure InitSun(var g: creature; x, y, sigdx, sigdy: integer);
begin
g.t := creatureSun;
g.curX := x;
g.curY := y;
g.dX := SunStartDX * sigdx;
g.dY := SunStartDY * sigdy;
g.movespeed := SunSlowMovespeed;
g.alive := true;
g.animation := 1;
new(g.sunf);
g.sunf^.bigStep:= true;
g.sunf^.rageMode := false;
g.sunf^.beforeRageSwitch := RandomLR(MinToRageSwitch, MaxToRageSwitch);;
end;
procedure InitRandomSun(var s: creature);
var
x, y, sigdx, sigdy: integer;
begin
sigdx := IfThen(RandomBool, 1, -1);
sigdy := IfThen(RandomBool, 1, -1);
x := RandomLR(2, ArenaW - 1);
y := RandomLR(2, ArenaH - 1);
InitSun(s, x, y, sigdx, sigdy)
end;
procedure SwitchRageMode(var cr: creature);
begin
cr.sunf^.rageMode := not cr.sunf^.rageMode;
if cr.sunf^.rageMode then
cr.sunf^.beforeRageSwitch := RandomLR(MinToNormSwitch, MaxToNormSwitch)
else
cr.sunf^.beforeRageSwitch := RandomLR(MinToRageSwitch, MaxToRageSwitch);
if cr.sunf^.rageMode then
begin
cr.dX := Signum(cr.dX, 0) * SunRageMovespeed;
cr.dY := Signum(cr.dY, 0) * SunRageMovespeed
end
else
begin
cr.dX := Signum(cr.dX, 0) * SunSlowMovespeed;
cr.dY := Signum(cr.dY, 0) * SunSlowMovespeed;
cr.sunf^.bigStep := false
end;
end;
procedure UpdateSunState(var cr: creature);
begin
if cr.sunf^.beforeRageSwitch = 0 then
begin
SwitchRageMode(cr);
exit
end;
cr.sunf^.beforeRageSwitch := cr.sunf^.beforeRageSwitch - 1;
if cr.sunf^.rageMode then
exit;
cr.sunf^.bigStep := not cr.sunf^.bigStep;
if cr.sunf^.bigStep then
begin
cr.dX := Signum(cr.dX, 0) * SunFastMovespeed;
cr.dY := Signum(cr.dY, 0) * SunFastMovespeed
end
else
begin
cr.dX := Signum(cr.dX, 0) * SunSlowMovespeed;
cr.dY := Signum(cr.dY, 0) * SunSlowMovespeed
end
end;
end.