X-Git-Url: https://deadsoftware.ru/gitweb?p=cavecraft.git;a=blobdiff_plain;f=src%2Fmobs.pas;h=72f062f21fdb2df6c94774f8f4a9304d81b6a7eb;hp=95815db35f60c894ba81fd5da88288eb5f65968a;hb=3564ef6fb4685bbecd05d027d91a9f7d81385b07;hpb=1ef13d5bd0592dde48cc837e05b13e93e82db25b diff --git a/src/mobs.pas b/src/mobs.pas index 95815db..72f062f 100644 --- a/src/mobs.pas +++ b/src/mobs.pas @@ -22,7 +22,7 @@ interface procedure freeSkin;//Выгрузка текстур implementation - uses phy, player, canvas, func; + uses phy, player, canvas, jsr75i, func; const MAX_MOBS=31; MAX_ANIMREG=3; @@ -358,28 +358,31 @@ procedure storePhy(i:integer); setPosi(1, i); end; - function testSolid(i, vector:integer):boolean; + function testSolid(i, vector : integer) : boolean; var - x, y:integer; + x, y : integer; begin - y:=((getY(i)+getH(i)))/16-1; + y := (getY(i) + getH(i)) / 16 - 1; - if vector<0 then - begin - x:=(getX(i)/16)-1; - end; - else - if vector>0 then - begin - x:=((getX(i)+getW(i))/16){+1}; - end; + if vector > 0 then + x := (getX(i) + getW(i) / 2 + 16 / 2) / 16; else - x:=((getX(i)+getW(i)/2)/16); + x := (getX(i) + getW(i) / 2 - 16 / 2) / 16; - testSolid:=phy.isSolid(x, y, getVX(i), getVY(i)); + testSolid := phy.isSolid(x, y, getVX(i), getVY(i)); end; - procedure updateZloyAiAnim(i:integer); + function collideWithPlayer(i : integer) : boolean; + begin + collideWithPlayer := CollTwoObj(getX(i), getY(i), getW(i), getH(i), player.getX, player.getY, player.getW, player.getH); + end; + + function canBite(i : integer) : boolean; + begin + canBite := collideWithPlayer(i); + end; + + procedure updateZloyAiAnim(i : integer); const DEL=1; var @@ -412,26 +415,33 @@ procedure storePhy(i:integer); mob_anim[i, 3]:=a_f; end; - procedure updateZloyAi(i:integer); + procedure updateZloyAi(i : integer); + var + vector : integer; begin - if player.getXgetX(i) then - begin - goRight(i); - updateZloyAiAnim(i); - if testSolid(i, 1) then - goUp(i); + vector := -1; end; + else if player.getX > getX(i) then + begin + goRight(i); + vector := 1; + end; + + if vector <> 0 then + begin + updateZloyAiAnim(i); + if testSolid(i, vector) then + goUp(i); + end; + + if collideWithPlayer(i) then + player.biteIt(1, vector); end; - procedure update;//Обновление логики + procedure update; var i, _type, ai:integer; begin @@ -533,33 +543,61 @@ procedure storePhy(i:integer); end; end; - procedure saveData;//Сохранение всех данных - begin - + procedure saveData; + var + i, j : integer; + begin + for i := 0 to MAX_MOBS do + begin + write_byte(mob_type[i]); + writeint(mob_x[i]); + writeint(mob_y[i]); + writeint(mob_vx[i]); + writeint(mob_vy[i]); + write_byte(mob_posi[i]); + writeint(mob_hp[i]); + writebool(mob_jmp[i]); + for j := 0 to MAX_ANIMREG do + write_byte(mob_anim[i, j]); + end; end; procedure loadData;//Загрузка всех данных - begin - + var + i, j : integer; + begin + for i := 0 to MAX_MOBS do + begin + mob_type[i] := read_byte; + mob_x[i] := readint; + mob_y[i] := readint; + mob_vx[i] := readint; + mob_vy[i] := readint; + mob_posi[i] := read_byte; + mob_hp[i] := readint; + mob_jmp[i] := readbool; + for j := 0 to MAX_ANIMREG do + mob_anim[i, j] := read_byte; + end; end; procedure resetData;//Сброс всех данных - var - i, j:integer; - begin - for i:=0 to MAX_MOBS do - begin - mob_type[i]:=M_NONE; - mob_x[i]:=0; - mob_y[i]:=0; - mob_vx[i]:=0; - mob_vy[i]:=0; - mob_posi[i]:=0; - mob_hp[i]:=0; - mob_jmp[i]:=false; - for j:=0 to MAX_ANIMREG do - mob_anim[i, j]:=0; - end; + var + i, j:integer; + begin + for i := 0 to MAX_MOBS do + begin + mob_type[i]:=M_NONE; + mob_x[i]:=0; + mob_y[i]:=0; + mob_vx[i]:=0; + mob_vy[i]:=0; + mob_posi[i]:=0; + mob_hp[i]:=0; + mob_jmp[i]:=false; + for j := 0 to MAX_ANIMREG do + mob_anim[i, j]:=0; + end; end; initialization