DEADSOFTWARE

Small refactoring of physics module
[cavecraft.git] / src / player.mpsrc
index 1891939e113195d38530b4fb149d2a35378a3c43..812a2b46829db0f2f7569a59afe7fb310bb5b3c5 100644 (file)
 unit player;\r
 \r
 interface\r
- const\r
-  ANIM_HAND=0;\r
-  ANIM_LEGS=1;\r
-\r
- var\r
-  fly:boolean;\r
-  hp, hunger, air:integer;\r
-  posi:integer;//Сторона в которую повёрнут игрок\r
-  velx,vely:integer;//Переменные для физики игрока\r
-  jmp, an_pr:boolean;\r
-  s_get_drp:boolean;\r
-  invslot:integer;\r
-\r
- procedure setX(val:integer);\r
- procedure setY(val:integer);\r
- function getX:integer;\r
- function getY:integer;\r
- function getW:integer;\r
- function getH:integer;\r
-\r
- procedure loadSkin(str, path:string);\r
- procedure freeSkin;\r
- procedure draw(camx, camy:integer);\r
- procedure playAnim(anim:integer);\r
- procedure cancelAnim(anim:integer);\r
-\r
- procedure dropItem(item, sum:integer);\r
- procedure biteIt(hp : integer; vector : integer);\r
-\r
- procedure calcPhysics;\r
-\r
- procedure gotoUP;\r
- procedure gotoDOWN;\r
- procedure gotoLEFT;\r
- procedure gotoRIGHT;\r
-\r
- procedure getDrop;\r
+\r
+  const\r
+    ANIM_HAND=0;\r
+    ANIM_LEGS=1;\r
+\r
+  var\r
+    fly : boolean;\r
+    hp, hunger, air : integer;\r
+    posi : integer;\r
+    velx, vely : integer;\r
+    jmp, an_pr : boolean;\r
+    s_get_drp : boolean;\r
+    invslot : integer;\r
+\r
+  function GetX : integer;\r
+  function GetY : integer;\r
+  function GetW : integer;\r
+  function GetH : integer;\r
+  procedure SetX(val : integer);\r
+  procedure SetY(val : integer);\r
+\r
+  procedure LoadSkin(str, path : string);\r
+  procedure FreeSkin;\r
+  procedure Draw(camx, camy : integer);\r
+  procedure PlayAnim(anim : integer);\r
+  procedure CancelAnim(anim : integer);\r
+\r
+  procedure DropItem(item, sum : integer);\r
+  procedure BiteIt(hp : integer; vector : integer);\r
+\r
+  procedure CalcPhysics;\r
+\r
+  procedure GotoUP;\r
+  procedure GotoDOWN;\r
+  procedure GotoLEFT;\r
+  procedure GotoRIGHT;\r
+\r
+  procedure GetDrop;\r
 \r
 implementation\r
- uses func, phy, vars, Canvas, drop, items, jsr75i, inv;\r
- const\r
-  PLAYER_W=8;\r
-  PLAYER_H=32;\r
-  PLAYER_SPEED=2;\r
-\r
-  POSI_LEFT=0;\r
-  POSI_RIGHT=1;\r
-  PLAYER_ANIM_DEL=1;\r
- var\r
-  plx, ply:integer;\r
-\r
-  //Skin\r
-  PlayerBody: array [0..1] of image;\r
-  PlayerHand: array [0..1, 0..3] of image;\r
-  PlayerLegs: array [0..1, 0..2] of image;\r
-  animHand, animLegs, animDelay:integer;\r
-\r
- procedure setX(val:integer);\r
-  begin\r
-   plx:=val;\r
-  end;\r
-\r
- procedure setY(val:integer);\r
-  begin\r
-   ply:=val;\r
-  end;\r
-\r
- function getX:integer;\r
-  begin\r
-   getX:=plx;\r
-  end;\r
-\r
- function getY:integer;\r
-  begin\r
-   getY:=ply;\r
-  end;\r
-\r
- function getW:integer;\r
-  begin\r
-   getW:=PLAYER_W;\r
-  end;\r
-\r
- function getH:integer;\r
-  begin\r
-   getH:=PLAYER_H;\r
-  end;\r
-\r
- procedure setVelX(val:integer);\r
-  begin\r
-   velx:=val;\r
-  end;\r
-\r
- procedure setVelY(val:integer);\r
-  begin\r
-   vely:=val;\r
-  end;\r
-\r
- function getVelX:integer;\r
-  begin\r
-   getVelX:=velx;\r
-  end;\r
-\r
- function getVelY:integer;\r
-  begin\r
-   getVelY:=vely;\r
-  end;\r
-\r
- procedure setJmp(val:boolean);\r
-  begin\r
-   jmp:=val;\r
-  end;\r
-\r
- function getJmp:boolean;\r
-  begin\r
-   getJmp:=jmp;\r
-  end;\r
-\r
- procedure dropItem(item, sum:integer);\r
-  begin\r
-   if posi=POSI_LEFT then\r
-    drop.create(item, sum, getX-8, getY);\r
-   else\r
-    drop.create(item, sum, getX+getW, getY);\r
-  end;\r
-\r
- procedure loadSkin(str, path:string);\r
+\r
+  uses func, phy, vars, Canvas, drop, items, jsr75i, inv;\r
+\r
+  const\r
+    PLAYER_W=8;\r
+    PLAYER_H=32;\r
+    PLAYER_SPEED=2;\r
+    POSI_LEFT=0;\r
+    POSI_RIGHT=1;\r
+    PLAYER_ANIM_DEL=2;\r
+    jumpVelocity = 7;\r
+\r
   var\r
