519cf9cd0a6f698634bbf94fecb90aaa142d86c5
10 procedure Create(typ
, x
, y
: integer);
11 function FindAndHit(value
, x
, y
, w
, h
, addvx
, addvy
: integer) : integer;
13 (* Части главного цикла *)
16 procedure Draw(camx
, camy
: integer);
18 (* Управление сохранениями *)
23 (* Управление текстурами *)
24 procedure LoadTextures(path
: string);
25 procedure FreeTextures
;
29 uses phy
, player
, canvas
, jsr75i
, func
, drop
, items
;
37 mtype
, mx
, my
, mvx
, mvy
, mpos
, mhp
, ma
, mb
, mc
: array [0..lastMob
] of integer;
38 mjump
: array [0..lastMob
] of boolean;
39 tw
, th
, thp
, tjump
: array [none
..lastType
] of integer;
41 zombyBody
: array [0..1] of image
;
42 zombyLegs
: array [0..1, 0..2] of image
;
43 zombyAnim
: array [0..lastZombyFrame
] of integer;
45 procedure UseObject(i
: integer);
47 Phy
.SetObject(mx
[i
], my
[i
], tw
[mtype
[i
]], th
[mtype
[i
]], mvx
[i
], mvy
[i
], mjump
[i
]);
50 procedure UpdateObject(i
: integer);
56 mjump
[i
] := Phy
.GetJump
;
59 procedure InitTab(typ
, w
, h
, hp
, jump
: integer);
61 assert((typ
>= 0) and (typ
<= lastType
));
68 function GetW(i
: integer) : integer;
70 result
:= tw
[mtype
[i
]];
73 function GetH(i
: integer) : integer;
75 result
:= th
[mtype
[i
]];
78 function GetMaxHp(i
: integer) : integer;
80 result
:= thp
[mtype
[i
]];
83 function GetJumpHeight(i
: integer) : integer;
85 result
:= tjump
[mtype
[i
]];
88 function IsSolidStep(i
, vec
: integer) : boolean;
92 if vec
< 0 then x
:= (mx
[i
] - 8) / 16;
93 else if vec
> 0 then x
:= (mx
[i
] + GetW(i
) + 4) / 16;
94 else x
:= (mx
[i
] + GetW(i
) / 2) / 16;
95 y
:= (my
[i
] + GetH(i
) - 8) / 16;
96 result
:= Phy
.IsSolid(x
, y
);
99 procedure Swim(i
, vec
: integer);
101 if Phy
.AreaWithBlock(50, mx
[i
], my
[i
], GetW(i
), GetH(i
) / 2) or
102 Phy
.AreaWithBlock(51, mx
[i
], my
[i
], GetW(i
), GetH(i
) / 2)
104 if (vec
<> 0) and IsSolidStep(i
, vec
) then mvy
[i
] := -10 else mvy
[i
] := -2;
108 procedure Step(i
, vec
: integer);
113 mvx
[i
] := mvx
[i
] + vec
;
118 mvx
[i
] := mvx
[i
] + vec
;
123 procedure Jump(i
, vec
: integer);
126 Phy
.Jump(GetJumpHeight(i
));
130 function CollisionWithPlayer(i
: integer) : boolean;
132 result
:= Phy
.IntersectRects(
133 mx
[i
], my
[i
], GetW(i
), GetH(i
),
134 Player
.GetX
, Player
.GetY
, Player
.GetW
, Player
.GetH
138 procedure Die(i
: integer);
142 x
:= mx
[i
] + GetW(i
) / 2;
143 y
:= my
[i
] + GetH(i
) / 2;
144 if mtype
[i
] = zomby
then begin
145 Drop
.Create(Items
.rottenMeat
, x
, y
, Random(3));
150 procedure Hit(i
, damage
: integer);
152 mhp
[i
] := mhp
[i
] - damage
;
153 if mhp
[i
] <= 0 then Die(i
);
156 (** ZombyThink -- мозги зомби **)
157 (** ma = Кадр анимации **)
158 (** mb = Таймер действий **)
159 (** mc = Состояние **)
161 procedure ZombyThink(i
: integer);
174 // Debug('state: ' + mc[i] + ' / anim ' + ma[i] + ' / ticks ' + mb[i]);
177 if mb
[i
] < 0 then mb
[i
] := 0;
178 if CollisionWithPlayer(i
) then Player
.BiteIt(bite
, mvx
[i
]);
180 (* Вижу игрока - сразу агрюсь и бегу за ним некоторое время *)
181 if (mpos
[i
] = 0) and (Player
.GetX
- mx
[i
] < 0) or (mpos
[i
] = 1) and (Player
.GetX
- mx
[i
] > 0) then
182 if Phy
.RayTraced(mx
[i
], my
[i
], Player
.GetX
, Player
.GetY
) then
188 if mc
[i
] = stay
then begin
191 if (mb
[i
] <= 0) and (Random(100) <= 2) then
193 mb
[i
] := walkTime
+ Random(walkTime
);
194 mc
[i
] := walkleft
+ Random(2); (* Случайный разворот *)
196 end else if mc
[i
] = walkleft
then begin
197 if IsSolidStep(i
, -speed
) then Jump(i
, -speed
);
199 ma
[i
] := (ma
[i
] + 1) mod lastZombyFrame
;
200 if mb
[i
] <= 0 then mc
[i
] := stay
;
201 end else if mc
[i
] = walkright
then begin
202 if IsSolidStep(i
, speed
) then Jump(i
, speed
);
204 ma
[i
] := (ma
[i
] + 1) mod lastZombyFrame
;
205 if mb
[i
] <= 0 then mc
[i
] := stay
;
206 end else if mc
[i
] = angry
then begin
207 if mb
[i
] <= 0 then begin
208 if Phy
.RayTraced(mx
[i
], my
[i
], Player
.GetX
, Player
.GetY
) then begin
209 (* Видижу игрока - устанавливаю время преследования *)
212 (* Игрока давно не было видно - ждём его некоторое время на месте *)
217 (* Бежим за игроком *)
218 if Player
.GetX
- mx
[i
] < 4 then begin
219 if IsSolidStep(i
, -speed
) then Jump(i
, -speed
);
221 ma
[i
] := (ma
[i
] + 1) mod lastZombyFrame
;
222 end else if Player
.GetX
- mx
[i
] > 4 then begin
223 if IsSolidStep(i
, speed
) then Jump(i
, speed
);
225 ma
[i
] := (ma
[i
] + 1) mod lastZombyFrame
;
233 procedure ZombyDraw(i
, camx
, camy
: integer);
237 frame
:= zombyAnim
[ma
[i
]];
238 DrawImage(zombyBody
[mpos
[i
]], mx
[i
] - 6 - camx
, my
[i
] - camy
);
239 DrawImage(zombyLegs
[mpos
[i
], frame
], mx
[i
] - 2 - camx
, my
[i
] + 20 - camy
);
242 (* ============= Public ============= *)
244 procedure Create(typ
, x
, y
: integer);
248 Assert((typ
>= 0) and (typ
<= lastType
));
249 Debug('Create mob ' + typ
+' @ ' + x
+ 'x' + y
);
250 for i
:= 0 to lastMob
do if mtype
[i
] = none
then
263 debug('Created mob is ' + i
);
266 Debug('Mob type ' + typ
+ ' not created');
269 function FindAndHit(damage
, x
, y
, w
, h
, addvx
, addvy
: integer) : integer;
273 for i
:= 0 to lastMob
do if mtype
[i
] <> none
then
274 if Phy
.IntersectRects(x
, y
, w
, h
, mx
[i
], my
[i
], GetW(i
), GetH(i
)) then
276 mvx
[i
] := mvx
[i
] + addvx
;
277 mvy
[i
] := mvy
[i
] + addvy
;
289 for i
:= 0 to lastMob
do if mtype
[i
] <> none
then
292 if typ
= zomby
then ZombyThink(i
);
293 if mhp
[i
] <= 0 then Die(i
);
301 for i
:= 0 to lastMob
do
309 procedure Draw(camx
, camy
:integer);
313 for i
:= 0 to lastMob
do if mtype
[i
] <> none
then
316 if typ
= zomby
then ZombyDraw(i
, camx
, camy
);
317 //SetColor(0, 0, 255);
318 //DrawRect(mx[i] - camx, my[i] - camy, GetW(i) - 1, GetH(i) - 1);
322 procedure LoadTextures(path
: string);
326 im
:= ld_tex('zombie_ani.png', path
, 'mobs/');
327 zombyBody
[0] := rotate_image_from_image(im
, 0, 0, 20, 22, 0);
328 zombyBody
[1] := rotate_image_from_image(im
, 21, 0, 20, 22, 0);
329 zombyLegs
[0, 0] := rotate_image_from_image(im
, 0, 52, 12, 12, 0);
330 zombyLegs
[0, 1] := rotate_image_from_image(im
, 13, 52, 12, 12, 0);
331 zombyLegs
[0, 2] := rotate_image_from_image(im
, 26, 52, 12, 12, 0);
332 zombyLegs
[1, 0] := rotate_image_from_image(im
, 39, 52, 12, 12, 0);
333 zombyLegs
[1, 1] := rotate_image_from_image(im
, 52, 52, 12, 12, 0);
334 zombyLegs
[1, 2] := rotate_image_from_image(im
, 65, 52, 12, 12, 0);
337 procedure FreeTextures
;
344 zombyBody
[i
] := nullimg
;
345 for j
:= 0 to 2 do zombyLegs
[i
, j
] := nullimg
;
353 for i
:= 0 to lastMob
do
355 write_byte(mtype
[i
]);
373 for i
:= 0 to lastMob
do
375 mtype
[i
] := read_byte
;
380 mpos
[i
] := read_byte
;
382 mjump
[i
] := readbool
;
393 for i
:= 0 to lastMob
do
410 InitTab(none
, 0, 0, 0, 0);
411 InitTab(zomby
, 8, 32, 10, 7);