unit Mobs; interface const (* Типы мобов *) none = 0; zomby = 1; procedure Create(typ, x, y : integer); function FindAndHit(value, x, y, w, h, addvx, addvy : integer) : integer; (* Части главного цикла *) procedure Update; procedure UpdatePhy; procedure Draw(camx, camy : integer); (* Управление сохранениями *) procedure SaveData; procedure LoadData; procedure ResetData; (* Управление текстурами *) procedure LoadTextures(path : string); procedure FreeTextures; implementation uses phy, player, canvas, jsr75i, func; const lastType = 1; lastMob = 31; var mtype, mx, my, mvx, mvy, mpos, mhp : array [0..lastMob] of integer; mjump : array [0..lastMob] of boolean; tw, th, thp, tjump : array [none..lastType] of integer; procedure UseObject(i : integer); begin Phy.LoadObject(mx[i], my[i], tw[mtype[i]], th[mtype[i]], mvx[i], mvy[i], mjump[i]); end; procedure UpdateObject(i : integer); begin mx[i] := Phy.GetX; my[i] := Phy.GetY; mvx[i] := Phy.GetVelX; mvy[i] := Phy.GetVelY; mjump[i] := Phy.GetJmp; end; procedure InitTab(typ, w, h, hp : integer); begin assert((typ >= 0) and (typ <= lastType)); tw[typ] := w; th[typ] := h; thp[typ] := hp; end; function GetW(i : integer) : integer; begin result := tw[mtype[i]]; end; function GetH(i : integer) : integer; begin result := th[mtype[i]]; end; function GetMaxHp(i : integer) : integer; begin result := thp[mtype[i]]; end; function GetJumpHeight(i : integer) : integer; begin result := tjump[mtype[i]]; end; procedure Jump(i : integer); begin UseObject(i); Phy.JumpObj(GetJumpHeight(i)); UpdateObject(i); end; procedure Step(i, vec : integer); begin if vec < 0 then begin mvx[i] := mvx[i] + vec; mpos[i] := 0; end else if vec > 0 then begin mvx[i] := mvx[i] + vec; mpos[i] := 1; end; end; function IsSolidStep(i, vec : integer) : boolean; var x, y : integer; begin if vec > 0 then x := (mx[i] + GetW(i) / 2 + 16 / 2) / 16; else x := (mx[i] + GetW(i) / 2 - 16 / 2) / 16; y := (my[i] + GetH(i)) / 16 - 1; result := Phy.IsSolid(x, y, mvx[i], mvy[i]); end; function CollisionWithPlayer(i : integer) : boolean; begin result := CollTwoObj( mx[i], my[i], GetW(i), GetH(i), Player.GetX, Player.GetY, Player.GetW, Player.GetH ); end; (* ============= Public ============= *) procedure Create(typ, x, y : integer); var i : integer; begin Assert((typ >= 0) and (typ <= lastType)); Debug('Create mob ' + typ +' @ ' + x + 'x' + y); for i := 0 to lastMob do if mtype[i] = none then begin mtype[i] := typ; mx[i] := x; my[i] := y; mvx[i] := 0; mvy[i] := 0; mpos[i] := 0; mhp[i] := thp[typ]; mjump[i] := false; debug('Created mob is ' + i); exit; end; Debug('Mob type ' + typ + ' not created'); end; function FindAndHit(value, x, y, w, h, addvx, addvy : integer) : integer; var i : integer; begin (* for i:=0 to MAX_MOBS do if getType(i)<>M_NONE then if CollTwoObj(x, y, w, h, wx[i], wy[i], GetW(i), GetH(i)) then begin setVX(getVX(i) + addvx, i); setVX(getVY(i) + addvy, i); hit(value, i); findAndHit := i; exit; end; *) findAndHit := -1; end; procedure Update; var i : integer; begin (* TODO *) end; procedure UpdatePhy; var i : integer; begin for i := 0 to lastMob do begin UseObject(i); Phy.Calc(true); UpdateObject(i); end; end; procedure Draw(camx, camy:integer); var i : integer; begin for i := 0 to lastMob do if mtype[i] <> none then begin SetColor(0, 0, 255); FillRect(mx[i] - camx, my[i] - camy, GetW(i), GetH(i)); end; end; procedure LoadTextures(path : string); var im:image; begin // im:=ld_tex('zombie_ani.png', path, 'mobs/'); end; procedure FreeTextures;//Выгрузка текстур var i : integer; nullimg : image; begin (* TODO *) end; procedure SaveData; var i : integer; begin for i := 0 to lastMob do begin write_byte(mtype[i]); writeint(mx[i]); writeint(my[i]); writeint(mvx[i]); writeint(mvy[i]); write_byte(mpos[i]); writeint(mhp[i]); writebool(mjump[i]); end; end; procedure LoadData; var i : integer; begin for i := 0 to lastMob do begin mtype[i] := read_byte; mx[i] := readint; my[i] := readint; mvx[i] := readint; mvy[i] := readint; mpos[i] := read_byte; mhp[i] := readint; mjump[i] := readbool; end; end; procedure ResetData; var i : integer; begin for i := 0 to lastMob do begin mtype[i] := none; mx[i] := 0; my[i] := 0; mvx[i] := 0; mvy[i] := 0; mpos[i] := 0; mhp[i] := 0; mjump[i] := false; end; end; initialization InitTab(none, 0, 0, 0); InitTab(zomby, 8, 32, 10); end.