-   im:image;\r
-   i:integer;\r
-  begin\r
-   im:=ld_tex(str, path, 'mobs/');\r
+    plx, ply:integer;\r
+    playerBody: array [0..1] of image;\r
+    playerHand: array [0..1, 0..3] of image;\r
+    playerLegs: array [0..1, 0..2] of image;\r
+    animHand, animLegs, animDelay:integer;\r
 \r
-   PlayerBody[POSI_LEFT]:=rotate_image_from_image(im, 0, 0, 8, 20, 0);\r
-   PlayerBody[POSI_RIGHT]:=rotate_image_from_image(im, 8, 0, 8, 20, 0);\r
+  procedure SetX(val : integer);\r
+   begin\r
+     plx := val;\r
+   end;\r
 \r
-   PlayerHand[POSI_LEFT, 0]:=rotate_image_from_image(im, 40, 0, 4, 12, 0);\r
-   PlayerHand[POSI_RIGHT, 0]:=rotate_image_from_image(im, 44, 0, 4, 12, 0);\r
+  procedure SetY(val : integer);\r
+    begin\r
+      ply := val;\r
+    end;\r
 \r
-   for i:=1 to 3 do\r
+  function GetX : integer;\r
     begin\r
-     PlayerHand[POSI_LEFT, i]:=rotate_image_from_image(im, 16, (i-1)*6, 12, 6, 0);\r
-     PlayerHand[POSI_RIGHT, i]:=rotate_image_from_image(im, 28, (i-1)*6, 12, 6, 0);\r
+      result := plx;\r
     end;\r
 \r
-   for i:=0 to 2 do\r
+  function GetY : integer;\r
     begin\r
-     PlayerLegs[POSI_LEFT, i]:=rotate_image_from_image(im, i*12, 20, 12, 12, 0);\r
-     PlayerLegs[POSI_RIGHT, i]:=rotate_image_from_image(im, 36+i*12, 20, 12, 12, 0);\r
+      result := ply;\r
     end;\r
-  end;\r
 \r
- procedure freeSkin;\r
-  var\r
-   i, j:integer;\r
-   nullimg:image;\r
-  begin\r
-   for i:=0 to 1 do\r
+  function GetW : integer;\r
+    begin\r
+      result := PLAYER_W;\r
+    end;\r
+\r
+  function GetH : integer;\r
+    begin\r
+      result := PLAYER_H;\r
+    end;\r
+\r
+  procedure SetVelX(val : integer);\r
+    begin\r
+      velx := val;\r
+    end;\r
+\r
+  procedure SetVelY(val : integer);\r
+    begin\r
+      vely := val;\r
+    end;\r
+\r
+  function GetVelX : integer;\r
+    begin\r
+      result := velx;\r
+    end;\r
+\r
+  function GetVelY : integer;\r
+    begin\r
+      result := vely;\r
+    end;\r
+\r
+  procedure SetJmp(val : boolean);\r
+    begin\r
+     jmp := val;\r
+    end;\r
+\r
+  function GetJmp : boolean;\r
+    begin\r
+      result := jmp;\r
+    end;\r
+\r
+  procedure DropItem(item, sum : integer);\r
     begin\r
