Unit *UnitNearestFind(I64 row,I64 col,I64 player,Bool in_LOS,F64 range=-1) { I64 i; F64 dd,best_dd=F64_MAX,x1,y1,x2,y2; Unit *best=NULL; //$LK,"Sqrt",A="MN:Sqrt"$() is slow, so work with squared distances. if (range<0) range=F64_MAX; else range*=range; RowCol2XY(&x1,&y1,row,col); for (i=0;i0) { if (!in_LOS || LOS(row,col,units[player][i].row,units[player][i].col)) { RowCol2XY(&x2,&y2,units[player][i].row,units[player][i].col); dd=Sqr(x2-x1)+Sqr(y2-y1); if (dd<=range && ddlife>0 && tmpu->indirect_fire && (target=UnitNearestFind(tmpu->row,tmpu->col,enemy_player,TRUE, tmpu->range*2*HEX_RADIUS))) IndirectAdd(tmpu,target->row,target->col); } throw('PhaseOvr',TRUE); } U0 PlayerMove() { Unit *target,*tmpu; I64 i; F64 x,y; for (i=0;ilife>0) { //Cheats because it violates Line-of-Sight if (target=UnitNearestFind(tmpu->row,tmpu->col,enemy_player,FALSE)) { RowCol2XY(&x,&y,target->row,target->col); if (!UnitMove(tmpu,x,y)) { RowCol2XY(&x,&y,tmpu->row,tmpu->col); UnitMove(tmpu,x+RandI16,y+RandI16); } } } } throw('PhaseOvr',TRUE); } U0 PlayerDirect() { Unit *target,*tmpu; I64 i; for (i=0;ilife>0 && !tmpu->indirect_fire && (target=UnitNearestFind(tmpu->row,tmpu->col,enemy_player,TRUE, tmpu->range*2*HEX_RADIUS))) { UnitDirectFire(tmpu,target); Sleep(250*animation_delay); } } throw('PhaseOvr',TRUE); }