hedgewars/uFloat.pas
author sheepluva
Fri, 16 Sep 2011 14:04:45 +0200
changeset 5928 bf0aa65efd42
parent 5843 8c5168e3194c
child 5932 5164d17b6374
child 6295 5b2b304a91ec
permissions -rw-r--r--
whoops, this line got lost in merging action
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
     1
(*
1066
1f1b3686a2b0 Update copyright headers a bit
unc0rr
parents: 967
diff changeset
     2
 * Hedgewars, a free turn based strategy game
4976
088d40d8aba2 Happy 2011 :)
koda
parents: 4900
diff changeset
     3
 * Copyright (c) 2004-2011 Andrey Korotaev <unC0Rr@gmail.com>
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
     4
 *
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License as published by
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
     7
 * the Free Software Foundation; version 2 of the License
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
     8
 *
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    12
 * GNU General Public License for more details.
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    13
 *
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    17
 *)
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    18
5843
8c5168e3194c For better or for worse. Add sheepluva's forcing of clean on engine subdirectory. This works around a bug in fpc 2.4-2.6 that appears to generate incorrect inlining of loops on 2nd build. -B avoids this, but without a clean, the -B never got called. Also restore options, which I had confused w/ config. my bad.
nemo
parents: 5832
diff changeset
    19
{$INCLUDE "options.inc"}
8c5168e3194c For better or for worse. Add sheepluva's forcing of clean on engine subdirectory. This works around a bug in fpc 2.4-2.6 that appears to generate incorrect inlining of loops on 2nd build. -B avoids this, but without a clean, the -B never got called. Also restore options, which I had confused w/ config. my bad.
nemo
parents: 5832
diff changeset
    20
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    21
unit uFloat;
5122
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    22
(*
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    23
 * This unit provides a custom data type, hwFloat.
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    24
 *
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    25
 * hwFloat represents a floating point number - the value and operations
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    26
 * of this numbers are independent from the hardware architecture
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    27
 * the game runs on.
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    28
 *
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    29
 * This is important for calculations that affect the course of the game
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    30
 * and would lead to different results if based on a hardware dependent
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    31
 * data type.
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    32
 *
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    33
 * Note: Not all comparisons are implemented.
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    34
 *
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    35
 * Note: Below you'll find a list of hwFloat constants:
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    36
 *       E.g. _1 is an hwFloat with value 1.0, and -_0_9 is -0.9
5124
84267f79879b comments
sheepluva
parents: 5122
diff changeset
    37
 *       Use and extend the list if needed, rather than using int2hwFloat()
84267f79879b comments
sheepluva
parents: 5122
diff changeset
    38
 *       with integer constants.
5122
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    39
 *)
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    40
interface
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    41
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    42
{$IFDEF FPC}
2599
c7153d2348f3 move compiler directives to standard pascal
koda
parents: 2587
diff changeset
    43
{$IFDEF ENDIAN_LITTLE}
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    44
type hwFloat = record
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    45
               isNegative: boolean;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    46
               case byte of
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    47
               0: (Frac, Round: Longword);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    48
               1: (QWordValue : QWord);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    49
               end;
2599
c7153d2348f3 move compiler directives to standard pascal
koda
parents: 2587
diff changeset
    50
{$ELSE}
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    51
type hwFloat = record
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    52
               isNegative: boolean;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    53
               case byte of
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    54
               0: (Round, Frac: Longword);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    55
               1: (QWordValue : QWord);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    56
               end;
2599
c7153d2348f3 move compiler directives to standard pascal
koda
parents: 2587
diff changeset
    57
{$ENDIF}
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    58
5122
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    59
// Returns an hwFloat that represents the value of integer parameter i
3599
715a43602da8 sheepluva's inline patch, fix a crash in overlay
koda
parents: 3591
diff changeset
    60
function int2hwFloat (const i: LongInt) : hwFloat; inline;
5151
cbadb9fa52fc An experiment - make bazooka AI use float instead of hwFloat - should be as accurate, but faster.
nemo
parents: 5124
diff changeset
    61
function hwFloat2Float (const i: hwFloat) : extended; inline;
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    62
5122
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    63
// The implemented operators
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    64
3599
715a43602da8 sheepluva's inline patch, fix a crash in overlay
koda
parents: 3591
diff changeset
    65
operator + (const z1, z2: hwFloat) z : hwFloat; inline;
715a43602da8 sheepluva's inline patch, fix a crash in overlay
koda
parents: 3591
diff changeset
    66
operator - (const z1, z2: hwFloat) z : hwFloat; inline;
3929
9a4bbc1f67a2 Inline most of uFloat (saves ~7.5% opcount on a test game), inline a few very short candidates in uMisc, comment out some unused functions in uMisc
nemo
parents: 3599
diff changeset
    67
