/
Mr.Stalin
/
FOnline-Engine
Обзор
Документация
Войти
/
Mr.Stalin
/
FOnline-Engine
Код
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
Source/Scripting/AngelScript/CoreScripts/LineTracer.fos
140 строк
4 KB
cvet
Joystick support (#147)
26 апр 2026, 16:52
Не верифицирован
26 апр 2026, 16:52
822ea8f
Код
Авторство
О чём код?
namespace LineTracer { // Author: Atom // utilities for tracing // pathfinding/critter-gathering functions etc. interface ITraceContext { void StartExec(Map map, mpos fromHex, mpos toHex, int maxDist); void FinishExec(Map map, int resultDist); bool Exec(Map map, mpos hex); // Return true to stop tracing }; class SimpleTracer : ITraceContext { mpos ResultHex; SimpleTracer() { } void StartExec(Map map, mpos fromHex, mpos toHex, int maxDist) override { ResultHex = fromHex; } void FinishExec(Map map, int resultDist) override { } bool Exec(Map map, mpos hex) override { ResultHex = hex; return false; } }; class MapBorderTracer : LineTracer::ITraceContext { mpos ResultHex; int ResultDist; void StartExec(Map map, mpos fromHex, mpos toHex, int maxDist) override { ResultHex = fromHex; } void FinishExec(Map map, int resultDist) override { ResultDist = resultDist; } bool Exec(Map map, mpos hex) override { if (map.IsOutsideArea(hex)) { return true; } ResultHex = hex; return false; } }; int ExecuteHexTrace(Map map, mpos fromHex, mpos toHex, int dist, mpos[] traceLine, ITraceContext context) { context.StartExec(map, fromHex, toHex, dist); int traceCount = int(traceLine.length()); int resultDist = traceCount; for (int i = 0; i < traceCount; i++) { if (context.Exec(map, traceLine[i])) { resultDist = i + 1; break; } } context.FinishExec(map, resultDist); return resultDist; } int LineTracerHex(Map map, mpos fromHex, mpos toHex, ITraceContext context) { return LineTracerHex(map, fromHex, toHex, 0, 0.0, ZERO_IPOS, ZERO_IPOS, context); } int LineTracerHex(Map map, mpos fromHex, mpos toHex, ipos startOffset, ipos targetOffset, ITraceContext context) { return LineTracerHex(map, fromHex, toHex, 0, 0.0, startOffset, targetOffset, context); } int LineTracerHex(Map map, mpos fromHex, mpos toHex, int dist, ITraceContext context) { return LineTracerHex(map, fromHex, toHex, dist, 0.0, ZERO_IPOS, ZERO_IPOS, context); } int LineTracerHex(Map map, mpos fromHex, mpos toHex, int dist, ipos startOffset, ipos targetOffset, ITraceContext context) { return LineTracerHex(map, fromHex, toHex, dist, 0.0, startOffset, targetOffset, context); } int LineTracerHex(Map map, mpos fromHex, float dirAngle, int dist, ITraceContext context) { return LineTracerHex(map, fromHex, dirAngle, dist, ZERO_IPOS, ZERO_IPOS, context); } int LineTracerHex(Map map, mpos fromHex, mdir dir, int dist, ITraceContext context) { return LineTracerHex(map, fromHex, float(dir.angle), dist, ZERO_IPOS, ZERO_IPOS, context); } int LineTracerHex(Map map, mpos fromHex, float dirAngle, int dist, ipos startOffset, ipos targetOffset, ITraceContext context) { mpos toHex; mpos[] traceLine = Game.TraceHexLine(map.Size, fromHex, dirAngle, dist, startOffset, targetOffset, toHex); return ExecuteHexTrace(map, fromHex, toHex, dist, traceLine, context); } int LineTracerHex(Map map, mpos fromHex, mdir dir, int dist, ipos startOffset, ipos targetOffset, ITraceContext context) { return LineTracerHex(map, fromHex, float(dir.angle), dist, startOffset, targetOffset, context); } int LineTracerHex(Map map, mpos fromHex, mpos toHex, int dist, float dirAngleOffset, ITraceContext context) { return LineTracerHex(map, fromHex, toHex, dist, dirAngleOffset, ZERO_IPOS, ZERO_IPOS, context); } int LineTracerHex(Map map, mpos fromHex, mpos toHex, int dist, float dirAngleOffset, ipos startOffset, ipos targetOffset, ITraceContext context) { if (dist == 0) { dist = Game.GetDistance(fromHex, toHex); } mpos[] traceLine = Game.TraceHexLine(map.Size, fromHex, toHex, dist, dirAngleOffset, startOffset, targetOffset); return ExecuteHexTrace(map, fromHex, toHex, dist, traceLine, context); } }