unit Player; interface const ANIM_HAND=0; ANIM_LEGS=1; var fly : boolean; hp, hunger, air : integer; posi : integer; velx, vely : integer; jmp, an_pr : boolean; s_get_drp : boolean; invslot : integer; function GetX : integer; function GetY : integer; function GetW : integer; function GetH : integer; procedure SetX(val : integer); procedure SetY(val : integer); procedure LoadSkin(str, path : string); procedure FreeSkin; procedure Draw(camx, camy : integer); procedure PlayAnim(anim : integer); procedure CancelAnim(anim : integer); procedure DropItem(item, sum : integer); procedure BiteIt(hp : integer; vector : integer); procedure CalcPhysics; procedure GotoUP; procedure GotoDOWN; procedure GotoLEFT; procedure GotoRIGHT; procedure GetDrop; implementation uses func, phy, vars, Canvas, drop, items, jsr75i, inv; const PLAYER_W=8; PLAYER_H=32; PLAYER_SPEED=2; POSI_LEFT=0; POSI_RIGHT=1; PLAYER_ANIM_DEL=2; jumpVelocity = 7; var plx, ply:integer; playerBody: array [0..1] of image; playerHand: array [0..1, 0..3] of image; playerLegs: array [0..1, 0..2] of image; animHand, animLegs, animDelay:integer; procedure SetX(val : integer); begin plx := val; end; procedure SetY(val : integer); begin ply := val; end; function GetX : integer; begin result := plx; end; function GetY : integer; begin result := ply; end; function GetW : integer; begin result := PLAYER_W; end; function GetH : integer; begin result := PLAYER_H; end; procedure SetVelX(val : integer); begin velx := val; end; procedure SetVelY(val : integer); begin vely := val; end; function GetVelX : integer; begin result := velx; end; function GetVelY : integer; begin result := vely; end; procedure SetJmp(val : boolean); begin jmp := val; end; function GetJmp : boolean; begin result := jmp; end; procedure DropItem(item, sum : integer); begin if posi = POSI_LEFT then Drop.Create(item, sum, GetX - 8, GetY); else Drop.Create(item, sum, GetX + GetW, GetY); end; procedure LoadSkin(str, path:string); var im : image; i : integer; begin im := ld_tex(str, path, 'mobs/'); playerBody[POSI_LEFT] := rotate_image_from_image(im, 0, 0, 8, 20, 0); playerBody[POSI_RIGHT] := rotate_image_from_image(im, 8, 0, 8, 20, 0); playerHand[POSI_LEFT, 0] := rotate_image_from_image(im, 40, 0, 4, 12, 0); playerHand[POSI_RIGHT, 0] := rotate_image_from_image(im, 44, 0, 4, 12, 0); for i := 1 to 3 do begin playerHand[POSI_LEFT, i] := rotate_image_from_image(im, 16, (i - 1) * 6, 12, 6, 0); playerHand[POSI_RIGHT, i] := rotate_image_from_image(im, 28, (i - 1) * 6, 12, 6, 0); end; for i:=0 to 2 do begin playerLegs[POSI_LEFT, i] := rotate_image_from_image(im, i * 12, 20, 12, 12, 0); playerLegs[POSI_RIGHT, i] := rotate_image_from_image(im, 36 + i * 12, 20, 12, 12, 0); end; end; procedure FreeSkin; var i, j : integer; nullimg : image; begin for i := 0 to 1 do begin playerBody[i] := nullimg; for j:=0 to 3 do playerHand[i, j] := nullimg; for j:=0 to 2 do playerLegs[i, j] := nullimg; end; end; procedure PlayAnim(anim : integer); begin if anim = ANIM_HAND then begin animHand := animHand + 1; if animHand > 3 then animHand:=1; end else if anim = ANIM_LEGS then begin if animDelay = 0 then begin animLegs := animLegs + 1; if animLegs > 2 then animLegs := 0; end; animDelay:=animDelay+1; if animDelay > PLAYER_ANIM_DEL then animDelay := 0; end; end; procedure CancelAnim(anim : integer); begin if anim = ANIM_HAND then animHand := 0; else if anim = ANIM_LEGS then animLegs := 0; end; procedure Draw(camx, camy : integer); var x, y : integer; begin x := GetX; y := GetY; DrawImage(playerBody[posi], x - camx, y - camy); DrawImage(playerLegs[posi, animLegs], x - 2 - camx, y + 20 - camy); if animHand = 0 then DrawSmallItem(Inv.GetItem(invslot), x - camx, y + 14 - camy); else if posi = POSI_RIGHT then DrawSmallItem(Inv.GetItem(invslot), x + 10 - camx, y + 5 - camy + animHand); else if posi = POSI_LEFT then DrawSmallItem(Inv.GetItem(invslot), x - 10 - camx, y + 5 - camy + animHand); if (animHand = 0) or (posi = POSI_RIGHT) then DrawImage(playerHand[posi, animHand], x + 2 - camx, y + 8 - camy); else DrawImage(playerHand[posi, animHand], x - 6 - camx, y + 8 - camy); end; procedure BiteIt(damage : integer; vector : integer); begin hp := hp - damage; velx := velx + vector; end; procedure LoadPhy; begin Phy.SetObject(GetX, GetY, GetW, GetH, GetVelX, GetVelY, GetJmp); end; procedure StorePhy; begin SetX(Phy.GetX); SetY(Phy.GetY); SetVelX(Phy.GetVX); SetVelY(Phy.GetVY); SetJmp(Phy.GetJump); end; procedure CalcPhysics; var vel : integer; begin vel := vely; LoadPhy; Phy.Step(not fly); StorePhy; if (vel > 0) and (Phy.GetGCV - vel < -10) then BiteIt(vel - 10, Random(5) - 2); end; procedure GotoUP; begin if fly then begin SetVelY(-PLAYER_SPEED); end else begin LoadPhy; Phy.Jump(jumpVelocity); StorePhy; end; end; procedure GotoDOWN; begin if fly then SetVelY(PLAYER_SPEED); end; procedure GotoLEFT; begin SetVelX(-PLAYER_SPEED); posi := POSI_LEFT; if not fly then PlayAnim(ANIM_LEGS); end; procedure GotoRIGHT; begin SetVelX(PLAYER_SPEED); posi := POSI_RIGHT; if not fly then playAnim(ANIM_LEGS); end; procedure GetDrop; var i, maxd, sum : integer; begin maxd := Drop.Max; for i := 0 to maxd do if Drop.IsNull(i) = false then begin if Phy.IntersectRects(GetX, GetY, GetW, GetH, Drop.GetX(i), Drop.GetY(i), Drop.GetW, Drop.GetH) then begin sum:=inv.giveItem(drop.getItem(i), drop.getSum(i)); drop.setSum(sum, i); drop.fixNull(i); end; end; end; initialization end.