operator - (const z1: hwFloat) z : hwFloat; inline;
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    68
3929
9a4bbc1f67a2 Inline most of uFloat (saves ~7.5% opcount on a test game), inline a few very short candidates in uMisc, comment out some unused functions in uMisc
nemo
parents: 3599
diff changeset
    69
operator * (const z1, z2: hwFloat) z : hwFloat; inline;
3599
715a43602da8 sheepluva's inline patch, fix a crash in overlay
koda
parents: 3591
diff changeset
    70
operator * (const z1: hwFloat; const z2: LongInt) z : hwFloat; inline;
3929
9a4bbc1f67a2 Inline most of uFloat (saves ~7.5% opcount on a test game), inline a few very short candidates in uMisc, comment out some unused functions in uMisc
nemo
parents: 3599
diff changeset
    71
operator / (const z1: hwFloat; z2: hwFloat) z : hwFloat; inline;
9a4bbc1f67a2 Inline most of uFloat (saves ~7.5% opcount on a test game), inline a few very short candidates in uMisc, comment out some unused functions in uMisc
nemo
parents: 3599
diff changeset
    72
operator / (const z1: hwFloat; const z2: LongInt) z : hwFloat; inline;
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    73
3929
9a4bbc1f67a2 Inline most of uFloat (saves ~7.5% opcount on a test game), inline a few very short candidates in uMisc, comment out some unused functions in uMisc
nemo
parents: 3599
diff changeset
    74
operator < (const z1, z2: hwFloat) b : boolean; inline;
9a4bbc1f67a2 Inline most of uFloat (saves ~7.5% opcount on a test game), inline a few very short candidates in uMisc, comment out some unused functions in uMisc
nemo
parents: 3599
diff changeset
    75
operator > (const z1, z2: hwFloat) b : boolean; inline;
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    76
5122
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    77
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    78
// Various functions for hwFloat (some are inlined in the resulting code for better performance)
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    79
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    80
function cstr(const z: hwFloat): shortstring; // Returns a shortstring representations of the hwFloat.
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    81
function hwRound(const t: hwFloat): LongInt; inline; // Does NOT really round but returns the integer representation of the hwFloat without fractional digits. (-_0_9 -> -0, _1_5 -> _1)
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    82
function hwAbs(const t: hwFloat): hwFloat; inline; // Returns the value of t with positive sign.
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    83
function hwSqr(const t: hwFloat): hwFloat; inline; // Returns the square value of parameter t.
5843
8c5168e3194c For better or for worse. Add sheepluva's forcing of clean on engine subdirectory. This works around a bug in fpc 2.4-2.6 that appears to generate incorrect inlining of loops on 2nd build. -B avoids this, but without a clean, the -B never got called. Also restore options, which I had confused w/ config. my bad.
nemo
parents: 5832
diff changeset
    84
function hwSqrt(const t: hwFloat): hwFloat; inline; // Returns the the positive square root of parameter t.
5122
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    85
function Distance(const dx, dy: hwFloat): hwFloat; // Returns the distance between two points in 2-dimensional space, of which the parameters are the horizontal and vertical distance.
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    86
function DistanceI(const dx, dy: LongInt): hwFloat; // Same as above for integer parameters.
515
270f10276d2e - Remove deprecated code
unc0rr
parents: 513
diff changeset
    87
function AngleSin(const Angle: Longword): hwFloat;
270f10276d2e - Remove deprecated code
unc0rr
parents: 513
diff changeset
    88
function AngleCos(const Angle: Longword): hwFloat;
5122
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    89
function SignAs(const num, signum: hwFloat): hwFloat; inline; // Returns an hwFloat with the value of parameter num and the sign of signum.
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    90
function hwSign(r: hwFloat): LongInt; inline; // Returns an integer with value 1 and sign of parameter r.
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
    91
2599
c7153d2348f3 move compiler directives to standard pascal
koda
parents: 2587
diff changeset
    92
{$IFDEF FPC}
538
74219eadab5e - Various small fixes
unc0rr
parents: 515
diff changeset
    93
{$J-}
2599
c7153d2348f3 move compiler directives to standard pascal
koda
parents: 2587
diff changeset
    94
{$ENDIF}
611
8cf6d27cec86 Fix warnings
unc0rr
parents: 543
diff changeset
    95
{$WARNINGS OFF}
5122
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    96
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    97
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    98
// some hwFloat constants
9b0513507ba8 some more comments *yawns*
sheepluva
parents: 4976
diff changeset
    99
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   100
const  _1div1024: hwFloat = (isNegative: false; QWordValue:     4194304);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   101
      _1div10000: hwFloat = (isNegative: false; QWordValue:      429496);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   102
      _1div50000: hwFloat = (isNegative: false; QWordValue:       85899);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   103
     _1div100000: hwFloat = (isNegative: false; QWordValue:       42950);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   104
          _1div3: hwFloat = (isNegative: false; QWordValue:  1431655766);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   105
            hwPi: hwFloat = (isNegative: false; QWordValue: 13493037704);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   106
       _0_000004: hwFloat = (isNegative: false; QWordValue:       17179);
