DEADSOFTWARE

Chanage version to BETA 9 test build 12
[cavecraft.git] / src / mobs.pas
index 95815db35f60c894ba81fd5da88288eb5f65968a..72f062f21fdb2df6c94774f8f4a9304d81b6a7eb 100644 (file)
@@ -22,7 +22,7 @@ interface
  procedure freeSkin;//Выгрузка текстур\r
 \r
 implementation\r
- uses phy, player, canvas, func;\r
+ uses phy, player, canvas, jsr75i, func;\r
  const\r
   MAX_MOBS=31;\r
   MAX_ANIMREG=3;\r
@@ -358,28 +358,31 @@ procedure storePhy(i:integer);
     setPosi(1, i);\r
    end;\r
 \r
-  function testSolid(i, vector:integer):boolean;\r
+  function testSolid(i, vector : integer) : boolean;\r
    var\r
-    x, y:integer;\r
+    x, y : integer;\r
    begin\r
-    y:=((getY(i)+getH(i)))/16-1;\r
+    y := (getY(i) + getH(i)) / 16 - 1;\r
 \r
-    if vector<0 then\r
-     begin\r
-      x:=(getX(i)/16)-1;\r
-     end;\r
-    else\r
-    if vector>0 then\r
-     begin\r
-      x:=((getX(i)+getW(i))/16){+1};\r
-     end;\r
+    if vector > 0 then\r
+      x := (getX(i) + getW(i) / 2 + 16 / 2) / 16;\r
     else\r
-     x:=((getX(i)+getW(i)/2)/16);\r
+      x := (getX(i) + getW(i) / 2 - 16 / 2) / 16;\r
 \r
-    testSolid:=phy.isSolid(x, y, getVX(i), getVY(i));\r
+    testSolid := phy.isSolid(x, y, getVX(i), getVY(i));\r
    end;\r
 \r
-  procedure updateZloyAiAnim(i:integer);\r
+  function collideWithPlayer(i : integer) : boolean;\r
+   begin\r
+     collideWithPlayer := CollTwoObj(getX(i), getY(i), getW(i), getH(i), player.getX, player.getY, player.getW, player.getH);\r
+   end;\r
+\r
+  function canBite(i : integer) : boolean;\r
+   begin\r
+     canBite := collideWithPlayer(i);\r
+   end;\r
+\r
+  procedure updateZloyAiAnim(i : integer);\r
    const\r
     DEL=1;\r
    var\r
@@ -412,26 +415,33 @@ procedure storePhy(i:integer);
     mob_anim[i, 3]:=a_f;\r
    end;\r
 \r
-  procedure updateZloyAi(i:integer);\r
+  procedure updateZloyAi(i : integer);\r
+   var\r
+    vector : integer;\r
    begin\r
-    if player.getX<getX(i) then\r
+    if player.getX < getX(i) then\r
      begin\r
       goLeft(i);\r
-      updateZloyAiAnim(i);\r
-      if testSolid(i, -1) then\r
-       goUp(i);\r
-     end;\r
-    else\r
-    if player.getX>getX(i) then\r
-     begin\r
-      goRight(i);\r
-      updateZloyAiAnim(i);\r
-      if testSolid(i, 1) then\r
-       goUp(i);\r
+      vector := -1;\r
      end;\r
+   else if player.getX > getX(i) then\r
+    begin\r
+     goRight(i);\r
+     vector := 1;\r
+    end;\r
+\r
+   if vector <> 0 then\r
+    begin\r
+     updateZloyAiAnim(i);\r
+     if testSolid(i, vector) then\r
+      goUp(i);\r
+    end;\r
+\r
+    if collideWithPlayer(i) then\r
+     player.biteIt(1, vector);\r
    end;\r
 \r
-  procedure update;//Обновление логики\r
+  procedure update;\r
    var\r
     i, _type, ai:integer;\r
    begin\r
@@ -533,33 +543,61 @@ procedure storePhy(i:integer);
      end;\r
    end;\r
 \r
-  procedure saveData;//Сохранение всех данных\r
-   begin\r
-\r
+  procedure saveData;\r
+    var\r
+      i, j : integer;\r
+    begin\r
+      for i := 0 to MAX_MOBS do\r
+        begin\r
+          write_byte(mob_type[i]);\r
+          writeint(mob_x[i]);\r
+          writeint(mob_y[i]);\r
+          writeint(mob_vx[i]);\r
+          writeint(mob_vy[i]);\r
+          write_byte(mob_posi[i]);\r
+          writeint(mob_hp[i]);\r
+          writebool(mob_jmp[i]);\r
+          for j := 0 to MAX_ANIMREG do\r
+            write_byte(mob_anim[i, j]);\r
+        end;\r
    end;\r
 \r
   procedure loadData;//Загрузка всех данных\r
-   begin\r
-\r
+    var\r
+      i, j : integer;\r
+    begin\r
+      for i := 0 to MAX_MOBS do\r
+        begin\r
+          mob_type[i] := read_byte;\r
+          mob_x[i]    := readint;\r
+          mob_y[i]    := readint;\r
+          mob_vx[i]   := readint;\r
+          mob_vy[i]   := readint;\r
+          mob_posi[i] := read_byte;\r
+          mob_hp[i]   := readint;\r
+          mob_jmp[i]  := readbool;\r
+          for j := 0 to MAX_ANIMREG do\r
+            mob_anim[i, j] := read_byte;\r
+        end;\r
    end;\r
 \r
   procedure resetData;//Сброс всех данных\r
-   var\r
-    i, j:integer;\r
-   begin\r
-    for i:=0 to MAX_MOBS do\r
-     begin\r
-      mob_type[i]:=M_NONE;\r
-      mob_x[i]:=0;\r
-      mob_y[i]:=0;\r
-      mob_vx[i]:=0;\r
-      mob_vy[i]:=0;\r
-      mob_posi[i]:=0;\r
-      mob_hp[i]:=0;\r
-      mob_jmp[i]:=false;\r
-      for j:=0 to MAX_ANIMREG do\r
-       mob_anim[i, j]:=0;\r
-     end;\r
+    var\r
+      i, j:integer;\r
+    begin\r
+      for i := 0 to MAX_MOBS do\r
+        begin\r
+          mob_type[i]:=M_NONE;\r
+          mob_x[i]:=0;\r
+          mob_y[i]:=0;\r
+          mob_vx[i]:=0;\r
+          mob_vy[i]:=0;\r
+          mob_posi[i]:=0;\r
+          mob_hp[i]:=0;\r
+          mob_jmp[i]:=false;\r
+          for j := 0 to MAX_ANIMREG do\r
+            mob_anim[i, j]:=0;\r
+        end;\r
    end;\r
 \r
 initialization\r