From 45a4fa110e5ed6d6213bbfb1feeb0dc537ee7b26 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sun, 28 Feb 2010 22:43:54 +1300 Subject: [PATCH 01/38] lots of experimental bits --- OpenRA.Game/Graphics/OverlayRenderer.cs | 24 +++--- OpenRA.Game/Graphics/TerrainRenderer.cs | 4 + OpenRA.Game/OpenRA.Game.csproj | 4 +- OpenRA.Game/Traits/TraitsInterfaces.cs | 2 + OpenRA.Game/Traits/World/ResourceLayer.cs | 88 ++++++++++++++++++++++ OpenRA.Game/Traits/World/WallLoadHook.cs | 34 +++++++++ mods/cnc/chem.shp | Bin 0 -> 14870 bytes mods/cnc/flame.shp | Bin 0 -> 15864 bytes mods/cnc/system.yaml | 6 +- mods/cnc/ti1.tem | Bin 0 -> 1831 bytes mods/cnc/ti10.tem | Bin 0 -> 1833 bytes mods/cnc/ti11.tem | Bin 0 -> 1441 bytes mods/cnc/ti12.tem | Bin 0 -> 1389 bytes mods/cnc/ti2.tem | Bin 0 -> 1555 bytes mods/cnc/ti3.tem | Bin 0 -> 1123 bytes mods/cnc/ti4.tem | Bin 0 -> 1491 bytes mods/cnc/ti5.tem | Bin 0 -> 1515 bytes mods/cnc/ti6.tem | Bin 0 -> 1717 bytes mods/cnc/ti7.tem | Bin 0 -> 1532 bytes mods/cnc/ti8.tem | Bin 0 -> 1415 bytes mods/cnc/ti9.tem | Bin 0 -> 1184 bytes mods/ra/rules.yaml | 18 +++++ 22 files changed, 166 insertions(+), 14 deletions(-) create mode 100644 OpenRA.Game/Traits/World/ResourceLayer.cs create mode 100644 OpenRA.Game/Traits/World/WallLoadHook.cs create mode 100644 mods/cnc/chem.shp create mode 100644 mods/cnc/flame.shp create mode 100644 mods/cnc/ti1.tem create mode 100644 mods/cnc/ti10.tem create mode 100644 mods/cnc/ti11.tem create mode 100644 mods/cnc/ti12.tem create mode 100644 mods/cnc/ti2.tem create mode 100644 mods/cnc/ti3.tem create mode 100644 mods/cnc/ti4.tem create mode 100644 mods/cnc/ti5.tem create mode 100644 mods/cnc/ti6.tem create mode 100644 mods/cnc/ti7.tem create mode 100644 mods/cnc/ti8.tem create mode 100644 mods/cnc/ti9.tem diff --git a/OpenRA.Game/Graphics/OverlayRenderer.cs b/OpenRA.Game/Graphics/OverlayRenderer.cs index cf56db58b5..55adb33de9 100755 --- a/OpenRA.Game/Graphics/OverlayRenderer.cs +++ b/OpenRA.Game/Graphics/OverlayRenderer.cs @@ -72,18 +72,18 @@ namespace OpenRA.Graphics Game.CellSize * (float2)location, "terrain"); } - var o = tr.overlay; - if (o < overlaySprites.Length) - { - var location = new int2(x, y); - var sprites = overlaySprites[o]; - var spriteIndex = 0; - if (Ore.overlayIsFence[o]) spriteIndex = NearbyFences(x, y); - else if (Ore.overlayIsOre[o]) spriteIndex = map.MapTiles[x,y].density - 1; - else if (Ore.overlayIsGems[o]) spriteIndex = map.MapTiles[x,y].density - 1; - spriteRenderer.DrawSprite(sprites[spriteIndex], - Game.CellSize * (float2)location, "terrain"); - } + //var o = tr.overlay; + //if (o < overlaySprites.Length) + //{ + // var location = new int2(x, y); + // var sprites = overlaySprites[o]; + // var spriteIndex = 0; + // if (Ore.overlayIsFence[o]) spriteIndex = NearbyFences(x, y); + // else if (Ore.overlayIsOre[o]) spriteIndex = map.MapTiles[x,y].density - 1; + // else if (Ore.overlayIsGems[o]) spriteIndex = map.MapTiles[x,y].density - 1; + // spriteRenderer.DrawSprite(sprites[spriteIndex], + // Game.CellSize * (float2)location, "terrain"); + //} } spriteRenderer.Flush(); diff --git a/OpenRA.Game/Graphics/TerrainRenderer.cs b/OpenRA.Game/Graphics/TerrainRenderer.cs index 17d9e9f490..c456dd312f 100644 --- a/OpenRA.Game/Graphics/TerrainRenderer.cs +++ b/OpenRA.Game/Graphics/TerrainRenderer.cs @@ -21,6 +21,7 @@ using System.Drawing; using OpenRA.FileFormats; using OpenRA.FileFormats.Graphics; +using OpenRA.Traits; namespace OpenRA.Graphics { @@ -104,6 +105,9 @@ namespace OpenRA.Graphics new Range(indicesPerRow * firstRow, indicesPerRow * lastRow), terrainSheet.Texture, PrimitiveType.TriangleList, renderer.SpriteShader)); + foreach (var r in Game.world.WorldActor.traits.WithInterface()) + r.Render(); + overlayRenderer.Draw(); } } diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj index 5a5d754c42..a72530894c 100644 --- a/OpenRA.Game/OpenRA.Game.csproj +++ b/OpenRA.Game/OpenRA.Game.csproj @@ -1,4 +1,4 @@ - + Debug @@ -216,6 +216,7 @@ + @@ -253,6 +254,7 @@ + diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index e1007137a3..513856ccad 100644 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -140,4 +140,6 @@ namespace OpenRA.Traits bool Pressed { get; } void OnClick(); } + + public interface IRenderOverlay { void Render(); } } diff --git a/OpenRA.Game/Traits/World/ResourceLayer.cs b/OpenRA.Game/Traits/World/ResourceLayer.cs new file mode 100644 index 0000000000..ac7ed0b317 --- /dev/null +++ b/OpenRA.Game/Traits/World/ResourceLayer.cs @@ -0,0 +1,88 @@ +#region Copyright & License Information +/* + * Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford. + * This file is part of OpenRA. + * + * OpenRA is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * OpenRA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenRA. If not, see . + */ +#endregion + +using System; +using System.Linq; +using OpenRA.Graphics; + +namespace OpenRA.Traits +{ + class ResourceLayerInfo : ITraitInfo + { + public readonly string[] SpriteNames = { }; + public readonly int[] OverlayIndices = { }; + public readonly string Palette = "terrain"; + public object Create(Actor self) { return new ResourceLayer(self, this); } + } + + class ResourceLayer : IRenderOverlay, ILoadWorldHook + { + ResourceLayerInfo info; + Sprite[][] sprites; + CellContents[,] content = new CellContents[128,128]; + SpriteRenderer sr; + + public ResourceLayer(Actor self, ResourceLayerInfo info) + { + this.info = info; + sprites = info.SpriteNames.Select( f => SpriteSheetBuilder.LoadAllSprites(f)).ToArray(); + sr = new SpriteRenderer( Game.renderer, true ); + } + + public void Render() + { + var shroud = Game.world.LocalPlayer.Shroud; + var map = Game.world.Map; + + for (int y = map.YOffset; y < map.YOffset + map.Height; y++) + for (int x = map.XOffset; x < map.XOffset + map.Width; x++) + { + if (!shroud.IsExplored(new int2(x, y))) continue; + if (content[x, y].contents != null) + sr.DrawSprite(content[x, y].contents[content[x, y].density], + Game.CellSize * new int2(x, y), + info.Palette); + } + + sr.Flush(); + } + + public void WorldLoaded(World w) + { + var map = w.Map; + + for (int y = map.YOffset; y < map.YOffset + map.Height; y++) + for (int x = map.XOffset; x < map.XOffset + map.Width; x++) + if (info.OverlayIndices.Contains(w.Map.MapTiles[x, y].overlay)) + content[x, y].contents = ChooseContent(w, w.Map.MapTiles[x, y].overlay); + } + + Sprite[] ChooseContent(World w, int overlay) + { + return sprites[w.SharedRandom.Next(sprites.Length)]; + } + + public struct CellContents + { + public Sprite[] contents; + public int density; + } + } +} diff --git a/OpenRA.Game/Traits/World/WallLoadHook.cs b/OpenRA.Game/Traits/World/WallLoadHook.cs new file mode 100644 index 0000000000..806179183e --- /dev/null +++ b/OpenRA.Game/Traits/World/WallLoadHook.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace OpenRA.Traits +{ + class WallLoadHookInfo : ITraitInfo + { + public readonly int[] OverlayIndices = { }; + public readonly string ActorType = "brik"; + + public object Create(Actor self) { return new WallLoadHook( self, this ); } + } + + class WallLoadHook : ILoadWorldHook + { + WallLoadHookInfo info; + public WallLoadHook(Actor self, WallLoadHookInfo info) + { + this.info = info; + } + + public void WorldLoaded(World w) + { + var map = w.Map; + + for (int y = map.YOffset; y < map.YOffset + map.Height; y++) + for (int x = map.XOffset; x < map.XOffset + map.Width; x++) + if (info.OverlayIndices.Contains(w.Map.MapTiles[x, y].overlay)) + w.CreateActor(info.ActorType, new int2(x, y), w.players[0]); // todo: neutral player or null? + } + } +} diff --git a/mods/cnc/chem.shp b/mods/cnc/chem.shp new file mode 100644 index 0000000000000000000000000000000000000000..8116e742c7abb6aa33bbe1131a9b6b53e95e05fc GIT binary patch literal 14870 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 gwtl-eaV{fWIrMf2oh3 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 literal 0 HcmV?d00001 diff --git a/mods/cnc/system.yaml b/mods/cnc/system.yaml index 456b89fb9b..a20142ddf6 100644 --- a/mods/cnc/system.yaml +++ b/mods/cnc/system.yaml @@ -165,4 +165,8 @@ World: Name: Nod Race: nod SellButton: - RepairButton: \ No newline at end of file + RepairButton: + ResourceLayer: + OverlayIndices: 5,6,7,8,9,10,11,12 + Palette: player + SpriteNames: ti1,ti2,ti3,ti4,ti5,ti6,ti7,ti8,ti9,ti10,ti11,ti12 diff --git a/mods/cnc/ti1.tem b/mods/cnc/ti1.tem new file mode 100644 index 0000000000000000000000000000000000000000..44c875b3378f0435c4d4dabab7b21645f2c053ed GIT binary patch literal 1831 zcmZ{ke{3AZ6~||GcK7T%Q+#$Im-I*+Sye0OAEA|sE;X8kebFJLY7&v|^%RQ>4McgwbUjL!$r4d*--dZq?v2kL<%M@&DJ5_%NyR-(sMkoajRoD z5YL$bs8kwTd=SuCEE2bg3Y35Fe~312&br%(YRyk?%-UOsHrn~7`(H%0&0hDX--hTd zdZ|PoD=XCllCrWA|Cyw_&M7f%ieAdRO6bOGjK@aHlrGYL*p!{4Z-0r|y{ZUUP(_0C zvYHqN9Q}gbQGF$swJjZ&G+)KMq{VSWfyDtjy08S+yU-`B1nvZmg7Qt!xPW>$q(+B^8r_v8lIzh2Z#4X&TIijtUlm(9w6kq&NkrYMS^a|V3GWg9Fg$n zKai|QBt*RR5ENS@PR6 zAcil_+I4rURU?trMrqP-)uG{ui4ZSpevRM_3e$AGfKt{6*PAxOrj8Wf-EAySLcTw; zRyU*d$w_R+VHqek?e0mOt716PCsl1S201KP9L8cXD60;pTT<&XiOpgc1NF8Njizb^ zWwtIglNmFz5NIFn>(ynoja9uu!B#uQpi)wT{%e`%VAq<8W(Bm*roW!k-T zE|89tT7^OzyA7kCm>Bvx`ip93xh_kZJsLe$FX|~}58Lx*QI8rdYRaNEn=)9+)0|N= zRVfA?GsO)yj&aThYop^vG-dAbvh&RLdz~3fDk*24g~NxX{#n;FQ?jhIJH7(1C;$?J zb-la-A*q*|EC0&k6*E5AXx28}_uX9o(D&M<7gzB{%k`&+WT%UF5XNdH5_kiBMfyB4 z#&9>E+Jaqts{MG)huvys%&Gx-HPW&Tscv?WaR2aZYerVT5w?r4OR7`#+)}VA|MslO zIxc3U*4~?W96|H<{gggzN~s&BIn#0GgW<3|++(ud{W_sCbh;;N|7)C literal 0 HcmV?d00001 diff --git a/mods/cnc/ti10.tem b/mods/cnc/ti10.tem new file mode 100644 index 0000000000000000000000000000000000000000..455ae272bcbaf3686cf05150174f547f70765aaf GIT binary patch literal 1833 zcmaJ>Z){Ul6um0PEu)-pV-^LeXmzh_5*VLHkrTlrdrpY7D5c-XeOB%8F zb?=Q%DgCpt*pQT{ujnU?7|r~)CtYZ^!Uk5vX>q^@!Nh<@%^E<@YY~b6-b>y&=e~2! zJ?Hm3_pU?xPzrhBeFh_R2!R358H7T%{sivGQy2v}gr48RbtK_B>({^*Vf`h(6SrSL zAzR-oqJRt5zrHU6j?Vg%PCNTw4@0*R(kQtYK>Ggg+oY-MUiiL2y0RL<$iSULxdPgeasQ}l!GWfZz5R`Xx!`7Fv&X!^^7Kxq#zPV zMp__}KHLqDsHVeb7yEU6I)OzJxm|k(`S-ANAQw--qHH(3FH&sZX*qCin zl66O7%9Z8C$u%hKh;8)OGnxrTwwoxiO^E~rJ%>cXK_$oRN1Y>Ks-^k)l4KVKcqtF? zI*rTIkjONuB^xudTv@ux=G&N6&iz_5VNz_&s#gldj15y8vxRylnfyP@QlB6PRVZL- zQyz`bFp+@ga9fe`z!AWk!%J5MzW*RUCHndjW0LNWz(JA@i~R|A5X`Uwg_6T!mbb4xF!Xz}R5r=tFvk*U= zD-`Wc6Eaf&0vRwhu_#^m0nQI82O^6%(Ky+yn5ZheD&-SK>D&#Z zMPfa_81odSHaz5mFbQ?(R8dMLv@uP`^`Y(KM2XOzy*=+43XO(!Bk%&mprM}aTQZEG z?dkAHFc4xCtsnAj$!cNJv$1z39aAFvyfq1(UBthMTq(&X z^SCU7pT-oq3cFzsQLw;2rsOni>gVK3E#4}Dc zvV3pv9_ILIO_o(Q#WkAW3e8!I6-8~(KWY^mDmTCne5T_X<774C@P~N6%*GuP4s}3| z9~LLo5U=W@<>y1{6lcjA{@$L&AF(-u0c)v<1B@Hy(s(eBgX7$wn8UBaZGr>S_#KAd zoyJVVnvMfGJgW20y)rTl{#c#Cqu+G091~!UO%0p5?h3p9n#^CXl&e``?yJnRObm$E zE6~n&HO3qvS-#OUvfaJCY)^}4)>^xn?0>SE#^odH?i0G&oZV42@ zAx`Tx@8idJv^l+XX%a3sqKiInT?;Yc>ROxBE7w=vZfQWZyKl0dVU-T2w;P(({1;AF SnRDq*apuK;aC-Ugoc;k7Ykl$n literal 0 HcmV?d00001 diff --git a/mods/cnc/ti11.tem b/mods/cnc/ti11.tem new file mode 100644 index 0000000000000000000000000000000000000000..5efe14ac8340b51fddd301014e86ef9734abc0d0 GIT binary patch literal 1441 zcmb_bPiP}m7=Lg6B~7}xq_U=LYon_@i3nay2~0Jg#M@Ai36VmU_OiW+dnp7ZZzh?g zahpFgX;XvU)We&Cpa*Y35ALipYf#t}4T}hodf62`=s|ERtbS>_W{)16IehQE@4fH$ z-tYJOrpYELk~sb^QbOJ%IKi(+$nt3XG9?LIeq*1G=PwB)A>w@PEY{BAx57C8sYntb z%s(fMWBx4eN#p!S@~HacW8|Snh^6V825SE^Qp&DqnLD?M0hz>8cfKYJ2sKoAc$pBU zeRrN3TDJcu!L{sa|28@Q2~+=GBTvxdi$byZF;M_+Sw1ub$S~O+^oE5x&9G3+zFT3@ zLQToU!ryE$CKg1fDG-~VpLv@JDQFN0Fa!cbn+oW&@r{BlX{+(LL7@=>Ew;W<09yu7 zRrs}ttT;rnEWhnY9?OZ08g|GV2y=7!n+>7jF*z+RZ?Q&b@MieLW9}amOsu0olA=!w;5h;Rj+z;9aTaA?6t^T0m zalc%R_&vvN^*n=H)rc-`b*>t$d*Wl+(d+o|-^YCw0)T6IhCS4QyFeEaAJ zgLiSL=iBV0%Y3yqrRjb<2->QOSJJatU3+w;FYro#QQo5XXw{(!CM*diz0{z|l5k0` z)3xFUgwD0-le_dX6Bdt)?U9>`dxY{`aY>wQO6yDNIwns}i|o*6nD9bkhl++Ea6F5f z?@1YSKvUMUdI}*{n5ZSy7KINL6%(pzD;Z2_fDuijs*ao)u~mGQ;^F%uKC(`^DTA(M zpc=7UpJy}vDvHW;)W0oGwI9jChUsxyMTT*g#v7g@+L4e`0U+Y1x;*a%U04CpT4zt zY|{lMi6MjS()>P6?250ymD)i+(R_=p7oQ(#`8n-0C6F!dD6r2vu2rSn2!UTN1?|J_ z>5;M;wgk6){{Fd%w(TSs3h7%Q82!Fo@75_Cl5l7&8Dg~p4nUP2I2c*1BY)La;xJf9YaHAfDMD2bMG;at zU={7Gz3T*$CSE&<>PU_Fsan(n5|JvEQ!%VXn#8q}13jQf=?V3UpfretvDbuFgd%1S z-+Z%g_q}=Z=1G_V69&X{7y&*6(TH)UTi-yx{{tc3o}ZH-A_JWGLh}2gGDH;7pX=5i zWqn*U-DG0SrLO#W)H3@kjZT)lD zeGguSf}Ui0>lze{lo4Bh9`go^woW0};n4c8!1aw^V8;gFU~>2!z$PM%nlFLPj3lGm z39y&}$1KJg8OSHo2ApUP3zU&I*v2qy#9?*4ioI2J{F2E z6jNTI>e;d7KI}~tS<12NRR>;M-3BMcJje4I?;{)&bBe{HYrla*x=yiZ;|lJKb(G!= z)N0$8%YkMkEOWG6^_#RD4rg2}^FSgiXUe!~Ne?!!{|77|*t}8WlRnr|tRvyknyY4| zL3!|NR}IJIaDuzaN7=ZXHNR>H>L!L}mF9D!uMAYA!^*u!x=%1Ni=T4*Y!8iwRvNBPq%8B;n6#HOG3Ch z@@&)>9(h!_kfLfLgPP{5y2v0SQJILXR+e<)l1AngP;>hu6rDsMmc(AnC6GljD^jk{ zlE!i+HTg{cQ)k9piS=>0|A`z&D#@(xX)eE;qdBApvWRi{G3c2f3HTX-E~zALlST{w z&$6jN`>IUgqJ4l2)=ulk9kY24rTxUx_@3{)CrwVZE`m$rs(%Dlkdd=kuWB^DXK%1$ zFVkqEn~Vd#!!)zM#TW5B540^R1<&_)G|=?l^wS5~9_xjJLL@m}n{T>@`L{)*8Bj5iELRds@cIr##L%zIi9UZwS<$3(>l0g0mwKmiX literal 0 HcmV?d00001 diff --git a/mods/cnc/ti2.tem b/mods/cnc/ti2.tem new file mode 100644 index 0000000000000000000000000000000000000000..16128647be9dd64956826367e33c329932963431 GIT binary patch literal 1555 zcmZvcUuauZ9LIm>-rSqCnQlvQYf4w^Cd0RN_>?YkBl(r6Ag6gr2%B^;5c^gfLLp@4 z+~(dioo&-3T_r1|Y$gvrxECMn5VYx1xOA~iyI937V^i@D2tyyFWv>3N9aO}7;hyt5 z_nzPR{=VmP?g8k7cc7E*E(UN3APIEc0SMUr0S3J^{Mrv}FHT9&D^vXO)Arue_CPd)`mg~B}47-y+SG~(Z&R}t=Oe8xlwj&5885!!qge(8{sTM8m-m{X8P zdfbBHjEhH}^SDRcm~9Kk4t5N?;~HjN=zP{|_wtT7J(Hh+1JRFpnIBShnxyckcXLy) zI8Bcp*|ZWeW@Y4ugyWK&z!?d-E+z1bB*51UQ&JqWPIP;nTb7_Dr`x&LlNK$j>BcE{ z*mZEdS{8adj+5?i%;Q1ch1LOrx$=`v2Y@y^_8 zPhfG>&fD3j2D_`Hqc|n;4&lsM`gVc>siD;U&B2|yv ztTmU!ik&B7tY)pU&TW0M+WlNUQzqAJeUa6AhSX^|)o$w>9_G~Fm!~2Y4YM}mA_x9# zJ}_*3(c=0>wz6pFjTQ@e>+z1Cs^ihxz07V|NEDF1Xq5Dg`v0r%8|Ix=)=ysO?<`2i zmE;p(y|e6^VAp4v(3yUPU3f%Qe9204tbbPO*T}3h1;zw>JNYB9Qh`0t?QfZouXjDn zJ3fr{vt-%^vZ!iAjHcz(5D~+XT272^KY1lWwN>VfJxxRBH_NyaV(cArAloj z;5~n8oJT691+%zP?}2f0+^p4BiggF1$?#%vMO%~YeV^MP|^h6jxZV-e4JfPdNJhzWO3F_n7&LNq1h7l5_&bi0K&>J>D&A!bZ9c zUB}X*yx1bX_z{oQ(#1B7Pf6$zPS5@PTsdx|;5l;4Gwj|6CPzH$j@I|p8u6EI3ZyFyB6gdowU#S;k)r%4l?QN+J! zSFSQkNWr1JnpTIN51z{@)owX3RFJAco&B6#0j2fIi6EbDPY(o#y1Uin5>6hdI?tXB z2Br63pj9s`xKs}e2w4sWg}g%psyk=R56Oa^6OL_F)h6XuQ#WLl6w+B_n#r`swD7;2 zd9*dreCo{o?;hUV(f@JgQB$wB_MKVZ&Ck90f6nZ(a?Y-(_0X(Lw=Y+Jzx}J!^{rv+ ztTgXV=*g4is)m=JL8F+lmNQ~;e#Z_4kt6hSd3QVR(hv4i6FSBo v+>kZj2|6oR*dIER=h&^}RbUHw_G&?@3KRAj2w&_jAjOD}Q~#$}(7dm41;3N-=+OhS6-p=Z-} zXQf?PaTC}2uv`&{DOf&*IJx;2%Ux49mLl0PIRq3O2>qZr^-yf6>8vd%^w!IY*mK1o>R|8M?zaUKd>n{|DssK}szCP2?aARD@_N3HLn$W7Yx>TaFyJbbiAri*}X(LJrlpw(6}HFbi^s zv}yA85u7h|f_Qvg4)RsLzUq4I3Klk9&#gC{*84cy^tN1Qb=}=Lheb-cn|06iyhqQ_ zIeJaC6}DWy4Uud1rlw<^r_Qnv4roH4LF1$pd|; zw0%1(ugwVUP}kYF8uj*VN7ZNOCXztrBFjm*ataJr1D*G#CqfnF-GKE7aHWQ_@V5oL zBJ+g8mcCP`wUDhYU%OPoa2~I;WZ~aMVu2hk`$d1~O!|eflAe%$;Utwyhp}=XLGqz27iH4E=DVb%Ng?y+^Hk&q#AHoqI>gzt#s{zUM;r~JU1SzM?(1K3E@YC%Z0%`s=8XPN# zmGvIY5Aw6Y?Vc?T{c{Y8f#CCUZDodTo!K7>o*fH*KE!ANG*TpvPkkJ(a9b!wwyYQQ z?Au1B6lg}&$!tYw8aDoVO6(Oz7uEP@7po{)WNSEW6;D9o!9A75#^vKI;-5CEHT==~ H(vSQD=`M1i literal 0 HcmV?d00001 diff --git a/mods/cnc/ti4.tem b/mods/cnc/ti4.tem new file mode 100644 index 0000000000000000000000000000000000000000..3ecc6e643a3b0f4013d9bbe642a77f8c3bce308a GIT binary patch literal 1491 zcmbW1UuYaf9LHz&&+Xl%wlS%Cv1vUi1O#7v^Wwp#Q7 zBsKj0wsLI0tCD04?N3koT~(a^_ru9yj*vOyGBdWXlcH&vX}wz@bC*q)+V%-I$O{~H zt`ls&CWm(jDKe8W*!r9lm}${hwp_~L*$Er;Ee}V8?smu_BZQOuFA6{!JedtfYzj4% zStGl?@8F`kvC_S7lCZS8Mg8 z(b4JqHL2X<>ZCkT;x(;zC3?`}&EJJ@4Bsz0VJ(Um`mNV53g?#J-KjP=gmcTUd!0WH z(ooTu75-Fu5{Tf1bIU^Kne@}n`-&5w^EgHjgl!)qslyT%#_8H3 z)zu>AEx1zm^y6S4J68341^uvIXb0Ut&n@QZ55 zRW#Bte;R>a>Gc~;6OTzj>5Ra-+4*D~(Xmt-N~e$EHW04ZQ2uwoC>2E{7xiPB%mi0s zQw%_dng-0AGIi8Xa9hP094SsS3~U-y_OII7o-fyW`2{d6V@2eTag%bTjl4UOf19Y+DaSBz94X>2# zR)Awnb0X1gdzq}59vYsV9nf7>gbevD!E-~P^h3vi+oz65g0teQ4$MCTq3Sm=^traL zK=}-?``>hb#UzC&+!WjzM3A1_^$!foVgl_gWF2l+OKS&dEDK~?LLpnx0aebVj7l8v zk057qDZ{A5FonLe5#n?VQHGAcE-GMZ+INa=A1fecPWxf#grQ!b!F&vt`0ci@>-Jxm zKhW^UVwp_0pW^Kt->dMyu?Gr-&Wab=n=Fi7a@@$|xeE`*`flWM^UqO4Sf!0cdXLjL>dLuQeQgb%7 literal 0 HcmV?d00001 diff --git a/mods/cnc/ti5.tem b/mods/cnc/ti5.tem new file mode 100644 index 0000000000000000000000000000000000000000..95f87dba09a05d3dac41c86778d194df1e99d9b2 GIT binary patch literal 1515 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 literal 0 HcmV?d00001 diff --git a/mods/cnc/ti8.tem b/mods/cnc/ti8.tem new file mode 100644 index 0000000000000000000000000000000000000000..95cecd04b39c9794c0c8b752971869aa19e6d7d9 GIT binary patch literal 1415 zcma)5UuauZ82`>a_a<#qyEJ3kNVW!t^Tmhm!H3pJqW8d^?BOg>Zpc>2q$-Fn6%=%( zBj+x;T>`6Vl2*8=sqK=z>x1jukfz>X?b4)w;)aFbh9XKq=Yykt7=Cvh=!1yo!uig} zJ>U2Je&_pr-7o-2=)-T20GtPOaMd4KjX=aX*9Zh9fD^~1N4^9>8U1^Y>~nPA|Ag+x ze|N229V(S;dJKwwp53U0UNMgFTFdbvdrp+2>z|{EHmT9fM4Hq@e zY}2msdKNO8&aGOFu~2;hFYEDmj5n@<_uRLO06iky*n&x5T#s_r*ad^@a9r@Uc}PJt zuEUAueSnOi^UeFP`6oQU7_8iqP1Cjta#h5sAV%I@ZApPZVrg2+R)wO{NJdP%Tf-fD zRZ+Q0SV|gaIXCn8-M3bRAnb!K?)OcK_DajcraaM(1I=n#7~|vYk|!GX`Id8;Hab&o z1bf)$8xvBPHQIuNk1-V+?D;MNuG4K$)Ybj0xfss5Z2w6?gkpgKO(r!EXlT+#j zDbLDg#V!}RD&oi2RN5|MF?s2B<|QN=-gc_}fTUazRn4@`sjl8$F}z1bb@ySdPYDys zc6G1Ka-D4Zx8Lt=2;(9Bd)r2}mD#8NQB&+04&zI1qhj(NR zHCR;im>zO|=zI{3hC3@#jj_v4j-NsH_>Oq6bJHDMKjia_d5}*ue&FDno^k9=2XpuM zol`*`$9+Rav9SW>UYCI(3Xl0WHw78T;Mn7vD-)FEDC1rspQjUST4LOgCfEWN60nO~ zdGi^#fKLujuDt-+iamG5uFX|S_UbE;O_yq>RVmF?(yQ-6_KIoSH8WkY%+*UUscUO% zA=`!{H%B0Y(qRnwv9mr=iufl{->4E6@#DB)2Q7Fk!*#Z7oKgY_YN~vPkm?L`A zw4f_^(iw%1)23D94EoXxXUH1pGoo>CD%b<(QgL19r}|R5W!2!2w+E&NItS*)j;($L z-@Hod?-LO^^~Fk&m|RPnwpPDPF7lY2vg~xIaf77Ibj>p1Wc?Nq+`GKCLo$rVuq&a^ zV7*05rfDoRxN=xZCY$j8^tvOr7ptP67)Jx6)x0Yq_0#@qc~>Ap1FFa?*+hgUt~=dq zfYj}uQJTj_hx&@rQ%Z6kNN|SC3$idngh7m1GP>nlyb9#>tkQi4rzNlax^mwibY|Uk ocjWbd8JF+KTv55xUVKp$Tt+f5di(A)VsM>)dT<{@@Shm|0tgoSL;wH) literal 0 HcmV?d00001 diff --git a/mods/cnc/ti9.tem b/mods/cnc/ti9.tem new file mode 100644 index 0000000000000000000000000000000000000000..d8240ddf382b0552a742aa09a0136f90a930c564 GIT binary patch literal 1184 zcmaJ=U1%It6h3EucJueJ32JxS(5{w>;Da^z&@rnwaZi}M4FTDuv`~HVMIQvE1edLQ zCp)ugOibL}P#79FQg%dNtb$+)LU!V8-Lx^g)d)geqXq;;LEjQ=;+-UdFZK-FbI#?S zd%pXfZ+c)9au5~YE&yBtkqGuq>3gQnD;u65<3F#nTmLRT({NABIB_HJHo=iboHfX@*;kuj8YzfPFpV`o0nXq^^CrYIyKew| z^DO2mW$4Y%QC$8IPqe;8E2R@@>wlm{Mq2d!9XYN3hPj*vNT$;M+4JW*sn9Alj-Ra2 zY?n7xY1AHJOBtH!q;z9`Wy;(6nZy}Uftf~QkK2lMFugJ$z~bNB26eHY*PeC z#W3~7UdzZd*P(ZG$jeLPG}o#3#xgZe&C;w)-BDAysES>QWK$j=r^%ccf)8r@nUhIl zwyQ9bywKkt%GGG5#|xi3mrP1;J}mG|E48(u5iZNgB$szYt`-|tFUTCvb7eaeV$%w> zH%vV$t6e4eUOSRt#6aV@a->L?zY?%DLfcAhDvwiJ8tO$UMB^)kG?g&S@Ea`(B zk6w{9bpjXfVPzhdIS!VUV~gzC73pbd9?zIqEo1mb@VZG*0_~O6edU$ZKzFR9>SCp` zEM$>;9{)Y}V7FXW`!JTt6hr#)-flHh4C}oe*-VxMbR*K8O;AxKof4EA461}m3x_Jb zD70-P68ft#uAUATbVH}Sm54_tNhNYz+l@!zi8;$oXaufpyH3@vELf3K1)<2aVQBE= zTh@Y8@$2fMW3zZHuM2FE(J9NRyOp|ctA0HC0!|Co{kq_~E|kAo0(ih?jA@#7s}G?8 zk44s2AIGhikXP=!4il literal 0 HcmV?d00001 diff --git a/mods/ra/rules.yaml b/mods/ra/rules.yaml index 6d7e6c569a..03132a1fb3 100644 --- a/mods/ra/rules.yaml +++ b/mods/ra/rules.yaml @@ -216,6 +216,24 @@ World: SellButton: RepairButton: PowerDownButton: + WallLoadHook@sbag: + ActorType: sbag + OverlayIndices: 0,24 + WallLoadHook@cycl: + ActorType: cycl + OverlayIndices: 1 + WallLoadHook@brik: + ActorType: brik + OverlayIndices: 2 + WallLoadHook@fenc: + ActorType: fenc + OverlayIndices: 3 + WallLoadHook@wood: + ActorType: wood + OverlayIndices: 4 + WallLoadHook@barb: + ActorType: barb + OverlayIndices: 23 MGG: GeneratesGap: From 2c50d3baa7dab2505af40bd9698fccafca922742 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Tue, 2 Mar 2010 21:55:32 +1300 Subject: [PATCH 02/38] added ResourceType; mostly works, except for growth & consumption --- OpenRA.Game/Graphics/OverlayRenderer.cs | 46 ------------------ OpenRA.Game/OpenRA.Game.csproj | 1 + OpenRA.Game/Ore.cs | 10 ---- OpenRA.Game/Traits/World/OreGrowth.cs | 7 +-- OpenRA.Game/Traits/World/ResourceLayer.cs | 59 +++++++++++++++-------- OpenRA.Game/Traits/World/ResourceType.cs | 39 +++++++++++++++ mods/cnc/system.yaml | 5 +- mods/ra/rules.yaml | 13 +++++ 8 files changed, 98 insertions(+), 82 deletions(-) create mode 100644 OpenRA.Game/Traits/World/ResourceType.cs diff --git a/OpenRA.Game/Graphics/OverlayRenderer.cs b/OpenRA.Game/Graphics/OverlayRenderer.cs index 55adb33de9..285eb8f206 100755 --- a/OpenRA.Game/Graphics/OverlayRenderer.cs +++ b/OpenRA.Game/Graphics/OverlayRenderer.cs @@ -25,22 +25,12 @@ namespace OpenRA.Graphics { class OverlayRenderer { - static string[] overlaySpriteNames = - { - "sbag", "cycl", "brik", "fenc", "wood", - "gold01", "gold02", "gold03", "gold04", - "gem01", "gem02", "gem03", "gem04", - "v12", "v13", "v14", "v15", "v16", "v17", "v18", - "fpls", "wcrate", "scrate", "barb", "sbag", - }; - static string[] smudgeSpriteNames = { "bib3", "bib2", "bib1", "sc1", "sc2", "sc3", "sc4", "sc5", "sc6", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", }; - readonly Sprite[][] overlaySprites; readonly Sprite[] smudgeSprites; SpriteRenderer spriteRenderer; @@ -51,7 +41,6 @@ namespace OpenRA.Graphics this.spriteRenderer = new SpriteRenderer( renderer, true ); this.map = map; - overlaySprites = overlaySpriteNames.Select(f => SpriteSheetBuilder.LoadAllSprites(f)).ToArray(); smudgeSprites = smudgeSpriteNames.SelectMany(f => SpriteSheetBuilder.LoadAllSprites(f)).ToArray(); } @@ -71,44 +60,9 @@ namespace OpenRA.Graphics spriteRenderer.DrawSprite(smudgeSprites[tr.smudge - 1], Game.CellSize * (float2)location, "terrain"); } - - //var o = tr.overlay; - //if (o < overlaySprites.Length) - //{ - // var location = new int2(x, y); - // var sprites = overlaySprites[o]; - // var spriteIndex = 0; - // if (Ore.overlayIsFence[o]) spriteIndex = NearbyFences(x, y); - // else if (Ore.overlayIsOre[o]) spriteIndex = map.MapTiles[x,y].density - 1; - // else if (Ore.overlayIsGems[o]) spriteIndex = map.MapTiles[x,y].density - 1; - // spriteRenderer.DrawSprite(sprites[spriteIndex], - // Game.CellSize * (float2)location, "terrain"); - //} } spriteRenderer.Flush(); } - - bool IsFence( int x, int y ) - { - var o = map.MapTiles[ x, y ].overlay; - if (o < Ore.overlayIsFence.Length) - return Ore.overlayIsFence[o]; - return false; - } - - int NearbyFences( int x, int y ) - { - int ret = 0; - if( IsFence( x, y - 1 ) ) - ret |= 1; - if( IsFence( x + 1, y ) ) - ret |= 2; - if( IsFence( x, y + 1 ) ) - ret |= 4; - if( IsFence( x - 1, y ) ) - ret |= 8; - return ret; - } } } diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj index a72530894c..2d7b51d370 100644 --- a/OpenRA.Game/OpenRA.Game.csproj +++ b/OpenRA.Game/OpenRA.Game.csproj @@ -217,6 +217,7 @@ + diff --git a/OpenRA.Game/Ore.cs b/OpenRA.Game/Ore.cs index 0fe76526c3..1b26d435d8 100644 --- a/OpenRA.Game/Ore.cs +++ b/OpenRA.Game/Ore.cs @@ -101,16 +101,6 @@ namespace OpenRA ++map.MapTiles[i, j].density; } - public static void InitOreDensity( this Map map ) - { - for (int j = 0; j < 128; j++) - for (int i = 0; i < 128; i++) - { - if (map.ContainsOre(i, j)) map.MapTiles[i, j].density = map.GetOreDensity(i, j); - if (map.ContainsGem(i, j)) map.MapTiles[i, j].density = map.GetGemDensity(i, j); - } - } - static byte GetOreDensity(this Map map, int i, int j) { int sum = 0; diff --git a/OpenRA.Game/Traits/World/OreGrowth.cs b/OpenRA.Game/Traits/World/OreGrowth.cs index 3e96ca88e2..71109f7e21 100644 --- a/OpenRA.Game/Traits/World/OreGrowth.cs +++ b/OpenRA.Game/Traits/World/OreGrowth.cs @@ -30,7 +30,7 @@ namespace OpenRA.Traits public object Create(Actor self) { return new OreGrowth(); } } - class OreGrowth : ITick, ILoadWorldHook + class OreGrowth : ITick { int remainingTicks; @@ -52,10 +52,5 @@ namespace OpenRA.Traits remainingTicks = (int)(info.Interval * 60 * 25); } } - - public void WorldLoaded(World w) - { - Ore.InitOreDensity(w.Map); - } } } diff --git a/OpenRA.Game/Traits/World/ResourceLayer.cs b/OpenRA.Game/Traits/World/ResourceLayer.cs index ac7ed0b317..eefbfa8a5a 100644 --- a/OpenRA.Game/Traits/World/ResourceLayer.cs +++ b/OpenRA.Game/Traits/World/ResourceLayer.cs @@ -18,7 +18,6 @@ */ #endregion -using System; using System.Linq; using OpenRA.Graphics; @@ -26,23 +25,18 @@ namespace OpenRA.Traits { class ResourceLayerInfo : ITraitInfo { - public readonly string[] SpriteNames = { }; - public readonly int[] OverlayIndices = { }; - public readonly string Palette = "terrain"; - public object Create(Actor self) { return new ResourceLayer(self, this); } + public object Create(Actor self) { return new ResourceLayer(self); } } class ResourceLayer : IRenderOverlay, ILoadWorldHook { - ResourceLayerInfo info; - Sprite[][] sprites; - CellContents[,] content = new CellContents[128,128]; SpriteRenderer sr; - public ResourceLayer(Actor self, ResourceLayerInfo info) + public ResourceTypeInfo[] resourceTypes; + public CellContents[,] content = new CellContents[128, 128]; + + public ResourceLayer(Actor self) { - this.info = info; - sprites = info.SpriteNames.Select( f => SpriteSheetBuilder.LoadAllSprites(f)).ToArray(); sr = new SpriteRenderer( Game.renderer, true ); } @@ -55,10 +49,12 @@ namespace OpenRA.Traits for (int x = map.XOffset; x < map.XOffset + map.Width; x++) { if (!shroud.IsExplored(new int2(x, y))) continue; - if (content[x, y].contents != null) - sr.DrawSprite(content[x, y].contents[content[x, y].density], + + var c = content[x, y]; + if (c.image != null) + sr.DrawSprite(c.image[c.density], Game.CellSize * new int2(x, y), - info.Palette); + c.type.Palette); } sr.Flush(); @@ -66,22 +62,47 @@ namespace OpenRA.Traits public void WorldLoaded(World w) { + resourceTypes = w.WorldActor.Info.Traits.WithInterface().ToArray(); + foreach (var rt in resourceTypes) + rt.Sprites = rt.SpriteNames.Select(a => SpriteSheetBuilder.LoadAllSprites(a)).ToArray(); + var map = w.Map; for (int y = map.YOffset; y < map.YOffset + map.Height; y++) for (int x = map.XOffset; x < map.XOffset + map.Width; x++) - if (info.OverlayIndices.Contains(w.Map.MapTiles[x, y].overlay)) - content[x, y].contents = ChooseContent(w, w.Map.MapTiles[x, y].overlay); + { + content[x,y].type = resourceTypes.FirstOrDefault( + r => r.Overlays.Contains(w.Map.MapTiles[x, y].overlay)); + if (content[x, y].type != null) + content[x, y].image = ChooseContent(w, content[x, y].type); + } + + for (int y = map.YOffset; y < map.YOffset + map.Height; y++) + for (int x = map.XOffset; x < map.XOffset + map.Width; x++) + if (content[x, y].type != null) + content[x, y].density = (GetAdjacentCellsWith(content[x, y].type, x, y) * + content[x, y].image.Length) / 9; } - Sprite[] ChooseContent(World w, int overlay) + public Sprite[] ChooseContent(World w, ResourceTypeInfo info) { - return sprites[w.SharedRandom.Next(sprites.Length)]; + return info.Sprites[w.SharedRandom.Next(info.Sprites.Length)]; + } + + public int GetAdjacentCellsWith(ResourceTypeInfo info, int i, int j) + { + int sum = 0; + for (var u = -1; u < 2; u++) + for (var v = -1; v < 2; v++) + if (content[i+u, j+v].type == info) + ++sum; + return sum; } public struct CellContents { - public Sprite[] contents; + public ResourceTypeInfo type; + public Sprite[] image; public int density; } } diff --git a/OpenRA.Game/Traits/World/ResourceType.cs b/OpenRA.Game/Traits/World/ResourceType.cs new file mode 100644 index 0000000000..dac76cbc83 --- /dev/null +++ b/OpenRA.Game/Traits/World/ResourceType.cs @@ -0,0 +1,39 @@ +#region Copyright & License Information +/* + * Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford. + * This file is part of OpenRA. + * + * OpenRA is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * OpenRA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenRA. If not, see . + */ +#endregion + +using OpenRA.Graphics; +using System.Collections.Generic; +namespace OpenRA.Traits +{ + class ResourceTypeInfo : ITraitInfo + { + public readonly int[] Overlays = { }; + public readonly string[] SpriteNames = { }; + public readonly string Palette = "terrain"; + public readonly int ValuePerUnit = 0; + public readonly string Name = null; + + public Sprite[][] Sprites; + + public object Create(Actor self) { return new ResourceType(); } + } + + class ResourceType { } +} diff --git a/mods/cnc/system.yaml b/mods/cnc/system.yaml index a20142ddf6..0dd0e95844 100644 --- a/mods/cnc/system.yaml +++ b/mods/cnc/system.yaml @@ -167,6 +167,9 @@ World: SellButton: RepairButton: ResourceLayer: - OverlayIndices: 5,6,7,8,9,10,11,12 + ResourceType@green-tib: + Overlays: 5,6,7,8,9,10,11,12 Palette: player SpriteNames: ti1,ti2,ti3,ti4,ti5,ti6,ti7,ti8,ti9,ti10,ti11,ti12 + ValuePerUnit: 30 + Name: Tiberium diff --git a/mods/ra/rules.yaml b/mods/ra/rules.yaml index 03132a1fb3..a1c1bdee32 100644 --- a/mods/ra/rules.yaml +++ b/mods/ra/rules.yaml @@ -234,6 +234,19 @@ World: WallLoadHook@barb: ActorType: barb OverlayIndices: 23 + ResourceLayer: + ResourceType@ore: + Overlays: 5,6,7,8 + Palette: terrain + SpriteNames: gold01,gold02,gold03,gold04 + ValuePerUnit: 30 + Name: Ore + ResourceType@gem: + Overlays: 9,10,11,12 + Palette: terrain + SpriteNames: gem01,gem02,gem03,gem04 + ValuePerUnit: 60 + Name: Gems MGG: GeneratesGap: From 0c9e628bf9c52558bfe29d4f19ea8c63577aacae Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Tue, 2 Mar 2010 22:29:17 +1300 Subject: [PATCH 03/38] removed TileReference.density --- OpenRA.FileFormats/TileReference.cs | 1 - OpenRA.Game/Ore.cs | 81 +++-------------------- OpenRA.Game/PathSearch.cs | 4 +- OpenRA.Game/Traits/Activities/Harvest.cs | 9 ++- OpenRA.Game/Traits/Harvester.cs | 5 +- OpenRA.Game/Traits/SeedsOre.cs | 16 ++++- OpenRA.Game/Traits/World/OreGrowth.cs | 2 +- OpenRA.Game/Traits/World/ResourceLayer.cs | 34 +++++++++- OpenRA.Game/Traits/World/ResourceType.cs | 2 +- 9 files changed, 67 insertions(+), 87 deletions(-) diff --git a/OpenRA.FileFormats/TileReference.cs b/OpenRA.FileFormats/TileReference.cs index c4ca4d069e..e1688bd824 100644 --- a/OpenRA.FileFormats/TileReference.cs +++ b/OpenRA.FileFormats/TileReference.cs @@ -26,7 +26,6 @@ namespace OpenRA.FileFormats public byte image; public byte overlay; public byte smudge; - public byte density; /* used for ore/gems */ public override int GetHashCode() { return tile.GetHashCode() ^ image.GetHashCode(); } diff --git a/OpenRA.Game/Ore.cs b/OpenRA.Game/Ore.cs index 1b26d435d8..97d119e1ae 100644 --- a/OpenRA.Game/Ore.cs +++ b/OpenRA.Game/Ore.cs @@ -26,34 +26,13 @@ namespace OpenRA { public static class Ore { - public static void AddOre(this Map map, int i, int j) - { - if (map.ContainsOre(i, j) && map.MapTiles[i, j].density < 12) - map.MapTiles[i, j].density++; - else if (map.MapTiles[i, j].overlay == 0xff) - { - map.MapTiles[i, j].overlay = ChooseOre(); - map.MapTiles[i, j].density = 1; - } - } - public static void DestroyOre(this Map map, int i, int j) { - if (map.ContainsResource(new int2(i, j))) - { - map.MapTiles[i, j].density = 0; - map.MapTiles[i, j].overlay = 0xff; - } - } - - public static bool OreCanSpreadInto(this World world, int i, int j) - { - if (world.WorldActor.traits.Get().GetBuildingAt(new int2(i, j)) != null) - return false; - - return TerrainCosts.Cost(UnitMovementType.Wheel, - world.TileSet.GetWalkability(world.Map.MapTiles[i, j])) - < double.PositiveInfinity; + //if (map.ContainsResource(new int2(i, j))) + //{ + // map.MapTiles[i, j].density = 0; + // map.MapTiles[i, j].overlay = 0xff; + //} } public static void SpreadOre(this World world, Random r, float chance) @@ -72,7 +51,7 @@ namespace OpenRA if (!map.HasOverlay(i, j) && r.NextDouble() < chance && map.GetOreDensity(i, j) > 0 - && world.OreCanSpreadInto(i, j)) + && world.IsCellBuildable(new int2(i,j), UnitMovementType.Wheel)) newOverlay[i, j] = ChooseOre(); } @@ -82,10 +61,9 @@ namespace OpenRA map.MapTiles[i, j].overlay = newOverlay[i, j]; } - public static void GrowOre(this World world, Random r) + public static void GrowOre(this World world) { var map = world.Map; - var mini = map.XOffset; var maxi = map.XOffset + map.Width; var minj = map.YOffset; var maxj = map.YOffset + map.Height; @@ -95,10 +73,10 @@ namespace OpenRA for (int i = mini; i < maxi; i++) if (map.ContainsOre(i, j)) newDensity[i, j] = map.GetOreDensity(i, j); - for (int j = minj; j < maxj; j++) - for (int i = mini; i < maxi; i++) - if (map.MapTiles[i, j].density < newDensity[i, j]) - ++map.MapTiles[i, j].density; +// for (int j = minj; j < maxj; j++) +// for (int i = mini; i < maxi; i++) +// if (map.MapTiles[i, j].density < newDensity[i, j]) +// ++map.MapTiles[i, j].density; } static byte GetOreDensity(this Map map, int i, int j) @@ -112,17 +90,6 @@ namespace OpenRA return (byte)sum; } - static byte GetGemDensity(this Map map, int i, int j) - { - int sum = 0; - for (var u = -1; u < 2; u++) - for (var v = -1; v < 2; v++) - if (map.ContainsGem(i + u, j + v)) - ++sum; - sum = (sum+2) / 3; /* 3 gem units/tile is full. */ - return (byte)sum; - } - static bool HasOverlay(this Map map, int i, int j) { return map.MapTiles[i, j].overlay < overlayIsOre.Length; @@ -143,17 +110,6 @@ namespace OpenRA return map.ContainsGem(p.X, p.Y) || map.ContainsOre(p.X, p.Y); } - public static bool Harvest(this Map map, int2 p, out bool isGems) /* harvests one unit if possible */ - { - isGems = map.ContainsGem(p.X, p.Y); - if (map.MapTiles[p.X, p.Y].density == 0) return false; - - if (--map.MapTiles[p.X, p.Y].density == 0) - map.MapTiles[p.X, p.Y].overlay = 0xff; - - return true; - } - static byte ore = 5; static byte ChooseOre() { @@ -161,21 +117,6 @@ namespace OpenRA return ore; } - public static bool IsOverlaySolid(this Map map, int2 p) - { - var o = map.MapTiles[p.X, p.Y].overlay; - return o < overlayIsFence.Length && overlayIsFence[o]; - } - - public static bool[] overlayIsFence = - { - true, true, true, true, true, - false, false, false, false, - false, false, false, false, - false, false, false, false, false, false, false, - false, false, false, true, true, - }; - public static bool[] overlayIsOre = { false, false, false, false, false, diff --git a/OpenRA.Game/PathSearch.cs b/OpenRA.Game/PathSearch.cs index 24806e1d51..6297b2d7a6 100755 --- a/OpenRA.Game/PathSearch.cs +++ b/OpenRA.Game/PathSearch.cs @@ -84,9 +84,7 @@ namespace OpenRA if (!world.WorldActor.traits.Get().CanMoveHere(newHere) && world.WorldActor.traits.Get().GetBuildingAt(newHere) != ignoreBuilding) continue; - if (world.Map.IsOverlaySolid(newHere)) - continue; - + // Replicate real-ra behavior of not being able to enter a cell if there is a mixture of crushable and uncrushable units if (checkForBlocked && (world.WorldActor.traits.Get().GetUnitsAt(newHere).Any(a => !world.IsActorPathableToCrush(a, umt)))) continue; diff --git a/OpenRA.Game/Traits/Activities/Harvest.cs b/OpenRA.Game/Traits/Activities/Harvest.cs index 568be61320..6179c54e02 100644 --- a/OpenRA.Game/Traits/Activities/Harvest.cs +++ b/OpenRA.Game/Traits/Activities/Harvest.cs @@ -49,17 +49,16 @@ namespace OpenRA.Traits.Activities var harv = self.traits.Get(); var renderUnit = self.traits.Get(); /* better have one of these! */ - var isGem = false; - if (!self.World.Map.ContainsResource(self.Location) || - !self.World.Map.Harvest(self.Location, out isGem)) + var resource = self.World.WorldActor.traits.Get().Harvest(self.Location); + if (resource == null) return false; - + if (renderUnit.anim.CurrentSequence.Name != "harvest") { isHarvesting = true; renderUnit.PlayCustomAnimation(self, "harvest", () => isHarvesting = false); } - harv.AcceptResource(isGem); + harv.AcceptResource(resource); return true; } diff --git a/OpenRA.Game/Traits/Harvester.cs b/OpenRA.Game/Traits/Harvester.cs index e476624178..e62a7efa7e 100644 --- a/OpenRA.Game/Traits/Harvester.cs +++ b/OpenRA.Game/Traits/Harvester.cs @@ -47,9 +47,10 @@ namespace OpenRA.Traits public bool IsFull { get { return oreCarried + gemsCarried == self.Info.Traits.Get().BailCount; } } public bool IsEmpty { get { return oreCarried == 0 && gemsCarried == 0; } } - public void AcceptResource(bool isGem) + public void AcceptResource(ResourceTypeInfo type) { - if (isGem) gemsCarried++; + // FIXME: harvester probably needs to know *exactly* what it is carrying. + if (type.Name == "Gems") gemsCarried++; else oreCarried++; } diff --git a/OpenRA.Game/Traits/SeedsOre.cs b/OpenRA.Game/Traits/SeedsOre.cs index 378b110789..7006d3bc19 100644 --- a/OpenRA.Game/Traits/SeedsOre.cs +++ b/OpenRA.Game/Traits/SeedsOre.cs @@ -18,12 +18,16 @@ */ #endregion +using System.Linq; +using System; + namespace OpenRA.Traits { class SeedsOreInfo : ITraitInfo { public readonly float Chance = .05f; public readonly int Interval = 5; + public readonly string ResourceType = "Ore"; public object Create(Actor self) { return new SeedsOre(); } } @@ -37,12 +41,20 @@ namespace OpenRA.Traits if (--ticks <= 0) { var info = self.Info.Traits.Get(); + var resourceType = self.World.WorldActor.Info.Traits + .WithInterface() + .FirstOrDefault(t => t.Name == info.ResourceType); + + if (resourceType == null) + throw new InvalidOperationException("No such resource type `{0}`".F(info.ResourceType)); + + var resLayer = self.World.WorldActor.traits.Get(); for (var j = -1; j < 2; j++) for (var i = -1; i < 2; i++) if (self.World.SharedRandom.NextDouble() < info.Chance) - if (self.World.OreCanSpreadInto(self.Location.X + i, self.Location.Y + j)) - self.World.Map.AddOre(self.Location.X + i, self.Location.Y + j); + if (self.World.IsCellBuildable(self.Location + new int2(i, j), UnitMovementType.Wheel)) + resLayer.AddResource(resourceType, self.Location.X + i, self.Location.Y + j, 1); ticks = info.Interval; } diff --git a/OpenRA.Game/Traits/World/OreGrowth.cs b/OpenRA.Game/Traits/World/OreGrowth.cs index 71109f7e21..66889d51ba 100644 --- a/OpenRA.Game/Traits/World/OreGrowth.cs +++ b/OpenRA.Game/Traits/World/OreGrowth.cs @@ -46,7 +46,7 @@ namespace OpenRA.Traits info.Chance); if (info.Grows) - Ore.GrowOre(self.World, self.World.SharedRandom); + Ore.GrowOre(self.World); self.World.Minimap.InvalidateOre(); remainingTicks = (int)(info.Interval * 60 * 25); diff --git a/OpenRA.Game/Traits/World/ResourceLayer.cs b/OpenRA.Game/Traits/World/ResourceLayer.cs index eefbfa8a5a..328b62ce63 100644 --- a/OpenRA.Game/Traits/World/ResourceLayer.cs +++ b/OpenRA.Game/Traits/World/ResourceLayer.cs @@ -20,6 +20,7 @@ using System.Linq; using OpenRA.Graphics; +using System; namespace OpenRA.Traits { @@ -31,6 +32,7 @@ namespace OpenRA.Traits class ResourceLayer : IRenderOverlay, ILoadWorldHook { SpriteRenderer sr; + World w; public ResourceTypeInfo[] resourceTypes; public CellContents[,] content = new CellContents[128, 128]; @@ -62,6 +64,7 @@ namespace OpenRA.Traits public void WorldLoaded(World w) { + this.w = w; resourceTypes = w.WorldActor.Info.Traits.WithInterface().ToArray(); foreach (var rt in resourceTypes) rt.Sprites = rt.SpriteNames.Select(a => SpriteSheetBuilder.LoadAllSprites(a)).ToArray(); @@ -74,7 +77,7 @@ namespace OpenRA.Traits content[x,y].type = resourceTypes.FirstOrDefault( r => r.Overlays.Contains(w.Map.MapTiles[x, y].overlay)); if (content[x, y].type != null) - content[x, y].image = ChooseContent(w, content[x, y].type); + content[x, y].image = ChooseContent(content[x, y].type); } for (int y = map.YOffset; y < map.YOffset + map.Height; y++) @@ -84,7 +87,7 @@ namespace OpenRA.Traits content[x, y].image.Length) / 9; } - public Sprite[] ChooseContent(World w, ResourceTypeInfo info) + public Sprite[] ChooseContent(ResourceTypeInfo info) { return info.Sprites[w.SharedRandom.Next(info.Sprites.Length)]; } @@ -99,6 +102,33 @@ namespace OpenRA.Traits return sum; } + public void AddResource(ResourceTypeInfo info, int i, int j, int n) + { + if (content[i, j].type == null) + { + content[i, j].type = info; + content[i, j].image = ChooseContent(info); + content[i, j].density = -1; + } + + if (content[i, j].type != info) + return; + + content[i, j].density = Math.Min( + content[i, j].image.Length - 1, + content[i, j].density + n); + } + + public ResourceTypeInfo Harvest(int2 p) + { + var type = content[p.X,p.Y].type; + if (type == null) return null; + + if (--content[p.X, p.Y].density < 0) + content[p.X, p.Y].type = null; + return type; + } + public struct CellContents { public ResourceTypeInfo type; diff --git a/OpenRA.Game/Traits/World/ResourceType.cs b/OpenRA.Game/Traits/World/ResourceType.cs index dac76cbc83..6c98f0a8ea 100644 --- a/OpenRA.Game/Traits/World/ResourceType.cs +++ b/OpenRA.Game/Traits/World/ResourceType.cs @@ -22,7 +22,7 @@ using OpenRA.Graphics; using System.Collections.Generic; namespace OpenRA.Traits { - class ResourceTypeInfo : ITraitInfo + public class ResourceTypeInfo : ITraitInfo { public readonly int[] Overlays = { }; public readonly string[] SpriteNames = { }; From f133410977286178e002c90b9e314951fe0ab32d Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Wed, 3 Mar 2010 20:54:06 +1300 Subject: [PATCH 04/38] ore growth moved into ResourceLayer --- OpenRA.Game/Ore.cs | 18 ------------ OpenRA.Game/Traits/World/OreGrowth.cs | 23 ++++++++++----- OpenRA.Game/Traits/World/ResourceLayer.cs | 34 +++++++++++++++++++++-- 3 files changed, 48 insertions(+), 27 deletions(-) diff --git a/OpenRA.Game/Ore.cs b/OpenRA.Game/Ore.cs index 97d119e1ae..01ee46eb3b 100644 --- a/OpenRA.Game/Ore.cs +++ b/OpenRA.Game/Ore.cs @@ -61,24 +61,6 @@ namespace OpenRA map.MapTiles[i, j].overlay = newOverlay[i, j]; } - public static void GrowOre(this World world) - { - var map = world.Map; - var mini = map.XOffset; var maxi = map.XOffset + map.Width; - var minj = map.YOffset; var maxj = map.YOffset + map.Height; - - /* phase 2: increase density of existing areas */ - var newDensity = new byte[128, 128]; - for (int j = minj; j < maxj; j++) - for (int i = mini; i < maxi; i++) - if (map.ContainsOre(i, j)) newDensity[i, j] = map.GetOreDensity(i, j); - -// for (int j = minj; j < maxj; j++) -// for (int i = mini; i < maxi; i++) -// if (map.MapTiles[i, j].density < newDensity[i, j]) -// ++map.MapTiles[i, j].density; - } - static byte GetOreDensity(this Map map, int i, int j) { int sum = 0; diff --git a/OpenRA.Game/Traits/World/OreGrowth.cs b/OpenRA.Game/Traits/World/OreGrowth.cs index 66889d51ba..9b30291083 100644 --- a/OpenRA.Game/Traits/World/OreGrowth.cs +++ b/OpenRA.Game/Traits/World/OreGrowth.cs @@ -18,6 +18,8 @@ */ #endregion +using System.Linq; + namespace OpenRA.Traits { class OreGrowthInfo : ITraitInfo @@ -39,14 +41,21 @@ namespace OpenRA.Traits if (--remainingTicks <= 0) { var info = self.Info.Traits.Get(); - - if (info.Spreads) - Ore.SpreadOre(self.World, - self.World.SharedRandom, - info.Chance); - if (info.Grows) - Ore.GrowOre(self.World); + // HACK HACK: we should push "grows" down to the resource. + var oreResource = self.World.WorldActor.Info.Traits.WithInterface() + .FirstOrDefault(r => r.Name == "Ore"); + + if (oreResource != null) + { + if (info.Spreads) + Ore.SpreadOre(self.World, + self.World.SharedRandom, + info.Chance); + + if (info.Grows) + self.World.WorldActor.traits.Get().Grow(oreResource); + } self.World.Minimap.InvalidateOre(); remainingTicks = (int)(info.Interval * 60 * 25); diff --git a/OpenRA.Game/Traits/World/ResourceLayer.cs b/OpenRA.Game/Traits/World/ResourceLayer.cs index 328b62ce63..6049fbb46b 100644 --- a/OpenRA.Game/Traits/World/ResourceLayer.cs +++ b/OpenRA.Game/Traits/World/ResourceLayer.cs @@ -83,8 +83,7 @@ namespace OpenRA.Traits for (int y = map.YOffset; y < map.YOffset + map.Height; y++) for (int x = map.XOffset; x < map.XOffset + map.Width; x++) if (content[x, y].type != null) - content[x, y].density = (GetAdjacentCellsWith(content[x, y].type, x, y) * - content[x, y].image.Length) / 9; + content[x, y].density = GetIdealDensity(x, y); } public Sprite[] ChooseContent(ResourceTypeInfo info) @@ -102,6 +101,12 @@ namespace OpenRA.Traits return sum; } + public int GetIdealDensity(int x, int y) + { + return (GetAdjacentCellsWith(content[x, y].type, x, y) * + content[x, y].image.Length) / 9; + } + public void AddResource(ResourceTypeInfo info, int i, int j, int n) { if (content[i, j].type == null) @@ -129,6 +134,31 @@ namespace OpenRA.Traits return type; } + public void Destroy(int2 p) + { + content[p.X, p.Y].type = null; + content[p.X, p.Y].image = null; + content[p.X, p.Y].density = 0; + } + + public void Grow(ResourceTypeInfo info) + { + var map = w.Map; + var mini = map.XOffset; var maxi = map.XOffset + map.Width; + var minj = map.YOffset; var maxj = map.YOffset + map.Height; + + var newDensity = new byte[128, 128]; + for (int j = minj; j < maxj; j++) + for (int i = mini; i < maxi; i++) + if (content[i, j].type == info) + newDensity[i, j] = (byte)GetIdealDensity(i, j); + + for (int j = minj; j < maxj; j++) + for (int i = mini; i < maxi; i++) + if (content[i, j].type == info && content[i, j].density < newDensity[i, j]) + ++content[i, j].density; + } + public struct CellContents { public ResourceTypeInfo type; From 5d7772ac9a653e6eab13385fc7c2680eecb38398 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Wed, 3 Mar 2010 21:00:23 +1300 Subject: [PATCH 05/38] DestroyOre ported --- OpenRA.Game/Combat.cs | 3 ++- OpenRA.Game/Ore.cs | 13 ++----------- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/OpenRA.Game/Combat.cs b/OpenRA.Game/Combat.cs index b5ac5513cc..c2fa65ca42 100644 --- a/OpenRA.Game/Combat.cs +++ b/OpenRA.Game/Combat.cs @@ -48,7 +48,8 @@ namespace OpenRA if (impactSound != null) Sound.Play(impactSound + ".aud"); if (!isWater) world.Map.AddSmudge(targetTile, warhead); - if (warhead.Ore) world.Map.DestroyOre(targetTile.X, targetTile.Y); + if (warhead.Ore) + world.WorldActor.traits.Get().Destroy(targetTile); var firepowerModifier = firedBy.traits .WithInterface() diff --git a/OpenRA.Game/Ore.cs b/OpenRA.Game/Ore.cs index 01ee46eb3b..b7e2fb0942 100644 --- a/OpenRA.Game/Ore.cs +++ b/OpenRA.Game/Ore.cs @@ -26,15 +26,6 @@ namespace OpenRA { public static class Ore { - public static void DestroyOre(this Map map, int i, int j) - { - //if (map.ContainsResource(new int2(i, j))) - //{ - // map.MapTiles[i, j].density = 0; - // map.MapTiles[i, j].overlay = 0xff; - //} - } - public static void SpreadOre(this World world, Random r, float chance) { var map = world.Map; @@ -99,7 +90,7 @@ namespace OpenRA return ore; } - public static bool[] overlayIsOre = + static bool[] overlayIsOre = { false, false, false, false, false, true, true, true, true, @@ -108,7 +99,7 @@ namespace OpenRA false, false, false, false, false, }; - public static bool[] overlayIsGems = + static bool[] overlayIsGems = { false, false, false, false, false, false, false, false, false, From 6c229f327345f7b06410ec162c7e64dfd74fc547 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Wed, 3 Mar 2010 21:07:03 +1300 Subject: [PATCH 06/38] ore spreading ported --- OpenRA.Game/Ore.cs | 44 ----------------------- OpenRA.Game/Traits/World/OreGrowth.cs | 5 ++- OpenRA.Game/Traits/World/ResourceLayer.cs | 26 ++++++++++++++ 3 files changed, 28 insertions(+), 47 deletions(-) diff --git a/OpenRA.Game/Ore.cs b/OpenRA.Game/Ore.cs index b7e2fb0942..bf8b25f807 100644 --- a/OpenRA.Game/Ore.cs +++ b/OpenRA.Game/Ore.cs @@ -26,43 +26,6 @@ namespace OpenRA { public static class Ore { - public static void SpreadOre(this World world, Random r, float chance) - { - var map = world.Map; - - var mini = map.XOffset; var maxi = map.XOffset + map.Width; - var minj = map.YOffset; var maxj = map.YOffset + map.Height; - - /* phase 1: grow into neighboring regions */ - var newOverlay = new byte[128, 128]; - for (int j = minj; j < maxj; j++) - for (int i = mini; i < maxi; i++) - { - newOverlay[i, j] = 0xff; - if (!map.HasOverlay(i, j) - && r.NextDouble() < chance - && map.GetOreDensity(i, j) > 0 - && world.IsCellBuildable(new int2(i,j), UnitMovementType.Wheel)) - newOverlay[i, j] = ChooseOre(); - } - - for (int j = minj; j < maxj; j++) - for (int i = mini; i < maxi; i++) - if (newOverlay[i, j] != 0xff) - map.MapTiles[i, j].overlay = newOverlay[i, j]; - } - - static byte GetOreDensity(this Map map, int i, int j) - { - int sum = 0; - for (var u = -1; u < 2; u++) - for (var v = -1; v < 2; v++) - if (map.ContainsOre(i + u, j + v)) - ++sum; - sum = (sum * 4 + 2) / 3; - return (byte)sum; - } - static bool HasOverlay(this Map map, int i, int j) { return map.MapTiles[i, j].overlay < overlayIsOre.Length; @@ -83,13 +46,6 @@ namespace OpenRA return map.ContainsGem(p.X, p.Y) || map.ContainsOre(p.X, p.Y); } - static byte ore = 5; - static byte ChooseOre() - { - if (++ore > 8) ore = 5; - return ore; - } - static bool[] overlayIsOre = { false, false, false, false, false, diff --git a/OpenRA.Game/Traits/World/OreGrowth.cs b/OpenRA.Game/Traits/World/OreGrowth.cs index 9b30291083..8a4e464102 100644 --- a/OpenRA.Game/Traits/World/OreGrowth.cs +++ b/OpenRA.Game/Traits/World/OreGrowth.cs @@ -49,9 +49,8 @@ namespace OpenRA.Traits if (oreResource != null) { if (info.Spreads) - Ore.SpreadOre(self.World, - self.World.SharedRandom, - info.Chance); + self.World.WorldActor.traits.Get().Spread(oreResource, + self.World.SharedRandom, info.Chance); if (info.Grows) self.World.WorldActor.traits.Get().Grow(oreResource); diff --git a/OpenRA.Game/Traits/World/ResourceLayer.cs b/OpenRA.Game/Traits/World/ResourceLayer.cs index 6049fbb46b..69a1b31ea4 100644 --- a/OpenRA.Game/Traits/World/ResourceLayer.cs +++ b/OpenRA.Game/Traits/World/ResourceLayer.cs @@ -159,6 +159,32 @@ namespace OpenRA.Traits ++content[i, j].density; } + public void Spread(ResourceTypeInfo info, Random r, float chance) + { + var map = w.Map; + + var mini = map.XOffset; var maxi = map.XOffset + map.Width; + var minj = map.YOffset; var maxj = map.YOffset + map.Height; + + var growMask = new bool[128, 128]; + for (int j = minj; j < maxj; j++) + for (int i = mini; i < maxi; i++) + if (content[i,j].type == null + && r.NextDouble() < chance + && GetAdjacentCellsWith(info, i,j ) > 0 + && w.IsCellBuildable(new int2(i, j), UnitMovementType.Wheel)) + growMask[i, j] = true; + + for (int j = minj; j < maxj; j++) + for (int i = mini; i < maxi; i++) + if (growMask[i, j]) + { + content[i, j].type = info; + content[i, j].image = ChooseContent(info); + content[i, j].density = 0; + } + } + public struct CellContents { public ResourceTypeInfo type; From 15b82830a2681a76eed65c8a1aa4c6b83bf8e088 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Wed, 3 Mar 2010 21:15:44 +1300 Subject: [PATCH 07/38] Ore.cs is dead. Long live ResourceLayer.cs. --- OpenRA.Game/Graphics/Minimap.cs | 4 +- OpenRA.Game/OpenRA.Game.csproj | 1 - OpenRA.Game/Ore.cs | 67 ----------------------- OpenRA.Game/Traits/Activities/Harvest.cs | 4 +- OpenRA.Game/Traits/Harvester.cs | 2 +- OpenRA.Game/Traits/World/ResourceLayer.cs | 4 +- OpenRA.Game/UiOverlay.cs | 3 +- OpenRA.Game/WorldUtils.cs | 3 +- 8 files changed, 14 insertions(+), 74 deletions(-) delete mode 100644 OpenRA.Game/Ore.cs diff --git a/OpenRA.Game/Graphics/Minimap.cs b/OpenRA.Game/Graphics/Minimap.cs index f9adfa55df..8810b58755 100644 --- a/OpenRA.Game/Graphics/Minimap.cs +++ b/OpenRA.Game/Graphics/Minimap.cs @@ -120,11 +120,13 @@ namespace OpenRA.Graphics if (oreLayer == null) { + var res = world.WorldActor.traits.Get(); var colors = terrainTypeColors[world.Map.Theater.ToLowerInvariant()]; + oreLayer = new Bitmap(terrain); for (var y = world.Map.YOffset; y < world.Map.YOffset + world.Map.Height; y++) for (var x = world.Map.XOffset; x < world.Map.XOffset + world.Map.Width; x++) - if (world.Map.ContainsResource(new int2(x, y))) + if (res.GetResource(new int2(x,y)) != null) oreLayer.SetPixel(x, y, colors[(int)TerrainMovementType.Ore]); } diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj index 2d7b51d370..f41e09dee1 100644 --- a/OpenRA.Game/OpenRA.Game.csproj +++ b/OpenRA.Game/OpenRA.Game.csproj @@ -98,7 +98,6 @@ - diff --git a/OpenRA.Game/Ore.cs b/OpenRA.Game/Ore.cs deleted file mode 100644 index bf8b25f807..0000000000 --- a/OpenRA.Game/Ore.cs +++ /dev/null @@ -1,67 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford. - * This file is part of OpenRA. - * - * OpenRA is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * OpenRA is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with OpenRA. If not, see . - */ -#endregion - -using System; -using OpenRA.FileFormats; -using OpenRA.Traits; - -namespace OpenRA -{ - public static class Ore - { - static bool HasOverlay(this Map map, int i, int j) - { - return map.MapTiles[i, j].overlay < overlayIsOre.Length; - } - - static bool ContainsOre(this Map map, int i, int j) - { - return map.HasOverlay(i, j) && overlayIsOre[map.MapTiles[i, j].overlay]; - } - - static bool ContainsGem(this Map map, int i, int j) - { - return map.HasOverlay(i, j) && overlayIsGems[map.MapTiles[i, j].overlay]; - } - - public static bool ContainsResource(this Map map, int2 p) - { - return map.ContainsGem(p.X, p.Y) || map.ContainsOre(p.X, p.Y); - } - - static bool[] overlayIsOre = - { - false, false, false, false, false, - true, true, true, true, - false, false, false, false, - false, false, false, false, false, false, false, - false, false, false, false, false, - }; - - static bool[] overlayIsGems = - { - false, false, false, false, false, - false, false, false, false, - true, true, true, true, - false, false, false, false, false, false, false, - false, false, false, false, false, - }; - } -} diff --git a/OpenRA.Game/Traits/Activities/Harvest.cs b/OpenRA.Game/Traits/Activities/Harvest.cs index 6179c54e02..3c66a5d728 100644 --- a/OpenRA.Game/Traits/Activities/Harvest.cs +++ b/OpenRA.Game/Traits/Activities/Harvest.cs @@ -64,12 +64,14 @@ namespace OpenRA.Traits.Activities void FindMoreOre(Actor self) { + var res = self.World.WorldActor.traits.Get(); + self.QueueActivity(new Move( () => { var search = new PathSearch { - heuristic = loc => (self.World.Map.ContainsResource(loc) ? 0 : 1), + heuristic = loc => (res.GetResource(loc) != null ? 0 : 1), umt = UnitMovementType.Wheel, checkForBlocked = true }; diff --git a/OpenRA.Game/Traits/Harvester.cs b/OpenRA.Game/Traits/Harvester.cs index e62a7efa7e..3422ebadb7 100644 --- a/OpenRA.Game/Traits/Harvester.cs +++ b/OpenRA.Game/Traits/Harvester.cs @@ -71,7 +71,7 @@ namespace OpenRA.Traits && underCursor.traits.Contains() && !IsEmpty) return new Order("Deliver", self, underCursor); - if (underCursor == null && self.World.Map.ContainsResource(xy)) + if (underCursor == null && self.World.WorldActor.traits.Get().GetResource(xy) != null) return new Order("Harvest", self, xy); return null; diff --git a/OpenRA.Game/Traits/World/ResourceLayer.cs b/OpenRA.Game/Traits/World/ResourceLayer.cs index 69a1b31ea4..6f389afcd3 100644 --- a/OpenRA.Game/Traits/World/ResourceLayer.cs +++ b/OpenRA.Game/Traits/World/ResourceLayer.cs @@ -35,7 +35,7 @@ namespace OpenRA.Traits World w; public ResourceTypeInfo[] resourceTypes; - public CellContents[,] content = new CellContents[128, 128]; + CellContents[,] content = new CellContents[128, 128]; public ResourceLayer(Actor self) { @@ -185,6 +185,8 @@ namespace OpenRA.Traits } } + public ResourceTypeInfo GetResource(int2 p) { return content[p.X, p.Y].type; } + public struct CellContents { public ResourceTypeInfo type; diff --git a/OpenRA.Game/UiOverlay.cs b/OpenRA.Game/UiOverlay.cs index 170ea0857f..6e7293f3f9 100644 --- a/OpenRA.Game/UiOverlay.cs +++ b/OpenRA.Game/UiOverlay.cs @@ -67,10 +67,11 @@ namespace OpenRA var position = Game.controller.MousePosition.ToInt2(); var topLeft = position - Footprint.AdjustForBuildingSize( bi ); var isCloseEnough = world.IsCloseEnoughToBase(world.LocalPlayer, name, bi, topLeft); + var res = world.WorldActor.traits.Get(); foreach( var t in Footprint.Tiles( name, bi, topLeft ) ) spriteRenderer.DrawSprite( ( isCloseEnough && world.IsCellBuildable( t, bi.WaterBound - ? UnitMovementType.Float : UnitMovementType.Wheel ) && !world.Map.ContainsResource( t ) ) + ? UnitMovementType.Float : UnitMovementType.Wheel ) && res.GetResource(t) == null ) ? buildOk : buildBlocked, Game.CellSize * t, "terrain" ); // Linebuild for walls. diff --git a/OpenRA.Game/WorldUtils.cs b/OpenRA.Game/WorldUtils.cs index 2fb4ec8d86..79b44f93e2 100755 --- a/OpenRA.Game/WorldUtils.cs +++ b/OpenRA.Game/WorldUtils.cs @@ -149,8 +149,9 @@ namespace OpenRA public static bool CanPlaceBuilding(this World world, string name, BuildingInfo building, int2 topLeft, Actor toIgnore) { + var res = world.WorldActor.traits.Get(); return !Footprint.Tiles(name, building, topLeft).Any( - t => !world.Map.IsInMap(t.X, t.Y) || world.Map.ContainsResource(t) || !world.IsCellBuildable(t, + t => !world.Map.IsInMap(t.X, t.Y) || res.GetResource(t) != null || !world.IsCellBuildable(t, building.WaterBound ? UnitMovementType.Float : UnitMovementType.Wheel, toIgnore)); } From 9b0d8b8f3b0ce8634aac066683f72eadd04cc52f Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Wed, 3 Mar 2010 21:30:31 +1300 Subject: [PATCH 08/38] moved growth/spread control onto ResourceType --- OpenRA.Game/OpenRA.Game.csproj | 1 - OpenRA.Game/Traits/World/ResourceLayer.cs | 3 +- OpenRA.Game/Traits/World/ResourceType.cs | 34 +++++++++++++++++++++-- mods/cnc/compat.yaml | 1 + mods/cnc/system.yaml | 7 ++--- mods/ra/rules.yaml | 7 ++--- 6 files changed, 37 insertions(+), 16 deletions(-) diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj index f41e09dee1..7965e8cdbe 100644 --- a/OpenRA.Game/OpenRA.Game.csproj +++ b/OpenRA.Game/OpenRA.Game.csproj @@ -114,7 +114,6 @@ - diff --git a/OpenRA.Game/Traits/World/ResourceLayer.cs b/OpenRA.Game/Traits/World/ResourceLayer.cs index 6f389afcd3..784fc1f385 100644 --- a/OpenRA.Game/Traits/World/ResourceLayer.cs +++ b/OpenRA.Game/Traits/World/ResourceLayer.cs @@ -159,7 +159,7 @@ namespace OpenRA.Traits ++content[i, j].density; } - public void Spread(ResourceTypeInfo info, Random r, float chance) + public void Spread(ResourceTypeInfo info) { var map = w.Map; @@ -170,7 +170,6 @@ namespace OpenRA.Traits for (int j = minj; j < maxj; j++) for (int i = mini; i < maxi; i++) if (content[i,j].type == null - && r.NextDouble() < chance && GetAdjacentCellsWith(info, i,j ) > 0 && w.IsCellBuildable(new int2(i, j), UnitMovementType.Wheel)) growMask[i, j] = true; diff --git a/OpenRA.Game/Traits/World/ResourceType.cs b/OpenRA.Game/Traits/World/ResourceType.cs index 6c98f0a8ea..79a1e25e92 100644 --- a/OpenRA.Game/Traits/World/ResourceType.cs +++ b/OpenRA.Game/Traits/World/ResourceType.cs @@ -19,7 +19,7 @@ #endregion using OpenRA.Graphics; -using System.Collections.Generic; + namespace OpenRA.Traits { public class ResourceTypeInfo : ITraitInfo @@ -27,13 +27,41 @@ namespace OpenRA.Traits public readonly int[] Overlays = { }; public readonly string[] SpriteNames = { }; public readonly string Palette = "terrain"; + public readonly int ValuePerUnit = 0; public readonly string Name = null; + public readonly float GrowthInterval = 0; + public readonly float SpreadInterval = 0; + public Sprite[][] Sprites; - public object Create(Actor self) { return new ResourceType(); } + public object Create(Actor self) { return new ResourceType(this); } } - class ResourceType { } + class ResourceType : ITick + { + int growthTicks; + int spreadTicks; + ResourceTypeInfo info; + + public ResourceType(ResourceTypeInfo info) { this.info = info; } + + public void Tick(Actor self) + { + if (info.GrowthInterval != 0 && --growthTicks <= 0) + { + growthTicks = (int)(info.GrowthInterval * 25 * 60); + self.World.WorldActor.traits.Get().Grow(info); + self.World.Minimap.InvalidateOre(); + } + + if (info.SpreadInterval != 0 && --spreadTicks <= 0) + { + spreadTicks = (int)(info.SpreadInterval * 25 * 60); + self.World.WorldActor.traits.Get().Spread(info); + self.World.Minimap.InvalidateOre(); + } + } + } } diff --git a/mods/cnc/compat.yaml b/mods/cnc/compat.yaml index 010c119e6d..44b1266e79 100644 --- a/mods/cnc/compat.yaml +++ b/mods/cnc/compat.yaml @@ -38,4 +38,5 @@ MINE: RenderBuilding: Palette: terrain SeedsOre: + ResourceType: Tiberium -Selectable: diff --git a/mods/cnc/system.yaml b/mods/cnc/system.yaml index 0dd0e95844..9f3af4c520 100644 --- a/mods/cnc/system.yaml +++ b/mods/cnc/system.yaml @@ -153,11 +153,6 @@ World: B: 0 A: 180 ShroudPalette: - OreGrowth: - Interval: .3 - Chance: .02 - Spreads: yes - Grows: yes Country@gdi: Name: GDI Race: gdi @@ -173,3 +168,5 @@ World: SpriteNames: ti1,ti2,ti3,ti4,ti5,ti6,ti7,ti8,ti9,ti10,ti11,ti12 ValuePerUnit: 30 Name: Tiberium + GrowthInterval: .1 + SpreadInterval: .1 diff --git a/mods/ra/rules.yaml b/mods/ra/rules.yaml index a1c1bdee32..90d0da1f4b 100644 --- a/mods/ra/rules.yaml +++ b/mods/ra/rules.yaml @@ -184,11 +184,6 @@ World: B: 0 A: 180 ShroudPalette: - OreGrowth: - Interval: .3 - Chance: .02 - Spreads: yes - Grows: yes Country@0: Name: England Race: allies @@ -241,6 +236,8 @@ World: SpriteNames: gold01,gold02,gold03,gold04 ValuePerUnit: 30 Name: Ore + GrowthInterval: .3 + SpreadInterval: .7 ResourceType@gem: Overlays: 9,10,11,12 Palette: terrain From 070caa5acb2723e4ddc9393b825dd3d607608337 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Wed, 3 Mar 2010 21:31:17 +1300 Subject: [PATCH 09/38] oops, missed deleting that. --- OpenRA.Game/Traits/World/OreGrowth.cs | 64 --------------------------- 1 file changed, 64 deletions(-) delete mode 100644 OpenRA.Game/Traits/World/OreGrowth.cs diff --git a/OpenRA.Game/Traits/World/OreGrowth.cs b/OpenRA.Game/Traits/World/OreGrowth.cs deleted file mode 100644 index 8a4e464102..0000000000 --- a/OpenRA.Game/Traits/World/OreGrowth.cs +++ /dev/null @@ -1,64 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford. - * This file is part of OpenRA. - * - * OpenRA is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * OpenRA is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with OpenRA. If not, see . - */ -#endregion - -using System.Linq; - -namespace OpenRA.Traits -{ - class OreGrowthInfo : ITraitInfo - { - public readonly float Interval = 1f; - public readonly float Chance = .02f; - public readonly bool Spreads = true; - public readonly bool Grows = true; - - public object Create(Actor self) { return new OreGrowth(); } - } - - class OreGrowth : ITick - { - int remainingTicks; - - public void Tick(Actor self) - { - if (--remainingTicks <= 0) - { - var info = self.Info.Traits.Get(); - - // HACK HACK: we should push "grows" down to the resource. - var oreResource = self.World.WorldActor.Info.Traits.WithInterface() - .FirstOrDefault(r => r.Name == "Ore"); - - if (oreResource != null) - { - if (info.Spreads) - self.World.WorldActor.traits.Get().Spread(oreResource, - self.World.SharedRandom, info.Chance); - - if (info.Grows) - self.World.WorldActor.traits.Get().Grow(oreResource); - } - - self.World.Minimap.InvalidateOre(); - remainingTicks = (int)(info.Interval * 60 * 25); - } - } - } -} From 915e824c88af0332980d9bc510d9e6a9f7d9c6f7 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Wed, 3 Mar 2010 21:39:15 +1300 Subject: [PATCH 10/38] rename SeedsOre -> SeedsResource, since that wasnt accurate anymore. --- OpenRA.Game/Traits/{SeedsOre.cs => SeedsResource.cs} | 8 ++++---- mods/cnc/compat.yaml | 2 +- mods/ra/rules.yaml | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) rename OpenRA.Game/Traits/{SeedsOre.cs => SeedsResource.cs} (87%) diff --git a/OpenRA.Game/Traits/SeedsOre.cs b/OpenRA.Game/Traits/SeedsResource.cs similarity index 87% rename from OpenRA.Game/Traits/SeedsOre.cs rename to OpenRA.Game/Traits/SeedsResource.cs index 7006d3bc19..e3ba14ff28 100644 --- a/OpenRA.Game/Traits/SeedsOre.cs +++ b/OpenRA.Game/Traits/SeedsResource.cs @@ -23,16 +23,16 @@ using System; namespace OpenRA.Traits { - class SeedsOreInfo : ITraitInfo + class SeedsResourceInfo : ITraitInfo { public readonly float Chance = .05f; public readonly int Interval = 5; public readonly string ResourceType = "Ore"; - public object Create(Actor self) { return new SeedsOre(); } + public object Create(Actor self) { return new SeedsResource(); } } - class SeedsOre : ITick + class SeedsResource : ITick { int ticks; @@ -40,7 +40,7 @@ namespace OpenRA.Traits { if (--ticks <= 0) { - var info = self.Info.Traits.Get(); + var info = self.Info.Traits.Get(); var resourceType = self.World.WorldActor.Info.Traits .WithInterface() .FirstOrDefault(t => t.Name == info.ResourceType); diff --git a/mods/cnc/compat.yaml b/mods/cnc/compat.yaml index 44b1266e79..5911658d77 100644 --- a/mods/cnc/compat.yaml +++ b/mods/cnc/compat.yaml @@ -37,6 +37,6 @@ MINE: Inherits: ^Building RenderBuilding: Palette: terrain - SeedsOre: + SeedsResource: ResourceType: Tiberium -Selectable: diff --git a/mods/ra/rules.yaml b/mods/ra/rules.yaml index 90d0da1f4b..eaa4194f9a 100644 --- a/mods/ra/rules.yaml +++ b/mods/ra/rules.yaml @@ -1920,7 +1920,7 @@ TC05: MINE: Inherits: ^Building - SeedsOre: + SeedsResource: -Selectable: BOXES01: From 40dbd3c9c58653e32d6b199774380df02755d652 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Wed, 3 Mar 2010 21:40:23 +1300 Subject: [PATCH 11/38] project file. --- OpenRA.Game/OpenRA.Game.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj index 7965e8cdbe..46bb277358 100644 --- a/OpenRA.Game/OpenRA.Game.csproj +++ b/OpenRA.Game/OpenRA.Game.csproj @@ -245,7 +245,7 @@ - + From 0e734312097ffd851faa90d5d1de7d0e7fda70fb Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Wed, 3 Mar 2010 21:56:33 +1300 Subject: [PATCH 12/38] harvester can be fussy now. --- OpenRA.Game/Traits/Activities/Harvest.cs | 6 +++- OpenRA.Game/Traits/Harvester.cs | 41 +++++++++++------------- OpenRA.Game/Traits/SeedsResource.cs | 2 +- mods/cnc/minimal.ini | 2 -- mods/cnc/vehicles.yaml | 2 ++ mods/ra/rules.ini | 2 -- mods/ra/rules.yaml | 6 ++-- 7 files changed, 31 insertions(+), 30 deletions(-) diff --git a/OpenRA.Game/Traits/Activities/Harvest.cs b/OpenRA.Game/Traits/Activities/Harvest.cs index 3c66a5d728..dafa4d4fbb 100644 --- a/OpenRA.Game/Traits/Activities/Harvest.cs +++ b/OpenRA.Game/Traits/Activities/Harvest.cs @@ -18,6 +18,8 @@ */ #endregion +using System.Linq; + namespace OpenRA.Traits.Activities { public class Harvest : IActivity @@ -65,13 +67,15 @@ namespace OpenRA.Traits.Activities void FindMoreOre(Actor self) { var res = self.World.WorldActor.traits.Get(); + var harv = self.Info.Traits.Get(); self.QueueActivity(new Move( () => { var search = new PathSearch { - heuristic = loc => (res.GetResource(loc) != null ? 0 : 1), + heuristic = loc => (res.GetResource(loc) != null + && harv.Resources.Any( r => res.GetResource(loc).Name == r )) ? 0 : 1, umt = UnitMovementType.Wheel, checkForBlocked = true }; diff --git a/OpenRA.Game/Traits/Harvester.cs b/OpenRA.Game/Traits/Harvester.cs index 3422ebadb7..d25f2d2355 100644 --- a/OpenRA.Game/Traits/Harvester.cs +++ b/OpenRA.Game/Traits/Harvester.cs @@ -19,24 +19,24 @@ #endregion using System.Collections.Generic; +using System.Linq; using OpenRA.Traits.Activities; +using OpenRA.FileFormats; namespace OpenRA.Traits { class HarvesterInfo : ITraitInfo { - public readonly int BailCount = 28; + public readonly int Capacity = 28; public readonly int PipCount = 7; + public readonly string[] Resources = { }; public object Create(Actor self) { return new Harvester(self); } } public class Harvester : IIssueOrder, IResolveOrder, IPips { - [Sync] - public int oreCarried = 0; /* sum of these must not exceed capacity */ - [Sync] - public int gemsCarried = 0; + Dictionary contents = new Dictionary(); Actor self; public Harvester(Actor self) @@ -44,22 +44,19 @@ namespace OpenRA.Traits this.self = self; } - public bool IsFull { get { return oreCarried + gemsCarried == self.Info.Traits.Get().BailCount; } } - public bool IsEmpty { get { return oreCarried == 0 && gemsCarried == 0; } } + public bool IsFull { get { return contents.Values.Sum() == self.Info.Traits.Get().Capacity; } } + public bool IsEmpty { get { return contents.Values.Sum() == 0; } } public void AcceptResource(ResourceTypeInfo type) { - // FIXME: harvester probably needs to know *exactly* what it is carrying. - if (type.Name == "Gems") gemsCarried++; - else oreCarried++; + if (!contents.ContainsKey(type)) contents[type] = 1; + else contents[type]++; } public void Deliver(Actor self, Actor proc) { - proc.Owner.GiveOre(oreCarried * Rules.General.GoldValue); - proc.Owner.GiveOre(gemsCarried * Rules.General.GemValue); - oreCarried = 0; - gemsCarried = 0; + proc.Owner.GiveOre(contents.Sum(kv => kv.Key.ValuePerUnit * kv.Value)); + contents.Clear(); } public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor) @@ -71,7 +68,11 @@ namespace OpenRA.Traits && underCursor.traits.Contains() && !IsEmpty) return new Order("Deliver", self, underCursor); - if (underCursor == null && self.World.WorldActor.traits.Get().GetResource(xy) != null) + var res = self.World.WorldActor.traits.Get().GetResource(xy); + + if (underCursor == null && + res != null && self.Info.Traits.Get().Resources + .Any(r => r == res.Name)) return new Order("Harvest", self, xy); return null; @@ -95,16 +96,12 @@ namespace OpenRA.Traits public IEnumerable GetPips(Actor self) { int numPips = self.Info.Traits.Get().PipCount; + int n = contents.Values.Sum(); for (int i = 0; i < numPips; i++) { - if (gemsCarried * 1.0f / self.Info.Traits.Get().BailCount > i * 1.0f / numPips) - { - yield return PipType.Red; - continue; - } - - if ((gemsCarried + oreCarried) * 1.0f / self.Info.Traits.Get().BailCount > i * 1.0f / numPips) + // todo: pip colors based on ResourceTypeInfo + if (n * 1.0f / self.Info.Traits.Get().Capacity > i * 1.0f / numPips) { yield return PipType.Yellow; continue; diff --git a/OpenRA.Game/Traits/SeedsResource.cs b/OpenRA.Game/Traits/SeedsResource.cs index e3ba14ff28..e290e08ee6 100644 --- a/OpenRA.Game/Traits/SeedsResource.cs +++ b/OpenRA.Game/Traits/SeedsResource.cs @@ -18,8 +18,8 @@ */ #endregion -using System.Linq; using System; +using System.Linq; namespace OpenRA.Traits { diff --git a/mods/cnc/minimal.ini b/mods/cnc/minimal.ini index 40ec05ee6e..8888077132 100644 --- a/mods/cnc/minimal.ini +++ b/mods/cnc/minimal.ini @@ -10,8 +10,6 @@ URepairPercent=20% ; [units only] percent cost to fully repair as ratio of URepairStep=10 ; [units only] hit points to heal per repair 'tick' for units BuildSpeed=.1 ; general build speed [time (in minutes) to produce a 1000 credit cost item] -GemValue=50 ; gem credits per 'bail' carried by a harvester -GoldValue=25 ; gold credits per 'bail' carried by a harvester LowPowerSlowdown=3 ; slowdown factor for low power GapRegenInterval=.1 ; gap generators will regenerate their shroud at this time interval diff --git a/mods/cnc/vehicles.yaml b/mods/cnc/vehicles.yaml index 0f309385a0..ff84a70e6a 100644 --- a/mods/cnc/vehicles.yaml +++ b/mods/cnc/vehicles.yaml @@ -37,6 +37,8 @@ HARV: Selectable: Priority: 7 Harvester: + Resources: Tiberium + Capacity: 28 Unit: HP: 600 Armor: light diff --git a/mods/ra/rules.ini b/mods/ra/rules.ini index d29c1c836e..b699902464 100644 --- a/mods/ra/rules.ini +++ b/mods/ra/rules.ini @@ -49,8 +49,6 @@ Incoming=10 ; If an incoming projectile is as slow or slower than th ; income and production BuildSpeed=.8 ; general build speed [time (in minutes) to produce a 1000 credit cost item] BuildupTime=.06 ; average minutes that building build-up animation runs -GemValue=50 ; gem credits per 'bail' carried by a harvester -GoldValue=25 ; gold credits per 'bail' carried by a harvester OreTruckRate=1 ; speed that harvester truck manages ore [larger means slower] SeparateAircraft=no ; Is first helicopter to be purchased separately from helipad? SurvivorRate=.4 ; fraction of building cost to be converted to survivors when sold diff --git a/mods/ra/rules.yaml b/mods/ra/rules.yaml index eaa4194f9a..b61de4ae82 100644 --- a/mods/ra/rules.yaml +++ b/mods/ra/rules.yaml @@ -234,7 +234,7 @@ World: Overlays: 5,6,7,8 Palette: terrain SpriteNames: gold01,gold02,gold03,gold04 - ValuePerUnit: 30 + ValuePerUnit: 25 Name: Ore GrowthInterval: .3 SpreadInterval: .7 @@ -242,7 +242,7 @@ World: Overlays: 9,10,11,12 Palette: terrain SpriteNames: gem01,gem02,gem03,gem04 - ValuePerUnit: 60 + ValuePerUnit: 50 Name: Gems MGG: @@ -801,6 +801,8 @@ HARV: Selectable: Priority: 7 Harvester: + Capacity: 28 + Resources: Ore,Gems Unit: HP: 600 Armor: heavy From bb0aaba950d33fceaea803e0fb0a914c26692b67 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Wed, 3 Mar 2010 21:58:12 +1300 Subject: [PATCH 13/38] renamed OverlayRenderer to SmudgeRenderer. it has nothing to do with overlay anymore. --- .../Graphics/{OverlayRenderer.cs => SmudgeRenderer.cs} | 4 ++-- OpenRA.Game/Graphics/TerrainRenderer.cs | 4 ++-- OpenRA.Game/OpenRA.Game.csproj | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) rename OpenRA.Game/Graphics/{OverlayRenderer.cs => SmudgeRenderer.cs} (92%) mode change 100755 => 100644 diff --git a/OpenRA.Game/Graphics/OverlayRenderer.cs b/OpenRA.Game/Graphics/SmudgeRenderer.cs old mode 100755 new mode 100644 similarity index 92% rename from OpenRA.Game/Graphics/OverlayRenderer.cs rename to OpenRA.Game/Graphics/SmudgeRenderer.cs index 285eb8f206..55fd18a930 --- a/OpenRA.Game/Graphics/OverlayRenderer.cs +++ b/OpenRA.Game/Graphics/SmudgeRenderer.cs @@ -23,7 +23,7 @@ using OpenRA.FileFormats; namespace OpenRA.Graphics { - class OverlayRenderer + class SmudgeRenderer { static string[] smudgeSpriteNames = { @@ -36,7 +36,7 @@ namespace OpenRA.Graphics SpriteRenderer spriteRenderer; Map map; - public OverlayRenderer( Renderer renderer, Map map ) + public SmudgeRenderer( Renderer renderer, Map map ) { this.spriteRenderer = new SpriteRenderer( renderer, true ); this.map = map; diff --git a/OpenRA.Game/Graphics/TerrainRenderer.cs b/OpenRA.Game/Graphics/TerrainRenderer.cs index c456dd312f..91fff1db10 100644 --- a/OpenRA.Game/Graphics/TerrainRenderer.cs +++ b/OpenRA.Game/Graphics/TerrainRenderer.cs @@ -33,7 +33,7 @@ namespace OpenRA.Graphics Renderer renderer; Map map; - OverlayRenderer overlayRenderer; + SmudgeRenderer overlayRenderer; public TerrainRenderer(World world, Renderer renderer, WorldRenderer wr) { @@ -69,7 +69,7 @@ namespace OpenRA.Graphics indexBuffer = renderer.Device.CreateIndexBuffer( indices.Length ); indexBuffer.SetData( indices ); - overlayRenderer = new OverlayRenderer( renderer, map ); + overlayRenderer = new SmudgeRenderer( renderer, map ); } public void Draw( Viewport viewport ) diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj index 46bb277358..686d1760c9 100644 --- a/OpenRA.Game/OpenRA.Game.csproj +++ b/OpenRA.Game/OpenRA.Game.csproj @@ -143,7 +143,7 @@ - + From 4c528059fb598972c46f7850c1bc3c89c9f231df Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Wed, 3 Mar 2010 21:59:13 +1300 Subject: [PATCH 14/38] cleanup --- OpenRA.Game/Traits/Harvester.cs | 1 - OpenRA.Game/Traits/World/ResourceLayer.cs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/OpenRA.Game/Traits/Harvester.cs b/OpenRA.Game/Traits/Harvester.cs index d25f2d2355..cde2e48add 100644 --- a/OpenRA.Game/Traits/Harvester.cs +++ b/OpenRA.Game/Traits/Harvester.cs @@ -21,7 +21,6 @@ using System.Collections.Generic; using System.Linq; using OpenRA.Traits.Activities; -using OpenRA.FileFormats; namespace OpenRA.Traits { diff --git a/OpenRA.Game/Traits/World/ResourceLayer.cs b/OpenRA.Game/Traits/World/ResourceLayer.cs index 784fc1f385..7d1afeada9 100644 --- a/OpenRA.Game/Traits/World/ResourceLayer.cs +++ b/OpenRA.Game/Traits/World/ResourceLayer.cs @@ -18,9 +18,9 @@ */ #endregion +using System; using System.Linq; using OpenRA.Graphics; -using System; namespace OpenRA.Traits { From 6236acd35b29408d2a029d390a2a453944753ca7 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Wed, 3 Mar 2010 22:01:07 +1300 Subject: [PATCH 15/38] remove obsolete keys from GeneralInfo --- OpenRA.Game/GameRules/GeneralInfo.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/OpenRA.Game/GameRules/GeneralInfo.cs b/OpenRA.Game/GameRules/GeneralInfo.cs index 4a6321e6d8..970d4bfdaa 100644 --- a/OpenRA.Game/GameRules/GeneralInfo.cs +++ b/OpenRA.Game/GameRules/GeneralInfo.cs @@ -64,8 +64,6 @@ namespace OpenRA.GameRules /* Income & Production */ public readonly float BuildSpeed = 0; public readonly float BuildupTime = 0; - public readonly int GemValue = 0; - public readonly int GoldValue = 0; public readonly float OreTruckRate = 0; public readonly bool SeparateAircraft = true; public readonly float SurvivorRate = 0; From bdd3426e590d6e2cb0344cc18a60f743e88f20bb Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Wed, 3 Mar 2010 22:12:31 +1300 Subject: [PATCH 16/38] some small changes to make it actually *work*. --- OpenRA.Game/Traits/World/ResourceLayer.cs | 5 ++++- mods/cnc/defaults.yaml | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/OpenRA.Game/Traits/World/ResourceLayer.cs b/OpenRA.Game/Traits/World/ResourceLayer.cs index 7d1afeada9..8797ce3336 100644 --- a/OpenRA.Game/Traits/World/ResourceLayer.cs +++ b/OpenRA.Game/Traits/World/ResourceLayer.cs @@ -104,7 +104,7 @@ namespace OpenRA.Traits public int GetIdealDensity(int x, int y) { return (GetAdjacentCellsWith(content[x, y].type, x, y) * - content[x, y].image.Length) / 9; + (content[x, y].image.Length - 1)) / 9; } public void AddResource(ResourceTypeInfo info, int i, int j, int n) @@ -130,7 +130,10 @@ namespace OpenRA.Traits if (type == null) return null; if (--content[p.X, p.Y].density < 0) + { content[p.X, p.Y].type = null; + content[p.X, p.Y].image = null; + } return type; } diff --git a/mods/cnc/defaults.yaml b/mods/cnc/defaults.yaml index 198f741784..3ddebcce3b 100644 --- a/mods/cnc/defaults.yaml +++ b/mods/cnc/defaults.yaml @@ -43,7 +43,6 @@ Building: Dimensions: 1,1 Footprint: x - BaseNormal: no BuildSounds: constru2.aud, hvydoor1.aud SellSounds: cashturn.aud RenderBuilding: @@ -64,6 +63,7 @@ SellSounds: cashturn.aud Capturable: false Bib: no + BaseNormal: no Crewed: no Sight: 0 Wall: From ba1b05b4f21e619fb6d443ee1eac8a19e5a9a0ed Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Thu, 4 Mar 2010 08:36:25 +1300 Subject: [PATCH 17/38] fix clumsy check for wanted resource in Harvester.cs --- OpenRA.Game/Traits/Harvester.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/OpenRA.Game/Traits/Harvester.cs b/OpenRA.Game/Traits/Harvester.cs index cde2e48add..c4a15a2d7d 100644 --- a/OpenRA.Game/Traits/Harvester.cs +++ b/OpenRA.Game/Traits/Harvester.cs @@ -68,10 +68,9 @@ namespace OpenRA.Traits return new Order("Deliver", self, underCursor); var res = self.World.WorldActor.traits.Get().GetResource(xy); + var info = self.Info.Traits.Get(); - if (underCursor == null && - res != null && self.Info.Traits.Get().Resources - .Any(r => r == res.Name)) + if (underCursor == null && res != null && info.Resources.Contains(res.Name)) return new Order("Harvest", self, xy); return null; From e634bec3fe7b75bbf0eaf73667fed4b98126f5f3 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Thu, 4 Mar 2010 08:38:09 +1300 Subject: [PATCH 18/38] similar to prev. --- OpenRA.Game/Traits/Activities/Harvest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenRA.Game/Traits/Activities/Harvest.cs b/OpenRA.Game/Traits/Activities/Harvest.cs index dafa4d4fbb..49a0482d52 100644 --- a/OpenRA.Game/Traits/Activities/Harvest.cs +++ b/OpenRA.Game/Traits/Activities/Harvest.cs @@ -75,7 +75,7 @@ namespace OpenRA.Traits.Activities var search = new PathSearch { heuristic = loc => (res.GetResource(loc) != null - && harv.Resources.Any( r => res.GetResource(loc).Name == r )) ? 0 : 1, + && harv.Resources.Contains( res.GetResource(loc).Name )) ? 0 : 1, umt = UnitMovementType.Wheel, checkForBlocked = true }; From 2c999808e766d12a116e3f75e0d4658eb21e11df Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Thu, 4 Mar 2010 08:39:41 +1300 Subject: [PATCH 19/38] Ore -> Resource --- OpenRA.Game/Traits/Activities/Harvest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenRA.Game/Traits/Activities/Harvest.cs b/OpenRA.Game/Traits/Activities/Harvest.cs index 49a0482d52..c40a4769b8 100644 --- a/OpenRA.Game/Traits/Activities/Harvest.cs +++ b/OpenRA.Game/Traits/Activities/Harvest.cs @@ -41,7 +41,7 @@ namespace OpenRA.Traits.Activities return this; else { - FindMoreOre(self); + FindMoreResource(self); return NextActivity; } } @@ -64,7 +64,7 @@ namespace OpenRA.Traits.Activities return true; } - void FindMoreOre(Actor self) + void FindMoreResource(Actor self) { var res = self.World.WorldActor.traits.Get(); var harv = self.Info.Traits.Get(); From 88f322d3ccd42510bfc4b029b2668ce301ecdb48 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sun, 28 Feb 2010 14:30:02 +1300 Subject: [PATCH 20/38] Linebuild walls --- OpenRA.Game/OpenRA.Game.csproj | 2 +- mods/cnc/defaults.yaml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj index 686d1760c9..7671f0c818 100644 --- a/OpenRA.Game/OpenRA.Game.csproj +++ b/OpenRA.Game/OpenRA.Game.csproj @@ -1,4 +1,4 @@ - + Debug diff --git a/mods/cnc/defaults.yaml b/mods/cnc/defaults.yaml index 3ddebcce3b..57720ba172 100644 --- a/mods/cnc/defaults.yaml +++ b/mods/cnc/defaults.yaml @@ -43,6 +43,7 @@ Building: Dimensions: 1,1 Footprint: x + BaseNormal: no BuildSounds: constru2.aud, hvydoor1.aud SellSounds: cashturn.aud RenderBuilding: From 3fd7af55327079a9810a4f48d946729911454256 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Mon, 1 Mar 2010 20:52:38 +1300 Subject: [PATCH 21/38] Test: Load c&c terrain tiles --- OpenRA.FileFormats/Terrain.cs | 53 ++- OpenRA.FileFormats/TileSet.cs | 9 +- OpenRA.Game/Shroud.cs | 6 +- doc/cncff.txt | 625 ++++++++++++++++++++++++++++++++++ doc/cncmap.txt | 500 +++++++++++++++++++++++++++ mods/cnc/defaults.yaml | 1 - mods/cnc/mod.yaml | 1 + mods/cnc/system.yaml | 2 +- 8 files changed, 1176 insertions(+), 21 deletions(-) create mode 100644 doc/cncff.txt create mode 100644 doc/cncmap.txt diff --git a/OpenRA.FileFormats/Terrain.cs b/OpenRA.FileFormats/Terrain.cs index bf321d174f..ad6d7f4233 100644 --- a/OpenRA.FileFormats/Terrain.cs +++ b/OpenRA.FileFormats/Terrain.cs @@ -29,27 +29,52 @@ namespace OpenRA.FileFormats public Terrain( Stream stream ) { - int Width, Height; - + int Width, Height, IndexEnd, IndexStart; + uint ImgStart; + // Try loading as a cnc .tem BinaryReader reader = new BinaryReader( stream ); Width = reader.ReadUInt16(); Height = reader.ReadUInt16(); if( Width != 24 || Height != 24 ) throw new InvalidDataException( string.Format( "{0}x{1}", Width, Height ) ); - + /*NumTiles = */reader.ReadUInt16(); - reader.ReadUInt16(); - /*XDim = */reader.ReadUInt16(); - /*YDim = */reader.ReadUInt16(); - /*uint FileSize = */reader.ReadUInt32(); - uint ImgStart = reader.ReadUInt32(); - reader.ReadUInt32(); - reader.ReadUInt32(); - int IndexEnd = reader.ReadInt32(); - reader.ReadUInt32(); - int IndexStart = reader.ReadInt32(); - + /*Zero1 = */reader.ReadUInt16(); + /*uint Size = */reader.ReadUInt32(); + ImgStart = reader.ReadUInt32(); + /*Zero2 = */reader.ReadUInt32(); + + if (reader.ReadUInt16() == 65535) // ID1 = FFFFh for cnc + { + /*ID2 = */reader.ReadUInt16(); + IndexEnd = reader.ReadInt32(); + IndexStart = reader.ReadInt32(); + } + else // Load as a ra .tem + { + stream.Position = 0; + // Try loading as an RA .tem + reader = new BinaryReader( stream ); + Width = reader.ReadUInt16(); + Height = reader.ReadUInt16(); + if( Width != 24 || Height != 24 ) + throw new InvalidDataException( string.Format( "{0}x{1}", Width, Height ) ); + + /*NumTiles = */reader.ReadUInt16(); + reader.ReadUInt16(); + /*XDim = */reader.ReadUInt16(); + /*YDim = */reader.ReadUInt16(); + /*uint FileSize = */reader.ReadUInt32(); + ImgStart = reader.ReadUInt32(); + reader.ReadUInt32(); + reader.ReadUInt32(); + IndexEnd = reader.ReadInt32(); + reader.ReadUInt32(); + IndexStart = reader.ReadInt32(); + } + + Log.Write("IndexStart: {0}",IndexStart); stream.Position = IndexStart; foreach( byte b in new BinaryReader(stream).ReadBytes(IndexEnd - IndexStart) ) diff --git a/OpenRA.FileFormats/TileSet.cs b/OpenRA.FileFormats/TileSet.cs index 905c30263b..eb0278ef70 100644 --- a/OpenRA.FileFormats/TileSet.cs +++ b/OpenRA.FileFormats/TileSet.cs @@ -76,6 +76,7 @@ namespace OpenRA.FileFormats using( Stream s = FileSystem.Open( tilename + suffix ) ) { + Log.Write(tilename+suffix); if( !tiles.ContainsKey( (ushort)( start + i ) ) ) tiles.Add( (ushort)( start + i ), new Terrain( s ) ); } @@ -88,9 +89,11 @@ namespace OpenRA.FileFormats public byte[] GetBytes(TileReference r) { Terrain tile; - if( tiles.TryGetValue( r.tile, out tile ) ) - return tile.TileBitmapBytes[ r.image ]; - + try { + if( tiles.TryGetValue( r.tile, out tile ) ) + return tile.TileBitmapBytes[ r.image ]; + } catch (System.ArgumentOutOfRangeException) {} + byte[] missingTile = new byte[ 24 * 24 ]; for( int i = 0 ; i < missingTile.Length ; i++ ) missingTile[ i ] = 0x36; diff --git a/OpenRA.Game/Shroud.cs b/OpenRA.Game/Shroud.cs index 7291d3c359..cca332c978 100644 --- a/OpenRA.Game/Shroud.cs +++ b/OpenRA.Game/Shroud.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford. * This file is part of OpenRA. @@ -34,7 +34,9 @@ namespace OpenRA Sprite[] shadowBits = SpriteSheetBuilder.LoadAllSprites("shadow"); Sprite[,] sprites = new Sprite[128, 128]; bool dirty = true; - bool hasGPS = false; + + // TODO: Testing + bool hasGPS = true; Player owner; Map map; public Rectangle? bounds; diff --git a/doc/cncff.txt b/doc/cncff.txt new file mode 100644 index 0000000000..f025a3ed50 --- /dev/null +++ b/doc/cncff.txt @@ -0,0 +1,625 @@ + COMMAND & CONQUER FILE FORMATS + +Revision 4 + +by Vladan Bato (bat22@geocities.com) + +This document explains the file formats used by Command & Conquer. + +Command & Conquer is a tradmark of Westwood Studios, Inc. +Command & Conquer is Copyright (C)1995 Westwood Studios, Inc. + +The information provided here is meant for programmers that want to make +editor and utilites for Command & Conquer. My explanation might not be +the best one, but it should be enough. + +I can't guarantee that the information in here is correct. If you find any +errors, please report them to me. + +In this document I'll use Pascal notation, and any code samples will be in +Pascal.... +I wanted to rewrite them in C, but I don't have the time to test the code. +So, to avoid any risks, I'll use the code from Mix Manager. + +In case you don't know, the information contained here has been used to +make the program Mix Manager, which contains a lot of conversion utilities +for the various formats. For more info, check my homepage (see the end of +the document). + +=================== + 1. THE .MIX FILES +=================== + +You probably already know the format of these files, but I will add a +description here for completeness. + +The MIX file consists of two parts : +-A header including the index of all the files contained within +-A body containing all the files + +It's format is : + + Header : record + NumFiles : word; {Number of files in MIX} + DataSize : longint; {Size of body} + Index : array [1..NumFiles] of + record + ID : longint; {File ID} + Start : longint; {Offset of file from the start of the +body} + Size : longint; {file size} + end; + end; + +The ID field is computed from the original filename, which is not stored in +the MIX. +The records are always sorted by the ID field (the numbers are signed +longints). +Note that the offsets are relative to the start of the body so to find the +actual offset in the MIX you have to add the size of the header which is +NumFiles*12+6 + +=================== + 2. THE .PAL FILES +=================== + +The most easiest files.... +These files contain the palette in the same format used by VGA cards. + + Palette : array [0..255] of record + red,green,blue:byte; + end; + +Note that only the first 6 bits of each number are used, giving a total of +262144 possible colors (as opposed to the 8 bits used by .PCX files for +example). + +================================= + 3. THE TEMPLATE AND .BIN FILES +================================= + +The Template files contain the map graphics, and can be found in the +theater specific MIX files (TEMPERAT.MIX, WINTER.MIX, DESERT.MIX). +The .BIN files contain the maps for the missions and are used in conjunction +with the .INI files. + +I won't explain them here. They are explained with great detail in the +document titled "Command & Conquer maps" I wrote some time ago. +The said document can be found on my homepage. + +=================== + 5. THE .SHP FILES +=================== + +The .SHP files contain almost all the graphics : units, structures, +trees,... +The header has the following structure : + + Header : record + NumImages : word; {Number of images} + A,B : word; {Unknown} + Width, + Height : word; {Width and Height of the images} + C : longint; {Unknown} + end; + +If you know something about those unknown fields, please e-mail me. +Following that there's an array of records, one for each image : + + Offsets : array [0..NumImages+1] of + record + Offset : longint; {Offset and format of image in file} + RefOffs : longint; {Offset and format of image on + which it is based} + end; + +The most significant byte (last) of the Offset and RefOffs fields +contains the format, while the lower three are used for the offset. +The format byte can have one of the three values : 80h, 40h, 20h. +I will call the three image formats Format80, Format40 and Format20. + +The Format80 images are compressed with a compression method I'll explain +later. + +The Format40 images must be xor-ed with a Format80 image. That's what the +RefOffs field is used for. It tells which Format80 image they are +based upon. The Format40 will be explained in detail later. + +The Format20 images use the same format as the Format40, the difference is +that they are xor-ed with the image that precedes them in the file. That can +be either in Format20 or in Format40. +The offset part of the RefOffs field contains the number of the first +Format40 image in the chain, and the format field is always 48h. + +Here's an example : + +0) Off0(three bytes) 80h 000000h 00h +1) Off1(three bytes) 80h 000000h 00h +2) Off2(three bytes) 40h Off1 80h +3) Off3(three bytes) 80h 000000h 00h +4) Off4(three bytes) 40h Off1 80h +5) Off5(three bytes) 20h 000400h 48h +6) Off6(three bytes) 20h 000400h 48h +7) Off7(three bytes) 40h Off3 80h + +For example to draw image 7, you have to draw the image 3 first (whose +offset +and format are given) and then xor image 7 over it. + +To draw image 6, you have to xor it over the previous image, i.e. 5, which +is format20 again, that means that it has to be xor-ed over image 4, which +is in format40, i.e. it must be xor-ed over the image in format80 it has a +reference to. In this case it's image 1. Thus the chain is 1,4,5,6. +This is one way to see it, the other could be : +Image 6 is in Format20, the RefOffs field contains the number of the first +Format40 image in the chain, in this case image 4. To draw Image 4, the +Image 1 has to be drawn first, next is image 4, and then all the images +from the 4th to the 6th have to be xor-ed over the previous. + +I made some experiments and found out that you don't have to use the +Format40 and Format20 images. I tried converting all of them into Format80 +and it worked. + +Also, when changing graphics, note that all the unit and structure graphics +should be drawn using the GDI colors, which will be automatically converted +for the other sides. +The palette you should use is one of those found in DESERT.MIX, WINTER.MIX +and TEMPERAT.MIX. The GDI colors are colors 0B0h-0BFh. The other colors +won't be converted and will remain the same for all the sides (be sure to +use only the colors that are the same all three palettes). + +The above applies only to the graphics that appear in all three theaters +(the .SHP file found in CONQUER.MIX). The graphics for the structures and +overlays that appear in a single theater (found inside the theater specific +MIX) can use the palette entries that are unique for that theater (and will +be shown with garbled colors in the others). + +Also a special color is used for shadows. It's color 04h. In the palettes +it's bright green, but C&C puts a shadow instead of it. I don't know how +the shadows are calculated however. + +You should've noticed that the array has NumImages+2 elements when only +NumImages elements are needed. The last one contains zeros, and the one +before +that points to the end of the file. These two can be used to identify the +file as a .SHP. + +Here's the description of the compression formats : Format80 and Format40. + +---------- + Format80 +---------- + +There are several different commands, with different sizes : form 1 to 5 +bytes. +The positions mentioned below always refer to the destination buffer (i.e. +the uncompressed image). The relative positions are relative to the current +position in the destination buffer, which is one byte beyond the last +written +byte. + +I will give some sample code at the end. + +(1) 1 byte + +---+---+---+---+---+---+---+---+ + | 1 | 0 | | | | | | | + +---+---+---+---+---+---+---+---+ + \_______________________/ + | + Count + + This one means : copy next Count bytes as is from Source to Dest. + +(2) 2 bytes + +---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+ + | 0 | | | | | | | | | | | | | | | | | + +---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+ + \___________/\__________________________________________________/ + | | + Count-3 Relative Pos. + + This means copy Count bytes from Dest at Current Pos.-Rel. Pos. to + Current position. + Note that you have to add 3 to the number you find in the bits 4-6 of the + first byte to obtain the Count. + Note that if the Rel. Pos. is 1, that means repeat Count times the +previous + byte. + +(3) 3 bytes + +---+---+---+---+---+---+---+---+ +---------------+---------------+ + | 1 | 1 | | | | | | | | | | + +---+---+---+---+---+---+---+---+ +---------------+---------------+ + \_______________________/ Pos + | + Count-3 + + Copy Count bytes from Pos, where Pos is absolute from the start of the + destination buffer. (Pos is a word, that means that the images can't be + larger than 64K) + +(4) 4 bytes + +---+---+---+---+---+---+---+---+ +-------+-------+ +-------+ + | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | | | | | | + +---+---+---+---+---+---+---+---+ +-------+-------+ +-------+ + Count Color + + Write Color Count times. + (Count is a word, color is a byte) + +(5) 5 bytes + +---+---+---+---+---+---+---+---+ +-------+-------+ +-------+-------+ + | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | | | | | | | + +---+---+---+---+---+---+---+---+ +-------+-------+ +-------+-------+ + Count Pos + + Copy Count bytes from Dest. starting at Pos. Pos is absolute from the +start of the Destination buffer. + Both Count and Pos are words. + +These are all the commands I found out. Maybe there are other ones, but I +haven't seen them yet. + +All the images end with a 80h command. + +To make things more clearer here's a piece of code that will uncompress the +image. + + DP = destination pointer + SP = source pointer + Source and Dest are the two buffers + + + SP:=0; + DP:=0; + repeat + Com:=Source[SP]; + inc(SP); + b7:=Com shr 7; {b7 is bit 7 of Com} + case b7 of + 0 : begin {copy command (2)} + {Count is bits 4-6 + 3} + Count:=(Com and $7F) shr 4 + 3; + {Position is bits 0-3, with bits 0-7 of next byte} + Posit:=(Com and $0F) shl 8+Source[SP]; + Inc(SP); + {Starting pos=Cur pos. - calculated value} + Posit:=DP-Posit; + for i:=Posit to Posit+Count-1 do + begin + Dest[DP]:=Dest[i]; + Inc(DP); + end; + end; + 1 : begin + {Check bit 6 of Com} + b6:=(Com and $40) shr 6; + case b6 of + 0 : begin {Copy as is command (1)} + Count:=Com and $3F; {mask 2 topmost bits} + if Count=0 then break; {EOF marker} + for i:=1 to Count do + begin + Dest[DP]:=Source[SP]; + Inc(DP); + Inc(SP); + end; + end; + 1 : begin {large copy, very large copy and fill commands} + {Count = (bits 0-5 of Com) +3} + {if Com=FEh then fill, if Com=FFh then very large copy} + Count:=Com and $3F; + if Count<$3E then {large copy (3)} + begin + Inc(Count,3); + {Next word = pos. from start of image} + Posit:=Word(Source[SP]); + Inc(SP,2); + for i:=Posit to Posit+Count-1 do + begin + Dest[DP]:=Dest[i]; + Inc(DP); + end; + end + else if Count=$3F then {very large copy (5)} + begin + {next 2 words are Count and Pos} + Count:=Word(Source[SP]); + Posit:=Word(Source[SP+2]); + Inc(SP,4); + for i:=Posit to Posit+Count-1 do + begin + Dest[DP]:=Dest[i]; + Inc(DP); + end; + end else + begin {Count=$3E, fill (4)} + {Next word is count, the byte after is color} + Count:=Word(Source[SP]); + Inc(SP,2); + b:=Source[SP]; + Inc(SP); + for i:=0 to Count-1 do + begin + Dest[DP]:=b; + inc(DP); + end; + end; + end; + end; + end; + end; + until false; + +Note that you won't be able to compile this code, because the typecasting +won't work. (But I'm sure you'll be able to fix it). + + +---------- + Format40 +---------- + +As I said before the images in Format40 must be xor-ed over a previous +image, or against a black screen (as in the .WSA format). +It is used when there are only minor changes between an image and a +following one. + +Here I'll assume that the old image is in Dest, and that the Dest pointer is +set to the beginning of that buffer. + +As for the Format80, there are many commands : + + +(1) 1 byte + byte + +---+---+---+---+---+---+---+---+ + | 1 | | | | | | | | + +---+---+---+---+---+---+---+---+ + \___________________________/ + | + Count + + Skip count bytes in Dest (move the pointer forward). + +(2) 3 bytes + byte word + +---+---+---+---+---+---+---+---+ +---+-----+-------+ + | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 0 | ... | | + +---+---+---+---+---+---+---+---+ +---+-----+-------+ + \_____________/ + | + Count + + Skip count bytes. + +(3) 3 bytes + byte word + +---+---+---+---+---+---+---+---+ +---+---+-----+-------+ + | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 1 | 0 | ... | | + +---+---+---+---+---+---+---+---+ +---+---+-----+-------+ + \_____________/ + | + Count + + Xor next count bytes. That means xor count bytes from Source with bytes + in Dest. + +(4) 4 bytes + byte word byte + +---+---+---+---+---+---+---+---+ +---+---+-----+-------+ +-------+ + | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 1 | 1 | ... | | | | + +---+---+---+---+---+---+---+---+ +---+---+-----+-------+ +-------+ + \_____________/ value + | + Count + + Xor next count bytes in Dest with value. + +5) 1 byte + byte + +---+---+---+---+---+---+---+---+ + | 0 | | | | | | | | + +---+---+---+---+---+---+---+---+ + \___________________________/ + | + Count + + Xor next count bytes from source with dest. + +6) 3 bytes + byte byte byte + +---+---+---+---+---+---+---+---+ +-------+ +-------+ + | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | | | | + +---+---+---+---+---+---+---+---+ +-------+ +-------+ + Count Value + + Xor next count bytes with value. + + +All images end with a 80h 00h 00h command. + +I think these are all the commands, but there might be some other. +If you find anything new, please e-mail me. + +As before here's some code : + + DP = destination pointer + SP = source pointer + Source is buffer containing the Format40 data + Dest is the buffer containing the image over which the second has + to be xor-ed + + + SP:=0; + DP:=0; + repeat + Com:=Source[SP]; + Inc(SP); + + if (Com and $80)<>0 then {if bit 7 set} + begin + if Com<>$80 then {small skip command (1)} + begin + Count:=Com and $7F; + Inc(DP,Count); + end + else {Big commands} + begin + Count:=Word(Source[SP]); + if Count=0 then break; + Inc(SP,2); + + Tc:=(Count and $C000) shr 14; {Tc=two topmost bits of count} + + case Tc of + 0,1 : begin {Big skip (2)} + Inc(DP,Count); + end; + 2 : begin {big xor (3)} + Count:=Count and $3FFF; + for i:=1 to Count do + begin + Dest[DP]:=Dest[DP] xor Source[SP]; + Inc(DP); + Inc(SP); + end; + end; + 3 : begin {big repeated xor (4)} + Count:=Count and $3FFF; + b:=Source[SP]; + Inc(SP); + for i:=1 to Count do + begin + Dest[DP]:=Dest[DP] xor b; + Inc(DP); + end; + end; + end; + end; + end else {xor command} + begin + Count:=Com; + if Count=0 then + begin {repeated xor (6)} + Count:=Source[SP]; + Inc(SP); + b:=Source[SP]; + Inc(SP); + for i:=1 to Count do + begin + Dest[DP]:=Dest[DP] xor b; + Inc(DP); + end; + end else {copy xor (5)} + for i:=1 to Count do + begin + Dest[DP]:=Dest[DP] xor Source[SP]; + Inc(DP); + Inc(SP); + end; + end; + until false; + + + +=================== + 6. THE .CPS FILES +=================== + +The .CPS files contain 320x200x256 images. The images are compressed with +the Format80 compression method. They may or may not contain a palette. + +The header has the following structure : + + Header : record + Size : word; {File size - 2} + Unknown : word; {Always 0004h} + ImSize : word; {Size of uncompressed image (always 0FA00h)} + Palette : longint; {Is there a palette ?} + end; + +If Palette is 03000000h then there's a palette after the header, otherwise +the image follows. CPS file without palette can be found in the SETUP.MIX +file, and they all use the Palette that can be found inside the same .MIX. + +The image that follows the palette (or the Header) is in Format80 which is +explained above. + +=================== + 7. THE .WSA FILES +=================== + + +WSA files contain short animations and can be found in the GENERAL.MIX +files. +They are basically a series of Format40 images, that are then compressed +with +Format80. + +The header is : + + Header : record + NumFrames : word; {Number of frames} + X,Y : word; {Position on screen of the upper left +corner} + W,H : word; {Width and height of the images} + Delta : longint; {Frames/Sec = Delta/(2^10)} + end; + +Following that there's an array of offsets : + + Offsets : array [0..NumFrames+1] of longint; + +The obtain the actual offset, you have to add 300h. That is the size of the +palette that follows the Offsets array. +As for .SHP files the two last offsets have a special meaning. +If the last offset is 0 then the one before it points to the end of file +(after you added 300h of course). +If the last one is <>0 then it points to the end of the file, and the +one before it points to a special frame that gives you the difference +between the last and the first frame. This is used when you have to loop the +animation. + +As I said before, the images are in Format40 but are then compressed with +Format80. That means that you first have to uncompress the Format80 and then +decode the Format40 image you obtain. +The first frame should be xor-ed over a black image (filled with zeros), all +the other are xor-ed over the previous one. + +There is a variant of the file without the palette that can be found in +SETUP.MIX but I wasn't able to decode it (maybe there are some commands I +don't know about)... + +===================== + 8. ADDITIONAL NOTES +===================== + +The VQA files (that contain movies) have been decoded by Aaron Glover +(arn@ibm.net), and are explained in a document he wrote up. +You can find the document on my homepage (or ask him directly). + +What is still missing are the .AUD files. +It seems that the AUD files use some kind of lossy sound compression, +which means that it is almost impossible to decode them. +However if someone manages to work them out, I'd really appreciate some +info. + +I know my explanations are not very good, but you'll have to bear them, +unless someone else wants to rewrite this. + +============ + 9. CREDITS +============ + +I wish to thank the following people : + +-Andrew Griffin (buggy@adam.com.au) for starting it all. +-Aaron Glover (arn@ibm.net) and + Denis Moeller (d.moeller@rendsburg.netsurf.de) for their work on .SHP +files. +-Aaron Glover for decoding the VQA files. +-Carl Kenner (andrew.kenner@unisa.edu.au) for the info on .CPS files. + + +Vladan Bato (bat22@geocities.com) +http://www.geocities.com/SiliconValley/8682 diff --git a/doc/cncmap.txt b/doc/cncmap.txt new file mode 100644 index 0000000000..3dacb4ee6b --- /dev/null +++ b/doc/cncmap.txt @@ -0,0 +1,500 @@ +THE COMMAND & CONQUER MAPS + +Rev. 1f + +by Vladan Bato (bat22@geocities.com) + +This document explains the format of the maps and the associated graphics +files. It has also a complete listing of all available map values. +This document is meant for people who want to make a C&C scenery editor. +You can also use it to edit manually the maps but IMHO it's a suicide if you +can't see what you are doing. + +ABOUT .MIX FILES + +First of all I will explain the structure of MIX files, since all the +graphics are in the TEMPERAT, DESERT, and WINTER.MIX files. + +Each MIX file contains several internal files that can be extracted. I will +refer to the internal files as just "files". +The MIX file is made up of two parts: the first one is the Header, the +second one is the Body that contains all the files. + +The structure of the header is: +(I will use pascal notation here) + +Header = record + NumFiles : word; {Number of internal files} + BodyLength : longint; {Length of the body} + Index : array [1..NumFiles] of + record + ID : longint; {ID of file, computed from filename} + Start : longint; {Offset of file in the body} + Size : longint; {Size of the file} + end; + end; + +Of course you can't use directly such a structure in pascal because its +length is not fixed. +Note that the offsets are relative to the start of the body so to find the +actual offset in the MIX you have to add the size of the header which is +NumFiles*12+6 + +Note also that the records in the Index are not in the same order as the +files are physically stored in the MIX. In this document I will always refer +to the record number in the index and not to the file's actual position in +the MIX. + +ABOUT THE MAP + +All the maps are 64x64 squares large. There are 2 bytes of information for +each square, thus the file is 8192 bytes long. + +The two bytes indicate which image should be placed there. The first one +indicates in which of the internal files of TEMPERAT, DESERT or WINTER.MIX +it is. Each of these internal files contains several images; the second byte +tells which of those images should be taken. The images inside one of the +internal files, if put together, form a larger image. It can be a bridge, +a road section, etc. These are called "templates". Thus, each internal file +contains a template. Each template is made of several "tiles" (images). +Each square of the map contains one tile. It's not necessary to put all +the tiles of a template on the map. + +There are templates of various sizes: from 1x1 to 6x8. +(I will always write the dimensions as WidthxHeight) +The tile numbers range from 0 to WxH-1. +However there are some tiles, which I call "empty tiles", that don't have +any images associated with them. If you try using them C&C will display +the default terrain for that Theater instead. There are empty tiles +especially in the corners of large templates. + +An example may be useful: + +The SW-NE bridge in the temperate theater has two empty tiles: + XXOr X - Empty tile O - other tiles + wbbO b - Bridge + Obbw w - Water (This is probably wrong, I can't check now) + rOOO r - road + +We can see that in the upper left corner there are two empty tiles. +We can put the values 00 and 01 in our map (as the second byte; the first +would be A5h for the bridge), in that case we'll see some grass there. But +we can replace those two tiles with anything else without disturbing the +rest. What I mean, is that if we changed any other tile, a piece of river +would be missing or a rock could be cut, ruining the map; but if we +replace the empty tiles everything is OK. + +So, when we have an empty tile, we can leave it there, or replace it with +anything else. There are two exceptions to this rule however: + +1) Sometimes the empty tiles should be water, but if we don't replace them + C&C will show land in the middle of our lake or sea; +2) There are templates containing roads that finish in one of the corners, + so that the next template must have an empty tile in the opposite corner + to stick to the other. + +An example might help: + +Imagine that we have two road sections like these: + OOrr OOrr + Orrr Orrr + rrrO rrrO + rrOO rrOO + +and we want to stick them diagonally: + OOrr + Orrr + rrrO + rrOO + OOrr + Orrr + rrrO + rrOO + +Something is obviously missing. We need to add some tiles to fill it like +this: + OOrr + Orrr + rrrO + RrrOO + OOrrR + Orrr + rrrO + rrOO + +The solution could be to have two templates like these: + OOOO ROOO + OOOO OOOO + OOOO OOOO + OOOR OOOO +or to have one little template with empty tiles: + RX + XR (Where X are empty tiles) + +Now we can put this between the two road sections, replacing the empty +tiles with the corner tiles of the road sections. + +There are many road sections like this and I've indicated them with +"(Conn.)" in the table at the end of this document. + +ABOUT THE DESERT, TEMPERAT, and WINTER.MIX FILES + +These are the files that hold the graphics for the templates. There's one +file inside the MIX for each template, and each file has several tiles +inside. +There are other files inside the MIXes, probably for the trees and other +overlay elements but I don't know the format. If somebody knows their +format, please let me know. + +In each MIX there's also a palette, the entries are: +DESERT.MIX entry n. 26 +TEMPERAT.MIX entry n. 62 +WINTER.MIX entry n. 62 + +I will now explain the format of the files with map graphics. +First of all there's a header with the following structure: + +Header = record + Width : word; {Width of images, always 24 (18h)} + Heigth : word; {Heigth of images, always 24} + NumTil : word; {Number of Tiles (may differ from num. of Images} + Zero1 : word; {Seems to be always 0000h} + Size : longint; {size of file} + ImgStart : longint; {Offset of first image} + Zero2 : longint; {Seems to be always 00000000h} + ID1 : word; {Always FFFFh} + ID2 : word; {Always 1A0Dh (or 0D1Ah I can't remeber} + Index2 : longint; {Offset of Index2} + Index1 : longint; {Offset of Index1} {I will explain these +later} + end; + +The images follow the header but I suppose they could be anywhere. +They are all 24x24 pixel, uncompressed and are one after the other. +Note that the number of images may differ from the number of tiles if +there are some empty tiles. If there are empty tiles, the actual number of +images can be smaller than the number of tiles. To work out the number +of images you can use the formula : (Index1-ImgStart)/(24*24). +However, you won't have to do this if the index is not corrupt. + +Index1 has the following format: + + Index1 : array [0..NumTil-1] of byte; + +where NumTil is the number of tiles. + +Each entry in Index1 corresponds to one tile, and indicates which image +(of that file) is associated with it. If the entry is FFh than that tile +is empty. + +Index2 is an array of NumImages bytes where NumImages is the real +number of images in the file. However it's always filled with zeros +(sometimes there's a 1 somewhere but I don't know it's meaning). + +Note that there's no way to know the dimensions (Width and Height) of the +template. If there are 6 tiles it could be 6x1, 1x6, 3x2, 2x3. I worked out +the dimensions of all templates myself (It's easy, all you have to do is to +try different widths and look at the screen). + + +For example a procedure that has to display template 61h, tile 3 of the +Desert theater would do: +1) Look in the table and find in which file it is in (entry 168 of + DESERT.MIX) +2) Open that file (seek it inside the MIX) +3) Read the Header +4) Read Index1 and read the 4th byte (for tile 3), let it be N +5) Seek ImgStart+Width*Height*N +6) Read the Image and display it + +AND FINALLY THE TABLE + +Here is the table of all available map values (template numbers), the +dimensions and the relative entries in the DESERT, WINTER, and TEMPERAT.MIX. +There's also a brief description for those that don't want or don't know +how to write an editor. However, I think that it will be difficult to stick +the templates together without seeing them. + +An "x" means that the template doesn't exist in that theater. There are many +templates that exist only in one theater and will show as black holes in the +others (causing the HOM effect). The WINTER and TEMPERATE theaters are +however very similar, and differ only in a few templates. +The roads and cliffs are mostly the same for the three theaters, but be +careful about the river and coast templates because they are not the same. + + V | DES | TEM | WIN | Dim. | Name | Description +-----+-----+-----+-----+-------+----------+--------------------------------- +-- + 00h | 007 | 011 | 028 | [4x4] | CLEAR1 | Default terrain + 01h | 002 | 007 | 007 | [1x1] | W1 | Water (not animated) + 02h | x | 009 | 009 | [2x2] | W2 | Water + 03h | x | 087 | 087 | [3x3] | SH1 | Coast WD (1) + 04h | x | 106 | 105 | [3x3] | SH2 | Coast WD + 05h | x | 126 | 124 | [1x1] | SH3 | Rock in water + 06h | x | 143 | 140 | [2x1] | SH4 | Rock in water + 07h | x | 159 | 157 | [3x3] | SH5 | Coast WD + 08h | x | 018 | 017 | [3x3] | SH11 | Fjord WD + 09h | x | 024 | 023 | [3x3] | SH12 | Coast WU + 0Ah | x | 031 | 031 | [3x3] | SH13 | Coast WU + 0Bh | x | 037 | 037 | [3x3] | SH14 | Coast WU + 0Ch | x | 042 | 042 | [3x3] | SH15 | Coast WU + 0Dh | 106 | 074 | 074 | [2x2] | S01 | Cliff Left Edge + 0Eh | 122 | 093 | 092 | [2x3] | S02 | Cliff Wu-Wd (2) + 0Fh | 138 | 112 | 110 | [2x2] | S03 | Cliff W-E + 10h | 154 | 131 | 128 | [2x2] | S04 | Cliff W-E + 11h | 170 | 147 | 144 | [2x2] | S05 | Cliff W-E + 12h | 185 | 163 | 161 | [2x3] | S06 | Cliff Wd-Eu + 13h | 200 | 180 | 179 | [2x2] | S07 | Cliff Right Edge + 14h | 212 | 195 | 195 | [2x2] | S08 | Cliff Top Edge + 15h | 225 | 208 | 209 | [3x2] | S09 | Cliff N-S + 16h | 096 | 064 | 064 | [2x2] | S10 | Cliff N-S + 17h | 108 | 078 | 078 | [2x2] | S11 | Cliff N-S + 18h | 124 | 097 | 096 | [2x2] | S12 | Cliff N-S + 19h | 140 | 117 | 115 | [3x2] | S13 | Cliff N-S + 1Ah | 157 | 135 | 132 | [2x2] | S14 | Cliff Bottom Edge + 1Bh | 172 | 151 | 149 | [2x2] | S15 | Cliff Left Edge + 1Ch | 187 | 167 | 166 | [2x3] | S16 | Cliff Wu-Ed + 1Dh | 202 | 184 | 184 | [2x2] | S17 | Cliff W-E + 1Eh | 215 | 199 | 200 | [2x2] | S18 | Cliff W-E + 1Fh | 228 | 211 | 213 | [2x2] | S19 | Cliff W-E + 20h | 098 | 068 | 069 | [2x3] | S20 | Cliff Wu-Ed + 21h | 110 | 082 | 082 | [1x2] | S21 | Cliff Right Edge + 22h | 126 | 101 | 100 | [2x1] | S22 | Cliff Corner S-E Internal + 23h | 142 | 121 | 119 | [3x2] | S23 | Cliff Sl-Nr + 24h | 159 | 139 | 136 | [2x2] | S24 | Cliff N-S + 25h | 174 | 155 | 153 | [2x2] | S25 | Cliff N-S + 26h | 189 | 171 | 170 | [2x2] | S26 | Cliff N-S + 27h | 204 | 188 | 188 | [3x2] | S27 | Cliff Nl-Sr + 28h | 218 | 202 | 203 | [2x2] | S28 | Cliff Bottom Edge + 29h | 230 | 213 | 215 | [2x2] | S29 | Cliff Corner N-E External + 2Ah | 101 | 070 | 071 | [2x2] | S30 | Cliff Corner S-E Ext + 2Bh | 113 | 084 | 084 | [2x2] | S31 | Cliff Corner W-S Ext + 2Ch | 129 | 103 | 102 | [2x2] | S32 | Cliff Corner N-W Ext + 2Dh | 145 | 123 | 121 | [2x2] | S33 | Cliff Corner N-E Internal + 2Eh | 162 | 141 | 138 | [2x2] | S34 | Cliff Corner S-E Int + 2Fh | 177 | 157 | 155 | [2x2] | S35 | Cliff Corner W-S Int + 30h | 192 | 173 | 172 | [2x2] | S36 | Cliff Corner W-N Int + 31h | 207 | 190 | 190 | [2x2] | S37 | Cliff Junction NW-SE + 32h | 221 | 204 | 205 | [2x2] | S38 | Cliff Junction SW-NE + 33h | x | 027 | 026 | [3x3] | SH32 | Coast Corner N-W Int + 34h | x | 033 | 033 | [3x3] | SH33 | Coast Corner N-E Int + 35h | 017 | x | x | [4x1] | SH20 | Coast WD + 36h | 024 | x | x | [3x1] | SH21 | Coast WD + 37h | 041 | x | x | [6x2] | SH22 | Coast WD + 38h | 049 | x | x | [2x2] | SH23 | Coast WD + 39h | 118 | x | x | [1x1] | BR1 | Bush + 3Ah | 134 | x | x | [1x1] | BR2 | Bush + 3Bh | 150 | x | x | [1x1] | BR3 | Cactus + 3Ch | 166 | x | x | [1x1] | BR4 | Cactus + 3Dh | 181 | x | x | [1x1] | BR5 | ??? Purple square (bug ?) + 3Eh | 196 | x | x | [2x2] | BR6 | Bushes + 3Fh | 210 | x | x | [2x2] | BR7 | Bushes + 40h | 223 | x | x | [3x2] | BR8 | Bushes + 41h | 234 | x | x | [3x2] | BR9 | Bushes + 42h | 016 | x | x | [2x1] | BR10 | ??? Purple squares (bug ?) + 43h | 105 | 073 | x | [1x1] | P01 | Bones / Wall (3) + 44h | 121 | 092 | x | [1x1] | P02 | Bones / Wall (3) + 45h | 137 | 111 | x | [1x1] | P03 | Mud / UFO (3) (6) + 46h | 153 | 130 | x | [1x1] | P04 | Rock / UFO (3) (6) + 47h | 169 | x | x | [2x2] | P05 | Gray Sand + 48h | 184 | x | x | [6x4] | P06 | Gray Sand + 49h | 199 | 179 | 178 | [4x2] | P07 | Mud + 4Ah | x | 194 | 194 | [3x2] | P08 | Mud + 4Bh | x | 045 | 045 | [3x2] | SH16 | Fjord WU + 4Ch | 072 | 047 | 047 | [2x2] | SH17 | Water (anim.) + 4Dh | 078 | 049 | 049 | [2x2] | SH18 | Water (anim.) + 4Eh | 084 | x | x | [3x2] | SH19 | Coast WD + 4Fh | x | 116 | 114 | [3x2] | P13 | Destroyed House + 50h | x | 134 | 131 | [2x1] | P14 | Walls + 51h | x | x | 148 | [4x2] | P15 | Snow + 52h | 001 | 006 | 006 | [1x1] | B1 | Rock + 53h | 003 | 008 | 008 | [2x1] | B2 | Rock + 54h | x | 010 | 010 | [3x1] | B3 | Rock + 55h | 004 | x | x | [1x1] | B4 | ?? Rock (7) + 56h | 005 | x | x | [1x1] | B5 | ?? Rock (7) + 57h | 006 | x | x | [1x1] | B6 | ?? Rock (7) + 58h | x | 175 | 174 | [3x3] | SH6 | Coast WD + 59h | x | 191 | 191 | [2x2] | SH7 | Coast Corner W-N External + 5Ah | x | 205 | 206 | [3x3] | SH8 | Coast Corner S-E Ext + 5Bh | x | 215 | 217 | [3x3] | SH9 | Coast Corner W-S Ext + 5Ch | x | 012 | 011 | [2x2] | SH10 | Coast Corner N-E Ext + 5Dh | 104 | 072 | 073 | [2x2] | D01 | Road Bottom End + 5Eh | 120 | 091 | 091 | [2x2] | D02 | Road Left End + 5Fh | 136 | 110 | 109 | [1x2] | D03 | Road Top End + 60h | 152 | 129 | 127 | [2x2] | D04 | Road Right End + 61h | 168 | 146 | 143 | [3x4] | D05 | Road S-N + 62h | 183 | 162 | 160 | [2x3] | D06 | Road S-N + 63h | 198 | 178 | 177 | [3x2] | D07 | Road S-N + 64h | 211 | 193 | 193 | [3x2] | D08 | Road S-N + 65h | 224 | 207 | 208 | [4x3] | D09 | Road W-E + 66h | 095 | 063 | 063 | [4x2] | D10 | Road W-E + 67h | 107 | 077 | 077 | [2x3] | D11 | Road W-E + 68h | 123 | 096 | 095 | [2x2] | D12 | Road W-E + 69h | 139 | 115 | 113 | [4x3] | D13 | Road Wu-Ed + 6Ah | 156 | 133 | 130 | [3x3] | D14 | Road T N--W+E (4) + 6Bh | 171 | 150 | 147 | [3x3] | D15 | Road Y S--N+E (4) + 6Ch | 186 | 166 | 164 | [3x3] | D16 | Road Y S--N+E + 6Dh | 201 | 183 | 182 | [3x2] | D17 | Road T S--W+E + 6Eh | 214 | 198 | 198 | [3x3] | D18 | Road T W--N+S + 6Fh | 227 | 210 | 211 | [3x3] | D19 | Road + W-N-E-S + 70h | 097 | 067 | 067 | [3x3] | D20 | Road Corner N-E + 71h | 109 | 081 | 081 | [3x2] | D21 | Road Corner S-E + 72h | 125 | 100 | 099 | [3x3] | D22 | Road Corner W-S + 73h | 141 | 120 | 118 | [3x3] | D23 | Road Corner W-N + 74h | 158 | 138 | 135 | [3x3] | D24 | Road Diagonal NW-SE (5) + 75h | 173 | 154 | 152 | [3x3] | D25 | Road Diag NW-SE + 76h | 188 | 170 | 169 | [2x2] | D26 | Road Diag NW-SE (Conn.) (5) + 77h | 203 | 187 | 187 | [2x2] | D27 | Road Diag NW-SE (Conn.) + 78h | 217 | 201 | 202 | [2x2] | D28 | Road Corner W-SE (Conn.) + 79h | 229 | 212 | 214 | [2x2] | D29 | Road Corner N-SE (Conn.) + 7Ah | 100 | 069 | 070 | [2x2] | D30 | Road Y SE--N+W (Conn.) + 7Bh | 112 | 083 | 083 | [2x2] | D31 | Road Corner E-NW (Conn.) + 7Ch | 128 | 102 | 101 | [2x2] | D32 | Road Corner S-NW (Conn.) + 7Dh | 144 | 122 | 120 | [2x2] | D33 | Road Y NW--S+E (Conn.) + 7Eh | 161 | 140 | 137 | [3x3] | D34 | Road Diag SW-NE + 7Fh | 176 | 156 | 154 | [3x3] | D35 | Road Diag SW-NE + 80h | 191 | 172 | 171 | [2x2] | D36 | Road Diag SW-NE (Conn.) + 81h | 206 | 189 | 189 | [2x2] | D37 | Road Diag SW-NE (Conn.) + 82h | 220 | 203 | 204 | [2x2] | D38 | Road Corner E-SW (Conn.) + 83h | 232 | 214 | 216 | [2x2] | D39 | Road Corner N-SW (Conn.) + 84h | 103 | 071 | 072 | [2x2] | D40 | Road Y SW--N+E (Conn.) + 85h | 115 | 085 | 085 | [2x2] | D41 | Road Corner W-NE (Conn.) + 86h | 131 | 104 | 103 | [2x2] | D42 | Road Corner S-NE (Conn.) + 87h | 147 | 124 | 122 | [2x2] | D43 | Road Y NE--W+S (Conn.) + 88h | x | 017 | 016 | [5x4] | RV01 | River W-E + 89h | x | 023 | 022 | [5x3] | RV02 | River W-E + 8Ah | x | 030 | 030 | [4x4] | RV03 | River Wu-Ed + 8Bh | x | 036 | 036 | [4x4] | RV04 | River Wd-Eu + 8Ch | x | 041 | 041 | [3x3] | RV05 | River N-S + 8Dh | x | 044 | 044 | [3x2] | RV06 | River N-S + 8Eh | x | 046 | 046 | [3x2] | RV07 | River N-S + 8Fh | x | 048 | 048 | [2x2] | RV08 | River Corner S-E + 90h | x | 052 | 052 | [2x2] | RV09 | River Corner W-S + 91h | x | 014 | 013 | [2x2] | RV10 | River Corner N-E + 92h | x | 020 | 019 | [2x2] | RV11 | River Corner W-N + 93h | x | 026 | 025 | [3x4] | RV12 | River Y N--W+S + 94h | x | 032 | 032 | [4x4] | RV13 | River Y Eu--W+S + 95h | 055 | x | x | [4x3] | RV14 | River W-E + 96h | 060 | x | x | [4x3] | RV15 | River W-E + 97h | 067 | x | x | [6x4] | RV16 | River Wd-Eu + 98h | 073 | x | x | [6x5] | RV17 | River Wu-Ed + 99h | 079 | x | x | [4x4] | RV18 | River N-S + 9Ah | 085 | x | x | [4x4] | RV19 | River N-S + 9Bh | 018 | x | x | [6x8] | RV20 | River Nr-Sl + 9Ch | 025 | x | x | [5x8] | RV21 | River Nl-Sr + 9Dh | 042 | x | x | [3x3] | RV22 | River Corner E-S + 9Eh | 050 | x | x | [3x3] | RV23 | River Corner W-S + 9Fh | 057 | x | x | [3x3] | RV24 | River Corner N-E + A0h | 062 | x | x | [3x3] | RV25 | River Corner N-W + A1h | 009 | 002 | 004 | [3x3] | FORD1 | River Crossing (Road W-E) + A2h | 010 | 003 | 005 | [3x3] | FORD2 | River Crossing (Road N-S) + A3h | 047 | 057 | 057 | [3x3] | FALLS1 | Falls W-E + A4h | 048 | 058 | 058 | [3x2] | FALLS2 | Falls N-S + A5h | x | 218 | 220 | [4x4] | BRIDGE1 | Bridge SW-NE + A6h | x | 059 | 059 | [4x4] | BRIDGE1D | Fallen Bridge SW-NE + A7h | x | 219 | 221 | [5x5] | BRIDGE2 | Bridge NW-SE + A8h | x | 060 | 060 | [5x5] | BRIDGE2D | Fallen Bridge NW-SE + A9h | 236 | x | x | [6x5] | BRIDGE3 | Bridge SW-NE + AAh | 092 | x | x | [6x5] | BRIDGE3D | Fallen Bridge SW-NE + ABh | 237 | x | x | [6x4] | BRIDGE4 | Bridge NW-SE + ACh | 093 | x | x | [6x4] | BRIDGE4D | Fallen Bridge NW-SE + ADh | 056 | x | x | [3x3] | SH24 | Fjord WD + AEh | 061 | x | x | [3x2] | SH25 | Coast WU + AFh | 068 | x | x | [3x2] | SH26 | Coast WU + B0h | 074 | x | x | [4x1] | SH27 | Coast WU + B1h | 080 | x | x | [3x1] | SH28 | Coast WU + B2h | 086 | x | x | [6x2] | SH29 | Coast WU + B3h | 019 | x | x | [2x2] | SH30 | Coast WU + B4h | 027 | x | x | [3x3] | SH31 | Fjord WU + B5h | x | x | 165 | [2x2] | P16 | Snow + B6h | x | x | 183 | [4x2] | P17 | Snow + B7h | x | x | 199 | [4x3] | P18 | Snow + B8h | x | x | 212 | [4x3] | P19 | Snow + B9h | x | x | 068 | [4x3] | P20 | Snow + BAh | x | 038 | 038 | [3x3] | SH34 | Coast WR + BBh | x | 043 | 043 | [3x3] | SH35 | Coast WL + BCh | 069 | x | x | [1x1] | SH36 | Coast Corner S-E Int + BDh | 075 | x | x | [1x1] | SH37 | Coast Corner W-S Int + BEh | 081 | x | x | [1x1] | SH38 | Coast Corner N-E Int + BFh | 087 | x | x | [1x1] | SH39 | Coast Corner N-W Int + C0h | 020 | x | x | [3x3] | SH40 | Coast Corner S-E Int + C1h | 028 | x | x | [3x3] | SH41 | Coast Corner N-W Int + C2h | 043 | x | x | [1x2] | SH42 | Coast WL + C3h | 051 | x | x | [1x3] | SH43 | Coast WL + C4h | 058 | x | x | [1x3] | SH44 | Coast WR + C5h | 063 | x | x | [1x2] | SH45 | Coast WR + C6h | 070 | x | x | [3x3] | SH46 | Coast Corner S-E Int + C7h | 076 | x | x | [3x3] | SH47 | Coast Corner S-E Int + C8h | 082 | x | x | [3x3] | SH48 | Coast Corner N-E Int + C9h | 088 | x | x | [3x3] | SH49 | Coast Corner N-W Int + CAh | 021 | x | x | [4x3] | SH50 | Coast Corner S-E Ext + CBh | 029 | x | x | [4x3] | SH51 | Coast Corner W-S Ext + CCh | 044 | x | x | [4x3] | SH52 | Coast Corner N-E Ext + CDh | 052 | x | x | [4x3] | SH53 | Coast Corner N-W Ext + CEh | 059 | x | x | [3x2] | SH54 | Coast WD + CFh | 064 | x | x | [3x2] | SH55 | Coast WD + D0h | 071 | x | x | [3x2] | SH56 | Coast WU + D1h | 077 | x | x | [3x2] | SH57 | Coast WU + D2h | 083 | x | x | [2x3] | SH58 | Coast WR + D3h | 089 | x | x | [2x3] | SH59 | Coast WR + D4h | 022 | x | x | [2x3] | SH60 | Coast WL + D5h | 030 | x | x | [2x3] | SH61 | Coast WL + D6h | 045 | x | x | [6x1] | SH62 | Coast WD + D7h | 053 | x | x | [4x1] | SH63 | Coast WD + + +!! Warning !! +Values from D8h-FEh will cause the game to crash (it just locks up on +my computer)!!! + +The value FFh indicates the default terrain (I think the 4x4 template is +used). + +Notes: + +(0a) There may be some errors in this table because I typed it in a hurry + (you don't know how much time it takes), so if you find any errors + please report them to me. +(0b) The names are taken from the GAME.DAT file. I matched them with the + files in the theater mix files. The complete filenames are the names + above plus an extension that depends on the theater (.DES, .TEM, .WIN). +(1) For Coasts, WD, WU, WL, and WR mean : Water on the bottom + (Down), Top (Up), left and right. +(2) For cliffs and roads the two letters indicate from which to which side + the Road (or cliff) goes. The lowercase letter means up, down, left, + right to indicate in which part of that side it starts. + For Example: + + River Wu-Ed : + OOOOO + rOOOO + OrrOO + OOOrr + OOOOO + +(3) These templates exist in both the DESERT and the TEMPERATE theaters but + are not the same. I've put a description of both. + +(4) For Roads: + Roads T and Y mean that the road splits in the shape of a T or a Y. + E--N+S means it starts from the east edge then splits in two parts, one + going to the north and the other to the south edge + +(5) NW or any other corner means that the road ends in that corner and if it + says (Conn.), that means that it has an empty tile in that corner. + So you have to use the (Conn.) templates to stick together the other + ones. + +(6) In TEMPERAT.MIX these two files are buggy, they report there are 67h + tiles, but if you look at the index you'll see they all point to the + second image which (I think) is of uniform color. Only the first tile is + ever used. + +(7) These three templates don't work in C&C (HOM effect), but their graphics + exist in the DESERT.MIX file. Do not use them ! + +That's all. I hope this info will be used by somebody to make a scenery +editor. + +Report any errors to me. Also, if you have any info about other file formats +please share it with me. diff --git a/mods/cnc/defaults.yaml b/mods/cnc/defaults.yaml index 57720ba172..3ddebcce3b 100644 --- a/mods/cnc/defaults.yaml +++ b/mods/cnc/defaults.yaml @@ -43,7 +43,6 @@ Building: Dimensions: 1,1 Footprint: x - BaseNormal: no BuildSounds: constru2.aud, hvydoor1.aud SellSounds: cashturn.aud RenderBuilding: diff --git a/mods/cnc/mod.yaml b/mods/cnc/mod.yaml index a289a6a453..891473c4ae 100644 --- a/mods/cnc/mod.yaml +++ b/mods/cnc/mod.yaml @@ -15,6 +15,7 @@ Packages: mods/cnc/packages/sounds.mix mods/cnc/packages/tempicnh.mix mods/cnc/packages/updatec.mix + mods/cnc/packages/temperat.mix # Cannot qualify the RA names because they may live inside a mix ~main.mix redalert.mix diff --git a/mods/cnc/system.yaml b/mods/cnc/system.yaml index 9f3af4c520..bd69d46e9f 100644 --- a/mods/cnc/system.yaml +++ b/mods/cnc/system.yaml @@ -32,7 +32,7 @@ World: PaletteFromFile@terrain_temperat: Name: terrain Theater: temperat - Filename: temperat_ra.pal + Filename: temperat.pal PaletteFromFile@player_temperat: Name: player Theater: temperat From e841bbd3d23948545bc01a2ffd52a29a5ed5ee2b Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Tue, 2 Mar 2010 21:47:16 +1300 Subject: [PATCH 22/38] Load cnc TEMPERAT maps (other theatres need tileset.til fixes) --- OpenRA.FileFormats/Map.cs | 26 +- OpenRA.FileFormats/Session.cs | 4 +- OpenRA.FileFormats/TileSet.cs | 11 +- OpenRA.Game/GameRules/UserSettings.cs | 4 +- mods/cnc/mod.yaml | 6 +- mods/cnc/templates.ini | 5719 +++++++++---------------- mods/cnc/tileSet.til | 423 +- scm01ea.ini | 565 +++ 8 files changed, 2812 insertions(+), 3946 deletions(-) create mode 100644 scm01ea.ini diff --git a/OpenRA.FileFormats/Map.cs b/OpenRA.FileFormats/Map.cs index c3ab61b26d..45d223cee3 100644 --- a/OpenRA.FileFormats/Map.cs +++ b/OpenRA.FileFormats/Map.cs @@ -28,6 +28,7 @@ namespace OpenRA.FileFormats { public class Map { + public readonly string BinaryPart; public readonly string Title; public readonly string Theater; @@ -59,7 +60,7 @@ namespace OpenRA.FileFormats IniSection basic = file.GetSection("Basic"); Title = basic.GetValue("Name", "(null)"); - + BinaryPart = basic.GetValue("BinaryPart", "scm01ea.bin"); IniSection map = file.GetSection("Map"); Theater = Truncate(map.GetValue("Theater", "TEMPERATE"), 8); @@ -68,11 +69,15 @@ namespace OpenRA.FileFormats Width = int.Parse(map.GetValue("Width", "0")); Height = int.Parse(map.GetValue("Height", "0")); + + - UnpackTileData(ReadPackedSection(file.GetSection("MapPack"))); - UnpackOverlayData(ReadPackedSection(file.GetSection("OverlayPack"))); - ReadTrees(file); - + //UnpackTileData(ReadPackedSection(file.GetSection("MapPack"))); + //UnpackOverlayData(ReadPackedSection(file.GetSection("OverlayPack"))); + //ReadTrees(file); + + UnpackCncTileData(FileSystem.Open(BinaryPart)); + SpawnPoints = file.GetSection("Waypoints") .Select(kv => Pair.New(int.Parse(kv.Key), new int2(int.Parse(kv.Value) % 128, int.Parse(kv.Value) / 128))) .Where(a => a.First < 8) @@ -80,6 +85,17 @@ namespace OpenRA.FileFormats .ToArray(); } + void UnpackCncTileData( Stream ms ) + { + for( int i = 0 ; i < 64 ; i++ ) + for( int j = 0 ; j < 64 ; j++ ) + { + MapTiles[j, i].tile = (byte)ms.ReadByte(); + MapTiles[j, i].image = (byte)ms.ReadByte(); + Log.Write("Set tile to {0} {1}",MapTiles[j, i].tile,MapTiles[j, i].image); + } + } + static MemoryStream ReadPackedSection(IniSection mapPackSection) { StringBuilder sb = new StringBuilder(); diff --git a/OpenRA.FileFormats/Session.cs b/OpenRA.FileFormats/Session.cs index c28fdc0e65..076b24be40 100644 --- a/OpenRA.FileFormats/Session.cs +++ b/OpenRA.FileFormats/Session.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford. * This file is part of OpenRA. @@ -47,7 +47,7 @@ namespace OpenRA.FileFormats public class Global { - public string Map = "scm12ea.ini"; + public string Map = "scm01ea.ini"; public string[] Packages = {}; // filename:sha1 pairs. public string[] Mods = { "ra" }; // mod names public int OrderLatency = 3; diff --git a/OpenRA.FileFormats/TileSet.cs b/OpenRA.FileFormats/TileSet.cs index eb0278ef70..964809d5b0 100644 --- a/OpenRA.FileFormats/TileSet.cs +++ b/OpenRA.FileFormats/TileSet.cs @@ -105,8 +105,15 @@ namespace OpenRA.FileFormats { if (r.tile == 0xff || r.tile == 0xffff) r.image = 0; - - return walk[r.tile].TerrainType[r.image]; + + try { + return walk[r.tile].TerrainType[r.image]; + } + catch (KeyNotFoundException) + { + return 0; // Default zero (walkable) + } + } } } diff --git a/OpenRA.Game/GameRules/UserSettings.cs b/OpenRA.Game/GameRules/UserSettings.cs index dd5b1d26f8..4fffb5766c 100644 --- a/OpenRA.Game/GameRules/UserSettings.cs +++ b/OpenRA.Game/GameRules/UserSettings.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford. * This file is part of OpenRA. @@ -39,7 +39,7 @@ namespace OpenRA.GameRules // External game settings public readonly string NetworkHost = ""; public readonly int NetworkPort = 0; - public readonly string Map = "scm12ea.ini"; + public readonly string Map = "scm01ea.ini"; public readonly int Player = 1; public readonly string Replay = ""; public readonly string PlayerName = ""; diff --git a/mods/cnc/mod.yaml b/mods/cnc/mod.yaml index 891473c4ae..76711e9ecb 100644 --- a/mods/cnc/mod.yaml +++ b/mods/cnc/mod.yaml @@ -11,11 +11,13 @@ Packages: mods/cnc/packages/cclocal.mix mods/cnc/packages/speech.mix mods/cnc/packages/conquer.mix -# mods/cnc/packages/general.mix + mods/cnc/packages/general.mix mods/cnc/packages/sounds.mix mods/cnc/packages/tempicnh.mix mods/cnc/packages/updatec.mix mods/cnc/packages/temperat.mix + mods/cnc/packages/winter.mix + mods/cnc/packages/desert.mix # Cannot qualify the RA names because they may live inside a mix ~main.mix redalert.mix @@ -23,7 +25,7 @@ Packages: temperat.mix snow.mix interior.mix - general.mix +# general.mix conquer.mix sounds.mix diff --git a/mods/cnc/templates.ini b/mods/cnc/templates.ini index 3764b2df92..1a11295415 100644 --- a/mods/cnc/templates.ini +++ b/mods/cnc/templates.ini @@ -1,3659 +1,2060 @@ -;tiletype%d can be: -; 0, land/Clear (default) -; 1, water/Water -; 2, road/Road -; 3, rock/Rock -; 4, tree (doesn't exist) -; 5, water(blocked)/River -; 6, Rough (new) -; 7, other non passable terrain thing/Wall -; 8, Beach (new) -; 9, Ore (doesn't exist) - -[TEM0] -Name=CLEAR1 -tiletype0=0 - -[TEM1] -Name=W1 -tiletype0=1 - -[TEM2] -Name=W2 -width=2 -height=2 -tiletype0=1 -tiletype1=1 -tiletype2=1 -tiletype3=1 - -[TEM3] -Name=SH01 -width=4 -height=5 -tiletype3=3 -tiletype5=0 -tiletype6=0 -tiletype7=8 -tiletype8=8 -tiletype9=1 -tiletype10=1 -tiletype11=5 -tiletype12=1 -tiletype13=1 -tiletype16=1 - -[TEM4] -Name=SH02 -width=5 -height=5 -tiletype4=0 -tiletype8=8 -tiletype9=8 -tiletype10=8 -tiletype11=0 -tiletype12=8 -tiletype13=8 -tiletype14=8 -tiletype15=8 -tiletype16=6 -tiletype17=6 -tiletype18=5 -tiletype20=1 -tiletype21=1 -tiletype22=3 - -[TEM5] -Name=SH03 -width=3 -height=5 -tiletype2=0 -tiletype4=8 -tiletype5=8 -tiletype6=8 -tiletype7=8 -tiletype8=8 -tiletype9=1 -tiletype10=1 -tiletype12=1 - -[TEM6] -Name=SH04 -width=3 -height=3 -tiletype0=8 -tiletype1=8 -tiletype2=8 -tiletype3=8 -tiletype4=8 -tiletype5=8 -tiletype6=1 -tiletype7=1 -tiletype8=1 - -[TEM7] -Name=SH05 -width=3 -height=3 -tiletype0=8 -tiletype1=3 -tiletype2=8 -tiletype3=8 -tiletype4=3 -tiletype5=3 -tiletype6=3 -tiletype7=5 -tiletype8=5 - -[TEM8] -Name=SH06 -width=3 -height=3 -tiletype0=8 -tiletype1=8 -tiletype2=8 -tiletype3=8 -tiletype4=8 -tiletype5=8 -tiletype6=1 -tiletype7=1 -tiletype8=1 - -[TEM9] -Name=SH07 -width=3 -height=3 -tiletype0=8 -tiletype1=8 -tiletype2=8 -tiletype3=8 -tiletype4=8 -tiletype5=8 -tiletype6=1 -tiletype7=1 -tiletype8=1 - -[TEM10] -Name=SH08 -width=1 -height=2 -tiletype0=8 -tiletype1=8 - -[TEM11] -Name=SH09 -width=3 -height=3 -tiletype0=0 -tiletype1=5 -tiletype2=3 -tiletype3=0 -tiletype4=5 -tiletype5=8 -tiletype6=1 -tiletype7=1 -tiletype8=1 - -[TEM12] -Name=SH10 -width=5 -height=6 -tiletype0=0 -tiletype5=8 -tiletype6=0 -tiletype10=1 -tiletype11=8 -tiletype12=8 -tiletype13=1 -tiletype17=1 -tiletype18=8 -tiletype19=8 -tiletype22=3 -tiletype23=3 -tiletype24=3 -tiletype28=1 -tiletype29=1 - -[TEM13] -Name=SH11 -width=4 -height=5 -tiletype0=8 -tiletype1=0 -tiletype4=8 -tiletype5=1 -tiletype6=8 -tiletype8=1 -tiletype9=1 -tiletype10=8 -tiletype11=8 -tiletype14=8 -tiletype15=8 -tiletype18=1 -tiletype19=8 - -[TEM14] -Name=SH12 -width=3 -height=5 -tiletype0=8 -tiletype1=0 -tiletype3=8 -tiletype4=8 -tiletype5=8 -tiletype6=1 -tiletype7=8 -tiletype8=8 -tiletype10=1 -tiletype11=8 -tiletype14=1 - -[TEM15] -Name=SH13 -width=6 -height=5 -tiletype0=1 -tiletype1=3 -tiletype2=8 -tiletype7=8 -tiletype8=8 -tiletype9=8 -tiletype13=1 -tiletype14=8 -tiletype15=8 -tiletype16=0 -tiletype19=1 -tiletype20=1 -tiletype21=6 -tiletype22=8 -tiletype23=0 -tiletype27=8 -tiletype28=8 -tiletype29=8 - -[TEM16] -Name=SH14 -width=4 -height=4 -tiletype0=8 -tiletype1=8 -tiletype2=0 -tiletype4=5 -tiletype5=8 -tiletype6=8 -tiletype8=6 -tiletype9=8 -tiletype10=8 -tiletype13=1 -tiletype14=8 -tiletype15=8 - -[TEM17] -Name=SH15 -width=5 -height=3 -tiletype0=1 -tiletype1=1 -tiletype2=8 -tiletype3=0 -tiletype6=1 -tiletype7=8 -tiletype8=8 -tiletype12=1 -tiletype13=8 -tiletype14=8 - -[TEM18] -Name=SH16 -width=3 -height=3 -tiletype0=1 -tiletype1=8 -tiletype2=0 -tiletype3=1 -tiletype4=8 -tiletype5=0 -tiletype6=1 -tiletype7=8 -tiletype8=0 - -[TEM19] -Name=SH17 -width=2 -height=1 -tiletype0=8 -tiletype1=0 - -[TEM20] -Name=SH18 -width=3 -height=3 -tiletype0=1 -tiletype1=1 -tiletype2=6 -tiletype3=1 -tiletype4=5 -tiletype5=5 -tiletype6=1 -tiletype7=8 -tiletype8=6 - -[TEM21] -Name=SH19 -width=4 -height=5 -tiletype1=1 -tiletype2=8 -tiletype3=0 -tiletype5=8 -tiletype6=8 -tiletype7=0 -tiletype8=1 -tiletype9=8 -tiletype10=8 -tiletype12=1 -tiletype13=8 -tiletype14=8 -tiletype16=1 -tiletype17=8 -tiletype18=0 - -[TEM22] -Name=SH20 -width=5 -height=4 -tiletype2=1 -tiletype3=8 -tiletype4=8 -tiletype5=1 -tiletype6=8 -tiletype7=8 -tiletype8=8 -tiletype10=1 -tiletype11=8 -tiletype12=8 -tiletype15=1 -tiletype16=8 -tiletype17=8 - -[TEM23] -Name=SH21 -width=5 -height=3 -tiletype1=1 -tiletype2=8 -tiletype3=8 -tiletype4=0 -tiletype5=1 -tiletype6=8 -tiletype7=8 -tiletype8=0 -tiletype10=1 -tiletype11=8 -tiletype12=8 - -[TEM24] -Name=SH22 -width=6 -height=5 -tiletype0=1 -tiletype6=1 -tiletype7=1 -tiletype12=8 -tiletype13=8 -tiletype14=1 -tiletype15=1 -tiletype16=1 -tiletype17=1 -tiletype19=0 -tiletype20=8 -tiletype21=8 -tiletype22=1 -tiletype23=8 -tiletype27=8 -tiletype28=8 -tiletype29=8 - -[TEM25] -Name=SH23 -width=5 -height=5 -tiletype0=8 -tiletype1=1 -tiletype2=1 -tiletype5=8 -tiletype6=8 -tiletype7=1 -tiletype8=1 -tiletype9=1 -tiletype11=0 -tiletype12=8 -tiletype13=5 -tiletype14=1 -tiletype17=0 -tiletype18=8 -tiletype19=8 -tiletype22=8 -tiletype23=8 -tiletype24=8 - -[TEM26] -Name=SH24 -width=3 -height=4 -tiletype0=8 -tiletype1=1 -tiletype3=8 -tiletype4=1 -tiletype5=1 -tiletype7=0 -tiletype8=8 -tiletype11=0 - -[TEM27] -Name=SH25 -width=3 -height=3 -tiletype0=1 -tiletype1=1 -tiletype2=1 -tiletype3=3 -tiletype4=3 -tiletype5=8 -tiletype6=3 -tiletype7=3 -tiletype8=8 - -[TEM28] -Name=SH26 -width=3 -height=3 -tiletype0=1 -tiletype1=1 -tiletype2=1 -tiletype3=8 -tiletype4=8 -tiletype5=6 -tiletype6=8 -tiletype7=8 -tiletype8=8 - -[TEM29] -Name=SH27 -width=3 -height=3 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=8 -tiletype4=8 -tiletype5=8 -tiletype6=8 -tiletype7=8 -tiletype8=6 - -[TEM30] -Name=SH28 -width=3 -height=3 -tiletype1=3 -tiletype2=3 -tiletype3=8 -tiletype4=3 -tiletype5=3 -tiletype6=8 -tiletype7=6 -tiletype8=6 - -[TEM31] -Name=SH29 -width=1 -height=2 -tiletype0=8 -tiletype1=0 - -[TEM32] -Name=SH30 -width=3 -height=2 -tiletype0=8 -tiletype1=8 -tiletype2=5 -tiletype3=0 -tiletype4=5 -tiletype5=6 - -[TEM33] -Name=SH31 -width=6 -height=5 -tiletype3=1 -tiletype4=1 -tiletype5=8 -tiletype8=1 -tiletype9=1 -tiletype10=8 -tiletype11=8 -tiletype12=1 -tiletype13=1 -tiletype14=8 -tiletype15=8 -tiletype16=0 -tiletype18=8 -tiletype19=8 -tiletype20=5 -tiletype21=8 -tiletype22=0 -tiletype24=0 -tiletype25=0 -tiletype26=8 -tiletype27=8 -tiletype28=0 - -[TEM34] -Name=SH32 -width=4 -height=4 -tiletype2=1 -tiletype3=1 -tiletype4=1 -tiletype5=1 -tiletype6=8 -tiletype7=8 -tiletype8=8 -tiletype9=8 -tiletype10=8 -tiletype12=0 -tiletype13=0 - -[TEM35] -Name=SH33 -width=3 -height=4 -tiletype1=1 -tiletype2=8 -tiletype3=1 -tiletype4=8 -tiletype5=0 -tiletype6=8 -tiletype7=6 -tiletype9=8 -tiletype10=8 - -[TEM36] -Name=SH34 -width=6 -height=5 -tiletype3=0 -tiletype4=8 -tiletype5=1 -tiletype7=8 -tiletype8=8 -tiletype9=8 -tiletype10=8 -tiletype13=8 -tiletype14=8 -tiletype15=1 -tiletype19=8 -tiletype20=8 -tiletype21=1 -tiletype24=8 -tiletype25=8 -tiletype26=1 - -[TEM37] -Name=SH35 -width=4 -height=4 -tiletype2=8 -tiletype3=1 -tiletype5=0 -tiletype6=8 -tiletype7=6 -tiletype9=8 -tiletype10=8 -tiletype11=1 -tiletype12=0 -tiletype13=8 -tiletype14=1 - -[TEM38] -Name=SH36 -width=4 -height=3 -tiletype1=8 -tiletype2=8 -tiletype3=1 -tiletype4=8 -tiletype5=8 -tiletype6=1 -tiletype8=8 -tiletype9=1 -tiletype10=1 - -[TEM39] -Name=SH37 -width=3 -height=3 -tiletype1=8 -tiletype2=1 -tiletype3=0 -tiletype4=8 -tiletype5=1 -tiletype6=6 -tiletype7=8 -tiletype8=1 - -[TEM40] -Name=SH38 -width=1 -height=2 -tiletype0=0 -tiletype1=8 - -[TEM41] -Name=SH39 -width=3 -height=3 -tiletype0=3 -tiletype1=8 -tiletype2=1 -tiletype3=5 -tiletype4=5 -tiletype5=1 -tiletype6=0 -tiletype7=8 -tiletype8=1 - -[TEM42] -Name=SH40 -width=5 -height=5 -tiletype0=0 -tiletype1=8 -tiletype2=1 -tiletype6=8 -tiletype7=1 -tiletype11=8 -tiletype12=1 -tiletype13=1 -tiletype16=0 -tiletype17=8 -tiletype18=8 -tiletype19=1 -tiletype22=8 -tiletype23=8 -tiletype24=1 - -[TEM43] -Name=SH41 -width=4 -height=4 -tiletype0=8 -tiletype1=1 -tiletype4=8 -tiletype5=8 -tiletype6=1 -tiletype8=8 -tiletype9=8 -tiletype10=1 -tiletype11=1 -tiletype13=0 -tiletype14=8 -tiletype15=1 - -[TEM44] -Name=SH42 -width=4 -height=3 -tiletype0=8 -tiletype1=8 -tiletype2=1 -tiletype5=8 -tiletype6=8 -tiletype7=5 -tiletype9=0 -tiletype10=8 -tiletype11=1 - -[TEM45] -Name=SH43 -width=3 -height=3 -tiletype0=8 -tiletype1=8 -tiletype2=8 -tiletype3=8 -tiletype4=8 -tiletype5=8 -tiletype6=8 -tiletype7=1 -tiletype8=1 - -[TEM46] -Name=SH44 -width=2 -height=2 -tiletype0=1 -tiletype1=8 -tiletype2=5 -tiletype3=1 - -[TEM47] -Name=SH45 -width=3 -height=3 -tiletype0=1 -tiletype1=8 -tiletype2=1 -tiletype3=1 -tiletype4=6 -tiletype5=8 -tiletype6=1 -tiletype7=5 -tiletype8=8 - -[TEM48] -Name=SH46 -width=2 -height=2 -tiletype0=1 -tiletype1=5 -tiletype2=5 -tiletype3=8 - -[TEM49] -Name=SH47 -width=3 -height=3 -tiletype0=1 -tiletype3=8 -tiletype4=1 -tiletype6=8 -tiletype7=8 -tiletype8=1 - -[TEM50] -Name=SH48 -width=2 -height=2 -tiletype0=1 -tiletype1=1 -tiletype2=0 -tiletype3=8 - -[TEM51] -Name=SH49 -width=3 -height=3 -tiletype0=8 -tiletype1=1 -tiletype2=1 -tiletype3=3 -tiletype4=3 -tiletype5=5 -tiletype6=5 -tiletype7=3 -tiletype8=3 - -[TEM52] -Name=SH50 -width=2 -height=2 -tiletype0=8 -tiletype1=8 -tiletype2=8 -tiletype3=1 - -[TEM53] -Name=SH51 -width=3 -height=3 -tiletype0=0 -tiletype1=8 -tiletype2=8 -tiletype4=8 -tiletype5=8 -tiletype7=6 -tiletype8=0 - -[TEM54] -Name=SH52 -width=3 -height=3 -tiletype1=0 -tiletype2=0 -tiletype3=0 -tiletype4=8 -tiletype5=8 -tiletype7=8 -tiletype8=1 - -[TEM55] -Name=SH53 -width=3 -height=3 -tiletype0=8 -tiletype1=0 -tiletype3=8 -tiletype4=8 -tiletype5=0 -tiletype6=1 -tiletype7=8 -tiletype8=0 - -[TEM56] -Name=SH54 -width=3 -height=3 -tiletype0=1 -tiletype1=8 -tiletype2=0 -tiletype3=8 -tiletype4=8 -tiletype6=0 - -[TEM57] -Name=SH55 -tiletype0=3 - -[TEM58] -Name=SH56 -width=1 -height=2 -tiletype0=3 -tiletype1=3 - -[TEM59] -Name=WC01 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM60] -Name=WC02 -width=2 -height=3 -tiletype0=3 -tiletype1=6 -tiletype2=3 -tiletype3=3 -tiletype4=3 -tiletype5=3 - -[TEM61] -Name=WC03 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM62] -Name=WC04 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM63] -Name=WC05 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM64] -Name=WC06 -width=2 -height=3 -tiletype0=6 -tiletype1=3 -tiletype2=3 -tiletype3=3 -tiletype4=3 - -[TEM65] -Name=WC07 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM66] -Name=WC08 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM67] -Name=WC09 -width=3 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=5 -tiletype4=3 -tiletype5=3 - -[TEM68] -Name=WC10 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM69] -Name=WC11 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM70] -Name=WC12 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM71] -Name=WC13 -width=3 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=6 -tiletype3=3 -tiletype4=3 -tiletype5=0 - -[TEM72] -Name=WC14 -width=2 -height=2 -tiletype0=3 -tiletype1=8 -tiletype2=8 -tiletype3=8 - -[TEM73] -Name=WC15 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM74] -Name=WC16 -width=2 -height=3 -tiletype0=1 -tiletype2=3 -tiletype3=3 -tiletype5=3 - -[TEM75] -Name=WC17 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM76] -Name=WC18 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM77] -Name=WC19 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM78] -Name=WC20 -width=2 -height=3 -tiletype1=5 -tiletype2=3 -tiletype3=3 -tiletype4=3 -tiletype5=6 - -[TEM79] -Name=WC21 -width=1 -height=2 -tiletype0=3 -tiletype1=3 - -[TEM80] -Name=WC22 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM81] -Name=WC23 -width=3 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=5 -tiletype3=3 -tiletype4=3 -tiletype5=1 - -[TEM82] -Name=WC24 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM83] -Name=WC25 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM84] -Name=WC26 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM85] -Name=WC27 -width=3 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=1 -tiletype3=0 -tiletype4=3 -tiletype5=3 - -[TEM86] -Name=WC28 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype3=3 - -[TEM87] -Name=WC29 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM88] -Name=WC30 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM89] -Name=WC31 -width=2 -height=2 -tiletype0=3 -tiletype1=5 -tiletype2=3 -tiletype3=3 - -[TEM90] -Name=WC32 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=1 - -[TEM91] -Name=WC33 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM92] -Name=WC34 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM93] -Name=WC35 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM94] -Name=WC36 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM95] -Name=WC37 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM96] -Name=WC38 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM97] -Name=B1 -tiletype0=3 - -[TEM98] -Name=B2 -width=2 -height=1 -tiletype0=3 -tiletype1=3 - -[TEM99] -Name=B3 -width=3 -height=1 -tiletype0=3 -tiletype1=3 -tiletype2=3 - -; ?????? - -;[TEM100] -;Name=B4 -;? - -;[TEM101] -;Name=B5 -;? - -;[TEM102] -;Name=B6 -;? - -[TEM103] -Name=P01 -tiletype0=3 - -[TEM104] -Name=P02 -tiletype0=3 - -[TEM105] -Name=P03 -tiletype0=3 - -[TEM106] -Name=P04 -tiletype0=3 - -[TEM107] -Name=P07 -width=4 -height=2 -tiletype0=6 -tiletype1=6 -tiletype2=6 -tiletype3=6 -tiletype4=6 -tiletype5=6 -tiletype6=6 -tiletype7=0 - -[TEM108] -Name=P08 -width=3 -height=2 -tiletype0=0 -tiletype1=6 -tiletype2=6 -tiletype3=6 -tiletype4=6 -tiletype5=6 - -[TEM109] -Name=P13 -width=3 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 -tiletype4=3 -tiletype5=3 - -[TEM110] -Name=P14 -width=2 -height=1 -tiletype0=3 -tiletype1=3 - -;[TEM111] -;Name=P15 -;? - -[TEM112] -Name=RV01 -width=5 -height=4 -tiletype0=3 -tiletype1=3 -tiletype5=3 -tiletype6=5 -tiletype7=5 -tiletype8=5 -tiletype9=5 -tiletype10=3 -tiletype11=3 -tiletype12=3 -tiletype13=3 -tiletype14=3 -tiletype16=3 -tiletype17=6 - -[TEM113] -Name=RV02 -width=5 -height=3 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=6 -tiletype4=6 -tiletype5=5 -tiletype6=5 -tiletype7=5 -tiletype8=5 -tiletype9=5 -tiletype10=3 -tiletype11=3 -tiletype12=3 - -[TEM114] -Name=RV03 -width=4 -height=4 -tiletype0=3 -tiletype1=6 -tiletype4=3 -tiletype5=3 -tiletype6=3 -tiletype7=0 -tiletype8=3 -tiletype9=3 -tiletype10=5 -tiletype11=5 -tiletype13=0 -tiletype14=0 -tiletype15=3 - -[TEM115] -Name=RV04 -width=4 -height=4 -tiletype2=3 -tiletype3=6 -tiletype5=6 -tiletype6=3 -tiletype7=5 -tiletype8=5 -tiletype9=5 -tiletype10=5 -tiletype11=5 -tiletype12=3 -tiletype13=3 -tiletype14=3 - -[TEM116] -Name=RV05 -width=3 -height=2 -tiletype0=0 -tiletype1=5 -tiletype2=3 -tiletype3=3 -tiletype4=5 -tiletype5=3 -tiletype6=3 -tiletype7=5 -tiletype8=3 - -[TEM117] -Name=RV06 -width=3 -height=2 -tiletype0=3 -tiletype1=5 -tiletype2=3 -tiletype3=3 -tiletype4=5 -tiletype5=3 - -[TEM118] -Name=RV07 -width=3 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=5 -tiletype3=3 -tiletype4=3 -tiletype5=5 - -[TEM119] -Name=RV08 -width=2 -height=2 -tiletype0=3 -tiletype1=5 -tiletype2=5 -tiletype3=5 - -[TEM120] -Name=RV09 -width=2 -height=2 -tiletype0=0 -tiletype1=0 -tiletype2=5 -tiletype3=5 - -[TEM121] -Name=RV10 -width=2 -height=2 -tiletype0=5 -tiletype1=5 -tiletype2=3 -tiletype3=5 - -[TEM122] -Name=RV11 -width=2 -height=2 -tiletype0=5 -tiletype1=5 -tiletype2=5 -tiletype3=3 - -[TEM123] -Name=RV12 -width=3 -height=4 -tiletype0=0 -tiletype1=5 -tiletype2=3 -tiletype3=3 -tiletype4=5 -tiletype5=3 -tiletype6=5 -tiletype7=5 -tiletype8=3 -tiletype9=6 -tiletype10=5 -tiletype11=3 - -[TEM124] -Name=RV13 -width=4 -height=4 -tiletype2=0 -tiletype3=6 -tiletype4=5 -tiletype5=5 -tiletype6=5 -tiletype7=5 -tiletype8=6 -tiletype9=3 -tiletype10=5 -tiletype11=3 -tiletype12=0 -tiletype13=3 -tiletype14=5 -tiletype15=6 - -;end ???, new - -[TEM125] -Name=FALLS1 -width=3 -height=3 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=5 -tiletype4=3 -tiletype5=3 -tiletype6=6 -tiletype7=3 -tiletype8=3 - -[TEM126] -Name=FALLS1A -width=3 -height=3 -tiletype0=1 -tiletype1=5 -tiletype2=3 -tiletype3=1 -tiletype4=3 -tiletype5=3 -tiletype6=1 -tiletype7=5 -tiletype8=3 - -[TEM127] -Name=FALLS2 -width=3 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=5 -tiletype4=3 -tiletype5=3 - -[TEM128] -Name=FALLS2A -width=3 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=5 -tiletype4=5 -tiletype5=5 - -[TEM129] -Name=FORD1 -width=3 -height=3 -tiletype0=6 -tiletype1=5 -tiletype2=6 -tiletype3=2 -tiletype4=6 -tiletype5=2 -tiletype6=0 -tiletype7=6 -tiletype8=6 - -[TEM130] -Name=FORD2 -width=3 -height=3 -tiletype0=6 -tiletype1=6 -tiletype2=6 -tiletype3=3 -tiletype4=6 -tiletype5=6 -tiletype6=0 -tiletype7=2 -tiletype8=0 - -[TEM131] -Name=BRIDGE1 -width=5 -height=3 -bridge=bridge1 -hp=1 -tiletype1=3 -tiletype2=2 -tiletype3=2 -tiletype4=3 -tiletype5=3 -tiletype6=2 -tiletype7=2 -tiletype8=3 -tiletype9=3 -tiletype12=3 - -[TEM132] -Name=BRIDGE1D -width=5 -height=3 -bridge=bridge1 -hp=0 -tiletype1=3 -tiletype2=3 -tiletype3=3 -tiletype4=3 -tiletype5=3 -tiletype6=3 -tiletype7=3 -tiletype8=3 -tiletype9=3 -tiletype12=3 - -[TEM133] -Name=BRIDGE2 -width=5 -height=2 -bridge=bridge2 -hp=1 -tiletype0=3 -tiletype1=2 -tiletype2=2 -tiletype3=3 -tiletype5=3 -tiletype6=3 -tiletype7=2 -tiletype8=2 -tiletype9=3 - -[TEM134] -Name=BRIDGE2D -width=5 -height=2 -bridge=bridge2 -hp=0 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 -tiletype5=3 -tiletype6=3 -tiletype7=3 -tiletype8=3 -tiletype9=3 - -;endnew - -[TEM135] -Name=S01 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM136] -Name=S02 -width=2 -height=3 -tiletype0=3 -tiletype1=6 -tiletype2=3 -tiletype3=3 -tiletype4=3 -tiletype5=3 - -[TEM137] -Name=S03 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM138] -Name=S04 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM139] -Name=S05 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM140] -Name=S06 -width=2 -height=3 -tiletype0=6 -tiletype1=3 -tiletype2=3 -tiletype3=3 -tiletype4=3 - -[TEM141] -Name=S07 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM142] -Name=S08 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM143] -Name=S09 -width=3 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 -tiletype4=3 -tiletype5=3 - -[TEM144] -Name=S10 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM145] -Name=S11 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM146] -Name=S12 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM147] -Name=S13 -width=3 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=6 -tiletype3=3 -tiletype4=3 -tiletype5=6 - -[TEM148] -Name=S14 -width=2 -height=2 -tiletype0=3 -tiletype1=6 -tiletype2=3 - -[TEM149] -Name=S15 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM150] -Name=S16 -width=2 -height=3 -tiletype0=6 -tiletype2=3 -tiletype3=3 -tiletype5=3 - -[TEM151] -Name=S17 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM152] -Name=S18 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM153] -Name=S19 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM154] -Name=S20 -width=2 -height=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 -tiletype4=3 -tiletype5=6 - -[TEM155] -Name=S21 -width=1 -height=2 -tiletype0=3 -tiletype1=3 - -[TEM156] -Name=S22 -width=1 -height=2 -tiletype0=3 -tiletype1=3 - -[TEM157] -Name=S23 -width=3 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 -tiletype4=3 -tiletype5=6 - -[TEM158] -Name=S24 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM159] -Name=S25 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM160] -Name=S26 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM161] -Name=S27 -width=3 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=6 -tiletype3=6 -tiletype4=3 -tiletype5=3 - -[TEM162] -Name=S28 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype3=3 - -[TEM163] -Name=S29 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM164] -Name=S30 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM165] -Name=S31 -width=2 -height=2 -tiletype0=3 -tiletype1=6 -tiletype2=3 -tiletype3=3 - -[TEM166] -Name=S32 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=6 - -[TEM167] -Name=S33 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM168] -Name=S34 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM169] -Name=S35 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM170] -Name=S36 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM171] -Name=S37 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM172] -Name=S38 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM173] -Name=D01 -width=2 -height=2 -tiletype1=2 -tiletype2=0 -tiletype3=0 - -[TEM174] -Name=D02 -width=2 -height=2 -tiletype0=0 -tiletype1=2 -tiletype2=0 -tiletype3=0 - -[TEM175] -Name=D03 -width=1 -height=2 -tiletype0=0 -tiletype1=2 - -[TEM176] -Name=D04 -width=2 -height=2 -tiletype1=0 -tiletype2=2 -tiletype3=0 - -[TEM177] -Name=D05 -width=3 -height=4 -tiletype1=2 -tiletype2=0 -tiletype3=2 -tiletype4=2 -tiletype6=2 -tiletype7=2 -;tiletype8=2 -;tiletype9=2 cjf - -tiletype9=2 -tiletype10=2 - -[TEM178] -Name=D06 -width=2 -height=3 -tiletype0=2 -tiletype2=2 -tiletype3=2 -tiletype4=2 -tiletype5=0 - -[TEM179] -Name=D07 -width=3 -height=2 -tiletype0=0 -tiletype1=2 -tiletype2=0 -tiletype4=2 -tiletype5=0 - -[TEM180] -Name=D08 -width=3 -height=2 -tiletype1=2 -tiletype3=0 -tiletype4=2 -tiletype5=0 - -[TEM181] -Name=D09 -width=4 -height=3 -tiletype0=0 -tiletype1=0 -tiletype2=0 -tiletype3=0 -tiletype4=2 -tiletype5=2 -tiletype6=2 -tiletype7=2 -tiletype10=0 -tiletype11=0 - -[TEM182] -Name=D10 -width=4 -height=2 -tiletype0=0 -tiletype1=3 -tiletype4=2 -tiletype5=2 -tiletype6=2 -tiletype7=2 - -[TEM183] -Name=D11 -width=2 -height=3 -tiletype1=0 -tiletype2=2 -tiletype3=2 -tiletype4=0 - -[TEM184] -Name=D12 -width=2 -height=2 -tiletype0=0 -tiletype2=2 -tiletype3=2 - -[TEM185] -Name=D13 -width=4 -height=3 -tiletype0=2 -tiletype1=2 -tiletype2=0 -tiletype4=0 -tiletype5=2 -tiletype6=2 -tiletype7=3 -tiletype10=3 -tiletype11=2 - -[TEM186] -Name=D14 -width=3 -height=3 -tiletype1=0 -tiletype2=2 -tiletype3=0 -tiletype4=3 -tiletype5=2 -tiletype6=2 -tiletype7=2 -tiletype8=2 - -[TEM187] -Name=D15 -width=3 -height=3 -tiletype0=2 -tiletype1=2 -tiletype2=2 -tiletype3=2 -tiletype4=2 -tiletype5=0 -tiletype6=2 -tiletype7=0 - -[TEM188] -Name=D16 -width=3 -height=3 -tiletype0=0 -tiletype1=2 -tiletype2=2 -tiletype3=2 -tiletype4=2 -tiletype5=2 -tiletype6=2 -tiletype7=2 -tiletype8=3 - -[TEM189] -Name=D17 -width=3 -height=2 -tiletype0=2 -tiletype1=2 -tiletype2=2 -tiletype3=0 -tiletype4=2 -tiletype5=0 - -[TEM190] -Name=D18 -width=3 -height=3 -tiletype0=0 -tiletype1=2 -tiletype2=0 -tiletype3=2 -tiletype4=2 -tiletype5=0 -tiletype6=0 -tiletype7=2 -tiletype8=3 - -[TEM191] -Name=D19 -width=3 -height=3 -tiletype0=0 -tiletype1=2 -tiletype2=0 -tiletype3=2 -tiletype4=2 -tiletype5=2 -tiletype6=0 -tiletype7=2 -tiletype8=0 - -[TEM192] -Name=D20 -width=3 -height=3 -tiletype0=2 -tiletype1=0 -tiletype3=2 -tiletype4=2 -tiletype5=0 -tiletype6=0 -tiletype7=2 -tiletype8=2 - -[TEM193] -Name=D21 -width=3 -height=2 -tiletype0=3 -tiletype1=2 -tiletype2=2 -tiletype3=0 -tiletype4=2 -tiletype5=6 - -[TEM194] -Name=D22 -width=3 -height=3 -tiletype1=0 -tiletype3=2 -tiletype4=2 -tiletype5=0 -tiletype6=0 -tiletype7=2 -tiletype8=0 - -[TEM195] -Name=D23 -width=3 -height=3 -tiletype1=2 -tiletype2=0 -tiletype3=0 -tiletype4=2 -tiletype5=0 -tiletype6=2 -tiletype7=2 - -[TEM196] -Name=D24 -width=3 -height=3 -tiletype0=2 -tiletype1=2 -tiletype3=2 -tiletype4=2 -tiletype5=2 -tiletype7=2 -tiletype8=2 - -[TEM197] -Name=D25 -width=3 -height=3 -tiletype0=2 -tiletype1=2 -tiletype3=2 -tiletype4=2 -tiletype5=2 -tiletype7=2 -tiletype8=2 - -[TEM198] -Name=D26 -width=2 -height=2 -tiletype1=2 -tiletype2=2 - -[TEM199] -Name=D27 -width=2 -height=2 -tiletype1=2 -tiletype2=2 - -[TEM200] -Name=D28 -width=2 -height=2 -tiletype0=2 -tiletype1=2 -tiletype2=6 - -[TEM201] -Name=D29 -width=2 -height=2 -tiletype0=2 -tiletype1=2 -tiletype2=2 - -[TEM202] -Name=D30 -width=2 -height=2 -tiletype0=2 -tiletype1=2 -tiletype2=2 - -[TEM203] -Name=D31 -width=2 -height=2 -tiletype1=2 -tiletype2=2 -tiletype3=2 - -[TEM204] -Name=D32 -width=2 -height=2 -tiletype1=0 -tiletype2=2 -tiletype3=0 - -[TEM205] -Name=D33 -width=2 -height=2 -tiletype1=2 -tiletype2=2 -tiletype3=2 - -[TEM206] -Name=D34 -width=3 -height=3 -tiletype1=2 -tiletype2=2 -tiletype3=2 -tiletype4=2 -tiletype5=2 -tiletype6=2 -tiletype7=2 - -[TEM207] -Name=D35 -width=3 -height=3 -tiletype1=2 -tiletype2=2 -tiletype3=2 -tiletype4=2 -tiletype5=2 -tiletype6=2 -tiletype7=2 - -[TEM208] -Name=D36 -width=2 -height=2 -tiletype0=2 -tiletype3=2 - -[TEM209] -Name=D37 -width=2 -height=2 -tiletype0=2 -tiletype3=2 - -[TEM210] -Name=D38 -width=2 -height=2 -tiletype0=2 -tiletype1=2 -tiletype3=2 - -[TEM211] -Name=D39 -width=2 -height=2 -tiletype0=2 -tiletype1=2 -tiletype3=2 - -[TEM212] -Name=D40 -width=2 -height=2 -tiletype0=2 -tiletype1=2 -tiletype3=2 - -[TEM213] -Name=D41 -width=2 -height=2 -tiletype0=3 -tiletype2=2 -tiletype3=2 - -[TEM214] -Name=D42 -width=2 -height=2 -tiletype0=2 -tiletype2=2 -tiletype3=2 - -[TEM215] -Name=D43 -width=2 -height=2 -tiletype0=0 -tiletype2=2 -tiletype3=2 - -;new - -[TEM216] ;? -Name=RF01 -tiletype0=3 - -[TEM217] ;? -Name=RF02 -tiletype0=3 - -[TEM218] -Name=RF03 -tiletype0=3 - -[TEM219] -Name=RF04 -tiletype0=3 - -[TEM220] -Name=RF05 -tiletype0=3 - -[TEM221] -Name=RF06 -tiletype0=3 - -[TEM222] -Name=RF07 -tiletype0=3 - -[TEM223] -Name=RF08 -width=1 -height=2 -tiletype0=3 -tiletype1=3 - -[TEM224] -Name=RF09 -width=1 -height=2 -tiletype0=3 -tiletype1=3 - -[TEM225] -Name=RF10 -width=2 -height=1 -tiletype0=6 -tiletype1=6 - -[TEM226] -Name=RF11 -width=2 -height=1 -tiletype0=3 -tiletype1=3 - -[TEM227] -Name=D44 -tiletype0=2 - -[TEM228] -Name=D45 -tiletype0=2 - -[TEM229] -Name=RV14 -width=1 -height=2 -tiletype0=3 -tiletype1=5 -tiletype2=3 - -[TEM230] -Name=RV15 -width=2 -height=1 -tiletype0=3 -tiletype1=5 -tiletype2=3 - -[TEM231] -Name=RC01 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM232] -Name=RC02 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM233] -Name=RC03 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM234] -Name=RC04 -width=2 -height=2 -tiletype0=3 -tiletype1=3 -tiletype2=3 -tiletype3=3 - -[TEM235] -Name=BR1A -width=4 -height=3 -bridge=br1 -hp=1 -tiletype1=3 -tiletype2=2 -tiletype4=3 -tiletype5=2 -tiletype6=2 -tiletype7=3 -tiletype9=2 -tiletype10=3 -tiletype11=3 - -[TEM236] -Name=BR1B -width=4 -height=3 -bridge=br1 -hp=.5 -tiletype1=3 -tiletype2=6 -tiletype4=3 -tiletype5=6 -tiletype6=6 -tiletype7=3 -tiletype9=6 -tiletype10=3 -tiletype11=3 - -[TEM237] -Name=BR1C -width=4 -height=3 -bridge=br1 -hp=0 -tiletype1=3 -tiletype2=3 -tiletype4=3 -tiletype5=3 -tiletype6=3 -tiletype7=3 -tiletype9=3 -tiletype10=3 -tiletype11=3 - -[TEM238] -Name=BR2A -width=5 -height=3 -bridge=br2 -hp=1 -tiletype1=3 -tiletype2=2 -tiletype5=3 -tiletype6=2 -tiletype7=2 -tiletype8=3 -tiletype9=3 -tiletype11=2 -tiletype12=3 -tiletype13=3 - -[TEM239] -Name=BR2B -width=5 -height=3 -bridge=br2 -hp=.5 -tiletype1=3 -tiletype2=6 -tiletype5=3 -tiletype6=6 -tiletype7=6 -tiletype8=3 -tiletype9=3 -tiletype11=6 -tiletype12=3 -tiletype13=3 - -[TEM240] -Name=BR2C -width=5 -height=3 -bridge=br2 -hp=0 -tiletype1=1 -tiletype2=1 -tiletype5=3 -tiletype6=3 -tiletype7=3 -tiletype8=3 -tiletype9=3 -tiletype11=3 -tiletype12=3 -tiletype13=3 - -[TEM241] -Name=BR3A -width=4 -height=2 -bridge=br3 -hp=1 -tiletype0=3 -tiletype1=2 -tiletype5=2 -tiletype6=3 -tiletype7=3 - -[TEM242] -Name=BR3B -width=4 -height=2 -bridge=br3 -hp=.5 -tiletype0=3 -tiletype1=2 -tiletype5=2 -tiletype6=3 -tiletype7=3 - -[TEM243] -Name=BR3C -width=4 -height=2 -bridge=br3 -hp=0 -tiletype0=3 -tiletype1=3 -tiletype5=3 -tiletype6=3 -tiletype7=3 - -[TEM244] -Name=BR3D -width=4 -height=2 -bridge=br3 -hp=0 -tiletype0=5 -tiletype1=3 -tiletype5=5 -tiletype6=5 -tiletype7=5 - -[TEM245] -Name=BR3E -width=4 -height=2 -bridge=br3 -hp=0 -tiletype0=1 -tiletype1=1 -tiletype5=3 -tiletype6=1 -tiletype7=1 - -[TEM246] -Name=BR3F -width=4 -height=2 -bridge=br3 -hp=0 -tiletype0=1 -tiletype1=1 -tiletype5=1 -tiletype6=1 -tiletype7=1 - -[TEM247] -Name=F01 -width=3 -height=3 -tiletype0=6 -tiletype1=2 -tiletype2=2 -tiletype3=8 -tiletype4=8 -tiletype5=8 -tiletype6=8 -tiletype7=8 -tiletype8=8 - -[TEM248] -Name=F02 -width=3 -height=3 -tiletype0=8 -tiletype1=8 -tiletype2=8 -tiletype3=8 -tiletype4=8 -tiletype5=8 -tiletype6=8 -tiletype7=8 -tiletype8=8 - -[TEM249] -Name=F03 -width=3 -height=3 -tiletype0=8 -tiletype1=8 -tiletype2=8 -tiletype3=8 -tiletype4=8 -tiletype5=8 -tiletype6=0 -tiletype7=2 -tiletype8=0 - -[TEM250] -Name=F04 -width=3 -height=3 -tiletype0=0 -tiletype1=8 -tiletype2=8 -tiletype3=2 -tiletype4=8 -tiletype5=8 -tiletype6=0 -tiletype7=8 -tiletype8=8 - -[TEM251] -Name=F05 -width=3 -height=3 -tiletype0=8 -tiletype1=8 -tiletype2=8 -tiletype3=8 -tiletype4=8 -tiletype5=8 -tiletype6=8 -tiletype7=8 -tiletype8=8 - -[TEM252] -Name=F06 -width=3 -height=3 -tiletype0=8 -tiletype1=8 -tiletype2=0 -tiletype3=8 -tiletype4=8 -tiletype5=2 -tiletype6=8 -tiletype7=8 -tiletype8=0 - -[TEM255] -Name=CLEAR1 -tiletype0=0 - -[TEM378] -Name=BRIDGE1H -width=5 -height=3 -bridge=bridge1 -hp=.5 -tiletype1=3 -tiletype2=6 -tiletype3=6 -tiletype4=3 -tiletype5=3 -tiletype6=6 -tiletype7=6 -tiletype8=3 -tiletype9=3 -tiletype12=6 - -[TEM379] -Name=BRIDGE2H -width=5 -height=2 -bridge=bridge2 -hp=.5 -tiletype0=3 -tiletype1=6 -tiletype2=6 -tiletype3=3 -tiletype5=3 -tiletype6=3 -tiletype7=6 -tiletype8=6 -tiletype9=3 - -[TEM380] -Name=BR1X -width=5 -height=3 -tiletype0=3 -tiletype3=2 -tiletype4=0 -tiletype9=3 -tiletype14=1 - -[TEM381] -Name=BR2X -width=5 -height=1 -tiletype0=2 -tiletype4=8 - -[TEM382] -Name=BRIDGE1X -width=5 -height=4 -tiletype2=0 -tiletype3=2 -tiletype4=2 -tiletype5=3 -tiletype15=2 -tiletype16=2 -tiletype18=3 -tiletype19=3 - -[TEM383] -Name=BRIDGE2X -width=5 -height=5 -tiletype0=2 -tiletype1=2 -tiletype2=6 -tiletype3=0 -tiletype4=6 -tiletype9=5 -tiletype15=3 -tiletype16=3 -tiletype17=6 -tiletype18=2 -tiletype19=2 -tiletype23=2 -tiletype24=2 - - -; interior tiles - - -;;;;;; the interior `clear` tile is incompatible with the temperat/snow ones. -;[INT_clear1] -;Name=clear1 -;width=1 -;height=1 -;tiletype0=7 - -[INT_arro0001] -Name=arro0001 -width=1 -height=1 -tiletype0=0 -[INT_arro0002] -Name=arro0002 -width=1 -height=1 -tiletype0=0 -[INT_arro0003] -Name=arro0003 -width=1 -height=1 -tiletype0=0 -[Blah] -Name=arro0004 -width=1 -height=1 -tiletype0=0 -[INT_arro0005] -Name=arro0005 -width=1 -height=1 -tiletype0=0 -[INT_arro0006] -Name=arro0006 -width=1 -height=1 -tiletype0=0 -[INT_arro0007] -Name=arro0007 -width=1 -height=1 -tiletype0=0 -[INT_arro0008] -Name=arro0008 -width=1 -height=1 -tiletype0=0 -[INT_arro0009] -Name=arro0009 -width=1 -height=1 -tiletype0=0 -[INT_arro0010] -Name=arro0010 -width=1 -height=1 -tiletype0=0 -[INT_arro0011] -Name=arro0011 -width=1 -height=1 -tiletype0=0 -[INT_arro0012] -Name=arro0012 -width=1 -height=1 -tiletype0=0 -[INT_arro0013] -Name=arro0013 -width=1 -height=1 -tiletype0=0 -[INT_arro0014] -Name=arro0014 -width=1 -height=1 -tiletype0=0 -[INT_arro0015] -Name=arro0015 -width=1 -height=1 -tiletype0=0 - -[INT_flor0001] -Name=flor0001 -width=1 -height=1 -tiletype0=0 -[INT_flor0002] -Name=flor0002 -width=1 -height=1 -tiletype0=0 -[INT_flor0003] -Name=flor0003 -width=1 -height=1 -tiletype0=0 -[INT_flor0004] -Name=flor0004 -width=1 -height=1 -tiletype0=0 -[INT_flor0005] -Name=flor0005 -width=1 -height=1 -tiletype0=0 -[INT_flor0006] -Name=flor0006 -width=1 -height=1 -tiletype0=0 -[INT_flor0007] -Name=flor0007 -width=1 -height=1 -tiletype0=0 - -[INT_gflr0001] -Name=gflr0001 -width=1 -height=1 -tiletype0=0 -[INT_gflr0002] -Name=gflr0002 -width=1 -height=1 -tiletype0=0 -[INT_gflr0003] -Name=gflr0003 -width=1 -height=1 -tiletype0=0 -[INT_gflr0004] -Name=gflr0004 -width=1 -height=1 -tiletype0=0 -[INT_gflr0005] -Name=gflr0005 -width=1 -height=1 -tiletype0=0 - -[INT_gstr0001] -Name=gstr0001 -width=1 -height=1 -tiletype0=0 -[INT_gstr0002] -Name=gstr0002 -width=1 -height=1 -tiletype0=0 -[INT_gstr0003] -Name=gstr0003 -width=1 -height=1 -tiletype0=0 -[INT_gstr0004] -Name=gstr0004 -width=1 -height=1 -tiletype0=0 -[INT_gstr0005] -Name=gstr0005 -width=1 -height=1 -tiletype0=0 -[INT_gstr0006] -Name=gstr0006 -width=1 -height=1 -tiletype0=0 -[INT_gstr0007] -Name=gstr0007 -width=1 -height=1 -tiletype0=0 -[INT_gstr0008] -Name=gstr0008 -width=1 -height=1 -tiletype0=0 -[INT_gstr0009] -Name=gstr0009 -width=1 -height=1 -tiletype0=0 -[INT_gstr0010] -Name=gstr0010 -width=1 -height=1 -tiletype0=0 -[INT_gstr0011] -Name=gstr0011 -width=1 -height=1 -tiletype0=0 - -[INT_lwal0001] -Name=lwal0001 -width=1 -height=1 -tiletype0=7 -[INT_lwal0002] -Name=lwal0002 -width=1 -height=1 -tiletype0=7 -[INT_lwal0003] -Name=lwal0003 -width=1 -height=1 -tiletype0=7 -[INT_lwal0004] -Name=lwal0004 -width=1 -height=1 -tiletype0=7 -[INT_lwal0005] -Name=lwal0005 -width=1 -height=1 -tiletype0=7 -[INT_lwal0006] -Name=lwal0006 -width=1 -height=1 -tiletype0=7 -[INT_lwal0007] -Name=lwal0007 -width=1 -height=1 -tiletype0=7 -[INT_lwal0008] -Name=lwal0008 -width=1 -height=1 -tiletype0=7 -[INT_lwal0009] -Name=lwal0009 -width=1 -height=1 -tiletype0=7 -[INT_lwal0010] -Name=lwal0010 -width=1 -height=1 -tiletype0=7 -[INT_lwal0011] -Name=lwal0011 -width=1 -height=1 -tiletype0=7 -[INT_lwal0012] -Name=lwal0012 -width=1 -height=1 -tiletype0=7 -[INT_lwal0013] -Name=lwal0013 -width=1 -height=1 -tiletype0=7 -[INT_lwal0014] -Name=lwal0014 -width=1 -height=1 -tiletype0=7 -[INT_lwal0015] -Name=lwal0015 -width=1 -height=1 -tiletype0=7 -[INT_lwal0016] -Name=lwal0016 -width=1 -height=1 -tiletype0=7 -[INT_lwal0017] -Name=lwal0017 -width=1 -height=1 -tiletype0=7 -[INT_lwal0018] -Name=lwal0018 -width=1 -height=1 -tiletype0=7 -[INT_lwal0019] -Name=lwal0019 -width=1 -height=1 -tiletype0=7 -[INT_lwal0020] -Name=lwal0020 -width=1 -height=1 -tiletype0=7 -[INT_lwal0021] -Name=lwal0021 -width=1 -height=1 -tiletype0=7 -[INT_lwal0022] -Name=lwal0022 -width=1 -height=1 -tiletype0=7 -[INT_lwal0023] -Name=lwal0023 -width=1 -height=1 -tiletype0=7 -[INT_lwal0024] -Name=lwal0024 -width=1 -height=1 -tiletype0=7 -[INT_lwal0025] -Name=lwal0025 -width=1 -height=1 -tiletype0=7 -[INT_lwal0026] -Name=lwal0026 -width=1 -height=1 -tiletype0=7 -[INT_lwal0027] -Name=lwal0027 -width=1 -height=1 -tiletype0=7 - -[INT_strp0001] -Name=strp0001 -width=1 -height=1 -tiletype0=0 -[INT_strp0002] -Name=strp0002 -width=1 -height=1 -tiletype0=0 -[INT_strp0003] -Name=strp0003 -width=1 -height=1 -tiletype0=0 -[INT_strp0004] -Name=strp0004 -width=1 -height=1 -tiletype0=0 -[INT_strp0005] -Name=strp0005 -width=1 -height=1 -tiletype0=0 -[INT_strp0006] -Name=strp0006 -width=1 -height=1 -tiletype0=0 -[INT_strp0007] -Name=strp0007 -width=1 -height=1 -tiletype0=0 -[INT_strp0008] -Name=strp0008 -width=1 -height=1 -tiletype0=0 -[INT_strp0009] -Name=strp0009 -width=1 -height=1 -tiletype0=0 -[INT_strp0010] -Name=strp0010 -width=1 -height=1 -tiletype0=0 -[INT_strp0011] -Name=strp0011 -width=1 -height=1 -tiletype0=0 - -[INT_wall0001] -Name=wall0001 -width=1 -height=1 -tiletype0=7 -[INT_wall0002] -Name=wall0002 -width=1 -height=1 -tiletype0=7 -[INT_wall0003] -Name=wall0003 -width=1 -height=1 -tiletype0=7 -[INT_wall0004] -Name=wall0004 -width=1 -height=1 -tiletype0=7 -[INT_wall0005] -Name=wall0005 -width=1 -height=1 -tiletype0=7 -[INT_wall0006] -Name=wall0006 -width=1 -height=1 -tiletype0=7 -[INT_wall0007] -Name=wall0007 -width=1 -height=1 -tiletype0=7 -[INT_wall0008] -Name=wall0008 -width=1 -height=1 -tiletype0=7 -[INT_wall0009] -Name=wall0009 -width=1 -height=1 -tiletype0=7 -[INT_wall0010] -Name=wall0010 -width=1 -height=1 -tiletype0=7 -[INT_wall0011] -Name=wall0011 -width=1 -height=1 -tiletype0=7 -[INT_wall0012] -Name=wall0012 -width=1 -height=1 -tiletype0=7 -[INT_wall0013] -Name=wall0013 -width=1 -height=1 -tiletype0=7 -[INT_wall0014] -Name=wall0014 -width=1 -height=1 -tiletype0=7 -[INT_wall0015] -Name=wall0015 -width=1 -height=1 -tiletype0=7 -[INT_wall0016] -Name=wall0016 -width=1 -height=1 -tiletype0=7 -[INT_wall0017] -Name=wall0017 -width=1 -height=1 -tiletype0=7 -[INT_wall0018] -Name=wall0018 -width=1 -height=1 -tiletype0=7 -[INT_wall0019] -Name=wall0019 -width=1 -height=1 -tiletype0=7 -[INT_wall0020] -Name=wall0020 -width=1 -height=1 -tiletype0=7 -[INT_wall0021] -Name=wall0021 -width=1 -height=1 -tiletype0=7 -[INT_wall0022] -Name=wall0022 -width=1 -height=1 -tiletype0=7 - -[INT_wall0023] -Name=wall0023 -width=2 -height=2 -tiletype0=7 -tiletype1=7 -tiletype2=7 -[INT_wall0024] -Name=wall0024 -width=2 -height=2 -tiletype0=7 -tiletype1=7 -tiletype2=7 -[INT_wall0025] -Name=wall0025 -width=2 -height=2 -tiletype0=7 -tiletype1=7 -tiletype2=7 -[INT_wall0026] -Name=wall0026 -width=2 -height=2 -tiletype0=7 -tiletype1=7 -tiletype2=7 -[INT_wall0027] -Name=wall0027 -width=2 -height=2 -tiletype0=7 -tiletype1=7 -tiletype3=7 -[INT_wall0028] -Name=wall0028 -width=2 -height=2 -tiletype0=7 -tiletype1=7 -tiletype3=7 -[INT_wall0029] -Name=wall0029 -width=2 -height=2 -tiletype0=7 -tiletype1=7 -tiletype3=7 -[INT_wall0030] -Name=wall0030 -width=2 -height=2 -tiletype0=7 -tiletype1=7 -tiletype3=7 -[INT_wall0031] -Name=wall0031 -width=2 -height=2 -tiletype0=7 -tiletype2=7 -tiletype3=7 -[INT_wall0032] -Name=wall0032 -width=2 -height=2 -tiletype0=7 -tiletype2=7 -tiletype3=7 -[INT_wall0033] -Name=wall0033 -width=2 -height=2 -tiletype0=7 -tiletype2=7 -tiletype3=7 -[INT_wall0034] -Name=wall0034 -width=2 -height=2 -tiletype0=7 -tiletype2=7 -tiletype3=7 -[INT_wall0035] -Name=wall0035 -width=2 -height=2 -tiletype1=7 -tiletype2=7 -tiletype3=7 -[INT_wall0036] -Name=wall0036 -width=2 -height=2 -tiletype1=7 -tiletype2=7 -tiletype3=7 -[INT_wall0037] -Name=wall0037 -width=2 -height=2 -tiletype1=7 -tiletype2=7 -tiletype3=7 -[INT_wall0038] -Name=wall0038 -width=2 -height=2 -tiletype1=7 -tiletype2=7 -tiletype3=7 - -[INT_wall0039] -Name=wall0039 -width=2 -height=3 -tiletype0=7 -tiletype2=7 -tiletype3=7 -tiletype4=7 -[INT_wall0040] -Name=wall0040 -width=2 -height=3 -tiletype0=7 -tiletype2=7 -tiletype3=7 -tiletype4=7 -[INT_wall0041] -Name=wall0041 -width=2 -height=3 -tiletype1=7 -tiletype2=7 -tiletype3=7 -tiletype5=7 -[INT_wall0042] -Name=wall0042 -width=2 -height=3 -tiletype1=7 -tiletype2=7 -tiletype3=7 -tiletype5=7 - -[INT_wall0043] -Name=wall0043 -width=3 -height=2 -tiletype1=7 -tiletype3=7 -tiletype4=7 -tiletype5=7 -[INT_wall0044] -Name=wall0044 -width=3 -height=2 -tiletype1=7 -tiletype3=7 -tiletype4=7 -tiletype5=7 -[INT_wall0045] -Name=wall0045 -width=3 -height=2 -tiletype1=7 -tiletype3=7 -tiletype4=7 -tiletype5=7 -[INT_wall0046] -Name=wall0046 -width=3 -height=2 -tiletype1=7 -tiletype3=7 -tiletype4=7 -tiletype5=7 -[INT_wall0047] -Name=wall0047 -width=3 -height=2 -tiletype0=7 -tiletype1=7 -tiletype2=7 -tiletype4=7 -[INT_wall0048] -Name=wall0048 -width=3 -height=2 -tiletype0=7 -tiletype1=7 -tiletype2=7 -tiletype4=7 -[INT_wall0049] -Name=wall0049 -width=3 -height=3 -tiletype1=7 -tiletype3=7 -tiletype4=7 -tiletype5=7 -tiletype7=7 - -[INT_xtra0001] -Name=xtra0001 -width=1 -height=1 -tiletype0=7 -[INT_xtra0002] -Name=xtra0002 -width=2 -height=1 -tiletype0=7 -tiletype1=0 -[INT_xtra0003] -Name=xtra0003 -width=1 -height=1 -tiletype0=7 -[INT_xtra0004] -Name=xtra0004 -width=1 -height=2 -tiletype0=7 -tiletype1=0 -[INT_xtra0005] -Name=xtra0005 -width=1 -height=1 -tiletype0=7 -[INT_xtra0006] -Name=xtra0006 -width=2 -height=1 -tiletype0=7 -tiletype1=0 -[INT_xtra0007] -Name=xtra0007 -width=1 -height=1 -tiletype0=7 -[INT_xtra0008] -Name=xtra0008 -width=1 -height=2 -tiletype0=7 -tiletype1=0 -[INT_xtra0009] -Name=xtra0009 -width=1 -height=1 -tiletype0=7 -[INT_xtra0010] -Name=xtra0010 -width=1 -height=1 -tiletype0=7 -[INT_xtra0011] -Name=xtra0011 -width=1 -height=1 -tiletype0=7 -[INT_xtra0012] -Name=xtra0012 -width=1 -height=2 -tiletype0=7 -tiletype1=0 -[INT_xtra0013] -Name=xtra0013 -width=1 -height=2 -tiletype0=7 -tiletype1=0 -[INT_xtra0014] -Name=xtra0014 -width=3 -height=2 -tiletype0=0 -tiletype1=7 -tiletype2=0 -tiletype3=0 -tiletype4=0 -tiletype5=0 -[INT_xtra0015] -Name=xtra0015 -width=3 -height=2 -tiletype0=7 -tiletype1=7 -tiletype2=7 -tiletype3=7 -tiletype4=7 -tiletype5=7 -[INT_xtra0016] -Name=xtra0016 -width=2 -height=4 -tiletype0=7 -tiletype1=7 -tiletype2=7 -tiletype3=7 -tiletype4=7 -tiletype5=7 -tiletype6=7 -tiletype7=7 - -; special tile -[TEM65534] -Name=Bogus -width=1 -height=1 -tiletype0=10 +;tiletype%d can be: +; 0, land (default) +; 1, water +; 2, road +; 3, rock +; 4, tree +; 5, water(blocked) +; 7, other non passable terrain thing + +[TEM0] +Name=CLEAR1 +width=4 +height=4 +tiletype0=0 + +[TEM1] +Name=W1 +width=1 +height=1 +tiletype0=1 + +[TEM2] +Name=W2 +width=2 +height=2 +tiletype0=1 +tiletype1=1 +tiletype2=1 +tiletype3=1 + +[TEM3] +Name=SH1 +width=3 +height=3 +tiletype3=5 +tiletype6=1 +tiletype7=1 +tiletype8=1 + +[TEM4] +Name=SH2 +width=3 +height=3 +tiletype3=5 +tiletype4=5 +tiletype5=5 +tiletype6=5 +tiletype7=1 +tiletype8=1 + +[TEM5] +Name=SH3 +width=1 +height=1 +tiletype0=5 + +[TEM6] +Name=SH4 +width=2 +height=1 +tiletype0=5 +tiletype1=5 + +[TEM7] +Name=SH5 +width=3 +height=3 +tiletype3=5 +tiletype4=5 +tiletype6=1 +tiletype7=1 +tiletype8=1 + +[TEM8] +Name=SH11 +width=3 +height=3 +tiletype1=5 +tiletype2=3 +tiletype4=5 +tiletype5=5 +tiletype6=1 +tiletype7=1 +tiletype8=1 + +[TEM9] +Name=SH12 +width=3 +height=3 +tiletype0=1 +tiletype1=1 +tiletype2=1 +tiletype3=3 +tiletype6=4 +tiletype7=4 + +[TEM10] +Name=SH13 +width=3 +height=3 +tiletype0=1 +tiletype1=1 +tiletype2=1 +tiletype3=1 +tiletype5=3 +tiletype7=3 +tiletype8=2 + +[TEM11] +Name=SH14 +width=3 +height=3 +tiletype0=5 +tiletype1=5 +tiletype2=5 +tiletype3=5 +tiletype4=5 +tiletype5=5 +tiletype8=4 + +[TEM12] +Name=SH15 +width=3 +height=3 +tiletype1=5 +tiletype2=5 +tiletype3=5 +tiletype4=3 +tiletype5=3 +tiletype7=4 + +[TEM13] +Name=S01 +width=2 +height=2 +tiletype0=3 +tiletype1=3 +tiletype3=3 + +[TEM14] +Name=S02 +width=2 +height=3 +tiletype0=3 +tiletype2=3 +tiletype3=3 +tiletype5=3 + +[TEM15] +Name=S03 +width=2 +height=2 +tiletype0=3 +tiletype1=3 +tiletype2=3 +tiletype3=3 + +[TEM16] +Name=S04 +width=2 +height=2 +tiletype0=3 +tiletype1=3 +tiletype2=3 +tiletype3=3 + +[TEM17] +Name=S05 +width=2 +height=2 +tiletype0=3 +tiletype1=3 +tiletype2=3 +tiletype3=3 + +[TEM18] +Name=S06 +width=2 +height=3 +tiletype1=3 +tiletype2=3 +tiletype3=3 +tiletype4=3 + +[TEM19] +Name=S07 +width=2 +height=2 +tiletype0=3 +tiletype1=3 +tiletype2=3 +tiletype3=3 + +[TEM20] +Name=S08 +width=2 +height=2 +tiletype0=3 +tiletype2=3 +tiletype3=3 + +[TEM21] +Name=S09 +width=3 +height=2 +tiletype0=3 +tiletype1=3 +tiletype2=3 +tiletype4=3 +tiletype5=3 + +[TEM22] +Name=S10 +width=2 +height=2 +tiletype0=3 +tiletype1=3 +tiletype2=3 +tiletype3=3 + +[TEM23] +Name=S11 +width=2 +height=2 +tiletype0=3 +tiletype1=3 +tiletype2=3 +tiletype3=3 + +[TEM24] +Name=S12 +width=2 +height=2 +tiletype0=3 +tiletype1=3 +tiletype2=3 +tiletype3=3 + +[TEM25] +Name=S13 +width=3 +height=2 +tiletype1=3 +tiletype3=3 +tiletype4=3 + +[TEM26] +Name=S14 +width=2 +height=2 +tiletype0=3 + +[TEM27] +Name=S15 +width=2 +height=2 +tiletype0=3 +tiletype2=3 +tiletype3=3 + +[TEM28] +Name=S16 +width=2 +height=3 +tiletype2=3 +tiletype3=3 +tiletype5=3 + +[TEM29] +Name=S17 +width=2 +height=2 +tiletype2=3 +tiletype3=3 + +[TEM30] +Name=S18 +width=2 +height=2 +tiletype2=3 +tiletype3=3 + +[TEM31] +Name=S19 +width=2 +height=2 +tiletype2=3 +tiletype3=3 + +[TEM32] +Name=S20 +width=2 +height=3 +tiletype2=3 +tiletype3=3 +tiletype4=3 + +[TEM33] +Name=S21 +width=1 +height=2 +tiletype0=3 +tiletype1=3 + +[TEM34] +Name=S22 +width=2 +height=1 +tiletype0=3 +tiletype1=3 + +[TEM35] +Name=S23 +width=3 +height=2 +tiletype0=3 +tiletype1=3 +tiletype3=3 +tiletype4=3 + +[TEM36] +Name=S24 +width=2 +height=2 +tiletype0=3 +tiletype1=3 +tiletype2=3 +tiletype3=3 + +[TEM37] +Name=S25 +width=2 +height=2 +tiletype0=3 +tiletype1=3 +tiletype2=3 +tiletype3=3 + +[TEM38] +Name=S26 +width=2 +height=2 +tiletype0=3 +tiletype1=3 +tiletype2=3 +tiletype3=3 + +[TEM39] +Name=S27 +width=3 +height=2 +tiletype0=3 +tiletype1=3 +tiletype4=3 +tiletype5=3 + +[TEM40] +Name=S28 +width=2 +height=2 +tiletype0=3 +tiletype1=3 +tiletype3=3 + +[TEM41] +Name=S29 +width=2 +height=2 +tiletype0=3 +tiletype1=3 +tiletype2=3 +tiletype3=3 + +[TEM42] +Name=S30 +width=2 +height=2 +tiletype0=3 +tiletype2=3 +tiletype3=3 + +[TEM43] +Name=S31 +width=2 +height=2 +tiletype2=3 +tiletype3=3 + +[TEM44] +Name=S32 +width=2 +height=2 +tiletype0=3 +tiletype1=3 +tiletype2=3 + +[TEM45] +Name=S33 +width=2 +height=2 +tiletype0=3 +tiletype1=3 +tiletype2=3 +tiletype3=3 + +[TEM46] +Name=S34 +width=2 +height=2 +tiletype0=3 +tiletype1=3 +tiletype2=3 +tiletype3=3 + +[TEM47] +Name=S35 +width=2 +height=2 +tiletype0=3 +tiletype1=3 +tiletype2=3 +tiletype3=3 + +[TEM48] +Name=S36 +width=2 +height=2 +tiletype0=3 +tiletype1=3 +tiletype2=3 +tiletype3=3 + +[TEM49] +Name=S37 +width=2 +height=2 +tiletype0=3 +tiletype2=3 +tiletype3=3 + +[TEM50] +Name=S38 +width=2 +height=2 +tiletype0=3 +tiletype1=3 +tiletype2=3 +tiletype3=3 + +[TEM51] +Name=SH32 +width=3 +height=3 +tiletype0=1 +tiletype3=5 + +[TEM52] +Name=SH33 +width=3 +height=3 +tiletype2=5 + +[TEM53] +Name=SH20 +width=4 +height=1 +tiletype0=5 +tiletype1=3 +tiletype2=3 +tiletype3=5 + +[TEM54] +Name=SH21 +width=3 +height=1 +tiletype0=3 +tiletype2=5 + +[TEM55] +Name=SH22 +width=6 +height=2 +tiletype1=3 +tiletype2=3 +tiletype6=5 +tiletype7=1 +tiletype8=1 +tiletype9=3 +tiletype10=5 +tiletype11=5 + +[TEM56] +Name=SH23 +width=2 +height=2 +tiletype2=5 +tiletype3=5 + +[TEM57] +Name=BR1 +width=1 +height=1 +tiletype0=4 + +[TEM58] +Name=BR2 +width=1 +height=1 +tiletype0=4 + +[TEM59] +Name=BR3 +width=1 +height=1 +tiletype0=4 + +[TEM60] +Name=BR4 +width=1 +height=1 +tiletype0=4 + +[TEM61] +Name=BR5 +width=1 +height=1 +tiletype0=7 + +[TEM62] +Name=BR6 +width=2 +height=2 +tiletype0=4 +tiletype1=4 +tiletype2=4 + +[TEM63] +Name=BR7 +width=2 +height=2 +tiletype0=4 +tiletype1=4 +tiletype3=4 + +[TEM64] +Name=BR8 +width=3 +height=2 +tiletype0=4 +tiletype1=4 +tiletype4=4 +tiletype5=4 + +[TEM65] +Name=BR9 +width=3 +height=2 +tiletype0=4 +tiletype1=4 +tiletype2=4 +tiletype3=4 +tiletype4=4 +tiletype5=4 + +[TEM66] +Name=BR10 +width=2 +height=1 +tiletype0=7 +tiletype1=7 + +[TEM67] +Name=P01 +width=1 +height=1 +tiletype0=7 + +[TEM68] +Name=P02 +width=1 +height=1 +tiletype0=7 + +[TEM69] +Name=P03 +width=103 +height=1 +tiletype0=7 + +[TEM70] +Name=P04 +width=103 +height=1 +tiletype0=7 + +[TEM71] +Name=P05 +width=2 +height=2 + +[TEM72] +Name=P06 +width=6 +height=4 + +[TEM73] +Name=P07 +width=4 +height=2 + +[TEM74] +Name=P08 +width=3 +height=2 + +[TEM75] +Name=SH16 +width=3 +height=2 +tiletype0=5 +tiletype1=1 +tiletype2=5 +tiletype3=4 +tiletype4=5 +tiletype5=5 + +[TEM76] +Name=SH17 +width=2 +height=2 +tiletype0=1 +tiletype1=1 +tiletype2=1 +tiletype3=1 + +[TEM77] +Name=SH18 +width=2 +height=2 +tiletype0=1 +tiletype1=1 +tiletype2=1 +tiletype3=1 + +[TEM78] +Name=SH19 +width=3 +height=2 +tiletype1=3 +tiletype3=5 +tiletype4=3 +tiletype5=5 + +[TEM79] +Name=P13 +width=3 +height=2 +tiletype0=7 +tiletype1=7 +tiletype2=7 +tiletype3=7 +tiletype5=7 + +[TEM80] +Name=P14 +width=2 +height=1 +tiletype0=7 +tiletype1=7 + +[TEM81] +Name=P15 +width=4 +height=2 + +[TEM82] +Name=B1 +width=1 +height=1 +tiletype0=3 + +[TEM83] +Name=B2 +width=2 +height=1 +tiletype0=3 +tiletype1=3 + +[TEM84] +Name=B3 +width=3 +height=1 +tiletype0=3 +tiletype1=3 + +[TEM85] +Name=B4 +width=1 +height=1 +tiletype0=3 + +[TEM86] +Name=B5 +width=1 +height=1 +tiletype0=3 + +[TEM87] +Name=B6 +width=1 +height=1 +tiletype0=3 + +[TEM88] +Name=SH6 +width=3 +height=3 +tiletype6=1 +tiletype7=1 +tiletype8=1 + +[TEM89] +Name=SH7 +width=2 +height=2 +tiletype1=5 +tiletype2=5 +tiletype3=1 + +[TEM90] +Name=SH8 +width=3 +height=3 +tiletype5=5 +tiletype8=1 + +[TEM91] +Name=SH9 +width=3 +height=3 +tiletype3=5 +tiletype6=1 +tiletype7=5 + +[TEM92] +Name=SH10 +width=2 +height=2 +tiletype0=5 +tiletype2=1 +tiletype3=5 + +[TEM93] +Name=D01 +width=2 +height=2 +tiletype1=2 + +[TEM94] +Name=D02 +width=2 +height=2 +tiletype1=2 + +[TEM95] +Name=D03 +width=1 +height=2 + +[TEM96] +Name=D04 +width=2 +height=2 +tiletype2=2 + +[TEM97] +Name=D05 +width=3 +height=4 +tiletype1=2 +tiletype3=2 +tiletype4=2 +tiletype6=2 +tiletype7=2 +tiletype10=2 + +[TEM98] +Name=D06 +width=2 +height=3 +tiletype0=2 +tiletype2=2 +tiletype3=2 +tiletype4=2 + +[TEM99] +Name=D07 +width=3 +height=2 +tiletype1=2 +tiletype4=2 + +[TEM100] +Name=D08 +width=3 +height=2 +tiletype1=2 +tiletype4=2 + +[TEM101] +Name=D09 +width=4 +height=3 +tiletype4=2 +tiletype5=2 +tiletype6=2 +tiletype7=2 + +[TEM102] +Name=D10 +width=4 +height=2 +tiletype1=3 +tiletype4=2 +tiletype5=2 +tiletype6=2 +tiletype7=2 + +[TEM103] +Name=D11 +width=2 +height=3 +tiletype2=2 +tiletype3=2 + +[TEM104] +Name=D12 +width=2 +height=2 +tiletype2=2 +tiletype3=2 + +[TEM105] +Name=D13 +width=4 +height=3 +tiletype0=2 +tiletype1=2 +tiletype5=2 +tiletype6=2 +tiletype10=7 +tiletype11=2 + +[TEM106] +Name=D14 +width=3 +height=3 +tiletype2=2 +tiletype4=7 +tiletype5=2 +tiletype6=2 +tiletype7=2 +tiletype8=2 + +[TEM107] +Name=D15 +width=3 +height=3 +tiletype0=2 +tiletype1=2 +tiletype2=2 +tiletype3=2 +tiletype4=2 +tiletype6=2 + +[TEM108] +Name=D16 +width=3 +height=3 +tiletype1=2 +tiletype4=2 +tiletype5=2 +tiletype6=2 +tiletype8=7 + +[TEM109] +Name=D17 +width=3 +height=2 +tiletype0=2 +tiletype1=2 +tiletype2=2 +tiletype4=2 + +[TEM110] +Name=D18 +width=3 +height=3 +tiletype1=2 +tiletype3=2 +tiletype4=2 +tiletype7=2 +tiletype8=7 + +[TEM111] +Name=D19 +width=3 +height=3 +tiletype1=2 +tiletype3=2 +tiletype4=2 +tiletype5=2 +tiletype7=2 + +[TEM112] +Name=D20 +width=3 +height=3 +tiletype0=2 +tiletype3=2 +tiletype4=2 +tiletype7=2 +tiletype8=2 + +[TEM113] +Name=D21 +width=3 +height=2 +tiletype0=3 +tiletype1=2 +tiletype2=2 +tiletype4=2 + +[TEM114] +Name=D22 +width=3 +height=3 +tiletype3=2 +tiletype4=2 +tiletype7=2 + +[TEM115] +Name=D23 +width=3 +height=3 +tiletype1=2 +tiletype4=2 +tiletype6=2 + +[TEM116] +Name=D24 +width=3 +height=3 +tiletype0=2 +tiletype4=2 +tiletype8=2 + +[TEM117] +Name=D25 +width=3 +height=3 +tiletype0=2 +tiletype4=2 +tiletype8=2 + +[TEM118] +Name=D26 +width=2 +height=2 + +[TEM119] +Name=D27 +width=2 +height=2 + +[TEM120] +Name=D28 +width=2 +height=2 +tiletype0=2 + +[TEM121] +Name=D29 +width=2 +height=2 +tiletype0=2 + +[TEM122] +Name=D30 +width=2 +height=2 +tiletype0=2 +tiletype2=2 + +[TEM123] +Name=D31 +width=2 +height=2 +tiletype3=2 + +[TEM124] +Name=D32 +width=2 +height=2 +tiletype2=2 + +[TEM125] +Name=D33 +width=2 +height=2 +tiletype2=2 +tiletype3=2 + +[TEM126] +Name=D34 +width=3 +height=3 +tiletype2=2 +tiletype4=2 +tiletype5=2 +tiletype6=2 +tiletype7=2 + +[TEM127] +Name=D35 +width=3 +height=3 +tiletype2=2 +tiletype4=2 +tiletype6=2 + +[TEM128] +Name=D36 +width=2 +height=2 + +[TEM129] +Name=D37 +width=2 +height=2 + +[TEM130] +Name=D38 +width=2 +height=2 +tiletype1=2 + +[TEM131] +Name=D39 +width=2 +height=2 +tiletype1=2 + +[TEM132] +Name=D40 +width=2 +height=2 +tiletype0=2 +tiletype1=2 + +[TEM133] +Name=D41 +width=2 +height=2 +tiletype0=7 +tiletype2=2 + +[TEM134] +Name=D42 +width=2 +height=2 +tiletype2=2 + +[TEM135] +Name=D43 +width=2 +height=2 +tiletype2=2 +tiletype3=2 + +[TEM136] +Name=RV01 +width=5 +height=4 +tiletype1=3 +tiletype5=3 +tiletype6=5 +tiletype7=5 +tiletype8=5 +tiletype9=3 +tiletype10=5 +tiletype11=5 +tiletype12=5 +tiletype13=3 +tiletype14=5 +tiletype16=7 + +[TEM137] +Name=RV02 +width=5 +height=3 +tiletype0=3 +tiletype1=3 +tiletype2=3 +tiletype3=3 +tiletype4=5 +tiletype5=5 +tiletype6=5 +tiletype7=5 +tiletype8=5 +tiletype9=5 +tiletype10=5 +tiletype11=3 + +[TEM138] +Name=RV03 +width=4 +height=4 +tiletype4=5 +tiletype5=5 +tiletype6=5 +tiletype9=5 +tiletype10=5 +tiletype11=5 +tiletype15=5 + +[TEM139] +Name=RV04 +width=4 +height=4 +tiletype2=7 +tiletype6=5 +tiletype7=5 +tiletype8=5 +tiletype9=5 +tiletype10=5 +tiletype11=3 +tiletype12=5 +tiletype13=3 +tiletype14=3 + +[TEM140] +Name=RV05 +width=3 +height=3 +tiletype1=5 +tiletype2=5 +tiletype4=5 +tiletype5=5 +tiletype6=3 +tiletype7=5 +tiletype8=5 + +[TEM141] +Name=RV06 +width=3 +height=2 +tiletype0=3 +tiletype1=5 +tiletype2=3 +tiletype3=3 +tiletype4=5 + +[TEM142] +Name=RV07 +width=3 +height=2 +tiletype0=3 +tiletype1=5 +tiletype2=5 +tiletype3=3 +tiletype4=3 +tiletype5=5 + +[TEM143] +Name=RV08 +width=2 +height=2 +tiletype0=3 +tiletype1=5 +tiletype2=5 +tiletype3=5 + +[TEM144] +Name=RV09 +width=2 +height=2 +tiletype2=5 +tiletype3=5 + +[TEM145] +Name=RV10 +width=2 +height=2 +tiletype0=5 +tiletype1=5 +tiletype3=5 + +[TEM146] +Name=RV11 +width=2 +height=2 +tiletype0=5 +tiletype1=5 +tiletype2=5 + +[TEM147] +Name=RV12 +width=3 +height=4 +tiletype1=5 +tiletype2=5 +tiletype3=3 +tiletype4=5 +tiletype5=5 +tiletype6=5 +tiletype7=5 +tiletype8=3 +tiletype10=5 +tiletype11=5 + +[TEM148] +Name=RV13 +width=4 +height=4 +tiletype4=5 +tiletype5=5 +tiletype6=5 +tiletype7=5 +tiletype8=5 +tiletype9=3 +tiletype10=5 +tiletype11=3 +tiletype13=3 +tiletype14=5 +tiletype15=3 + +[TEM149] +Name=RV14 +width=4 +height=3 +tiletype0=3 +tiletype1=3 +tiletype2=3 +tiletype3=3 +tiletype4=3 +tiletype5=3 +tiletype6=3 +tiletype7=5 +tiletype8=3 +tiletype9=3 +tiletype10=4 +tiletype11=3 + +[TEM150] +Name=RV15 +width=4 +height=3 +tiletype0=3 +tiletype1=3 +tiletype2=3 +tiletype4=5 +tiletype5=5 +tiletype6=3 +tiletype7=5 +tiletype9=3 +tiletype10=3 + +[TEM151] +Name=RV16 +width=6 +height=4 +tiletype2=3 +tiletype3=3 +tiletype4=3 +tiletype5=3 +tiletype7=3 +tiletype8=3 +tiletype9=5 +tiletype10=5 +tiletype11=5 +tiletype12=3 +tiletype13=3 +tiletype14=5 +tiletype15=3 +tiletype16=4 +tiletype17=3 +tiletype18=5 +tiletype19=5 +tiletype20=3 +tiletype21=4 + +[TEM152] +Name=RV17 +width=6 +height=5 +tiletype0=3 +tiletype1=3 +tiletype2=3 +tiletype3=3 +tiletype6=5 +tiletype7=3 +tiletype8=3 +tiletype9=3 +tiletype10=4 +tiletype12=3 +tiletype13=3 +tiletype14=5 +tiletype15=5 +tiletype16=5 +tiletype17=3 +tiletype19=3 +tiletype20=3 +tiletype21=3 +tiletype22=5 +tiletype23=5 +tiletype28=3 +tiletype29=5 + +[TEM153] +Name=RV18 +width=4 +height=4 +tiletype0=3 +tiletype1=5 +tiletype2=4 +tiletype3=3 +tiletype4=3 +tiletype5=3 +tiletype6=3 +tiletype8=3 +tiletype9=5 +tiletype10=4 +tiletype12=3 +tiletype13=5 +tiletype14=3 + +[TEM154] +Name=RV19 +width=4 +height=4 +tiletype1=3 +tiletype2=5 +tiletype5=3 +tiletype6=5 +tiletype7=4 +tiletype8=3 +tiletype9=3 +tiletype10=5 +tiletype11=3 +tiletype13=3 +tiletype14=5 +tiletype15=4 + +[TEM155] +Name=RV20 +width=6 +height=8 +tiletype3=3 +tiletype4=5 +tiletype8=3 +tiletype9=5 +tiletype10=3 +tiletype13=3 +tiletype14=3 +tiletype15=5 +tiletype16=3 +tiletype18=3 +tiletype19=3 +tiletype20=5 +tiletype21=3 +tiletype24=3 +tiletype25=3 +tiletype26=5 +tiletype27=3 +tiletype28=3 +tiletype30=3 +tiletype31=3 +tiletype32=5 +tiletype33=3 +tiletype37=5 +tiletype38=5 +tiletype39=3 +tiletype43=5 +tiletype44=3 +tiletype45=3 + +[TEM156] +Name=RV21 +width=5 +height=8 +tiletype0=3 +tiletype1=3 +tiletype6=5 +tiletype7=5 +tiletype8=3 +tiletype11=3 +tiletype12=5 +tiletype13=3 +tiletype16=3 +tiletype17=5 +tiletype18=3 +tiletype19=3 +tiletype21=3 +tiletype22=5 +tiletype23=5 +tiletype24=3 +tiletype27=3 +tiletype28=5 +tiletype29=3 +tiletype32=3 +tiletype33=5 +tiletype34=5 +tiletype39=5 + +[TEM157] +Name=RV22 +width=3 +height=3 +tiletype3=3 +tiletype4=3 +tiletype5=5 +tiletype6=3 +tiletype7=5 +tiletype8=3 + +[TEM158] +Name=RV23 +width=3 +height=3 +tiletype0=3 +tiletype1=3 +tiletype2=3 +tiletype3=5 +tiletype4=5 +tiletype5=3 +tiletype6=3 +tiletype7=5 +tiletype8=3 + +[TEM159] +Name=RV24 +width=3 +height=3 +tiletype0=3 +tiletype1=5 +tiletype2=3 +tiletype3=3 +tiletype4=5 +tiletype5=5 +tiletype7=4 + +[TEM160] +Name=RV25 +width=3 +height=3 +tiletype0=4 +tiletype1=5 +tiletype2=3 +tiletype3=5 +tiletype4=3 +tiletype5=3 +tiletype6=3 +tiletype7=3 + +[TEM161] +Name=FORD1 +width=3 +height=3 +tiletype1=5 +tiletype3=2 +tiletype4=2 +tiletype5=2 +tiletype7=5 +tiletype8=5 + +[TEM162] +Name=FORD2 +width=3 +height=3 +tiletype1=2 +tiletype2=5 +tiletype3=5 +tiletype4=2 +tiletype5=5 +tiletype7=2 + +[TEM163] +Name=FALLS1 +width=3 +height=3 +tiletype1=3 +tiletype2=5 +tiletype3=5 +tiletype4=5 +tiletype5=5 +tiletype7=3 +tiletype8=3 + +[TEM164] +Name=FALLS2 +width=3 +height=2 +tiletype0=3 +tiletype1=5 +tiletype2=5 +tiletype3=3 +tiletype4=5 +tiletype5=5 + +[TEM165] +Name=BRIDGE1 +width=4 +height=4 +tiletype3=2 +tiletype4=5 +tiletype5=7 +tiletype6=2 +tiletype7=7 +tiletype8=5 +tiletype9=2 +tiletype10=7 +tiletype11=5 +tiletype12=2 +tiletype15=5 + +[TEM166] +Name=BRIDGE1D +width=4 +height=4 +tiletype3=2 +tiletype4=5 +tiletype5=7 +tiletype6=7 +tiletype7=7 +tiletype8=5 +tiletype9=5 +tiletype10=5 +tiletype11=5 +tiletype12=2 +tiletype15=5 + +[TEM167] +Name=BRIDGE2 +width=5 +height=5 +tiletype0=2 +tiletype5=7 +tiletype6=2 +tiletype7=7 +tiletype8=5 +tiletype9=5 +tiletype10=5 +tiletype11=7 +tiletype12=2 +tiletype13=7 +tiletype15=5 +tiletype18=2 +tiletype24=2 + +[TEM168] +Name=BRIDGE2D +width=5 +height=5 +tiletype0=2 +tiletype5=7 +tiletype6=7 +tiletype7=5 +tiletype8=5 +tiletype9=5 +tiletype10=5 +tiletype11=5 +tiletype12=5 +tiletype13=5 +tiletype15=5 +tiletype18=2 +tiletype24=2 + +[TEM169] +Name=BRIDGE3 +width=6 +height=5 +tiletype4=2 +tiletype7=3 +tiletype8=7 +tiletype9=2 +tiletype10=7 +tiletype12=5 +tiletype13=5 +tiletype14=2 +tiletype15=7 +tiletype16=3 +tiletype17=3 +tiletype18=3 +tiletype19=2 +tiletype21=3 +tiletype22=5 +tiletype23=5 +tiletype24=2 + +[TEM170] +Name=BRIDGE3D +width=6 +height=5 +tiletype4=2 +tiletype7=3 +tiletype8=3 +tiletype9=7 +tiletype10=7 +tiletype12=5 +tiletype13=5 +tiletype14=5 +tiletype15=5 +tiletype16=3 +tiletype17=3 +tiletype18=3 +tiletype19=2 +tiletype21=5 +tiletype22=5 +tiletype23=5 +tiletype24=2 + +[TEM171] +Name=BRIDGE4 +width=6 +height=4 +tiletype1=2 +tiletype3=4 +tiletype4=3 +tiletype7=7 +tiletype8=2 +tiletype9=7 +tiletype10=5 +tiletype11=5 +tiletype12=3 +tiletype13=5 +tiletype14=7 +tiletype15=2 +tiletype16=7 +tiletype17=3 +tiletype18=5 +tiletype19=5 +tiletype20=3 +tiletype22=2 + +[TEM172] +Name=BRIDGE4D +width=6 +height=4 +tiletype1=2 +tiletype3=4 +tiletype4=3 +tiletype7=7 +tiletype8=7 +tiletype9=5 +tiletype10=5 +tiletype11=5 +tiletype12=3 +tiletype13=5 +tiletype14=5 +tiletype15=5 +tiletype16=7 +tiletype17=3 +tiletype18=5 +tiletype19=5 +tiletype20=3 +tiletype22=2 + +[TEM173] +Name=SH24 +width=3 +height=3 +tiletype0=3 +tiletype1=5 +tiletype2=3 +tiletype3=5 +tiletype4=5 +tiletype6=5 +tiletype7=1 +tiletype8=5 + +[TEM174] +Name=SH25 +width=3 +height=2 +tiletype0=5 +tiletype1=5 +tiletype2=5 +tiletype5=3 + +[TEM175] +Name=SH26 +width=3 +height=2 +tiletype0=5 +tiletype1=3 +tiletype2=5 +tiletype4=3 + +[TEM176] +Name=SH27 +width=4 +height=1 +tiletype0=5 +tiletype1=5 +tiletype2=5 +tiletype3=3 + +[TEM177] +Name=SH28 +width=3 +height=1 +tiletype0=5 +tiletype1=5 +tiletype2=5 + +[TEM178] +Name=SH29 +width=6 +height=2 +tiletype0=5 +tiletype1=5 +tiletype2=3 +tiletype3=5 +tiletype4=5 +tiletype5=5 + +[TEM179] +Name=SH30 +width=2 +height=2 +tiletype0=5 +tiletype1=5 +tiletype2=3 + +[TEM180] +Name=SH31 +width=3 +height=3 +tiletype0=5 +tiletype1=5 +tiletype2=5 +tiletype3=3 +tiletype4=5 +tiletype5=3 +tiletype7=5 +tiletype8=3 + +[TEM181] +Name=P16 +width=2 +height=2 + +[TEM182] +Name=P17 +width=4 +height=2 + +[TEM183] +Name=P18 +width=4 +height=3 + +[TEM184] +Name=P19 +width=6 +height=2 + +[TEM185] +Name=P20 +width=4 +height=3 + +[TEM186] +Name=SH34 +width=3 +height=3 +tiletype2=1 +tiletype5=1 +tiletype8=1 + +[TEM187] +Name=SH35 +width=3 +height=3 +tiletype0=1 +tiletype1=5 +tiletype3=1 +tiletype4=5 +tiletype6=1 + +[TEM188] +Name=SH36 +width=1 +height=1 + +[TEM189] +Name=SH37 +width=1 +height=1 + +[TEM190] +Name=SH38 +width=1 +height=1 + +[TEM191] +Name=SH39 +width=1 +height=1 + +[TEM192] +Name=SH40 +width=3 +height=3 +tiletype1=5 +tiletype2=5 +tiletype4=1 +tiletype5=5 +tiletype6=5 +tiletype7=1 +tiletype8=1 + +[TEM193] +Name=SH41 +width=3 +height=3 +tiletype0=1 +tiletype1=1 +tiletype2=5 +tiletype3=1 +tiletype4=5 +tiletype6=5 +tiletype7=3 + +[TEM194] +Name=SH42 +width=1 +height=2 +tiletype0=5 +tiletype1=5 + +[TEM195] +Name=SH43 +width=1 +height=3 +tiletype0=5 +tiletype2=5 + +[TEM196] +Name=SH44 +width=1 +height=3 +tiletype0=5 +tiletype2=5 + +[TEM197] +Name=SH45 +width=1 +height=2 +tiletype0=5 +tiletype1=5 + +[TEM198] +Name=SH46 +width=3 +height=3 +tiletype2=5 +tiletype4=5 +tiletype5=1 +tiletype6=5 +tiletype7=5 +tiletype8=1 + +[TEM199] +Name=SH47 +width=3 +height=3 +tiletype0=5 +tiletype1=3 +tiletype3=5 +tiletype6=1 +tiletype7=5 +tiletype8=5 + +[TEM200] +Name=SH48 +width=3 +height=3 +tiletype0=5 +tiletype3=5 +tiletype6=5 +tiletype7=5 +tiletype8=5 + +[TEM201] +Name=SH49 +width=3 +height=3 +tiletype1=1 +tiletype2=5 +tiletype3=5 +tiletype4=3 +tiletype5=3 +tiletype7=3 +tiletype8=3 + +[TEM202] +Name=SH50 +width=4 +height=3 +tiletype1=1 +tiletype2=5 +tiletype3=5 +tiletype4=5 +tiletype5=3 +tiletype6=3 +tiletype8=5 + +[TEM203] +Name=SH51 +width=4 +height=3 +tiletype0=5 +tiletype1=1 +tiletype5=5 +tiletype6=1 +tiletype8=3 +tiletype9=3 +tiletype10=5 +tiletype11=5 + +[TEM204] +Name=SH52 +width=4 +height=3 +tiletype0=5 +tiletype1=5 +tiletype2=5 +tiletype3=3 +tiletype6=5 +tiletype7=3 +tiletype10=5 +tiletype11=5 + +[TEM205] +Name=SH53 +width=4 +height=3 +tiletype3=5 +tiletype5=5 +tiletype6=1 +tiletype7=1 +tiletype8=5 +tiletype9=1 +tiletype10=5 +tiletype11=5 + +[TEM206] +Name=SH54 +width=3 +height=2 +tiletype1=4 +tiletype2=5 +tiletype3=5 +tiletype4=1 +tiletype5=5 + +[TEM207] +Name=SH55 +width=3 +height=2 +tiletype0=5 +tiletype1=3 +tiletype3=1 +tiletype4=5 +tiletype5=5 + +[TEM208] +Name=SH56 +width=3 +height=2 +tiletype1=1 +tiletype2=5 +tiletype3=5 +tiletype4=3 +tiletype5=3 + +[TEM209] +Name=SH57 +width=3 +height=2 +tiletype0=5 +tiletype3=5 +tiletype4=5 +tiletype5=5 + +[TEM210] +Name=SH58 +width=2 +height=3 +tiletype0=5 +tiletype2=5 +tiletype3=1 +tiletype5=5 + +[TEM211] +Name=SH59 +width=2 +height=3 +tiletype1=5 +tiletype2=5 +tiletype3=5 +tiletype4=5 +tiletype5=5 + +[TEM212] +Name=SH60 +width=2 +height=3 +tiletype0=1 +tiletype1=5 +tiletype2=5 +tiletype4=5 + +[TEM213] +Name=SH61 +width=2 +height=3 +tiletype0=5 +tiletype2=1 +tiletype3=5 +tiletype5=5 + +[TEM214] +Name=SH62 +width=6 +height=1 +tiletype0=5 +tiletype1=5 +tiletype2=5 +tiletype3=5 +tiletype4=5 +tiletype5=5 + +[TEM215] +Name=SH63 +width=4 +height=1 +tiletype0=5 +tiletype1=5 +tiletype2=5 +tiletype3=5 + +; special tile +[TEM65534] +Name=Bogus +width=1 +height=1 +tiletype0=10 \ No newline at end of file diff --git a/mods/cnc/tileSet.til b/mods/cnc/tileSet.til index 0506843ffc..a304c4a3fe 100644 --- a/mods/cnc/tileSet.til +++ b/mods/cnc/tileSet.til @@ -10,11 +10,11 @@ TSI ffff clear1 -; sandy shorelines -TS- -56 -0003 -sh{0:00} +; clear ground +TSI +1 +0000 +clear1 ; plain water TS- @@ -22,17 +22,136 @@ TS- 0001 w{0} -; cliffs +; Coastline +TS- +5 +0003 +sh{0} + +TS- +1 +0008 +sh11 + +TS- +1 +0009 +sh12 + +TS- +1 +000A +sh13 + +TS- +1 +000B +sh14 + +TS- +1 +000C +sh15 + +; Cliffs TS- 38 -0087 +000D s{0:00} -; rocky coast +; More Coast TS- -38 -003b -wc{0:00} +1 +0033 +sh32 + +TS- +1 +0034 +sh33 + +;;; TODO: Add desert only tiles + +; Bones/Wall/Mud/UFO/Rock +TS- +4 +0043 +p{0:00} + +;;; TODO: More desert only tiles + +; Mud +TS- +4 +0049 +p07 + +TS- +4 +004A +p08 + +; Ford WU +TS- +1 +004B +sh16 + +; Water +TS- +1 +004C +sh17 + +; Water +TS- +1 +004D +sh18 + +; Destroyed house +TS- +1 +004F +p13 + +; Walls +TS- +1 +0050 +p14 + +; Rocks +TS- +3 +0052 +b{0} + +; More coast +TS- +1 +0058 +sh6 + +TS- +1 +0059 +sh7 + +TS- +1 +005A +sh8 + +TS- +1 +005B +sh9 + +TS- +1 +005C +sh10 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ROADS @@ -40,311 +159,67 @@ wc{0:00} ; roads TS- 43 -00ad +005d d{0:00} -; road -TS- -1 -00e3 -d44 - -; road -TS- -1 -00e4 -d45 - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; RIVERS -; river emerging from cliff -TS- -4 -00e7 -rc{0:00} - ; rivers TS- 13 -0070 +0088 rv{0:00} -; river +; River Crossing TS- -1 -00e5 -rv14 +2 +00A1 +ford{0} -; river +; Waterfalls TS- -1 -00e6 -rv15 +2 +00A3 +falls{0} ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; BRIDGES -; long bridge (north end) -TS- -1 -00eb -br1a - -; long bridge (north end, damaged) -TS- -1 -00ec -br1b - -; long bridge (north end, broken) -TS- -1 -00ed -br1c - -; long bridge (south end) -TS- -1 -00ee -br2a - -; long bridge (south end, damaged) -TS- -1 -00ef -br2b - -; long bridge (south end, broken) -TS- -1 -00f0 -br2c - -; long bridge (middle) -TS- -1 -00f1 -br3a - -; long bridge (middle, damaged) -TS- -1 -00f2 -br3b - -; long bridge (middle, broken) -TS- -1 -00f3 -br3c - -; long bridge (middle, broken, south end missing) -TS- -1 -00f4 -br3d - -; long bridge (middle, broken, north end missing) -TS- -1 -00f5 -br3e - -; long bridge (water / totally broken) -TS- -1 -00f6 -br3f - -; long bridge (north surround) -TS- -1 -017c -br1x - -; long bridge (south surround) -TS- -1 -017d -br2x - ; short bridge "/" TS- 1 -0083 +00A5 bridge1 ; short bridge "/" (destroyed) TS- 1 -0084 +00A6 bridge1d -; short bridge "/" (damaged) -TS- -1 -017a -bridge1h - -; short bridge "/" (surround) -TS- -1 -017e -bridge1x - ; short bridge "\" TS- 1 -0085 +00A7 bridge2 ; short bridge "\" (destroyed) TS- 1 -0086 +00A8 bridge2d -; short bridge "\" (damaged) +; More coast TS- 1 -017b -bridge2h +00BA +sh34 -; short bridge "\" (surround) TS- 1 -017f -bridge2x - -; fyords -TS- -6 -00f7 -f{0:00} - -; short fyord -TS- -2 -0081 -ford{0} - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; WATERFALLS - -; waterfall (E-W) -TS- -1 -007d -falls1 - -; waterfall (E-W, into sea) -TS- -1 -007e -falls1a - -; waterfall (N-S) -TS- -1 -007f -falls2 - -; waterfall (N-S, into sea) -TS- -1 -0080 -falls2a - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; DEBRIS / ROCKS - -; random rock chunks (impassable) -TS- -3 -0061 -b{0} - -; random rock chunks (passable) -TS- -11 -00d8 -rf{0:00} - -; random debris -TS- -4 -0067 -p{0:00} - -; random debris -TS- -1 -006b -p07 - -; random debris -TS- -1 -006c -p08 - -; random debris -TS- -1 -006d -p13 - -; random debris -TS- -1 -006e -p14 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; INTERIOR - -; walls ---I -49 -0149 -wall{0:0000} - -; black floor ---I -7 -010c -flor{0:0000} - -; walls with stuff, random tiles ---I -16 -0180 -xtra{0:0000} - -; black/yellow stripe ---I -11 -013e -strp{0:0000} - -; red stripe ---I -15 -00fd -arro{0:0000} - -; white floor ---I -5 -0113 -gflr{0:0000} - -; white floor with black/yellow stripe ---I -11 -0118 -gstr{0:0000} +00BB +sh35 ; bogus TS- diff --git a/scm01ea.ini b/scm01ea.ini new file mode 100644 index 0000000000..06fa23f723 --- /dev/null +++ b/scm01ea.ini @@ -0,0 +1,565 @@ +; Scenario 20 control for house GoodGuy. + +[Basic] +BinaryPart=scm01ea.bin +CarryOverCap=-1 +CarryOverMoney=100 +Intro=x +BuildLevel=1 +Theme=No theme +Percent=0 +Player=Multi1 +Action=LAND +Lose=GAMEOVER +Win=x +Brief=GDI1 +Name=GREEN ACRES + +[MAP] +Height=49 +Width=58 +Y=11 +X=3 +Theater=TEMPERATE + +[Multi1] +FlagHome=1031 +FlagLocation=5127 +MaxBuilding=150 +Allies=Multi1,Multi2,Multi3 +MaxUnit=150 +Edge=North +Credits=0 + +[Multi2] +FlagHome=952 +FlagLocation=5048 +MaxBuilding=150 +Allies=Multi1,Multi2,Multi3,Multi4 +MaxUnit=150 +Edge=North +Credits=0 +a +[Multi3] +FlagHome=3510 +FlagLocation=7606 +MaxBuilding=150 +Allies=Multi1,Multi2,Multi3,Multi4 +MaxUnit=150 +Edge=North +Credits=0 + +[Multi4] +FlagHome=3466 +FlagLocation=7562 +MaxBuilding=150 +Allies=Multi2,Multi3,Multi4 +MaxUnit=150 +Edge=North +Credits=0 + +[Base] +Count=0 + +[TERRAIN] +1004=TC04,None +1002=TC03,None +2274=TC03,None +2145=TC04,None +2741=TC04,None +2679=TC02,None +2521=T02,None +2588=T01,None +1677=SPLIT2,None +2900=SPLIT3,None +3498=SPLIT3,None +2269=SPLIT3,None +1462=SPLIT2,None +738=SPLIT3,None +1935=TC01,None +1997=T17,None +1732=TC05,None +2058=TC04,None +1170=TC04,None +2000=TC02,None +1874=T07,None +2397=T06,None +1828=T07,None +1443=T06,None +1570=T07,None +1770=T07,None +2847=T07,None +2977=T16,None +2910=T17,None +2911=TC02,None +1641=TC04,None +2665=TC04,None +2640=TC04,None +755=T02,None +780=T02,None +779=T03,None +2764=T16,None +3603=TC02,None +1124=T16,None +806=T17,None +870=TC01,None +814=TC02,None +3349=T07,None +3286=TC04,None +992=TC04,None +1247=TC02,None +981=TC01,None +1169=T01,None +2095=TC04,None +2031=TC01,None +2701=SPLIT2,None +1382=SPLIT2,None +2798=SPLIT3,None +3452=T01,None +1658=TC05,None +1720=TC04,None +1718=TC03,None +1716=TC02,None +1779=TC01,None +2289=TC02,None +2221=TC04,None +2351=TC03,None + +[OVERLAY] +3819=TI1 +3756=TI6 +3755=TI10 +3754=TI11 +3692=TI4 +3691=TI1 +3690=TI8 +3689=TI6 +3628=TI11 +3627=TI6 +3626=TI8 +3625=TI1 +3624=TI1 +3564=TI7 +3563=TI7 +3561=TI8 +3560=TI6 +3559=TI2 +3558=TI6 +3500=TI12 +3499=TI7 +3498=TI10 +3497=TI3 +3495=TI2 +3494=TI6 +3436=TI12 +3435=TI6 +3434=TI11 +3433=TI4 +3432=TI5 +3431=TI12 +3183=TI12 +3159=TI10 +3119=TI8 +3118=TI5 +3117=TI2 +3116=TI11 +3115=TI5 +3114=TI9 +3095=TI10 +3093=TI3 +3092=TI10 +3057=TI5 +3056=TI4 +3055=TI7 +3054=TI1 +3053=TI7 +3052=TI4 +3051=TI2 +3050=TI12 +3049=TI6 +3031=TI12 +3030=TI2 +3029=TI10 +3028=TI5 +3027=TI7 +2992=TI9 +2991=TI9 +2990=TI3 +2989=TI9 +2988=TI12 +2987=TI10 +2986=TI11 +2985=TI12 +2984=TI3 +2966=TI3 +2965=TI3 +2963=TI9 +2962=TI11 +2930=TI8 +2929=TI6 +2928=TI5 +2927=TI7 +2926=TI10 +2925=TI5 +2923=TI9 +2922=TI10 +2921=TI3 +2920=TI2 +2919=TI12 +2901=TI4 +2900=TI5 +2899=TI1 +2898=TI9 +2897=TI3 +2896=TI1 +2894=TI9 +2893=TI6 +2892=TI5 +2891=TI5 +2890=TI8 +2866=TI2 +2865=TI5 +2864=TI5 +2861=TI1 +2855=TI2 +2854=TI10 +2836=TI4 +2835=TI4 +2834=TI12 +2833=TI1 +2832=TI9 +2831=TI9 +2830=TI3 +2829=TI3 +2827=TI2 +2826=TI4 +2825=TI3 +2803=TI5 +2802=TI7 +2801=TI12 +2796=TI1 +2769=TI11 +2767=TI5 +2766=TI6 +2764=TI2 +2763=TI9 +2762=TI1 +2761=TI5 +2737=TI3 +2736=TI10 +2733=TI12 +2732=TI4 +2703=TI2 +2702=TI12 +2701=TI12 +2700=TI12 +2699=TI12 +2698=TI7 +2674=TI8 +2673=TI7 +2672=TI2 +2671=TI6 +2670=TI4 +2669=TI12 +2639=TI3 +2609=TI6 +2397=TI4 +2396=TI7 +2395=TI5 +2394=TI5 +2393=TI4 +2336=TI12 +2335=TI5 +2334=TI2 +2332=TI2 +2331=TI5 +2330=TI1 +2329=TI3 +2328=TI5 +2327=TI7 +2272=TI3 +2270=TI10 +2269=TI10 +2268=TI1 +2267=TI8 +2266=TI8 +2265=TI7 +2264=TI11 +2263=TI2 +2208=TI8 +2207=TI8 +2206=TI1 +2205=TI2 +2204=TI3 +2203=TI5 +2202=TI12 +2201=TI3 +2200=TI12 +2144=TI3 +2143=TI10 +2142=TI12 +2141=TI6 +2139=TI11 +2080=TI11 +2079=TI11 +2078=TI4 +2015=TI6 +1998=TI3 +1997=TI6 +1996=TI3 +1995=TI6 +1994=TI8 +1937=TI3 +1936=TI8 +1934=TI8 +1933=TI9 +1932=TI11 +1931=TI9 +1930=TI1 +1929=TI5 +1873=TI1 +1872=TI2 +1871=TI1 +1870=TI9 +1868=TI8 +1867=TI5 +1866=TI11 +1865=TI10 +1810=TI12 +1809=TI8 +1808=TI7 +1806=TI8 +1805=TI5 +1804=TI12 +1803=TI4 +1768=TI5 +1767=TI12 +1764=TI10 +1763=TI7 +1747=TI3 +1745=TI3 +1744=TI3 +1743=TI6 +1740=TI11 +1739=TI1 +1715=TI8 +1704=TI7 +1702=TI12 +1701=TI4 +1699=TI5 +1698=TI5 +1681=TI10 +1680=TI11 +1679=TI4 +1678=TI9 +1676=TI5 +1675=TI10 +1651=TI6 +1650=TI11 +1640=TI5 +1639=TI2 +1637=TI1 +1636=TI4 +1633=TI11 +1619=TI11 +1618=TI2 +1617=TI12 +1616=TI5 +1615=TI4 +1614=TI11 +1613=TI7 +1612=TI7 +1611=TI1 +1610=TI2 +1595=TI10 +1594=TI3 +1593=TI11 +1592=TI2 +1591=TI8 +1590=TI12 +1589=TI5 +1588=TI4 +1587=TI11 +1577=TI4 +1576=TI1 +1575=TI12 +1573=TI2 +1572=TI4 +1571=TI7 +1570=TI7 +1569=TI5 +1553=TI5 +1552=TI9 +1551=TI3 +1550=TI9 +1549=TI5 +1548=TI2 +1547=TI6 +1530=TI10 +1529=TI9 +1528=TI7 +1527=TI8 +1525=TI3 +1524=TI5 +1512=TI9 +1511=TI1 +1510=TI6 +1509=TI4 +1506=TI12 +1505=TI9 +1489=TI9 +1468=TI12 +1466=TI2 +1465=TI9 +1464=TI10 +1463=TI10 +1447=TI1 +1445=TI9 +1444=TI2 +1443=TI8 +1442=TI5 +1441=TI2 +1404=TI11 +1403=TI12 +1384=TI7 +1383=TI12 +1382=TI8 +1381=TI5 +1380=TI9 +1379=TI5 +1377=TI4 +1320=TI8 +1318=TI4 +1317=TI8 +1316=TI12 +877=TI1 +869=TI5 +868=TI8 +867=TI4 +866=TI11 +865=TI10 +817=TI4 +816=TI2 +813=TI5 +812=TI4 +811=TI11 +810=TI9 +809=TI10 +808=TI9 +807=TI4 +805=TI10 +804=TI1 +803=TI7 +801=TI9 +800=TI7 +799=TI5 +754=TI9 +751=TI11 +750=TI8 +749=TI8 +748=TI7 +747=TI1 +746=TI10 +745=TI3 +744=TI8 +743=TI3 +742=TI5 +741=TI3 +740=TI5 +738=TI6 +737=TI10 +736=TI8 +735=TI7 + +[SMUDGE] + +[INFANTRY] + +[UNITS] + +[STRUCTURES] + +[Waypoints] +31=-1 +30=-1 +29=-1 +28=-1 +27=2272 +26=2272 +25=-1 +24=-1 +23=-1 +22=-1 +21=-1 +20=-1 +19=-1 +18=-1 +17=-1 +16=-1 +15=-1 +14=-1 +13=-1 +12=-1 +11=-1 +10=-1 +9=-1 +8=-1 +7=3464 +6=3573 +5=2298 +4=3745 +3=2216 +2=953 +1=786 +0=1221 + + +[Neutral] +FlagHome=0 +FlagLocation=0 +Allies=Neutral +MaxBuilding=150 +MaxUnit=150 +Edge=North +Credits=0 + +[GoodGuy] +FlagHome=0 +FlagLocation=0 +Allies=GoodGuy,Neutral +MaxBuilding=150 +MaxUnit=150 +Edge=North +Credits=0 + +[BadGuy] +FlagHome=0 +FlagLocation=0 +Allies=BadGuy +MaxBuilding=150 +MaxUnit=150 +Edge=North +Credits=0 + +[Special] +FlagHome=0 +FlagLocation=0 +Allies=Special +MaxBuilding=150 +MaxUnit=150 +Edge=North +Credits=0 + +[Multi5] +Allies=Multi5 +MaxBuilding=150 +MaxUnit=150 +Edge=North +Credits=0 + +[Multi6] +Allies=Multi6 +MaxBuilding=150 +MaxUnit=150 +Edge=North +Credits=0 From c97871484f0763543a1b23c0dfa52718c4237925 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Tue, 2 Mar 2010 22:52:12 +1300 Subject: [PATCH 23/38] WINTER works; DESERT causes crash --- OpenRA.FileFormats/Map.cs | 1 - scm01ea.ini => mods/cnc/scm01ea.ini | 0 mods/cnc/scm02ea.ini | 597 ++++++++++++++++++++++++++++ mods/cnc/scm70ea.ini | 531 +++++++++++++++++++++++++ mods/cnc/system.yaml | 22 +- mods/cnc/tileSet.til | 455 ++++++++++++++++++--- 6 files changed, 1552 insertions(+), 54 deletions(-) rename scm01ea.ini => mods/cnc/scm01ea.ini (100%) create mode 100644 mods/cnc/scm02ea.ini create mode 100644 mods/cnc/scm70ea.ini diff --git a/OpenRA.FileFormats/Map.cs b/OpenRA.FileFormats/Map.cs index 45d223cee3..627861763a 100644 --- a/OpenRA.FileFormats/Map.cs +++ b/OpenRA.FileFormats/Map.cs @@ -92,7 +92,6 @@ namespace OpenRA.FileFormats { MapTiles[j, i].tile = (byte)ms.ReadByte(); MapTiles[j, i].image = (byte)ms.ReadByte(); - Log.Write("Set tile to {0} {1}",MapTiles[j, i].tile,MapTiles[j, i].image); } } diff --git a/scm01ea.ini b/mods/cnc/scm01ea.ini similarity index 100% rename from scm01ea.ini rename to mods/cnc/scm01ea.ini diff --git a/mods/cnc/scm02ea.ini b/mods/cnc/scm02ea.ini new file mode 100644 index 0000000000..912b9acde6 --- /dev/null +++ b/mods/cnc/scm02ea.ini @@ -0,0 +1,597 @@ +; Scenario 2 control for house Multi1. + +[Basic] +BinaryPart=scm02ea.bin +CarryOverCap=-1 +CarryOverMoney=50 +Intro=x +BuildLevel=2 +Theme=No theme +Percent=0 +Player=Multi3 +Action=LAND +Lose=GAMEOVER +Win=x +Brief=GDI1 +Name=Sand Trap + +[MAP] +Height=58 +Width=57 +Y=3 +X=3 +Theater=DESERT + +[Waypoints] +31=-1 +30=-1 +29=3249 +28=901 +27=2337 +26=2337 +25=-1 +24=-1 +23=-1 +22=-1 +21=-1 +20=-1 +19=-1 +18=-1 +17=-1 +16=-1 +15=-1 +14=-1 +13=-1 +12=-1 +11=-1 +10=-1 +9=-1 +8=-1 +7=340 +6=376 +5=2292 +4=3334 +3=3737 +2=3760 +1=1057 +0=1030 + +[Neutral] +Allies=Neutral +MaxBuilding=150 +MaxUnit=150 +Edge=North +Credits=0 + +[Multi1] +Allies=Multi1,Multi2,Multi4 +MaxBuilding=150 +MaxUnit=150 +Edge=North +Credits=0 + +[Multi2] +Allies=Multi1,Multi2,Multi3,Multi4 +MaxBuilding=150 +MaxUnit=150 +Edge=North +Credits=0 + +[Multi3] +Allies=Multi2,Multi3,Multi4 +MaxBuilding=150 +MaxUnit=150 +Edge=North +Credits=0 + +[Multi4] +Allies=Multi1,Multi2,Multi3,Multi4 +MaxBuilding=150 +MaxUnit=150 +Edge=North +Credits=0 + +[STRUCTURES] + +[OVERLAY] +3862=TI1 +3860=TI1 +3859=TI1 +3858=TI1 +3857=TI1 +3856=TI1 +3855=TI1 +3854=TI1 +3850=TI1 +3849=TI1 +3848=TI1 +3847=TI1 +3846=TI1 +3845=TI1 +3844=TI1 +3843=TI1 +3819=TI10 +3818=TI11 +3799=TI11 +3798=TI6 +3797=TI7 +3796=TI5 +3795=TI6 +3794=TI12 +3793=TI3 +3791=TI5 +3785=TI6 +3784=TI2 +3783=TI3 +3782=TI11 +3781=TI11 +3780=TI3 +3756=TI6 +3755=TI7 +3754=TI5 +3735=TI3 +3734=TI6 +3733=TI2 +3732=TI10 +3731=TI12 +3730=TI7 +3729=TI5 +3728=TI6 +3726=TI2 +3722=TI4 +3721=TI8 +3720=TI9 +3719=TI1 +3718=TI12 +3694=TI9 +3693=TI5 +3692=TI2 +3691=TI4 +3690=TI8 +3670=TI12 +3669=TI6 +3668=TI8 +3667=TI10 +3666=TI3 +3665=TI8 +3664=TI8 +3658=TI9 +3631=TI9 +3630=TI12 +3629=TI6 +3628=TI1 +3627=TI10 +3626=TI12 +3604=TI9 +3602=TI4 +3567=TI8 +3566=TI4 +3564=TI1 +3563=TI8 +3562=TI2 +3541=TI5 +3540=TI10 +3502=TI5 +3501=TI7 +3499=TI6 +3437=TI4 +3436=TI5 +3435=TI5 +3434=TI6 +3372=TI2 +3371=TI3 +3370=TI1 +3258=TI5 +3194=TI5 +3193=TI9 +3130=TI9 +3129=TI7 +3128=TI12 +3066=TI8 +3065=TI2 +3013=TI3 +3001=TI3 +2999=TI8 +2954=TI12 +2953=TI7 +2950=TI12 +2949=TI8 +2948=TI8 +2939=TI9 +2938=TI2 +2936=TI5 +2935=TI9 +2925=TI10 +2890=TI8 +2889=TI4 +2888=TI4 +2887=TI5 +2886=TI6 +2885=TI5 +2884=TI10 +2874=TI5 +2873=TI6 +2872=TI8 +2826=TI7 +2824=TI7 +2822=TI11 +2821=TI12 +2820=TI2 +2811=TI7 +2809=TI4 +2771=TI4 +2768=TI4 +2759=TI12 +2758=TI11 +2757=TI5 +2756=TI5 +2746=TI7 +2745=TI10 +2709=TI10 +2708=TI1 +2707=TI12 +2705=TI5 +2703=TI1 +2702=TI1 +2695=TI5 +2694=TI1 +2693=TI9 +2692=TI5 +2681=TI9 +2648=TI12 +2647=TI10 +2646=TI4 +2645=TI9 +2644=TI6 +2642=TI10 +2641=TI11 +2640=TI1 +2639=TI7 +2638=TI2 +2631=TI12 +2630=TI11 +2617=TI9 +2583=TI9 +2582=TI12 +2581=TI10 +2580=TI11 +2578=TI7 +2577=TI2 +2576=TI11 +2575=TI3 +2553=TI7 +2518=TI4 +2517=TI12 +2516=TI10 +2515=TI12 +2514=TI5 +2513=TI2 +2512=TI6 +2511=TI4 +2453=TI3 +2452=TI11 +2451=TI5 +2449=TI1 +2448=TI2 +2388=TI5 +2386=TI10 +2385=TI4 +2351=TI12 +2350=TI8 +2349=TI5 +2288=TI8 +2286=TI9 +2285=TI3 +2284=TI5 +2283=TI11 +2282=TI5 +2252=TI11 +2251=TI3 +2223=TI2 +2222=TI4 +2221=TI1 +2220=TI3 +2219=TI6 +2218=TI11 +2187=TI5 +2186=TI11 +2185=TI5 +2158=TI11 +2157=TI10 +2156=TI6 +2155=TI11 +2154=TI8 +2153=TI7 +2152=TI3 +2145=TI11 +2123=TI6 +2121=TI9 +2093=TI1 +2092=TI3 +2091=TI4 +2090=TI9 +2089=TI6 +2088=TI6 +2061=TI3 +2059=TI10 +2058=TI12 +2054=TI10 +2053=TI12 +2027=TI8 +2026=TI4 +2025=TI11 +1996=TI8 +1995=TI2 +1994=TI3 +1990=TI7 +1989=TI3 +1963=TI4 +1931=TI11 +1930=TI10 +1929=TI10 +1928=TI10 +1927=TI2 +1926=TI4 +1925=TI1 +1924=TI6 +1866=TI7 +1865=TI4 +1864=TI9 +1863=TI1 +1862=TI4 +1861=TI10 +1860=TI3 +1801=TI4 +1800=TI8 +1799=TI1 +1798=TI2 +1797=TI3 +1796=TI2 +1795=TI8 +1737=TI1 +1735=TI4 +1734=TI12 +1733=TI3 +1732=TI4 +1731=TI9 +1690=TI12 +1689=TI8 +1670=TI8 +1669=TI4 +1668=TI4 +1624=TI10 +1559=TI6 +1558=TI12 +1498=TI7 +1497=TI11 +1496=TI11 +1495=TI12 +1494=TI6 +1493=TI10 +1492=TI5 +1491=TI1 +1465=TI11 +1433=TI11 +1432=TI6 +1431=TI11 +1430=TI3 +1429=TI9 +1428=TI9 +1427=TI9 +1401=TI12 +1369=TI9 +1368=TI2 +1367=TI6 +1366=TI9 +1365=TI2 +1364=TI1 +1363=TI12 +1337=TI8 +1336=TI2 +1326=TI3 +1324=TI1 +1322=TI12 +1321=TI12 +1320=TI6 +1303=TI1 +1302=TI11 +1301=TI2 +1300=TI1 +1273=TI5 +1263=TI9 +1260=TI11 +1259=TI9 +1258=TI7 +1256=TI10 +1240=TI2 +1239=TI9 +1238=TI5 +1237=TI3 +1236=TI8 +1199=TI5 +1198=TI4 +1195=TI5 +1194=TI4 +1193=TI1 +1176=TI11 +1175=TI8 +1173=TI2 +1172=TI6 +1133=TI12 +1132=TI8 +1131=TI7 +1130=TI6 +1129=TI4 +1128=TI9 +1127=TI1 +1126=TI11 +1109=TI5 +1108=TI6 +1107=TI3 +1068=TI12 +1067=TI11 +1066=TI5 +1065=TI9 +1064=TI10 +1063=TI10 +1062=TI6 +1044=TI6 +1043=TI11 +1004=TI9 +1003=TI2 +1002=TI3 +1001=TI9 +1000=TI11 +999=TI12 +998=TI3 +980=TI10 +978=TI7 +939=TI10 +938=TI12 +937=TI2 +936=TI3 +935=TI7 +934=TI10 +873=TI1 +872=TI4 +528=TI8 +527=TI5 +526=TI2 +523=TI6 +522=TI11 +521=TI2 +520=TI12 +463=TI5 +462=TI8 +461=TI8 +460=TI8 +459=TI7 +458=TI12 +457=TI2 +456=TI3 +455=TI3 +454=TI3 +398=TI10 +397=TI11 +396=TI8 +395=TI10 +394=TI11 +393=TI10 +392=TI9 +391=TI10 +390=TI4 +389=TI11 +371=TI6 +370=TI5 +369=TI4 +368=TI5 +367=TI10 +366=TI3 +363=TI7 +362=TI3 +361=TI2 +360=TI11 +333=TI10 +332=TI11 +330=TI1 +329=TI11 +327=TI7 +326=TI11 +325=TI4 +307=TI8 +306=TI8 +305=TI3 +304=TI4 +303=TI7 +302=TI6 +301=TI12 +300=TI8 +299=TI3 +298=TI9 +296=TI3 +295=TI12 +268=TI9 +267=TI2 +266=TI8 +265=TI10 +264=TI7 +263=TI9 +262=TI10 +261=TI4 +260=TI8 +242=TI11 +239=TI5 +238=TI6 +236=TI2 +235=TI4 +231=TI3 + +[Base] +Count=0 + +[TERRAIN] +3541=SPLIT3,None +1235=SPLIT3,None +264=SPLIT3,None +1987=T18,None +2198=T18,None +2394=T18,None +2372=T08,None +2439=T08,None +2373=T08,None +925=ROCK1,None +323=ROCK1,None +364=ROCK6,None +2741=T08,None +1142=T08,None +3573=T08,None +2085=T08,None +2151=T08,None +2086=T08,None +2030=T08,None +771=ROCK1,None +1958=ROCK1,None +2267=T08,None +2759=SPLIT3,None +2515=SPLIT3,None +3436=SPLIT3,None +876=SPLIT3,None +2153=SPLIT3,None +233=SPLIT3,None + +[SMUDGE] + +[GoodGuy] +Allies=GoodGuy,Neutral +MaxBuilding=150 +MaxUnit=150 +Edge=North +Credits=0 + +[BadGuy] +Allies=BadGuy +MaxBuilding=150 +MaxUnit=150 +Edge=North +Credits=0 + +[Special] +Allies=Special +MaxBuilding=150 +MaxUnit=150 +Edge=North +Credits=0 + +[Multi5] +Allies=Multi5 +MaxBuilding=150 +MaxUnit=150 +Edge=North +Credits=0 + +[Multi6] +Allies=Multi6 +MaxBuilding=150 +MaxUnit=150 +Edge=North +Credits=0 diff --git a/mods/cnc/scm70ea.ini b/mods/cnc/scm70ea.ini new file mode 100644 index 0000000000..6e686d2c5d --- /dev/null +++ b/mods/cnc/scm70ea.ini @@ -0,0 +1,531 @@ +; Scenario 70 control for house Multi1. + +[Basic] +BinaryPart=scm70ea.bin +CarryOverCap=-1 +Percent=0 +CarryOverMoney=100 +BuildLevel=70 +Theme=No theme +Player=Multi3 +Action=LANDING +Lose=GAMEOVER +Win=CONSYARD +Brief=x +Intro=x +Name=Winter Waterland + +[MAP] +Height=62 +Width=62 +Y=1 +X=1 +Theater=WINTER + +[Waypoints] +27=2080 +26=2080 +25=-1 +24=-1 +23=-1 +22=-1 +21=-1 +20=-1 +19=-1 +18=-1 +17=-1 +16=-1 +15=-1 +14=-1 +13=-1 +12=-1 +11=-1 +10=-1 +9=-1 +8=-1 +7=-1 +6=794 +5=1542 +4=312 +3=3831 +2=200 +1=1565 +0=3463 + +[GoodGuy] +Allies=GoodGuy,Neutral +MaxBuilding=150 +MaxUnit=150 +Edge=North +Credits=0 + +[BadGuy] +Allies=BadGuy +MaxBuilding=150 +MaxUnit=150 +Edge=North +Credits=0 + +[Neutral] +Allies=Neutral +MaxBuilding=150 +MaxUnit=150 +Edge=North +Credits=0 + +[Special] +Allies=Special +MaxBuilding=150 +MaxUnit=150 +Edge=North +Credits=0 + +[Multi1] +Allies=Multi1,Multi2,Multi3,Multi4 +MaxBuilding=150 +MaxUnit=150 +Edge=North +Credits=0 + +[Multi2] +Allies=Multi1,Multi2,Multi3,Multi4 +MaxBuilding=150 +MaxUnit=150 +Edge=North +Credits=0 + +[Multi3] +Allies=Multi1,Multi2,Multi3,Multi4 +MaxBuilding=150 +MaxUnit=150 +Edge=North +Credits=0 + +[Multi4] +Allies=Multi1,Multi2,Multi3,Multi4 +MaxBuilding=150 +MaxUnit=150 +Edge=North +Credits=0 + +[Multi5] +Allies=Multi5 +MaxBuilding=150 +MaxUnit=150 +Edge=North +Credits=0 + +[Multi6] +Allies=Multi6 +MaxBuilding=150 +MaxUnit=150 +Edge=North +Credits=0 + +[TERRAIN] +2101=T01,None +1909=T02,None +1848=T01,None +519=TC04,None +402=T16,None +89=T16,None +154=T17,None +413=T15,None +804=T15,None +164=TC01,None +759=T14,None +573=T14,None +488=TC02,None +299=T17,None +109=T17,None +1003=T17,None +993=T17,None +687=T16,None +752=T08,None +486=T08,None +1012=T08,None +1150=T08,None +597=T08,None +1395=T08,None +1326=T10,None +1390=T07,None +1444=T07,None +1575=T07,None +608=T07,None +790=T07,None +915=T07,None +1748=T07,None +1302=T07,None +1241=T05,None +1499=T06,None +2013=T10,None +1753=T10,None +1635=T16,None +1764=T16,None +2023=T15,None +1489=T13,None +921=TC04,None +2478=TC04,None +2801=T01,None +2988=T01,None +1519=T01,None +1212=T01,None +1277=T01,None +1717=T02,None +1902=T03,None +1725=T03,None +2040=T03,None +2301=T03,None +2738=T03,None +2806=T03,None +2620=TC01,None +3252=TC01,None +3513=TC04,None +2459=T01,None +2390=T03,None +2334=T05,None +2596=T06,None +3106=T06,None +3440=T06,None +3569=T06,None +3495=T06,None +3553=T06,None +3945=T10,None +3901=T12,None +3369=T12,None +3879=T12,None +964=T01,None +1226=T02,None +1346=T10,None +1475=T08,None +1422=T08,None +1737=T11,None +1735=T07,None +1864=T07,None +2307=T06,None +2826=T06,None +3085=T06,None +3145=T01,None +3271=T03,None +3457=T10,None +3586=T08,None +3406=T08,None +3409=T06,None +3846=TC04,None +3923=T16,None +3933=T16,None + +[OVERLAY] +4030=TI1 +4029=TI1 +4028=TI1 +4027=TI1 +3996=TI1 +3986=TI1 +3985=TI1 +3984=TI1 +3983=TI1 +3966=TI8 +3964=TI5 +3933=TI9 +3932=TI8 +3923=TI1 +3922=TI1 +3921=TI3 +3920=TI9 +3919=TI8 +3902=TI12 +3901=TI12 +3900=TI6 +3869=TI6 +3868=TI12 +3867=TI12 +3859=TI7 +3858=TI3 +3854=TI11 +3838=TI11 +3837=TI2 +3805=TI1 +3804=TI2 +3803=TI3 +3774=TI10 +3344=TI1 +3343=TI7 +3342=TI11 +3311=TI2 +3310=TI8 +3309=TI9 +3308=TI4 +3307=TI12 +3306=TI11 +3281=TI6 +3280=TI9 +3279=TI5 +3278=TI6 +3277=TI6 +3258=TI9 +3257=TI3 +3256=TI3 +3255=TI11 +3245=TI7 +3244=TI2 +3243=TI12 +3242=TI11 +3241=TI3 +3240=TI1 +3239=TI8 +3217=TI10 +3216=TI2 +3214=TI1 +3213=TI2 +3194=TI1 +3193=TI1 +3192=TI5 +3191=TI4 +3129=TI10 +3128=TI1 +3127=TI12 +3063=TI5 +3015=TI2 +3014=TI12 +3013=TI4 +3011=TI6 +3010=TI12 +3009=TI2 +2961=TI12 +2958=TI8 +2951=TI4 +2950=TI6 +2949=TI11 +2947=TI6 +2946=TI12 +2945=TI9 +2899=TI7 +2897=TI11 +2894=TI7 +2854=TI8 +2849=TI7 +2835=TI2 +2834=TI10 +2833=TI3 +2832=TI11 +2831=TI7 +2791=TI5 +2790=TI6 +2789=TI9 +2788=TI7 +2787=TI5 +2786=TI8 +2785=TI10 +2769=TI12 +2768=TI10 +2724=TI3 +2723=TI2 +2722=TI9 +2659=TI5 +2658=TI12 +2520=TI1 +2519=TI11 +2518=TI6 +2459=TI4 +2458=TI4 +2457=TI10 +2456=TI9 +2455=TI11 +2396=TI4 +2395=TI3 +2394=TI2 +2393=TI10 +2370=TI5 +2369=TI5 +2360=TI7 +2359=TI4 +2307=TI6 +2306=TI12 +2305=TI9 +2296=TI4 +2243=TI5 +2242=TI1 +2241=TI3 +2233=TI12 +2232=TI3 +2179=TI9 +2178=TI4 +2177=TI2 +2170=TI5 +2169=TI2 +2168=TI5 +2139=TI2 +2138=TI8 +2137=TI5 +2113=TI3 +2106=TI6 +2105=TI6 +2075=TI4 +2074=TI4 +2073=TI11 +2072=TI3 +2042=TI5 +2041=TI8 +2009=TI5 +2008=TI2 +2007=TI9 +1943=TI2 +1942=TI11 +1885=TI12 +1884=TI11 +1820=TI5 +1819=TI2 +1755=TI4 +1754=TI10 +1753=TI1 +1752=TI8 +1689=TI12 +1688=TI7 +1649=TI7 +1648=TI9 +1647=TI5 +1646=TI9 +1624=TI10 +1623=TI7 +1598=TI3 +1597=TI1 +1596=TI9 +1595=TI11 +1586=TI8 +1585=TI11 +1584=TI2 +1582=TI11 +1581=TI5 +1575=TI11 +1574=TI2 +1573=TI12 +1533=TI3 +1532=TI1 +1531=TI12 +1522=TI6 +1512=TI10 +1511=TI4 +1510=TI7 +1509=TI4 +1470=TI7 +1469=TI11 +1468=TI2 +1458=TI10 +1448=TI9 +1446=TI2 +1445=TI3 +1444=TI10 +1443=TI8 +1421=TI11 +1406=TI11 +1405=TI4 +1358=TI8 +1357=TI10 +1294=TI9 +1293=TI10 +1230=TI3 +1229=TI8 +1166=TI8 +1165=TI12 +1102=TI7 +1101=TI10 +1062=TI2 +1036=TI11 +1018=TI10 +1017=TI5 +1016=TI12 +998=TI6 +957=TI10 +956=TI3 +955=TI1 +934=TI12 +897=TI3 +894=TI6 +893=TI6 +870=TI6 +837=TI5 +836=TI3 +835=TI10 +834=TI7 +833=TI12 +806=TI11 +805=TI6 +804=TI7 +790=TI2 +789=TI10 +785=TI6 +772=TI11 +771=TI11 +770=TI1 +769=TI1 +741=TI8 +740=TI11 +729=TI11 +728=TI4 +727=TI10 +726=TI7 +725=TI5 +721=TI12 +720=TI11 +708=TI5 +707=TI3 +706=TI1 +677=TI6 +676=TI3 +665=TI6 +664=TI4 +663=TI10 +662=TI10 +661=TI11 +657=TI1 +656=TI9 +612=TI5 +593=TI2 +592=TI8 +529=TI5 +528=TI6 +476=TI2 +475=TI7 +465=TI12 +414=TI1 +413=TI12 +412=TI6 +411=TI11 +410=TI5 +409=TI6 +408=TI6 +407=TI2 +402=TI8 +401=TI12 +343=TI9 +342=TI3 +318=TI12 +317=TI10 +260=TI5 +259=TI6 +254=TI12 +253=TI12 +252=TI7 +196=TI4 +195=TI9 +194=TI10 +193=TI5 +190=TI6 +189=TI6 +188=TI5 +131=TI8 +130=TI9 +129=TI6 +126=TI11 +125=TI9 +124=TI7 +123=TI4 +067=TI10 +066=TI12 +065=TI1 + +[Base] +Count=0 + +[SMUDGE] diff --git a/mods/cnc/system.yaml b/mods/cnc/system.yaml index bd69d46e9f..a819443999 100644 --- a/mods/cnc/system.yaml +++ b/mods/cnc/system.yaml @@ -25,18 +25,34 @@ Player: SpawnDefaultUnits: World: - WaterPaletteRotation: +# WaterPaletteRotation: BuildingInfluence: UnitInfluence: - BridgeLoadHook: - PaletteFromFile@terrain_temperat: +# BridgeLoadHook: + PaletteFromFile@terrain_desert: + Name: terrain + Theater: desert + Filename: desert.pal + PaletteFromFile@terrain_temperate: Name: terrain Theater: temperat Filename: temperat.pal + PaletteFromFile@terrain_winter: + Name: terrain + Theater: winter + Filename: winter.pal + PaletteFromFile@player_desert: + Name: player + Theater: desert + Filename: desert.pal PaletteFromFile@player_temperat: Name: player Theater: temperat Filename: temperat.pal + PaletteFromFile@player_winter: + Name: player + Theater: winter + Filename: winter.pal PaletteFromFile@terrain_snow: Name: terrain Theater: snow diff --git a/mods/cnc/tileSet.til b/mods/cnc/tileSet.til index a304c4a3fe..77e764f2cf 100644 --- a/mods/cnc/tileSet.til +++ b/mods/cnc/tileSet.til @@ -1,154 +1,218 @@ ; clear ground -TSI +DTW 1 ff clear1 ; clear ground -TSI -1 -ffff -clear1 - -; clear ground -TSI +DTW 1 0000 clear1 ; plain water -TS- -2 +DTW +1 0001 -w{0} +w1 + +-TW +1 +0002 +w2 ; Coastline -TS- +-TW 5 0003 sh{0} -TS- +-TW 1 0008 sh11 -TS- +-TW 1 0009 sh12 -TS- +-TW 1 000A sh13 -TS- +-TW 1 000B sh14 -TS- +-TW 1 000C sh15 ; Cliffs -TS- +DTW 38 000D s{0:00} ; More Coast -TS- +-TW 1 0033 sh32 -TS- +-TW 1 0034 sh33 -;;; TODO: Add desert only tiles + +D-- +1 +0035 +sh20 + +D-- +1 +0036 +sh21 + +D-- +1 +0037 +sh22 + +D-- +1 +0038 +sh23 + + +; Bushes +D-- +10 +0039 +br{0} ; Bones/Wall/Mud/UFO/Rock -TS- +DT- 4 0043 p{0:00} -;;; TODO: More desert only tiles +D-- +1 +0047 +p05 -; Mud -TS- -4 +D-- +1 +0048 +p06 + +DTW +1 0049 p07 -TS- -4 +-TW +1 004A p08 ; Ford WU -TS- +-TW 1 004B sh16 ; Water -TS- +DTW 1 004C sh17 ; Water -TS- +DTW 1 004D sh18 +D-- +1 +004E +sh19 + + ; Destroyed house -TS- +-TW 1 004F p13 ; Walls -TS- +-TW 1 0050 p14 +; Snow +--W +1 +0051 +p15 + ; Rocks -TS- -3 +DTW +2 0052 b{0} +-TW +1 +0054 +b3 + +D-- +1 +0055 +b4 + +D-- +1 +0056 +b5 + +D-- +1 +0057 +b6 + ; More coast -TS- +-TW 1 0058 sh6 -TS- +-TW 1 0059 sh7 -TS- +-TW 1 005A sh8 -TS- +-TW 1 005B sh9 -TS- +-TW 1 005C sh10 @@ -157,7 +221,7 @@ sh10 ; ROADS ; roads -TS- +DTW 43 005d d{0:00} @@ -166,19 +230,79 @@ d{0:00} ; RIVERS ; rivers -TS- +-TW 13 0088 rv{0:00} +D-- +1 +0095 +rv14 + +D-- +1 +0096 +rv15 + +D-- +1 +0097 +rv16 + +D-- +1 +0098 +rv17 + +D-- +1 +0099 +rv18 + +D-- +1 +009A +rv19 + +D-- +1 +009B +rv20 + +D-- +1 +009C +rv21 + +D-- +1 +009D +rv22 + +D-- +1 +009E +rv23 + +D-- +1 +00AF +rv24 + +D-- +1 +00A0 +rv25 + ; River Crossing -TS- +DTW 2 00A1 ford{0} ; Waterfalls -TS- +DTW 2 00A3 falls{0} @@ -187,40 +311,271 @@ falls{0} ; BRIDGES ; short bridge "/" -TS- +-TW 1 00A5 bridge1 ; short bridge "/" (destroyed) -TS- +-TW 1 00A6 bridge1d ; short bridge "\" -TS- +-TW 1 00A7 bridge2 ; short bridge "\" (destroyed) -TS- +-TW 1 00A8 bridge2d +; desert short bridge "/" +D-- +1 +00A9 +bridge3 + +; desert short bridge "/" (destroyed) +D-- +1 +00AA +bridge3d + +; desert short bridge "\" +D-- +1 +00AB +bridge4 + +; desert short bridge "\" (destroyed) +D-- +1 +00AC +bridge4d + +; Desert coast +D-- +1 +00AD +sh24 + +D-- +1 +00AE +sh25 + +D-- +1 +00AF +sh26 + +D-- +1 +00B0 +sh27 + +D-- +1 +00B1 +sh28 + +D-- +1 +00B2 +sh29 + +D-- +1 +00B3 +sh30 + +D-- +1 +00B4 +sh31 + +; Snow +--W +1 +00B5 +p16 + +--W +1 +00B6 +p17 + +--W +1 +00B7 +p18 + +--W +1 +00B8 +p19 + +--W +1 +00B9 +p20 + ; More coast -TS- +-TW 1 00BA sh34 -TS- +-TW 1 00BB sh35 +D-- +1 +00BC +sh36 + +D-- +1 +00BD +sh37 + +D-- +1 +00BE +sh38 + +D-- +1 +00BF +sh39 + +D-- +1 +00C0 +sh40 + +D-- +1 +00C1 +sh41 + +D-- +1 +00C2 +sh42 + +D-- +1 +00C3 +sh43 + +D-- +1 +00C4 +sh44 + +D-- +1 +00C5 +sh45 + +D-- +1 +00C6 +sh46 + +D-- +1 +00C7 +sh47 + +D-- +1 +00C8 +sh48 + +D-- +1 +00C9 +sh49 + +D-- +1 +00CA +sh50 + +D-- +1 +00CB +sh51 + +D-- +1 +00CC +sh52 + +D-- +1 +00CD +sh53 + +D-- +1 +00CE +sh54 + +D-- +1 +00CF +sh55 + +D-- +1 +00D0 +sh56 + +D-- +1 +00D1 +sh57 + +D-- +1 +00D2 +sh58 + +D-- +1 +00D3 +sh59 + +D-- +1 +00D4 +sh60 + +D-- +1 +00D5 +sh61 + +D-- +1 +00D6 +sh62 + +D-- +1 +00D7 +sh63 + ; bogus TS- 1 From f1211e44146f1c93e3c50a17be207670eae5ed3c Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Tue, 2 Mar 2010 23:18:36 +1300 Subject: [PATCH 24/38] Use all 'clear' variants --- OpenRA.FileFormats/Map.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/OpenRA.FileFormats/Map.cs b/OpenRA.FileFormats/Map.cs index 627861763a..f179faf619 100644 --- a/OpenRA.FileFormats/Map.cs +++ b/OpenRA.FileFormats/Map.cs @@ -60,9 +60,9 @@ namespace OpenRA.FileFormats IniSection basic = file.GetSection("Basic"); Title = basic.GetValue("Name", "(null)"); - BinaryPart = basic.GetValue("BinaryPart", "scm01ea.bin"); + BinaryPart = basic.GetValue("BinaryPart", "scm02ea.bin"); IniSection map = file.GetSection("Map"); - Theater = Truncate(map.GetValue("Theater", "TEMPERATE"), 8); + Theater = Truncate(map.GetValue("Theater", "DESERT"), 8); XOffset = int.Parse(map.GetValue("X", "0")); YOffset = int.Parse(map.GetValue("Y", "0")); @@ -92,6 +92,9 @@ namespace OpenRA.FileFormats { MapTiles[j, i].tile = (byte)ms.ReadByte(); MapTiles[j, i].image = (byte)ms.ReadByte(); + + if( MapTiles[ j, i ].tile == 0xff ) + MapTiles[ j, i ].image = (byte)( i % 4 + ( j % 4 ) * 4 ); } } From ae2bbae16cb6fc0757dc9f130f8716dbdc629eec Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Wed, 3 Mar 2010 09:42:45 +1300 Subject: [PATCH 25/38] Begin unhardcoding 128 map size; Trees; Waypoints --- OpenRA.FileFormats/Map.cs | 76 ++++++--- OpenRA.FileFormats/Session.cs | 2 +- OpenRA.FileFormats/TileSet.cs | 7 +- OpenRA.FileFormats/TreeReference.cs | 6 +- OpenRA.Game/GameRules/UserSettings.cs | 2 +- OpenRA.Game/Graphics/Minimap.cs | 8 +- OpenRA.Game/PathFinder.cs | 7 +- OpenRA.Game/Traits/World/UnitInfluence.cs | 10 +- OpenRA.Game/UiOverlay.cs | 4 +- mods/cnc/compat.yaml | 8 - mods/cnc/mod.yaml | 1 + mods/cnc/sequences-map.xml | 192 +++++++++++++++++++++ mods/cnc/sequences.xml | 194 ---------------------- mods/cnc/trees.yaml | 27 ++- 14 files changed, 295 insertions(+), 249 deletions(-) create mode 100644 mods/cnc/sequences-map.xml diff --git a/OpenRA.FileFormats/Map.cs b/OpenRA.FileFormats/Map.cs index f179faf619..d42d60ea88 100644 --- a/OpenRA.FileFormats/Map.cs +++ b/OpenRA.FileFormats/Map.cs @@ -32,6 +32,7 @@ namespace OpenRA.FileFormats public readonly string Title; public readonly string Theater; + public readonly int MapSize; public readonly int XOffset; public readonly int YOffset; public int2 Offset { get { return new int2( XOffset, YOffset ); } } @@ -40,7 +41,7 @@ namespace OpenRA.FileFormats public readonly int Height; public int2 Size { get { return new int2(Width, Height); } } - public readonly TileReference[ , ] MapTiles = new TileReference[ 128, 128 ]; + public readonly TileReference[ , ] MapTiles; public readonly List Trees = new List(); public readonly IEnumerable SpawnPoints; @@ -54,10 +55,8 @@ namespace OpenRA.FileFormats public Map(IniFile file) { - for (int j = 0; j < 128; j++) - for (int i = 0; i < 128; i++) - MapTiles[i, j] = new TileReference(); - + + IniSection basic = file.GetSection("Basic"); Title = basic.GetValue("Name", "(null)"); BinaryPart = basic.GetValue("BinaryPart", "scm02ea.bin"); @@ -70,25 +69,45 @@ namespace OpenRA.FileFormats Width = int.Parse(map.GetValue("Width", "0")); Height = int.Parse(map.GetValue("Height", "0")); + if (false) // RA map + { + MapSize = 128; + } + else + { + MapSize = 64; + } + MapTiles = new TileReference[ MapSize, MapSize ]; + for (int j = 0; j < MapSize; j++) + for (int i = 0; i < MapSize; i++) + MapTiles[i, j] = new TileReference(); - //UnpackTileData(ReadPackedSection(file.GetSection("MapPack"))); - //UnpackOverlayData(ReadPackedSection(file.GetSection("OverlayPack"))); - //ReadTrees(file); - UnpackCncTileData(FileSystem.Open(BinaryPart)); + if (false) // RA map + { + UnpackTileData(ReadPackedSection(file.GetSection("MapPack"))); + UnpackOverlayData(ReadPackedSection(file.GetSection("OverlayPack"))); + ReadTrees(file); + + } + else // CNC + { + UnpackBinaryTileData(FileSystem.Open(BinaryPart)); + ReadCncTrees(file); + } SpawnPoints = file.GetSection("Waypoints") - .Select(kv => Pair.New(int.Parse(kv.Key), new int2(int.Parse(kv.Value) % 128, int.Parse(kv.Value) / 128))) - .Where(a => a.First < 8) - .Select(a => a.Second) - .ToArray(); + .Select(kv => Pair.New(int.Parse(kv.Key), new int2(int.Parse(kv.Value) % MapSize, int.Parse(kv.Value) / MapSize))) + .Where(a => a.First < 8) + .Select(a => a.Second) + .ToArray(); } - void UnpackCncTileData( Stream ms ) + void UnpackBinaryTileData( Stream ms ) { - for( int i = 0 ; i < 64 ; i++ ) - for( int j = 0 ; j < 64 ; j++ ) + for( int i = 0 ; i < MapSize ; i++ ) + for( int j = 0 ; j < MapSize ; j++ ) { MapTiles[j, i].tile = (byte)ms.ReadByte(); MapTiles[j, i].image = (byte)ms.ReadByte(); @@ -156,12 +175,12 @@ namespace OpenRA.FileFormats void UnpackTileData( MemoryStream ms ) { - for( int i = 0 ; i < 128 ; i++ ) - for( int j = 0 ; j < 128 ; j++ ) + for( int i = 0 ; i < MapSize ; i++ ) + for( int j = 0 ; j < MapSize ; j++ ) MapTiles[j, i].tile = ReadWord(ms); - for( int i = 0 ; i < 128 ; i++ ) - for( int j = 0 ; j < 128 ; j++ ) + for( int i = 0 ; i < MapSize ; i++ ) + for( int j = 0 ; j < MapSize ; j++ ) { MapTiles[j, i].image = (byte)ms.ReadByte(); if( MapTiles[ j, i ].tile == 0xff || MapTiles[ j, i ].tile == 0xffff ) @@ -171,8 +190,8 @@ namespace OpenRA.FileFormats void UnpackOverlayData( MemoryStream ms ) { - for( int i = 0 ; i < 128 ; i++ ) - for( int j = 0 ; j < 128 ; j++ ) + for( int i = 0 ; i < MapSize ; i++ ) + for( int j = 0 ; j < MapSize ; j++ ) MapTiles[ j, i ].overlay = ReadByte( ms ); } @@ -183,9 +202,20 @@ namespace OpenRA.FileFormats return; foreach( KeyValuePair kv in terrain ) - Trees.Add( new TreeReference( int.Parse( kv.Key ), kv.Value ) ); + Trees.Add( new TreeReference( int.Parse( kv.Key ), kv.Value, MapSize ) ); } + + void ReadCncTrees( IniFile file ) + { + IniSection terrain = file.GetSection( "TERRAIN", true ); + if( terrain == null ) + return; + foreach( KeyValuePair kv in terrain ) + // HACK: remove the ,none from the end + Trees.Add( new TreeReference( int.Parse( kv.Key ), kv.Value.Substring(0,kv.Value.Length-5), MapSize ) ); + } + public bool IsInMap(int x, int y) { return (x >= XOffset && y >= YOffset && x < XOffset + Width && y < YOffset + Height); diff --git a/OpenRA.FileFormats/Session.cs b/OpenRA.FileFormats/Session.cs index 076b24be40..89a896baca 100644 --- a/OpenRA.FileFormats/Session.cs +++ b/OpenRA.FileFormats/Session.cs @@ -47,7 +47,7 @@ namespace OpenRA.FileFormats public class Global { - public string Map = "scm01ea.ini"; + public string Map = "scm02ea.ini"; public string[] Packages = {}; // filename:sha1 pairs. public string[] Mods = { "ra" }; // mod names public int OrderLatency = 3; diff --git a/OpenRA.FileFormats/TileSet.cs b/OpenRA.FileFormats/TileSet.cs index 964809d5b0..6d5b6def43 100644 --- a/OpenRA.FileFormats/TileSet.cs +++ b/OpenRA.FileFormats/TileSet.cs @@ -89,10 +89,9 @@ namespace OpenRA.FileFormats public byte[] GetBytes(TileReference r) { Terrain tile; - try { - if( tiles.TryGetValue( r.tile, out tile ) ) - return tile.TileBitmapBytes[ r.image ]; - } catch (System.ArgumentOutOfRangeException) {} + + if( tiles.TryGetValue( r.tile, out tile ) ) + return tile.TileBitmapBytes[ r.image ]; byte[] missingTile = new byte[ 24 * 24 ]; for( int i = 0 ; i < missingTile.Length ; i++ ) diff --git a/OpenRA.FileFormats/TreeReference.cs b/OpenRA.FileFormats/TreeReference.cs index 24163be6c3..8b54830d19 100644 --- a/OpenRA.FileFormats/TreeReference.cs +++ b/OpenRA.FileFormats/TreeReference.cs @@ -28,10 +28,10 @@ namespace OpenRA.FileFormats public readonly int Y; public readonly string Image; - public TreeReference(int xy, string image) + public TreeReference(int xy, string image, int mapSize) { - X = xy % 128; - Y = xy / 128; + X = xy % mapSize; + Y = xy / mapSize; Image = image; } diff --git a/OpenRA.Game/GameRules/UserSettings.cs b/OpenRA.Game/GameRules/UserSettings.cs index 4fffb5766c..f14383f2f9 100644 --- a/OpenRA.Game/GameRules/UserSettings.cs +++ b/OpenRA.Game/GameRules/UserSettings.cs @@ -39,7 +39,7 @@ namespace OpenRA.GameRules // External game settings public readonly string NetworkHost = ""; public readonly int NetworkPort = 0; - public readonly string Map = "scm01ea.ini"; + public readonly string Map = "scm02ea.ini"; public readonly int Player = 1; public readonly string Replay = ""; public readonly string PlayerName = ""; diff --git a/OpenRA.Game/Graphics/Minimap.cs b/OpenRA.Game/Graphics/Minimap.cs index 8810b58755..3dd872fbbd 100644 --- a/OpenRA.Game/Graphics/Minimap.cs +++ b/OpenRA.Game/Graphics/Minimap.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford. * This file is part of OpenRA. @@ -93,9 +93,9 @@ namespace OpenRA.Graphics public static Bitmap RenderTerrainBitmap(Map map, TileSet tileset) { var colors = terrainTypeColors[map.Theater.ToLowerInvariant()]; - var terrain = new Bitmap(128, 128); - for (var y = 0; y < 128; y++) - for (var x = 0; x < 128; x++) + var terrain = new Bitmap(map.MapSize, map.MapSize); + for (var y = 0; y < map.MapSize; y++) + for (var x = 0; x < map.MapSize; x++) terrain.SetPixel(x, y, map.IsInMap(x, y) ? colors[tileset.GetWalkability(map.MapTiles[x, y])] : shroudColor); diff --git a/OpenRA.Game/PathFinder.cs b/OpenRA.Game/PathFinder.cs index 0540c6ea59..f4200c1472 100644 --- a/OpenRA.Game/PathFinder.cs +++ b/OpenRA.Game/PathFinder.cs @@ -35,10 +35,11 @@ namespace OpenRA public PathFinder( World world ) { this.world = world; + var map = world.Map; for (var umt = UnitMovementType.Foot; umt <= UnitMovementType.Float; umt++) - passableCost[(int)umt] = new float[128, 128]; - for( int x = 0 ; x < 128 ; x++ ) - for( int y = 0 ; y < 128 ; y++ ) + passableCost[(int)umt] = new float[map.MapSize, map.MapSize]; + for( int x = 0 ; x < map.MapSize ; x++ ) + for( int y = 0 ; y < map.MapSize ; y++ ) for (var umt = UnitMovementType.Foot; umt <= UnitMovementType.Float; umt++ ) passableCost[(int)umt][ x, y ] = ( world.Map.IsInMap( x, y ) ) ? (float)TerrainCosts.Cost( umt, world.TileSet.GetWalkability( world.Map.MapTiles[ x, y ] ) ) diff --git a/OpenRA.Game/Traits/World/UnitInfluence.cs b/OpenRA.Game/Traits/World/UnitInfluence.cs index 1f9fb559d5..7d2eff0287 100644 --- a/OpenRA.Game/Traits/World/UnitInfluence.cs +++ b/OpenRA.Game/Traits/World/UnitInfluence.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford. * This file is part of OpenRA. @@ -36,8 +36,8 @@ namespace OpenRA.Traits public UnitInfluence( Actor self ) { - for (int i = 0; i < 128; i++) - for (int j = 0; j < 128; j++) + for (int i = 0; i < self.World.Map.MapSize; i++) + for (int j = 0; j < self.World.Map.MapSize; j++) influence[ i, j ] = new List(); self.World.ActorRemoved += a => Remove( a, a.traits.GetOrDefault() ); @@ -73,8 +73,8 @@ namespace OpenRA.Traits [Conditional( "SANITY_CHECKS" )] void SanityCheck( Actor self ) { - for( int y = 0 ; y < 128 ; y++ ) - for( int x = 0 ; x < 128 ; x++ ) + for( int y = 0 ; y < self.World.Map.MapSize ; y++ ) + for( int x = 0 ; x < self.World.Map.MapSize ; x++ ) if( influence[ x, y ] != null ) foreach (var a in influence[ x, y ]) if (!a.traits.Get().OccupiedCells().Contains( new int2( x, y ) ) ) diff --git a/OpenRA.Game/UiOverlay.cs b/OpenRA.Game/UiOverlay.cs index 6e7293f3f9..4a36b6d170 100644 --- a/OpenRA.Game/UiOverlay.cs +++ b/OpenRA.Game/UiOverlay.cs @@ -56,8 +56,8 @@ namespace OpenRA public void Draw( World world ) { if (ShowUnitDebug) - for (var j = 0; j < 128; j++) - for (var i = 0; i < 128; i++) + for (var j = 0; j < world.Map.MapSize; j++) + for (var i = 0; i < world.Map.MapSize; i++) if (world.WorldActor.traits.Get().GetUnitsAt(new int2(i, j)).Any()) spriteRenderer.DrawSprite(unitDebug, Game.CellSize * new float2(i, j), "terrain"); } diff --git a/mods/cnc/compat.yaml b/mods/cnc/compat.yaml index 5911658d77..23a66dab33 100644 --- a/mods/cnc/compat.yaml +++ b/mods/cnc/compat.yaml @@ -32,11 +32,3 @@ BR3: Footprint: ____ ____ Dimensions: 4,2 HP: 1000 - -MINE: - Inherits: ^Building - RenderBuilding: - Palette: terrain - SeedsResource: - ResourceType: Tiberium - -Selectable: diff --git a/mods/cnc/mod.yaml b/mods/cnc/mod.yaml index 76711e9ecb..504c74e4e1 100644 --- a/mods/cnc/mod.yaml +++ b/mods/cnc/mod.yaml @@ -47,6 +47,7 @@ Sequences: mods/cnc/sequences-structures.xml: mods/cnc/sequences-vehicles.xml: mods/cnc/sequences-infantry.xml: + mods/cnc/sequences-map.xml: mods/cnc/sequences.xml: Obsolete; will disappear once done converting Chrome: diff --git a/mods/cnc/sequences-map.xml b/mods/cnc/sequences-map.xml new file mode 100644 index 0000000000..e9e626bc75 --- /dev/null +++ b/mods/cnc/sequences-map.xml @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mods/cnc/sequences.xml b/mods/cnc/sequences.xml index 4722751583..a2cde9c9e3 100644 --- a/mods/cnc/sequences.xml +++ b/mods/cnc/sequences.xml @@ -85,116 +85,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -210,90 +100,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mods/cnc/trees.yaml b/mods/cnc/trees.yaml index 3899166ed8..3007aab123 100644 --- a/mods/cnc/trees.yaml +++ b/mods/cnc/trees.yaml @@ -1,3 +1,23 @@ +SPLIT3: + Inherits: ^Building + RenderBuilding: + Palette: terrain + SeedsOre: + -Selectable: +ROCK1: + Inherits: ^Tree +ROCK2: + Inherits: ^Tree +ROCK3: + Inherits: ^Tree +ROCK4: + Inherits: ^Tree +ROCK5: + Inherits: ^Tree +ROCK6: + Inherits: ^Tree +ROCK7: + Inherits: ^Tree T01: Inherits: ^Tree @@ -55,7 +75,12 @@ T16: T17: Inherits: ^Tree - + Building: + Footprint: ___ xx_ + Dimensions: 3,2 +T18: + Inherits: ^Tree + TC01: Inherits: ^Tree Building: From 97bdb9b63fad174f3f153bbdceb3c46b170f6dfb Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Wed, 3 Mar 2010 20:04:07 +1300 Subject: [PATCH 26/38] Refactor map-actor loading --- .../{TreeReference.cs => ActorReference.cs} | 21 ++++------ OpenRA.FileFormats/Map.cs | 41 +++++++++++++------ OpenRA.FileFormats/OpenRA.FileFormats.csproj | 4 +- OpenRA.FileFormats/Terrain.cs | 14 +++---- OpenRA.FileFormats/TileSet.cs | 1 - OpenRA.Game/Game.cs | 7 +--- OpenRA.Game/WorldUtils.cs | 16 -------- mods/cnc/sequences-map.xml | 18 ++++---- 8 files changed, 57 insertions(+), 65 deletions(-) rename OpenRA.FileFormats/{TreeReference.cs => ActorReference.cs} (71%) diff --git a/OpenRA.FileFormats/TreeReference.cs b/OpenRA.FileFormats/ActorReference.cs similarity index 71% rename from OpenRA.FileFormats/TreeReference.cs rename to OpenRA.FileFormats/ActorReference.cs index 8b54830d19..42a2afd3d0 100644 --- a/OpenRA.FileFormats/TreeReference.cs +++ b/OpenRA.FileFormats/ActorReference.cs @@ -18,23 +18,18 @@ */ #endregion -using System.Drawing; - namespace OpenRA.FileFormats { - public struct TreeReference + public struct ActorReference { - public readonly int X; - public readonly int Y; - public readonly string Image; - - public TreeReference(int xy, string image, int mapSize) + public readonly int2 Location; + public readonly string Name; + public readonly string Owner; + public ActorReference( string name, int2 location, string owner ) { - X = xy % mapSize; - Y = xy / mapSize; - Image = image; + Name = name; + Location = location; + Owner = owner; } - - public Point Location { get { return new Point(X, Y); } } } } diff --git a/OpenRA.FileFormats/Map.cs b/OpenRA.FileFormats/Map.cs index d42d60ea88..d9b0e3d0c3 100644 --- a/OpenRA.FileFormats/Map.cs +++ b/OpenRA.FileFormats/Map.cs @@ -42,7 +42,7 @@ namespace OpenRA.FileFormats public int2 Size { get { return new int2(Width, Height); } } public readonly TileReference[ , ] MapTiles; - public readonly List Trees = new List(); + public readonly List Actors = new List(); public readonly IEnumerable SpawnPoints; @@ -54,9 +54,7 @@ namespace OpenRA.FileFormats public string TileSuffix { get { return "." + Truncate(Theater, 3); } } public Map(IniFile file) - { - - + { IniSection basic = file.GetSection("Basic"); Title = basic.GetValue("Name", "(null)"); BinaryPart = basic.GetValue("BinaryPart", "scm02ea.bin"); @@ -71,7 +69,7 @@ namespace OpenRA.FileFormats if (false) // RA map { - MapSize = 128; + MapSize = 128; } else { @@ -88,8 +86,7 @@ namespace OpenRA.FileFormats { UnpackTileData(ReadPackedSection(file.GetSection("MapPack"))); UnpackOverlayData(ReadPackedSection(file.GetSection("OverlayPack"))); - ReadTrees(file); - + ReadRATrees(file); } else // CNC { @@ -97,6 +94,10 @@ namespace OpenRA.FileFormats ReadCncTrees(file); } + LoadActors(file, "STRUCTURES"); + LoadActors(file, "UNITS"); + LoadActors(file, "INFANTRY"); + SpawnPoints = file.GetSection("Waypoints") .Select(kv => Pair.New(int.Parse(kv.Key), new int2(int.Parse(kv.Value) % MapSize, int.Parse(kv.Value) / MapSize))) .Where(a => a.First < 8) @@ -195,14 +196,17 @@ namespace OpenRA.FileFormats MapTiles[ j, i ].overlay = ReadByte( ms ); } - void ReadTrees( IniFile file ) + void ReadRATrees( IniFile file ) { IniSection terrain = file.GetSection( "TERRAIN", true ); if( terrain == null ) return; - + foreach( KeyValuePair kv in terrain ) - Trees.Add( new TreeReference( int.Parse( kv.Key ), kv.Value, MapSize ) ); + { + var loc = int.Parse( kv.Key ); + Actors.Add( new ActorReference(kv.Value, new int2(loc % MapSize, loc / MapSize), null ) ); + } } void ReadCncTrees( IniFile file ) @@ -212,8 +216,21 @@ namespace OpenRA.FileFormats return; foreach( KeyValuePair kv in terrain ) - // HACK: remove the ,none from the end - Trees.Add( new TreeReference( int.Parse( kv.Key ), kv.Value.Substring(0,kv.Value.Length-5), MapSize ) ); + { + var loc = int.Parse( kv.Key ); + Actors.Add( new ActorReference( kv.Value.Substring(0,kv.Value.Length-5), new int2(loc % MapSize, loc / MapSize),null)); + } + } + + void LoadActors(IniFile file, string section) + { + foreach (var s in file.GetSection(section, true)) + { + //num=owner,type,health,location,facing,... + var parts = s.Value.Split( ',' ); + var loc = int.Parse(parts[3]); + Actors.Add( new ActorReference( parts[1].ToLowerInvariant(), new int2(loc % MapSize, loc / MapSize), parts[0])); + } } public bool IsInMap(int x, int y) diff --git a/OpenRA.FileFormats/OpenRA.FileFormats.csproj b/OpenRA.FileFormats/OpenRA.FileFormats.csproj index 893ee21c9c..3a83b0f9c9 100644 --- a/OpenRA.FileFormats/OpenRA.FileFormats.csproj +++ b/OpenRA.FileFormats/OpenRA.FileFormats.csproj @@ -1,4 +1,4 @@ - + Debug @@ -90,10 +90,10 @@ - + + + + + + + @@ -21,6 +27,8 @@ + + @@ -105,6 +113,8 @@ + + @@ -183,10 +193,4 @@ - - - - - - \ No newline at end of file From 0eb764a7dab0f3c188a2f981b06f35341a060ea6 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Wed, 3 Mar 2010 21:05:04 +1300 Subject: [PATCH 27/38] Support ra maps again --- OpenRA.FileFormats/Map.cs | 53 ++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/OpenRA.FileFormats/Map.cs b/OpenRA.FileFormats/Map.cs index d9b0e3d0c3..6d51f2bb3b 100644 --- a/OpenRA.FileFormats/Map.cs +++ b/OpenRA.FileFormats/Map.cs @@ -31,6 +31,7 @@ namespace OpenRA.FileFormats public readonly string BinaryPart; public readonly string Title; public readonly string Theater; + public readonly int INIFormat; public readonly int MapSize; public readonly int XOffset; @@ -58,6 +59,8 @@ namespace OpenRA.FileFormats IniSection basic = file.GetSection("Basic"); Title = basic.GetValue("Name", "(null)"); BinaryPart = basic.GetValue("BinaryPart", "scm02ea.bin"); + INIFormat = int.Parse(basic.GetValue("NewINIFormat", "0")); + IniSection map = file.GetSection("Map"); Theater = Truncate(map.GetValue("Theater", "DESERT"), 8); @@ -67,14 +70,8 @@ namespace OpenRA.FileFormats Width = int.Parse(map.GetValue("Width", "0")); Height = int.Parse(map.GetValue("Height", "0")); - if (false) // RA map - { - MapSize = 128; - } - else - { - MapSize = 64; - } + Log.Write("Map format is {0}",INIFormat); + MapSize = (INIFormat == 3) ? 128 : 64; MapTiles = new TileReference[ MapSize, MapSize ]; for (int j = 0; j < MapSize; j++) @@ -82,15 +79,15 @@ namespace OpenRA.FileFormats MapTiles[i, j] = new TileReference(); - if (false) // RA map + if (INIFormat == 3) // RA map { - UnpackTileData(ReadPackedSection(file.GetSection("MapPack"))); - UnpackOverlayData(ReadPackedSection(file.GetSection("OverlayPack"))); + UnpackRATileData(ReadPackedSection(file.GetSection("MapPack"))); + UnpackRAOverlayData(ReadPackedSection(file.GetSection("OverlayPack"))); ReadRATrees(file); } else // CNC { - UnpackBinaryTileData(FileSystem.Open(BinaryPart)); + UnpackCncTileData(FileSystem.Open(BinaryPart)); ReadCncTrees(file); } @@ -105,19 +102,6 @@ namespace OpenRA.FileFormats .ToArray(); } - void UnpackBinaryTileData( Stream ms ) - { - for( int i = 0 ; i < MapSize ; i++ ) - for( int j = 0 ; j < MapSize ; j++ ) - { - MapTiles[j, i].tile = (byte)ms.ReadByte(); - MapTiles[j, i].image = (byte)ms.ReadByte(); - - if( MapTiles[ j, i ].tile == 0xff ) - MapTiles[ j, i ].image = (byte)( i % 4 + ( j % 4 ) * 4 ); - } - } - static MemoryStream ReadPackedSection(IniSection mapPackSection) { StringBuilder sb = new StringBuilder(); @@ -174,7 +158,7 @@ namespace OpenRA.FileFormats return ret; } - void UnpackTileData( MemoryStream ms ) + void UnpackRATileData( MemoryStream ms ) { for( int i = 0 ; i < MapSize ; i++ ) for( int j = 0 ; j < MapSize ; j++ ) @@ -189,7 +173,7 @@ namespace OpenRA.FileFormats } } - void UnpackOverlayData( MemoryStream ms ) + void UnpackRAOverlayData( MemoryStream ms ) { for( int i = 0 ; i < MapSize ; i++ ) for( int j = 0 ; j < MapSize ; j++ ) @@ -209,6 +193,19 @@ namespace OpenRA.FileFormats } } + void UnpackCncTileData( Stream ms ) + { + for( int i = 0 ; i < MapSize ; i++ ) + for( int j = 0 ; j < MapSize ; j++ ) + { + MapTiles[j, i].tile = (byte)ms.ReadByte(); + MapTiles[j, i].image = (byte)ms.ReadByte(); + + if( MapTiles[ j, i ].tile == 0xff ) + MapTiles[ j, i ].image = (byte)( i % 4 + ( j % 4 ) * 4 ); + } + } + void ReadCncTrees( IniFile file ) { IniSection terrain = file.GetSection( "TERRAIN", true ); @@ -218,7 +215,7 @@ namespace OpenRA.FileFormats foreach( KeyValuePair kv in terrain ) { var loc = int.Parse( kv.Key ); - Actors.Add( new ActorReference( kv.Value.Substring(0,kv.Value.Length-5), new int2(loc % MapSize, loc / MapSize),null)); + Actors.Add( new ActorReference( kv.Value.Split(',')[0], new int2(loc % MapSize, loc / MapSize),null)); } } From 3910b2c3a6e721e469f6f561c9cbf9853394ec10 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Wed, 3 Mar 2010 21:18:33 +1300 Subject: [PATCH 28/38] Fix N-E river corner on desert maps --- mods/cnc/tileSet.til | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/cnc/tileSet.til b/mods/cnc/tileSet.til index 77e764f2cf..6ae974d4ad 100644 --- a/mods/cnc/tileSet.til +++ b/mods/cnc/tileSet.til @@ -287,7 +287,7 @@ rv23 D-- 1 -00AF +009F rv24 D-- From d4055233783594aa61c9468dbe7d0d5719b2e8d0 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Wed, 3 Mar 2010 22:13:53 +1300 Subject: [PATCH 29/38] Map selector works; selecting non-desert maps doesn't --- OpenRA.FileFormats/Map.cs | 8 +- OpenRA.Game/Chrome.cs | 9 +- OpenRA.Game/Graphics/Minimap.cs | 4 +- OpenRA.Game/World.cs | 3 +- mods/cnc/missions.pkt | 17 + mods/cnc/scm01ea.ini | 565 ------------------------------ mods/cnc/scm02ea.ini | 597 -------------------------------- mods/cnc/scm70ea.ini | 531 ---------------------------- mods/cnc/sequences-map.xml | 8 + mods/cnc/trees.yaml | 9 + 10 files changed, 46 insertions(+), 1705 deletions(-) create mode 100644 mods/cnc/missions.pkt delete mode 100644 mods/cnc/scm01ea.ini delete mode 100644 mods/cnc/scm02ea.ini delete mode 100644 mods/cnc/scm70ea.ini diff --git a/OpenRA.FileFormats/Map.cs b/OpenRA.FileFormats/Map.cs index 6d51f2bb3b..9a39786521 100644 --- a/OpenRA.FileFormats/Map.cs +++ b/OpenRA.FileFormats/Map.cs @@ -28,7 +28,6 @@ namespace OpenRA.FileFormats { public class Map { - public readonly string BinaryPart; public readonly string Title; public readonly string Theater; public readonly int INIFormat; @@ -54,11 +53,12 @@ namespace OpenRA.FileFormats public string TileSuffix { get { return "." + Truncate(Theater, 3); } } - public Map(IniFile file) + public Map(string Filename) { + IniFile file = new IniFile(FileSystem.Open(Filename)); + IniSection basic = file.GetSection("Basic"); Title = basic.GetValue("Name", "(null)"); - BinaryPart = basic.GetValue("BinaryPart", "scm02ea.bin"); INIFormat = int.Parse(basic.GetValue("NewINIFormat", "0")); IniSection map = file.GetSection("Map"); @@ -87,7 +87,7 @@ namespace OpenRA.FileFormats } else // CNC { - UnpackCncTileData(FileSystem.Open(BinaryPart)); + UnpackCncTileData(FileSystem.Open(Filename.Substring(0,Filename.Length-4)+".bin")); ReadCncTrees(file); } diff --git a/OpenRA.Game/Chrome.cs b/OpenRA.Game/Chrome.cs index f3cdf00080..fd4f86ea5a 100644 --- a/OpenRA.Game/Chrome.cs +++ b/OpenRA.Game/Chrome.cs @@ -251,7 +251,7 @@ namespace OpenRA public MapInfo(string filename) { Filename = filename.ToLowerInvariant(); - Map = new Map(new IniFile(FileSystem.Open(Filename))); + Map = new Map(Filename); } }; @@ -318,9 +318,10 @@ namespace OpenRA var y = r.Top + 50; - int numListItems = ((r.Bottom - 60 - y ) / 20); + int maxListItems = ((r.Bottom - 60 - y ) / 20); - for(int i = mapOffset; i < numListItems + mapOffset; i++, y += 20){ + for(int i = mapOffset; i < Math.Min(maxListItems + mapOffset, mapList.Value.Count()); i++, y += 20){ + var map = mapList.Value.ElementAt(i); var itemRect = new Rectangle(r.Left + 50, y - 2, r.Width - 340, 20); if (map == currentMap) @@ -355,7 +356,7 @@ namespace OpenRA AddUiButton(new int2(mapRect.Left + mapRect.Width / 2, y), "\\/", _ => { - mapOffset = (mapOffset + 1 > mapList.Value.Count() - numListItems) ? mapOffset : mapOffset + 1; + mapOffset = (mapOffset + 1 > mapList.Value.Count() - maxListItems) ? mapOffset : mapOffset + 1; }); AddButton(r, _ => { }); diff --git a/OpenRA.Game/Graphics/Minimap.cs b/OpenRA.Game/Graphics/Minimap.cs index 3dd872fbbd..156c30f94c 100644 --- a/OpenRA.Game/Graphics/Minimap.cs +++ b/OpenRA.Game/Graphics/Minimap.cs @@ -107,8 +107,8 @@ namespace OpenRA.Graphics /* todo: do this a bit nicer */ var terrain = RenderTerrainBitmap(map, tileset); - foreach (var sp in map.SpawnPoints) - terrain.SetPixel(sp.X, sp.Y, Color.White); + //foreach (var sp in map.SpawnPoints) + // terrain.SetPixel(sp.X, sp.Y, Color.White); return terrain; } diff --git a/OpenRA.Game/World.cs b/OpenRA.Game/World.cs index 0cb656328b..0657173785 100644 --- a/OpenRA.Game/World.cs +++ b/OpenRA.Game/World.cs @@ -75,8 +75,7 @@ namespace OpenRA public World() { Timer.Time( "----World.ctor" ); - - Map = new Map( Rules.AllRules ); + Map = new Map( Game.LobbyInfo.GlobalSettings.Map ); Timer.Time( "new Map: {0}" ); TileSet = new TileSet( Map.TileSuffix ); SpriteSheetBuilder.Initialize( Map ); diff --git a/mods/cnc/missions.pkt b/mods/cnc/missions.pkt new file mode 100644 index 0000000000..6b2d17d9a6 --- /dev/null +++ b/mods/cnc/missions.pkt @@ -0,0 +1,17 @@ +[Missions] +SCM01EA.INI=Green Acres +SCM02EA.INI=Sand Trap +SCM03EA.INI=Lost Arena +SCM04EA.INI=River Raid +SCM05EA.INI=Eye of the Storm +SCM06EA.INI=Lakefront Clash +SCM07EA.INI=Desert Madness +SCM08EA.INI=Pitfall +SCM09EA.INI=Moosehead Barrons +SCM70EA.INI=Winter Waterland +SCM71EA.INI=One Pass Fits All +SCM72EA.INI=Straight and Narrow +SCM73EA.INI=King takes Pawn +SCM74EA.INI=Nowhere to Hide +SCM77EA.INI=Marooned +SCM96EA.INI=Tiberium Garden diff --git a/mods/cnc/scm01ea.ini b/mods/cnc/scm01ea.ini deleted file mode 100644 index 06fa23f723..0000000000 --- a/mods/cnc/scm01ea.ini +++ /dev/null @@ -1,565 +0,0 @@ -; Scenario 20 control for house GoodGuy. - -[Basic] -BinaryPart=scm01ea.bin -CarryOverCap=-1 -CarryOverMoney=100 -Intro=x -BuildLevel=1 -Theme=No theme -Percent=0 -Player=Multi1 -Action=LAND -Lose=GAMEOVER -Win=x -Brief=GDI1 -Name=GREEN ACRES - -[MAP] -Height=49 -Width=58 -Y=11 -X=3 -Theater=TEMPERATE - -[Multi1] -FlagHome=1031 -FlagLocation=5127 -MaxBuilding=150 -Allies=Multi1,Multi2,Multi3 -MaxUnit=150 -Edge=North -Credits=0 - -[Multi2] -FlagHome=952 -FlagLocation=5048 -MaxBuilding=150 -Allies=Multi1,Multi2,Multi3,Multi4 -MaxUnit=150 -Edge=North -Credits=0 -a -[Multi3] -FlagHome=3510 -FlagLocation=7606 -MaxBuilding=150 -Allies=Multi1,Multi2,Multi3,Multi4 -MaxUnit=150 -Edge=North -Credits=0 - -[Multi4] -FlagHome=3466 -FlagLocation=7562 -MaxBuilding=150 -Allies=Multi2,Multi3,Multi4 -MaxUnit=150 -Edge=North -Credits=0 - -[Base] -Count=0 - -[TERRAIN] -1004=TC04,None -1002=TC03,None -2274=TC03,None -2145=TC04,None -2741=TC04,None -2679=TC02,None -2521=T02,None -2588=T01,None -1677=SPLIT2,None -2900=SPLIT3,None -3498=SPLIT3,None -2269=SPLIT3,None -1462=SPLIT2,None -738=SPLIT3,None -1935=TC01,None -1997=T17,None -1732=TC05,None -2058=TC04,None -1170=TC04,None -2000=TC02,None -1874=T07,None -2397=T06,None -1828=T07,None -1443=T06,None -1570=T07,None -1770=T07,None -2847=T07,None -2977=T16,None -2910=T17,None -2911=TC02,None -1641=TC04,None -2665=TC04,None -2640=TC04,None -755=T02,None -780=T02,None -779=T03,None -2764=T16,None -3603=TC02,None -1124=T16,None -806=T17,None -870=TC01,None -814=TC02,None -3349=T07,None -3286=TC04,None -992=TC04,None -1247=TC02,None -981=TC01,None -1169=T01,None -2095=TC04,None -2031=TC01,None -2701=SPLIT2,None -1382=SPLIT2,None -2798=SPLIT3,None -3452=T01,None -1658=TC05,None -1720=TC04,None -1718=TC03,None -1716=TC02,None -1779=TC01,None -2289=TC02,None -2221=TC04,None -2351=TC03,None - -[OVERLAY] -3819=TI1 -3756=TI6 -3755=TI10 -3754=TI11 -3692=TI4 -3691=TI1 -3690=TI8 -3689=TI6 -3628=TI11 -3627=TI6 -3626=TI8 -3625=TI1 -3624=TI1 -3564=TI7 -3563=TI7 -3561=TI8 -3560=TI6 -3559=TI2 -3558=TI6 -3500=TI12 -3499=TI7 -3498=TI10 -3497=TI3 -3495=TI2 -3494=TI6 -3436=TI12 -3435=TI6 -3434=TI11 -3433=TI4 -3432=TI5 -3431=TI12 -3183=TI12 -3159=TI10 -3119=TI8 -3118=TI5 -3117=TI2 -3116=TI11 -3115=TI5 -3114=TI9 -3095=TI10 -3093=TI3 -3092=TI10 -3057=TI5 -3056=TI4 -3055=TI7 -3054=TI1 -3053=TI7 -3052=TI4 -3051=TI2 -3050=TI12 -3049=TI6 -3031=TI12 -3030=TI2 -3029=TI10 -3028=TI5 -3027=TI7 -2992=TI9 -2991=TI9 -2990=TI3 -2989=TI9 -2988=TI12 -2987=TI10 -2986=TI11 -2985=TI12 -2984=TI3 -2966=TI3 -2965=TI3 -2963=TI9 -2962=TI11 -2930=TI8 -2929=TI6 -2928=TI5 -2927=TI7 -2926=TI10 -2925=TI5 -2923=TI9 -2922=TI10 -2921=TI3 -2920=TI2 -2919=TI12 -2901=TI4 -2900=TI5 -2899=TI1 -2898=TI9 -2897=TI3 -2896=TI1 -2894=TI9 -2893=TI6 -2892=TI5 -2891=TI5 -2890=TI8 -2866=TI2 -2865=TI5 -2864=TI5 -2861=TI1 -2855=TI2 -2854=TI10 -2836=TI4 -2835=TI4 -2834=TI12 -2833=TI1 -2832=TI9 -2831=TI9 -2830=TI3 -2829=TI3 -2827=TI2 -2826=TI4 -2825=TI3 -2803=TI5 -2802=TI7 -2801=TI12 -2796=TI1 -2769=TI11 -2767=TI5 -2766=TI6 -2764=TI2 -2763=TI9 -2762=TI1 -2761=TI5 -2737=TI3 -2736=TI10 -2733=TI12 -2732=TI4 -2703=TI2 -2702=TI12 -2701=TI12 -2700=TI12 -2699=TI12 -2698=TI7 -2674=TI8 -2673=TI7 -2672=TI2 -2671=TI6 -2670=TI4 -2669=TI12 -2639=TI3 -2609=TI6 -2397=TI4 -2396=TI7 -2395=TI5 -2394=TI5 -2393=TI4 -2336=TI12 -2335=TI5 -2334=TI2 -2332=TI2 -2331=TI5 -2330=TI1 -2329=TI3 -2328=TI5 -2327=TI7 -2272=TI3 -2270=TI10 -2269=TI10 -2268=TI1 -2267=TI8 -2266=TI8 -2265=TI7 -2264=TI11 -2263=TI2 -2208=TI8 -2207=TI8 -2206=TI1 -2205=TI2 -2204=TI3 -2203=TI5 -2202=TI12 -2201=TI3 -2200=TI12 -2144=TI3 -2143=TI10 -2142=TI12 -2141=TI6 -2139=TI11 -2080=TI11 -2079=TI11 -2078=TI4 -2015=TI6 -1998=TI3 -1997=TI6 -1996=TI3 -1995=TI6 -1994=TI8 -1937=TI3 -1936=TI8 -1934=TI8 -1933=TI9 -1932=TI11 -1931=TI9 -1930=TI1 -1929=TI5 -1873=TI1 -1872=TI2 -1871=TI1 -1870=TI9 -1868=TI8 -1867=TI5 -1866=TI11 -1865=TI10 -1810=TI12 -1809=TI8 -1808=TI7 -1806=TI8 -1805=TI5 -1804=TI12 -1803=TI4 -1768=TI5 -1767=TI12 -1764=TI10 -1763=TI7 -1747=TI3 -1745=TI3 -1744=TI3 -1743=TI6 -1740=TI11 -1739=TI1 -1715=TI8 -1704=TI7 -1702=TI12 -1701=TI4 -1699=TI5 -1698=TI5 -1681=TI10 -1680=TI11 -1679=TI4 -1678=TI9 -1676=TI5 -1675=TI10 -1651=TI6 -1650=TI11 -1640=TI5 -1639=TI2 -1637=TI1 -1636=TI4 -1633=TI11 -1619=TI11 -1618=TI2 -1617=TI12 -1616=TI5 -1615=TI4 -1614=TI11 -1613=TI7 -1612=TI7 -1611=TI1 -1610=TI2 -1595=TI10 -1594=TI3 -1593=TI11 -1592=TI2 -1591=TI8 -1590=TI12 -1589=TI5 -1588=TI4 -1587=TI11 -1577=TI4 -1576=TI1 -1575=TI12 -1573=TI2 -1572=TI4 -1571=TI7 -1570=TI7 -1569=TI5 -1553=TI5 -1552=TI9 -1551=TI3 -1550=TI9 -1549=TI5 -1548=TI2 -1547=TI6 -1530=TI10 -1529=TI9 -1528=TI7 -1527=TI8 -1525=TI3 -1524=TI5 -1512=TI9 -1511=TI1 -1510=TI6 -1509=TI4 -1506=TI12 -1505=TI9 -1489=TI9 -1468=TI12 -1466=TI2 -1465=TI9 -1464=TI10 -1463=TI10 -1447=TI1 -1445=TI9 -1444=TI2 -1443=TI8 -1442=TI5 -1441=TI2 -1404=TI11 -1403=TI12 -1384=TI7 -1383=TI12 -1382=TI8 -1381=TI5 -1380=TI9 -1379=TI5 -1377=TI4 -1320=TI8 -1318=TI4 -1317=TI8 -1316=TI12 -877=TI1 -869=TI5 -868=TI8 -867=TI4 -866=TI11 -865=TI10 -817=TI4 -816=TI2 -813=TI5 -812=TI4 -811=TI11 -810=TI9 -809=TI10 -808=TI9 -807=TI4 -805=TI10 -804=TI1 -803=TI7 -801=TI9 -800=TI7 -799=TI5 -754=TI9 -751=TI11 -750=TI8 -749=TI8 -748=TI7 -747=TI1 -746=TI10 -745=TI3 -744=TI8 -743=TI3 -742=TI5 -741=TI3 -740=TI5 -738=TI6 -737=TI10 -736=TI8 -735=TI7 - -[SMUDGE] - -[INFANTRY] - -[UNITS] - -[STRUCTURES] - -[Waypoints] -31=-1 -30=-1 -29=-1 -28=-1 -27=2272 -26=2272 -25=-1 -24=-1 -23=-1 -22=-1 -21=-1 -20=-1 -19=-1 -18=-1 -17=-1 -16=-1 -15=-1 -14=-1 -13=-1 -12=-1 -11=-1 -10=-1 -9=-1 -8=-1 -7=3464 -6=3573 -5=2298 -4=3745 -3=2216 -2=953 -1=786 -0=1221 - - -[Neutral] -FlagHome=0 -FlagLocation=0 -Allies=Neutral -MaxBuilding=150 -MaxUnit=150 -Edge=North -Credits=0 - -[GoodGuy] -FlagHome=0 -FlagLocation=0 -Allies=GoodGuy,Neutral -MaxBuilding=150 -MaxUnit=150 -Edge=North -Credits=0 - -[BadGuy] -FlagHome=0 -FlagLocation=0 -Allies=BadGuy -MaxBuilding=150 -MaxUnit=150 -Edge=North -Credits=0 - -[Special] -FlagHome=0 -FlagLocation=0 -Allies=Special -MaxBuilding=150 -MaxUnit=150 -Edge=North -Credits=0 - -[Multi5] -Allies=Multi5 -MaxBuilding=150 -MaxUnit=150 -Edge=North -Credits=0 - -[Multi6] -Allies=Multi6 -MaxBuilding=150 -MaxUnit=150 -Edge=North -Credits=0 diff --git a/mods/cnc/scm02ea.ini b/mods/cnc/scm02ea.ini deleted file mode 100644 index 912b9acde6..0000000000 --- a/mods/cnc/scm02ea.ini +++ /dev/null @@ -1,597 +0,0 @@ -; Scenario 2 control for house Multi1. - -[Basic] -BinaryPart=scm02ea.bin -CarryOverCap=-1 -CarryOverMoney=50 -Intro=x -BuildLevel=2 -Theme=No theme -Percent=0 -Player=Multi3 -Action=LAND -Lose=GAMEOVER -Win=x -Brief=GDI1 -Name=Sand Trap - -[MAP] -Height=58 -Width=57 -Y=3 -X=3 -Theater=DESERT - -[Waypoints] -31=-1 -30=-1 -29=3249 -28=901 -27=2337 -26=2337 -25=-1 -24=-1 -23=-1 -22=-1 -21=-1 -20=-1 -19=-1 -18=-1 -17=-1 -16=-1 -15=-1 -14=-1 -13=-1 -12=-1 -11=-1 -10=-1 -9=-1 -8=-1 -7=340 -6=376 -5=2292 -4=3334 -3=3737 -2=3760 -1=1057 -0=1030 - -[Neutral] -Allies=Neutral -MaxBuilding=150 -MaxUnit=150 -Edge=North -Credits=0 - -[Multi1] -Allies=Multi1,Multi2,Multi4 -MaxBuilding=150 -MaxUnit=150 -Edge=North -Credits=0 - -[Multi2] -Allies=Multi1,Multi2,Multi3,Multi4 -MaxBuilding=150 -MaxUnit=150 -Edge=North -Credits=0 - -[Multi3] -Allies=Multi2,Multi3,Multi4 -MaxBuilding=150 -MaxUnit=150 -Edge=North -Credits=0 - -[Multi4] -Allies=Multi1,Multi2,Multi3,Multi4 -MaxBuilding=150 -MaxUnit=150 -Edge=North -Credits=0 - -[STRUCTURES] - -[OVERLAY] -3862=TI1 -3860=TI1 -3859=TI1 -3858=TI1 -3857=TI1 -3856=TI1 -3855=TI1 -3854=TI1 -3850=TI1 -3849=TI1 -3848=TI1 -3847=TI1 -3846=TI1 -3845=TI1 -3844=TI1 -3843=TI1 -3819=TI10 -3818=TI11 -3799=TI11 -3798=TI6 -3797=TI7 -3796=TI5 -3795=TI6 -3794=TI12 -3793=TI3 -3791=TI5 -3785=TI6 -3784=TI2 -3783=TI3 -3782=TI11 -3781=TI11 -3780=TI3 -3756=TI6 -3755=TI7 -3754=TI5 -3735=TI3 -3734=TI6 -3733=TI2 -3732=TI10 -3731=TI12 -3730=TI7 -3729=TI5 -3728=TI6 -3726=TI2 -3722=TI4 -3721=TI8 -3720=TI9 -3719=TI1 -3718=TI12 -3694=TI9 -3693=TI5 -3692=TI2 -3691=TI4 -3690=TI8 -3670=TI12 -3669=TI6 -3668=TI8 -3667=TI10 -3666=TI3 -3665=TI8 -3664=TI8 -3658=TI9 -3631=TI9 -3630=TI12 -3629=TI6 -3628=TI1 -3627=TI10 -3626=TI12 -3604=TI9 -3602=TI4 -3567=TI8 -3566=TI4 -3564=TI1 -3563=TI8 -3562=TI2 -3541=TI5 -3540=TI10 -3502=TI5 -3501=TI7 -3499=TI6 -3437=TI4 -3436=TI5 -3435=TI5 -3434=TI6 -3372=TI2 -3371=TI3 -3370=TI1 -3258=TI5 -3194=TI5 -3193=TI9 -3130=TI9 -3129=TI7 -3128=TI12 -3066=TI8 -3065=TI2 -3013=TI3 -3001=TI3 -2999=TI8 -2954=TI12 -2953=TI7 -2950=TI12 -2949=TI8 -2948=TI8 -2939=TI9 -2938=TI2 -2936=TI5 -2935=TI9 -2925=TI10 -2890=TI8 -2889=TI4 -2888=TI4 -2887=TI5 -2886=TI6 -2885=TI5 -2884=TI10 -2874=TI5 -2873=TI6 -2872=TI8 -2826=TI7 -2824=TI7 -2822=TI11 -2821=TI12 -2820=TI2 -2811=TI7 -2809=TI4 -2771=TI4 -2768=TI4 -2759=TI12 -2758=TI11 -2757=TI5 -2756=TI5 -2746=TI7 -2745=TI10 -2709=TI10 -2708=TI1 -2707=TI12 -2705=TI5 -2703=TI1 -2702=TI1 -2695=TI5 -2694=TI1 -2693=TI9 -2692=TI5 -2681=TI9 -2648=TI12 -2647=TI10 -2646=TI4 -2645=TI9 -2644=TI6 -2642=TI10 -2641=TI11 -2640=TI1 -2639=TI7 -2638=TI2 -2631=TI12 -2630=TI11 -2617=TI9 -2583=TI9 -2582=TI12 -2581=TI10 -2580=TI11 -2578=TI7 -2577=TI2 -2576=TI11 -2575=TI3 -2553=TI7 -2518=TI4 -2517=TI12 -2516=TI10 -2515=TI12 -2514=TI5 -2513=TI2 -2512=TI6 -2511=TI4 -2453=TI3 -2452=TI11 -2451=TI5 -2449=TI1 -2448=TI2 -2388=TI5 -2386=TI10 -2385=TI4 -2351=TI12 -2350=TI8 -2349=TI5 -2288=TI8 -2286=TI9 -2285=TI3 -2284=TI5 -2283=TI11 -2282=TI5 -2252=TI11 -2251=TI3 -2223=TI2 -2222=TI4 -2221=TI1 -2220=TI3 -2219=TI6 -2218=TI11 -2187=TI5 -2186=TI11 -2185=TI5 -2158=TI11 -2157=TI10 -2156=TI6 -2155=TI11 -2154=TI8 -2153=TI7 -2152=TI3 -2145=TI11 -2123=TI6 -2121=TI9 -2093=TI1 -2092=TI3 -2091=TI4 -2090=TI9 -2089=TI6 -2088=TI6 -2061=TI3 -2059=TI10 -2058=TI12 -2054=TI10 -2053=TI12 -2027=TI8 -2026=TI4 -2025=TI11 -1996=TI8 -1995=TI2 -1994=TI3 -1990=TI7 -1989=TI3 -1963=TI4 -1931=TI11 -1930=TI10 -1929=TI10 -1928=TI10 -1927=TI2 -1926=TI4 -1925=TI1 -1924=TI6 -1866=TI7 -1865=TI4 -1864=TI9 -1863=TI1 -1862=TI4 -1861=TI10 -1860=TI3 -1801=TI4 -1800=TI8 -1799=TI1 -1798=TI2 -1797=TI3 -1796=TI2 -1795=TI8 -1737=TI1 -1735=TI4 -1734=TI12 -1733=TI3 -1732=TI4 -1731=TI9 -1690=TI12 -1689=TI8 -1670=TI8 -1669=TI4 -1668=TI4 -1624=TI10 -1559=TI6 -1558=TI12 -1498=TI7 -1497=TI11 -1496=TI11 -1495=TI12 -1494=TI6 -1493=TI10 -1492=TI5 -1491=TI1 -1465=TI11 -1433=TI11 -1432=TI6 -1431=TI11 -1430=TI3 -1429=TI9 -1428=TI9 -1427=TI9 -1401=TI12 -1369=TI9 -1368=TI2 -1367=TI6 -1366=TI9 -1365=TI2 -1364=TI1 -1363=TI12 -1337=TI8 -1336=TI2 -1326=TI3 -1324=TI1 -1322=TI12 -1321=TI12 -1320=TI6 -1303=TI1 -1302=TI11 -1301=TI2 -1300=TI1 -1273=TI5 -1263=TI9 -1260=TI11 -1259=TI9 -1258=TI7 -1256=TI10 -1240=TI2 -1239=TI9 -1238=TI5 -1237=TI3 -1236=TI8 -1199=TI5 -1198=TI4 -1195=TI5 -1194=TI4 -1193=TI1 -1176=TI11 -1175=TI8 -1173=TI2 -1172=TI6 -1133=TI12 -1132=TI8 -1131=TI7 -1130=TI6 -1129=TI4 -1128=TI9 -1127=TI1 -1126=TI11 -1109=TI5 -1108=TI6 -1107=TI3 -1068=TI12 -1067=TI11 -1066=TI5 -1065=TI9 -1064=TI10 -1063=TI10 -1062=TI6 -1044=TI6 -1043=TI11 -1004=TI9 -1003=TI2 -1002=TI3 -1001=TI9 -1000=TI11 -999=TI12 -998=TI3 -980=TI10 -978=TI7 -939=TI10 -938=TI12 -937=TI2 -936=TI3 -935=TI7 -934=TI10 -873=TI1 -872=TI4 -528=TI8 -527=TI5 -526=TI2 -523=TI6 -522=TI11 -521=TI2 -520=TI12 -463=TI5 -462=TI8 -461=TI8 -460=TI8 -459=TI7 -458=TI12 -457=TI2 -456=TI3 -455=TI3 -454=TI3 -398=TI10 -397=TI11 -396=TI8 -395=TI10 -394=TI11 -393=TI10 -392=TI9 -391=TI10 -390=TI4 -389=TI11 -371=TI6 -370=TI5 -369=TI4 -368=TI5 -367=TI10 -366=TI3 -363=TI7 -362=TI3 -361=TI2 -360=TI11 -333=TI10 -332=TI11 -330=TI1 -329=TI11 -327=TI7 -326=TI11 -325=TI4 -307=TI8 -306=TI8 -305=TI3 -304=TI4 -303=TI7 -302=TI6 -301=TI12 -300=TI8 -299=TI3 -298=TI9 -296=TI3 -295=TI12 -268=TI9 -267=TI2 -266=TI8 -265=TI10 -264=TI7 -263=TI9 -262=TI10 -261=TI4 -260=TI8 -242=TI11 -239=TI5 -238=TI6 -236=TI2 -235=TI4 -231=TI3 - -[Base] -Count=0 - -[TERRAIN] -3541=SPLIT3,None -1235=SPLIT3,None -264=SPLIT3,None -1987=T18,None -2198=T18,None -2394=T18,None -2372=T08,None -2439=T08,None -2373=T08,None -925=ROCK1,None -323=ROCK1,None -364=ROCK6,None -2741=T08,None -1142=T08,None -3573=T08,None -2085=T08,None -2151=T08,None -2086=T08,None -2030=T08,None -771=ROCK1,None -1958=ROCK1,None -2267=T08,None -2759=SPLIT3,None -2515=SPLIT3,None -3436=SPLIT3,None -876=SPLIT3,None -2153=SPLIT3,None -233=SPLIT3,None - -[SMUDGE] - -[GoodGuy] -Allies=GoodGuy,Neutral -MaxBuilding=150 -MaxUnit=150 -Edge=North -Credits=0 - -[BadGuy] -Allies=BadGuy -MaxBuilding=150 -MaxUnit=150 -Edge=North -Credits=0 - -[Special] -Allies=Special -MaxBuilding=150 -MaxUnit=150 -Edge=North -Credits=0 - -[Multi5] -Allies=Multi5 -MaxBuilding=150 -MaxUnit=150 -Edge=North -Credits=0 - -[Multi6] -Allies=Multi6 -MaxBuilding=150 -MaxUnit=150 -Edge=North -Credits=0 diff --git a/mods/cnc/scm70ea.ini b/mods/cnc/scm70ea.ini deleted file mode 100644 index 6e686d2c5d..0000000000 --- a/mods/cnc/scm70ea.ini +++ /dev/null @@ -1,531 +0,0 @@ -; Scenario 70 control for house Multi1. - -[Basic] -BinaryPart=scm70ea.bin -CarryOverCap=-1 -Percent=0 -CarryOverMoney=100 -BuildLevel=70 -Theme=No theme -Player=Multi3 -Action=LANDING -Lose=GAMEOVER -Win=CONSYARD -Brief=x -Intro=x -Name=Winter Waterland - -[MAP] -Height=62 -Width=62 -Y=1 -X=1 -Theater=WINTER - -[Waypoints] -27=2080 -26=2080 -25=-1 -24=-1 -23=-1 -22=-1 -21=-1 -20=-1 -19=-1 -18=-1 -17=-1 -16=-1 -15=-1 -14=-1 -13=-1 -12=-1 -11=-1 -10=-1 -9=-1 -8=-1 -7=-1 -6=794 -5=1542 -4=312 -3=3831 -2=200 -1=1565 -0=3463 - -[GoodGuy] -Allies=GoodGuy,Neutral -MaxBuilding=150 -MaxUnit=150 -Edge=North -Credits=0 - -[BadGuy] -Allies=BadGuy -MaxBuilding=150 -MaxUnit=150 -Edge=North -Credits=0 - -[Neutral] -Allies=Neutral -MaxBuilding=150 -MaxUnit=150 -Edge=North -Credits=0 - -[Special] -Allies=Special -MaxBuilding=150 -MaxUnit=150 -Edge=North -Credits=0 - -[Multi1] -Allies=Multi1,Multi2,Multi3,Multi4 -MaxBuilding=150 -MaxUnit=150 -Edge=North -Credits=0 - -[Multi2] -Allies=Multi1,Multi2,Multi3,Multi4 -MaxBuilding=150 -MaxUnit=150 -Edge=North -Credits=0 - -[Multi3] -Allies=Multi1,Multi2,Multi3,Multi4 -MaxBuilding=150 -MaxUnit=150 -Edge=North -Credits=0 - -[Multi4] -Allies=Multi1,Multi2,Multi3,Multi4 -MaxBuilding=150 -MaxUnit=150 -Edge=North -Credits=0 - -[Multi5] -Allies=Multi5 -MaxBuilding=150 -MaxUnit=150 -Edge=North -Credits=0 - -[Multi6] -Allies=Multi6 -MaxBuilding=150 -MaxUnit=150 -Edge=North -Credits=0 - -[TERRAIN] -2101=T01,None -1909=T02,None -1848=T01,None -519=TC04,None -402=T16,None -89=T16,None -154=T17,None -413=T15,None -804=T15,None -164=TC01,None -759=T14,None -573=T14,None -488=TC02,None -299=T17,None -109=T17,None -1003=T17,None -993=T17,None -687=T16,None -752=T08,None -486=T08,None -1012=T08,None -1150=T08,None -597=T08,None -1395=T08,None -1326=T10,None -1390=T07,None -1444=T07,None -1575=T07,None -608=T07,None -790=T07,None -915=T07,None -1748=T07,None -1302=T07,None -1241=T05,None -1499=T06,None -2013=T10,None -1753=T10,None -1635=T16,None -1764=T16,None -2023=T15,None -1489=T13,None -921=TC04,None -2478=TC04,None -2801=T01,None -2988=T01,None -1519=T01,None -1212=T01,None -1277=T01,None -1717=T02,None -1902=T03,None -1725=T03,None -2040=T03,None -2301=T03,None -2738=T03,None -2806=T03,None -2620=TC01,None -3252=TC01,None -3513=TC04,None -2459=T01,None -2390=T03,None -2334=T05,None -2596=T06,None -3106=T06,None -3440=T06,None -3569=T06,None -3495=T06,None -3553=T06,None -3945=T10,None -3901=T12,None -3369=T12,None -3879=T12,None -964=T01,None -1226=T02,None -1346=T10,None -1475=T08,None -1422=T08,None -1737=T11,None -1735=T07,None -1864=T07,None -2307=T06,None -2826=T06,None -3085=T06,None -3145=T01,None -3271=T03,None -3457=T10,None -3586=T08,None -3406=T08,None -3409=T06,None -3846=TC04,None -3923=T16,None -3933=T16,None - -[OVERLAY] -4030=TI1 -4029=TI1 -4028=TI1 -4027=TI1 -3996=TI1 -3986=TI1 -3985=TI1 -3984=TI1 -3983=TI1 -3966=TI8 -3964=TI5 -3933=TI9 -3932=TI8 -3923=TI1 -3922=TI1 -3921=TI3 -3920=TI9 -3919=TI8 -3902=TI12 -3901=TI12 -3900=TI6 -3869=TI6 -3868=TI12 -3867=TI12 -3859=TI7 -3858=TI3 -3854=TI11 -3838=TI11 -3837=TI2 -3805=TI1 -3804=TI2 -3803=TI3 -3774=TI10 -3344=TI1 -3343=TI7 -3342=TI11 -3311=TI2 -3310=TI8 -3309=TI9 -3308=TI4 -3307=TI12 -3306=TI11 -3281=TI6 -3280=TI9 -3279=TI5 -3278=TI6 -3277=TI6 -3258=TI9 -3257=TI3 -3256=TI3 -3255=TI11 -3245=TI7 -3244=TI2 -3243=TI12 -3242=TI11 -3241=TI3 -3240=TI1 -3239=TI8 -3217=TI10 -3216=TI2 -3214=TI1 -3213=TI2 -3194=TI1 -3193=TI1 -3192=TI5 -3191=TI4 -3129=TI10 -3128=TI1 -3127=TI12 -3063=TI5 -3015=TI2 -3014=TI12 -3013=TI4 -3011=TI6 -3010=TI12 -3009=TI2 -2961=TI12 -2958=TI8 -2951=TI4 -2950=TI6 -2949=TI11 -2947=TI6 -2946=TI12 -2945=TI9 -2899=TI7 -2897=TI11 -2894=TI7 -2854=TI8 -2849=TI7 -2835=TI2 -2834=TI10 -2833=TI3 -2832=TI11 -2831=TI7 -2791=TI5 -2790=TI6 -2789=TI9 -2788=TI7 -2787=TI5 -2786=TI8 -2785=TI10 -2769=TI12 -2768=TI10 -2724=TI3 -2723=TI2 -2722=TI9 -2659=TI5 -2658=TI12 -2520=TI1 -2519=TI11 -2518=TI6 -2459=TI4 -2458=TI4 -2457=TI10 -2456=TI9 -2455=TI11 -2396=TI4 -2395=TI3 -2394=TI2 -2393=TI10 -2370=TI5 -2369=TI5 -2360=TI7 -2359=TI4 -2307=TI6 -2306=TI12 -2305=TI9 -2296=TI4 -2243=TI5 -2242=TI1 -2241=TI3 -2233=TI12 -2232=TI3 -2179=TI9 -2178=TI4 -2177=TI2 -2170=TI5 -2169=TI2 -2168=TI5 -2139=TI2 -2138=TI8 -2137=TI5 -2113=TI3 -2106=TI6 -2105=TI6 -2075=TI4 -2074=TI4 -2073=TI11 -2072=TI3 -2042=TI5 -2041=TI8 -2009=TI5 -2008=TI2 -2007=TI9 -1943=TI2 -1942=TI11 -1885=TI12 -1884=TI11 -1820=TI5 -1819=TI2 -1755=TI4 -1754=TI10 -1753=TI1 -1752=TI8 -1689=TI12 -1688=TI7 -1649=TI7 -1648=TI9 -1647=TI5 -1646=TI9 -1624=TI10 -1623=TI7 -1598=TI3 -1597=TI1 -1596=TI9 -1595=TI11 -1586=TI8 -1585=TI11 -1584=TI2 -1582=TI11 -1581=TI5 -1575=TI11 -1574=TI2 -1573=TI12 -1533=TI3 -1532=TI1 -1531=TI12 -1522=TI6 -1512=TI10 -1511=TI4 -1510=TI7 -1509=TI4 -1470=TI7 -1469=TI11 -1468=TI2 -1458=TI10 -1448=TI9 -1446=TI2 -1445=TI3 -1444=TI10 -1443=TI8 -1421=TI11 -1406=TI11 -1405=TI4 -1358=TI8 -1357=TI10 -1294=TI9 -1293=TI10 -1230=TI3 -1229=TI8 -1166=TI8 -1165=TI12 -1102=TI7 -1101=TI10 -1062=TI2 -1036=TI11 -1018=TI10 -1017=TI5 -1016=TI12 -998=TI6 -957=TI10 -956=TI3 -955=TI1 -934=TI12 -897=TI3 -894=TI6 -893=TI6 -870=TI6 -837=TI5 -836=TI3 -835=TI10 -834=TI7 -833=TI12 -806=TI11 -805=TI6 -804=TI7 -790=TI2 -789=TI10 -785=TI6 -772=TI11 -771=TI11 -770=TI1 -769=TI1 -741=TI8 -740=TI11 -729=TI11 -728=TI4 -727=TI10 -726=TI7 -725=TI5 -721=TI12 -720=TI11 -708=TI5 -707=TI3 -706=TI1 -677=TI6 -676=TI3 -665=TI6 -664=TI4 -663=TI10 -662=TI10 -661=TI11 -657=TI1 -656=TI9 -612=TI5 -593=TI2 -592=TI8 -529=TI5 -528=TI6 -476=TI2 -475=TI7 -465=TI12 -414=TI1 -413=TI12 -412=TI6 -411=TI11 -410=TI5 -409=TI6 -408=TI6 -407=TI2 -402=TI8 -401=TI12 -343=TI9 -342=TI3 -318=TI12 -317=TI10 -260=TI5 -259=TI6 -254=TI12 -253=TI12 -252=TI7 -196=TI4 -195=TI9 -194=TI10 -193=TI5 -190=TI6 -189=TI6 -188=TI5 -131=TI8 -130=TI9 -129=TI6 -126=TI11 -125=TI9 -124=TI7 -123=TI4 -067=TI10 -066=TI12 -065=TI1 - -[Base] -Count=0 - -[SMUDGE] diff --git a/mods/cnc/sequences-map.xml b/mods/cnc/sequences-map.xml index bc5b10faa9..afaad26eb6 100644 --- a/mods/cnc/sequences-map.xml +++ b/mods/cnc/sequences-map.xml @@ -85,6 +85,10 @@ + + + + @@ -101,6 +105,10 @@ + + + + diff --git a/mods/cnc/trees.yaml b/mods/cnc/trees.yaml index 3007aab123..be37e3b71f 100644 --- a/mods/cnc/trees.yaml +++ b/mods/cnc/trees.yaml @@ -28,6 +28,9 @@ T02: T03: Inherits: ^Tree +T04: + Inherits: ^Tree + T05: Inherits: ^Tree @@ -43,6 +46,12 @@ T08: Footprint: x_ Dimensions: 2,1 +T09: + Inherits: ^Tree + Building: + Footprint: x_ + Dimensions: 2,1 + T10: Inherits: ^Tree Building: From 5c26386b2e24b75a758f2f897bde6a8400113349 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Wed, 3 Mar 2010 22:55:14 +1300 Subject: [PATCH 30/38] Fix map loading; some cleanups --- OpenRA.FileFormats/Map.cs | 10 ++++------ OpenRA.Game/Game.cs | 2 +- OpenRA.Game/Graphics/SequenceProvider.cs | 15 +++++++++------ mods/cnc/mod.yaml | 15 ++------------- mods/cnc/sequences-map.xml | 5 ++++- mods/cnc/trees.yaml | 6 ++++++ 6 files changed, 26 insertions(+), 27 deletions(-) diff --git a/OpenRA.FileFormats/Map.cs b/OpenRA.FileFormats/Map.cs index 9a39786521..4fe92cdbd3 100644 --- a/OpenRA.FileFormats/Map.cs +++ b/OpenRA.FileFormats/Map.cs @@ -53,24 +53,22 @@ namespace OpenRA.FileFormats public string TileSuffix { get { return "." + Truncate(Theater, 3); } } - public Map(string Filename) + public Map(string filename) { - IniFile file = new IniFile(FileSystem.Open(Filename)); + IniFile file = new IniFile(FileSystem.Open(filename)); IniSection basic = file.GetSection("Basic"); Title = basic.GetValue("Name", "(null)"); INIFormat = int.Parse(basic.GetValue("NewINIFormat", "0")); IniSection map = file.GetSection("Map"); - Theater = Truncate(map.GetValue("Theater", "DESERT"), 8); + Theater = Truncate(map.GetValue("Theater", "TEMPERAT"), 8); XOffset = int.Parse(map.GetValue("X", "0")); YOffset = int.Parse(map.GetValue("Y", "0")); Width = int.Parse(map.GetValue("Width", "0")); Height = int.Parse(map.GetValue("Height", "0")); - - Log.Write("Map format is {0}",INIFormat); MapSize = (INIFormat == 3) ? 128 : 64; MapTiles = new TileReference[ MapSize, MapSize ]; @@ -87,7 +85,7 @@ namespace OpenRA.FileFormats } else // CNC { - UnpackCncTileData(FileSystem.Open(Filename.Substring(0,Filename.Length-4)+".bin")); + UnpackCncTileData(FileSystem.Open(filename.Substring(0,filename.Length-4)+".bin")); ReadCncTrees(file); } diff --git a/OpenRA.Game/Game.cs b/OpenRA.Game/Game.cs index c7f1bad197..9a0a770089 100644 --- a/OpenRA.Game/Game.cs +++ b/OpenRA.Game/Game.cs @@ -101,7 +101,7 @@ namespace OpenRA Timer.Time( "ChromeProv, SeqProv, viewport: {0}" ); skipMakeAnims = true; - foreach (var actorReference in Game.world.Map.Actors) + foreach (var actorReference in world.Map.Actors) world.CreateActor(actorReference.Name, actorReference.Location, world.players.Values.FirstOrDefault(p => p.InternalName == actorReference.Owner) ?? world.players[0]); skipMakeAnims = false; Timer.Time( "map actors: {0}" ); diff --git a/OpenRA.Game/Graphics/SequenceProvider.cs b/OpenRA.Game/Graphics/SequenceProvider.cs index e23153074b..6960468f55 100644 --- a/OpenRA.Game/Graphics/SequenceProvider.cs +++ b/OpenRA.Game/Graphics/SequenceProvider.cs @@ -22,6 +22,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Xml; +using System.IO; using OpenRA.FileFormats; namespace OpenRA.Graphics @@ -65,12 +66,14 @@ namespace OpenRA.Graphics static void LoadSequencesForUnit(XmlElement eUnit) { string unitName = eUnit.GetAttribute("name"); - Log.Write("Loading sequence {0}", unitName); - var sequences = eUnit.SelectNodes("./sequence").OfType() - .Select(e => new Sequence(unitName, e)) - .ToDictionary(s => s.Name); - - units.Add(unitName, sequences); + // Log.Write("Loading sequence {0}", unitName); + try { + var sequences = eUnit.SelectNodes("./sequence").OfType() + .Select(e => new Sequence(unitName, e)) + .ToDictionary(s => s.Name); + + units.Add(unitName, sequences); + } catch (FileNotFoundException) {} // Do nothing; we can crash later if we actually wanted art } public static Sequence GetSequence(string unitName, string sequenceName) diff --git a/mods/cnc/mod.yaml b/mods/cnc/mod.yaml index 504c74e4e1..adb0dbd344 100644 --- a/mods/cnc/mod.yaml +++ b/mods/cnc/mod.yaml @@ -18,16 +18,9 @@ Packages: mods/cnc/packages/temperat.mix mods/cnc/packages/winter.mix mods/cnc/packages/desert.mix -# Cannot qualify the RA names because they may live inside a mix +# TODO: Obsolete conquer.mix ~main.mix - redalert.mix - speech.mix - temperat.mix - snow.mix - interior.mix -# general.mix conquer.mix - sounds.mix LegacyRules: mods/cnc/minimal.ini: Minimal rules definitions @@ -47,7 +40,7 @@ Sequences: mods/cnc/sequences-structures.xml: mods/cnc/sequences-vehicles.xml: mods/cnc/sequences-infantry.xml: - mods/cnc/sequences-map.xml: + mods/cnc/sequences-map.xml: Trees etc mods/cnc/sequences.xml: Obsolete; will disappear once done converting Chrome: @@ -56,7 +49,3 @@ Chrome: Assemblies: mods/cnc/OpenRA.Mods.Cnc.dll: Cnc mod traits mods/ra/OpenRA.Mods.RA.dll: Red alert mod traits - -Maps: - scg01ea.ini: GDI Mission 1 - scm01ea.ini: Green Acres diff --git a/mods/cnc/sequences-map.xml b/mods/cnc/sequences-map.xml index afaad26eb6..7c34746e10 100644 --- a/mods/cnc/sequences-map.xml +++ b/mods/cnc/sequences-map.xml @@ -1,6 +1,9 @@  - + + + + diff --git a/mods/cnc/trees.yaml b/mods/cnc/trees.yaml index be37e3b71f..766a6649e9 100644 --- a/mods/cnc/trees.yaml +++ b/mods/cnc/trees.yaml @@ -1,3 +1,9 @@ +SPLIT2: + Inherits: ^Building + RenderBuilding: + Palette: terrain + SeedsOre: + -Selectable: SPLIT3: Inherits: ^Building RenderBuilding: From 5a7ba347eeec14ac81ade78c0e0b88873c27200e Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Thu, 4 Mar 2010 09:35:08 +1300 Subject: [PATCH 31/38] Clean wd for rebase --- OpenRA.FileFormats/Map.cs | 16 ++++++++++++++-- OpenRA.FileFormats/TileReference.cs | 2 +- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/OpenRA.FileFormats/Map.cs b/OpenRA.FileFormats/Map.cs index 4fe92cdbd3..bbe274b8d5 100644 --- a/OpenRA.FileFormats/Map.cs +++ b/OpenRA.FileFormats/Map.cs @@ -170,12 +170,24 @@ namespace OpenRA.FileFormats MapTiles[ j, i ].image = (byte)( i % 4 + ( j % 4 ) * 4 ); } } - + + static string[] overlaySpriteNames = + { + "sbag", "cycl", "brik", "fenc", "wood", + "gold01", "gold02", "gold03", "gold04", + "gem01", "gem02", "gem03", "gem04", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", + "fpls", "wcrate", "scrate", "barb", "sbag", + }; + void UnpackRAOverlayData( MemoryStream ms ) { for( int i = 0 ; i < MapSize ; i++ ) for( int j = 0 ; j < MapSize ; j++ ) - MapTiles[ j, i ].overlay = ReadByte( ms ); + { + byte o = ReadByte( ms ); + MapTiles[ j, i ].overlay = (o == 255) ? null : overlaySpriteNames[o]; + } } void ReadRATrees( IniFile file ) diff --git a/OpenRA.FileFormats/TileReference.cs b/OpenRA.FileFormats/TileReference.cs index e1688bd824..e0397e0fe0 100644 --- a/OpenRA.FileFormats/TileReference.cs +++ b/OpenRA.FileFormats/TileReference.cs @@ -24,7 +24,7 @@ namespace OpenRA.FileFormats { public ushort tile; public byte image; - public byte overlay; + public string overlay; public byte smudge; public override int GetHashCode() { return tile.GetHashCode() ^ image.GetHashCode(); } From 6ad23a191db01919ce80df5b411009d5d1c35668 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Thu, 4 Mar 2010 09:46:21 +1300 Subject: [PATCH 32/38] Resources stuff works with overlay names, not indices --- OpenRA.Game/Traits/World/ResourceType.cs | 4 ++-- OpenRA.Game/Traits/World/WallLoadHook.cs | 6 +++--- mods/ra/rules.yaml | 16 ++++++++-------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/OpenRA.Game/Traits/World/ResourceType.cs b/OpenRA.Game/Traits/World/ResourceType.cs index 79a1e25e92..d2cec0017a 100644 --- a/OpenRA.Game/Traits/World/ResourceType.cs +++ b/OpenRA.Game/Traits/World/ResourceType.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford. * This file is part of OpenRA. @@ -24,7 +24,7 @@ namespace OpenRA.Traits { public class ResourceTypeInfo : ITraitInfo { - public readonly int[] Overlays = { }; + public readonly string[] Overlays = { }; public readonly string[] SpriteNames = { }; public readonly string Palette = "terrain"; diff --git a/OpenRA.Game/Traits/World/WallLoadHook.cs b/OpenRA.Game/Traits/World/WallLoadHook.cs index 806179183e..0d6aaa8c3a 100644 --- a/OpenRA.Game/Traits/World/WallLoadHook.cs +++ b/OpenRA.Game/Traits/World/WallLoadHook.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -7,7 +7,7 @@ namespace OpenRA.Traits { class WallLoadHookInfo : ITraitInfo { - public readonly int[] OverlayIndices = { }; + public readonly string[] OverlayTypes = { }; public readonly string ActorType = "brik"; public object Create(Actor self) { return new WallLoadHook( self, this ); } @@ -27,7 +27,7 @@ namespace OpenRA.Traits for (int y = map.YOffset; y < map.YOffset + map.Height; y++) for (int x = map.XOffset; x < map.XOffset + map.Width; x++) - if (info.OverlayIndices.Contains(w.Map.MapTiles[x, y].overlay)) + if (info.OverlayTypes.Contains(w.Map.MapTiles[x, y].overlay)) w.CreateActor(info.ActorType, new int2(x, y), w.players[0]); // todo: neutral player or null? } } diff --git a/mods/ra/rules.yaml b/mods/ra/rules.yaml index b61de4ae82..6be0b8fb5e 100644 --- a/mods/ra/rules.yaml +++ b/mods/ra/rules.yaml @@ -213,25 +213,25 @@ World: PowerDownButton: WallLoadHook@sbag: ActorType: sbag - OverlayIndices: 0,24 + OverlayTypes: sbag WallLoadHook@cycl: ActorType: cycl - OverlayIndices: 1 + OverlayTypes: cycl WallLoadHook@brik: ActorType: brik - OverlayIndices: 2 + OverlayTypes: brik WallLoadHook@fenc: ActorType: fenc - OverlayIndices: 3 + OverlayTypes: fenc WallLoadHook@wood: ActorType: wood - OverlayIndices: 4 + OverlayTypes: wood WallLoadHook@barb: ActorType: barb - OverlayIndices: 23 + OverlayTypes: barb ResourceLayer: ResourceType@ore: - Overlays: 5,6,7,8 + Overlays: gold01,gold02,gold03,gold04 Palette: terrain SpriteNames: gold01,gold02,gold03,gold04 ValuePerUnit: 25 @@ -239,7 +239,7 @@ World: GrowthInterval: .3 SpreadInterval: .7 ResourceType@gem: - Overlays: 9,10,11,12 + Overlays: gem01,gem02,gem03,gem04 Palette: terrain SpriteNames: gem01,gem02,gem03,gem04 ValuePerUnit: 50 From 1914a8adbe0c7be1cba6976f4cf11e859accfc82 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Thu, 4 Mar 2010 10:17:59 +1300 Subject: [PATCH 33/38] cnc map tib support --- OpenRA.FileFormats/Map.cs | 22 ++++++++++++++++++-- OpenRA.Game/Shroud.cs | 4 +--- OpenRA.Game/Traits/World/ResourceLayer.cs | 6 ++++-- mods/cnc/system.yaml | 25 ++++++++++++++++++++--- mods/cnc/trees.yaml | 6 ++++-- 5 files changed, 51 insertions(+), 12 deletions(-) diff --git a/OpenRA.FileFormats/Map.cs b/OpenRA.FileFormats/Map.cs index bbe274b8d5..c1e9d9db1b 100644 --- a/OpenRA.FileFormats/Map.cs +++ b/OpenRA.FileFormats/Map.cs @@ -86,6 +86,7 @@ namespace OpenRA.FileFormats else // CNC { UnpackCncTileData(FileSystem.Open(filename.Substring(0,filename.Length-4)+".bin")); + ReadCncOverlay(file); ReadCncTrees(file); } @@ -171,7 +172,7 @@ namespace OpenRA.FileFormats } } - static string[] overlaySpriteNames = + static string[] raOverlayNames = { "sbag", "cycl", "brik", "fenc", "wood", "gold01", "gold02", "gold03", "gold04", @@ -186,7 +187,7 @@ namespace OpenRA.FileFormats for( int j = 0 ; j < MapSize ; j++ ) { byte o = ReadByte( ms ); - MapTiles[ j, i ].overlay = (o == 255) ? null : overlaySpriteNames[o]; + MapTiles[ j, i ].overlay = (o == 255) ? null : raOverlayNames[o]; } } @@ -215,7 +216,24 @@ namespace OpenRA.FileFormats MapTiles[ j, i ].image = (byte)( i % 4 + ( j % 4 ) * 4 ); } } + + void ReadCncOverlay( IniFile file ) + { + IniSection overlay = file.GetSection( "OVERLAY", true ); + if( overlay == null ) + return; + + foreach( KeyValuePair kv in overlay ) + { + var loc = int.Parse( kv.Key ); + int2 cell = new int2(loc % MapSize, loc / MapSize); + Log.Write("Overlay {0} at ({1},{2})",kv.Value,cell.X,cell.Y); + MapTiles[ cell.X, cell.Y ].overlay = kv.Value.ToLower(); + } + } + + void ReadCncTrees( IniFile file ) { IniSection terrain = file.GetSection( "TERRAIN", true ); diff --git a/OpenRA.Game/Shroud.cs b/OpenRA.Game/Shroud.cs index cca332c978..d074091040 100644 --- a/OpenRA.Game/Shroud.cs +++ b/OpenRA.Game/Shroud.cs @@ -34,9 +34,7 @@ namespace OpenRA Sprite[] shadowBits = SpriteSheetBuilder.LoadAllSprites("shadow"); Sprite[,] sprites = new Sprite[128, 128]; bool dirty = true; - - // TODO: Testing - bool hasGPS = true; + bool hasGPS = false; Player owner; Map map; public Rectangle? bounds; diff --git a/OpenRA.Game/Traits/World/ResourceLayer.cs b/OpenRA.Game/Traits/World/ResourceLayer.cs index 8797ce3336..4ec36e9a9b 100644 --- a/OpenRA.Game/Traits/World/ResourceLayer.cs +++ b/OpenRA.Game/Traits/World/ResourceLayer.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford. * This file is part of OpenRA. @@ -35,7 +35,7 @@ namespace OpenRA.Traits World w; public ResourceTypeInfo[] resourceTypes; - CellContents[,] content = new CellContents[128, 128]; + CellContents[,] content; public ResourceLayer(Actor self) { @@ -65,6 +65,8 @@ namespace OpenRA.Traits public void WorldLoaded(World w) { this.w = w; + content = new CellContents[w.Map.MapSize, w.Map.MapSize]; + resourceTypes = w.WorldActor.Info.Traits.WithInterface().ToArray(); foreach (var rt in resourceTypes) rt.Sprites = rt.SpriteNames.Select(a => SpriteSheetBuilder.LoadAllSprites(a)).ToArray(); diff --git a/mods/cnc/system.yaml b/mods/cnc/system.yaml index a819443999..c224da4140 100644 --- a/mods/cnc/system.yaml +++ b/mods/cnc/system.yaml @@ -177,12 +177,31 @@ World: Race: nod SellButton: RepairButton: + ChoosePaletteOnSelect: + WallLoadHook@sbag: + ActorType: sbag + OverlayTypes: sbag + WallLoadHook@cycl: + ActorType: cycl + OverlayTypes: cycl + WallLoadHook@brik: + ActorType: brik + OverlayTypes: brik + WallLoadHook@fenc: + ActorType: fenc + OverlayTypes: fenc + WallLoadHook@wood: + ActorType: wood + OverlayTypes: wood + WallLoadHook@barb: + ActorType: barb + OverlayTypes: barb ResourceLayer: ResourceType@green-tib: - Overlays: 5,6,7,8,9,10,11,12 + Overlays: ti1,ti2,ti3,ti4,ti5,ti6,ti7,ti8,ti9,ti10,ti11,ti12 Palette: player SpriteNames: ti1,ti2,ti3,ti4,ti5,ti6,ti7,ti8,ti9,ti10,ti11,ti12 ValuePerUnit: 30 Name: Tiberium - GrowthInterval: .1 - SpreadInterval: .1 + GrowthInterval: 1 + SpreadInterval: 6 diff --git a/mods/cnc/trees.yaml b/mods/cnc/trees.yaml index 766a6649e9..68abcec4ec 100644 --- a/mods/cnc/trees.yaml +++ b/mods/cnc/trees.yaml @@ -2,13 +2,15 @@ SPLIT2: Inherits: ^Building RenderBuilding: Palette: terrain - SeedsOre: + SeedsResource: + ResourceType:Tiberium -Selectable: SPLIT3: Inherits: ^Building RenderBuilding: Palette: terrain - SeedsOre: + SeedsResource: + ResourceType:Tiberium -Selectable: ROCK1: Inherits: ^Tree From 724928cf56837f0fb35fcb998ec0c0ae492fbc97 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Thu, 4 Mar 2010 18:26:43 +1300 Subject: [PATCH 34/38] Theater definitions in yaml --- OpenRA.FileFormats/Map.cs | 2 -- OpenRA.FileFormats/TileSet.cs | 12 +++++------ OpenRA.FileFormats/Walkability.cs | 4 ++-- OpenRA.Game/Chrome.cs | 4 +++- OpenRA.Game/OpenRA.Game.csproj | 1 + OpenRA.Game/Traits/World/Theater.cs | 32 +++++++++++++++++++++++++++++ OpenRA.Game/World.cs | 9 +++++--- mods/cnc/system.yaml | 18 ++++++++++++++++ mods/cnc/vehicles.yaml | 2 +- mods/ra/rules.yaml | 14 ++++++++++++- 10 files changed, 82 insertions(+), 16 deletions(-) create mode 100644 OpenRA.Game/Traits/World/Theater.cs diff --git a/OpenRA.FileFormats/Map.cs b/OpenRA.FileFormats/Map.cs index c1e9d9db1b..a02ede172c 100644 --- a/OpenRA.FileFormats/Map.cs +++ b/OpenRA.FileFormats/Map.cs @@ -51,8 +51,6 @@ namespace OpenRA.FileFormats return s.Length <= maxLength ? s : s.Substring(0,maxLength ); } - public string TileSuffix { get { return "." + Truncate(Theater, 3); } } - public Map(string filename) { IniFile file = new IniFile(FileSystem.Open(filename)); diff --git a/OpenRA.FileFormats/TileSet.cs b/OpenRA.FileFormats/TileSet.cs index 14349d633b..eb6ca1d4bb 100644 --- a/OpenRA.FileFormats/TileSet.cs +++ b/OpenRA.FileFormats/TileSet.cs @@ -28,7 +28,7 @@ namespace OpenRA.FileFormats { public readonly Dictionary tiles = new Dictionary(); - public readonly Walkability Walkability = new Walkability(); + public readonly Walkability Walkability; public readonly Dictionary walk = new Dictionary(); @@ -46,12 +46,12 @@ namespace OpenRA.FileFormats return ret; } - public TileSet( string suffix ) + public TileSet( string tilesetFile, string templatesFile, string suffix ) { - Walkability = new Walkability(); + Walkability = new Walkability(templatesFile); - char tileSetChar = char.ToUpperInvariant( suffix[ 1 ] ); - StreamReader tileIdFile = new StreamReader( FileSystem.Open( "tileSet.til" ) ); + char tileSetChar = char.ToUpperInvariant( suffix[ 0 ] ); + StreamReader tileIdFile = new StreamReader( FileSystem.Open(tilesetFile) ); while( true ) { @@ -74,7 +74,7 @@ namespace OpenRA.FileFormats if (!walk.ContainsKey((ushort)(start + i))) walk.Add((ushort)(start + i), Walkability.GetWalkability(tilename)); - using( Stream s = FileSystem.Open( tilename + suffix ) ) + using( Stream s = FileSystem.Open( tilename + "." + suffix ) ) { if( !tiles.ContainsKey( (ushort)( start + i ) ) ) tiles.Add( (ushort)( start + i ), new Terrain( s ) ); diff --git a/OpenRA.FileFormats/Walkability.cs b/OpenRA.FileFormats/Walkability.cs index 1d99ecf3d4..3469ab71da 100644 --- a/OpenRA.FileFormats/Walkability.cs +++ b/OpenRA.FileFormats/Walkability.cs @@ -38,9 +38,9 @@ namespace OpenRA.FileFormats Dictionary walkability = new Dictionary(); - public Walkability() + public Walkability(string templatesFile) { - var file = new IniFile( FileSystem.Open( "templates.ini" ) ); + var file = new IniFile( FileSystem.Open( templatesFile ) ); foreach (var section in file.Sections) { diff --git a/OpenRA.Game/Chrome.cs b/OpenRA.Game/Chrome.cs index fd4f86ea5a..31d4e9985f 100644 --- a/OpenRA.Game/Chrome.cs +++ b/OpenRA.Game/Chrome.cs @@ -339,7 +339,9 @@ namespace OpenRA DrawCentered("Size: {0}x{1}".F(currentMap.Map.Width, currentMap.Map.Height), new int2(mapRect.Left + mapRect.Width / 2, y), Color.White); y += 20; - DrawCentered("Theater: {0}".F(currentMap.Map.Theater, currentMap.Map.Height), + + TheaterInfo theaterInfo = Game.world.WorldActor.Info.Traits.WithInterface().Where(t => t.Theater == currentMap.Map.Theater).FirstOrDefault(); + DrawCentered("Theater: {0}".F(theaterInfo.Name, currentMap.Map.Height), new int2(mapRect.Left + mapRect.Width / 2, y), Color.White); y += 20; DrawCentered("Spawnpoints: {0}".F(currentMap.Map.SpawnPoints.Count()), diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj index 7671f0c818..ae61fd5e55 100644 --- a/OpenRA.Game/OpenRA.Game.csproj +++ b/OpenRA.Game/OpenRA.Game.csproj @@ -269,6 +269,7 @@ + diff --git a/OpenRA.Game/Traits/World/Theater.cs b/OpenRA.Game/Traits/World/Theater.cs new file mode 100644 index 0000000000..b34e802e8d --- /dev/null +++ b/OpenRA.Game/Traits/World/Theater.cs @@ -0,0 +1,32 @@ +#region Copyright & License Information +/* + * Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford. + * This file is part of OpenRA. + * + * OpenRA is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * OpenRA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenRA. If not, see . + */ +#endregion + +namespace OpenRA.Traits +{ + class TheaterInfo : StatelessTraitInfo + { + public readonly string Name = null; + public readonly string Theater = null; + public readonly string Suffix = null; + public readonly string Tileset = null; + public readonly string Templates = null; + } + class Theater {} +} diff --git a/OpenRA.Game/World.cs b/OpenRA.Game/World.cs index 0657173785..7fa2019793 100644 --- a/OpenRA.Game/World.cs +++ b/OpenRA.Game/World.cs @@ -59,8 +59,7 @@ namespace OpenRA Game.IssueOrder(Order.Chat("/name " + Game.Settings.PlayerName)); } - public readonly Actor WorldActor; - + public readonly Actor WorldActor; public readonly PathFinder PathFinder; public readonly Map Map; @@ -75,9 +74,13 @@ namespace OpenRA public World() { Timer.Time( "----World.ctor" ); + Map = new Map( Game.LobbyInfo.GlobalSettings.Map ); Timer.Time( "new Map: {0}" ); - TileSet = new TileSet( Map.TileSuffix ); + + TheaterInfo theaterInfo = Rules.Info["world"].Traits.WithInterface().Where(t => t.Theater == Map.Theater).FirstOrDefault(); + TileSet = new TileSet(theaterInfo.Tileset, theaterInfo.Templates, theaterInfo.Suffix); + SpriteSheetBuilder.Initialize( Map ); Timer.Time( "Tileset: {0}" ); diff --git a/mods/cnc/system.yaml b/mods/cnc/system.yaml index c224da4140..a9dbac63b3 100644 --- a/mods/cnc/system.yaml +++ b/mods/cnc/system.yaml @@ -205,3 +205,21 @@ World: Name: Tiberium GrowthInterval: 1 SpreadInterval: 6 + Theater@DESERT: + Name:Desert + Theater:DESERT + Suffix:des + Templates:templates.ini + Tileset:tileSet.til + Theater@WINTER: + Name:Winter + Theater:WINTER + Suffix:win + Templates:templates.ini + Tileset:tileSet.til + Theater@TEMPERAT: + Name:Temperate + Theater:TEMPERAT + Suffix:tem + Templates:templates.ini + Tileset:tileSet.til \ No newline at end of file diff --git a/mods/cnc/vehicles.yaml b/mods/cnc/vehicles.yaml index ff84a70e6a..6c54f1be46 100644 --- a/mods/cnc/vehicles.yaml +++ b/mods/cnc/vehicles.yaml @@ -21,7 +21,7 @@ MCV: Offset:-1,-1 DeployDirections: 96 TransformSounds: constru2.aud, hvydoor1.aud - NoTransformSounds: nodeply1.aud + NoTransformSounds: deploy1.aud RenderUnit: HARV: diff --git a/mods/ra/rules.yaml b/mods/ra/rules.yaml index 6be0b8fb5e..a405bd3085 100644 --- a/mods/ra/rules.yaml +++ b/mods/ra/rules.yaml @@ -244,7 +244,19 @@ World: SpriteNames: gem01,gem02,gem03,gem04 ValuePerUnit: 50 Name: Gems - + Theater@SNOW: + Name:Snow + Theater:SNOW + Suffix:sno + Templates:templates.ini + Tileset:tileSet.til + Theater@TEMPERAT: + Name:Temperate + Theater:TEMPERAT + Suffix:tem + Templates:templates.ini + Tileset:tileSet.til + MGG: GeneratesGap: Range: 10 From 65783c369a9949f2832a7f2fdaafd5264d51353e Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Thu, 4 Mar 2010 19:35:21 +1300 Subject: [PATCH 35/38] Remove hardcoded limitation on mapsize everywhere except minimap --- OpenRA.FileFormats/Map.cs | 5 ++++ OpenRA.Game/PathSearch.cs | 8 ++--- OpenRA.Game/Shroud.cs | 29 ++++++++++++------- OpenRA.Game/Traits/World/BuildingInfluence.cs | 26 +++++++++-------- OpenRA.Game/Traits/World/ResourceLayer.cs | 4 +-- OpenRA.Game/Traits/World/UnitInfluence.cs | 8 +++-- OpenRA.Game/World.cs | 3 +- 7 files changed, 51 insertions(+), 32 deletions(-) diff --git a/OpenRA.FileFormats/Map.cs b/OpenRA.FileFormats/Map.cs index a02ede172c..b1d631bb97 100644 --- a/OpenRA.FileFormats/Map.cs +++ b/OpenRA.FileFormats/Map.cs @@ -256,6 +256,11 @@ namespace OpenRA.FileFormats } } + public bool IsInMap(int2 xy) + { + return IsInMap(xy.X,xy.Y); + } + public bool IsInMap(int x, int y) { return (x >= XOffset && y >= YOffset && x < XOffset + Width && y < YOffset + Height); diff --git a/OpenRA.Game/PathSearch.cs b/OpenRA.Game/PathSearch.cs index 6297b2d7a6..7f94aed315 100755 --- a/OpenRA.Game/PathSearch.cs +++ b/OpenRA.Game/PathSearch.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford. * This file is part of OpenRA. @@ -160,9 +160,9 @@ namespace OpenRA static CellInfo[ , ] InitCellInfo() { - var cellInfo = new CellInfo[ 128, 128 ]; - for( int x = 0 ; x < 128 ; x++ ) - for( int y = 0 ; y < 128 ; y++ ) + var cellInfo = new CellInfo[ Game.world.Map.MapSize, Game.world.Map.MapSize ]; + for( int x = 0 ; x < Game.world.Map.MapSize ; x++ ) + for( int y = 0 ; y < Game.world.Map.MapSize ; y++ ) cellInfo[ x, y ] = new CellInfo( float.PositiveInfinity, new int2( x, y ), false ); return cellInfo; } diff --git a/OpenRA.Game/Shroud.cs b/OpenRA.Game/Shroud.cs index d074091040..adb778e711 100644 --- a/OpenRA.Game/Shroud.cs +++ b/OpenRA.Game/Shroud.cs @@ -30,22 +30,31 @@ namespace OpenRA { public class Shroud { - bool[,] explored = new bool[128, 128]; + bool[,] explored; Sprite[] shadowBits = SpriteSheetBuilder.LoadAllSprites("shadow"); - Sprite[,] sprites = new Sprite[128, 128]; + Sprite[,] sprites; + int gapOpaqueTicks = (int)(Rules.General.GapRegenInterval * 25 * 60); + int gapTicks; + int[,] gapField; + bool[,] gapActive; + bool dirty = true; bool hasGPS = false; Player owner; Map map; public Rectangle? bounds; - public Shroud(Player owner, Map map) { this.owner = owner; this.map = map; } - - int gapOpaqueTicks = (int)(Rules.General.GapRegenInterval * 25 * 60); - int gapTicks; - int[,] gapField = new int[128, 128]; - bool[,] gapActive = new bool[128, 128]; - + public Shroud(Player owner, Map map) + { + this.owner = owner; + this.map = map; + + explored = new bool[map.MapSize, map.MapSize]; + sprites = new Sprite[map.MapSize, map.MapSize]; + gapField = new int[map.MapSize, map.MapSize]; + gapActive = new bool[map.MapSize, map.MapSize]; + } + public bool HasGPS { get { return hasGPS; } @@ -57,7 +66,7 @@ namespace OpenRA if (gapTicks > 0) { --gapTicks; return; } // Clear active flags - gapActive = new bool[128, 128]; + gapActive = new bool[map.MapSize, map.MapSize]; foreach (var a in world.Queries.WithTrait().Where(a => owner != a.Actor.Owner)) foreach (var t in a.Trait.GetShroudedTiles()) { diff --git a/OpenRA.Game/Traits/World/BuildingInfluence.cs b/OpenRA.Game/Traits/World/BuildingInfluence.cs index 342d35419d..04b7ca89d4 100644 --- a/OpenRA.Game/Traits/World/BuildingInfluence.cs +++ b/OpenRA.Game/Traits/World/BuildingInfluence.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford. * This file is part of OpenRA. @@ -19,6 +19,7 @@ #endregion using OpenRA.GameRules; +using OpenRA.FileFormats; namespace OpenRA.Traits { @@ -29,11 +30,17 @@ namespace OpenRA.Traits public class BuildingInfluence { - bool[,] blocked = new bool[128, 128]; - Actor[,] influence = new Actor[128, 128]; + bool[,] blocked; + Actor[,] influence; + Map map; public BuildingInfluence( Actor self ) { + map = self.World.Map; + + blocked = new bool[map.MapSize, map.MapSize]; + influence = new Actor[map.MapSize, map.MapSize]; + self.World.ActorAdded += a => { if (a.traits.Contains()) ChangeInfluence(a, a.traits.Get(), true); }; @@ -45,27 +52,22 @@ namespace OpenRA.Traits void ChangeInfluence( Actor a, Building building, bool isAdd ) { foreach( var u in Footprint.UnpathableTiles( a.Info.Name, a.Info.Traits.Get(), a.Location ) ) - if( IsValid( u ) ) + if( map.IsInMap( u ) ) blocked[ u.X, u.Y ] = isAdd; foreach( var u in Footprint.Tiles( a.Info.Name, a.Info.Traits.Get(), a.Location ) ) - if( IsValid( u ) ) + if( map.IsInMap( u ) ) influence[ u.X, u.Y ] = isAdd ? a : null; } - bool IsValid(int2 t) - { - return !(t.X < 0 || t.Y < 0 || t.X >= 128 || t.Y >= 128); - } - public Actor GetBuildingAt(int2 cell) { - if (!IsValid(cell)) return null; + if (!map.IsInMap(cell)) return null; return influence[cell.X, cell.Y]; } public bool CanMoveHere(int2 cell) { - return IsValid(cell) && !blocked[cell.X, cell.Y]; + return map.IsInMap(cell) && !blocked[cell.X, cell.Y]; } }} diff --git a/OpenRA.Game/Traits/World/ResourceLayer.cs b/OpenRA.Game/Traits/World/ResourceLayer.cs index 4ec36e9a9b..fed87dbf99 100644 --- a/OpenRA.Game/Traits/World/ResourceLayer.cs +++ b/OpenRA.Game/Traits/World/ResourceLayer.cs @@ -152,7 +152,7 @@ namespace OpenRA.Traits var mini = map.XOffset; var maxi = map.XOffset + map.Width; var minj = map.YOffset; var maxj = map.YOffset + map.Height; - var newDensity = new byte[128, 128]; + var newDensity = new byte[map.MapSize, map.MapSize]; for (int j = minj; j < maxj; j++) for (int i = mini; i < maxi; i++) if (content[i, j].type == info) @@ -171,7 +171,7 @@ namespace OpenRA.Traits var mini = map.XOffset; var maxi = map.XOffset + map.Width; var minj = map.YOffset; var maxj = map.YOffset + map.Height; - var growMask = new bool[128, 128]; + var growMask = new bool[map.MapSize, map.MapSize]; for (int j = minj; j < maxj; j++) for (int i = mini; i < maxi; i++) if (content[i,j].type == null diff --git a/OpenRA.Game/Traits/World/UnitInfluence.cs b/OpenRA.Game/Traits/World/UnitInfluence.cs index 7d2eff0287..a3be7ef6a6 100644 --- a/OpenRA.Game/Traits/World/UnitInfluence.cs +++ b/OpenRA.Game/Traits/World/UnitInfluence.cs @@ -32,12 +32,14 @@ namespace OpenRA.Traits public class UnitInfluence : ITick { - List[,] influence = new List[128, 128]; + List[,] influence; public UnitInfluence( Actor self ) { - for (int i = 0; i < self.World.Map.MapSize; i++) - for (int j = 0; j < self.World.Map.MapSize; j++) + int size = self.World.Map.MapSize; + influence = new List[size, size]; + for (int i = 0; i < size; i++) + for (int j = 0; j < size; j++) influence[ i, j ] = new List(); self.World.ActorRemoved += a => Remove( a, a.traits.GetOrDefault() ); diff --git a/OpenRA.Game/World.cs b/OpenRA.Game/World.cs index 7fa2019793..9e23c58330 100644 --- a/OpenRA.Game/World.cs +++ b/OpenRA.Game/World.cs @@ -66,7 +66,7 @@ namespace OpenRA public readonly TileSet TileSet; // for tricky things like bridges. - public readonly ICustomTerrain[,] customTerrain = new ICustomTerrain[128, 128]; + public readonly ICustomTerrain[,] customTerrain; public readonly WorldRenderer WorldRenderer; internal readonly Minimap Minimap; @@ -76,6 +76,7 @@ namespace OpenRA Timer.Time( "----World.ctor" ); Map = new Map( Game.LobbyInfo.GlobalSettings.Map ); + customTerrain = new ICustomTerrain[Map.MapSize, Map.MapSize]; Timer.Time( "new Map: {0}" ); TheaterInfo theaterInfo = Rules.Info["world"].Traits.WithInterface().Where(t => t.Theater == Map.Theater).FirstOrDefault(); From 399d2f73e8d1640bfde14573de11f07c84bbd162 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Thu, 4 Mar 2010 20:57:55 +1300 Subject: [PATCH 36/38] Fix minimap size/render issues (still needs palette fix). --- OpenRA.FileFormats/Map.cs | 1 + OpenRA.Game/Chrome.cs | 9 +++++---- OpenRA.Game/Graphics/Minimap.cs | 11 +++++------ 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/OpenRA.FileFormats/Map.cs b/OpenRA.FileFormats/Map.cs index b1d631bb97..fdf7b65fc2 100644 --- a/OpenRA.FileFormats/Map.cs +++ b/OpenRA.FileFormats/Map.cs @@ -93,6 +93,7 @@ namespace OpenRA.FileFormats LoadActors(file, "INFANTRY"); SpawnPoints = file.GetSection("Waypoints") + .Where(kv => int.Parse(kv.Value) > 0) .Select(kv => Pair.New(int.Parse(kv.Key), new int2(int.Parse(kv.Value) % MapSize, int.Parse(kv.Value) / MapSize))) .Where(a => a.First < 8) .Select(a => a.Second) diff --git a/OpenRA.Game/Chrome.cs b/OpenRA.Game/Chrome.cs index 31d4e9985f..41d313cece 100644 --- a/OpenRA.Game/Chrome.cs +++ b/OpenRA.Game/Chrome.cs @@ -139,8 +139,6 @@ namespace OpenRA ready = new Animation("pips"); ready.PlayRepeating("ready"); clock = new Animation("clock"); - - mapChooserSheet = new Sheet(r, new Size(128, 128)); } List visibleTabs = new List(); @@ -301,6 +299,9 @@ namespace OpenRA if (mapPreviewDirty) { + if (mapChooserSheet == null || mapChooserSheet.Size.Width != currentMap.Map.MapSize) + mapChooserSheet = new Sheet(renderer, new Size(currentMap.Map.MapSize, currentMap.Map.MapSize)); + var b = Minimap.RenderTerrainBitmapWithSpawnPoints(currentMap.Map, Game.world.TileSet); // tileset -> hack mapChooserSheet.Texture.SetData(b); mapChooserSprite = new Sprite(mapChooserSheet, @@ -427,8 +428,8 @@ namespace OpenRA DrawDialogBackground(r, "dialog"); DrawCentered("OpenRA Multiplayer Lobby", new int2(r.Left + w / 2, r.Top + 20), Color.White); - DrawDialogBackground(new Rectangle(r.Right - 324, r.Top + 43, 304, 244),"dialog2"); - var minimapRect = new Rectangle(r.Right - 322, r.Top + 45, 300, 240); + DrawDialogBackground(new Rectangle(r.Right - 264, r.Top + 43, 244, 244),"dialog2"); + var minimapRect = new Rectangle(r.Right - 262, r.Top + 45, 240, 240); world.Minimap.Update(); world.Minimap.Draw(minimapRect, true); diff --git a/OpenRA.Game/Graphics/Minimap.cs b/OpenRA.Game/Graphics/Minimap.cs index 156c30f94c..76efa6d24b 100644 --- a/OpenRA.Game/Graphics/Minimap.cs +++ b/OpenRA.Game/Graphics/Minimap.cs @@ -47,8 +47,8 @@ namespace OpenRA.Graphics public Minimap(World world, Renderer r) { this.world = world; - sheet = new Sheet(r, new Size(128, 128)); - mapOnlySheet = new Sheet(r, new Size(128, 128)); + sheet = new Sheet(r, new Size(world.Map.MapSize, world.Map.MapSize)); + mapOnlySheet = new Sheet(r, new Size(world.Map.MapSize, world.Map.MapSize)); lineRenderer = new LineRenderer(r); rgbaRenderer = new SpriteRenderer(r, true, r.RgbaSpriteShader); @@ -105,14 +105,13 @@ namespace OpenRA.Graphics public static Bitmap RenderTerrainBitmapWithSpawnPoints(Map map, TileSet tileset) { /* todo: do this a bit nicer */ - var terrain = RenderTerrainBitmap(map, tileset); - //foreach (var sp in map.SpawnPoints) - // terrain.SetPixel(sp.X, sp.Y, Color.White); + foreach (var sp in map.SpawnPoints) + terrain.SetPixel(sp.X, sp.Y, Color.White); return terrain; } - + public void Update() { if (terrain == null) From 2edb672873e56b5034ed636acc1d0461a3b8e7ec Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Thu, 4 Mar 2010 21:13:21 +1300 Subject: [PATCH 37/38] Fix nits --- OpenRA.Game/Chrome.cs | 2 +- OpenRA.Game/World.cs | 2 +- mods/ra/rules.yaml | 6 ++++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/OpenRA.Game/Chrome.cs b/OpenRA.Game/Chrome.cs index 41d313cece..530ba350b5 100644 --- a/OpenRA.Game/Chrome.cs +++ b/OpenRA.Game/Chrome.cs @@ -341,7 +341,7 @@ namespace OpenRA new int2(mapRect.Left + mapRect.Width / 2, y), Color.White); y += 20; - TheaterInfo theaterInfo = Game.world.WorldActor.Info.Traits.WithInterface().Where(t => t.Theater == currentMap.Map.Theater).FirstOrDefault(); + var theaterInfo = Game.world.WorldActor.Info.Traits.WithInterface().FirstOrDefault(t => t.Theater == currentMap.Map.Theater); DrawCentered("Theater: {0}".F(theaterInfo.Name, currentMap.Map.Height), new int2(mapRect.Left + mapRect.Width / 2, y), Color.White); y += 20; diff --git a/OpenRA.Game/World.cs b/OpenRA.Game/World.cs index 9e23c58330..3adca8c670 100644 --- a/OpenRA.Game/World.cs +++ b/OpenRA.Game/World.cs @@ -79,7 +79,7 @@ namespace OpenRA customTerrain = new ICustomTerrain[Map.MapSize, Map.MapSize]; Timer.Time( "new Map: {0}" ); - TheaterInfo theaterInfo = Rules.Info["world"].Traits.WithInterface().Where(t => t.Theater == Map.Theater).FirstOrDefault(); + var theaterInfo = Rules.Info["world"].Traits.WithInterface().FirstOrDefault(t => t.Theater == Map.Theater); TileSet = new TileSet(theaterInfo.Tileset, theaterInfo.Templates, theaterInfo.Suffix); SpriteSheetBuilder.Initialize( Map ); diff --git a/mods/ra/rules.yaml b/mods/ra/rules.yaml index a405bd3085..3227495bdb 100644 --- a/mods/ra/rules.yaml +++ b/mods/ra/rules.yaml @@ -256,6 +256,12 @@ World: Suffix:tem Templates:templates.ini Tileset:tileSet.til + Theater@INTERIOR: + Name:Interior + Theater:INTERIOR + Suffix:int + Templates:templates.ini + Tileset:tileSet.til MGG: GeneratesGap: From 1b908129dbf54bfa0b63cf14fff8ec33d162e440 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Thu, 4 Mar 2010 21:15:24 +1300 Subject: [PATCH 38/38] Kill obsoleted files --- mods/cnc/bogus.SNO | Bin 619 -> 0 bytes mods/cnc/snow_ra.pal | Bin 768 -> 0 bytes mods/cnc/ti1.tem | Bin 1831 -> 0 bytes mods/cnc/ti10.tem | Bin 1833 -> 0 bytes mods/cnc/ti11.tem | Bin 1441 -> 0 bytes mods/cnc/ti12.tem | Bin 1389 -> 0 bytes mods/cnc/ti2.tem | Bin 1555 -> 0 bytes mods/cnc/ti3.tem | Bin 1123 -> 0 bytes mods/cnc/ti4.tem | Bin 1491 -> 0 bytes mods/cnc/ti5.tem | Bin 1515 -> 0 bytes mods/cnc/ti6.tem | Bin 1717 -> 0 bytes mods/cnc/ti7.tem | Bin 1532 -> 0 bytes mods/cnc/ti8.tem | Bin 1415 -> 0 bytes mods/cnc/ti9.tem | Bin 1184 -> 0 bytes 14 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 mods/cnc/bogus.SNO delete mode 100644 mods/cnc/snow_ra.pal delete mode 100644 mods/cnc/ti1.tem delete mode 100644 mods/cnc/ti10.tem delete mode 100644 mods/cnc/ti11.tem delete mode 100644 mods/cnc/ti12.tem delete mode 100644 mods/cnc/ti2.tem delete mode 100644 mods/cnc/ti3.tem delete mode 100644 mods/cnc/ti4.tem delete mode 100644 mods/cnc/ti5.tem delete mode 100644 mods/cnc/ti6.tem delete mode 100644 mods/cnc/ti7.tem delete mode 100644 mods/cnc/ti8.tem delete mode 100644 mods/cnc/ti9.tem diff --git a/mods/cnc/bogus.SNO b/mods/cnc/bogus.SNO deleted file mode 100644 index db18593048cc571b13781f323f9c715cab3f15ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 619 wcmb1OkYHeBU;tu9hHNGV1`Qw^1bX<3buxkcEFjJRV*61r8UhrA00RRD00@kc3;+NC diff --git a/mods/cnc/snow_ra.pal b/mods/cnc/snow_ra.pal deleted file mode 100644 index bb63fcdd50490a6ace83199cf15196a1e551c57e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 768 zcmWlX>5{7;5QV#v78wGj7yAT)^T#DeE+w)r215IPWK<`0|4kh^=V|qs}{yR z)(Lb-lJ&FKUJv_zUDw@qyWJUvvA0aqv~1gUJjZc7*Y*7nAt!YFz;OeFbVv?icwh&#yrBF(A>NpHXDaS@#I@Nd0Wgd^`;d&jf%X9gAl*_evOxb)+ z$By(3u4P>FKolrvh+r4Tb`)C3H+|P|tPP!Cw7b&dNO||^+K;aZ;Qrmtqq_9sd@8#- zS6`{jlPZngKhM`~zFp3juIXx_szMa3APJ3v6y7y}eu4 z)B1pQgjK@N@^`!cj?=5{uSa#M#E|ipWGciGMU@wD2j!NV?p?gK!j0jJZs6*~z9i0h zNKzEVw&xp`9oAJKIO4gPr+X5cL9q3Gu&nX9R@1*wEl&Bg@ogWD#^JQ{VI`+=<421MGttfJm#3KaJG+4McgwbUjL!$r4d*--dZq?v2kL<%M@&DJ5_%NyR-(sMkoajRoD z5YL$bs8kwTd=SuCEE2bg3Y35Fe~312&br%(YRyk?%-UOsHrn~7`(H%0&0hDX--hTd zdZ|PoD=XCllCrWA|Cyw_&M7f%ieAdRO6bOGjK@aHlrGYL*p!{4Z-0r|y{ZUUP(_0C zvYHqN9Q}gbQGF$swJjZ&G+)KMq{VSWfyDtjy08S+yU-`B1nvZmg7Qt!xPW>$q(+B^8r_v8lIzh2Z#4X&TIijtUlm(9w6kq&NkrYMS^a|V3GWg9Fg$n zKai|QBt*RR5ENS@PR6 zAcil_+I4rURU?trMrqP-)uG{ui4ZSpevRM_3e$AGfKt{6*PAxOrj8Wf-EAySLcTw; zRyU*d$w_R+VHqek?e0mOt716PCsl1S201KP9L8cXD60;pTT<&XiOpgc1NF8Njizb^ zWwtIglNmFz5NIFn>(ynoja9uu!B#uQpi)wT{%e`%VAq<8W(Bm*roW!k-T zE|89tT7^OzyA7kCm>Bvx`ip93xh_kZJsLe$FX|~}58Lx*QI8rdYRaNEn=)9+)0|N= zRVfA?GsO)yj&aThYop^vG-dAbvh&RLdz~3fDk*24g~NxX{#n;FQ?jhIJH7(1C;$?J zb-la-A*q*|EC0&k6*E5AXx28}_uX9o(D&M<7gzB{%k`&+WT%UF5XNdH5_kiBMfyB4 z#&9>E+Jaqts{MG)huvys%&Gx-HPW&Tscv?WaR2aZYerVT5w?r4OR7`#+)}VA|MslO zIxc3U*4~?W96|H<{gggzN~s&BIn#0GgW<3|++(ud{W_sCbh;;N|7)C diff --git a/mods/cnc/ti10.tem b/mods/cnc/ti10.tem deleted file mode 100644 index 455ae272bcbaf3686cf05150174f547f70765aaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1833 zcmaJ>Z){Ul6um0PEu)-pV-^LeXmzh_5*VLHkrTlrdrpY7D5c-XeOB%8F zb?=Q%DgCpt*pQT{ujnU?7|r~)CtYZ^!Uk5vX>q^@!Nh<@%^E<@YY~b6-b>y&=e~2! zJ?Hm3_pU?xPzrhBeFh_R2!R358H7T%{sivGQy2v}gr48RbtK_B>({^*Vf`h(6SrSL zAzR-oqJRt5zrHU6j?Vg%PCNTw4@0*R(kQtYK>Ggg+oY-MUiiL2y0RL<$iSULxdPgeasQ}l!GWfZz5R`Xx!`7Fv&X!^^7Kxq#zPV zMp__}KHLqDsHVeb7yEU6I)OzJxm|k(`S-ANAQw--qHH(3FH&sZX*qCin zl66O7%9Z8C$u%hKh;8)OGnxrTwwoxiO^E~rJ%>cXK_$oRN1Y>Ks-^k)l4KVKcqtF? zI*rTIkjONuB^xudTv@ux=G&N6&iz_5VNz_&s#gldj15y8vxRylnfyP@QlB6PRVZL- zQyz`bFp+@ga9fe`z!AWk!%J5MzW*RUCHndjW0LNWz(JA@i~R|A5X`Uwg_6T!mbb4xF!Xz}R5r=tFvk*U= zD-`Wc6Eaf&0vRwhu_#^m0nQI82O^6%(Ky+yn5ZheD&-SK>D&#Z zMPfa_81odSHaz5mFbQ?(R8dMLv@uP`^`Y(KM2XOzy*=+43XO(!Bk%&mprM}aTQZEG z?dkAHFc4xCtsnAj$!cNJv$1z39aAFvyfq1(UBthMTq(&X z^SCU7pT-oq3cFzsQLw;2rsOni>gVK3E#4}Dc zvV3pv9_ILIO_o(Q#WkAW3e8!I6-8~(KWY^mDmTCne5T_X<774C@P~N6%*GuP4s}3| z9~LLo5U=W@<>y1{6lcjA{@$L&AF(-u0c)v<1B@Hy(s(eBgX7$wn8UBaZGr>S_#KAd zoyJVVnvMfGJgW20y)rTl{#c#Cqu+G091~!UO%0p5?h3p9n#^CXl&e``?yJnRObm$E zE6~n&HO3qvS-#OUvfaJCY)^}4)>^xn?0>SE#^odH?i0G&oZV42@ zAx`Tx@8idJv^l+XX%a3sqKiInT?;Yc>ROxBE7w=vZfQWZyKl0dVU-T2w;P(({1;AF SnRDq*apuK;aC-Ugoc;k7Ykl$n diff --git a/mods/cnc/ti11.tem b/mods/cnc/ti11.tem deleted file mode 100644 index 5efe14ac8340b51fddd301014e86ef9734abc0d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1441 zcmb_bPiP}m7=Lg6B~7}xq_U=LYon_@i3nay2~0Jg#M@Ai36VmU_OiW+dnp7ZZzh?g zahpFgX;XvU)We&Cpa*Y35ALipYf#t}4T}hodf62`=s|ERtbS>_W{)16IehQE@4fH$ z-tYJOrpYELk~sb^QbOJ%IKi(+$nt3XG9?LIeq*1G=PwB)A>w@PEY{BAx57C8sYntb z%s(fMWBx4eN#p!S@~HacW8|Snh^6V825SE^Qp&DqnLD?M0hz>8cfKYJ2sKoAc$pBU zeRrN3TDJcu!L{sa|28@Q2~+=GBTvxdi$byZF;M_+Sw1ub$S~O+^oE5x&9G3+zFT3@ zLQToU!ryE$CKg1fDG-~VpLv@JDQFN0Fa!cbn+oW&@r{BlX{+(LL7@=>Ew;W<09yu7 zRrs}ttT;rnEWhnY9?OZ08g|GV2y=7!n+>7jF*z+RZ?Q&b@MieLW9}amOsu0olA=!w;5h;Rj+z;9aTaA?6t^T0m zalc%R_&vvN^*n=H)rc-`b*>t$d*Wl+(d+o|-^YCw0)T6IhCS4QyFeEaAJ zgLiSL=iBV0%Y3yqrRjb<2->QOSJJatU3+w;FYro#QQo5XXw{(!CM*diz0{z|l5k0` z)3xFUgwD0-le_dX6Bdt)?U9>`dxY{`aY>wQO6yDNIwns}i|o*6nD9bkhl++Ea6F5f z?@1YSKvUMUdI}*{n5ZSy7KINL6%(pzD;Z2_fDuijs*ao)u~mGQ;^F%uKC(`^DTA(M zpc=7UpJy}vDvHW;)W0oGwI9jChUsxyMTT*g#v7g@+L4e`0U+Y1x;*a%U04CpT4zt zY|{lMi6MjS()>P6?250ymD)i+(R_=p7oQ(#`8n-0C6F!dD6r2vu2rSn2!UTN1?|J_ z>5;M;wgk6){{Fd%w(TSs3h7%Q82!Fo@75_Cl5l7&8Dg~p4nUP2I2c*1BY)La;xJf9YaHAfDMD2bMG;at zU={7Gz3T*$CSE&<>PU_Fsan(n5|JvEQ!%VXn#8q}13jQf=?V3UpfretvDbuFgd%1S z-+Z%g_q}=Z=1G_V69&X{7y&*6(TH)UTi-yx{{tc3o}ZH-A_JWGLh}2gGDH;7pX=5i zWqn*U-DG0SrLO#W)H3@kjZT)lD zeGguSf}Ui0>lze{lo4Bh9`go^woW0};n4c8!1aw^V8;gFU~>2!z$PM%nlFLPj3lGm z39y&}$1KJg8OSHo2ApUP3zU&I*v2qy#9?*4ioI2J{F2E z6jNTI>e;d7KI}~tS<12NRR>;M-3BMcJje4I?;{)&bBe{HYrla*x=yiZ;|lJKb(G!= z)N0$8%YkMkEOWG6^_#RD4rg2}^FSgiXUe!~Ne?!!{|77|*t}8WlRnr|tRvyknyY4| zL3!|NR}IJIaDuzaN7=ZXHNR>H>L!L}mF9D!uMAYA!^*u!x=%1Ni=T4*Y!8iwRvNBPq%8B;n6#HOG3Ch z@@&)>9(h!_kfLfLgPP{5y2v0SQJILXR+e<)l1AngP;>hu6rDsMmc(AnC6GljD^jk{ zlE!i+HTg{cQ)k9piS=>0|A`z&D#@(xX)eE;qdBApvWRi{G3c2f3HTX-E~zALlST{w z&$6jN`>IUgqJ4l2)=ulk9kY24rTxUx_@3{)CrwVZE`m$rs(%Dlkdd=kuWB^DXK%1$ zFVkqEn~Vd#!!)zM#TW5B540^R1<&_)G|=?l^wS5~9_xjJLL@m}n{T>@`L{)*8Bj5iELRds@cIr##L%zIi9UZwS<$3(>l0g0mwKmiX diff --git a/mods/cnc/ti2.tem b/mods/cnc/ti2.tem deleted file mode 100644 index 16128647be9dd64956826367e33c329932963431..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1555 zcmZvcUuauZ9LIm>-rSqCnQlvQYf4w^Cd0RN_>?YkBl(r6Ag6gr2%B^;5c^gfLLp@4 z+~(dioo&-3T_r1|Y$gvrxECMn5VYx1xOA~iyI937V^i@D2tyyFWv>3N9aO}7;hyt5 z_nzPR{=VmP?g8k7cc7E*E(UN3APIEc0SMUr0S3J^{Mrv}FHT9&D^vXO)Arue_CPd)`mg~B}47-y+SG~(Z&R}t=Oe8xlwj&5885!!qge(8{sTM8m-m{X8P zdfbBHjEhH}^SDRcm~9Kk4t5N?;~HjN=zP{|_wtT7J(Hh+1JRFpnIBShnxyckcXLy) zI8Bcp*|ZWeW@Y4ugyWK&z!?d-E+z1bB*51UQ&JqWPIP;nTb7_Dr`x&LlNK$j>BcE{ z*mZEdS{8adj+5?i%;Q1ch1LOrx$=`v2Y@y^_8 zPhfG>&fD3j2D_`Hqc|n;4&lsM`gVc>siD;U&B2|yv ztTmU!ik&B7tY)pU&TW0M+WlNUQzqAJeUa6AhSX^|)o$w>9_G~Fm!~2Y4YM}mA_x9# zJ}_*3(c=0>wz6pFjTQ@e>+z1Cs^ihxz07V|NEDF1Xq5Dg`v0r%8|Ix=)=ysO?<`2i zmE;p(y|e6^VAp4v(3yUPU3f%Qe9204tbbPO*T}3h1;zw>JNYB9Qh`0t?QfZouXjDn zJ3fr{vt-%^vZ!iAjHcz(5D~+XT272^KY1lWwN>VfJxxRBH_NyaV(cArAloj z;5~n8oJT691+%zP?}2f0+^p4BiggF1$?#%vMO%~YeV^MP|^h6jxZV-e4JfPdNJhzWO3F_n7&LNq1h7l5_&bi0K&>J>D&A!bZ9c zUB}X*yx1bX_z{oQ(#1B7Pf6$zPS5@PTsdx|;5l;4Gwj|6CPzH$j@I|p8u6EI3ZyFyB6gdowU#S;k)r%4l?QN+J! zSFSQkNWr1JnpTIN51z{@)owX3RFJAco&B6#0j2fIi6EbDPY(o#y1Uin5>6hdI?tXB z2Br63pj9s`xKs}e2w4sWg}g%psyk=R56Oa^6OL_F)h6XuQ#WLl6w+B_n#r`swD7;2 zd9*dreCo{o?;hUV(f@JgQB$wB_MKVZ&Ck90f6nZ(a?Y-(_0X(Lw=Y+Jzx}J!^{rv+ ztTgXV=*g4is)m=JL8F+lmNQ~;e#Z_4kt6hSd3QVR(hv4i6FSBo v+>kZj2|6oR*dIER=h&^}RbUHw_G&?@3KRAj2w&_jAjOD}Q~#$}(7dm41;3N-=+OhS6-p=Z-} zXQf?PaTC}2uv`&{DOf&*IJx;2%Ux49mLl0PIRq3O2>qZr^-yf6>8vd%^w!IY*mK1o>R|8M?zaUKd>n{|DssK}szCP2?aARD@_N3HLn$W7Yx>TaFyJbbiAri*}X(LJrlpw(6}HFbi^s zv}yA85u7h|f_Qvg4)RsLzUq4I3Klk9&#gC{*84cy^tN1Qb=}=Lheb-cn|06iyhqQ_ zIeJaC6}DWy4Uud1rlw<^r_Qnv4roH4LF1$pd|; zw0%1(ugwVUP}kYF8uj*VN7ZNOCXztrBFjm*ataJr1D*G#CqfnF-GKE7aHWQ_@V5oL zBJ+g8mcCP`wUDhYU%OPoa2~I;WZ~aMVu2hk`$d1~O!|eflAe%$;Utwyhp}=XLGqz27iH4E=DVb%Ng?y+^Hk&q#AHoqI>gzt#s{zUM;r~JU1SzM?(1K3E@YC%Z0%`s=8XPN# zmGvIY5Aw6Y?Vc?T{c{Y8f#CCUZDodTo!K7>o*fH*KE!ANG*TpvPkkJ(a9b!wwyYQQ z?Au1B6lg}&$!tYw8aDoVO6(Oz7uEP@7po{)WNSEW6;D9o!9A75#^vKI;-5CEHT==~ H(vSQD=`M1i diff --git a/mods/cnc/ti4.tem b/mods/cnc/ti4.tem deleted file mode 100644 index 3ecc6e643a3b0f4013d9bbe642a77f8c3bce308a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1491 zcmbW1UuYaf9LHz&&+Xl%wlS%Cv1vUi1O#7v^Wwp#Q7 zBsKj0wsLI0tCD04?N3koT~(a^_ru9yj*vOyGBdWXlcH&vX}wz@bC*q)+V%-I$O{~H zt`ls&CWm(jDKe8W*!r9lm}${hwp_~L*$Er;Ee}V8?smu_BZQOuFA6{!JedtfYzj4% zStGl?@8F`kvC_S7lCZS8Mg8 z(b4JqHL2X<>ZCkT;x(;zC3?`}&EJJ@4Bsz0VJ(Um`mNV53g?#J-KjP=gmcTUd!0WH z(ooTu75-Fu5{Tf1bIU^Kne@}n`-&5w^EgHjgl!)qslyT%#_8H3 z)zu>AEx1zm^y6S4J68341^uvIXb0Ut&n@QZ55 zRW#Bte;R>a>Gc~;6OTzj>5Ra-+4*D~(Xmt-N~e$EHW04ZQ2uwoC>2E{7xiPB%mi0s zQw%_dng-0AGIi8Xa9hP094SsS3~U-y_OII7o-fyW`2{d6V@2eTag%bTjl4UOf19Y+DaSBz94X>2# zR)Awnb0X1gdzq}59vYsV9nf7>gbevD!E-~P^h3vi+oz65g0teQ4$MCTq3Sm=^traL zK=}-?``>hb#UzC&+!WjzM3A1_^$!foVgl_gWF2l+OKS&dEDK~?LLpnx0aebVj7l8v zk057qDZ{A5FonLe5#n?VQHGAcE-GMZ+INa=A1fecPWxf#grQ!b!F&vt`0ci@>-Jxm zKhW^UVwp_0pW^Kt->dMyu?Gr-&Wab=n=Fi7a@@$|xeE`*`flWM^UqO4Sf!0cdXLjL>dLuQeQgb%7 diff --git a/mods/cnc/ti5.tem b/mods/cnc/ti5.tem deleted file mode 100644 index 95f87dba09a05d3dac41c86778d194df1e99d9b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1515 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 diff --git a/mods/cnc/ti8.tem b/mods/cnc/ti8.tem deleted file mode 100644 index 95cecd04b39c9794c0c8b752971869aa19e6d7d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1415 zcma)5UuauZ82`>a_a<#qyEJ3kNVW!t^Tmhm!H3pJqW8d^?BOg>Zpc>2q$-Fn6%=%( zBj+x;T>`6Vl2*8=sqK=z>x1jukfz>X?b4)w;)aFbh9XKq=Yykt7=Cvh=!1yo!uig} zJ>U2Je&_pr-7o-2=)-T20GtPOaMd4KjX=aX*9Zh9fD^~1N4^9>8U1^Y>~nPA|Ag+x ze|N229V(S;dJKwwp53U0UNMgFTFdbvdrp+2>z|{EHmT9fM4Hq@e zY}2msdKNO8&aGOFu~2;hFYEDmj5n@<_uRLO06iky*n&x5T#s_r*ad^@a9r@Uc}PJt zuEUAueSnOi^UeFP`6oQU7_8iqP1Cjta#h5sAV%I@ZApPZVrg2+R)wO{NJdP%Tf-fD zRZ+Q0SV|gaIXCn8-M3bRAnb!K?)OcK_DajcraaM(1I=n#7~|vYk|!GX`Id8;Hab&o z1bf)$8xvBPHQIuNk1-V+?D;MNuG4K$)Ybj0xfss5Z2w6?gkpgKO(r!EXlT+#j zDbLDg#V!}RD&oi2RN5|MF?s2B<|QN=-gc_}fTUazRn4@`sjl8$F}z1bb@ySdPYDys zc6G1Ka-D4Zx8Lt=2;(9Bd)r2}mD#8NQB&+04&zI1qhj(NR zHCR;im>zO|=zI{3hC3@#jj_v4j-NsH_>Oq6bJHDMKjia_d5}*ue&FDno^k9=2XpuM zol`*`$9+Rav9SW>UYCI(3Xl0WHw78T;Mn7vD-)FEDC1rspQjUST4LOgCfEWN60nO~ zdGi^#fKLujuDt-+iamG5uFX|S_UbE;O_yq>RVmF?(yQ-6_KIoSH8WkY%+*UUscUO% zA=`!{H%B0Y(qRnwv9mr=iufl{->4E6@#DB)2Q7Fk!*#Z7oKgY_YN~vPkm?L`A zw4f_^(iw%1)23D94EoXxXUH1pGoo>CD%b<(QgL19r}|R5W!2!2w+E&NItS*)j;($L z-@Hod?-LO^^~Fk&m|RPnwpPDPF7lY2vg~xIaf77Ibj>p1Wc?Nq+`GKCLo$rVuq&a^ zV7*05rfDoRxN=xZCY$j8^tvOr7ptP67)Jx6)x0Yq_0#@qc~>Ap1FFa?*+hgUt~=dq zfYj}uQJTj_hx&@rQ%Z6kNN|SC3$idngh7m1GP>nlyb9#>tkQi4rzNlax^mwibY|Uk ocjWbd8JF+KTv55xUVKp$Tt+f5di(A)VsM>)dT<{@@Shm|0tgoSL;wH) diff --git a/mods/cnc/ti9.tem b/mods/cnc/ti9.tem deleted file mode 100644 index d8240ddf382b0552a742aa09a0136f90a930c564..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1184 zcmaJ=U1%It6h3EucJueJ32JxS(5{w>;Da^z&@rnwaZi}M4FTDuv`~HVMIQvE1edLQ zCp)ugOibL}P#79FQg%dNtb$+)LU!V8-Lx^g)d)geqXq;;LEjQ=;+-UdFZK-FbI#?S zd%pXfZ+c)9au5~YE&yBtkqGuq>3gQnD;u65<3F#nTmLRT({NABIB_HJHo=iboHfX@*;kuj8YzfPFpV`o0nXq^^CrYIyKew| z^DO2mW$4Y%QC$8IPqe;8E2R@@>wlm{Mq2d!9XYN3hPj*vNT$;M+4JW*sn9Alj-Ra2 zY?n7xY1AHJOBtH!q;z9`Wy;(6nZy}Uftf~QkK2lMFugJ$z~bNB26eHY*PeC z#W3~7UdzZd*P(ZG$jeLPG}o#3#xgZe&C;w)-BDAysES>QWK$j=r^%ccf)8r@nUhIl zwyQ9bywKkt%GGG5#|xi3mrP1;J}mG|E48(u5iZNgB$szYt`-|tFUTCvb7eaeV$%w> zH%vV$t6e4eUOSRt#6aV@a->L?zY?%DLfcAhDvwiJ8tO$UMB^)kG?g&S@Ea`(B zk6w{9bpjXfVPzhdIS!VUV~gzC73pbd9?zIqEo1mb@VZG*0_~O6edU$ZKzFR9>SCp` zEM$>;9{)Y}V7FXW`!JTt6hr#)-flHh4C}oe*-VxMbR*K8O;AxKof4EA461}m3x_Jb zD70-P68ft#uAUATbVH}Sm54_tNhNYz+l@!zi8;$oXaufpyH3@vELf3K1)<2aVQBE= zTh@Y8@$2fMW3zZHuM2FE(J9NRyOp|ctA0HC0!|Co{kq_~E|kAo0(ih?jA@#7s}G?8 zk44s2AIGhikXP=!4il