DEADSOFTWARE

ebe716ec6a230821de4088db8ef6cbb264ee0d68
[cavecraft.git] / src / mobs.pas
1 unit Mobs;
3 interface
5 const
6 (* Типы мобов *)
7 none = 0;
8 zomby = 1;
10 procedure Create(typ, x, y : integer);
11 function FindAndHit(value, x, y, w, h, addvx, addvy : integer) : integer;
13 (* Части главного цикла *)
14 procedure Update;
15 procedure UpdatePhy;
16 procedure Draw(camx, camy : integer);
18 (* Управление сохранениями *)
19 procedure SaveData;
20 procedure LoadData;
21 procedure ResetData;
23 (* Управление текстурами *)
24 procedure LoadTextures(path : string);
25 procedure FreeTextures;
27 implementation
29 uses phy, player, canvas, jsr75i, func;
31 const
32 lastType = 1;
33 lastMob = 31;
35 var
36 mtype, mx, my, mvx, mvy, mpos, mhp : array [0..lastMob] of integer;
37 mjump : array [0..lastMob] of boolean;
38 tw, th, thp, tjump : array [none..lastType] of integer;
40 procedure UseObject(i : integer);
41 begin
42 Phy.LoadObject(mx[i], my[i], tw[mtype[i]], th[mtype[i]], mvx[i], mvy[i], mjump[i]);
43 end;
45 procedure UpdateObject(i : integer);
46 begin
47 mx[i] := Phy.GetX;
48 my[i] := Phy.GetY;
49 mvx[i] := Phy.GetVelX;
50 mvy[i] := Phy.GetVelY;
51 mjump[i] := Phy.GetJmp;
52 end;
54 procedure InitTab(typ, w, h, hp : integer);
55 begin
56 assert((typ >= 0) and (typ <= lastType));
57 tw[typ] := w;
58 th[typ] := h;
59 thp[typ] := hp;
60 end;
62 function GetW(i : integer) : integer;
63 begin
64 result := tw[mtype[i]];
65 end;
67 function GetH(i : integer) : integer;
68 begin
69 result := th[mtype[i]];
70 end;
72 function GetMaxHp(i : integer) : integer;
73 begin
74 result := thp[mtype[i]];
75 end;
77 function GetJumpHeight(i : integer) : integer;
78 begin
79 result := tjump[mtype[i]];
80 end;
82 procedure Jump(i : integer);
83 begin
84 UseObject(i);
85 Phy.JumpObj(GetJumpHeight(i));
86 UpdateObject(i);
87 end;
89 procedure Step(i, vec : integer);
90 begin
91 if vec < 0 then
92 begin
93 mvx[i] := mvx[i] + vec;
94 mpos[i] := 0;
95 end
96 else if vec > 0 then
97 begin
98 mvx[i] := mvx[i] + vec;
99 mpos[i] := 1;
100 end;
101 end;
103 function IsSolidStep(i, vec : integer) : boolean;
104 var
105 x, y : integer;
106 begin
107 if vec > 0 then x := (mx[i] + GetW(i) / 2 + 16 / 2) / 16;
108 else x := (mx[i] + GetW(i) / 2 - 16 / 2) / 16;
109 y := (my[i] + GetH(i)) / 16 - 1;
110 result := Phy.IsSolid(x, y, mvx[i], mvy[i]);
111 end;
113 function CollisionWithPlayer(i : integer) : boolean;
114 begin
115 result := CollTwoObj(
116 mx[i], my[i], GetW(i), GetH(i),
117 Player.GetX, Player.GetY, Player.GetW, Player.GetH
118 );
119 end;
121 (* ============= Public ============= *)
123 procedure Create(typ, x, y : integer);
124 var
125 i : integer;
126 begin
127 Assert((typ >= 0) and (typ <= lastType));
128 Debug('Create mob ' + typ +' @ ' + x + 'x' + y);
129 for i := 0 to lastMob do if mtype[i] = none then
130 begin
131 mtype[i] := typ;
132 mx[i] := x;
133 my[i] := y;
134 mvx[i] := 0;
135 mvy[i] := 0;
136 mpos[i] := 0;
137 mhp[i] := thp[typ];
138 mjump[i] := false;
139 debug('Created mob is ' + i);
140 exit;
141 end;
142 Debug('Mob type ' + typ + ' not created');
143 end;
145 function FindAndHit(value, x, y, w, h, addvx, addvy : integer) : integer;
146 var
147 i : integer;
148 begin
149 (*
150 for i:=0 to MAX_MOBS do
151 if getType(i)<>M_NONE then
152 if CollTwoObj(x, y, w, h, wx[i], wy[i], GetW(i), GetH(i)) then
153 begin
154 setVX(getVX(i) + addvx, i);
155 setVX(getVY(i) + addvy, i);
156 hit(value, i);
157 findAndHit := i;
158 exit;
159 end;
160 *)
161 findAndHit := -1;
162 end;
164 procedure Update;
165 var
166 i : integer;
167 begin
168 (* TODO *)
169 end;
171 procedure UpdatePhy;
172 var
173 i : integer;
174 begin
175 for i := 0 to lastMob do
176 begin
177 UseObject(i);
178 Phy.Calc(true);
179 UpdateObject(i);
180 end;
181 end;
183 procedure Draw(camx, camy:integer);
184 var
185 i : integer;
186 begin
187 for i := 0 to lastMob do if mtype[i] <> none then
188 begin
189 SetColor(0, 0, 255);
190 FillRect(mx[i] - camx, my[i] - camy, GetW(i), GetH(i));
191 end;
192 end;
194 procedure LoadTextures(path : string);
195 var
196 im:image;
197 begin
198 // im:=ld_tex('zombie_ani.png', path, 'mobs/');
199 end;
201 procedure FreeTextures;//Выгрузка текстур
202 var
203 i : integer;
204 nullimg : image;
205 begin
206 (* TODO *)
207 end;
209 procedure SaveData;
210 var
211 i : integer;
212 begin
213 for i := 0 to lastMob do
214 begin
215 write_byte(mtype[i]);
216 writeint(mx[i]);
217 writeint(my[i]);
218 writeint(mvx[i]);
219 writeint(mvy[i]);
220 write_byte(mpos[i]);
221 writeint(mhp[i]);
222 writebool(mjump[i]);
223 end;
224 end;
226 procedure LoadData;
227 var
228 i : integer;
229 begin
230 for i := 0 to lastMob do
231 begin
232 mtype[i] := read_byte;
233 mx[i] := readint;
234 my[i] := readint;
235 mvx[i] := readint;
236 mvy[i] := readint;
237 mpos[i] := read_byte;
238 mhp[i] := readint;
239 mjump[i] := readbool;
240 end;
241 end;
243 procedure ResetData;
244 var
245 i : integer;
246 begin
247 for i := 0 to lastMob do
248 begin
249 mtype[i] := none;
250 mx[i] := 0;
251 my[i] := 0;
252 mvx[i] := 0;
253 mvy[i] := 0;
254 mpos[i] := 0;
255 mhp[i] := 0;
256 mjump[i] := false;
257 end;
258 end;
260 initialization
261 InitTab(none, 0, 0, 0);
262 InitTab(zomby, 8, 32, 10);
263 end.