hedgewars/uAIMisc.pas
changeset 8751 4609823efc94
parent 8744 6c87486fd89b
child 8777 cce79a042cfc
equal deleted inserted replaced
8749:1b9f026e9fc6 8751:4609823efc94
   263     if ((x and LAND_WIDTH_MASK) = 0) and ((y and LAND_HEIGHT_MASK) = 0) then
   263     if ((x and LAND_WIDTH_MASK) = 0) and ((y and LAND_HEIGHT_MASK) = 0) then
   264     begin
   264     begin
   265         MeX:= hwRound(Me^.X);
   265         MeX:= hwRound(Me^.X);
   266         MeY:= hwRound(Me^.Y);
   266         MeY:= hwRound(Me^.Y);
   267         // We are still inside the hog. Skip radius test
   267         // We are still inside the hog. Skip radius test
   268         if ((((x-MeX)*(x-MeX)) + ((y-MeY)*(y-MeY))) < 256) and ((Land[y, x] and $FF00) = 0) then
   268         if ((((x-MeX)*(x-MeX)) + ((y-MeY)*(y-MeY))) < 256) and (Land[y, x] <= lfAllObjMask) then
   269             exit(false);
   269             exit(false);
   270     end;
   270     end;
   271     TestCollExcludingMe:= TestColl(x, y, r)
   271     TestCollExcludingMe:= TestColl(x, y, r)
   272 end;
   272 end;
   273 
   273 
   274 function TestCollExcludingObjects(x, y, r: LongInt): boolean; inline;
   274 function TestCollExcludingObjects(x, y, r: LongInt): boolean; inline;
   275 var b: boolean;
   275 var b: boolean;
   276 begin
   276 begin
   277     b:= (((x-r) and LAND_WIDTH_MASK) = 0) and (((y-r) and LAND_HEIGHT_MASK) = 0) and (Land[y-r, x-r] and $FF00 <> 0);
   277     b:= (((x-r) and LAND_WIDTH_MASK) = 0) and (((y-r) and LAND_HEIGHT_MASK) = 0) and (Land[y-r, x-r] > lfAllObjMask);
   278     if b then
   278     if b then
   279         exit(true);
   279         exit(true);
   280     
   280     
   281     b:= (((x-r) and LAND_WIDTH_MASK) = 0) and (((y+r) and LAND_HEIGHT_MASK) = 0) and (Land[y+r, x-r] and $FF00 <> 0);
   281     b:= (((x-r) and LAND_WIDTH_MASK) = 0) and (((y+r) and LAND_HEIGHT_MASK) = 0) and (Land[y+r, x-r] > lfAllObjMask);
   282     if b then
   282     if b then
   283         exit(true);
   283         exit(true);
   284     
   284     
   285     b:= (((x+r) and LAND_WIDTH_MASK) = 0) and (((y-r) and LAND_HEIGHT_MASK) = 0) and (Land[y-r, x+r] and $FF00 <> 0);
   285     b:= (((x+r) and LAND_WIDTH_MASK) = 0) and (((y-r) and LAND_HEIGHT_MASK) = 0) and (Land[y-r, x+r] > lfAllObjMask);
   286     if b then
   286     if b then
   287         exit(true);
   287         exit(true);
   288     
   288     
   289     b:= (((x+r) and LAND_WIDTH_MASK) = 0) and (((y+r) and LAND_HEIGHT_MASK) = 0) and (Land[y+r, x+r] and $FF00 <> 0);
   289     b:= (((x+r) and LAND_WIDTH_MASK) = 0) and (((y+r) and LAND_HEIGHT_MASK) = 0) and (Land[y+r, x+r] > lfAllObjMask);
   290     if b then
   290     if b then
   291         exit(true);
   291         exit(true);
   292     
   292     
   293     TestCollExcludingObjects:= false;
   293     TestCollExcludingObjects:= false;
   294 end;
   294 end;
   295 
   295 
   296 function TestColl(x, y, r: LongInt): boolean; inline;
   296 function TestColl(x, y, r: LongInt): boolean; inline;
   297 var b: boolean;
   297 var b: boolean;
   298 begin
   298 begin
   299     b:= (((x-r) and LAND_WIDTH_MASK) = 0) and (((y-r) and LAND_HEIGHT_MASK) = 0) and (Land[y-r, x-r] and lfCurrentMask <> 0);
   299     b:= (((x-r) and LAND_WIDTH_MASK) = 0) and (((y-r) and LAND_HEIGHT_MASK) = 0) and (Land[y-r, x-r] and lfNotCurrentMask <> 0);
   300     if b then
   300     if b then
   301         exit(true);
   301         exit(true);
   302     
   302     
   303     b:= (((x-r) and LAND_WIDTH_MASK) = 0) and (((y+r) and LAND_HEIGHT_MASK) = 0) and (Land[y+r, x-r] and lfCurrentMask <> 0);
   303     b:= (((x-r) and LAND_WIDTH_MASK) = 0) and (((y+r) and LAND_HEIGHT_MASK) = 0) and (Land[y+r, x-r] and lfNotCurrentMask <> 0);
   304     if b then
   304     if b then
   305         exit(true);
   305         exit(true);
   306     
   306     
   307     b:= (((x+r) and LAND_WIDTH_MASK) = 0) and (((y-r) and LAND_HEIGHT_MASK) = 0) and (Land[y-r, x+r] and lfCurrentMask <> 0);
   307     b:= (((x+r) and LAND_WIDTH_MASK) = 0) and (((y-r) and LAND_HEIGHT_MASK) = 0) and (Land[y-r, x+r] and lfNotCurrentMask <> 0);
   308     if b then
   308     if b then
   309         exit(true);
   309         exit(true);
   310     
   310     
   311     b:= (((x+r) and LAND_WIDTH_MASK) = 0) and (((y+r) and LAND_HEIGHT_MASK) = 0) and (Land[y+r, x+r] and lfCurrentMask <> 0);
   311     b:= (((x+r) and LAND_WIDTH_MASK) = 0) and (((y+r) and LAND_HEIGHT_MASK) = 0) and (Land[y+r, x+r] and lfNotCurrentMask <> 0);
   312     if b then
   312     if b then
   313         exit(true);
   313         exit(true);
   314     
   314     
   315     TestColl:= false;
   315     TestColl:= false;
   316 end;
   316 end;
   317 
   317 
   318 function TestCollWithLand(x, y, r: LongInt): boolean; inline;
   318 function TestCollWithLand(x, y, r: LongInt): boolean; inline;
   319 var b: boolean;
   319 var b: boolean;
   320 begin
   320 begin
   321     b:= (((x-r) and LAND_WIDTH_MASK) = 0) and (((y-r) and LAND_HEIGHT_MASK) = 0) and (Land[y-r, x-r] > 255);
   321     b:= (((x-r) and LAND_WIDTH_MASK) = 0) and (((y-r) and LAND_HEIGHT_MASK) = 0) and (Land[y-r, x-r] > lfAllObjMask);
   322     if b then
   322     if b then
   323         exit(true);
   323         exit(true);
   324         
   324         
   325     b:= (((x-r) and LAND_WIDTH_MASK) = 0) and (((y+r) and LAND_HEIGHT_MASK) = 0) and (Land[y+r, x-r] > 255);
   325     b:= (((x-r) and LAND_WIDTH_MASK) = 0) and (((y+r) and LAND_HEIGHT_MASK) = 0) and (Land[y+r, x-r] > lfAllObjMask);
   326     if b then
   326     if b then
   327         exit(true);
   327         exit(true);
   328         
   328         
   329     b:= (((x+r) and LAND_WIDTH_MASK) = 0) and (((y-r) and LAND_HEIGHT_MASK) = 0) and (Land[y-r, x+r] > 255);
   329     b:= (((x+r) and LAND_WIDTH_MASK) = 0) and (((y-r) and LAND_HEIGHT_MASK) = 0) and (Land[y-r, x+r] > lfAllObjMask);
   330     if b then
   330     if b then
   331         exit(true);
   331         exit(true);
   332         
   332         
   333     b:= (((x+r) and LAND_WIDTH_MASK) = 0) and (((y+r) and LAND_HEIGHT_MASK) = 0) and (Land[y+r, x+r] > 255);
   333     b:= (((x+r) and LAND_WIDTH_MASK) = 0) and (((y+r) and LAND_HEIGHT_MASK) = 0) and (Land[y+r, x+r] > lfAllObjMask);
   334     if b then
   334     if b then
   335         exit(true);
   335         exit(true);
   336 
   336 
   337     TestCollWithLand:= false;
   337     TestCollWithLand:= false;
   338 end;
   338 end;
   710 
   710 
   711 function HHGo(Gear, AltGear: PGear; var GoInfo: TGoInfo): boolean;
   711 function HHGo(Gear, AltGear: PGear; var GoInfo: TGoInfo): boolean;
   712 var pX, pY, tY: LongInt;
   712 var pX, pY, tY: LongInt;
   713 begin
   713 begin
   714 HHGo:= false;
   714 HHGo:= false;
   715 Gear^.CollisionMask:= lfCurrentMask;
   715 Gear^.CollisionMask:= lfNotCurrentMask;
   716 AltGear^:= Gear^;
   716 AltGear^:= Gear^;
   717 
   717 
   718 GoInfo.Ticks:= 0;
   718 GoInfo.Ticks:= 0;
   719 GoInfo.FallPix:= 0;
   719 GoInfo.FallPix:= 0;
   720 GoInfo.JumpType:= jmpNone;
   720 GoInfo.JumpType:= jmpNone;