author | sheepluva |
Sun, 29 Apr 2012 14:00:35 +0200 | |
changeset 6953 | 4c2dd25630a7 |
parent 6879 | f44042ba755c |
child 7042 | de20086a6bcc |
permissions | -rw-r--r-- |
351 | 1 |
(* |
1066 | 2 |
* Hedgewars, a free turn based strategy game |
6700 | 3 |
* Copyright (c) 2004-2012 Andrey Korotaev <unC0Rr@gmail.com> |
351 | 4 |
* |
5 |
* This program is free software; you can redistribute it and/or modify |
|
6 |
* it under the terms of the GNU General Public License as published by |
|
7 |
* the Free Software Foundation; version 2 of the License |
|
8 |
* |
|
9 |
* This program is distributed in the hope that it will be useful, |
|
10 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 |
* GNU General Public License for more details. |
|
13 |
* |
|
14 |
* You should have received a copy of the GNU General Public License |
|
15 |
* along with this program; if not, write to the Free Software |
|
16 |
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|
17 |
*) |
|
18 |
||
2630 | 19 |
{$INCLUDE "options.inc"} |
20 |
||
351 | 21 |
unit uFloat; |
5122 | 22 |
(* |
23 |
* This unit provides a custom data type, hwFloat. |
|
24 |
* |
|
25 |
* hwFloat represents a floating point number - the value and operations |
|
26 |
* of this numbers are independent from the hardware architecture |
|
27 |
* the game runs on. |
|
28 |
* |
|
29 |
* This is important for calculations that affect the course of the game |
|
30 |
* and would lead to different results if based on a hardware dependent |
|
31 |
* data type. |
|
32 |
* |
|
33 |
* Note: Not all comparisons are implemented. |
|
34 |
* |
|
35 |
* Note: Below you'll find a list of hwFloat constants: |
|
36 |
* E.g. _1 is an hwFloat with value 1.0, and -_0_9 is -0.9 |
|
5124 | 37 |
* Use and extend the list if needed, rather than using int2hwFloat() |
38 |
* with integer constants. |
|
5122 | 39 |
*) |
351 | 40 |
interface |
41 |
||
42 |
{$IFDEF FPC} |
|
2599 | 43 |
{$IFDEF ENDIAN_LITTLE} |
351 | 44 |
type hwFloat = record |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
45 |
isNegative: boolean; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
46 |
case byte of |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
47 |
0: (Frac, Round: Longword); |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
48 |
1: (QWordValue : QWord); |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
49 |
end; |
2599 | 50 |
{$ELSE} |
351 | 51 |
type hwFloat = record |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
52 |
isNegative: boolean; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
53 |
case byte of |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
54 |
0: (Round, Frac: Longword); |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
55 |
1: (QWordValue : QWord); |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
56 |
end; |
2599 | 57 |
{$ENDIF} |
351 | 58 |
|
5122 | 59 |
// Returns an hwFloat that represents the value of integer parameter i |
3599 | 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 | 62 |
|
5122 | 63 |
// The implemented operators |
64 |
||
6415 | 65 |
operator = (const z1, z2: hwFloat) z : boolean; inline; |
3599 | 66 |
operator + (const z1, z2: hwFloat) z : hwFloat; inline; |
67 |
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
|
68 |
operator - (const z1: hwFloat) z : hwFloat; inline; |
351 | 69 |
|
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
|
70 |
operator * (const z1, z2: hwFloat) z : hwFloat; inline; |
3599 | 71 |
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
|
72 |
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
|
73 |
operator / (const z1: hwFloat; const z2: LongInt) z : hwFloat; inline; |
351 | 74 |
|
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
|
75 |
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
|
76 |
operator > (const z1, z2: hwFloat) b : boolean; inline; |
351 | 77 |
|
5122 | 78 |
|
79 |
// Various functions for hwFloat (some are inlined in the resulting code for better performance) |
|
80 |
||
81 |
function cstr(const z: hwFloat): shortstring; // Returns a shortstring representations of the hwFloat. |
|
82 |
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) |
|
83 |
function hwAbs(const t: hwFloat): hwFloat; inline; // Returns the value of t with positive sign. |
|
84 |
function hwSqr(const t: hwFloat): hwFloat; inline; // Returns the square value of parameter t. |
|
6785 | 85 |
function hwPow(const t: hwFloat; p: LongWord): hwFloat; inline; // Returns the power of the value |
5122 | 86 |
function hwSqrt(const t: hwFloat): hwFloat; inline; // Returns the the positive square root of parameter t. |
87 |
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. |
|
88 |
function DistanceI(const dx, dy: LongInt): hwFloat; // Same as above for integer parameters. |
|
515 | 89 |
function AngleSin(const Angle: Longword): hwFloat; |
90 |
function AngleCos(const Angle: Longword): hwFloat; |
|
5122 | 91 |
function SignAs(const num, signum: hwFloat): hwFloat; inline; // Returns an hwFloat with the value of parameter num and the sign of signum. |
92 |
function hwSign(r: hwFloat): LongInt; inline; // Returns an integer with value 1 and sign of parameter r. |
|
6879 | 93 |
function hwSignf(r: real): LongInt; inline; // Returns an integer with value 1 and sign of parameter r. |
5599
2e4b90f33a83
aiming fixed, inverted cursor on ammo menu, added equal and isZero function to uFloat, changed the way ammo menu opens, you must now click on the hog rather than anywhere on the screen
Xeli
parents:
5319
diff
changeset
|
94 |
function isZero(const z: hwFloat): boolean; inline; |
2599 | 95 |
{$IFDEF FPC} |
538 | 96 |
{$J-} |
2599 | 97 |
{$ENDIF} |
611 | 98 |
{$WARNINGS OFF} |
5122 | 99 |
|
100 |
||
101 |
// some hwFloat constants |
|
102 |
||
351 | 103 |
const _1div1024: hwFloat = (isNegative: false; QWordValue: 4194304); |
104 |
_1div10000: hwFloat = (isNegative: false; QWordValue: 429496); |
|
105 |
_1div50000: hwFloat = (isNegative: false; QWordValue: 85899); |
|
106 |
_1div100000: hwFloat = (isNegative: false; QWordValue: 42950); |
|
107 |
_1div3: hwFloat = (isNegative: false; QWordValue: 1431655766); |
|
108 |
hwPi: hwFloat = (isNegative: false; QWordValue: 13493037704); |
|
109 |
_0_000004: hwFloat = (isNegative: false; QWordValue: 17179); |
|
3591 | 110 |
_0_000064: hwFloat = (isNegative: false; QWordValue: 274878); |
351 | 111 |
_0_0002: hwFloat = (isNegative: false; QWordValue: 858993); |
1586 | 112 |
_0_0005: hwFloat = (isNegative: false; QWordValue: 2147484); |
351 | 113 |
_0_001: hwFloat = (isNegative: false; QWordValue: 4294967); |
114 |
_0_003: hwFloat = (isNegative: false; QWordValue: 12884902); |
|
115 |
_0_004: hwFloat = (isNegative: false; QWordValue: 17179869); |
|
116 |
_0_005: hwFloat = (isNegative: false; QWordValue: 21474836); |
|
3428 | 117 |
_0_008: hwFloat = (isNegative: false; QWordValue: 34359738); |
351 | 118 |
_0_01: hwFloat = (isNegative: false; QWordValue: 42949673); |
119 |
_0_02: hwFloat = (isNegative: false; QWordValue: 85899345); |
|
120 |
_0_03: hwFloat = (isNegative: false; QWordValue: 128849018); |
|
6295
5b2b304a91ec
Due to the small values and friction, halve the step in low gravity, instead of the value
nemo
parents:
5843
diff
changeset
|
121 |
_0_07: hwFloat = (isNegative: false; QWordValue: 300647710); |
351 | 122 |
_0_08: hwFloat = (isNegative: false; QWordValue: 343597383); |
365 | 123 |
_0_1: hwFloat = (isNegative: false; QWordValue: 429496730); |
351 | 124 |
_0_15: hwFloat = (isNegative: false; QWordValue: 644245094); |
125 |
_0_2: hwFloat = (isNegative: false; QWordValue: 858993459); |
|
126 |
_0_25: hwFloat = (isNegative: false; QWordValue: 1073741824); |
|
127 |
_0_3: hwFloat = (isNegative: false; QWordValue: 1288490189); |
|
128 |
_0_35: hwFloat = (isNegative: false; QWordValue: 1503238553); |
|
2784 | 129 |
_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
|
130 |
_0_39: hwFloat = (isNegative: false; QWordValue: 1675037245); |
351 | 131 |
_0_4: hwFloat = (isNegative: false; QWordValue: 1717986918); |
132 |
_0_45: hwFloat = (isNegative: false; QWordValue: 1932735283); |
|
133 |
_0_5: hwFloat = (isNegative: false; QWordValue: 2147483648); |
|
134 |
_0_55: hwFloat = (isNegative: false; QWordValue: 2362232012); |
|
135 |
_0_6: hwFloat = (isNegative: false; QWordValue: 2576980377); |
|
3583 | 136 |
_0_64: hwFloat = (isNegative: false; QWordValue: 2748779064); |
358 | 137 |
_0_7: hwFloat = (isNegative: false; QWordValue: 3006477107); |
351 | 138 |
_0_8: hwFloat = (isNegative: false; QWordValue: 3435973837); |
139 |
_0_84: hwFloat = (isNegative: false; QWordValue: 3607772528); |
|
140 |
_0_87: hwFloat = (isNegative: false; QWordValue: 3736621547); |
|
141 |
_0_9: hwFloat = (isNegative: false; QWordValue: 3865470566); |
|
142 |
_0_93: hwFloat = (isNegative: false; QWordValue: 3994319585); |
|
143 |
_0_96: hwFloat = (isNegative: false; QWordValue: 4123168604); |
|
144 |
_0_995: hwFloat = (isNegative: false; QWordValue: 4273492459); |
|
145 |
_0_999: hwFloat = (isNegative: false; QWordValue: 4290672328); |
|
498 | 146 |
_0: hwFloat = (isNegative: false; QWordValue: 0); |
147 |
_1: hwFloat = (isNegative: false; QWordValue: 4294967296); |
|
513
69e06d710d46
Moving hedgehog could get another hedgehog moving forward
unc0rr
parents:
498
diff
changeset
|
148 |
_1_5: hwFloat = (isNegative: false; QWordValue: 4294967296 * 3 div 2); |
3584 | 149 |
_1_9: hwFloat = (isNegative: false; QWordValue: 8160437862); |
498 | 150 |
_2: hwFloat = (isNegative: false; QWordValue: 4294967296 * 2); |
151 |
_3: hwFloat = (isNegative: false; QWordValue: 4294967296 * 3); |
|
6785 | 152 |
_PI: hwFloat = (isNegative: false; QWordValue: 13493037704); |
498 | 153 |
_4: hwFloat = (isNegative: false; QWordValue: 4294967296 * 4); |
6498 | 154 |
_4_5: hwFloat = (isNegative: false; QWordValue: 4294967296 * 9 div 2); |
498 | 155 |
_5: hwFloat = (isNegative: false; QWordValue: 4294967296 * 5); |
156 |
_6: hwFloat = (isNegative: false; QWordValue: 4294967296 * 6); |
|
157 |
_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
|
158 |
_12: hwFloat = (isNegative: false; QWordValue: 4294967296 * 12); |
498 | 159 |
_16: hwFloat = (isNegative: false; QWordValue: 4294967296 * 16); |
160 |
_19: hwFloat = (isNegative: false; QWordValue: 4294967296 * 19); |
|
161 |
_20: hwFloat = (isNegative: false; QWordValue: 4294967296 * 20); |
|
162 |
_25: hwFloat = (isNegative: false; QWordValue: 4294967296 * 25); |
|
163 |
_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
|
164 |
_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
|
165 |
_50: hwFloat = (isNegative: false; QWordValue: 4294967296 * 50); |
2933 | 166 |
_70: hwFloat = (isNegative: false; QWordValue: 4294967296 * 70); |
5599
2e4b90f33a83
aiming fixed, inverted cursor on ammo menu, added equal and isZero function to uFloat, changed the way ammo menu opens, you must now click on the hog rather than anywhere on the screen
Xeli
parents:
5319
diff
changeset
|
167 |
_90: hwFloat = (isNegative: false; QWordValue: 4294967296 * 90); |
498 | 168 |
_128: hwFloat = (isNegative: false; QWordValue: 4294967296 * 128); |
5599
2e4b90f33a83
aiming fixed, inverted cursor on ammo menu, added equal and isZero function to uFloat, changed the way ammo menu opens, you must now click on the hog rather than anywhere on the screen
Xeli
parents:
5319
diff
changeset
|
169 |
_180: hwFloat = (isNegative: false; QWordValue: 4294967296 * 180); |
5319
51d8e4747876
bounce. tweak of values, remove friction modifier, move to weapon, to match timer behaviour
nemo
parents:
5192
diff
changeset
|
170 |
_250: hwFloat = (isNegative: false; QWordValue: 4294967296 * 250); |
1915 | 171 |
_256: hwFloat = (isNegative: false; QWordValue: 4294967296 * 256); |
1124 | 172 |
_300: hwFloat = (isNegative: false; QWordValue: 4294967296 * 300); |
5599
2e4b90f33a83
aiming fixed, inverted cursor on ammo menu, added equal and isZero function to uFloat, changed the way ammo menu opens, you must now click on the hog rather than anywhere on the screen
Xeli
parents:
5319
diff
changeset
|
173 |
_360: hwFloat = (isNegative: false; QWordValue: 4294967296 * 360); |
498 | 174 |
_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
|
175 |
_1000: hwFloat = (isNegative: false; QWordValue: 4294967296 * 1000); |
611 | 176 |
_1024: hwFloat = (isNegative: false; QWordValue: 4294967296 * 1024); |
177 |
_2048: hwFloat = (isNegative: false; QWordValue: 4294967296 * 2048); |
|
1753 | 178 |
_4096: hwFloat = (isNegative: false; QWordValue: 4294967296 * 4096); |
498 | 179 |
_10000: hwFloat = (isNegative: false; QWordValue: 4294967296 * 10000); |
351 | 180 |
|
181 |
cLittle: hwFloat = (isNegative: false; QWordValue: 1); |
|
967 | 182 |
cHHKick: hwFloat = (isNegative: false; QWordValue: 42949673); // _0_01 |
611 | 183 |
{$WARNINGS ON} |
351 | 184 |
{$ENDIF} |
185 |
||
186 |
{$IFNDEF FPC} |
|
187 |
type hwFloat = Extended; |
|
188 |
{$ENDIF} |
|
189 |
||
190 |
implementation |
|
4415 | 191 |
uses uSinTable; |
351 | 192 |
|
3599 | 193 |
|
351 | 194 |
{$IFDEF FPC} |
195 |
||
515 | 196 |
function int2hwFloat (const i: LongInt) : hwFloat; |
351 | 197 |
begin |
498 | 198 |
int2hwFloat.isNegative:= i < 0; |
199 |
int2hwFloat.Round:= abs(i); |
|
200 |
int2hwFloat.Frac:= 0 |
|
351 | 201 |
end; |
202 |
||
5151
cbadb9fa52fc
An experiment - make bazooka AI use float instead of hwFloat - should be as accurate, but faster.
nemo
parents:
5124
diff
changeset
|
203 |
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
|
204 |
begin |
cbadb9fa52fc
An experiment - make bazooka AI use float instead of hwFloat - should be as accurate, but faster.
nemo
parents:
5124
diff
changeset
|
205 |
hwFloat2Float:= i.QWordValue / $100000000; |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
206 |
if i.isNegative then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
207 |
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
|
208 |
end; |
cbadb9fa52fc
An experiment - make bazooka AI use float instead of hwFloat - should be as accurate, but faster.
nemo
parents:
5124
diff
changeset
|
209 |
|
6415 | 210 |
operator = (const z1, z2: hwFloat) z : boolean; inline; |
5599
2e4b90f33a83
aiming fixed, inverted cursor on ammo menu, added equal and isZero function to uFloat, changed the way ammo menu opens, you must now click on the hog rather than anywhere on the screen
Xeli
parents:
5319
diff
changeset
|
211 |
begin |
5665 | 212 |
z:= (z1.isNegative = z2.isNegative) and (z1.QWordValue = z2.QWordValue); |
5599
2e4b90f33a83
aiming fixed, inverted cursor on ammo menu, added equal and isZero function to uFloat, changed the way ammo menu opens, you must now click on the hog rather than anywhere on the screen
Xeli
parents:
5319
diff
changeset
|
213 |
end; |
2e4b90f33a83
aiming fixed, inverted cursor on ammo menu, added equal and isZero function to uFloat, changed the way ammo menu opens, you must now click on the hog rather than anywhere on the screen
Xeli
parents:
5319
diff
changeset
|
214 |
|
2e4b90f33a83
aiming fixed, inverted cursor on ammo menu, added equal and isZero function to uFloat, changed the way ammo menu opens, you must now click on the hog rather than anywhere on the screen
Xeli
parents:
5319
diff
changeset
|
215 |
|
515 | 216 |
operator + (const z1, z2: hwFloat) z : hwFloat; |
351 | 217 |
begin |
218 |
if z1.isNegative = z2.isNegative then |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
219 |
begin |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
220 |
z.isNegative:= z1.isNegative; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
221 |
z.QWordValue:= z1.QWordValue + z2.QWordValue |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
222 |
end |
351 | 223 |
else |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
224 |
if z1.QWordValue > z2.QWordValue then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
225 |
begin |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
226 |
z.isNegative:= z1.isNegative; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
227 |
z.QWordValue:= z1.QWordValue - z2.QWordValue |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
228 |
end |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
229 |
else |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
230 |
begin |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
231 |
z.isNegative:= z2.isNegative; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
232 |
z.QWordValue:= z2.QWordValue - z1.QWordValue |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
233 |
end |
351 | 234 |
end; |
235 |
||
515 | 236 |
operator - (const z1, z2: hwFloat) z : hwFloat; |
351 | 237 |
begin |
238 |
if z1.isNegative = z2.isNegative then |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
239 |
if z1.QWordValue > z2.QWordValue then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
240 |
begin |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
241 |
z.isNegative:= z1.isNegative; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
242 |
z.QWordValue:= z1.QWordValue - z2.QWordValue |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
243 |
end |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
244 |
else |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
245 |
begin |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
246 |
z.isNegative:= not z2.isNegative; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
247 |
z.QWordValue:= z2.QWordValue - z1.QWordValue |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
248 |
end |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
249 |
else |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
250 |
begin |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
251 |
z.isNegative:= z1.isNegative; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
252 |
z.QWordValue:= z1.QWordValue + z2.QWordValue |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
253 |
end |
351 | 254 |
end; |
255 |
||
515 | 256 |
operator - (const z1: hwFloat) z : hwFloat; |
351 | 257 |
begin |
258 |
z:= z1; |
|
259 |
z.isNegative:= not z.isNegative |
|
260 |
end; |
|
261 |
||
262 |
||
515 | 263 |
operator * (const z1, z2: hwFloat) z : hwFloat; |
351 | 264 |
begin |
265 |
z.isNegative:= z1.isNegative xor z2.isNegative; |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
266 |
z.QWordValue:= QWord(z1.Round) * z2.Frac + QWord(z1.Frac) * z2.Round + ((QWord(z1.Frac) * z2.Frac) shr 32); |
351 | 267 |
z.Round:= z.Round + QWord(z1.Round) * z2.Round; |
268 |
end; |
|
269 |
||
515 | 270 |
operator * (const z1: hwFloat; const z2: LongInt) z : hwFloat; |
351 | 271 |
begin |
272 |
z.isNegative:= z1.isNegative xor (z2 < 0); |
|
515 | 273 |
z.QWordValue:= z1.QWordValue * abs(z2) |
351 | 274 |
end; |
275 |
||
515 | 276 |
operator / (const z1: hwFloat; z2: hwFloat) z : hwFloat; |
351 | 277 |
var t: hwFloat; |
278 |
begin |
|
279 |
z.isNegative:= z1.isNegative xor z2.isNegative; |
|
280 |
z.Round:= z1.QWordValue div z2.QWordValue; |
|
281 |
t:= z1 - z2 * z.Round; |
|
282 |
if t.QWordValue = 0 then |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
283 |
z.Frac:= 0 |
351 | 284 |
else |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
285 |
begin |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
286 |
while ((t.QWordValue and $8000000000000000) = 0) and ((z2.QWordValue and $8000000000000000) = 0) do |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
287 |
begin |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
288 |
t.QWordValue:= t.QWordValue shl 1; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
289 |
z2.QWordValue:= z2.QWordValue shl 1 |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
290 |
end; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
291 |
if z2.Round > 0 then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
292 |
z.Frac:= (t.QWordValue) div (z2.Round) |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
293 |
else |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
294 |
z.Frac:= 0 |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
295 |
end |
351 | 296 |
end; |
297 |
||
515 | 298 |
operator / (const z1: hwFloat; const z2: LongInt) z : hwFloat; |
498 | 299 |
begin |
300 |
z.isNegative:= z1.isNegative xor (z2 < 0); |
|
515 | 301 |
z.QWordValue:= z1.QWordValue div abs(z2) |
498 | 302 |
end; |
303 |
||
515 | 304 |
operator < (const z1, z2: hwFloat) b : boolean; |
351 | 305 |
begin |
916 | 306 |
if z1.isNegative xor z2.isNegative then |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
307 |
b:= z1.isNegative |
351 | 308 |
else |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
309 |
if z1.QWordValue = z2.QWordValue then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
310 |
b:= false |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
311 |
else |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
312 |
b:= (z1.QWordValue < z2.QWordValue) xor z1.isNegative |
351 | 313 |
end; |
314 |
||
515 | 315 |
operator > (const z1, z2: hwFloat) b : boolean; |
351 | 316 |
begin |
916 | 317 |
if z1.isNegative xor z2.isNegative then |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
318 |
b:= z2.isNegative |
351 | 319 |
else |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
320 |
if z1.QWordValue = z2.QWordValue then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
321 |
b:= false |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
322 |
else |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
323 |
b:= (z1.QWordValue > z2.QWordValue) xor z2.isNegative |
351 | 324 |
end; |
325 |
||
2905 | 326 |
function cstr(const z: hwFloat): shortstring; |
327 |
var tmpstr: shortstring; |
|
351 | 328 |
begin |
329 |
str(z.Round, cstr); |
|
330 |
if z.Frac <> 0 then |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
331 |
begin |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
332 |
str(z.Frac / $100000000, tmpstr); |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
333 |
delete(tmpstr, 1, 2); |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
334 |
cstr:= cstr + '.' + copy(tmpstr, 1, 10) |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
335 |
end; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
336 |
if z.isNegative then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
337 |
cstr:= '-' + cstr |
351 | 338 |
end; |
339 |
||
515 | 340 |
function hwRound(const t: hwFloat): LongInt; |
351 | 341 |
begin |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
342 |
if t.isNegative then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
343 |
hwRound:= -(t.Round and $7FFFFFFF) |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
344 |
else |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
345 |
hwRound:= t.Round and $7FFFFFFF |
351 | 346 |
end; |
347 |
||
515 | 348 |
function hwAbs(const t: hwFloat): hwFloat; |
351 | 349 |
begin |
350 |
hwAbs:= t; |
|
351 |
hwAbs.isNegative:= false |
|
352 |
end; |
|
353 |
||
515 | 354 |
function hwSqr(const t: hwFloat): hwFloat; |
351 | 355 |
begin |
1433 | 356 |
hwSqr.isNegative:= false; |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
357 |
hwSqr.QWordValue:= ((QWord(t.Round) * t.Round) shl 32) + QWord(t.Round) * t.Frac * 2 + ((QWord(t.Frac) * t.Frac) shr 32); |
351 | 358 |
end; |
359 |
||
6785 | 360 |
function hwPow(const t: hwFloat;p: LongWord): hwFloat; |
361 |
begin |
|
362 |
hwPow:= t; |
|
363 |
if p mod 2 = 0 then hwPow.isNegative:= t.isNegative; |
|
364 |
||
365 |
while p > 0 do |
|
366 |
begin |
|
367 |
hwPow.QWordValue:= QWord(hwPow.Round) * t.Frac + QWord(hwPow.Frac) * t.Round + ((QWord(hwPow.Frac) * t.Frac) shr 32); |
|
368 |
dec(p) |
|
369 |
end |
|
370 |
end; |
|
371 |
||
515 | 372 |
function hwSqrt(const t: hwFloat): hwFloat; |
738 | 373 |
var l, r: QWord; |
374 |
c: hwFloat; |
|
357 | 375 |
begin |
376 |
hwSqrt.isNegative:= false; |
|
744 | 377 |
|
378 |
if t.Round = 0 then |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
379 |
begin |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
380 |
l:= t.QWordValue; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
381 |
r:= $100000000 |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
382 |
end |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
383 |
else |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
384 |
begin |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
385 |
l:= $100000000; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
386 |
r:= t.QWordValue div 2 + $80000000; // r:= t / 2 + 0.5 |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
387 |
if r > $FFFFFFFFFFFF then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
388 |
r:= $FFFFFFFFFFFF |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
389 |
end; |
744 | 390 |
|
738 | 391 |
repeat |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
392 |
c.QWordValue:= (l + r) div 2; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
393 |
if hwSqr(c).QWordValue > t.QWordValue then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
394 |
r:= c.QWordValue |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
395 |
else |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
396 |
l:= c.QWordValue |
738 | 397 |
until r - l <= 1; |
744 | 398 |
|
738 | 399 |
hwSqrt.QWordValue:= l |
357 | 400 |
end; |
401 |
||
515 | 402 |
function Distance(const dx, dy: hwFloat): hwFloat; |
351 | 403 |
begin |
738 | 404 |
Distance:= hwSqrt(hwSqr(dx) + hwSqr(dy)) |
351 | 405 |
end; |
406 |
||
515 | 407 |
function DistanceI(const dx, dy: LongInt): hwFloat; |
498 | 408 |
begin |
856 | 409 |
DistanceI:= hwSqrt(int2hwFloat(sqr(dx) + sqr(dy))) |
498 | 410 |
end; |
411 |
||
515 | 412 |
function SignAs(const num, signum: hwFloat): hwFloat; |
498 | 413 |
begin |
856 | 414 |
SignAs.QWordValue:= num.QWordValue; |
498 | 415 |
SignAs.isNegative:= signum.isNegative |
416 |
end; |
|
417 |
||
4374 | 418 |
function hwSign(r: hwFloat): LongInt; |
419 |
begin |
|
420 |
// yes, we have negative zero for a reason |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
421 |
if r.isNegative then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
422 |
hwSign:= -1 |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
423 |
else |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
424 |
hwSign:= 1 |
4374 | 425 |
end; |
426 |
||
6879 | 427 |
function hwSignf(r: real): LongInt; |
6775 | 428 |
begin |
429 |
if r < 0 then |
|
6879 | 430 |
hwSignf:= -1 |
6775 | 431 |
else |
6879 | 432 |
hwSignf:= 1 |
6775 | 433 |
end; |
434 |
||
357 | 435 |
|
515 | 436 |
function AngleSin(const Angle: Longword): hwFloat; |
351 | 437 |
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
|
438 |
//TryDo((Angle >= 0) and (Angle <= 2048), 'Sin param exceeds limits', true); |
351 | 439 |
AngleSin.isNegative:= false; |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
440 |
if Angle < 1024 then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
441 |
AngleSin.QWordValue:= SinTable[Angle] |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
442 |
else |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
443 |
AngleSin.QWordValue:= SinTable[2048 - Angle] |
351 | 444 |
end; |
445 |
||
515 | 446 |
function AngleCos(const Angle: Longword): hwFloat; |
351 | 447 |
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
|
448 |
//TryDo((Angle >= 0) and (Angle <= 2048), 'Cos param exceeds limits', true); |
357 | 449 |
AngleCos.isNegative:= Angle > 1024; |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
450 |
if Angle < 1024 then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
451 |
AngleCos.QWordValue:= SinTable[1024 - Angle] |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
452 |
else |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
453 |
AngleCos.QWordValue:= SinTable[Angle - 1024] |
351 | 454 |
end; |
455 |
||
5599
2e4b90f33a83
aiming fixed, inverted cursor on ammo menu, added equal and isZero function to uFloat, changed the way ammo menu opens, you must now click on the hog rather than anywhere on the screen
Xeli
parents:
5319
diff
changeset
|
456 |
function isZero(const z: hwFloat): boolean; inline; |
2e4b90f33a83
aiming fixed, inverted cursor on ammo menu, added equal and isZero function to uFloat, changed the way ammo menu opens, you must now click on the hog rather than anywhere on the screen
Xeli
parents:
5319
diff
changeset
|
457 |
begin |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6498
diff
changeset
|
458 |
isZero := z.QWordValue = 0; |
5599
2e4b90f33a83
aiming fixed, inverted cursor on ammo menu, added equal and isZero function to uFloat, changed the way ammo menu opens, you must now click on the hog rather than anywhere on the screen
Xeli
parents:
5319
diff
changeset
|
459 |
end; |
351 | 460 |
{$ENDIF} |
461 |
||
462 |
end. |