-     PlayerBody[i]:=nullimg;\r
-     for j:=0 to 3 do\r
-      PlayerHand[i, j]:=nullimg;\r
-     for j:=0 to 2 do\r
-      PlayerLegs[i, j]:=nullimg;\r
+      if posi = POSI_LEFT then Drop.Create(item, sum, GetX - 8, GetY);\r
+      else Drop.Create(item, sum, GetX + GetW, GetY);\r
     end;\r
-  end;\r
 \r
- procedure playAnim(anim:integer);\r
-  begin\r
-   if anim=ANIM_HAND then\r
+  procedure LoadSkin(str, path:string);\r
+    var\r
+      im : image;\r
+      i : integer;\r
     begin\r
-     animHand:=animHand+1;\r
-     if animHand>3 then\r
-      animHand:=1;\r
+      im := ld_tex(str, path, 'mobs/');\r
+      playerBody[POSI_LEFT] := rotate_image_from_image(im, 0, 0, 8, 20, 0);\r
+      playerBody[POSI_RIGHT] := rotate_image_from_image(im, 8, 0, 8, 20, 0);\r
+      playerHand[POSI_LEFT, 0] := rotate_image_from_image(im, 40, 0, 4, 12, 0);\r
+      playerHand[POSI_RIGHT, 0] := rotate_image_from_image(im, 44, 0, 4, 12, 0);\r
+      for i := 1 to 3 do begin\r
+        playerHand[POSI_LEFT, i] := rotate_image_from_image(im, 16, (i - 1) * 6, 12, 6, 0);\r
+        playerHand[POSI_RIGHT, i] := rotate_image_from_image(im, 28, (i - 1) * 6, 12, 6, 0);\r
+      end;\r
+      for i:=0 to 2 do begin\r
+        playerLegs[POSI_LEFT, i] := rotate_image_from_image(im, i * 12, 20, 12, 12, 0);\r
+        playerLegs[POSI_RIGHT, i] := rotate_image_from_image(im, 36 + i * 12, 20, 12, 12, 0);\r
+      end;\r
     end;\r
-   else\r
-   if anim=ANIM_LEGS then\r
+\r
+  procedure FreeSkin;\r
+    var\r
+      i, j : integer;\r
+      nullimg : image;\r
     begin\r
-     if animDelay=0 then\r
-      begin\r
-       animLegs:=animLegs+1;\r
-       if animLegs>2 then\r
-        animLegs:=0;\r
+      for i := 0 to 1 do begin\r
+        playerBody[i] := nullimg;\r
+        for j:=0 to 3 do playerHand[i, j] := nullimg;\r
+        for j:=0 to 2 do playerLegs[i, j] := nullimg;\r
       end;\r
+    end;\r
 \r
-     animDelay:=animDelay+1;\r
-     if animDelay>PLAYER_ANIM_DEL then\r
-      animDelay:=0;\r
+  procedure PlayAnim(anim : integer);\r
+    begin\r
+      if anim = ANIM_HAND then begin\r
+        animHand := animHand + 1;\r
+        if animHand > 3 then animHand:=1;\r
+      end else if anim = ANIM_LEGS then begin\r
+        if animDelay = 0 then begin\r
+          animLegs := animLegs + 1;\r
+          if animLegs > 2 then animLegs := 0;\r
+        end;\r
+        animDelay:=animDelay+1;\r
+        if animDelay > PLAYER_ANIM_DEL then animDelay := 0;\r
+      end;\r
     end;\r
-  end;\r
 \r
- procedure cancelAnim(anim:integer);\r
-  begin\r
-   if anim=ANIM_HAND then\r
+  procedure CancelAnim(anim : integer);\r
     begin\r
-     animHand:=0;\r
+      if anim = ANIM_HAND then animHand := 0;\r
+      else if anim = ANIM_LEGS then animLegs := 0;\r
     end;\r
-   else\r
-   if anim=ANIM_LEGS then\r
+\r
+  procedure Draw(camx, camy : integer);\r
+    var\r
+      x, y : integer;\r
     begin\r
