From e2956c44ee391a9dbe02fb56c8f29e0e2ba09664 Mon Sep 17 00:00:00 2001 From: Daveo Date: Thu, 4 Jan 2001 21:53:14 +0000 Subject: [PATCH] --- Utils/MapEdit/ChildFrm.cpp | 2 +- Utils/MapEdit/TileSet.cpp | 1 + source/gfx/prim.cpp | 18 +-- source/gfx/prim.h | 1 - source/level/layertile.cpp | 160 +++----------------------- source/level/layertile.h | 35 ++++-- source/level/layertile3d.cpp | 204 +++++++++++++++++++++++++++++++++- source/level/layertile3d.h | 13 ++- source/system/main.cpp | 3 +- source/system/vid.cpp | 2 - tools/Data/bin/MkLevel.exe | Bin 241664 -> 241664 bytes tools/Data/include/dstructs.h | 41 ++++--- 12 files changed, 277 insertions(+), 203 deletions(-) diff --git a/Utils/MapEdit/ChildFrm.cpp b/Utils/MapEdit/ChildFrm.cpp index 6ddaf36cf..556a6b1f3 100644 --- a/Utils/MapEdit/ChildFrm.cpp +++ b/Utils/MapEdit/ChildFrm.cpp @@ -37,7 +37,7 @@ CChildFrame::~CChildFrame() { } -BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs) +BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs diff --git a/Utils/MapEdit/TileSet.cpp b/Utils/MapEdit/TileSet.cpp index 4abe8b167..b29bcfe0c 100644 --- a/Utils/MapEdit/TileSet.cpp +++ b/Utils/MapEdit/TileSet.cpp @@ -346,6 +346,7 @@ BOOL CTileBank::SelectCancel() BOOL CTileBank::IsTileValid(int Set,int Tile) { if (Set<0 || Tile<0) return(FALSE); + if (Tile==0) return(TRUE); ASSERT(SetPrim); setTSetShadeTex(&ThisElem->Prim,1); -// Table +// Grid ThisElem->Right=GetGridPos(X+1,Y); ThisElem->Down=GetGridPos(X,Y+1); } @@ -73,7 +73,7 @@ int Size=Width*Height; } /*****************************************************************************/ -// AS not critical, us row update routine for whole map +// AS not time critical, use row update routine for whole map void CLayerTile::UpdateWholeMap() { for (int Y=0; Y>4; /*****************************************************************************/ void CLayerTile::UpdateRow(int X,int Y) { -sPrimGridElem *Table=GetGridPos(X,Y); +sPrimGridElem *Grid=GetGridPos(X,Y); sTileMapElem *MapPtr=GetMapPos(X,Y); for (int i=0; iPrim; + TSPRT_16 *Prim=&Grid->Prim; /**/ sTile *Tile=&TileList[MapPtr->Tile]; /**/ setTSprtTPage(Prim,Tile->TPage); *(u32*)&Prim->u0=*(u32*)&Tile->u0; // copy uv AND clut -/**/ Table->Tile=MapPtr->Tile; -/**/ Table->Flags=MapPtr->Flags; // Next Elem MapPtr++; - Table=Table->Right; + Grid=Grid->Right; } } @@ -180,21 +180,19 @@ sTileMapElem *MapPtr=GetMapPos(X,Y); /*****************************************************************************/ void CLayerTile::UpdateColumn(int X,int Y) { -sPrimGridElem *Table=GetGridPos(X,Y); +sPrimGridElem *Grid=GetGridPos(X,Y); sTileMapElem *MapPtr=GetMapPos(X,Y); for (int i=0; iPrim; + TSPRT_16 *Prim=&Grid->Prim; /**/ sTile *Tile=&TileList[MapPtr->Tile]; /**/ setTSprtTPage(Prim,Tile->TPage); *(u32*)&Prim->u0=*(u32*)&Tile->u0; // copy uv AND clut -/**/ Table->Tile=MapPtr->Tile; -/**/ Table->Flags=MapPtr->Flags; // Next Elem MapPtr+=MapWidth; - Table=Table->Down; + Grid=Grid->Down; } } @@ -203,7 +201,7 @@ sTileMapElem *MapPtr=GetMapPos(X,Y); /*****************************************************************************/ void CLayerTile::render() { -sPrimGridElem *Table=GetGridPos(MapX,MapY); +sPrimGridElem *Grid=GetGridPos(MapX,MapY); s16 TileX,TileY; // Setup shift bits of pos @@ -212,147 +210,23 @@ s16 TileX,TileY; // Render it!! for (int Y=0; YDown; + sPrimGridElem *GridDown=Grid->Down; TileX=-ShiftX; for (int X=0; XPrim; + TSPRT_16 *Prim=&Grid->Prim; if (Prim->clut) { /**/ Prim->x0=TileX; /**/ Prim->y0=TileY; /**/ AddPrim(OtPtr,Prim); } - Table=Table->Right; + Grid=Grid->Right; TileX+=TILE_WIDTH; } - Table=TableDown; + Grid=GridDown; TileY+=TILE_HEIGHT; } } -/*****************************************************************************/ -void CLayerTile::renderSolid() -{ -sPrimGridElem *Table=GetGridPos(MapX,MapY); -s16 TileX,TileY; - -// Setup shift bits of pos - TileY=-ShiftY; - -// Render it!! - for (int Y=0; YDown; - TileX=-ShiftX; - - for (int X=0; XPrim; -/**/ Prim->x0=TileX; -/**/ Prim->y0=TileY; -/**/ AddPrim(OtPtr,Prim); - Table=Table->Right; - TileX+=TILE_WIDTH; - } - Table=TableDown; - TileY+=TILE_HEIGHT; - } -} - -/*****************************************************************************/ -#define BLOCK_MULT 16 -void CLayerTile::render3d() -{ -sPrimGridElem *Table=GetGridPos(MapX,MapY); -s16 TileX,TileY; -VECTOR BlkPos; -s32 BlkXStore; - -// Setup shift bits of pos - TileY=-ShiftY; - BlkPos.vx=((-15*TILE_WIDTH)-ShiftX)*BLOCK_MULT; - BlkPos.vy=((-8*TILE_HEIGHT)-ShiftY)*BLOCK_MULT; - BlkXStore=BlkPos.vx; - -// Render it!! - for (int Y=0; YDown; - TileX=-ShiftX; - - for (int X=0; XPrim; - if (Prim->clut) - { // Has 2d Data -/**/ Prim->x0=TileX; -/**/ Prim->y0=TileY; -/**/ AddPrim(OtPtr,Prim); - } - if (Table->Flags) - { // Has 3d Data -/**/ CMX_SetTransMtxXY(&BlkPos); -/**/ RenderBlock(Table); - } - Table=Table->Right; - TileX+=TILE_WIDTH; - BlkPos.vx+=TILE_WIDTH*BLOCK_MULT; - } - Table=TableDown; - TileY+=TILE_HEIGHT; - BlkPos.vx=BlkXStore; - BlkPos.vy+=TILE_HEIGHT*BLOCK_MULT; - } -} - -/*****************************************************************************/ -// NOTE: Tiles will be sorted by z order (cos they 'should' be simple objects -// NOTE: Tiles are split into facing strips, to reduce overdraw :o) -// NOTE: Matrix already setup for block - -void CLayerTile::RenderBlock(sPrimGridElem *Elem) -{ -sTile *Tile=&TileList[Elem->Tile]; -u32 Flags=Elem->Flags; -sVtx *P0,*P1,*P2; -POLY_FT3 *TPrimPtr=(POLY_FT3*)GetPrimPtr(); -sTileTable *TileTable=Tile->TileTable; -u32 T0,T1,T2; - -//--- Tris --------------------------------------------------------------------------- - - for (int i=0; iTriCount; - sTri *TList=TriList+TileTable->TriList; - if (Flags & 1) - { - while (TriCount--) - { - P0=&VtxList[TList->P0]; P1=&VtxList[TList->P1]; P2=&VtxList[TList->P2]; - gte_ldv3(P0,P1,P2); -/**/ setPolyFT3(TPrimPtr); -/**/ setShadeTex(TPrimPtr,1); -/**/ setlen(TPrimPtr, GPU_PolyFT3Tag); - gte_rtpt_b(); - - T0=*(u32*)&TList->uv0; // Get UV0 & TPage - T1=*(u32*)&TList->uv1; // Get UV1 & Clut - T2=*(u16*)&TList->uv2; // Get UV2 - *(u32*)&TPrimPtr->u0=T0; // Set UV0 - *(u32*)&TPrimPtr->u1=T1; // Set UV1 - *(u16*)&TPrimPtr->u2=T2; // Set UV2 - - TList++; - addPrim(OtPtr,TPrimPtr); - gte_stsxy3_ft3(TPrimPtr); - TPrimPtr++; - } - } - TileTable++; - Flags>>=1; - } - SetPrimPtr((u8*)TPrimPtr); -} diff --git a/source/level/layertile.h b/source/level/layertile.h index deb9b2ab4..8489da7d8 100644 --- a/source/level/layertile.h +++ b/source/level/layertile.h @@ -7,14 +7,30 @@ /*****************************************************************************/ +/* struct sPrimGridElem { TSPRT_16 Prim; - u16 Tile; - u16 Flags; +// u16 Tile; +// u16 Flags; sPrimGridElem *Right; sPrimGridElem *Down; }; +*/ + +/*****************************************************************************/ +struct sPrimGridElem +{ + TSPRT_16 Prim; + sPrimGridElem *Right; + sPrimGridElem *Down; +}; + +struct sPrimGridElem3d : public sPrimGridElem +{ + u16 Tile; + u16 Flags; +}; /*****************************************************************************/ class CLayerTile @@ -47,30 +63,27 @@ virtual void shutdown(); virtual void think(VECTOR &MapPos); virtual void render(); - protected: - void UpdateWholeMap(); +virtual void UpdateWholeMap(); +virtual void UpdateRow(int MapX,int MapY); +virtual void UpdateColumn(int MapX,int MapY); + sPrimGridElem *GetGridPos(int X,int Y); sTileMapElem *GetMapPos(int X,int Y); - void UpdateRow(int MapX,int MapY); - void UpdateColumn(int MapX,int MapY); - - void renderSolid(); - void render3d(); - void RenderBlock(sPrimGridElem *Elem); sLayerHdr *LayerHdr; sTile *TileList; sTri *TriList; sQuad *QuadList; sVtx *VtxList; - sTileMapElem *Map; int MapWidth,MapHeight,MapXYShift; int PrimGridWidth,PrimGridHeight; int MapX,MapY; u16 ShiftX,ShiftY; + + sTileMapElem *Map; sPrimGridElem *PrimGrid; }; diff --git a/source/level/layertile3d.cpp b/source/level/layertile3d.cpp index 818068f0b..64f9b88b4 100644 --- a/source/level/layertile3d.cpp +++ b/source/level/layertile3d.cpp @@ -30,7 +30,34 @@ CLayerTile3d::~CLayerTile3d() /*****************************************************************************/ void CLayerTile3d::init(VECTOR &MapPos,int Shift,int Width,int Height) { - CLayerTile::init(MapPos,Shift); +int Size=Width*Height; + + ASSERT(Width>=SCREEN_TILE_WIDTH); + ASSERT(Height>=SCREEN_TILE_HEIGHT); + + MapXYShift=Shift; + PrimGridWidth=Width; + PrimGridHeight=Height; + + PrimGrid=(sPrimGridElem3d*) MemAlloc(Size*sizeof(sPrimGridElem3d),"3d PrimGrid"); + ASSERT(PrimGrid); + MapX=0; + MapY=0; + for (int Y=0; YPrim); + setTSetShadeTex(&ThisElem->Prim,1); +// Table + ThisElem->Right=GetGridPos3d(X+1,Y); + ThisElem->Down=GetGridPos3d(X,Y+1); + } + } + UpdateWholeMap(); + } /*****************************************************************************/ @@ -39,8 +66,179 @@ void CLayerTile3d::shutdown() } /*****************************************************************************/ +/*****************************************************************************/ +/*****************************************************************************/ +// Get (wrapped) PrimGrid pos +sPrimGridElem3d *CLayerTile3d::GetGridPos3d(int X,int Y) +{ +sPrimGridElem3d *ThisGrid=(sPrimGridElem3d*)PrimGrid; +int Pos; + +/**/ X%=PrimGridWidth; +/**/ Y%=PrimGridHeight; +/**/ Pos=(X+(Y*PrimGridWidth)); + +/**/ return(ThisGrid+Pos); +} + +/*****************************************************************************/ +// Get (wrapped) Map pos +sTileMapElem3d *CLayerTile3d::GetMapPos3d(int X,int Y) +{ +sTileMapElem3d *ThisMap=(sTileMapElem3d*)Map; +int Pos; + +/**/ X%=MapWidth; +/**/ Y%=MapHeight; +/**/ Pos=(X+(Y*MapWidth)); + +/**/ return(ThisMap+Pos); + +} + +/*****************************************************************************/ +/*****************************************************************************/ +/*****************************************************************************/ +void CLayerTile3d::UpdateRow(int X,int Y) +{ +sPrimGridElem3d *Grid=GetGridPos3d(X,Y); +sTileMapElem3d *MapPtr=GetMapPos3d(X,Y); + + for (int i=0; iPrim; +/**/ sTile *Tile=&TileList[MapPtr->Tile]; +/**/ setTSprtTPage(Prim,Tile->TPage); + *(u32*)&Prim->u0=*(u32*)&Tile->u0; // copy uv AND clut +/**/ Grid->Tile=MapPtr->Tile; +/**/ Grid->Flags=MapPtr->Flags; +// Next Elem + MapPtr++; + Grid=(sPrimGridElem3d *)Grid->Right; + } + +} + +/*****************************************************************************/ +void CLayerTile3d::UpdateColumn(int X,int Y) +{ +sPrimGridElem3d *Grid=GetGridPos3d(X,Y); +sTileMapElem3d *MapPtr=GetMapPos3d(X,Y); + + for (int i=0; iPrim; +/**/ sTile *Tile=&TileList[MapPtr->Tile]; +/**/ setTSprtTPage(Prim,Tile->TPage); + *(u32*)&Prim->u0=*(u32*)&Tile->u0; // copy uv AND clut +/**/ Grid->Tile=MapPtr->Tile; +/**/ Grid->Flags=MapPtr->Flags; +// Next Elem + MapPtr+=MapWidth; + Grid=(sPrimGridElem3d *)Grid->Down; + } +} + +/*****************************************************************************/ +/*****************************************************************************/ +/*****************************************************************************/ +#define BLOCK_MULT 16 void CLayerTile3d::render() { -// CLayerTile::render(); - CLayerTile::render3d(); + +sPrimGridElem3d *Grid=GetGridPos3d(MapX,MapY); +s16 TileX,TileY; +VECTOR BlkPos; +s32 BlkXStore; + +// Setup shift bits of pos + TileY=-ShiftY; + BlkPos.vx=((-15*TILE_WIDTH)-ShiftX)*BLOCK_MULT; + BlkPos.vy=((-8*TILE_HEIGHT)-ShiftY)*BLOCK_MULT; + BlkXStore=BlkPos.vx; + +// Render it!! + for (int Y=0; YDown; + TileX=-ShiftX; + + for (int X=0; XPrim; + if (Prim->clut) + { // Has 2d Data +/**/ Prim->x0=TileX; +/**/ Prim->y0=TileY; +/**/ AddPrim(OtPtr,Prim); + } + if (Grid->Flags) + { // Has 3d Data +/**/ CMX_SetTransMtxXY(&BlkPos); +/**/ RenderBlock(Grid); + } + Grid=(sPrimGridElem3d *)Grid->Right; + TileX+=TILE_WIDTH; + BlkPos.vx+=TILE_WIDTH*BLOCK_MULT; + } + Grid=(sPrimGridElem3d *)GridDown; + TileY+=TILE_HEIGHT; + BlkPos.vx=BlkXStore; + BlkPos.vy+=TILE_HEIGHT*BLOCK_MULT; + } + } + +/*****************************************************************************/ +// NOTE: Tiles will be sorted by z order (cos they 'should' be simple objects +// NOTE: Tiles are split into facing strips, to reduce overdraw :o) +// NOTE: Matrix already setup for block + +void CLayerTile3d::RenderBlock(sPrimGridElem3d *Elem) +{ +sTile *Tile=&TileList[Elem->Tile]; +u32 Flags=Elem->Flags; +sVtx *P0,*P1,*P2; +POLY_FT3 *TPrimPtr=(POLY_FT3*)GetPrimPtr(); +u16 *TileTable=Tile->TileTable; +u32 T0,T1,T2; +sTri *TList=TriList+Tile->TriStart; + +//--- Tris --------------------------------------------------------------------------- + + for (int i=0; iP0]; P1=&VtxList[TList->P1]; P2=&VtxList[TList->P2]; + gte_ldv3(P0,P1,P2); +/**/ setPolyFT3(TPrimPtr); +/**/ setShadeTex(TPrimPtr,1); +/**/ setlen(TPrimPtr, GPU_PolyFT3Tag); + gte_rtpt_b(); + + T0=*(u32*)&TList->uv0; // Get UV0 & TPage + T1=*(u32*)&TList->uv1; // Get UV1 & Clut + T2=*(u16*)&TList->uv2; // Get UV2 + *(u32*)&TPrimPtr->u0=T0; // Set UV0 + *(u32*)&TPrimPtr->u1=T1; // Set UV1 + *(u16*)&TPrimPtr->u2=T2; // Set UV2 + + TList++; + addPrim(OtPtr,TPrimPtr); + gte_stsxy3_ft3(TPrimPtr); + TPrimPtr++; + } + } + TList=NextList; + Flags>>=1; + } + SetPrimPtr((u8*)TPrimPtr); +} + diff --git a/source/level/layertile3d.h b/source/level/layertile3d.h index 111d620fc..0b84c51b2 100644 --- a/source/level/layertile3d.h +++ b/source/level/layertile3d.h @@ -13,11 +13,18 @@ public: CLayerTile3d(sLayerHdr *Hdr,sTile *TileList,sTri *TriList,sQuad *QuadList,sVtx *VtxList); ~CLayerTile3d(); - void init(VECTOR &MapPos,int Shift,int Width,int Height); - void shutdown(); - void render(); + void init(VECTOR &MapPos,int Shift,int Width,int Height); + void shutdown(); + void render(); protected: + void UpdateRow(int MapX,int MapY); + void UpdateColumn(int MapX,int MapY); + + sPrimGridElem3d *GetGridPos3d(int X,int Y); + sTileMapElem3d *GetMapPos3d(int X,int Y); + + void RenderBlock(sPrimGridElem3d *Elem); }; diff --git a/source/system/main.cpp b/source/system/main.cpp index 39ed1f9f3..274fc9139 100644 --- a/source/system/main.cpp +++ b/source/system/main.cpp @@ -146,7 +146,6 @@ void MainLoop() #ifdef __USER_paul__ s_paulScene.think(frames); #endif - while(DrawSync(1)); // Render States @@ -159,8 +158,8 @@ void MainLoop() #endif PrimDisplay(); - VidSwapDraw(); VSync(0); + VidSwapDraw(); PadUpdate(); diff --git a/source/system/vid.cpp b/source/system/vid.cpp index b081bfee0..19f98f8ee 100644 --- a/source/system/vid.cpp +++ b/source/system/vid.cpp @@ -144,8 +144,6 @@ static void VidVSyncCallback() TickCount++; if (DrawLoadIcon) LoadingIcon(); - PrimDrawCallBack(); - if (VbFunc) { VbFunc(); diff --git a/tools/Data/bin/MkLevel.exe b/tools/Data/bin/MkLevel.exe index 95377e899c6973f724d1fcafefe532858703262c..8e3031758b10d40f717401f3a989d90ea0bc6f39 100644 GIT binary patch delta 27959 zcmZ{M30zgh`~ICd7ez(6;AKbF%Obd-qN1RnEMkCOKm_+)2{re$Owmviuh*rcj%k^d zmZp`3b}_XiaVa;nGO{d6&2!U?a-&@MKkvB*@ms(D`F!Ac=bd-ndFP#(cjn9-SX9$$ zQBA9@EcpDiK|OWaQ=@ZbEm#wsE=JPnMz>J8X>u_8mc3Z^H*4OCy(Q}nTYcvB(CI9v zqfcb#Th1uEAl{|^dN9b*@*#r{_iQFt8-mz)`EP?iv&o)r8SH>O*6lOnE@z#tOzHEql50)62YZ-2e$s3$+vFFx%yxJ#OXUX#Javt)Q+W0R^ zXPZoOnv@PQ8LzuoQvIVVD(dv5DJG*O)jR(4*&&uJ`J2{Z#i`DgJiR3o>|R@;00QlD zQKp>*<%*a!#S~LyFqdYUlE6%<|JIUX3M#2IEIoWY#pF%RUAO=&>C%233_DGo(W#XwD7`8idM7yCEsQ0!;50N-W1ljT|woq%!hzy>5;A$a9TF zMn4y>la4~f@Eq@QxS~cfD{=B2V_IOvLUhGoeU5U%&UIuuyk*Tisw*Aff)07BY^X;* zYijUH(kVL>x!kiy6Eo3;@;%R~(ur$a^iO8~a*0=Q>rH9soMVRgTXX)hWa+b&e}3g+ z?#ry8Y^wJZ#=6KCefIN;=JI;qY?fAb&G$vd-}*(K>>tr&(=S|Cnk?V&Z7Wy!e=f_u z?(+IJA^d7zd4HQ=)>;0(jeoI6rcP&FV)EpGOp}XQ*_I4yK#EzppF!28$KRXX+>&TH zldt>+M$vHC{xg+Xsg}t`A%ilV%4C|HEp^JAJ`VEO5>t>~r<0Ue2DErgpqXF-; ze)8U?`L2=0San%}J_mBg(9EQm2qkIR)=R)gq> z3>ssGb>7Od{*YRyay8)`#of_V16u8ss46zVK+?dK3y`N)80TDGZq`qxHZV7>5x~g}fD$+$=b`cuk;AhpBv4`8EJTgG`3_s#)%q zfqF|nXS3C~)^avSX&Itg;jLN0ln1F0O*LW$8K||GJ7x=PLVqtp(mXg@*^~r{l66Qy zrGH7Ki`8XKL$;CyQ!S55zNqhV_%Hcna2Q)D{~7Gb_kAEY3z^O)%g={|vT5>`5Pv@N z2l-%#FTZd@t`3>RfB#JSIjPrkk)7rYcLZ6gvZKGaLx;eM5Cz#D8haaF$WoIrI=bCdrd4_3%>%`Vje@0pD zqC%m3)s$6i%D4Po`hp4moW1n$9DSGb*F7x*=S80=-}UahQTObq%<_4K5-3$IJ@2{- z*6MQe23udRg&lCO5uigf@wUvJO&*s1?D7RgDEyf46N#U8_=&Nk8A|HvXSc*O2ttny zR*X=DMlU_w2Ta5s%USbaB?v>vlHqL0b%{P#K562_iT8f1_(!sQZn3Kdl>Eb7OKze< z%PjrUyR-c*4k0nUDGw`F#bK>v`LeE}9QBoZ-Vps~kSGX1?rHI-f)>FPIFaxz6?z)E-Ae zqQBAF+tAus`PMvRPIeyZoJ1zfa#me+#vFb63C&-YV^E~()K*(gMt=@Rt{6>*Imaur zpSCt?hGeTpwudb0Zrg=p-5*sko5tTxVI=3 zd;edB$?%e7XQTXngr}kMVSPOohfyV!rX#d8$W;-CiU$TmU-fmT12kAM+!86RNY^b# z9V-PqxAFoE9E>TVw^UosOKyW)(J4;D>$On{Ql4TzrReC1YK@CG=e zEV|;1Vw{X5t=fK2SaDS^UB|4`Th5d|WZAu z1EVe9(TY9X6szQagLW)2>CjTd);cPN#}RiHeP&5F-mPGBoV9e~-3ks8i~6F^R3=f0 z7PH>c)mxq!J<4NO8=Wrx=p1*1HcXThM1-@-OY*PL(M~jpjIw9Dz-F=72I;S0|w@M1Gc!6H-VY_JaYx273#N{;C%v?n15 zPDJlPReCjMYzg)OU)IAse`-OOyZfiSnXLP6xG4?-2@voGod7ziy1yO}SKa@?j}>ZO zGx=e=)~)=1{O+fkyOn+BI78514rt$j1<6_M+p?gtx$RrBmL-)?yZFdq{4S}Kt2+1; zJLW08r-%12I18|yqLA%RgLPu5q2w^9!C-0fI4lj&V@lof{cL6#gQr0a*lq=BaF80^Bl*Zg_-*ix^<4}i`kcnSr`PHOprB}9M4Rr2E$mB>(byy_4VqkfhS8o=j!GTlZc!P z0e{z}$IMm&!4n49y(-KAPaYJN0$) zv8=AsiKSw3F}Y-8q#3{SH!1GRbviJDEY&O0TzECu{=~lj zl1{f`fMEre5&k8d9Cc#(D3|2}TTZkLXfm;MpkX2c!^G13R-;B@!|Hqle$ZP=_tLO9 zJkiqEAaCtFl#P||cMf8GWdAPyaVAxt3&wFIKM7@7&ea2BsG=5>G1#zz20oTKelDtN zd0w;XfeDm(bD2E7ix>Z9nOxeXBiknL?-Jmdqb4U!(-is7E}p)5ls(v>W`CvW ziX&YKa&W9C3zOqwFXl#l`8X;nmNR*Xisgt1wD?ocX;JYGSZJ63lTmRk@fxGzM zsJQ5l|m>kdwM6 zu_?$2#>jlDdtcU+q~w3Pw`5&q=eTVCZ3}r=+$gy5KwJn*lz)sH*I{!Pnt0|s>#9BI z@zR5)a?D|6y8*_pG!?@A7-4(BQb$;Cd0LN=>@)dHk5$YdkLcOPqjR{Um6{afb;|ql z>YhFMt#J8d&o1sic2WgQ*x->GNogY+;xi_`fohk2Kf4(`6sydRN23uhmLAp^xd|wQ z`HS2_b2h?+NvT=&FFlDSl@Y5c=E@^SO+gxiDW{|5ig*uxcfDL4AIx&)f8yIta(4Om zT2XStId`z-Pse_LMX0LOr6HIq{X6J%h11t2Q&$?41GMSDSf_+J+d3c}awfIS7154@ z$I#o7BFQTf`g$f|>foKWw2AVuMy2VMlkzVK@z{a}^m>;KlE3J6u5}x&9jp?Z=E6b1q{+FpL~wb=fT6?Hy7UlsJPmtxCeXm-4B+F{wvWLm$vPK9#GJ z7V+DM5?qhP>6-KW|`uKZzE6c!6HCpC<7qOmlN#8E4 ziEQg@V%hQ!efwgF1txdr7sBO&WgN@ZheSn%Zm=+<1kP5!nYlS6x()F)Y8j+bV*Ao9K?4^5rQ zzv)xu}>+3Pnyp=&;YQ!%2qoGj~3@D4qNrMI@ z^eE9rd4RnIcuFJBUr`*q>PDWQ^0k9UTUV{DuTtyal{fNyl-+WlVG-d=961Q+4bq;< zbmC>2=4r(}lu`1kVJ7yjTsCYGztl?ZIy|1eAkP>c$&b7#Zyw$iZ(!$!$Fh96$%yFY z8F#S4^+R|Ik>f|i^55T(XN>5=%H{1NVp)lNaYQu9jg0n+egnqusue=sC#`5e$EwE+q}6w;`kK(?aA`k%X+P)EelA!|j>rY0 zM)JDXOzS$WyLQ5~DI<#NQN#K828TsK7B{O&)9EmM71ZBnx1oCJMW*GgVGX#loq zUr!n+mrU}Ldl#l+-YzMe%&c;4;S7F%y*%#eXQAri({J(mb#ighKTMLJpPc2fUM4e~ zOGoHN4jVNBXD>xuc|-nTaz~b3<}$^LVFsC|j^fu{<)u@fK_I<7HH!6?1D|=0Us)q> zdS)r>B?nClWpQ%Kw4d0JGShT##**Y-GlsL#@}?QT@w%1rvY9)vHpI-zWvk1U%!=WL z9i>#K_o$InU47vWxpGcAGnch|)}Qec2041}7;NgSbDw4t<$H5OxMGm~=8a_?<%RP` zvPET==Dp2XV%d`U~o>o@9I+C&BGF#i3&5&c)E@9is z_OF!~KRiYL^yNTWOkPf9J<3e->x|jTD%Z8*7!qG?7{hQVC$iZx`6bbT<(GXd49p{~ zhk85`i^z#lG#aB{r{HL3V?4hbCwspV&8ywy)K`-Dy$SM5udL*CZnDRw-mIBCXj38| z=PulsWR!Pqn!`qx1#W(sG0cirE8(rVuO;%jF>?898ElcP-!h7AmB()x$aczm@w>cC z|9T$d)$a1Jt*@~q^50u~v#_$bH`X)ufqdr8^|JK3N7=l$in!bJTk7jej=4M@R7LWw z?OXWu0$F~0vs;JP9GQ0zLMgNblqJ4%g*EN58SLXOa!sH6;gM#JRI|m|ERqkBPiseD?RD8z%9ic^oFn@6|6n}( zNq+x>I@h$OSdbQNP!}YlQZ4V>6X9wg-n<6hoAUKNlUrnRb0+r$tGcEXVggQYq0_lzGw}Jje3o41dwwTp{pHH9O>mn1>!Hk7PWdLy z>wH^8Kj$js7_W=mR}BX7FOjVm3QP&zWn zk`_taAZ4g5UFggr8bsGS^B-Hwi>`N}5OY12&6e%>ohS#~h-J;?+#9jU-?*zaSy#0~sKZNS z>3rwX`7VwGnwF*A-9SsurF(C%RdR7%S8wGe zq*t1j!#u5k`a+N`pQ>xmbY=h4JuR^VW#bG0(UTeQSZFt$b9*0Uu{Z+p&({pQRsv{6I7c&-(TXFJ5cR;&w~ zE$pq>AQmWkyE1RqMC7}&1m-8!xw1#>c_ACvbp9y7=H$jU>e)20#e-dCakeF%D9N^q zaxZ3LTWy!TSU(nBI34C4pVbBjFEP2;(6mzqgA-jxWPYBq6Q@p|!_Ivh}YuBL}*6~@BY zBwK748>VLq#G1COE!!~%3t~B zYq2wmW%-8(YW33#)O4jO4kWKffE=&51Pb?PHk2jVrbe^QjFs88wqqYKCJA!~=Hc`E zSBwtBg0PiOsBRhAH(9ql#g!=+z7h*Nu=%V+{L_J*X8Xj6j%+Q;42@v{-dE1R4pf5^ zk(6xw%EXUZIdev=iD9Aq*C5-z81_idoNar%vS`LnXWD-5#s)JMCgS42h_sE5W2+f^ z+IG7Kdy%m?F*lwidej|Z4ckDM$Dvc~>dJg=SL2z5^Baf7%-*aMTP(Kq#`ui2wM}H5 z)voQsf_Tj#v9J$|b$gf7njiFd->^v>>BB~`o+7j_v%;|-_JzBbiEsO|X{?**m&{&s zn}@z=C_>j{g|<7%Y%u3;k3?1)D`PJRjMPddY{&Ysy?VyQ{7klob+Wa~VsU!rEhc2M zSKTbHF>HcO@eNy&44Zono6mXuCb4=Dv#_zkFOL=T&v)8h&0}9O<|!uSvy&{!)}?^0 z;cUOC913T6+WHM+4lA%mb03=287%k0IilN$f|av+XTpc??c(Uc`nl7GxVg8H(9F+n{GK z40we}I8A3?^IDVmema}Nx{CA}>~%IrC^J|%dq%jR)n1r-EFiG0sAaA^fVi1 z!jaBm4g@?7tc1XN-9K~;g_{AK;Vadi;^Udj5j4%wyYFs(9f!c83kK&3vAXVQjhhdOoY;hh4;(7uacDu~@ve0Or6+3)l*V zx)-von8dXUQAUVgi(z z=3e(GC3R%qM%CUeE+T~xls>iLNX+tF>T72`^T_+~qM!5BRR{v4n$O*6TEFuVcNycvx(x~F1C^_ zvMt%o-qd4YMSO_5(#50?SvIfC5}yF!373ypeXHzDb$~DZeRi`vB}Mp@v8gOlyi~># z1C@-&!O8n^aBA4sZH%N9vbC+Qj2&RSTuYtUM~rk?uG5Yu<(ug)>sTey zbj|0uPRp-)RIi?$j}-Msm=9KGpGww&O%UmoEC8`?QYDtW7UIoHHij#a!s#fx6u7Ae zDtrO=inW*uv6!{-b(Wi`*?YD>mR*0rj$s+ZMW^-S8NvNf4ys) zasi=~t+4I=mM!OOtLSx+b;lr@bCK71pHkiT_ zerBmKYuC?gG(WdlwETq~=(ZQTHwrtAw~~Fg;M82bjYNwImE`Tvn`s)3>xPnwgzOx0 zVW4>Q3#M&9;dzGjNyLg#Zg`28udyiSs?$ieQxK;}{xwHxnYc%(B1*+5xgttIsyn4( zl^`(!sb+dd>UU4ER)Lyxr_{_(#1RtRLaBDjOX4o2COcAtL|Z#jagJ257>-mkCr9e0 zhgf5Wn)4^s8V`uiN%VC}B`C|q9i-S4TkvnJT;g9Pitm4Cz5!m?Gg;R~Pa(IjG#$ig z7JX_FgR|mp%H~8{>znL(R(y7?nrp<_6EfQ&v%iut?NL2S=o@+IN_PkE2DE5${ghA# z?}tWSn&RrW@Ie0HL z@{$zc;7w`dB`PHj-tb0VZ)KW;m+9a&r55*6hS^@O#Y)SX*uMRfxiL0g*#BZV9&Q4o z3?Cx&!?7j4)5$UCDy<@f`4)@hS6YbYZ!tfwYc14~TAHS}40N^>>&@yH3?GW!w^&Nx z%1q4SGx#K=1Vnt@+^)EZ!KBA2Y>qiw!Ag9ac?>Bap}~5q{>9QXXFJBV4r4jFq2!8B zal=(NH_0*|H@HeWVh_+;6JA1a$j-+V?*@m3h$IdR^OeZkkU6QaOtIiL3l99WxnnAw zRKCu5RKN7Fm5LnE)P^7nXEUs5A4Qn~8j1vT;_lyeT=w3^0B!j(e~CS5;km4qof9X#5jYdn*( zo_N^VYm883i9={>qfm%4-ND<_$O~46i?#o-)(H38|G_FyCa(O04FsajeY}2zik|ne zgRPasGxxD+I3V7<&thqBN{}sF9svAB9{|T!U2`9>sNn~&dqJ$T4jBLVT=p2=Tbn4I z$HKq?gDByogsF)XO6V1DH4#e*Nok=bOq9S?%@`_Uqy$s`93vh+!1{Zxqq>-h^oJ~& z|H*{)AuGiy>h%bFs%x8U-5;^P8Edz%6OZEN;D;Dcx$5OFeF$MR=i%yMAa+F!u{TB; zfWd%dTaAaU`VDli{X>Z8?94~EXkOfCLaj6Rw3RvY zVCKE!4%q*_Hd!ogG~<3OPdGP+pW2I<=G=>R?#+2NKe9kO>pPKxrg6P$gDHXql*m3l}V1$R9rCfAU4r<&&ctHh|QNLPvnXsPI&SR zHeDFK_}6s!;KiR}pV?x)c}vzl`gNUd$zj(e<4{{3+-x)}-dO+9A~f27Paon|Bpa3- zp53X)UvU-B_;4SVXIt(A|M4$g6We|H7GBfImg>j#_#{$1<KAwi z*Pb-v23heXPU&D5KjKU&Rc{&TYNWS4fuAX5|Y<%4dZHV_UDtV9T4N zC1+bsD|^Iiq5K@XX`5!^m)VeazjM50HEwqz$EardqrKkQgXwFEiNv81ccJ2!rqTtg ziy8CHvGKV-8d>VHf-BvVN;|A@>JfUE@5HWfK9S8A?hzPNZ;74}d=PtNTOGj@81MA0 zI33CV8r18;zbp64`gi3$Mmj3D8t>wpz{eH;mH9svA1Tr*{!+A#!gyGaDP~0RaJE!z zjN+NxIaB-^#V_&uooq*=IZhGUbrXNJ<6T0$NISm&!wOcXE}zfh!{yS2&X#qitr(#> z$_CM|J+}*U2#@D$&k1V?PZlv9_(*=UO04OClg(&1%!tR|-9DZXM)7n<9?Gi<#Hx-w z%5&RU)PrmN|Ct#dh%+7eK$d6=h~X_5zjfah-H9(^{M;$=UT3)H682bBps{c62cnty z_M)+GdJJlC&&N-?=R65E_RF}@ntO`GtuB1Hegv{bZY(#!LGxmHrd|nnRBt;G%W*07 zs`$ApPsV$0SU29m+pqJ#@7A*iW7p~~CU?WoFAz(+@gLmpA9on4o!{Hn`4ogFtS##{w}*@iCE@3Ej^NpB}ux zaZA<%zbQeiG080IT>FpJz^?W zDuD;Z>t+;~m&{+_I8L~eig*F0-07Nh)A zWSiZe2e3iE?WM`0F3{Dv`PtYM&g-oXYkzD|u}H(oCS^OZC|C?|c2W>T9lO$j#BKbp zb}Q~m)bDENieI1NqxiSIM86Ck;c~N=Dwdm*uXGX5XYjC~1;j~nHamGgs;|ez{nRuB z_?Jj=E>eH=6`y6mvG*p4YZ+*Eaj1mQJ+C-`T?{(Jg0%p=zi9c|1L z%Lky1^RZ8SVlbeM0pj)mK8&~ABZ9NINAWV($Bmq?k}JuW=_;uR2w-^ zB{PYeqLOMOd#GeP;&xC;wUMDJ=|Ws@l~fzqQYFRJfjp8A{6PGa#eI0nc=1mbhMy2= zW{mjwuK&MQ{`9{1sRyD(xfyNDc>mvRY$Z(DXyc{#9Bmxj@^Kq8RB|QRlBAMq8@sCH z6yipyq}s+nmCPirQ6<$jHdD!V#C_yKdet`GQb`x$Dk`bA@sdgkj~uiy@I6Nxjbj~c zoFtyjK^vpH{r}qd!EWkFADl7Sb9jN#Z}-1j`KX)7%jHA)d%GOX3~%wcnSLs{lFTuv zq}og;m7GG{f0~o5+RQ&xGLyJhR8no`cPiPAxMx&SZRQb`bRllJN~+C#PbEd_AT;xj zcOA{VGRo0Rgz`aXreF8}yP1gV?>gf8NSjX{uVDOqJMqI{zPN4uJ5R(M3dsmN%0I*Z z6O|FR@_CkD{Qswd1ZB0jnUAsc%`jWD0=}FFoZR+5j->dQZ%K=xFy*4WFFqK`y^I@F z8T=_o>B6AWg{IPlk%}xX4#l1nM@bc8@Y=Rwz&N}CRkjt+kHh|V zrTB0h@6D!)+Hrg{`%tVL&->wo^Xu`vFTdMUcu(L3{8WUPIe{<48{MB15Sy*SFp+=B z-W1tOv>mqSZRy#&s=3;*ZbmXjwou zl!%_|ct}{xmHPVY@2GXDpV$YX3{@04S*?hQ_u4HMuY+%{+IFntojA?~E^dJK8xfE^ zt1P`G&Tiy>#=?g%fWAVVR_HMCtdb|<1WdHrMhl+E*zaQNMjq}Q9c(f74j*IYD)IHp`SMX{-S8UkC19{W8g>4fu5w|z-Fzhd!Hlv3}i4L2& zf4{K;ca}>j)>tj{+k6ang?eTFGO(=_jgaoZkp`kh14O_UKYi?y4% zhtJz9snis$lru^Zt#o`@e1`0fCtjwyR;s1xw^~&l7AQrua#2XHVz;{s zxnx62>v}pe&atW|$I3d<|5ZK|SB%?Ua?qu^9hIw%!W6cjum2*jSuQ+=<)ABn@xWkfnz0uvS0^H zpc5tozC-s{dZSis$xOsB;|1_{8;?tffD9Pg;f?*HhxK&X9I1=~h0kFf!sKyD$=vG@ zT~STGVajeXrkqFN=5%E_dOAkzE$6-1N%2=XAH#cmFY@;DeYoFl@d@t`()u#09%PC` z^)b@t@yBQT6=4KkdhoEmXYiRo z9+Lh_r7y1O!$BI9{W3P9E@{?msB1ui=W`l5>K5))Cv+S&f-;bkvM&p-(YXq zKB?kP4C~?Hb2wH>6HU+a;iAhK-ntn&6JHkSl{2FFJjVy`;>Yvc%Ko%X`HIhF{sr;> z?tj`Zs09Xy`mcE!Z)&mi`-Z>CQO9rJ^5YV!{OEh07<%~ozB;8YRM+siLCSw_^yb@) zKk(Jg>ipF5#Bs8-p@UKgIgVRB{F!8I z{6m~cra9x~4F^7Fl&OUx`!}3fSj73?_<0ZSNe}CBdP2hy)3!i;_nj^FU&n@}=DKKo z1G}0ak#mE`aNm!_k{kRy+aU6P$2u`xEchK8miS4c?01|>@B z#Z9~$ofALYfo*C0Jn_{ZdXJr6u8s00RbaZKsL@3Va*HIrSvTxe!w75bCq$}? zWWp(1k&6__OIitwi{#&9U#_Yc@6Gn1Bxt=ti3==gjl2?d_ z${Iwh<|gq96eA80u>V4i!>i19?uWTX@6Pb`LLRv|wA=`&QdDe}RiWK{%1~T2gx`E8J zFA=4!q=W!3Xo1|~3Od8H4{1ozRf>JSSzK-h-Bw5#%m; zh&irOpx3+ts7S3XsbNcT8ce6v7L0+hVwbDrEIThw8YCZlQFqlKjpbbzivDg=M9UwF$%oYs;KN|6Sl}iJ zmvnScd0hrU zCzOxOqVl31?s6$4hM5>eH-y;*MwE%6ttDTV^tUu;w6k9li&|4nZ;1`9r7#4-gRLdM zu1*;wfbP`WqcEb&bpxQ};C0LajBRgl{@Ve3kZ>_d-u?=WZAisrI^$>~QsA(-4;_uFX{gI=_rMNE9UV((Jj_K&HH9}Co&D*C)JjSXYe=o3R8~W39iE-W2jw>HcG~X6Zu+^6#Hw)RNIhg|D2Sf*b0*0O7i}8?18~? zUasblgC2^l&^bO2GFEFQ{@BF+Jc?|%OWLs5sD{%u<@-UH?`;kBu zku>YA)~|^?t#Ypr`ML1(l7f;ueMy-ns_ECpBGI1`cMr)eYUFOmB-RuaH7Xh<7D5qr zG_M1Cyasn!t*SMBRq=KBGTGj}ksQ941XOOY%2iwGX%=-}lD}8oK+Ruz`=K|s+)C9tm3&&2-AW6}$VRe6Ev9nQ z87<<2NYTbe@(Qd*j8WGo;D6`vCnDEJ z3ip#4?M3lNq3G?GNHD8*afK0YUG`VRItZ}8!~q}amB4buAyT%7;?aL1@+L9MSL)c| zlT>Q6x(tsZd20r^s<$nR7Em0T!R z`%97DP9ZqSu%=VyQ;mueGsIbcDLwfPMF;C%%I&EZRmq=J?m^;yt&*pREIm)oR0Uc! z%3?`rBemgSe~RbYNL@R$!e3Qetp}-R-s(%bRWe=GQc2vFCK4zovh!2ohc=RTVj%<( zcI@U*yfslAGuXdrAcO2*f-E=Z!-p$>CIfyTTdt}RMIA~PMVA066rW7y2S{Uv3{o@H z=DyO0>Q~9$jogw(ZluaJlfJ1cS0&vWWt*yG0SP=1Zh=y=uR`9;`r4ip2HjbE?enyB zOqh5kQ2H`t32y7G)*x)J?LJ9Vy-I$n&hSX$!d*d9WXQ!t%G^Pki`C2%MCwh%ttRqs zu`NhSVS9x=Nb>6&iJ`B0CdK|x4K%g(I}HIR)9$+qqpWraJoLhk@KDxrdtEOw@36g= zhGN!6dqJp33zmAbYOyp}8f5D7_k+h1-1Y*g#>ObdzB@!C&33mm@i18OXSalJh!mLf zRb69&YZygpffV~e%x&tpy(&USrv1B}YVP8Sbrdh6p|QMR7%Xdl3FF_AsyCx(wo+0j zEFqGAzdP?j+L}U+`AsF$iTnv9O@wb%RuZvJ%_l)3$ z@Oia3RsL6yMw;#UnDqY*eCObTBi1bZ#}X7G<%dzinl;>BPHC&U@V`eatGexdQ{~ps zA}NSBw7KzIIjQ7np=Jle*SFKX@6{b}aH-v;}g z1~SP0TLT$me_cF+0Y2s9X!`86FH#kMZJ!6Upn~b5eVF9iK9AVe7>W(gL$Ywq@;1^=K%Jz%(@T?>54-vD&q?q7&<4NNcdu;%jSZP-@tN~JgSBs-zQlM)&B~$Tv zM3y02@w+2#g-O9JmV;S7ZxoudLYxhgJUDLVx`j&tJUu`R4wph(%eS>*pL)YFZeP4D zR)!NXDht5n==KLMohfD@x|$;)Slmc3QW-l%1-5iKJmuV(X9_6=%1 zlFbXWq`8e45FvR+#;MYg_81kN?U9uKpJmp)jaV5Wd9ymPJwghMsP-odBJEWwVhjTR zTj(QkJpyk_8`gH_O7iDn zM?`6qWMy}SS2T8Fb3|OUvlx)KDdD$&WMiEZZ2IHEn+19xT|E6wdx)OFRG+MVb%3bbqOJ^ zUL`AuY!*YZD*3(`6(f14UhPO6b*Wj=So*U!sI>n1rdKI^jB++7N2oqPFlbY5I>g96FV;#7C( zG@td0*c>OdW9!97rn1D=(OZp%Ya}uYn$7eY}*yyZj`+kCy^`TmRJ1gd6sJh+0ye9W(A9 z(KyW$YTJ7oeYSHzqIDJ0-1Wl=cN+l!)6@7CF<_W{oE zX)MpP?Msj{BzX->`Z!5iB!!vx_SKC(&{wD1*H+DDu5F3R14vmCWVL9YI1d&oDToSgUS&$Xr3p6)1Wy> zEJ#D0Nm@=5XgQ(gw0#yVdKPQAQbPeGWurBmEbc%<@g6Pv0FWAY3`n+}1Cnh&0QJCY zKzwMZ`wK|5Jp|GpR64gz*3n^5YhW{A0I)f*Ef8Pa>0*H{z(in6;8Q>{BM<1R(-rGR zYmCW2HwZinbO$a5(!Ug138d=|0mNsIx;KHI!1sW-T-B8Wy@5x7_%BAfGeDgC>%If} z0j~i4fqww;Uubmy00V$dt;nguH(d%T4gyV2G?1Lo4MxFzZBcI(pe49;Qol zp%m6%its3Kby#TzHk6(xI`vlv+5$+l*{VtG08%^lXp+>1YE{y`N)xHpL~2~c&Hhq& zGo8Vq+*!1FN{a9a(vp!t(iEemW5ft#H#2L=0%4`(JS~a!3Q5GTs{nr3AX;Te;Vo;B zOZJin3&fvKNrAzjbS>N*HMRwkvtxlIM#gR=F+Vr6CNdmIR!k7@Wk?ahi!`=HV{g#X zZvd(EZgB@9a_Um%&9p{4W1Ynf={ zbR_ASCr(pxjh5Uf9wLc&5|%|(x{Co>R3&m7x@e>5lqH3VZCO%KvzXQnC2`_3#G9G5 zWPx}{$u(MXvuHm6$#N~ZM~pzyy#`5|If{n0t;L1`I2AC6L&)wCW7Je@m;@xZW&o*K zLx9w*NkAIIbAU94OGKN2QiR)9BrLn6ub`6lUUI&uaTN?inkhC`O zaAK2IQ9WjaLfc!aLfl%a2yL%{RpJsI8Vb8AO*)&8or|8HXt?d z1JNc&is)2@Bt6wY^3G)-wf82Fy6JBqsn>fuy2(|{L9sqDNRpO#AQejks=ce>a3B?% zq~S~r7XYc;a&ZZ2+_q}TT^fEYJaW;gRa&wdNS#WC6pG+n$J+>;jUOkG1Ry z4Nv)syQnR=7HN9!YjREe9BSP(^cTJIq=+F&NYax5Bz1!|90R0AP61LQ=W6&OkQ!;# zaHEEAY4|>n^z0XhpgyV!NwT(DW7lYDMZ;Pksju@Btp-csV+{TdbNn<62a+>7Y3T$F z`vJ-4IT}s}s>>{pe7;QMuLV+P5iE0C)BQ%gV4uxT5IoV)lP z#d^eO$#@O>Yd8r=&YG#=0w7tp97xWRMOMBP;kyS(ddh+1qr*U|^<*2dDqjlsWdV-- z8ZH02hIiYDGsrKF(eeiX$*DtuRDL3ms-FQQXTG4}OB%kc;cFW1(69_h&iPcsFMy=? zYas1GE(0mn`~k$=5VH!f-!}w0jP%wp2uMamY8WH-6~M!0EgL!NGZ|^pJy*jLAldpd zkX*Gzv>bwBhmoY`B#>NmLBl_R)WioGHVtwVa~Bg(EI0;9dg3)q1CmkMKq@v|yazF# zMOwB6NZL1OVsD7wk?ng}%RZrHf2HB~L88M@OyF8AzfR-p#Dt+(*n@->&@w5wG5A!A z8AGK&@}X`D*i_dX@jIk^)*wmG8yb5jkSyIR+7F}ML9iG+ObYK>tBJ7?N9krj5;JP( z440!e&2ke)ao)sqAyd($<(S;GP#**jXa z87XxSUZb%$0#);Y)a+eAQuDExGg68Ot3r}$tJbhaLj_2VB#%^!#UmxZU|pEQkQPAF z=&7aK0ZC(b@emq=M{DdtO>DY`^E6x}Qb%F2+=?VsyaU)UbT*3YQIa383KLsK(cbil zEJZ9Hg}v$RQM5M=cNo$~v>ASBakW}pY0IYqb0wvJz7?| zCVE&)pU_0fPl_tqyap_KlyGr(v=r{4i*Tf!fel*I1semcaavXokPL_flBO6R0O@s&-3xDV$9d(kk@p>>;o7$0JlkOO? zU@Ywnk))?Uyhq9DT5_Jage1Pjbs7iQBiaMnRB4&j8rA@*RWyE=3%7BYKDxFJbuEBY zizkp;6$~Up+5yS6-GMY%`T}XO$pX@FECA9{I1WhD=NTYH`)7ePeHH?#+m-Ui$Hac0#pMDkc@Z>NS=5f zNJi`jk`a|aGU6<-!HBpCjyjPoq9?!;waBFBK9G!P674X;4M;}#1IdU8AQ{maNJjJm zk`d`ZG9nj9MvMfK5l;ijh}l3gq8LaIh^mue_$ z_=bibXn07&lNx@f;WZ8KXehOJ)Z?aMAP~N(uWt_`2nNIfgMrDw5a0k{C~yeS1RM_x z15N{m1D^**0G9$Ifop(mft!I*z_)?Xzz>1#fCqu?fyaRzfaif7@h8H%OCVx^3a}IK z7O*q$5fJ~&SJ$jVvMv^A1a<`m0=ogDfZc&zf%r=t}2_5=IS4S)dxspDicU!Dj!H=YAle()Knl1?D;?%Q>8!} zQvyh1YCDhyHq~*W&`~F4M;A(N{BTEc2FA3lfe<~{HM|QXV_1yC7#9t_M4P9vAzy$b zJuw=_14%qh6U)|cxQ3H7oGBKd_|tokq~`#T%sK|7;^#E6AAr>KYd~uHUqEX5Lm)NX zxs#*mt%20^03bEJEs&ZX3#2)nC|VX_MHr1FJ%yqdl0J*H+|59${cRxC{-Ica?B-RP zbaf~3ei0U<+D_sEkWT!NO(%YnaXkH?NOBPclO_L_(>pi%7Y9m|xr6w7p5S9KCw?9H zytcFOoFavb82uH=P2Kn=S%rgeX9A(_J9BNgwNQlRJ<`NRVhV6)j5=set0q;L=kFq*|W^QmspX zRO`z?s&y-nYJDF_wH^dgtzQDE)@mTt`YVuXy$z(!;awfI8h{PsvTmxQPGpN=QzbWe z`5|n1+6)wGL?GER8%Vai2qat90LhjuK(b{wkZkz`NVc2+k}Vg2WXlyG+42{V zJfIWSXW)S#u@6w3)XhLGe#^x z61OMY0q$Eh?r|U)aXwD`I9&?&sYRORU!BI+^>F0l1bYUQ1tCdKq{u=N<8BVXV>Gx_ zXfm+DD<{O_8R{AOX-J4uGbCs6V1^XrQKQK!Psn0ZI#UW1=9!YIZBkE14I_c1vj|Au zc@{|CSqvoatQ4=!gh6|dq^De*MzVPol2od?r+74zB0x_OJ_|GU_DtOG;#hwcOv2uC z7P`kA|D>^Fz!KH7@Ri6KaR;>f9%R!~0VD@~5idH-h9>{nlCxW##?&P^jB6pL&W15D zNYWE0UZbR0OAZsKkz~_tcV34Bb~_n&*;U=T7P%OsiXBZ3hzUVWKe9_w|$dze9|D>`l{I-*bf zV|JB2U2jwJeD4u08 z%{Ii{E}mlXzS-2?%N%>~V70zD)#7be?7d8hhh~M_`^)E>wxA!vGGcCsAJc~JZ z5_9BPER&2m5VfLkd~v2Fp~hzmsZX_p79BChU0qtSFmdVag>B;Qp+<16wn@yM*Hk}A z??}C(x4ESuS#->pHTz3DEU?2G2pUroFV8<}KQ?OQh+#!X%!l;4k`nn7?|kpc9$Y6K zMU}>9cwEK7Ym!Z=l+%3DL%a&%yMg)~W$;g&4Dd$t9GORT#r-_s!MkNUdd{5sdy`GKyMd-+Y31}j|jPGM&GGrz*-F}>i;W5&e0vwyW`>9dvPKXNhWMK-u> zziA3%hvk@n59QB-n#sQh^k5guIt4z*c-#$nuQ{rI%nhz9PLY!WTgqNRhgc8!LQov< zkRmq>4r9;BvBBoT37I;bV~NF=12QchHs!YzQ2kPEN?+s@9m`0(KdX_wyZy`{r3)C7 zhQsuBSrA#FmdQpTqf$X-GA#yswQ{tFn>@C}5~|nfBxMOo4InETuJM#GCVW}Q+Ahesx2Dw8c(N$lF$lEEAWoHE2_bxH0&+=guKIEkdK6P zVJqdDkPf^mS?(Ab!OG;Jp*;(?B&)i;QD#j&_e4<4a4u9WVyb##vuvc7AgwGyV{EX_ zq+Fy5*Qi`gI7b=lZmJQjexkdo*a!nj16LyZxLfV5Y@(7F98e<%hBc16m+=o#rhK1H zZdGfUgi`h_Z^zye7>B`2g-psUc}Q4FVQGj?hpBf~xgQLnJc}{$+{|Y7{xkt>4)4|W zvpGuZa8)&98XlbX1SU**8?7VJy8N4PIfE0u?Y7qFf3iSP(^K)w@h=KL$!BO-uD-j<^y zp5P0OM+gpH|`(dc_FXdYiv(pkOJKX?xgxb$#$6opny`ww$kjI|LCh;lb)$GLTS$)xr z&|<%$`Uy*=$7>f1*z1K`s~P8}UH-pk;#R)6Jp&jIzo@g}HKv7FmU@2HJl? z;L+RDXDzLmt&jWkrmwx<+}O(UojZ2K+;^ce`=NtMh;(l0r=BbGFW*=?I&|=1C)lugR!~#>>P-kn2KZyf_$MDG=g$? zJW{JU3++o$>B{0<57nn8l!8yy_Gu=%z3S-6if5vn+q_B?LEJSK=Neq6psBX4kF>Vd zxn$-L#{hE<+$aZH1M~_C7L#vVtV^!`TU)+Ll z@vUq4n~TLh-#RK;mv0U4shd;}oiy71#U!Jxc(}!?T>2dCSYpwkrHIYdR1A-MVl6sg z&+xu?kj*w|>F)Oqa*zmViw>wvqPp8{dV2?x{C?~xpS?jkUEqq#JXJj_GM>NJbEyh@OM0jLVr8OA)pXCu(4xiCPeM@53ptrRcsG zZb^VZ5(JE(lRzh5?yUzTT<-nn*9Xwv-G(>vLwtF{C_AEVS+ueW@ zlPQAL)53xM*NMe*xIINa-^M>!3u^Z!7W;XwyaU~FH3)+iC^bWooY~eN-kI3;$(;7* z&_{jMu~t23KsF{^GS(Y)V4ciCsKAJeSEdq+!hBytQAMUrotOT^%QYY@peIf$&yGiu zg2h2O%<97?%bl!=7+y22(VoY`D2ry~7@8~c4r>S-ET6Ep8f2vTl=&gzw$42}F^@9s zWMituLc6r0xo`=0@7>8A_ZVi3n&wf|&y{st-O?!=;nzPee4ff!z&fi9FhcE@ zm#2I1%V3*{oe1{we#YfkE%*s^d`#uCQQph?`%JX=t3R>0ziA>S^2FjnzN1EBZ)!M< zPSM+ocT;CpOtkkj$=BKsWv|JJaiMInJUq^vF#ZM7=Yeq-%}+vEmf>=LD^=8&G6ou# zW8Z;HZ+<@J+_C`;FZWNP%r-B`rEz}T=LPwbxVG#&`9WN8z|rSb%jz`M(=_dp+r|3^ ztflOMMm760O;-ZxnlF!u_hl30x$#$WcbxbuiYfLp0}#b3F@tHjL}$5|p)*Q7_qNCU z_bB!%#Qqk=ejSMk(Asep$VHUXC!2EKM#3h!YH`$kA!emCts_> z7?b5LNiCnq@c4IZFS=#O#lFeCzdsS7D)m4dGNUOvr5FP|zhHF=b)`}HgSHkJ>y)r% zJNjin&Z4%NVQB@|;}{A`N{W0Usi&_E6A5R|;`+)ljY`)mSLN`o6e~t{-NDw#4ZEH9 z3Hx6&R=(XW)@-)bd``jmn7Qxl8wlaXks}-)Uy)t0C*?NX!|SP2vn;FoEY@I4auL)+9O)D9<4D#Q z`_zqc`<{!~B)P0-9P23m*wccE=8@8qoss*ebmH}+#eF>xQ$LfJr%mN)JF&p&ER{ATtogr87sX>a0mMzdArV_sw1QHj3% z+l2K`B?(N}(eIW`vqf;+9=w`=LQeYt zm3dcXR+#(DzKOVZ$U`@&CV#s8TkZk2THc+vlzm&)Wk6er*~%sjR#?ahSd(o(RXpBe zvMKwUs3VSsJ5KL9PsKx?KD15qu19KWFc3|O{)9$Mmfs&5Gr@+kn9;O0poAVJf|MjT zPpRXX6*{9r?s6S3Q1N#2D(iRwN+~uUkSnj_`75{N9>by{kGOLX?rUrEbxUVj=4w^@ zD6hyXhgsN9a@nv&Jjhe-Fg%g%lcx`l=F;o(#^D{TfZhx9}&l@<*g&)adU8GL@ddTjP;xRDsBo!>5E4hibr|a)AMLKHz@<;jFHbu zSGI65;Y;4S!NaCB>f_}PM?N8s9yO3BY>~@Hbz{|K_eZsDz$)daC%XGAThDbv)P?WE zec1Zcw5Uo>(aC}N5%T6II$$-w@I-$$SGMGj!aQD*Kbf7DtMaGw#C7txC!dCjD^I@8 zyRVfCCp}~-^0Sk(d_I@yjAAGrp&L1D)CgR=OybIQ`OC>|+3GTnDSnLoAzP-7;;}|~ z>C|ZmtiMf-VGHGuY0q%WYI(!7rEGy5`cwp}OnvGb_EMRpz{J=hx$E@dY>T{M`cFK; zAwNH3JDVz7XXdiAWlLsSxlt*mIT2>8`N-@HR#MjFX*1&nFFAJ37&cmV%z2W% zDc_$H&ZE8Lz`0}DQ}V*OBUwe+S99Owtgvj!ym5NAr%WlF;ECALZ&d~wFIIKurh>A| ztD+g(B(v4+*?V&Q>Lu*EvJY2FjO(V#AHNua#pUZ4)7Ud*7Woy%?w1`|)0CsPKU+73 z;Sx<`vt#lLq74&e9|$A!dA_rHJra*diUBej16!xekgu*!n-PP=+0knw)VW_EpOj2n{6%&+4v$uKze`E5jbnk%iVdxSh@V= zzN|vlZytp;bNuH1%q8#M++QB|x=)$ul^%?nn#;qsyv&Zs54Ln;6Uq`^UCY?d@|oAx z@`UDP6JB4yz4~mfsVO?j~H~Kor5=*XKnA#isU2PSK$gGZ^va;Ah+Hbg8t9i zso(;r)pbYr0XO|RT6@p-esSEG=nirxP3OR zPmwq5OJ;}UtNRk!W!Z0k_mK5H|ElKHU(>3#bb_}$d;cUBBwyQaVtV<({t&jL%>U!f zdiK3sekd35(BtsZ=8cowr~P9ztV>Ez>tOkf!~NO$vfmCDGWJ-Wb#x3nE?+!qW$WYy z$Ku%-Iq6sw8!wMPme0<~r;jaU*>dLbUb1wmnY{Hl1)b~1cX7{7@~X-tc3wVJ*&nN( z`IGjnUs?Z8#xrj9mG_(|<(=Z?Cr)-}8S+~vy9XQM|7wT+_1f@I+l~xbe`-Xh#JGRh ziT#DL3_GZMsW|$~YB*2{{BM2&oGuSOWe(j2;xECg?f;<&4Srs}aB3BMT^@h>Ic{h# zE2p~!SGN1hAj5wQdRUfv#wfw`0p~liSLGGwEzRaT)TJRGldYh!PS;GCEFU^Qh!vFu ze7c=uT|IKa0++ci3}r**)X&rXn#CZnj?6C}Ii+}HfjxaN1y-~2r~K;Y9a>V%0@T8XV*o!^bXJv0(yd$xX zWciAXGyk&huPoH_P=9&CHy_JIE?>FxwKzC!e@A zjLnfFZ^y7qIs0}#c3&Ue?u1**UvIYq-*P7%_ZXA!OePoHS;0On8~^iJ#{I9$9e!!U z{Q}D-{Bnn}C(82fc46#edDU-uTyK`Y|1Hvo9cSv<1iN+*+J{hWQ_DhsZ^2lvvh;iF zXnFbS{;Syf6;^jJMgI)x6_#Z%Pb;7v23E_bs#~+4djjVuo3vt%-V(azn zU9s7Reb44Pm-wP2`(Bj$F$=rq{K}8@VzJu_VBPVVK{#|4YAhDy0FvYoS8+i+s@z2tSyJDEFo+S_gfRJ>TZGCf>zLN&e1A98^!|J zSb^ad8J9>hhi8&ZQmssa(gIxE16F1aM3H3Wd7OW6VL~>=5X$#hZz2%H=!G`JCeo@krwPd%%M=hDmUJ?Cbn3a297K>t-x6k8C=(fw4 zz8RkHev^yqBeUZ3x!4}Vvds5t>!-6*fzkj+pqo)3$17h3i)OKGC|l&58q3-Pl6k%(_eEeHqV03R4YKIpuH;L|mHnNgw<~LJpL0rmpLyavQ3<~Iw)pzW9`^M z@kTd{(pk=y-C29JhkLM49{RCZ*n`D;Jq>CES8{WgT;hww#n<{%M5#3OJeON#O`dC!{%|`eWO^F$L#Di5jcPqa=yd4X#hLH z*g)~bAa;^Xa>fm2C7eAFM~1>71D(Bwu|FkNBT`4PpLtlg=rEcsWV4;SN3(AjTkTvk zmie#-Mb{qJ3{-B5(s8U`gEneny{I>yrLrn#pYg0%;=vK(^C#HXEZMm`pABGee4|Nh z2xFt2<0nHgD|hBi!)V~Fg{W7+E^uoLakYR=VY5ZXboL6{Bb4bZlD#85XRub@V;l%R zMY`Y6LfjCaE$-z(lX3}%fX1#xLEdxI?%^PgeAvyILf&$2O$Rf-GqST)x*5ohMJ z)0{mgUS0rm;G_j?IYZqG*%r*@s)ZS`KtUD_got|eaO${X2qu}gol9bvT@On1on)vE@Ho$MvT;vW{U$Gwiz8>z#)vN0z zqW25zSN_Xh(RCRHU_bHHGM3R`_Fn3QZ^XyTm>)YXE-piq8!Q?X0}4gAVzlFt*iy`L zyt;h!7~{+R-jz158-%o+#qd?LMZq%WEmD@Vci2hs>vFb>J$AlgXAu&^s9nic@~gW= z?kYBp{or)2VxFAc6USGxmz!0-SErB$Z1hy;(=W19j6Lg2S%W_H{PCT~HSWzLZO>j5 zd23l`-gc5$wU$Nk`jbTYT1@fxMEp8-qk+%ck85(3LJ=%jG|dRXCL&0`BiJa38>5__ z8(AZXTcezTo7ox0Y|fuvVV^LzO6-1>)v#^O-LElE?AFDR*D+{syoL5$dV~GRqoc*= zTiJZ?$wT1Ke){5ci|4!jJPuwrWGk33Z(?L_7pZSyq-BWj-eNiI1JP+4>&V*<5>IWz zDlu2A*~Zo)3dL;40`t6hVmsT;z7$?NST~j>Y&+O9exKz*bDkvw;V?P}f2{Zyuk07s zcCZw-MOb#SPuZK|{!X@nRXCUIVz22jtfJn-NLVJGc#maseLwLL5PtA@pVc&7ov9A* zrMG7_9H1-_{$*?`%NH+{vF;(!$kNWDrvHSe%h6aRn>(w^*j~n~-HFOQtSN?KZ*lnp z7<^gyInm!YS2$CgEJ9E9?}Zr|&bRimKO30*lhBZv>UGHPi1Bz2Jj;9FAmxzQdzb~b z9C#G>7I?F+94ZsCSfo6>_CBDx7bz;*AsT_vjj?+I|N$n`W7@@(vg57*?VgBK8>D!#(zk zZ;!Dw{`oVa<#85-u+{50%Vg)BYmT#v5^w*3m~xW6#ilvEPqBCF@qk$8(etdDVTbVX zXIOWm-ge&qjLqb{{Z8kUiwL9agmd>Lwv4lDqU#mb2?J>M6;@g=;L=7ktLPNAHx4@% z1A4)4raM*TYiIXs2sD_!6Rxu~n6>jd8_m5oi6-B&y&bWPt0AWvKCqu0gg1}RZN?3{ z`o4P(UC|sOrexjX=M^G{>WksMoP9)9*EUHvgYE_ zkIZEF>a@x_=4Lfgz}i79t0KEuU5Pb^Sn-eHscu$lH|up`dAV5+#bE`Oe0@sQ zd|ce4)J}J5jcDmYYOXsqMhr))VVXPD##fZMU}ZB(T9rS?m!>4Td1QfBHdTpo^9py> zF;kT0Zsw*sUQeZFnrh67I$jUurkgjvj+d-la`UFt@wzLA-Mry-yl%?7ZeFIF*MM5w zRoUo#u?h<>OLt!Sg?TadhH(ALa(uD{1|Ggd=!J_*e5aFR%T+#(6t=r8np-@?vv*mb zUzCSBc#G5Z_WlNYq28u`!Z1ecy30~ShG$}8pTRdFxgZj&=XAiU8N>lx#OBzt6)eoZ zF`psPBs5U(&_7q4Zg63!>oB~V*Ool-G2U`j&q=n=!z)H>j#a}kTyXz8x1CsbADgX~!cvW~HC5QEnJ@pLm&mVX<*bzmd%*hf5iP~^2dsTz z@dUMxDxg#A;8x0PH?O3Q7pshM^Q@>slZ#QZ+&p6)ucgx2%}cK1MJp}bywEycl;Y*) zJ$0?Fl1Syzc-0tsf2>u~LUFlyv~$;Z7Ugr|VZX02B9tR;p)GYn;Yz8SS6aslQ#Og! z4_R}p09zkoVYn;4dx-r60?{8hl#CNy{=kOTsu$D#z#ifc@!B6Op0=t4tA)p(fZ?JC zfJaGU&Yvu1_#a&DAVmA@ zm`4~-x$28u`qaVOHUOUz^~WBmHX2)%l^8o%b1dp>U6cE@ZX<~N?X~XC)kxCYhF`@_ z&Y$6P`-zkFcoaJz`boSk3vn)#_$HS68uprhTQp7DqB*RXZkA2-uHd){d+}SSE!ut( z-wF*<4m^hU$NhNJLoufw&*7i-RV!*7Kw|FCIfSh~_Z8D5-b8Ov zp6x3NC2nzM)aNtM1-QijAN6mz?{?_mG;y~#mwt050$YlWc^{4`Zq z8*x8YPh>RW*<4yEHa6nR*jT5fG5?;KQsN%hNQcoo7W($X;jPW(O(Lub@8jF|jdG{plw5Qtwf^K|BP{$S>@ z`k7v8KhRNsN7wsisb&0|I z-jm9%sWdThpMLkUh>heES)zC`5+iJ!_$ZR+v5%deQ9Oz9UoMKQX#Q*7qtE|c`NqtD zSN>pxyK;y3J$xYeSH&|(u&&~iNm|9rh1?Q@<56GnOG_Tf(u667XYyrz#l#r?mAKo9 zH**e%rLNo6LCk2y47)0X#Vh0b6rZ_N12 zKb^7d_#(!=PK&qO!zV%5a#4Z04r!bLHTW8%u0x*50|y=A@c!WMKKZs6*mXV`H(K+_ z4skb*57$pcw#bd=7Isw3jpv#A>U5pXSsBmqTIx%2y#r6dxwl0}-bUO=;LYl155(p* zM@;UB@xERx?a04umRRYwO}oZ-B`y#%JMo_E3GqQE-c=m#%metl$Hmzk?k}Pf_yRUZ zyqSQE&$@7v-l`lpCOi|kiPxJa{5$i(KC#FCp)Q+lb%nrNrLN|^?f=L7{(*zAWB%r- zc*O>jo)r(EBdzbz|LCx%htj>ZL1~M;xC+(##p$6qPZp;~D>2XNbR*p-GaPr-I$sd$ zy1>e~Bv{!>IeWxyrOz{>VIm*gJP}chbkx1Os1~yld3Uqxush>y@l&D2Pg#neipFOJ zX7#G>YjHM_W8lvf_Y--NNJ&xK|I}g9?C;D^;v+a4B#w0>r=?>wR)}vpBO{?Z|4{PX zx$hqpswVnP7Y$ONDIyb^;+0YRL`ZiOn47}qbM(&dX@~=GT{>JhFYbT4E?)Vj-0ixl z&IjpyJooGV!QcE7U7X&kINhprne3d^n+LPJm^~Ox{nWMja_*pPYzND`fkU5Tp3y$K zvMApZi$X&`Lp=rY)4d;EMcleiYOi5Nsh`w3#SeY>DDKxy^yB zVsIuO(){N8|L`YnH>QarnS2;qAVRaaZ{a;JYlVMMZp4<6nnCGH1;ZAXYl|mO%JlT znKzgy{Q9AV_W1wZm#vik@2R5{OZc*WXyaaN8UHy*M~dJ2@nJlxRD@-5pTc9Fe>HNi zO0FPdN>x&AzvFlT+D?C!Y(?CrDyg

u9$P;oypj6cOKZ-@=U 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 F{{Z&)x~TvF diff --git a/tools/Data/include/dstructs.h b/tools/Data/include/dstructs.h index f03020b50..e765b696c 100644 --- a/tools/Data/include/dstructs.h +++ b/tools/Data/include/dstructs.h @@ -93,29 +93,21 @@ struct sTri u16 P2; // 2 }; // 16 -// u8 r0, g0, b0, code; // 4 -// u8 r1, g1, b1, Mat; // 4 -// u8 r2, g2, b2; // 3 -// s8 OtOfs; // 1 - //--------------------------------------------------------------------------- struct sQuad { - u16 P0,P1,P2,P3; // 8 + u16 P0; // 2 + u16 P1; // 2 + u16 P2; // 2 + u16 P3; // 2 u8 uv0[2]; // 2 + u16 Clut; // 2 u8 uv1[2]; // 2 + u16 TPage; // 2 u8 uv2[2]; // 2 u8 uv3[2]; // 2 - u16 TPage; // 2 - u16 Clut; // 2 }; // 20 -// u8 r0, g0, b0, code; // 4 -// u8 r1, g1, b1, Mat; // 4 -// u8 r2, g2, b2; // 3 -// s8 OtOfs; // 1 -// u8 r3, g3, b3, Pad3; // 4 - //*************************************************************************** /* struct sWeight @@ -152,29 +144,36 @@ enum TILE3D_FLAGS struct sTileMapElem { u16 Tile; +}; + +struct sTileMapElem3d : public sTileMapElem +{ u16 Flags; }; +/* struct sTileTable { u16 TriList; u16 TriCount; }; - +*/ struct sTile { // 3d Tile - sTileTable TileTable[TILE3D_FLAGS_MAX]; +// sTileTable TileTable[TILE3D_FLAGS_MAX]; // 20 (4*5) + u16 TriStart; // 2 + u16 TileTable[TILE3D_FLAGS_MAX]; // 10 // 2d Tile - u8 u0,v0; - u16 Clut; - u16 TPage; - u16 Pad; // :o( need this? + u8 u0,v0; // 2 + u16 Clut; // 2 + u16 TPage; // 2 + u16 Pad; // :o( need this? // 2 #ifdef WIN32 bool operator==(sTile const &v1) {return(false);} #endif -}; +}; // 20 //--------------------------------------------------------------------------- // Layers