3591
sheepluva
parents: 3584
diff changeset
   107
       _0_000064: hwFloat = (isNegative: false; QWordValue:      274878);
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   108
         _0_0002: hwFloat = (isNegative: false; QWordValue:      858993);
1586
2c6f1d1f43c1 Adjust flame parameters to produce more damage
unc0rr
parents: 1433
diff changeset
   109
         _0_0005: hwFloat = (isNegative: false; QWordValue:     2147484);
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   110
          _0_001: hwFloat = (isNegative: false; QWordValue:     4294967);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   111
          _0_003: hwFloat = (isNegative: false; QWordValue:    12884902);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   112
          _0_004: hwFloat = (isNegative: false; QWordValue:    17179869);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   113
          _0_005: hwFloat = (isNegative: false; QWordValue:    21474836);
3428
46a2694867bc portal:
sheepluva
parents: 3422
diff changeset
   114
          _0_008: hwFloat = (isNegative: false; QWordValue:    34359738);
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   115
           _0_01: hwFloat = (isNegative: false; QWordValue:    42949673);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   116
           _0_02: hwFloat = (isNegative: false; QWordValue:    85899345);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   117
           _0_03: hwFloat = (isNegative: false; QWordValue:   128849018);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   118
           _0_08: hwFloat = (isNegative: false; QWordValue:   343597383);
365
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 358
diff changeset
   119
            _0_1: hwFloat = (isNegative: false; QWordValue:   429496730);
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   120
           _0_15: hwFloat = (isNegative: false; QWordValue:   644245094);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   121
            _0_2: hwFloat = (isNegative: false; QWordValue:   858993459);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   122
           _0_25: hwFloat = (isNegative: false; QWordValue:  1073741824);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   123
            _0_3: hwFloat = (isNegative: false; QWordValue:  1288490189);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   124
           _0_35: hwFloat = (isNegative: false; QWordValue:  1503238553);
2784
1a2e3c7c6a46 King health proportional to team size
nemo
parents: 2630
diff changeset
   125
          _0_375: hwFloat = (isNegative: false; QWordValue:  4294967296 * 3 div 8);
835
6f567934cc44 Automatically use parachute when vertical speed is high enough
unc0rr
parents: 745
diff changeset
   126
           _0_39: hwFloat = (isNegative: false; QWordValue:  1675037245);
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   127
            _0_4: hwFloat = (isNegative: false; QWordValue:  1717986918);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   128
           _0_45: hwFloat = (isNegative: false; QWordValue:  1932735283);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   129
            _0_5: hwFloat = (isNegative: false; QWordValue:  2147483648);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   130
           _0_55: hwFloat = (isNegative: false; QWordValue:  2362232012);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   131
            _0_6: hwFloat = (isNegative: false; QWordValue:  2576980377);
3583
13818670ad9e rope: tiny optimisation
sheepluva
parents: 3428
diff changeset
   132
           _0_64: hwFloat = (isNegative: false; QWordValue:  2748779064);
358
236bbd12d4d9 - New Land Generator
unc0rr
parents: 357
diff changeset
   133
            _0_7: hwFloat = (isNegative: false; QWordValue:  3006477107);
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   134
            _0_8: hwFloat = (isNegative: false; QWordValue:  3435973837);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   135
           _0_84: hwFloat = (isNegative: false; QWordValue:  3607772528);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   136
           _0_87: hwFloat = (isNegative: false; QWordValue:  3736621547);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   137
            _0_9: hwFloat = (isNegative: false; QWordValue:  3865470566);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   138
           _0_93: hwFloat = (isNegative: false; QWordValue:  3994319585);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   139
           _0_96: hwFloat = (isNegative: false; QWordValue:  4123168604);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   140
          _0_995: hwFloat = (isNegative: false; QWordValue:  4273492459);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   141
          _0_999: hwFloat = (isNegative: false; QWordValue:  4290672328);
498
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 493
diff changeset
   142
              _0: hwFloat = (isNegative: false; QWordValue:           0);
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 493
diff changeset
   143
              _1: hwFloat = (isNegative: false; QWordValue:  4294967296);
