From: DeaDDooMER Date: Thu, 7 Sep 2017 19:34:03 +0000 (+0300) Subject: New zomby brain! X-Git-Url: https://deadsoftware.ru/gitweb?p=cavecraft.git;a=commitdiff_plain;h=f92b5193f873a667d40bdca3faa6c002014ac309 New zomby brain! --- diff --git a/BUGS b/BUGS index bdb696b..a3ecce9 100644 --- a/BUGS +++ b/BUGS @@ -5,6 +5,15 @@ + Выпадение за карту после загрузки мира + Ломаются кактусы и снег на старте игры Реализованы не все мобы которые были + + Зомби + Курица + Корова + Гриная корова + Крипер + Свинья + Пигмен + Овца + Паук Зомби не может номально выпрыгнуть из воды Мобы не дохнут от солнечного света + Убогая текстура дождя @@ -20,11 +29,11 @@ + Печи и мобы не сохраняются и не загружаются (не забыть инкрементировать версию формата карт) При создании мира с сундуком, оный может висеть в воздухе + Зависание при попытке листать пустой список сохранений -Иногда вместо травы генерируется грязь. -Перепроверить генерацию предметов в вокровищницах +Иногда вместо травы генерируется грязь. (баг или фича - хз) +Перепроверить генерацию предметов в cокровищницах Починить спавнеры + Уголь встречается на поверхности реже чем железо -Починит установку блока при прыжке +Починить установку блока при прыжке Перепроверить рост деревьев + Печь не светится когда работает * Потеря контрастности при малом количестве источников света diff --git a/src/items.mpsrc b/src/items.mpsrc index 3c84b8d..d1b914a 100644 --- a/src/items.mpsrc +++ b/src/items.mpsrc @@ -9,6 +9,9 @@ interface ITEM_FLAG_IND2=2; ITEM_FLAG_DIV=4; ITEM_FLAG_TEX=8; + + rottenMeat = 190; + var compas:image; clock:array[0..7] of image; diff --git a/src/mobs.pas b/src/mobs.pas index ebe716e..c255d0e 100644 --- a/src/mobs.pas +++ b/src/mobs.pas @@ -26,17 +26,22 @@ interface implementation - uses phy, player, canvas, jsr75i, func; + uses phy, player, canvas, jsr75i, func, drop, items; const lastType = 1; lastMob = 31; + lastZombyFrame = 11; var - mtype, mx, my, mvx, mvy, mpos, mhp : array [0..lastMob] of integer; + mtype, mx, my, mvx, mvy, mpos, mhp, ma, mb, mc : array [0..lastMob] of integer; mjump : array [0..lastMob] of boolean; tw, th, thp, tjump : array [none..lastType] of integer; + zombyBody : array [0..1] of image; + zombyLegs : array [0..1, 0..2] of image; + zombyAnim : array [0..lastZombyFrame] of integer; + procedure UseObject(i : integer); begin Phy.LoadObject(mx[i], my[i], tw[mtype[i]], th[mtype[i]], mvx[i], mvy[i], mjump[i]); @@ -51,12 +56,13 @@ implementation mjump[i] := Phy.GetJmp; end; - procedure InitTab(typ, w, h, hp : integer); + procedure InitTab(typ, w, h, hp, jump : integer); begin assert((typ >= 0) and (typ <= lastType)); tw[typ] := w; th[typ] := h; thp[typ] := hp; + tjump[typ] := jump; end; function GetW(i : integer) : integer; @@ -79,15 +85,29 @@ implementation result := tjump[mtype[i]]; end; - procedure Jump(i : integer); + function IsSolidStep(i, vec : integer) : boolean; + var + x, y : integer; begin - UseObject(i); - Phy.JumpObj(GetJumpHeight(i)); - UpdateObject(i); + if vec < 0 then x := (mx[i] - 8) / 16; + else if vec > 0 then x := (mx[i] + GetW(i) + 4) / 16; + else x := (mx[i] + GetW(i) / 2) / 16; + y := (my[i] + GetH(i) - 8) / 16; + result := Phy.IsSolid(x, y, mvx[i] + vec, mvy[i]); + end; + + procedure Swim(i, vec : integer); + begin + if Phy.MapCollType(50, mx[i], my[i], GetW(i), GetH(i) / 2) or + Phy.MapCollType(51, mx[i], my[i], GetW(i), GetH(i) / 2) + then begin + if (vec <> 0) and IsSolidStep(i, vec) then mvy[i] := -10 else mvy[i] := -2; + end; end; procedure Step(i, vec : integer); begin + Swim(i, vec); if vec < 0 then begin mvx[i] := mvx[i] + vec; @@ -100,14 +120,11 @@ implementation end; end; - function IsSolidStep(i, vec : integer) : boolean; - var - x, y : integer; + procedure Jump(i, vec : integer); begin - if vec > 0 then x := (mx[i] + GetW(i) / 2 + 16 / 2) / 16; - else x := (mx[i] + GetW(i) / 2 - 16 / 2) / 16; - y := (my[i] + GetH(i)) / 16 - 1; - result := Phy.IsSolid(x, y, mvx[i], mvy[i]); + UseObject(i); + Phy.JumpObj(GetJumpHeight(i)); + UpdateObject(i); end; function CollisionWithPlayer(i : integer) : boolean; @@ -118,6 +135,111 @@ implementation ); end; + procedure Die(i : integer); + var + x, y : integer; + begin + x := mx[i] + GetW(i) / 2; + y := my[i] + GetH(i) / 2; + if mtype[i] = zomby then + begin + Drop.Create(Items.rottenMeat, x, y, Random(3)); + end; + mtype[i] := none; + end; + + procedure Hit(i, damage : integer); + begin + mhp[i] := mhp[i] - damage; + if mhp[i] <= 0 then Die(i); + end; + + (** ZombyThink -- мозги зомби **) + (** ma = Кадр анимации **) + (** mb = Таймер действий **) + (** mc = Состояние **) + + procedure ZombyThink(i : integer); + const + stay = 0; + walkleft = 1; + walkright = 2; + angry = 3; + const + bite = 1; + speed = 1; + walkTime = 30; + angryTime = 200; + stayTime = 300; + begin + // Debug('state: ' + mc[i] + ' / anim ' + ma[i] + ' / ticks ' + mb[i]); + + mb[i] := mb[i] - 1; + if mb[i] < 0 then mb[i] := 0; + if CollisionWithPlayer(i) then Player.BiteIt(bite, mvx[i]); + + (* Вижу игрока - сразу агрюсь и бегу за ним некоторое время *) + if (mpos[i] = 0) and (Player.GetX - mx[i] < 0) or (mpos[i] = 1) and (Player.GetX - mx[i] > 0) then + if Phy.CanSeeObj(mx[i], my[i], Player.GetX, Player.GetY) then + begin + mb[i] := angryTime; + mc[i] := angry; + end; + + if mc[i] = stay then begin + ma[i] := 0; + Swim(i, 0); + if (mb[i] <= 0) and (Random(100) <= 2) then + begin + mb[i] := walkTime + Random(walkTime); + mc[i] := walkleft + Random(2); (* Случайный разворот *) + end; + end else if mc[i] = walkleft then begin + if IsSolidStep(i, -speed) then Jump(i, -speed); + Step(i, -speed); + ma[i] := (ma[i] + 1) mod lastZombyFrame; + if mb[i] <= 0 then mc[i] := stay; + end else if mc[i] = walkright then begin + if IsSolidStep(i, speed) then Jump(i, speed); + Step(i, speed); + ma[i] := (ma[i] + 1) mod lastZombyFrame; + if mb[i] <= 0 then mc[i] := stay; + end else if mc[i] = angry then begin + if mb[i] <= 0 then begin + if Phy.CanSeeObj(mx[i], my[i], Player.GetX, Player.GetY) then begin + (* Видижу игрока - устанавливаю время преследования *) + mb[i] := angryTime; + end else begin + (* Игрока давно не было видно - ждём его некоторое время на месте *) + mb[i] := stayTime; + mc[i] := stay; + end; + end else begin + (* Бежим за игроком *) + if Player.GetX - mx[i] < 4 then begin + if IsSolidStep(i, -speed) then Jump(i, -speed); + Step(i, -speed); + ma[i] := (ma[i] + 1) mod lastZombyFrame; + end else if Player.GetX - mx[i] > 4 then begin + if IsSolidStep(i, speed) then Jump(i, speed); + Step(i, speed); + ma[i] := (ma[i] + 1) mod lastZombyFrame; + end else begin + Swim(i, 0); + end; + end; + end; + end; + + procedure ZombyDraw(i, camx, camy : integer); + var + frame : integer; + begin + frame := zombyAnim[ma[i]]; + DrawImage(zombyBody[mpos[i]], mx[i] - 6 - camx, my[i] - camy); + DrawImage(zombyLegs[mpos[i], frame], mx[i] - 2 - camx, my[i] + 20 - camy); + end; + (* ============= Public ============= *) procedure Create(typ, x, y : integer); @@ -136,36 +258,41 @@ implementation mpos[i] := 0; mhp[i] := thp[typ]; mjump[i] := false; + ma[i] := 0; + mb[i] := 0; + mc[i] := 0; debug('Created mob is ' + i); exit; end; Debug('Mob type ' + typ + ' not created'); end; - function FindAndHit(value, x, y, w, h, addvx, addvy : integer) : integer; + function FindAndHit(damage, x, y, w, h, addvx, addvy : integer) : integer; var i : integer; begin -(* - for i:=0 to MAX_MOBS do - if getType(i)<>M_NONE then - if CollTwoObj(x, y, w, h, wx[i], wy[i], GetW(i), GetH(i)) then - begin - setVX(getVX(i) + addvx, i); - setVX(getVY(i) + addvy, i); - hit(value, i); - findAndHit := i; - exit; - end; -*) - findAndHit := -1; - end; + for i := 0 to lastMob do if mtype[i] <> none then + if CollTwoObj(x, y, w, h, mx[i], my[i], GetW(i), GetH(i)) then + begin + mvx[i] := mvx[i] + addvx; + mvy[i] := mvy[i] + addvy; + Hit(i, damage); + FindAndHit := i; + exit; + end; + FindAndHit := -1; + end; procedure Update; var - i : integer; + i, typ : integer; begin - (* TODO *) + for i := 0 to lastMob do if mtype[i] <> none then + begin + typ := mtype[i]; + if typ = zomby then ZombyThink(i); + if mhp[i] <= 0 then Die(i); + end; end; procedure UpdatePhy; @@ -182,28 +309,42 @@ implementation procedure Draw(camx, camy:integer); var - i : integer; + i, typ : integer; begin for i := 0 to lastMob do if mtype[i] <> none then begin - SetColor(0, 0, 255); - FillRect(mx[i] - camx, my[i] - camy, GetW(i), GetH(i)); + typ := mtype[i]; + if typ = zomby then ZombyDraw(i, camx, camy); + //SetColor(0, 0, 255); + //DrawRect(mx[i] - camx, my[i] - camy, GetW(i) - 1, GetH(i) - 1); end; end; procedure LoadTextures(path : string); var - im:image; + im : image; begin - // im:=ld_tex('zombie_ani.png', path, 'mobs/'); + im := ld_tex('zombie_ani.png', path, 'mobs/'); + zombyBody[0] := rotate_image_from_image(im, 0, 0, 20, 22, 0); + zombyBody[1] := rotate_image_from_image(im, 21, 0, 20, 22, 0); + zombyLegs[0, 0] := rotate_image_from_image(im, 0, 52, 12, 12, 0); + zombyLegs[0, 1] := rotate_image_from_image(im, 13, 52, 12, 12, 0); + zombyLegs[0, 2] := rotate_image_from_image(im, 26, 52, 12, 12, 0); + zombyLegs[1, 0] := rotate_image_from_image(im, 39, 52, 12, 12, 0); + zombyLegs[1, 1] := rotate_image_from_image(im, 52, 52, 12, 12, 0); + zombyLegs[1, 2] := rotate_image_from_image(im, 65, 52, 12, 12, 0); end; - procedure FreeTextures;//Выгрузка текстур + procedure FreeTextures; var - i : integer; + i, j : integer; nullimg : image; begin - (* TODO *) + for i := 0 to 1 do + begin + zombyBody[i] := nullimg; + for j := 0 to 2 do zombyLegs[i, j] := nullimg; + end; end; procedure SaveData; @@ -220,6 +361,9 @@ implementation write_byte(mpos[i]); writeint(mhp[i]); writebool(mjump[i]); + writeint(ma[i]); + writeint(mb[i]); + writeint(mc[i]); end; end; @@ -237,6 +381,9 @@ implementation mpos[i] := read_byte; mhp[i] := readint; mjump[i] := readbool; + ma[i] := readint; + mb[i] := readint; + mc[i] := readint; end; end; @@ -254,10 +401,26 @@ implementation mpos[i] := 0; mhp[i] := 0; mjump[i] := false; + ma[i] := 0; + mb[i] := 0; + mc[i] := 0; end; end; initialization - InitTab(none, 0, 0, 0); - InitTab(zomby, 8, 32, 10); + InitTab(none, 0, 0, 0, 0); + InitTab(zomby, 8, 32, 10, 7); + + zombyAnim[0] := 0; + zombyAnim[1] := 0; + zombyAnim[2] := 0; + zombyAnim[3] := 1; + zombyAnim[4] := 1; + zombyAnim[5] := 1; + zombyAnim[6] := 2; + zombyAnim[7] := 2; + zombyAnim[8] := 2; + zombyAnim[9] := 1; + zombyAnim[10] := 1; + zombyAnim[11] := 1; end.