-     animLegs:=0;\r
+      x := GetX;\r
+      y := GetY;\r
+      DrawImage(playerBody[posi], x - camx, y - camy);\r
+      DrawImage(playerLegs[posi, animLegs], x - 2 - camx, y + 20 - camy);\r
+\r
+      if animHand = 0 then DrawSmallItem(Inv.GetItem(invslot), x - camx, y + 14 - camy);\r
+      else if posi = POSI_RIGHT then DrawSmallItem(Inv.GetItem(invslot), x + 10 - camx, y + 5 - camy + animHand);\r
+      else if posi = POSI_LEFT then DrawSmallItem(Inv.GetItem(invslot), x - 10 - camx, y + 5 - camy + animHand);\r
+\r
+      if (animHand = 0) or (posi = POSI_RIGHT) then DrawImage(playerHand[posi, animHand], x + 2 - camx, y + 8 - camy);\r
+      else DrawImage(playerHand[posi, animHand], x - 6 - camx, y + 8 - camy);\r
     end;\r
-  end;\r
 \r
- procedure draw(camx, camy:integer);\r
-  var\r
-   x, y:integer;\r
-  begin\r
-   x:=getX;\r
-   y:=getY;\r
-\r
-   DrawImage(PlayerBody[posi], x-camx, y-camy);\r
-   DrawImage(PlayerLegs[posi, animLegs], x-2-camx, y+20-camy);\r
-\r
-   if animHand=0 then\r
-    drawSmallItem(inv.getItem(invslot), x-camx, y+14-camy);\r
-   else\r
-   if posi=POSI_RIGHT then\r
-    drawSmallItem(inv.getItem(invslot), x+10-camx, y+5-camy+animHand);\r
-   else\r
-   if posi=POSI_LEFT then\r
-    drawSmallItem(inv.getItem(invslot), x-10-camx, y+5-camy+animHand);\r
-\r
-   if (animHand=0) or (posi=POSI_RIGHT) then\r
-    DrawImage(PlayerHand[posi, animHand], x+2-camx, y+8-camy);\r
-   else\r
-    DrawImage(PlayerHand[posi, animHand], x-6-camx, y+8-camy);\r
-  end;\r
-\r
-  procedure biteIt(damage : integer; vector : integer);\r
-   begin\r
-    hp := hp - damage;\r
-   end;\r
+  procedure BiteIt(damage : integer; vector : integer);\r
+    begin\r
+      hp := hp - damage;\r
+      velx := velx + vector;\r
+    end;\r
 \r
-procedure loadPhy;\r
- begin\r
-  phy.loadObject(getX, getY, getW, getH, getVelX, getVelY, getJmp);\r
- end;\r
-\r
-procedure storePhy;\r
- begin\r
-  setX(phy.getX);\r
-  setY(phy.getY);\r
-  setVelX(phy.getVelX);\r
-  setVelY(phy.getVelY);\r
-  setJmp(phy.getJmp);\r
- end;\r
-\r
- //Player collision.\r
-{function coll:boolean;\r
- begin\r
-  coll:=CollObj(getX, getY, getW, getH);\r
- end;\r
-\r
-//Player collision by block id.\r
-function coll_bl(id:integer):boolean;\r
- begin\r
-  coll_bl:=CollObjBlock(getX, getY, getW, getH, id);\r
- end;\r
-\r
-//Player collision by XY.\r
-function coll_xy(xx,yy:integer):boolean;\r
- begin\r
-  coll_xy:=CollObjXY(getX, getY, getW, getH, xx, yy);\r
- end;\r
-\r
-//Controll jump velocity\r
-procedure jmp_ctrl;\r
- begin\r
-  if (coll_bl(49)) or (coll_bl(103)) or (coll_bl(108)) then\r
-   vely:=5;\r
-  if (coll_bl(50)) or (coll_bl(51)) then\r
-   vely:=4;\r
-  if (coll_bl(0)) and (coll_bl(50) or coll_bl(51)) then\r
-   vely:=7;\r
- end;\r
-\r
-//Controll fall velocity\r
- procedure phy_ctrl;\r
-  begin\r
-   if (coll_bl(49)) or (coll_bl(103)) then\r
-    vely:=-5;\r
-   if (coll_bl(50)) or (coll_bl(51)) then\r
-    if vely<-4 then\r
-     vely:=-4;\r
-  end;}\r
-\r
- procedure calcPhysics;\r
-  var\r
-   old_vely:integer;\r
-   cl:boolean;\r
-  begin\r
-   loadPhy;\r
-   phy.calc(not fly);\r
-   storePhy;\r
-\r
-   {if fly=false then\r
+  procedure LoadPhy;\r
     begin\r
-     old_vely:=vely;\r
-     calcGravY(getX, getY, getW, getH, CONST_PHY_ACC, vely, CONST_PHY_MAXVEL, jmp);\r
-     setY(PhyGetY);\r
-     vely:=PhyGetVelY;\r
-     jmp:=PhyGetJump;\r
-     cl:=PhyGetColl;\r
-\r
-     if cl then\r
-      if old_vely<-10 then\r
-       hp:=(hp-(abs(old_vely)-10));\r
-    end;}\r
-  end;\r
-\r
- procedure gotoUP;\r
-  begin\r
-   if fly then\r
-    setVelY(-PLAYER_SPEED);\r
-   else\r
+      Phy.SetObject(GetX, GetY, GetW, GetH, GetVelX, GetVelY, GetJmp);\r
+    end;\r
+\r
+  procedure StorePhy;\r
     begin\r