513
69e06d710d46 Moving hedgehog could get another hedgehog moving forward
unc0rr
parents: 498
diff changeset
   144
            _1_5: hwFloat = (isNegative: false; QWordValue:  4294967296 * 3 div 2);
3584
7c05f2e0a8b5 rope: another small optimization
sheepluva
parents: 3583
diff changeset
   145
            _1_9: hwFloat = (isNegative: false; QWordValue:  8160437862);
498
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 493
diff changeset
   146
              _2: hwFloat = (isNegative: false; QWordValue:  4294967296 * 2);
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 493
diff changeset
   147
              _3: hwFloat = (isNegative: false; QWordValue:  4294967296 * 3);
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 493
diff changeset
   148
              _4: hwFloat = (isNegative: false; QWordValue:  4294967296 * 4);
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 493
diff changeset
   149
              _5: hwFloat = (isNegative: false; QWordValue:  4294967296 * 5);
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 493
diff changeset
   150
              _6: hwFloat = (isNegative: false; QWordValue:  4294967296 * 6);
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 493
diff changeset
   151
             _10: hwFloat = (isNegative: false; QWordValue:  4294967296 * 10);
3422
41ae3c48faa0 * some changes/cleanups to portal, still much to do :/ * reverted nemo's temporary loop fix * notice: small loops possible again, so take care :P, bigger onces should be interrupted
sheepluva
parents: 3407
diff changeset
   152
             _12: hwFloat = (isNegative: false; QWordValue:  4294967296 * 12);
498
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 493
diff changeset
   153
             _16: hwFloat = (isNegative: false; QWordValue:  4294967296 * 16);
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 493
diff changeset
   154
             _19: hwFloat = (isNegative: false; QWordValue:  4294967296 * 19);
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 493
diff changeset
   155
             _20: hwFloat = (isNegative: false; QWordValue:  4294967296 * 20);
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 493
diff changeset
   156
             _25: hwFloat = (isNegative: false; QWordValue:  4294967296 * 25);
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 493
diff changeset
   157
             _30: hwFloat = (isNegative: false; QWordValue:  4294967296 * 30);
2955
fb361d137524 Tweak to joke in french locale (everyone always fixes the spelling) updated explosive frames from Palewolf, increase explosive fall damage from 30 to 40
nemo
parents: 2948
diff changeset
   158
             _40: hwFloat = (isNegative: false; QWordValue:  4294967296 * 40);
3036
c6ba6531cb4b Make barrels a little more likely to blow up. 25% more damage in fall
nemo
parents: 2955
diff changeset
   159
             _50: hwFloat = (isNegative: false; QWordValue:  4294967296 * 50);
2933
02af54eb7e1e Experiment with barrels. Add rolling.
nemo
parents: 2905
diff changeset
   160
             _70: hwFloat = (isNegative: false; QWordValue:  4294967296 * 70);
498
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 493
diff changeset
   161
            _128: hwFloat = (isNegative: false; QWordValue:  4294967296 * 128);
5319
51d8e4747876 bounce. tweak of values, remove friction modifier, move to weapon, to match timer behaviour
nemo
parents: 5192
diff changeset
   162
            _250: hwFloat = (isNegative: false; QWordValue:  4294967296 * 250);
1915
c357f5b55320 patch by nemo:
unc0rr
parents: 1753
diff changeset
   163
            _256: hwFloat = (isNegative: false; QWordValue:  4294967296 * 256);
1124
1636a3c7c061 - Airplane is higher
unc0rr
parents: 1066
diff changeset
   164
            _300: hwFloat = (isNegative: false; QWordValue:  4294967296 * 300);
498
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 493
diff changeset
   165
            _450: hwFloat = (isNegative: false; QWordValue:  4294967296 * 450);
5319
51d8e4747876 bounce. tweak of values, remove friction modifier, move to weapon, to match timer behaviour
nemo
parents: 5192
diff changeset
   166
           _1000: hwFloat = (isNegative: false; QWordValue:  4294967296 * 1000);
611
8cf6d27cec86 Fix warnings
unc0rr
parents: 543
diff changeset
   167
           _1024: hwFloat = (isNegative: false; QWordValue:  4294967296 * 1024);
8cf6d27cec86 Fix warnings
unc0rr
parents: 543
diff changeset
   168
           _2048: hwFloat = (isNegative: false; QWordValue:  4294967296 * 2048);
1753
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1652
diff changeset
   169
           _4096: hwFloat = (isNegative: false; QWordValue:  4294967296 * 4096);
498
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 493
diff changeset
   170
          _10000: hwFloat = (isNegative: false; QWordValue:  4294967296 * 10000);
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   171
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   172
         cLittle: hwFloat = (isNegative: false; QWordValue:           1);
