diff --git a/src/mobs.pas b/src/mobs.pas
index 4899980faad7dd40f79c6aa86bac25798a8f3481..519cf9cd0a6f698634bbf94fecb90aaa142d86c5 100644 (file)
--- a/src/mobs.pas
+++ b/src/mobs.pas
-unit mob;\r
+unit Mobs;\r
\r
interface\r
\r
interface\r
- const\r
- M_NONE=0;\r
- M_ZOMBY=1;\r
\r
\r
- MOB_TYPES=1;\r
+ const\r
+ (* Типы мобов *)\r
+ none = 0;\r
+ zomby = 1;\r
\r
\r
- procedure create(_type, x, y:integer);//Создать моба\r
- function findAndHit(value, x, y, w, h, addvx, addvy:integer):integer;\r
+ procedure Create(typ, x, y : integer);\r
+ function FindAndHit(value, x, y, w, h, addvx, addvy : integer) : integer;\r
\r
\r
- procedure update;//Обновление логики\r
- procedure updatePhy;//Обновление физики\r
- procedure draw(camx, camy:integer);//Отрисовка\r
+ (* Части главного цикла *)\r
+ procedure Update;\r
+ procedure UpdatePhy;\r
+ procedure Draw(camx, camy : integer);\r
\r
\r
- procedure saveData;//Сохранение всех данных\r
- procedure loadData;//Загрузка всех данных\r
- procedure resetData;//Сброс всех данных\r
+ (* Управление сохранениями *)\r
+ procedure SaveData;\r
+ procedure LoadData;\r
+ procedure ResetData;\r
\r
\r
- procedure loadSkin(path:string);//Загрузка текстур\r
- procedure freeSkin;//Выгрузка текстур\r
+ (* Управление текстурами *)\r
+ procedure LoadTextures(path : string);\r
+ procedure FreeTextures;\r
\r
implementation\r
\r
implementation\r
- uses phy, player, canvas, func;\r
- const\r
- MAX_MOBS=31;\r
- MAX_ANIMREG=3;\r
-\r
- AI_NONE=0;\r
- AI_ZLOY=1;\r
- var\r
- mob_type, mob_x, mob_y, mob_vx, mob_vy, mob_posi, mob_hp:array [0..MAX_MOBS] of integer;\r
- mob_jmp:array [0..MAX_MOBS] of boolean;\r
- mob_anim:array [0..MAX_MOBS, 0..MAX_ANIMREG] of integer;\r
- tab_w, tab_h, tab_hp, tab_speedx, tab_jumph, tab_ai:array [0..MOB_TYPES] of integer;\r
-\r
- texture_left, texture_right:array [0..MOB_TYPES, 0..0] of image;\r
- tex_x, tex_y, tex_w, tex_h:array [0..1, 0..MOB_TYPES, 0..0] of integer;\r
-\r
- part_max: array [0..MOB_TYPES] of integer;\r
- part_tex, part_x, part_y, part_anim: array [0..MOB_TYPES, 0..0] of integer;\r
- \r
- function getType(i:integer):integer;\r
- begin\r
- getType:=mob_type[i];\r
- end;\r
-\r
- function getX(i:integer):integer;\r
- begin\r
- getX:=mob_x[i];\r
- end;\r
-\r
- function getY(i:integer):integer;\r
- begin\r
- getY:=mob_y[i];\r
- end;\r
-\r
- function getVX(i:integer):integer;\r
- begin\r
- getVX:=mob_vx[i];\r
- end;\r
-\r
- function getVY(i:integer):integer;\r
- begin\r
- getVY:=mob_vy[i];\r
- end;\r
-\r
- function getPosi(i:integer):integer;\r
- begin\r
- getPosi:=mob_posi[i];\r
- end;\r
-\r
- function getHp(i:integer):integer;\r
- begin\r
- getHp:=mob_hp[i];\r
- end;\r
-\r
- function getW(i:integer):integer;\r
- begin\r
- getW:=tab_w[mob_type[i]];\r
- end;\r
-\r
- function getH(i:integer):integer;\r
- begin\r
- getH:=tab_h[mob_type[i]];\r
- end;\r
-\r
- function getSpeedX(i:integer):integer;\r
- begin\r
- getSpeedX:=tab_speedx[mob_type[i]];\r
- end;\r
-\r
- function getJumpH(i:integer):integer;\r
- begin\r
- getJumpH:=tab_jumph[mob_type[i]];\r
- end;\r
\r
\r
- function getJmp(i:integer):boolean;\r
- begin\r
- getJmp:=mob_jmp[i];\r
- end;\r
-\r
- procedure setType(value, i:integer);\r
- begin\r
- mob_type[i]:=value;\r
- end;\r
-\r
- procedure setX(value, i:integer);\r
- begin\r
- mob_x[i]:=value;\r
- end;\r
-\r
- procedure setY(value, i:integer);\r
- begin\r
- mob_y[i]:=value;\r
- end;\r
+ uses phy, player, canvas, jsr75i, func, drop, items;\r
\r
\r
- procedure setVX(value, i:integer);\r
- begin\r
- mob_vx[i]:=value;\r
- end;\r
+ const\r
+ lastType = 1;\r
+ lastMob = 31;\r
+ lastZombyFrame = 11;\r
\r
\r
- procedure setVY(value, i:integer);\r
- begin\r
- mob_vy[i]:=value;\r
- end;\r
+ var\r
+ mtype, mx, my, mvx, mvy, mpos, mhp, ma, mb, mc : array [0..lastMob] of integer;\r
+ mjump : array [0..lastMob] of boolean;\r
+ tw, th, thp, tjump : array [none..lastType] of integer;\r
\r
\r
- procedure setPosi(value, i:integer);\r
- begin\r
- mob_posi[i]:=value;\r
- end;\r
+ zombyBody : array [0..1] of image;\r
+ zombyLegs : array [0..1, 0..2] of image;\r
+ zombyAnim : array [0..lastZombyFrame] of integer;\r
\r
\r
- procedure setHp(value, i:integer);\r
- begin\r
- mob_hp[i]:=value;\r
- end;\r
+ procedure UseObject(i : integer);\r
+ begin\r
+ Phy.SetObject(mx[i], my[i], tw[mtype[i]], th[mtype[i]], mvx[i], mvy[i], mjump[i]);\r
+ end;\r
\r
\r
- procedure setJmp(value:boolean; i:integer);\r
- begin\r
- mob_jmp[i]:=value;\r
- end;\r
+ procedure UpdateObject(i : integer);\r
+ begin\r
+ mx[i] := Phy.GetX;\r
+ my[i] := Phy.GetY;\r
+ mvx[i] := Phy.GetVX;\r
+ mvy[i] := Phy.GetVY;\r
+ mjump[i] := Phy.GetJump;\r
+ end;\r
\r
\r
- procedure initTab(_type, w, h, hp, speedx, jumph, ai:integer);\r
- begin\r
- tab_w[_type]:=w;\r
- tab_h[_type]:=h;\r
- tab_hp[_type]:=hp;\r
- tab_speedx[_type]:=speedx;\r
- tab_jumph[_type]:=jumph;\r
- tab_ai[_type]:=ai;\r
- end;\r
+ procedure InitTab(typ, w, h, hp, jump : integer);\r
+ begin\r
+ assert((typ >= 0) and (typ <= lastType));\r
+ tw[typ] := w;\r
+ th[typ] := h;\r
+ thp[typ] := hp;\r
+ tjump[typ] := jump;\r
+ end;\r
\r
\r
- procedure initTexture(img:image; mobtype, texid, posi, centerx, centery:integer);\r
- begin\r
- tex_w[posi, mobtype, texid]:=getImageWidth(img);\r
- tex_h[posi, mobtype, texid]:=getImageHeight(img);\r
- if posi=0 then\r
- texture_left[mobtype, texid]:=img;\r
- else\r
- texture_right[mobtype, texid]:=img;\r
- tex_x[posi, mobtype, texid]:=centerx;\r
- tex_y[posi, mobtype, texid]:=centery;\r
- end;\r
+ function GetW(i : integer) : integer;\r
+ begin\r
+ result := tw[mtype[i]];\r
+ end;\r
\r
\r
- procedure setMaxTextures(mobtype, max:integer);\r
- var\r
- i:integer;\r
- begin\r
- max:=max+1;\r
- debug('setMaxTextures(mobtype, max:integer);');\r
- bytecode\r
- getstatic field 'mob', 'texture_left', '[[Ljavax/microedition/lcdui/Image;';\r
- iload 0;\r
- iload 1;\r
- multianewarray class '[Ljavax/microedition/lcdui/Image;', 1;\r
- aastore;\r
-\r
- getstatic field 'mob', 'texture_right', '[[Ljavax/microedition/lcdui/Image;';\r
- iload 0;\r
- iload 1;\r
- multianewarray class '[Ljavax/microedition/lcdui/Image;', 1;\r
- aastore;\r
+ function GetH(i : integer) : integer;\r
+ begin\r
+ result := th[mtype[i]];\r
end;\r
\r
end;\r
\r
- for i:=0 to 1 do\r
- bytecode\r
- //tex_x[i][mobtype]=new int[max];\r
- getstatic field 'mob', 'tex_x', '[[[I';\r
- iload_2; \r
- aaload; \r
- iload_0; \r
- iload_1;\r
- multianewarray class '[I', 1; \r
- aastore;\r
-\r
- getstatic field 'mob', 'tex_y', '[[[I';\r
- iload_2; \r
- aaload; \r
- iload_0; \r
- iload_1;\r
- multianewarray class '[I', 1; \r
- aastore;\r
-\r
- getstatic field 'mob', 'tex_w', '[[[I';\r
- iload_2; \r
- aaload; \r
- iload_0; \r
- iload_1;\r
- multianewarray class '[I', 1; \r
- aastore;\r
- \r
- getstatic field 'mob', 'tex_h', '[[[I';\r
- iload_2; \r
- aaload; \r
- iload_0; \r
- iload_1;\r
- multianewarray class '[I', 1; \r
- aastore;\r
+ function GetMaxHp(i : integer) : integer;\r
+ begin\r
+ result := thp[mtype[i]];\r
end;\r
end;\r
- end;\r
\r
\r
- procedure setMaxParts(mobtype, max:integer);\r
+ function GetJumpHeight(i : integer) : integer;\r
begin\r
begin\r
- part_max[mobtype]:=max;\r
- max:=max+1;\r
- \r
- bytecode\r
- getstatic field 'mob', 'part_tex', '[[I';\r
- iload_0; \r
- iload_1;\r
- multianewarray class '[I', 1; \r
- aastore;\r
-\r
- getstatic field 'mob', 'part_x', '[[I';\r
- iload_0; \r
- iload_1;\r
- multianewarray class '[I', 1; \r
- aastore;\r
-\r
- getstatic field 'mob', 'part_y', '[[I';\r
- iload_0; \r
- iload_1;\r
- multianewarray class '[I', 1; \r
- aastore;\r
-\r
- getstatic field 'mob', 'part_anim', '[[I';\r
- iload_0; \r
- iload_1;\r
- multianewarray class '[I', 1; \r
- aastore;\r
- end;\r
+ result := tjump[mtype[i]];\r
end;\r
\r
end;\r
\r
- procedure initPart(mobtype, partid, tex, x, y, animreg:integer);\r
+ function IsSolidStep(i, vec : integer) : boolean;\r
+ var\r
+ x, y : integer;\r
begin\r
begin\r
- part_tex[mobtype, partid]:=tex;\r
- part_x[mobtype, partid]:=x;\r
- part_y[mobtype, partid]:=y;\r
- part_anim[mobtype, partid]:=animreg;\r
+ if vec < 0 then x := (mx[i] - 8) / 16;\r
+ else if vec > 0 then x := (mx[i] + GetW(i) + 4) / 16;\r
+ else x := (mx[i] + GetW(i) / 2) / 16;\r
+ y := (my[i] + GetH(i) - 8) / 16;\r
+ result := Phy.IsSolid(x, y);\r
end;\r
\r
end;\r
\r
-procedure loadPhy(i:integer);\r
- begin\r
- phy.loadObject(mob_x[i], mob_y[i], tab_w[mob_type[i]], tab_h[mob_type[i]], mob_vx[i], mob_vy[i], mob_jmp[i]);\r
- end;\r
-\r
-procedure storePhy(i:integer);\r
- begin\r
- mob_x[i]:=phy.getX;\r
- mob_y[i]:=phy.getY;\r
- mob_vx[i]:=phy.getVelX;\r
- mob_vy[i]:=phy.getVelY;\r
- mob_jmp[i]:=phy.getJmp;\r
- end;\r
-\r
-{===== =====}\r
-\r
- procedure create(_type, x, y:integer);//Создать моба\r
- var\r
- i, j:integer;\r
- begin\r
- debug('Create mob '+_type+' @ '+x+'x'+y);\r
- for i:=0 to MAX_MOBS do\r
- if mob_type[i]=M_NONE then\r
- begin\r
- mob_type[i]:=_type;\r
- mob_x[i]:=x;\r
- mob_y[i]:=y;\r
- mob_vx[i]:=0;\r
- mob_vy[i]:=0;\r
- mob_posi[i]:=0;\r
- mob_hp[i]:=tab_hp[_type];\r
- mob_jmp[i]:=false;\r
- for j:=0 to MAX_ANIMREG do\r
- mob_anim[i, j]:=0;\r
-\r
- debug('Created mob is '+i);\r
- exit;\r
+ procedure Swim(i, vec : integer);\r
+ begin\r
+ if Phy.AreaWithBlock(50, mx[i], my[i], GetW(i), GetH(i) / 2) or\r
+ Phy.AreaWithBlock(51, mx[i], my[i], GetW(i), GetH(i) / 2)\r
+ then begin\r
+ if (vec <> 0) and IsSolidStep(i, vec) then mvy[i] := -10 else mvy[i] := -2;\r
end;\r
end;\r
- end;\r
-\r
- procedure die(i:integer);//Убить\r
- begin\r
- mob_type[i]:=M_NONE;\r
- end;\r
-\r
- procedure hit(value, i:integer);//Нанести урон\r
- var\r
- hp:integer;\r
- begin\r
- hp:=getHp(i)-value;\r
- if hp>0 then\r
- setHp(hp, i);\r
- else\r
- die(i);\r
- end;\r
-\r
- function findAndHit(value, x, y, w, h, addvx, addvy:integer):integer;\r
- var\r
- i:integer;\r
- begin\r
- for i:=0 to MAX_MOBS do\r
- if getType(i)<>M_NONE then\r
- if CollTwoObj(x, y, w, h, getX(i), getY(i), getW(i), getH(i)) then\r
- begin\r
- setVX(getVX(i)+addvx, i);\r
- setVX(getVY(i)+addvy, i);\r
- hit(value, i);\r
- findAndHit:=i;\r
- exit;\r
- end;\r
-\r
- findAndHit:=-1;\r
- end;\r
-\r
- procedure goUp(i:integer);\r
- begin\r
- loadPhy(i);\r
- phy.jumpObj(getJumpH(i));\r
- storePhy(i);\r
- end;\r
-\r
- procedure goDown(i:integer);\r
- begin\r
- \r
- end;\r
-\r
- procedure goLeft(i:integer);\r
- begin\r
- setVX(-getSpeedX(i), i);\r
- setPosi(0, i);\r
- end;\r
-\r
- procedure goRight(i:integer);\r
- begin\r
- setVX(getSpeedX(i), i);\r
- setPosi(1, i);\r
- end;\r
-\r
- function testSolid(i, vector : integer) : boolean;\r
- var\r
- x, y : integer;\r
- begin\r
- y := (getY(i) + getH(i)) / 16 - 1;\r
-\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 / 2) / 16;\r
-\r
- testSolid := phy.isSolid(x, y, getVX(i), getVY(i));\r
- end;\r
-\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
+ end;\r
\r
\r
- procedure updateZloyAiAnim(i : integer);\r
- const\r
- DEL=1;\r
- var\r
- a_a, a_d, a_f:integer;\r
- begin\r
- a_a:=mob_anim[i, 1];\r
- a_d:=mob_anim[i, 2];\r
- a_f:=mob_anim[i, 3];\r
-\r
- a_d:=a_d+1;\r
- if a_d>DEL then\r
- begin\r
- a_d:=0;\r
- a_a:=a_a+1;\r
- if a_f=1 then\r
- begin\r
- a_a:=0;\r
- a_f:=0;\r
- end;\r
- else\r
- if a_a=3 then\r
- begin\r
- a_a:=1;\r
- a_f:=1;\r
- end;\r
- end;\r
-\r
- mob_anim[i, 1]:=a_a;\r
- mob_anim[i, 2]:=a_d;\r
- mob_anim[i, 3]:=a_f;\r
- end;\r
+ procedure Step(i, vec : integer);\r
+ begin\r
+ Swim(i, vec);\r
+ if vec < 0 then\r
+ begin\r
+ mvx[i] := mvx[i] + vec;\r
+ mpos[i] := 0;\r
+ end\r
+ else if vec > 0 then\r
+ begin\r
+ mvx[i] := mvx[i] + vec;\r
+ mpos[i] := 1;\r
+ end;\r
+ end;\r
\r
\r
- procedure updateZloyAi(i : integer);\r
- var\r
- vector : integer;\r
- begin\r
- if player.getX < getX(i) then\r
- begin\r
- goLeft(i);\r
- vector := -1;\r
- end;\r
- else if player.getX > getX(i) then\r
+ procedure Jump(i, vec : integer);\r
begin\r
begin\r
- goRight(i);\r
- vector := 1;\r
+ UseObject(i);\r
+ Phy.Jump(GetJumpHeight(i));\r
+ UpdateObject(i);\r
end;\r
\r
end;\r
\r
- if vector <> 0 then\r
+ function CollisionWithPlayer(i : integer) : boolean;\r
begin\r
begin\r
- updateZloyAiAnim(i);\r
- if testSolid(i, vector) then\r
- goUp(i);\r
+ result := Phy.IntersectRects(\r
+ mx[i], my[i], GetW(i), GetH(i),\r
+ Player.GetX, Player.GetY, Player.GetW, Player.GetH\r
+ );\r
end;\r
\r
end;\r
\r
- if collideWithPlayer(i) then\r
- player.biteIt(1, vector);\r
- end;\r
+ procedure Die(i : integer);\r
+ var\r
+ x, y : integer;\r
+ begin\r
+ x := mx[i] + GetW(i) / 2;\r
+ y := my[i] + GetH(i) / 2;\r
+ if mtype[i] = zomby then begin\r
+ Drop.Create(Items.rottenMeat, x, y, Random(3));\r
+ end;\r
+ mtype[i] := none;\r
+ end;\r
\r
\r
- procedure update;\r
- var\r
- i, _type, ai:integer;\r
- begin\r
- for i:=0 to MAX_MOBS do\r
- begin\r
- _type:=getType(i);\r
-\r
- if _type<>M_NONE then\r
- begin\r
- ai:=tab_ai[_type];\r
- if ai=AI_ZLOY then\r
- updateZloyAi(i);\r
- end;\r
- end;\r
- end;\r
+ procedure Hit(i, damage : integer);\r
+ begin\r
+ mhp[i] := mhp[i] - damage;\r
+ if mhp[i] <= 0 then Die(i);\r
+ end;\r
\r
\r
- procedure updatePhy;//Обновление физики\r
- var\r
- i:integer;\r
- begin\r
- for i:=0 to MAX_MOBS do\r
- begin\r
- loadPhy(i);\r
- phy.calc(true);\r
- storePhy(i);\r
- end;\r
- end;\r
+ (** ZombyThink -- мозги зомби **)\r
+ (** ma = Кадр анимации **)\r
+ (** mb = Таймер действий **)\r
+ (** mc = Состояние **)\r
+\r
+ procedure ZombyThink(i : integer);\r
+ const\r
+ stay = 0;\r
+ walkleft = 1;\r
+ walkright = 2;\r
+ angry = 3;\r
+ const\r
+ bite = 1;\r
+ speed = 1;\r
+ walkTime = 30;\r
+ angryTime = 200;\r
+ stayTime = 300;\r
+ begin\r
+ // Debug('state: ' + mc[i] + ' / anim ' + ma[i] + ' / ticks ' + mb[i]);\r
+\r
+ mb[i] := mb[i] - 1;\r
+ if mb[i] < 0 then mb[i] := 0;\r
+ if CollisionWithPlayer(i) then Player.BiteIt(bite, mvx[i]);\r
+\r
+ (* Вижу игрока - сразу агрюсь и бегу за ним некоторое время *)\r
+ if (mpos[i] = 0) and (Player.GetX - mx[i] < 0) or (mpos[i] = 1) and (Player.GetX - mx[i] > 0) then\r
+ if Phy.RayTraced(mx[i], my[i], Player.GetX, Player.GetY) then\r
+ begin\r
+ mb[i] := angryTime;\r
+ mc[i] := angry;\r
+ end;\r
+\r
+ if mc[i] = stay then begin\r
+ ma[i] := 0;\r
+ Swim(i, 0);\r
+ if (mb[i] <= 0) and (Random(100) <= 2) then\r
+ begin\r
+ mb[i] := walkTime + Random(walkTime);\r
+ mc[i] := walkleft + Random(2); (* Случайный разворот *)\r
+ end;\r
+ end else if mc[i] = walkleft then begin\r
+ if IsSolidStep(i, -speed) then Jump(i, -speed);\r
+ Step(i, -speed);\r
+ ma[i] := (ma[i] + 1) mod lastZombyFrame;\r
+ if mb[i] <= 0 then mc[i] := stay;\r
+ end else if mc[i] = walkright then begin\r
+ if IsSolidStep(i, speed) then Jump(i, speed);\r
+ Step(i, speed);\r
+ ma[i] := (ma[i] + 1) mod lastZombyFrame;\r
+ if mb[i] <= 0 then mc[i] := stay;\r
+ end else if mc[i] = angry then begin\r
+ if mb[i] <= 0 then begin\r
+ if Phy.RayTraced(mx[i], my[i], Player.GetX, Player.GetY) then begin\r
+ (* Видижу игрока - устанавливаю время преследования *)\r
+ mb[i] := angryTime;\r
+ end else begin\r
+ (* Игрока давно не было видно - ждём его некоторое время на месте *)\r
+ mb[i] := stayTime;\r
+ mc[i] := stay;\r
+ end;\r
+ end else begin\r
+ (* Бежим за игроком *)\r
+ if Player.GetX - mx[i] < 4 then begin\r
+ if IsSolidStep(i, -speed) then Jump(i, -speed);\r
+ Step(i, -speed);\r
+ ma[i] := (ma[i] + 1) mod lastZombyFrame;\r
+ end else if Player.GetX - mx[i] > 4 then begin\r
+ if IsSolidStep(i, speed) then Jump(i, speed);\r
+ Step(i, speed);\r
+ ma[i] := (ma[i] + 1) mod lastZombyFrame;\r
+ end else begin\r
+ Swim(i, 0);\r
+ end;\r
+ end;\r
+ end;\r
+ end;\r
\r
\r
- procedure drawPart(mobtype, texid, posi, anim, x, y, camx, camy:integer);\r
- begin\r
- x:=x-tex_x[posi, mobtype, texid]-camx;\r
- y:=y-tex_y[posi, mobtype, texid]-camy;\r
+ procedure ZombyDraw(i, camx, camy : integer);\r
+ var\r
+ frame : integer;\r
+ begin\r
+ frame := zombyAnim[ma[i]];\r
+ DrawImage(zombyBody[mpos[i]], mx[i] - 6 - camx, my[i] - camy);\r
+ DrawImage(zombyLegs[mpos[i], frame], mx[i] - 2 - camx, my[i] + 20 - camy);\r
+ end;\r
\r
\r
- if CollTwoObj(x, y, tex_w[posi, mobtype, texid], tex_h[posi, mobtype, texid], 0, 0, getWidth, getHeight) then\r
- if posi=0 then\r
- drawImage(texture_left[mobtype, texid+anim], x, y);\r
- else\r
- drawImage(texture_right[mobtype, texid+anim], x, y);\r
- end;\r
+(* ============= Public ============= *)\r
\r
\r
- procedure draw(camx, camy:integer);//Отрисовка\r
- var\r
- i, j, _type:integer;\r
- begin\r
- for i:=0 to MAX_MOBS do\r
- begin\r
- _type:=mob_type[i];\r
- if _type<>M_NONE then\r
- begin\r
- for j:=0 to part_max[_type] do\r
- drawPart(_type, part_tex[_type, j], mob_posi[i], mob_anim[i, part_anim[_type, j]], mob_x[i]+part_x[_type, j], mob_y[i]+part_y[_type, j], camx, camy);\r
- end;\r
- end;\r
- end;\r
+ procedure Create(typ, x, y : integer);\r
+ var\r
+ i : integer;\r
+ begin\r
+ Assert((typ >= 0) and (typ <= lastType));\r
+ Debug('Create mob ' + typ +' @ ' + x + 'x' + y);\r
+ for i := 0 to lastMob do if mtype[i] = none then\r
+ begin\r
+ mtype[i] := typ;\r
+ mx[i] := x;\r
+ my[i] := y;\r
+ mvx[i] := 0;\r
+ mvy[i] := 0;\r
+ mpos[i] := 0;\r
+ mhp[i] := thp[typ];\r
+ mjump[i] := false;\r
+ ma[i] := 0;\r
+ mb[i] := 0;\r
+ mc[i] := 0;\r
+ debug('Created mob is ' + i);\r
+ exit;\r
+ end;\r
+ Debug('Mob type ' + typ + ' not created');\r
+ end;\r
\r
\r
- procedure loadSkin(path:string);//Загрузка текстур\r
- var\r
- im:image;\r
- begin\r
- setMaxTextures(M_ZOMBY, 5);\r
- im:=ld_tex('zombie_ani.png', path, 'mobs/');\r
- // IMG, TYPE, ID, POSI, X, Y \r
- initTexture(rotate_image_from_image(im, 6, 2, 8, 8, 0), M_ZOMBY, 0, 0, 4, 8);//head[left]\r
- initTexture(rotate_image_from_image(im, 8, 10, 4, 12, 0), M_ZOMBY, 1, 0, 2, 0);//body[left]\r
- initTexture(rotate_image_from_image(im, 0, 10, 12, 4, 0), M_ZOMBY, 2, 0, 10, 2);//hands[left]\r
- initTexture(rotate_image_from_image(im, 0, 52, 12, 12, 0), M_ZOMBY, 3, 0, 6, 0);//legs[left]\r
- initTexture(rotate_image_from_image(im, 13, 52, 12, 12, 0), M_ZOMBY, 4, 0, 6, 0);\r
- initTexture(rotate_image_from_image(im, 26, 52, 12, 12, 0), M_ZOMBY, 5, 0, 6, 0);\r
-\r
- initTexture(rotate_image_from_image(im, 27, 2, 8, 8, 0), M_ZOMBY, 0, 1, 4, 8);//head[right]\r
- initTexture(rotate_image_from_image(im, 29, 10, 4, 12, 0), M_ZOMBY, 1, 1, 2, 0);//body[right]\r
- initTexture(rotate_image_from_image(im, 29, 10, 12, 4, 0), M_ZOMBY, 2, 1, 2, 2);//hands[right]\r
- initTexture(rotate_image_from_image(im, 39, 52, 12, 12, 0), M_ZOMBY, 3, 1, 6, 0);//legs[right]\r
- initTexture(rotate_image_from_image(im, 52, 52, 12, 12, 0), M_ZOMBY, 4, 1, 6, 0);\r
- initTexture(rotate_image_from_image(im, 65, 52, 12, 12, 0), M_ZOMBY, 5, 1, 6, 0);\r
- end;\r
+ function FindAndHit(damage, x, y, w, h, addvx, addvy : integer) : integer;\r
+ var\r
+ i : integer;\r
+ begin\r
+ for i := 0 to lastMob do if mtype[i] <> none then\r
+ if Phy.IntersectRects(x, y, w, h, mx[i], my[i], GetW(i), GetH(i)) then\r
+ begin\r
+ mvx[i] := mvx[i] + addvx;\r
+ mvy[i] := mvy[i] + addvy;\r
+ Hit(i, damage);\r
+ FindAndHit := i;\r
+ exit;\r
+ end;\r
+ FindAndHit := -1;\r
+ end;\r
\r
\r
- procedure freeSkin;//Выгрузка текстур\r
- var\r
- i, j, len:integer;\r
- nullimg:image;\r
- begin\r
- for i:=0 to MOB_TYPES do\r
- begin\r
- bytecode\r
- getstatic field 'mob', 'texture_left', '[[Ljavax/microedition/lcdui/Image;';\r
- iload_0;//i\r
- aaload;\r
- arraylength;\r
- iconst_1;\r
- isub;\r
- istore_2;//len\r
- end;\r
- for j:=0 to len do\r
- begin\r
- texture_left[i, j]:=nullimg;\r
- texture_right[i, j]:=nullimg;\r
- end;\r
- end;\r
- end;\r
+ procedure Update;\r
+ var\r
+ i, typ : integer;\r
+ begin\r
+ for i := 0 to lastMob do if mtype[i] <> none then\r
+ begin\r
+ typ := mtype[i];\r
+ if typ = zomby then ZombyThink(i);\r
+ if mhp[i] <= 0 then Die(i);\r
+ end;\r
+ end;\r
\r
\r
- procedure saveData;//Сохранение всех данных\r
- begin\r
+ procedure UpdatePhy;\r
+ var\r
+ i : integer;\r
+ begin\r
+ for i := 0 to lastMob do\r
+ begin\r
+ UseObject(i);\r
+ Phy.Step(true);\r
+ UpdateObject(i);\r
+ end;\r
+ end;\r
\r
\r
- end;\r
+ procedure Draw(camx, camy:integer);\r
+ var\r
+ i, typ : integer;\r
+ begin\r
+ for i := 0 to lastMob do if mtype[i] <> none then\r
+ begin\r
+ typ := mtype[i];\r
+ if typ = zomby then ZombyDraw(i, camx, camy);\r
+ //SetColor(0, 0, 255);\r
+ //DrawRect(mx[i] - camx, my[i] - camy, GetW(i) - 1, GetH(i) - 1);\r
+ end;\r
+ end;\r
\r
\r
- procedure loadData;//Загрузка всех данных\r
- begin\r
+ procedure LoadTextures(path : string);\r
+ var\r
+ im : image;\r
+ begin\r
+ im := ld_tex('zombie_ani.png', path, 'mobs/');\r
+ zombyBody[0] := rotate_image_from_image(im, 0, 0, 20, 22, 0);\r
+ zombyBody[1] := rotate_image_from_image(im, 21, 0, 20, 22, 0);\r
+ zombyLegs[0, 0] := rotate_image_from_image(im, 0, 52, 12, 12, 0);\r
+ zombyLegs[0, 1] := rotate_image_from_image(im, 13, 52, 12, 12, 0);\r
+ zombyLegs[0, 2] := rotate_image_from_image(im, 26, 52, 12, 12, 0);\r
+ zombyLegs[1, 0] := rotate_image_from_image(im, 39, 52, 12, 12, 0);\r
+ zombyLegs[1, 1] := rotate_image_from_image(im, 52, 52, 12, 12, 0);\r
+ zombyLegs[1, 2] := rotate_image_from_image(im, 65, 52, 12, 12, 0);\r
+ end;\r
\r
\r
- end;\r
+ procedure FreeTextures;\r
+ var\r
+ i, j : integer;\r
+ nullimg : image;\r
+ begin\r
+ for i := 0 to 1 do\r
+ begin\r
+ zombyBody[i] := nullimg;\r
+ for j := 0 to 2 do zombyLegs[i, j] := nullimg;\r
+ end;\r
+ end;\r
\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
+ procedure SaveData;\r
+ var\r
+ i : integer;\r
+ begin\r
+ for i := 0 to lastMob do\r
+ begin\r
+ write_byte(mtype[i]);\r
+ writeint(mx[i]);\r
+ writeint(my[i]);\r
+ writeint(mvx[i]);\r
+ writeint(mvy[i]);\r
+ write_byte(mpos[i]);\r
+ writeint(mhp[i]);\r
+ writebool(mjump[i]);\r
+ writeint(ma[i]);\r
+ writeint(mb[i]);\r
+ writeint(mc[i]);\r
+ end;\r
+ end;\r
+\r
+ procedure LoadData;\r
+ var\r
+ i : integer;\r
+ begin\r
+ for i := 0 to lastMob do\r
+ begin\r
+ mtype[i] := read_byte;\r
+ mx[i] := readint;\r
+ my[i] := readint;\r
+ mvx[i] := readint;\r
+ mvy[i] := readint;\r
+ mpos[i] := read_byte;\r
+ mhp[i] := readint;\r
+ mjump[i] := readbool;\r
+ ma[i] := readint;\r
+ mb[i] := readint;\r
+ mc[i] := readint;\r
+ end;\r
+ end;\r
+\r
+ procedure ResetData;\r
+ var\r
+ i : integer;\r
+ begin\r
+ for i := 0 to lastMob do\r
+ begin\r
+ mtype[i] := none;\r
+ mx[i] := 0;\r
+ my[i] := 0;\r
+ mvx[i] := 0;\r
+ mvy[i] := 0;\r
+ mpos[i] := 0;\r
+ mhp[i] := 0;\r
+ mjump[i] := false;\r
+ ma[i] := 0;\r
+ mb[i] := 0;\r
+ mc[i] := 0;\r
+ end;\r
end;\r
\r
initialization\r
end;\r
\r
initialization\r
- // TYPE W H HP SX JH, AI_TYPE\r
- initTab(M_NONE, 0, 0, 0, 0, 0, AI_NONE);\r
- setMaxParts(M_NONE, -1);\r
-\r
- initTab(M_ZOMBY, 8, 32, 10, 1, 7, AI_ZLOY);\r
- setMaxParts(M_ZOMBY, 3);\r
- // TYPE PART, TEX, X, Y ANIM\r
- initPart(M_ZOMBY, 0, 0, 4, 8, 0);//Head\r
- initPart(M_ZOMBY, 1, 1, 4, 8, 0);//Body\r
- initPart(M_ZOMBY, 2, 2, 4, 10, 0);//Hands\r
- initPart(M_ZOMBY, 3, 3, 4, 20, 1);//Legs\r
+ InitTab(none, 0, 0, 0, 0);\r
+ InitTab(zomby, 8, 32, 10, 7);\r
+\r
+ zombyAnim[0] := 0;\r
+ zombyAnim[1] := 0;\r
+ zombyAnim[2] := 0;\r
+ zombyAnim[3] := 1;\r
+ zombyAnim[4] := 1;\r
+ zombyAnim[5] := 1;\r
+ zombyAnim[6] := 2;\r
+ zombyAnim[7] := 2;\r
+ zombyAnim[8] := 2;\r
+ zombyAnim[9] := 1;\r
+ zombyAnim[10] := 1;\r
+ zombyAnim[11] := 1;\r
end.\r
end.\r