-     loadPhy;\r
-     jumpObj(7);\r
-     storePhy;\r
+      SetX(Phy.GetX);\r
+      SetY(Phy.GetY);\r
+      SetVelX(Phy.GetVX);\r
+      SetVelY(Phy.GetVY);\r
+      SetJmp(Phy.GetJump);\r
     end;\r
-  end;\r
 \r
procedure gotoDOWN;\r
-  begin\r
-   if fly then\r
-    setVelY(PLAYER_SPEED);\r
-  end;\r
 procedure CalcPhysics;\r
+    var\r
+      vel : integer;\r
+    begin\r
+      vel := vely;\r
 \r
procedure gotoLEFT;\r
-  begin\r
-   setVelX(-PLAYER_SPEED);\r
     LoadPhy;\r
+      Phy.Step(not fly);\r
+      StorePhy;\r
 \r
-   posi:=POSI_LEFT;\r
+      if (vel > 0) and (Phy.GetGCV - vel < -10) then BiteIt(vel - 10, Random(5) - 2);\r
+    end;\r
 \r
-   if fly=false then\r
-    playAnim(ANIM_LEGS);\r
-  end;\r
+  procedure GotoUP;\r
+    begin\r
+      if fly then begin\r
+        SetVelY(-PLAYER_SPEED);\r
+      end else begin\r
+        LoadPhy;\r
+        Phy.Jump(jumpVelocity);\r
+        StorePhy;\r
+      end;\r
+    end;\r
 \r
- procedure gotoRIGHT;\r
-  begin\r
-   setVelX(PLAYER_SPEED);\r
+  procedure GotoDOWN;\r
+    begin\r
+      if fly then SetVelY(PLAYER_SPEED);\r
+    end;\r
 \r
-   posi:=POSI_RIGHT;\r
+  procedure GotoLEFT;\r
+    begin\r
+      SetVelX(-PLAYER_SPEED);\r
+      posi := POSI_LEFT;\r
+      if not fly then PlayAnim(ANIM_LEGS);\r
+    end;\r
 \r
-   if fly=false then\r
-    playAnim(ANIM_LEGS);\r
-  end;\r
+  procedure GotoRIGHT;\r
+    begin\r
+      SetVelX(PLAYER_SPEED);\r
+      posi := POSI_RIGHT;\r
+      if not fly then playAnim(ANIM_LEGS);\r
+    end;\r
 \r
- procedure getDrop;\r
-  var\r
-   i, maxd, sum:integer;\r
-  begin\r
-   maxd:=drop.max;\r
-   for i:=0 to maxd do\r
-    if drop.isNull(i)=false then\r
-     if CollTwoObj(getX, getY, getW, getH, drop.getX(i), drop.getY(i), drop.getW, drop.getH) then\r
-      begin\r
-       sum:=inv.giveItem(drop.getItem(i), drop.getSum(i));\r
-       drop.setSum(sum, i);\r
-       drop.fixNull(i);\r
+  procedure GetDrop;\r
+    var\r
+      i, maxd, sum : integer;\r
+    begin\r
+      maxd := Drop.Max;\r
+      for i := 0 to maxd do if Drop.IsNull(i) = false then begin\r
+        if Phy.IntersectRects(GetX, GetY, GetW, GetH, Drop.GetX(i), Drop.GetY(i), Drop.GetW, Drop.GetH) then begin\r
+            sum:=inv.giveItem(drop.getItem(i), drop.getSum(i));\r
+            drop.setSum(sum, i);\r
+            drop.fixNull(i);\r
+        end;\r
       end;\r
-  end;\r
+    end;\r
 \r
 initialization\r
 \r