967
8be3938d73c2 Don't let jumping hedgehog to move others
unc0rr
parents: 953
diff changeset
   173
         cHHKick: hwFloat = (isNegative: false; QWordValue:    42949673);  // _0_01
611
8cf6d27cec86 Fix warnings
unc0rr
parents: 543
diff changeset
   174
{$WARNINGS ON}
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   175
{$ENDIF}
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   176
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   177
{$IFNDEF FPC}
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   178
type hwFloat = Extended;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   179
{$ENDIF}
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   180
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   181
implementation
4415
941251bad467 SinTable.inc -> uSinTable.pas
unc0rr
parents: 4374
diff changeset
   182
uses uSinTable;
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   183
3599
715a43602da8 sheepluva's inline patch, fix a crash in overlay
koda
parents: 3591
diff changeset
   184
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   185
{$IFDEF FPC}
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   186
515
270f10276d2e - Remove deprecated code
unc0rr
parents: 513
diff changeset
   187
function int2hwFloat (const i: LongInt) : hwFloat;
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   188
begin
498
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 493
diff changeset
   189
int2hwFloat.isNegative:= i < 0;
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 493
diff changeset
   190
int2hwFloat.Round:= abs(i);
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 493
diff changeset
   191
int2hwFloat.Frac:= 0
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   192
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   193
5151
cbadb9fa52fc An experiment - make bazooka AI use float instead of hwFloat - should be as accurate, but faster.
nemo
parents: 5124
diff changeset
   194
function hwFloat2Float (const i: hwFloat) : extended;
cbadb9fa52fc An experiment - make bazooka AI use float instead of hwFloat - should be as accurate, but faster.
nemo
parents: 5124
diff changeset
   195
begin
cbadb9fa52fc An experiment - make bazooka AI use float instead of hwFloat - should be as accurate, but faster.
nemo
parents: 5124
diff changeset
   196
hwFloat2Float:= i.QWordValue / $100000000;
5192
881c14f81d12 Optimize hwFloat2Float a bit
unc0rr
parents: 5151
diff changeset
   197
if i.isNegative then hwFloat2Float:= -hwFloat2Float;
5151
cbadb9fa52fc An experiment - make bazooka AI use float instead of hwFloat - should be as accurate, but faster.
nemo
parents: 5124
diff changeset
   198
end;
cbadb9fa52fc An experiment - make bazooka AI use float instead of hwFloat - should be as accurate, but faster.
nemo
parents: 5124
diff changeset
   199
515
270f10276d2e - Remove deprecated code
unc0rr
parents: 513
diff changeset
   200
operator + (const z1, z2: hwFloat) z : hwFloat;
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   201
begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   202
if z1.isNegative = z2.isNegative then
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   203
   begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   204
   z.isNegative:= z1.isNegative;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   205
   z.QWordValue:= z1.QWordValue + z2.QWordValue
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   206
   end
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   207
else
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   208
   if z1.QWordValue > z2.QWordValue then
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   209
      begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   210
      z.isNegative:= z1.isNegative;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   211
      z.QWordValue:= z1.QWordValue - z2.QWordValue
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   212
      end else
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   213
      begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   214
      z.isNegative:= z2.isNegative;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   215
      z.QWordValue:= z2.QWordValue - z1.QWordValue
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   216
      end
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   217
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   218
515
270f10276d2e - Remove deprecated code
unc0rr
parents: 513
diff changeset
   219
operator - (const z1, z2: hwFloat) z : hwFloat;
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   220
begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   221
if z1.isNegative = z2.isNegative then
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   222
   if z1.QWordValue > z2.QWordValue then
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   223
      begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   224
      z.isNegative:= z1.isNegative;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   225
      z.QWordValue:= z1.QWordValue - z2.QWordValue
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   226
      end else
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   227
      begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   228
      z.isNegative:= not z2.isNegative;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   229
      z.QWordValue:= z2.QWordValue - z1.QWordValue
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   230
      end
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   231
else begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   232
     z.isNegative:= z1.isNegative;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   233
     z.QWordValue:= z1.QWordValue + z2.QWordValue
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   234
     end
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   235
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   236
515
270f10276d2e - Remove deprecated code
unc0rr
parents: 513
diff changeset
   237
operator - (const z1: hwFloat) z : hwFloat;
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   238
begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   239
z:= z1;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   240
z.isNegative:= not z.isNegative
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   241
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   242
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   243
515
270f10276d2e - Remove deprecated code
unc0rr
parents: 513
diff changeset
   244
