5 function IsSolid(x
, y
: integer) : boolean;
6 function RayTraced(x1
, y1
, x2
, y2
: integer) : boolean;
7 function AreaWithBlock(block
, x
, y
, w
, h
: integer) : boolean;
8 function IntersectRects(x1
, y1
, w1
, h1
, x2
, y2
, w2
, h2
: integer) : boolean;
10 procedure SetObject(_x
, _y
, _w
, _h
, _vx
, _vy
: integer; _jmp
: boolean);
11 procedure Jump(vel
: integer);
12 procedure Step(gravity
: boolean);
14 function GetX
: integer;
15 function GetY
: integer;
16 function GetVX
: integer;
17 function GetVY
: integer;
18 function GetGCV
: integer;
19 function GetJump
: boolean;
23 uses Maps
, Vars
, Blocks
;
30 x
, y
, w
, h
, vx
, vy
, gcv
: integer;
33 function IntersectRects(x1
, y1
, w1
, h1
, x2
, y2
, w2
, h2
: integer) : boolean;
35 result
:= (x1
+ w1
> x2
) and (x1
< x2
+ w2
) and (y1
+ h1
> y2
) and (y1
< y2
+ h2
);
38 procedure SetObject(x_
, y_
, w_
, h_
, vx_
, vy_
: integer; jmp_
: boolean);
49 function MapBoundCheck(x
, y
: Integer) : Boolean;
51 result
:= (x
< 0) or (x
> MAP_W
* tileSize
);
54 function OnMapObjectCheck(x
, y
, w
, h
: Integer) : Boolean;
56 result
:= MapBoundCheck(x
, y
) or MapBoundCheck(x
+ w
, y
+ h
);
59 function IsSolid(x
, y
: integer) : boolean;
61 result
:= Blocks
.IsSolid(getMap(x
, y
));
64 function MapColl(x
, y
, w
, h
: integer) : boolean;
67 minx
, miny
, maxx
, maxy
: integer;
69 if OnMapObjectCheck(x
, y
, w
, h
) then begin
74 minx
:= x
div tileSize
;
75 miny
:= y
div tileSize
;
76 maxx
:= (x
+ w
- 1) div tileSize
;
77 maxy
:= (y
+ h
- 1) div tileSize
;
79 for j
:= miny
to maxy
do
80 for i
:= minx
to maxx
do
81 if IsSolid(i
, j
) then begin
87 function RayTraced(x1
, y1
, x2
, y2
: integer) : boolean;
89 deltax
, deltay
: integer;
90 signx
, signy
: integer;
91 error
, error2
: integer;
98 deltax
:= Abs(x2
- x1
);
99 deltay
:= Abs(y2
- y1
);
101 if x1
< x2
then signx
:= 1 else signx
:= -1;
102 if y1
< y2
then signy
:= 1 else signy
:= -1;
103 error
:= deltaX
- deltaY
;
105 while (x1
<> x2
) or (y1
<> y2
) do begin
106 if IsSolid(x1
, y1
) then exit
;
108 error2
:= error
<< 1;
109 if error2
> -deltaY
then begin
110 error
:= error
- deltaY
;
114 if error2
< deltaX
then begin
115 error
:= error
+ deltaX
;
123 function AreaWithBlock(block
, x
, y
, w
, h
: integer) : boolean;
126 minx
, miny
, maxx
, maxy
: integer;
128 minx
:= x
div tileSize
;
129 miny
:= y
div tileSize
;
130 maxx
:= (x
+ w
- 1) div tileSize
;
131 maxy
:= (y
+ h
- 1) div tileSize
;
132 for j
:= miny
to maxy
do
133 for i
:= minx
to maxx
do
134 if GetMap(i
, j
) = block
then begin
140 function Signum(x
: integer) : integer;
142 if x
> 0 then Signum
:= 1
143 else if x
< 0 then Signum
:= -1
147 procedure CalcGravity
;
155 if vy
> maxVelocity
then vy
:= maxVelocity
;
159 while (i
> 0) and not MapColl(x
, y
+ vec
, w
, h
) do begin
170 function FixVYup
: boolean;
173 (AreaWithBlock(49, x
, y
, w
, h
) or
174 AreaWithBlock(103, x
, y
, w
, h
) or
175 AreaWithBlock(108, x
, y
, w
, h
))
178 end else if (vy
> -4) and
179 (AreaWithBlock(50, x
, y
, w
, h
) or
180 AreaWithBlock(51, x
, y
, w
, h
))
191 (AreaWithBlock(49, x
, y
, w
, h
) or
192 AreaWithBlock(103, x
, y
, w
, h
))
195 end else if (vy
> 4) and
196 (AreaWithBlock(50, x
, y
, w
, h
) or
197 AreaWithBlock(51, x
, y
, w
, h
))
203 procedure Jump(vel
: integer);
205 if jmp
and FixVYup
then begin
218 while (i
> 0) and not MapColl(x
+ vec
, y
, w
, h
) do begin
222 if i
> 0 then vx
:= 0 else vx
:= vx
- vec
;
232 while (i
> 0) and not MapColl(x
, y
+ vec
, w
, h
) do begin
236 if i
> 0 then vy
:= 0 else vy
:= vy
- vec
;
239 function GetX
: integer;
244 function GetY
: integer;
249 function GetVX
: integer;
254 function GetVY
: integer;
259 function GetGCV
: integer;
264 function GetJump
: boolean;
269 procedure Step(gravity
: boolean);
272 if gravity
then begin