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.