operator * (const z1, z2: hwFloat) z : hwFloat;
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   245
begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   246
z.isNegative:= z1.isNegative xor z2.isNegative;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   247
z.QWordValue:= QWord(z1.Round) * z2.Frac +
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   248
               QWord(z1.Frac) * z2.Round +
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   249
               ((QWord(z1.Frac) * z2.Frac) shr 32);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   250
z.Round:= z.Round + QWord(z1.Round) * z2.Round;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   251
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   252
515
270f10276d2e - Remove deprecated code
unc0rr
parents: 513
diff changeset
   253
operator * (const z1: hwFloat; const z2: LongInt) z : hwFloat;
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   254
begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   255
z.isNegative:= z1.isNegative xor (z2 < 0);
515
270f10276d2e - Remove deprecated code
unc0rr
parents: 513
diff changeset
   256
z.QWordValue:= z1.QWordValue * abs(z2)
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   257
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   258
515
270f10276d2e - Remove deprecated code
unc0rr
parents: 513
diff changeset
   259
operator / (const z1: hwFloat; z2: hwFloat) z : hwFloat;
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   260
var t: hwFloat;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   261
begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   262
z.isNegative:= z1.isNegative xor z2.isNegative;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   263
z.Round:= z1.QWordValue div z2.QWordValue;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   264
t:= z1 - z2 * z.Round;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   265
if t.QWordValue = 0 then
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   266
   z.Frac:= 0
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   267
else
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   268
   begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   269
   while ((t.QWordValue and $8000000000000000) = 0) and
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   270
         ((z2.QWordValue and $8000000000000000) = 0) do
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   271
         begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   272
         t.QWordValue:= t.QWordValue shl 1;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   273
         z2.QWordValue:= z2.QWordValue shl 1
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   274
         end;
543
465e2ec8f05f - Better randomness of placing hedgehogs on the land
unc0rr
parents: 538
diff changeset
   275
   if z2.Round > 0 then z.Frac:= (t.QWordValue) div (z2.Round)
465e2ec8f05f - Better randomness of placing hedgehogs on the land
unc0rr
parents: 538
diff changeset
   276
                   else z.Frac:= 0
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   277
   end
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   278
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   279
515
270f10276d2e - Remove deprecated code
unc0rr
parents: 513
diff changeset
   280
operator / (const z1: hwFloat; const z2: LongInt) z : hwFloat;
498
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 493
diff changeset
   281
begin
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 493
diff changeset
   282
z.isNegative:= z1.isNegative xor (z2 < 0);
515
270f10276d2e - Remove deprecated code
unc0rr
parents: 513
diff changeset
   283
z.QWordValue:= z1.QWordValue div abs(z2)
498
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 493
diff changeset
   284
end;
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 493
diff changeset
   285
515
270f10276d2e - Remove deprecated code
unc0rr
parents: 513
diff changeset
   286
operator < (const z1, z2: hwFloat) b : boolean;
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   287
begin
916
1d0022336fbb - Small optimization in hwFloat
unc0rr
parents: 883
diff changeset
   288
if z1.isNegative xor z2.isNegative then
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   289
   b:= z1.isNegative
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   290
else
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   291
   if z1.QWordValue = z2.QWordValue then
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   292
      b:= false
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   293
   else
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   294
      b:= (z1.QWordValue < z2.QWordValue) xor z1.isNegative
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   295
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   296
515
270f10276d2e - Remove deprecated code
unc0rr
parents: 513
diff changeset
   297
operator > (const z1, z2: hwFloat) b : boolean;
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   298
begin
916
1d0022336fbb - Small optimization in hwFloat
unc0rr
parents: 883
diff changeset
   299
if z1.isNegative xor z2.isNegative then
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   300
   b:= z2.isNegative
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   301
else
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   302
   if z1.QWordValue = z2.QWordValue then
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   303
      b:= false
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   304
   else
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   305
      b:= (z1.QWordValue > z2.QWordValue) xor z2.isNegative
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   306
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   307
2905
f3c79f7193a9 Engine:
smxx
parents: 2784
diff changeset
   308
function cstr(const z: hwFloat): shortstring;
f3c79f7193a9 Engine:
smxx
parents: 2784
diff changeset
   309
var tmpstr: shortstring;
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   310
begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   311
str(z.Round, cstr);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   312
if z.Frac <> 0 then
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   313
   begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   314
   str(z.Frac / $100000000:1:15, tmpstr);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   315
   delete(tmpstr, 1, 2);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   316
   cstr:= cstr + '.' + tmpstr
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   317
   end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   318
if z.isNegative then cstr:= '-' + cstr
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   319
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   320
515
270f10276d2e - Remove deprecated code
unc0rr
parents: 513
diff changeset
   321
