99 lines
2.3 KiB
ObjectPascal
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.
|