From 50f600f7f009b6a1aff9e37a176a76bb7e98277c Mon Sep 17 00:00:00 2001 From: Sergiy Tkach Date: Mon, 5 Mar 2018 23:30:38 +0200 Subject: [PATCH] Day 3. --- CLEAN.bat | 3 +- README.md | 14 +- resources/chest.png | Bin 2165 -> 913 bytes resources/dirt.png | Bin 0 -> 1290 bytes resources/mountain.png | Bin 0 -> 1897 bytes screenshots/screenshot_day_3.png | Bin 0 -> 49888 bytes sources/DisciplesRL.City.pas | 121 +++++++++++++++++ sources/DisciplesRL.MainForm.dfm | 6 +- sources/DisciplesRL.MainForm.pas | 7 +- sources/DisciplesRL.Map.pas | 102 ++++++++++---- sources/DisciplesRL.Party.pas | 9 +- sources/DisciplesRL.PathFind.pas | 217 ++++++++++++++++++++++++++++++ sources/DisciplesRL.Player.pas | 65 +++++++-- sources/DisciplesRL.Resources.pas | 18 ++- sources/DisciplesRL.Scene.Map.pas | 53 +++++--- sources/DisciplesRL.Utils.pas | 16 +-- sources/DisciplesRL.dpr | 4 +- sources/DisciplesRL.dproj | 2 + 18 files changed, 551 insertions(+), 86 deletions(-) create mode 100644 resources/dirt.png create mode 100644 resources/mountain.png create mode 100644 screenshots/screenshot_day_3.png create mode 100644 sources/DisciplesRL.City.pas create mode 100644 sources/DisciplesRL.PathFind.pas diff --git a/CLEAN.bat b/CLEAN.bat index 2551b71..bce4737 100644 --- a/CLEAN.bat +++ b/CLEAN.bat @@ -9,5 +9,6 @@ del /s *.otares del /s *.local del /s *.cfg del /s *.ddp -del /s *.o del /s *.a +del /S *.*proj.local +del /S *.tvsconfig diff --git a/README.md b/README.md index 596602e..2fc3404 100644 --- a/README.md +++ b/README.md @@ -2,31 +2,31 @@ Simple roguelike game based on Disciples. ## Screenshots -### Day 1 +### Day 1 [3.03.2018] ![screenshot](https://github.com/devapromix-roguelikes/disciplesrl/blob/master/screenshots/screenshot_day_1.png) - ### Day 2 + ### Day 2 [4.03.2018] ![screenshot](https://github.com/devapromix-roguelikes/disciplesrl/blob/master/screenshots/screenshot_day_2.png) - ### Day 3 + ### Day 3 [5.03.2018] ![screenshot](https://github.com/devapromix-roguelikes/disciplesrl/blob/master/screenshots/screenshot_day_3.png) - ### Day 4 + ### Day 4 [6.03.2018] ![screenshot](https://github.com/devapromix-roguelikes/disciplesrl/blob/master/screenshots/screenshot_day_4.png) -### Day 5 +### Day 5 [7.03.2018] ![screenshot](https://github.com/devapromix-roguelikes/disciplesrl/blob/master/screenshots/screenshot_day_5.png) -### Day 6 +### Day 6 [8.03.2018] ![screenshot](https://github.com/devapromix-roguelikes/disciplesrl/blob/master/screenshots/screenshot_day_6.png) -### Day 7 +### Day 7 [9.03.2018] ![screenshot](https://github.com/devapromix-roguelikes/disciplesrl/blob/master/screenshots/screenshot_day_7.png) diff --git a/resources/chest.png b/resources/chest.png index 3c7500ff7242dd7fcaa1036e7ade47e672a9a4c3..bbf1339c48101bc986238ea98b6adc1742c0bc95 100644 GIT binary patch delta 901 zcmV;01A6@R5RnIv8Gi-<0047(dh`GQ16WB!K~#90?UGMSn{^n+cY(3~dD}q?rT-zN z^bc)nM+=m)wX|hWftA9#(Ka}=Ze;-n#Nk}jyh}FcpJ*DRBT+CjaT;}*n=zUg-GPHA zZzdk}>cM#8#_{8?6}@_RFCO|$zImQJ&oA%ud7t0!$dRU+YJaM!rkZN1ssFnwm5My^ zlI{^XSu$*x%n*4zRns%hMODTnJmZF*(4^>;P}h1bJuf3Eme#yXT|aEsgN; z(kS{jB|b?n=!|s?K~fMay{WfPWN+b(#LCJGq>xW z@^fp#!*n`9EEZD^FgrWTiRdty9*Hxa4ssp?d9RUzzmvs)iBix+`Ox*eShskv6Y(LE z$)s|Cm4B5LW^#ElPAz#)JM&%x3*L@Ko)PZR4PR#lTi*33491&6~yUteFN9|!~pg?~cI0aPkAk|d#4ss6TFjYia3TaOa* z^^4<Oh+Ajpp!-8kLBWRx4^+otVsK!X`BdyOvXSiE*cd`*<53g9@Kfg}eP2 zS=VurqMmiNGwssTYqw!GcPj@l8jW&%&Ki{V$3Gt5dagtda(^1CrldRqBm^O5EU>( zW;I@SA1;?mIe<>5L(=K#RJCA}j$+cZVi(bHtc6~E8&2VFQLFc?+E&bUYg*_u7%&L` b*Z2Pd!FQxmo&$Z600000NkvXXu0mjf^8~pj delta 2163 zcmV-(2#oiU2lWt;8Gix*008_L?V|ty00wkYPE!B?00000Zl(v3000OoNkle256;?48k+n-tdXnDLzFM+2Yu_zd)@Iq3EG!!vn}Amt3$GYsI|Qe7paCW3K3xrhn;7)An!Ad~@d9`|ds8 zIrrRiB@*fX^6zB(_U-G}ukY;aw0HtZC38=zYA#W=J8qayn~vsPXExVdD<*$2)%@8@ z8$N%z^Yc9$Z_jst{mJfD(6{F|e(}Rif7-w0-mAS|9vS#*p>Y5B(A_;9Ij?bWbUXNL zZEYppym@oqzJGo5^Yh83oDZX=6s)9*n^1D<)!eL(*H*>vG^5>C;h;mb%?S_|9fG1A z-D=}+v+;)=f)S^1%q^PmV3S^a(kGtsiwDiDCSUc!@i+JH-w$p{j~+d`bm`Ld>(|?! z?{TB+-fDLpYjeGpcfQ%~S?a5Oe>DBOUHLEec746j|9{uxLl1sb1pSxS2ftbvAaJzs z_0hsN&){!w6hC{RITLbyeCzhrt5?sTKTi3lJnpzpFUm2}`e>Al`l3X56-5B|2{A@hE)a4q@C;t59H}~${ zyL0CbL4U9+Tec26IHa?i{3knoCpx^K&uk7Y^+et+M1N9Dz-GerNDBPEw=MZzF#*O0 zV+|ipHvMX6^KWNcK7O(F=I*vzKj^sD7aZT1ed?BU|Ni|eSFWtAtfZRrPCofUcWCkX zz^N|(;-H5Yp$mkYJmw#JvYC09o3e}6vS@Zm(`FDEmvCUSj zyIRy|!v-B#(TNYc@NutX(kGenOLqpOQ-0abfNVPW6fpVt(@ao0VnZ?>b7xNhvrS}xW#c}#7awg7?0;~_y7PNy>-k84cTUW`6htC|g~ zW}aZWMhSX0qF%*JSUp_>lf;4Uc!W5Htv^>d!-XT>5iacwnnu(ss)d)q>bS2NX~Y2 zy&bTS1K5r#Vx9EV^oi*!h=!07}bZ<{5UNnVbn+&wNhqO#*E2W2{|jFAP|$Y>SQoU ze2U1J5zrVVZB->2vp@i)B@GM=tbgVr)9RtfTU~gc1MjtCpa-1df>W~9B^mNahrRL< zfKNW^lZ_I(WP4>}KKYnm@f70$#fS?}nq+}!914(1rAWJW?K*t;@Y2$fD;Re0$Q=f5 zn*muxYe{d=bK9zT?FOX1iq~P}Z(P+TwDSoz8u=YnJkYCX)6la{-OC3KLVp8Xym*n+ z)z#%J39i)m#f+q!o>s9NHS8uW7tpBTW^~*J4Lhl1)vMSk6+5ja?3kPhhXXne2c={K z;xMCR!%RlS2x~E$$M5xei5i5%VVlhcS1O%OLp_FuhT!45aN)wabLZYJ2_!c+HwU-* z#EBCRA3lT^=EjX1hYlU;>3``tSdzuXMOeSO7(zaM`t*(+J1Q$H;qEjxHWCDZKmg7Q z#%{OUTN1FL@-T$VLM0K4#naQ%(C}~_T3T9$hlgo2nnt5htJReyfe@>oh}CKZC*Tv- zlk9do?1w?1BvAUmGXnDvK_n6p3WfQ69u|XNn91dGFr!kbfIwdocz+HcEbt2+{3U_y zu~>|x)oO7Zht*szm(S-5N+NtlP!wge*`PC-41|Ut2=IYTr_)(17Kg)ujYvtr7KucX zXGAKM!jIA z0G4V6Obq4mg(AHI_kZ9Fm=OsDywXZOv4sZ)58(oY0#q!H7M9TPfXc`U$E-qZ~L+*-EA29|SZO2cwbU*$PP+5V(#@fxZQT zIvLA@5d>`pUVlhJk11F{%wD%_|@LC|0vYZYHis|sWKyPUs1OfJ`Ps69NI9%_Ru1|CvBU pkqZ!q%OjV|O(xTS&}jc1{tmU^$N^|~dW`@8002ovPDHLkV1g2!3?~2p diff --git a/resources/dirt.png b/resources/dirt.png new file mode 100644 index 0000000000000000000000000000000000000000..505e11fadb651eee44ead607358b84ae0af941a8 GIT binary patch literal 1290 zcmV+l1@-!gP)6ciK{6%`g178e&67#J8C85tTH8XFrM92^`S9UUGX9v>ecARr(iAt53nA|oRs zBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7EiEoCE-x=HFfcGNF)=bSGBYzXG&D3d zH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}?K0iM{KtMo2K|w-7LPJACL_|bIMMXwN zMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuyP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7 zSXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?WjVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@ zX=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2Ta&vQYbaZreb#-=jc6WDoczAeud3kzz zdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyDgoK2Jg@uNOhKGlTh=_=ZiHVAeii?Yj zjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z}m6ev3mY0{8n3$NEnVFiJnwy)OoSdAU zot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5(rl+T;sHmu^si~@}s;jH3tgNi9t*x%E zuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#pxVX5vxw*Q!y1To(yu7@dCU$jHda$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD) z(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa z^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg={r&#_{{R2~;;>zP00009a7bBm000ie z000ie0hKEb8vpf3dk~u=g(k%Ti<+ zwroB=G1dL1kL`gLaT@KMrxdP(8m|S`WL5Pc*_mqc90oHkBgQ4~MFm8JSjxRbkD*YF zL+v!y3pG3L+nTmwU{!T^EKBfDs$m@7YN$6$?csrXdU*3aY*f>68P)6q;ix^3zWMs0 z=>yfYfA;B=E#X2qY7b3cD_=tEY3&wWrXs>odx&0$ThE-s=pz*k?fDRs5VxK&;%E*k zO6~dN0}HmT=ka>tPDQ3YA1boo{I+x_1haa`h6P9UZn62mtO&`n;A8Jo2^VHvpcEFo z-}_XYV%8r}l?7Ydr&5G<1JpRO6MZU5ST}favJ-tOD6GHm;$$cKRFbf+;3-n#ME}7y zg&#-+6iqUh_Q`xlNU_N1j;<`DL=Fiknz~cTvTpDM5l!8xQY3PQAfl-|rK&_O|BsYE z^Q$FtZ%EfXbf;34$equ6d(@o@Ng{U+o~~+KL=8vo96Vj8*?Z@_!RxR}$w`|0s10D?Iw+J=G8b4&==wO3VyWC@@kxiKkzi38jC+6Z~y=R07*qoM6N<$g2F9l A5dZ)H literal 0 HcmV?d00001 diff --git a/resources/mountain.png b/resources/mountain.png new file mode 100644 index 0000000000000000000000000000000000000000..c6808fa48f7a5a70dd58e6060c3a8b07d3b54692 GIT binary patch literal 1897 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
C#4bGsE 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 0) and (X < MapWidth) and (Y >= 0) and (Y < MapHeight); end; +procedure UpdateRadius(const AX, AY, AR: Integer; var MapLayer: TMapLayer; const AResEnum: TResEnum; + IgnoreRes: TIgnoreRes = []); +var + X, Y: Integer; +begin + for Y := -AR to AR do + for X := -AR to AR do + if (GetDist(AX + X, AY + Y, AX, AY) <= AR) and DisciplesRL.Map.InMap(AX + X, AY + Y) then + if (MapLayer[AX + X, AY + Y] in IgnoreRes) then + Continue + else + MapLayer[AX + X, AY + Y] := AResEnum; +end; + end. diff --git a/sources/DisciplesRL.Party.pas b/sources/DisciplesRL.Party.pas index 60bf610..dd16262 100644 --- a/sources/DisciplesRL.Party.pas +++ b/sources/DisciplesRL.Party.pas @@ -5,7 +5,7 @@ interface uses DisciplesRL.Creatures; type - TRace = (rcTheEmpire, rcNeutrals); + TRaceEnum = (reTheEmpire, reNeutrals); type TPosition = 0 .. 5; @@ -13,7 +13,7 @@ interface type TParty = class(TObject) private - FOwner: TRace; + FOwner: TRaceEnum; FCreature: array [TPosition] of TCreature; procedure AddCreature(const ACreatureEnum: TCreatureEnum; const APosition: TPosition); function GetCreature(APosition: TPosition): TCreature; @@ -21,7 +21,7 @@ TParty = class(TObject) public constructor Create; destructor Destroy; override; - property Owner: TRace read FOwner write FOwner; + property Owner: TRaceEnum read FOwner write FOwner; property Creature[APosition: TPosition]: TCreature read GetCreature write SetCreature; procedure Clear; function Hire(const ACreatureEnum: TCreatureEnum; const APosition: TPosition): Boolean; @@ -52,7 +52,7 @@ procedure TParty.Clear; constructor TParty.Create; begin Self.Clear; - Owner := rcNeutrals; + Owner := reNeutrals; end; destructor TParty.Destroy; @@ -125,5 +125,4 @@ procedure TParty.UpdateHP(const AHitPoints: Integer; const APosition: TPosition) HitPoints := MaxHitPoints; end; - end. diff --git a/sources/DisciplesRL.PathFind.pas b/sources/DisciplesRL.PathFind.pas new file mode 100644 index 0000000..dc256a8 --- /dev/null +++ b/sources/DisciplesRL.PathFind.pas @@ -0,0 +1,217 @@ +unit DisciplesRL.PathFind; + +interface + +uses DisciplesRL.Map; + +type + TGetXYVal = function(X, Y: Integer): Boolean; stdcall; + +function PathFind(FromX, FromY, ToX, ToY: Integer; Callback: TGetXYVal; + var TargetX, TargetY: Integer): Boolean; + +implementation + +uses Math; + +const + MAXLEN = 1000; + KNORM = 10; + KDIAG = 12; + +type + TUIntPoint = record + X, Y: Word; + end; + +type + TPathFindBlock = record + CostWay: Integer; + Parent: TUIntPoint; + end; + +type + TOpenBlock = record + Cost, X, Y: Integer; + end; + + POpenBlock = ^TOpenBlock; + + TPathFindMap = array of TPathFindBlock; + +var + Cells: TPathFindMap; + FAULT: Integer; + SavedMapX, SavedMapY: Integer; + Open: array [0 .. MAXLEN] of POpenBlock; + OpenRaw: array [0 .. MAXLEN] of TOpenBlock; + +procedure InitCrap; +var + I: Integer; +begin + for I := 0 to MAXLEN do + Open[I] := @OpenRaw[I]; +end; + +function Heuristic(dx, dy: Integer): Integer; +begin + Result := KNORM * Max(dx, dy) + (KDIAG - KNORM) * Min(dx, dy); +end; + +var + NOpen: Integer = 0; + +function PathFind(FromX, FromY, ToX, ToY: Integer; Callback: TGetXYVal; + var TargetX, TargetY: Integer): Boolean; + + procedure HeapSwap(I, j: Integer); + var + tmp: POpenBlock; + begin + tmp := Open[I]; + Open[I] := Open[j]; + Open[j] := tmp; + end; + + procedure HeapAdd; + var + I, Parent: Integer; + begin + I := NOpen - 1; + Parent := (I - 1) div 2; + while (I > 0) and (Open[Parent].Cost > Open[I].Cost) do + begin + HeapSwap(I, Parent); + I := Parent; + Parent := (I - 1) div 2; + end; + end; + + procedure Heapify(I: Integer); + var + leftChild, rightChild, largestChild: Integer; + begin + repeat + leftChild := 2 * I + 1; + if leftChild >= NOpen then + exit; + rightChild := leftChild + 1; + largestChild := I; + if Open[leftChild].Cost < Open[largestChild].Cost then + largestChild := leftChild; + if (rightChild < NOpen) and (Open[rightChild].Cost < Open[largestChild].Cost) then + largestChild := rightChild; + if largestChild = I then + exit; + HeapSwap(I, largestChild); + I := largestChild; + until false; + end; + + procedure AddToOpen(X, Y, FrX, FrY, NewCost: Integer); + begin + if not InRange(X, 0, MapWidth - 1) then + exit; + if not InRange(Y, 0, MapHeight - 1) then + exit; + with Cells[X * MapHeight + Y] do + begin + if CostWay > 0 then // if OpenID > 0 then + begin + // if CostWay <= NewCost then + exit; + end; + if not Callback(X, Y) then + exit; + if NOpen >= MAXLEN then + exit; + Open[NOpen].X := X; + Open[NOpen].Y := Y; + // TODO?? + CostWay := NewCost; + Open[NOpen].Cost := CostWay + Heuristic(abs(X - FromX), abs(Y - FromY)); + Inc(NOpen); + HeapAdd; + Parent.X := FrX; + Parent.Y := FrY; + end; + end; + +var + CurX, CurY: Integer; +begin + Result := false; + if not InRange(ToX, 0, MapWidth - 1) then + exit; + if not InRange(ToY, 0, MapHeight - 1) then + exit; + if not Callback(ToX, ToY) then + exit; + // if not Callback(FromX, FromY) then exit; + if (FromX = ToX) and (FromY = ToY) then + begin + Result := True; + TargetX := ToX; + TargetY := ToY; + exit; + end; + + if (SavedMapX <> MapWidth) or (SavedMapY <> MapHeight) then + begin + SetLength(Cells, 0); + SetLength(Cells, MapWidth * MapHeight); + SavedMapX := MapWidth; + SavedMapY := MapHeight; + end + else + begin + FillChar(Pointer(Cells)^, MapWidth * MapHeight * Sizeof(Cells[0]), 0); + end; + // exit; + + NOpen := 0; + // FillChar(Cells, SizeOf(Cells), 0); + AddToOpen(ToX, ToY, -1, -1, 0); + repeat + CurX := Open[0].X; + CurY := Open[0].Y; + if (CurX = FromX) and (CurY = FromY) then + begin + Result := True; + // Inc(TOTAL, Open[0].Cost); + with Cells[CurX * MapHeight + CurY] do + begin + TargetX := Parent.X; + TargetY := Parent.Y; + end; + exit; + end; + with Cells[CurX * MapHeight + CurY] do + begin + // IsClosed := True; + // inc(CHECKED); + HeapSwap(0, NOpen - 1); + // Open[0] := Open[NOpen-1]; + Dec(NOpen); + Heapify(0); + AddToOpen(CurX - 1, CurY, CurX, CurY, CostWay + KNORM); + AddToOpen(CurX, CurY - 1, CurX, CurY, CostWay + KNORM); + AddToOpen(CurX, CurY + 1, CurX, CurY, CostWay + KNORM); + AddToOpen(CurX + 1, CurY, CurX, CurY, CostWay + KNORM); + AddToOpen(CurX - 1, CurY - 1, CurX, CurY, CostWay + KDIAG); + AddToOpen(CurX - 1, CurY + 1, CurX, CurY, CostWay + KDIAG); + AddToOpen(CurX + 1, CurY - 1, CurX, CurY, CostWay + KDIAG); + AddToOpen(CurX + 1, CurY + 1, CurX, CurY, CostWay + KDIAG); + if NOpen > FAULT then + FAULT := NOpen; + end; + until NOpen <= 0; + Result := false; +end; + +initialization + +InitCrap; + +end. diff --git a/sources/DisciplesRL.Player.pas b/sources/DisciplesRL.Player.pas index 435ed63..c24842c 100644 --- a/sources/DisciplesRL.Player.pas +++ b/sources/DisciplesRL.Player.pas @@ -5,34 +5,75 @@ interface type TPlayer = record X, Y: Integer; - Rad: Integer; + Radius: Integer; + Turn: Integer; end; var Player: TPlayer; procedure Init; -procedure RefreshRad; +procedure Move(const AX, AY: ShortInt); +procedure PutAt(const AX, AY: ShortInt); +procedure RefreshRadius; implementation -uses DisciplesRL.Map, DisciplesRL.Resources, DisciplesRL.Utils; +uses DisciplesRL.Map, DisciplesRL.Resources, DisciplesRL.Utils, DisciplesRL.City, DisciplesRL.Party; procedure Init; begin - Player.Rad := 2; - RefreshRad; + Player.Turn := 0; + Player.Radius := 41; + RefreshRadius; end; -procedure RefreshRad; +procedure Move(const AX, AY: ShortInt); +begin + PutAt(Player.X + AX, Player.Y + AY); +end; + +procedure PutAt(const AX, AY: ShortInt); var - X, Y: Integer; + X, Y, I: Integer; +begin + if not InMap(AX, AY) then Exit; + if (MapObj[AX, AY] = reMountain) then Exit; + Inc(Player.Turn); + for I := 0 to High(City) do + begin + if (City[I].Owner = reTheEmpire) then + if (City[I].CurLevel < City[I].MaxLevel) then + begin + Inc(City[I].CurLevel); + DisciplesRL.City.UpdateRadius(I); + end; + end; + Player.X := AX; + Player.Y := AY; + RefreshRadius; + case MapObj[Player.X, Player.Y] of + reBag: + begin + MapObj[Player.X, Player.Y] := reNone; + end; + reEnemies: + begin + MapObj[Player.X, Player.Y] := reNone; + end; + end; + case MapTile[Player.X, Player.Y] of + reNeutralCity: + begin + MapTile[Player.X, Player.Y] := reEmpireCity; + DisciplesRL.City.UpdateRadius(DisciplesRL.City.GetCityIndex(Player.X, Player.Y)); + end; + end; +end; + +procedure RefreshRadius; begin - for Y := -(Player.Rad + 2) to Player.Rad + 2 do - for X := -(Player.Rad + 2) to Player.Rad + 2 do - if (Utils.GetDist(Player.X + X, Player.Y + Y, Player.X, Player.Y) <= Player.Rad) and - DisciplesRL.Map.InMap(Player.X + X, Player.Y + Y) then - MapDark[Player.X + X, Player.Y + Y] := reNone; + DisciplesRL.Map.UpdateRadius(Player.X, Player.Y, Player.Radius, MapDark, reNone); end; end. diff --git a/sources/DisciplesRL.Resources.pas b/sources/DisciplesRL.Resources.pas index 3cde834..5f886ea 100644 --- a/sources/DisciplesRL.Resources.pas +++ b/sources/DisciplesRL.Resources.pas @@ -5,10 +5,12 @@ interface uses Vcl.Imaging.PNGImage; type - TResEnum = (reNone, reGrass, reUnk, reEnemies, reCursor, rePlayer, reDark, reBag, reCity, reCapital); + TResEnum = (reNone, reNeutral, reEmpireTerrain, reUnk, reEnemies, reCursor, + rePlayer, reDark, reBag, reNeutralCity, reEmpireCity, reEmpireCapital, reMountain); type - TResTypeEnum = (teNone, teTile, teGUI, tePath, teObject, teEnemy, teBag, teCapital, teCity, teRuin); + TResTypeEnum = (teNone, teTile, teGUI, tePath, teObject, teEnemy, teBag, + teCapital, teCity, teRuin); type TResBase = record @@ -20,7 +22,9 @@ TResBase = record ResBase: array [TResEnum] of TResBase = ( // None (FileName: ''; ResType: teNone;), - // Grass + // Neutral + (FileName: 'dirt.png'; ResType: teTile;), + // Empire terrain (FileName: 'grass.png'; ResType: teTile;), // Unknown (?) (FileName: 'unknown.png'; ResType: teGUI;), @@ -36,8 +40,12 @@ TResBase = record (FileName: 'chest.png'; ResType: teBag;), // City (FileName: 'city.png'; ResType: teCity;), + // City + (FileName: 'city.png'; ResType: teCity;), // Capital - (FileName: 'castle.png'; ResType: teCapital;) + (FileName: 'castle.png'; ResType: teCapital;), + // Mountain + (FileName: 'mountain.png'; ResType: teObject;) // ); @@ -59,7 +67,7 @@ procedure Init; begin ResImage[I] := TPNGImage.Create; if (ResBase[I].FileName <> '') then - ResImage[I].LoadFromFile(Utils.GetPath('resources') + ResBase[I].FileName); + ResImage[I].LoadFromFile(GetPath('resources') + ResBase[I].FileName); end; end; diff --git a/sources/DisciplesRL.Scene.Map.pas b/sources/DisciplesRL.Scene.Map.pas index 9946f47..818f4a0 100644 --- a/sources/DisciplesRL.Scene.Map.pas +++ b/sources/DisciplesRL.Scene.Map.pas @@ -18,6 +18,12 @@ implementation DisciplesRL.Player, DisciplesRL.Utils; +const + K_RIGHT = 39; + K_LEFT = 37; + K_DOWN = 40; + K_UP = 38; + var LastMousePos, MousePos: TPoint; @@ -41,19 +47,28 @@ procedure Render; begin if (MapDark[X, Y] = reDark) then Continue; - DrawImage(X, Y, ResImage[reGrass]); - F := (Utils.GetDist(X, Y, Player.X, Player.Y) > Player.Rad) and (MapDark[X, Y] = reNone); + case MapTile[X, Y] of + reEmpireTerrain, reEmpireCapital, reEmpireCity: + DrawImage(X, Y, ResImage[reEmpireTerrain]); + else + DrawImage(X, Y, ResImage[reNeutral]); + end; + F := (GetDist(X, Y, Player.X, Player.Y) > Player.Radius) and + not(MapTile[X, Y] in [reEmpireTerrain, reEmpireCapital, reEmpireCity]) and (MapDark[X, Y] = reNone); + // Capital and Cities + if (ResBase[MapTile[X, Y]].ResType in [teCapital, teCity]) then + DrawImage(X, Y, ResImage[MapTile[X, Y]]); // - if (ResBase[MapTile[X, Y]].ResType in [teEnemy, teBag]) then + if (ResBase[MapObj[X, Y]].ResType in [teEnemy, teBag]) then if F then DrawImage(X, Y, ResImage[reUnk]) else - DrawImage(X, Y, ResImage[MapTile[X, Y]]); - if (ResBase[MapTile[X, Y]].ResType in [teCapital, teCity, teObject]) then - DrawImage(X, Y, ResImage[MapTile[X, Y]]); - // Leader - if (X = Player.X) and (Y = Player.Y) then - DrawImage(X, Y, ResImage[rePlayer]); + DrawImage(X, Y, ResImage[MapObj[X, Y]]) + else if (MapObj[X, Y] <> reNone) then + DrawImage(X, Y, ResImage[MapObj[X, Y]]); + // Leader + if (X = Player.X) and (Y = Player.Y) then + DrawImage(X, Y, ResImage[rePlayer]); // Fog if F then DrawImage(X, Y, ResImage[reDark]); @@ -70,14 +85,7 @@ procedure Timer; procedure MouseClick; begin if DisciplesRL.Map.InMap(MousePos.X, MousePos.Y) then - begin - Player.X := MousePos.X; - Player.Y := MousePos.Y; - DisciplesRL.Player.RefreshRad; - if (MapTile[Player.X, Player.Y] in [reBag, reEnemies]) then - MapTile[Player.X, Player.Y] := reNone; - - end; + DisciplesRL.Player.PutAt(MousePos.X, MousePos.Y); end; procedure MouseMove(Shift: TShiftState; X, Y: Integer); @@ -93,7 +101,16 @@ procedure MouseMove(Shift: TShiftState; X, Y: Integer); procedure KeyDown(var Key: Word; Shift: TShiftState); begin - + case Key of + K_UP: + DisciplesRL.Player.Move(0, -1); + K_DOWN: + DisciplesRL.Player.Move(0, 1); + K_LEFT: + DisciplesRL.Player.Move(-1, 0); + K_RIGHT: + DisciplesRL.Player.Move(1, 0); + end; end; procedure Free; diff --git a/sources/DisciplesRL.Utils.pas b/sources/DisciplesRL.Utils.pas index 351619a..8b1292f 100644 --- a/sources/DisciplesRL.Utils.pas +++ b/sources/DisciplesRL.Utils.pas @@ -5,30 +5,26 @@ interface uses Forms; -type - Utils = class(TObject) - public - class function GetDist(X1, Y1, X2, Y2: Single): Word; - class function GetPath(SubDir: string): string; - class function ShowForm(const Form: TForm): Integer; - end; +function GetDist(X1, Y1, X2, Y2: Single): Word; +function GetPath(SubDir: string): string; +function ShowForm(const Form: TForm): Integer; implementation uses SysUtils; -class function Utils.GetDist(X1, Y1, X2, Y2: Single): Word; +function GetDist(X1, Y1, X2, Y2: Single): Word; begin Result := Round(Sqrt(Sqr(X2 - X1) + Sqr(Y2 - Y1))); end; -class function Utils.GetPath(SubDir: string): string; +function GetPath(SubDir: string): string; begin Result := ExtractFilePath(ParamStr(0)); Result := IncludeTrailingPathDelimiter(Result + SubDir); end; -class function Utils.ShowForm(const Form: TForm): Integer; +function ShowForm(const Form: TForm): Integer; begin with Form do begin diff --git a/sources/DisciplesRL.dpr b/sources/DisciplesRL.dpr index 2c7b50b..9b57e0b 100644 --- a/sources/DisciplesRL.dpr +++ b/sources/DisciplesRL.dpr @@ -10,7 +10,9 @@ uses DisciplesRL.Resources in 'DisciplesRL.Resources.pas', DisciplesRL.Player in 'DisciplesRL.Player.pas', DisciplesRL.Creatures in 'DisciplesRL.Creatures.pas', - DisciplesRL.Party in 'DisciplesRL.Party.pas'; + DisciplesRL.Party in 'DisciplesRL.Party.pas', + DisciplesRL.City in 'DisciplesRL.City.pas', + DisciplesRL.PathFind in 'DisciplesRL.PathFind.pas'; {$R *.res} diff --git a/sources/DisciplesRL.dproj b/sources/DisciplesRL.dproj index 6a10030..09e5c88 100644 --- a/sources/DisciplesRL.dproj +++ b/sources/DisciplesRL.dproj @@ -95,6 +95,8 @@ + + Cfg_2 Base