function hwRound(const t: hwFloat): LongInt;
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   322
begin
2300
d633bc70c893 prevent overflow
nemo
parents: 1915
diff changeset
   323
if t.isNegative then hwRound:= -(t.Round and $7FFFFFFF)
d633bc70c893 prevent overflow
nemo
parents: 1915
diff changeset
   324
                else hwRound:= t.Round and $7FFFFFFF
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   325
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   326
515
270f10276d2e - Remove deprecated code
unc0rr
parents: 513
diff changeset
   327
function hwAbs(const t: hwFloat): hwFloat;
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   328
begin
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   329
hwAbs:= t;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   330
hwAbs.isNegative:= false
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   331
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   332
515
270f10276d2e - Remove deprecated code
unc0rr
parents: 513
diff changeset
   333
function hwSqr(const t: hwFloat): hwFloat;
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   334
begin
1433
4af291d5d79c Repair flame dependancy on wind
unc0rr
parents: 1124
diff changeset
   335
hwSqr.isNegative:= false;
4af291d5d79c Repair flame dependancy on wind
unc0rr
parents: 1124
diff changeset
   336
hwSqr.QWordValue:=
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2933
diff changeset
   337
      ((QWord(t.Round) * t.Round) shl 32)
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2933
diff changeset
   338
    + QWord(t.Round) * t.Frac * 2
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2933
diff changeset
   339
    + ((QWord(t.Frac) * t.Frac) shr 32);
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   340
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   341
515
270f10276d2e - Remove deprecated code
unc0rr
parents: 513
diff changeset
   342
function hwSqrt(const t: hwFloat): hwFloat;
738
d7f640e99b17 Ignore many files, created by build system
unc0rr
parents: 611
diff changeset
   343
var l, r: QWord;
d7f640e99b17 Ignore many files, created by build system
unc0rr
parents: 611
diff changeset
   344
    c: hwFloat;
357
165a040e4cfa - Fix Blow Torch and Air Attack
unc0rr
parents: 355
diff changeset
   345
begin
165a040e4cfa - Fix Blow Torch and Air Attack
unc0rr
parents: 355
diff changeset
   346
hwSqrt.isNegative:= false;
744
7a9663194767 - Remove debug
unc0rr
parents: 738
diff changeset
   347
7a9663194767 - Remove debug
unc0rr
parents: 738
diff changeset
   348
if t.Round = 0 then
7a9663194767 - Remove debug
unc0rr
parents: 738
diff changeset
   349
   begin
7a9663194767 - Remove debug
unc0rr
parents: 738
diff changeset
   350
   l:= t.QWordValue;
7a9663194767 - Remove debug
unc0rr
parents: 738
diff changeset
   351
   r:= $100000000
7a9663194767 - Remove debug
unc0rr
parents: 738
diff changeset
   352
   end else
7a9663194767 - Remove debug
unc0rr
parents: 738
diff changeset
   353
   begin
7a9663194767 - Remove debug
unc0rr
parents: 738
diff changeset
   354
   l:= $100000000;
953
237fc147950c Fix bug in hwSqrt when calculating square root of number >= 65536
unc0rr
parents: 916
diff changeset
   355
   r:= t.QWordValue div 2 + $80000000; // r:= t / 2 + 0.5
237fc147950c Fix bug in hwSqrt when calculating square root of number >= 65536
unc0rr
parents: 916
diff changeset
   356
   if r > $FFFFFFFFFFFF then r:= $FFFFFFFFFFFF
744
7a9663194767 - Remove debug
unc0rr
parents: 738
diff changeset
   357
   end;
7a9663194767 - Remove debug
unc0rr
parents: 738
diff changeset
   358
738
d7f640e99b17 Ignore many files, created by build system
unc0rr
parents: 611
diff changeset
   359
repeat
d7f640e99b17 Ignore many files, created by build system
unc0rr
parents: 611
diff changeset
   360
  c.QWordValue:= (l + r) div 2;
d7f640e99b17 Ignore many files, created by build system
unc0rr
parents: 611
diff changeset
   361
  if hwSqr(c).QWordValue > t.QWordValue then r:= c.QWordValue else l:= c.QWordValue
d7f640e99b17 Ignore many files, created by build system
unc0rr
parents: 611
diff changeset
   362
until r - l <= 1;
744
7a9663194767 - Remove debug
unc0rr
parents: 738
diff changeset
   363
738
d7f640e99b17 Ignore many files, created by build system
unc0rr
parents: 611
diff changeset
   364
hwSqrt.QWordValue:= l
357
165a040e4cfa - Fix Blow Torch and Air Attack
unc0rr
parents: 355
diff changeset
   365
end;
165a040e4cfa - Fix Blow Torch and Air Attack
unc0rr
parents: 355
diff changeset
   366
