diff --git a/src/player.mpsrc b/src/player.mpsrc
index 3e9f3615fa11a8ab31a9689f3e72f84f85439607..812a2b46829db0f2f7569a59afe7fb310bb5b3c5 100644 (file)
--- a/src/player.mpsrc
+++ b/src/player.mpsrc
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
-\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
+ 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
- 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
+ function GetX : integer;\r
+ begin\r
+ result := plx;\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
+ function GetY : integer;\r
+ begin\r
+ result := ply;\r
+ end;\r
\r
- for i:=1 to 3 do\r
+ function GetW : 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 := PLAYER_W;\r
end;\r
\r
- for i:=0 to 2 do\r
+ function GetH : 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 := PLAYER_H;\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
+ procedure SetVelX(val : 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
+ velx := val;\r
end;\r
- end;\r
\r
- procedure playAnim(anim:integer);\r
- begin\r
- if anim=ANIM_HAND then\r
+ procedure SetVelY(val : integer);\r
begin\r
- animHand:=animHand+1;\r
- if animHand>3 then\r
- animHand:=1;\r
+ vely := val;\r
end;\r
- else\r
- if anim=ANIM_LEGS then\r
+\r
+ function GetVelX : integer;\r
begin\r
- if animDelay=0 then\r
- begin\r
- animLegs:=animLegs+1;\r
- if animLegs>2 then\r
- animLegs:=0;\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
+ if posi = POSI_LEFT then Drop.Create(item, sum, GetX - 8, GetY);\r
+ else Drop.Create(item, sum, GetX + GetW, GetY);\r
+ end;\r
+\r
+ procedure LoadSkin(str, path:string);\r
+ var\r
+ im : image;\r
+ i : integer;\r
+ begin\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
\r
- animDelay:=animDelay+1;\r
- if animDelay>PLAYER_ANIM_DEL then\r
- animDelay:=0;\r
+ procedure FreeSkin;\r
+ var\r
+ i, j : integer;\r
+ nullimg : image;\r
+ begin\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
- end;\r
\r
- procedure cancelAnim(anim:integer);\r
- begin\r
- if anim=ANIM_HAND then\r
+ procedure PlayAnim(anim : integer);\r
begin\r
- animHand:=0;\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
- else\r
- if anim=ANIM_LEGS then\r
+\r
+ procedure CancelAnim(anim : integer);\r
begin\r
- animLegs:=0;\r
+ if anim = ANIM_HAND then animHand := 0;\r
+ else if anim = ANIM_LEGS then animLegs := 0;\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 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 Draw(camx, camy : integer);\r
+ var\r
+ x, y : integer;\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
+ 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
+\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.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