515
270f10276d2e - Remove deprecated code
unc0rr
parents: 513
diff changeset
   367
function Distance(const dx, dy: hwFloat): hwFloat;
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   368
begin
738
d7f640e99b17 Ignore many files, created by build system
unc0rr
parents: 611
diff changeset
   369
Distance:= hwSqrt(hwSqr(dx) + hwSqr(dy))
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   370
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   371
515
270f10276d2e - Remove deprecated code
unc0rr
parents: 513
diff changeset
   372
function DistanceI(const dx, dy: LongInt): hwFloat;
498
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 493
diff changeset
   373
begin
856
beecc5c5c71c - Fix braindead shotgun shot arithmetics
unc0rr
parents: 835
diff changeset
   374
DistanceI:= hwSqrt(int2hwFloat(sqr(dx) + sqr(dy)))
498
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 493
diff changeset
   375
end;
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 493
diff changeset
   376
515
270f10276d2e - Remove deprecated code
unc0rr
parents: 513
diff changeset
   377
function SignAs(const num, signum: hwFloat): hwFloat;
498
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 493
diff changeset
   378
begin
856
beecc5c5c71c - Fix braindead shotgun shot arithmetics
unc0rr
parents: 835
diff changeset
   379
SignAs.QWordValue:= num.QWordValue;
498
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 493
diff changeset
   380
SignAs.isNegative:= signum.isNegative
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 493
diff changeset
   381
end;
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 493
diff changeset
   382
4374
bcefeeabaa33 Move some stuff from uMisc to uUtils
unC0Rr
parents: 3929
diff changeset
   383
function hwSign(r: hwFloat): LongInt;
bcefeeabaa33 Move some stuff from uMisc to uUtils
unC0Rr
parents: 3929
diff changeset
   384
begin
bcefeeabaa33 Move some stuff from uMisc to uUtils
unC0Rr
parents: 3929
diff changeset
   385
// yes, we have negative zero for a reason
bcefeeabaa33 Move some stuff from uMisc to uUtils
unC0Rr
parents: 3929
diff changeset
   386
if r.isNegative then hwSign:= -1 else hwSign:= 1
bcefeeabaa33 Move some stuff from uMisc to uUtils
unC0Rr
parents: 3929
diff changeset
   387
end;
bcefeeabaa33 Move some stuff from uMisc to uUtils
unC0Rr
parents: 3929
diff changeset
   388
357
165a040e4cfa - Fix Blow Torch and Air Attack
unc0rr
parents: 355
diff changeset
   389
515
270f10276d2e - Remove deprecated code
unc0rr
parents: 513
diff changeset
   390
function AngleSin(const Angle: Longword): hwFloat;
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   391
begin
3929
9a4bbc1f67a2 Inline most of uFloat (saves ~7.5% opcount on a test game), inline a few very short candidates in uMisc, comment out some unused functions in uMisc
nemo
parents: 3599
diff changeset
   392
//TryDo((Angle >= 0) and (Angle <= 2048), 'Sin param exceeds limits', true);
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   393
AngleSin.isNegative:= false;
357
165a040e4cfa - Fix Blow Torch and Air Attack
unc0rr
parents: 355
diff changeset
   394
if Angle < 1024 then AngleSin.QWordValue:= SinTable[Angle]
165a040e4cfa - Fix Blow Torch and Air Attack
unc0rr
parents: 355
diff changeset
   395
                else AngleSin.QWordValue:= SinTable[2048 - Angle]
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   396
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   397
515
270f10276d2e - Remove deprecated code
unc0rr
parents: 513
diff changeset
   398
function AngleCos(const Angle: Longword): hwFloat;
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   399
begin
3929
9a4bbc1f67a2 Inline most of uFloat (saves ~7.5% opcount on a test game), inline a few very short candidates in uMisc, comment out some unused functions in uMisc
nemo
parents: 3599
diff changeset
   400
//TryDo((Angle >= 0) and (Angle <= 2048), 'Cos param exceeds limits', true);
357
165a040e4cfa - Fix Blow Torch and Air Attack
unc0rr
parents: 355
diff changeset
   401
AngleCos.isNegative:= Angle > 1024;
165a040e4cfa - Fix Blow Torch and Air Attack
unc0rr
parents: 355
diff changeset
   402
if Angle < 1024 then AngleCos.QWordValue:= SinTable[1024 - Angle]
165a040e4cfa - Fix Blow Torch and Air Attack
unc0rr
parents: 355
diff changeset
   403
                else AngleCos.QWordValue:= SinTable[Angle - 1024]
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   404
end;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   405
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   406
{$ENDIF}
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   407
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents:
diff changeset
   408
end.